diff --git a/core/modules/views/src/Entity/View.php b/core/modules/views/src/Entity/View.php
index 361206c..167f169 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -285,6 +285,11 @@ public function calculateDependencies() {
   public function preSave(EntityStorageInterface $storage) {
     parent::preSave($storage);
 
+    // Sort the displays.
+    $display = $this->get('display');
+    ksort($display);
+    $this->set('display', array('default' => $display['default']) + $display);
+
     // @todo Check whether isSyncing is needed.
     if (!$this->isSyncing()) {
       $this->addCacheMetadata();
@@ -421,13 +426,6 @@ public function mergeDefaultDisplaysOptions() {
       // Add the defaults for the display.
       $displays[$key] = $options;
     }
-    // Sort the displays.
-    uasort($displays, function ($display1, $display2) {
-      if ($display1['position'] != $display2['position']) {
-        return $display1['position'] < $display2['position'] ? -1 : 1;
-      }
-      return 0;
-    });
     $this->set('display', $displays);
   }
 
diff --git a/core/modules/views/src/Tests/ViewStorageTest.php b/core/modules/views/src/Tests/ViewStorageTest.php
index 3eeda98..19ec50e 100644
--- a/core/modules/views/src/Tests/ViewStorageTest.php
+++ b/core/modules/views/src/Tests/ViewStorageTest.php
@@ -97,7 +97,7 @@ protected function loadTests() {
     }
 
     // Check the displays have been loaded correctly from config display data.
-    $expected_displays = array('default', 'page_1', 'block_1');
+    $expected_displays = array('default', 'block_1', 'page_1');
     $this->assertEqual(array_keys($view->get('display')), $expected_displays, 'The correct display names are present.');
 
     // Check each ViewDisplay object and confirm that it has the correct key and
diff --git a/core/modules/views_ui/src/Tests/DisplayOrderTest.php b/core/modules/views_ui/src/Tests/DisplayOrderTest.php
new file mode 100644
index 0000000..db57632
--- /dev/null
+++ b/core/modules/views_ui/src/Tests/DisplayOrderTest.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Tests\DisplayOrderTest.
+ */
+
+namespace Drupal\views_ui\Tests;
+
+use Drupal\Core\Url;
+use Drupal\views\Views;
+
+/**
+ * Tests order of displays in the Web UI.
+ *
+ * @group views_ui
+ */
+class DisplayOrderTest extends UITestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_display');
+
+  /**
+   * Modules to enable
+   *
+   * @var array
+   */
+  public static $modules = array('contextual');
+
+  /**
+   * Tests order of displays.
+   */
+  public function testDisplayOrder() {
+    // Show the master display.
+    \Drupal::config('views.settings')
+      ->set('ui.show.master_display', TRUE)
+      ->save();
+
+    $settings['page[create]'] = FALSE;
+    $view = $this->randomView($settings);
+
+    $view_id = $view['id'];
+    $path_prefix = 'admin/structure/views/view/' . $view_id . '/edit';
+    $this->drupalGet($path_prefix);
+
+    // Add a new page display.
+    $this->drupalPostForm(NULL, array(), 'Add Page');
+    $this->assertLinkByHref($path_prefix . '/page_1', 0, 'Make sure after adding a display the new display appears in the UI');
+
+    $this->assertNoLink('Master*', 0, 'Make sure the master display is not marked as changed.');
+    $this->assertLink('Page*', 0, 'Make sure the added display is marked as changed.');
+
+    $this->drupalPostForm("admin/structure/views/nojs/display/{$view_id}/page_1/path", array('path' => 'test/path'), t('Apply'));
+    $this->drupalPostForm(NULL, array(), t('Save'));
+
+    // Add a new block display.
+    $this->drupalPostForm(NULL, array(), 'Add Block');
+    $this->assertLinkByHref($path_prefix . '/block_1', 0, 'Make sure after adding a display the new display appears in the UI');
+    $this->drupalPostForm(NULL, array(), t('Save'));
+
+    // Test that the new view displays are in the correct order.
+    $view = Views::getView($view_id);
+    $displays = $view->storage->get('display');
+    $expected_displays = array('default', 'block_1', 'page_1');
+    $this->assertEqual(array_keys($displays), $expected_displays, 'The display names are in correct order.');
+
+    // Ensure that the displays also appear in the right order in the UI.
+    $result = $this->cssSelect('ul#views-display-menu-tabs li a');
+    $this->assertEqual(count($result), 3);
+    $this->assertEqual(Url::fromRoute('entity.view.edit_display_form', ['view' => $view_id, 'display_id' => 'default'])->toString(), (string) $result[0]['href']);
+    $this->assertEqual(Url::fromRoute('entity.view.edit_display_form', ['view' => $view_id, 'display_id' => 'page_1'])->toString(), (string) $result[1]['href']);
+    $this->assertEqual(Url::fromRoute('entity.view.edit_display_form', ['view' => $view_id, 'display_id' => 'block_1'])->toString(), (string) $result[2]['href']);
+  }
+
+}
diff --git a/core/modules/views_ui/src/ViewFormBase.php b/core/modules/views_ui/src/ViewFormBase.php
index 7747078..964527b 100644
--- a/core/modules/views_ui/src/ViewFormBase.php
+++ b/core/modules/views_ui/src/ViewFormBase.php
@@ -54,6 +54,7 @@ protected function prepareEntity() {
     if ($tabs = $this->getDisplayTabs($this->entity)) {
       // If a display isn't specified, use the first one.
       if (empty($this->displayID)) {
+        $tabs = $this->sortDisplayTabs($tabs);
         foreach ($tabs as $id => $tab) {
           if (!isset($tab['#access']) || $tab['#access']) {
             $this->displayID = $id;
@@ -77,6 +78,36 @@ protected function prepareEntity() {
   }
 
   /**
+   * Sort tabs by name, but prioritize default, page and block.
+   *
+   * @param array $tabs
+   *
+   * @return array
+   */
+  protected function sortDisplayTabs($tabs) {
+    ksort($tabs);
+
+    $default = array_filter(array_keys($tabs), function ($value) {
+      return (strpos($value, 'default') === 0) ? TRUE : FALSE;
+    });
+
+    $page = array_filter(array_keys($tabs), function ($value) {
+      return (strpos($value, 'page') === 0) ? TRUE : FALSE;
+    });
+
+    $block = array_filter(array_keys($tabs), function ($value) {
+      return (strpos($value, 'block') === 0) ? TRUE : FALSE;
+    });
+
+    $sorted = array();
+    $sorted += array_intersect_key($tabs, array_flip($default));
+    $sorted += array_intersect_key($tabs, array_flip($page));
+    $sorted += array_intersect_key($tabs, array_flip($block));
+    $sorted += $tabs;
+    return $sorted;
+  }
+
+  /**
    * Creates an array of Views admin CSS for adding or attaching.
    *
    * This returns an array of arrays. Each array represents a single
