diff --git a/migrations/poll_entityfieldinstance.yml b/migrations/poll_entityfieldinstance.yml
new file mode 100644
index 000000000..dbf4d2e5a
--- /dev/null
+++ b/migrations/poll_entityfieldinstance.yml
@@ -0,0 +1,25 @@
+# modified from \Drupal\migrate\Plugin\migrate\destination\EntityFieldInstance
+id: poll_entityfieldinstance
+label: Poll entity reference field instance
+migration_tags:
+  - Drupal 7
+  - Configuration
+source:
+  plugin: empty
+  constants:
+    entity_type: node
+    field_name: field_poll
+    bundle: poll
+    label: poll
+    translatable: true
+  process:
+    entity_type: constants/entity_type
+    field_name: constants/field_name
+    bundle: constants/bundle
+    label: constants/label
+    translatable: constants/translatable
+destination:
+  plugin: entity:field_config
+migration_dependencies:
+   required:
+     - poll_entityfieldstorageconfig
\ No newline at end of file
diff --git a/migrations/poll_entityfieldstorageconfig.yml b/migrations/poll_entityfieldstorageconfig.yml
new file mode 100644
index 000000000..11a942205
--- /dev/null
+++ b/migrations/poll_entityfieldstorageconfig.yml
@@ -0,0 +1,30 @@
+#modified from \Drupal\migrate\Plugin\migrate\destination\EntityFieldStorageConfig
+id: poll_entityfieldstorageconfig
+label: Poll entity reference field Storage
+migration_tags:
+  - Drupal 7
+  - Configuration
+source:
+  plugin: empty
+  constants:
+    entity_type: node
+    id: node.field_poll
+    field_name: field_poll
+    entity_type: node
+    type: entity_reference
+    cardinality: 1
+    settings:
+      target_type: poll
+    langcode: und
+    translatable: true
+process:
+  entity_type: constants/entity_type
+  id: constants/id
+  field_name: constants/field_name
+  type: constants/type
+  cardinality: constants/cardinality
+  settings: constants/settings
+  langcode: constants/langcode
+  translatable: constants/translatable
+destination:
+  plugin: entity:field_storage_config
diff --git a/migrations/poll_reference.yml b/migrations/poll_reference.yml
new file mode 100644
index 000000000..0556bb6a1
--- /dev/null
+++ b/migrations/poll_reference.yml
@@ -0,0 +1,30 @@
+id: poll_reference
+label: Entity Reference for poll nodes to polls
+migration_tags:
+  - Drupal 7
+source:
+  plugin: poll
+process:
+  field_poll/target_id:    
+    plugin: migration_lookup
+    migration: pollquestion
+    source: pid
+  nid:
+    plugin: migration_lookup
+    migration: d7_node:poll
+    source: nid
+  vid:
+    plugin: migration_lookup
+    migration: d7_node:poll
+    source: vid
+  title: title
+  changed: changed
+destination:
+  plugin: entity:node
+  default_bundle: poll
+  overwrite_properties:
+    - field_poll
+migration_dependencies:
+  required:
+    - pollquestion
+    - poll_entityfieldinstance
\ No newline at end of file
diff --git a/migrations/pollchoice.yml b/migrations/pollchoice.yml
new file mode 100644
index 000000000..34ca32391
--- /dev/null
+++ b/migrations/pollchoice.yml
@@ -0,0 +1,18 @@
+id: pollchoice
+label: Poll choices
+migration_tags:
+  - Drupal 7
+source:
+  plugin: pollchoice
+process:
+  langcode:    
+    plugin: default_value
+    source: language
+    default_value: "und"
+  choice: chtext
+  id: chid
+destination:
+  plugin: entity:poll_choice
+migration_dependencies:
+  required:
+    - user
\ No newline at end of file
diff --git a/migrations/pollquestion.yml b/migrations/pollquestion.yml
new file mode 100644
index 000000000..b048c247e
--- /dev/null
+++ b/migrations/pollquestion.yml
@@ -0,0 +1,30 @@
+id: pollquestion
+label: Poll questions
+migration_tags:
+  - Drupal 7
+source:
+  plugin: poll
+process:
+  uid: uid
+  question: title
+  langcode:    
+    plugin: default_value
+    source: language
+    default_value: "und"
+  runtime: runtime
+  status: status
+  created: created
+  log: log
+  timestamp: timestamp
+  active: active
+  choice:
+    plugin: sub_process
+    source: choice
+    process:
+      target_id: target_id
+destination:
+  plugin: entity:poll
+migration_dependencies:
+  required:
+    - user
+    - pollchoice
\ No newline at end of file
diff --git a/migrations/pollvote.yml b/migrations/pollvote.yml
new file mode 100644
index 000000000..eeca544cf
--- /dev/null
+++ b/migrations/pollvote.yml
@@ -0,0 +1,40 @@
+id: pollvote
+label: Poll votes
+migration_tags:
+  - Drupal 7
+source:
+  plugin: pollvotes
+process:
+  chid:
+    plugin: migration_lookup
+    migration: pollchoice
+    source: chid
+  pid:
+    plugin: migration_lookup
+    migration: pollquestion
+    source: pid
+  uid: uid
+  hostname: hostname
+  timestamp: timestamp
+destination:
+  plugin: table
+  # Table which is installed in hook schema.
+  table_name: poll_vote
+  id_fields:
+    chid:
+      type: integer
+    timestamp:
+      type: integer
+  # Fields which will be inserted in the table columns.
+  fields:
+    chid: chid
+    pid: pid
+    uid: uid
+    hostname: hostname
+    timestamp: timestamp
+migration_dependencies:
+  required:
+    - pollquestion
+    - pollchoice
+dependencies:
+  - migrate_plus
diff --git a/src/Plugin/migrate/source/Poll.php b/src/Plugin/migrate/source/Poll.php
new file mode 100644
index 000000000..022801c3e
--- /dev/null
+++ b/src/Plugin/migrate/source/Poll.php
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\poll\Plugin\migrate\source\poll.
+ */
+
+namespace Drupal\poll\Plugin\migrate\source;
+
+use Drupal\migrate\Plugin\migrate\source\SqlBase;
+use Drupal\migrate\Row;
+
+/**
+ * Source plugin to migrate Polls
+ *
+ * @MigrateSource(
+ *   id = "poll",
+ *   source_module = "poll"
+ * )
+ */
+class Poll extends SqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Select poll in its last revision.
+    $query = $this->select('node_revision', 'nr')
+      ->fields('n', array(
+        'nid',
+		'uid',
+        'type',
+        'language',
+        'status',
+        'created',
+        'changed',
+        'comment',
+        'promote',
+        'sticky',
+        'tnid',
+        'translate',
+      ))
+      ->fields('nr', array(
+        'vid',
+        'title',
+        'log',
+        'timestamp',
+      ))
+      ->fields('p', array(
+        'runtime',
+        'active',
+      ));
+    $query->addField('n', 'nid', 'pid');
+	$query->innerJoin('node', 'n', 'n.vid = nr.vid');
+    $query->innerJoin('poll', 'p', 'n.vid = p.nid');
+    $query->condition('n.type', 'poll');
+	$query->orderBy('nid', 'ASC');
+
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = array(
+      'nid' => $this->t('Node ID'),
+	  'pid' => $this->t('Poll ID'),
+	  'vid' => $this->t('revision ID'),
+      'type' => $this->t('Type'),
+      'title' => $this->t('Title'),
+      'uid' => $this->t('Node authored by (uid)'),
+      'created' => $this->t('Created timestamp'),
+      'changed' => $this->t('Modified timestamp'),
+      'status' => $this->t('Published'),
+      'promote' => $this->t('Promoted to front page'),
+      'sticky' => $this->t('Sticky at top of lists'),
+      'language' => $this->t('Language (fr, en, ...)'),
+      'tnid' => $this->t('The translation set id for this node'),
+      'timestamp' => $this->t('The timestamp the latest revision of this node was created.'),
+      'runtime' => $this->t('Poll runtime'),
+      'active' => $this->t('Poll Active status')
+    );
+    return $fields;
+  }
+  
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+	$ids['pid']['type'] = 'integer';
+	$ids['vid']['type'] = 'integer';
+    return $ids;
+  }
+  
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    // Always include this fragment at the beginning of every prepareRow()
+    // implementation, so parent classes can ignore rows.
+    if (parent::prepareRow($row) === FALSE) {
+      return FALSE;
+    }
+    
+	$choices = [];
+
+    $results = $this->select('poll_choice', 'pc')
+       ->fields('pc', array(
+         'chid',
+		 'nid',
+         'chtext',
+         'weight',
+       ))
+	   ->condition('pc.nid', $row->getSourceProperty('pid'), '=')
+	   ->orderBy('weight', 'ASC')
+       ->execute()
+       ->fetchAll();
+    if (!empty($results)) {
+      foreach ($results as $result) {
+		$choices[] = [
+          'target_id' => $result['chid'],
+        ];
+      }
+    }
+ 
+    // Set a source property that can be referenced in yml.
+    // Source properties can be named however you like.
+    $row->setSourceProperty('choice', $choices);
+ 
+    return parent::prepareRow($row);
+  }
+
+}
\ No newline at end of file
diff --git a/src/Plugin/migrate/source/PollChoice.php b/src/Plugin/migrate/source/PollChoice.php
new file mode 100644
index 000000000..44c044526
--- /dev/null
+++ b/src/Plugin/migrate/source/PollChoice.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\poll\Plugin\migrate\source\pollchoice.
+ */
+
+namespace Drupal\poll\Plugin\migrate\source;
+
+use Drupal\migrate\Plugin\migrate\source\SqlBase;
+use Drupal\migrate\Row;
+
+/**
+ * Source plugin to migrate Poll choices.
+ *
+ * @MigrateSource(
+ *   id = "pollchoice",
+ *   source_module = "poll"
+ * )
+ */
+class PollChoice extends SqlBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Select poll choices.
+    $query = $this->select('poll_choice', 'pc')
+      ->fields('pc', array(
+        'chid',
+		'nid',
+        'chtext',
+        'weight',
+      ));
+    $query->addField('pc', 'nid', 'pid');
+	$query->orderBy('chid', 'ASC');
+    
+	return $query;
+  }
+
+
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = array(
+	  'nid' => $this->t('Node ID'),
+	  'pid' => $this->t('Poll Node ID'),
+	  'chtext' => $this->t('Text of the Poll option'),
+	  'chid' => $this->t('Unique identifier of a poll choice.'),
+	  'weight' => $this->t('The sort order of this choice among all choices')
+    );
+    return $fields;
+  }
+  
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+	$ids['chid']['type'] = 'integer';
+    return $ids;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+
+    $row->setSourceProperty('bundle', 'poll');
+	$row->setSourceProperty('deleted', 0);
+ 
+    return parent::prepareRow($row);
+  }
+  
+}
\ No newline at end of file
diff --git a/src/Plugin/migrate/source/PollVotes.php b/src/Plugin/migrate/source/PollVotes.php
new file mode 100644
index 000000000..af27a62e5
--- /dev/null
+++ b/src/Plugin/migrate/source/PollVotes.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\poll\Plugin\migrate\source\PollVotes.
+ */
+
+namespace Drupal\poll\Plugin\migrate\source;
+
+use Drupal\migrate\Plugin\migrate\source\SqlBase;
+use Drupal\migrate\Row;
+
+/**
+ * Source plugin to migrate Poll votes.
+ *
+ * @MigrateSource(
+ *   id = "pollvotes",
+ *   source_module = "poll"
+ * )
+ */
+class PollVotes extends SqlBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Select poll in its last revision.
+    $query = $this->select('poll_vote', 'pv')
+      ->fields('pv', array(
+        'chid',
+        'uid',
+        'hostname',
+        'timestamp',
+      ));
+    $query->addField('pv', 'nid', 'pid');
+	$query->orderBy('chid', 'ASC');
+	
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = array(
+	  'chid' => $this->t('The user\'s vote for this poll'),
+	  'uid' => $this->t('user ID for authenticated user'),
+	  'pid' => $this->t('user poll ID that this vote has been cast on'),
+	  'hostname' => $this->t('The ip address this vote is from.'),
+	  'timestamp' => $this->t('The timestamp of the vote creation.')
+    );
+    return $fields;
+  }
+  
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+	$ids['chid']['type'] = 'integer';
+	$ids['timestamp']['type'] = 'integer';
+    return $ids;
+  }
+
+}
\ No newline at end of file
