diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index e3f920c..56c0c15 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -9,6 +9,7 @@
 
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Config\Entity\ConfigEntityInterface;
 use Drupal\migrate\Exception\RequirementsException;
 use Drupal\migrate\MigrateException;
 use Drupal\migrate\MigrateSkipRowException;
@@ -534,4 +535,56 @@ public function calculateDependencies() {
 
     return $this->dependencies;
   }
+
+  /**
+   * Helper callback for uasort() to sort migrations by dependency.
+   */
+  public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
+    if (static::dependsOn($a, $b)) {
+      return 1;
+    }
+    elseif (static::dependsOn($b, $a)) {
+      return -1;
+    }
+    else {
+      // If there's no dependency relationship, fall back to the default sort
+      // (weight, then label).
+      return parent::sort($a, $b);
+    }
+  }
+
+  /**
+   * Does a given migration have a migration dependency (either directly or
+   * via intermediate dependencies) on another migration?
+   *
+   * @param \Drupal\migrate\Entity\MigrationInterface $a
+   *   Migration with dependencies to check.
+   *
+   * @param \Drupal\migrate\Entity\MigrationInterface $b
+   *   Migration we search the dependencies for.
+   *
+   * @return bool
+   *   TRUE if $a depends on $b, FALSE otherwise.
+   */
+  protected static function dependsOn(MigrationInterface $a, MigrationInterface $b) {
+    // Ignore dependencies that don't exist.
+    if (!is_object($a)) {
+      return FALSE;
+    }
+    $a_dependencies = array_merge($a->getMigrationDependencies()['required'],
+          $a->getMigrationDependencies()['optional']);
+    foreach ($a_dependencies as $dependency_id) {
+      if ($dependency_id == $b->id()) {
+        return TRUE;
+      }
+      else {
+        $dependency = entity_load('migration', $dependency_id);
+        if ($dependency && static::dependsOn($dependency, $b)) {
+          return TRUE;
+        }
+      }
+    }
+    return FALSE;
+  }
+
 }
diff --git a/core/modules/migrate/src/MigrationStorage.php b/core/modules/migrate/src/MigrationStorage.php
index 3d0454e..0e1f8a2 100644
--- a/core/modules/migrate/src/MigrationStorage.php
+++ b/core/modules/migrate/src/MigrationStorage.php
@@ -18,6 +18,16 @@ class MigrationStorage extends ConfigEntityStorage implements MigrateBuildDepend
   /**
    * {@inheritdoc}
    */
+  public function loadMultiple(array $ids = NULL) {
+    $entities = parent::loadMultiple($ids);
+    // Sort the migrations by dependency.
+    uasort($entities, array($this->entityType->getClass(), 'sort'));
+    return $entities;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function buildDependencyMigration(array $migrations, array $dynamic_ids) {
     // Migration dependencies defined in the migration storage can be
     // optional or required. If an optional dependency does not run, the current
diff --git a/core/modules/migrate/src/Tests/dependencies/MigrateDependenciesTest.php b/core/modules/migrate/src/Tests/dependencies/MigrateDependenciesTest.php
new file mode 100644
index 0000000..aaa705b
--- /dev/null
+++ b/core/modules/migrate/src/Tests/dependencies/MigrateDependenciesTest.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\Tests\dependencies\MigrateDependenciesTest.
+ */
+
+namespace Drupal\migrate\Tests\dependencies;
+
+use Drupal\migrate\Tests\MigrateTestBase;
+
+/**
+ * Ensure the consistency among the dependencies for migrate.
+ *
+ * @group migrate
+ * @group Drupal
+ * @group migrate
+ */
+class MigrateDependenciesTest extends MigrateTestBase {
+
+  static $modules = array('dependency_test');
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+    $this->installConfig(array('dependency_test'));
+  }
+
+  /**
+   * Tests that the order is correct when loading several migrations.
+   */
+  public function testMigrateDependenciesOrder() {
+    $migration_items = array('comment', 'node', 'user');
+    $migrations = entity_load_multiple('migration', $migration_items);
+    $expected_order = array('user', 'node', 'comment');
+    $this->assertIdentical(array_keys($migrations), $expected_order);
+  }
+
+}
diff --git a/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.comment.yml b/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.comment.yml
new file mode 100644
index 0000000..ba02f75
--- /dev/null
+++ b/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.comment.yml
@@ -0,0 +1,15 @@
+id: comment
+label: Comment migration
+migration_tags:
+  - Testing
+source:
+  plugin: empty
+load:
+  plugin: empty
+process:
+  src: barfoo
+destination:
+  plugin: entity:comment
+migration_dependencies:
+  required:
+    - node
diff --git a/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.node.yml b/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.node.yml
new file mode 100644
index 0000000..0573314
--- /dev/null
+++ b/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.node.yml
@@ -0,0 +1,15 @@
+id: node
+label: Node migration
+migration_tags:
+  - Testing
+source:
+  plugin: empty
+load:
+  plugin: empty
+process:
+  src: barfoo
+destination:
+  plugin: entity:node
+migration_dependencies:
+  required:
+    - user
diff --git a/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.user.yml b/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.user.yml
new file mode 100644
index 0000000..3102353
--- /dev/null
+++ b/core/modules/migrate/tests/modules/dependency_test/config/install/migrate.migration.user.yml
@@ -0,0 +1,12 @@
+id: user
+label: User migration
+migration_tags:
+  - Testing
+source:
+  plugin: empty
+load:
+  plugin: empty
+process:
+  src: barfoo
+destination:
+  plugin: entity:user
diff --git a/core/modules/migrate/tests/modules/dependency_test/dependency_test.info.yml b/core/modules/migrate/tests/modules/dependency_test/dependency_test.info.yml
new file mode 100644
index 0000000..e776961
--- /dev/null
+++ b/core/modules/migrate/tests/modules/dependency_test/dependency_test.info.yml
@@ -0,0 +1,5 @@
+name: 'Migration dependency test'
+type: module
+package: Testing
+version: VERSION
+core: 8.x
