diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d7_user.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d7_user.yml
new file mode 100755
index 0000000..5b87dc1
--- /dev/null
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d7_user.yml
@@ -0,0 +1,34 @@
+id: d7_user
+migration_groups:
+  - Drupal 7
+source:
+  plugin: d7_user
+destination:
+  plugin: entity:user
+process:
+  uid: uid
+  name: name
+  pass: pass
+  mail: mail
+  status: status
+  signature: signature
+  # TODO: whe the d7 text format migration is written, uncomment the following.
+#  signature_format:
+#    plugin: migration
+#    migration: d6_filter_format
+#    source: signature_format
+#    no_stub: 1
+  created: created
+  changed: changed
+  access: access
+  login: login
+  timezone: timezone
+  langcode: language
+  preferred_langcode: language
+  preferred_admin_langcode: language
+  init: init
+   # d7 user roles migration is not written yet.
+#  roles:
+#    plugin: migration
+#    migration: d7_user_role
+#    source: roles
\ No newline at end of file
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/d7/User.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/d7/User.php
new file mode 100755
index 0000000..c2801f6
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/d7/User.php
@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate_drupal\Plugin\migrate\source\d7\User.
+ */
+
+namespace Drupal\migrate_drupal\Plugin\migrate\source\d7;
+
+use Drupal\migrate\Plugin\SourceEntityInterface;
+use Drupal\migrate\Row;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Extract users from Drupal 7 database.
+ *
+ * @MigrateSource(
+ *   id = "d7_user"
+ * )
+ */
+class User extends DrupalSqlBase implements SourceEntityInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('users', 'u')
+      ->fields('u', array_keys($this->baseFields()))
+      ->condition('uid', 0, '>')
+      ->orderBy('uid');
+  }
+
+  /**
+  * {@inheritdoc}
+  */
+  public function fields() {
+    $fields = $this->baseFields();
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    return array(
+      'uid' => array(
+        'type' => 'integer',
+        'alias' => 'u',
+      ),
+    );
+  }
+
+  /**
+   * Returns the user base fields to be migrated.
+   *
+   * @return array
+   *   Associative array having field name as key and description as value.
+   */
+  protected function baseFields() {
+    $fields = array(
+      'uid' => $this->t('User ID'),
+      'name' => $this->t('Username'),
+      'pass' => $this->t('Password'),
+      'mail' => $this->t('Email address'),
+      'signature' => $this->t('Signature'),
+      'signature_format' => $this->t('Signature format'),
+      'created' => $this->t('Registered timestamp'),
+      'access' => $this->t('Last access timestamp'),
+      'login' => $this->t('Last login timestamp'),
+      'status' => $this->t('Status'),
+      'timezone' => $this->t('Timezone'),
+      'language' => $this->t('Language'),
+      'picture' => $this->t('Picture'),
+      'init' => $this->t('Init'),
+    );
+    return $fields;
+
+}
+
+  /**
+   * {@inheritdoc}
+   */
+  public function bundleMigrationRequired() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function entityTypeId() {
+    return 'user';
+  }
+
+}
\ No newline at end of file
diff --git a/core/modules/migrate_drupal/src/Tests/Table/d7/Users.php b/core/modules/migrate_drupal/src/Tests/Table/d7/Users.php
index 33d7f59..e5d9f1d 100644
--- a/core/modules/migrate_drupal/src/Tests/Table/d7/Users.php
+++ b/core/modules/migrate_drupal/src/Tests/Table/d7/Users.php
@@ -88,7 +88,7 @@ public function load() {
         'status' => array(
           'type' => 'int',
           'not null' => TRUE,
-          'length' => '4',
+          'length' => '11',
           'default' => '0',
         ),
         'timezone' => array(
@@ -139,8 +139,25 @@ public function load() {
       'init',
       'data',
     ))
-    ->execute();
+    ->values(array(
+      'uid' => '2',
+      'name' => 'Odo',
+      'pass' => '$S$DVpvPItXvnsmF3giVEe7Jy2lG.SCoEs8uKwpHsyPvdeNAaNZYxZ8',
+      'mail' => 'odo@local.host',
+      'theme' => '',
+      'signature' => '',
+      'signature_format' => 'filtered_html',
+      'created' => '1432750741',
+      'access' => '0',
+      'login' => '0',
+      'status' => '1',
+      'timezone' => 'America/Chicago',
+      'language' => '',
+      'picture' => '0',
+      'init' => 'odo@local.host',
+      'data' => 'a:1:{s:7:"contact";i:1;}',
+    ))->execute();
   }
 
 }
-#bb60d488e9420b75be9bb507fc35df8b
+#e53c042361fbbccb2bbc9918c072e19f
diff --git a/core/modules/migrate_drupal/src/Tests/d7/MigrateUserTest.php b/core/modules/migrate_drupal/src/Tests/d7/MigrateUserTest.php
new file mode 100644
index 0000000..413a1b3
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Tests/d7/MigrateUserTest.php
@@ -0,0 +1,149 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate_drupal\Tests\d7\MigrateUserTest.
+ */
+
+namespace Drupal\migrate_drupal\Tests\d7;
+
+use Drupal\user\Entity\User;
+use Drupal\file\Entity\File;
+use Drupal\Core\Database\Database;
+use Drupal\migrate\MigrateExecutable;
+use Drupal\user\RoleInterface;
+
+/**
+ * Users migration.
+ *
+ * @group migrate_drupal 7.x
+ * @dumpFile Users.php
+ * @migration d7_user
+ */
+class MigrateUserTest extends MigrateDrupal7TestBase {
+
+  /**
+   * The modules to be enabled during the test.
+   *
+   * @var array
+   */
+  static $modules = array(
+    'link',
+    'options',
+    'datetime',
+    'text',
+    'file',
+    'image',
+  );
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('file');
+    $this->installSchema('file', ['file_usage']);
+
+    // Create the user profile field and instance.
+    entity_create('field_storage_config', array(
+      'entity_type' => 'user',
+      'field_name' => 'user_picture',
+      'type' => 'image',
+      'translatable' => '0',
+    ))->save();
+    entity_create('field_config', array(
+      'label' => 'User Picture',
+      'description' => '',
+      'field_name' => 'user_picture',
+      'entity_type' => 'user',
+      'bundle' => 'user',
+      'required' => 0,
+    ))->save();
+
+    $file = entity_create('file', array(
+      'fid' => 2,
+      'uid' => 2,
+      'filename' => 'image-test.jpg',
+      'uri' => "public://image-test.jpg",
+      'filemime' => 'image/jpeg',
+      'created' => 1,
+      'changed' => 1,
+      'status' => FILE_STATUS_PERMANENT,
+    ));
+    $file->enforceIsNew();
+    file_put_contents($file->getFileUri(), file_get_contents('core/modules/simpletest/files/image-1.png'));
+    $file->save();
+
+    $file = entity_create('file', array(
+      'fid' => 8,
+      'uid' => 8,
+      'filename' => 'image-test.png',
+      'uri' => "public://image-test.png",
+      'filemime' => 'image/png',
+      'created' => 1,
+      'changed' => 1,
+      'status' => FILE_STATUS_PERMANENT,
+    ));
+    $file->enforceIsNew();
+    file_put_contents($file->getFileUri(), file_get_contents('core/modules/simpletest/files/image-2.jpg'));
+    $file->save();
+
+    // Load database dumps to provide source data.
+    $dumps = array(
+      $this->getDumpDirectory() . '/Users.php',
+    );
+    $this->loadDumps($dumps);
+
+    // Migrate users.
+    $migration = entity_load('migration', 'd7_user');
+    $executable = new MigrateExecutable($migration, $this);
+    $executable->import();
+  }
+
+  /**
+   * Tests the Drupal 7 user to Drupal 8 migration.
+   */
+  public function testUser() {
+    $users = Database::getConnection('default', 'migrate')
+      ->select('users', 'u')
+      ->fields('u')
+      ->execute()
+      ->fetchAll();
+
+    foreach ($users as $source) {
+      $roles = array(RoleInterface::AUTHENTICATED_ID);
+
+      /** @var \Drupal\user\UserInterface $user */
+      $user = User::load($source->uid);
+      $this->assertIdentical($source->uid, $user->id());
+      $this->assertIdentical($source->name, $user->label());
+      $this->assertIdentical($source->mail, $user->getEmail());
+      $this->assertIdentical($source->created, $user->getCreatedTime());
+      $this->assertIdentical($source->access, $user->getLastAccessedTime());
+      $this->assertIdentical($source->login, $user->getLastLoginTime());
+      $is_blocked = $source->status == 0;
+      $this->assertIdentical($is_blocked, $user->isBlocked());
+      // $user->getPreferredLangcode() might fallback to default language if the
+      // user preferred language is not configured on the site. We just want to
+      // test if the value was imported correctly.
+      $this->assertIdentical($source->language, $user->preferred_langcode->value);
+      // $time_zone = $source->expected_timezone ?: $this->config('system.date')->get('timezone.default');
+      // $this->assertIdentical($time_zone, $user->getTimeZone());
+      $this->assertIdentical($source->init, $user->getInitialEmail());
+      $this->assertIdentical($roles, $user->getRoles());
+
+      // We have one empty picture in the data so don't try load that.
+      if (!empty($source->picture)) {
+        // Test the user picture.
+        $file = File::load($user->user_picture->target_id);
+        $this->assertIdentical(basename($source->picture), $file->getFilename());
+      }
+
+      // Use the API to check if the password has been salted and re-hashed to
+      // conform the Drupal >= 7.
+      // $this->assertTrue(\Drupal::service('password')->check($source->pass_plain, $user));
+    }
+  }
+
+}
