diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index bab2af5..08464ab 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1845,6 +1845,24 @@ function theme_dropbutton_wrapper($variables) {
 }
 
 /**
+ * Returns HTML for wrapping a dropbutton list.
+ *
+ * Use this function if the dropbutton contains submit buttons. These elements
+ * need to have a #prefix and #suffix element that wraps those into an <li>
+ * element.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - element: An associative array containing the properties and children of
+ *     the dropbutton list. Properties used: #children.
+ */
+function theme_dropbutton_list_wrapper($variables) {
+  if (!empty($variables['element']['#children'])) {
+    return '<ul class="dropbutton">' . $variables['element']['#children'] . '</ul>';
+  }
+}
+
+/**
  * Returns HTML for an image.
  *
  * @param $variables
@@ -3155,6 +3173,9 @@ function drupal_common_theme() {
     'dropbutton_wrapper' => array(
       'render element' => 'element',
     ),
+    'dropbutton_list_wrapper' => array(
+      'render element' => 'element',
+    ),
     'image' => array(
       // HTML 4 and XHTML 1.0 always require an alt attribute. The HTML 5 draft
       // allows the alt attribute to be omitted in some cases. Therefore,
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
index faf5627..b103029 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorTestBase.php
@@ -324,7 +324,7 @@ function createSampleNodes($count = 5) {
       $edit = array();
       $edit['title'] = $this->randomName();
       $edit["body[$langcode][0][value]"] = $this->randomName();
-      $this->drupalPost('node/add/article', $edit, t('Save'));
+      $this->drupalPost('node/add/article', $edit, t('Publish'));
     }
   }
 }
diff --git a/core/modules/book/lib/Drupal/book/Tests/BookTest.php b/core/modules/book/lib/Drupal/book/Tests/BookTest.php
index 0a1ffcf..c554c55 100644
--- a/core/modules/book/lib/Drupal/book/Tests/BookTest.php
+++ b/core/modules/book/lib/Drupal/book/Tests/BookTest.php
@@ -127,7 +127,7 @@ function testBook() {
     $other_book = $this->createBookNode('new');
     $node = $this->createBookNode($book->nid);
     $edit = array('book[bid]' => $other_book->nid);
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     $this->drupalLogout();
     $this->drupalLogin($this->web_user);
@@ -251,10 +251,10 @@ function createBookNode($book_nid, $parent = NULL) {
       $this->drupalPost('node/add/book', $edit, t('Change book (update list of parents)'));
 
       $edit['book[plid]'] = $parent;
-      $this->drupalPost(NULL, $edit, t('Save'));
+      $this->drupalPost(NULL, $edit, t('Publish'));
     }
     else {
-      $this->drupalPost('node/add/book', $edit, t('Save'));
+      $this->drupalPost('node/add/book', $edit, t('Publish'));
     }
 
     // Check to make sure the book node was created.
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php
index e979a5c..87bf71c 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php
@@ -103,7 +103,7 @@ function testCommentLanguage() {
         "body[$langcode_not_specified][0][value]" => $this->randomName(),
         "langcode" => $node_langcode,
       );
-      $this->drupalPost("node/add/article", $edit, t('Save'));
+      $this->drupalPost("node/add/article", $edit, t('Publish'));
       $node = $this->drupalGetNodeByTitle($title);
 
       $prefixes = language_negotiation_url_prefixes();
diff --git a/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php b/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php
index ddfcac4..bacff03 100644
--- a/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php
+++ b/core/modules/dblog/lib/Drupal/dblog/Tests/DBLogTest.php
@@ -311,14 +311,14 @@ private function doNode($type) {
     $edit = $this->getContent($type);
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $title = $edit["title"];
-    $this->drupalPost('node/add/' . $type, $edit, t('Save'));
+    $this->drupalPost('node/add/' . $type, $edit, t('Publish'));
     $this->assertResponse(200);
     // Retrieve the node object.
     $node = $this->drupalGetNodeByTitle($title);
     $this->assertTrue($node != NULL, format_string('Node @title was loaded', array('@title' => $title)));
     // Edit the node.
     $edit = $this->getContentUpdate($type);
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertResponse(200);
     // Delete the node.
     $this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete'));
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php
index 9d7dd30..d9c49fd 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldDisplayTest.php
@@ -64,7 +64,7 @@ function testNodeDisplay() {
 
     // Turn the "display" option off and check that the file is no longer displayed.
     $edit = array($field_name . '[' . LANGUAGE_NOT_SPECIFIED . '][0][display]' => FALSE);
-    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Publish'));
 
     $this->assertNoRaw($default_output, t('Field is hidden when "display" option is unchecked.'));
 
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldRevisionTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldRevisionTest.php
index 480f411..8f03485 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldRevisionTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldRevisionTest.php
@@ -71,7 +71,7 @@ function testRevisions() {
 
     // Save a new version of the node without any changes.
     // Check that the file is still the same as the previous revision.
-    $this->drupalPost('node/' . $nid . '/edit', array('revision' => '1'), t('Save'));
+    $this->drupalPost('node/' . $nid . '/edit', array('revision' => '1'), t('Publish'));
     $node = node_load($nid, TRUE);
     $node_file_r3 = file_load($node->{$field_name}[LANGUAGE_NOT_SPECIFIED][0]['fid']);
     $node_vid_r3 = $node->vid;
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
index e291bec..8dd258a 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php
@@ -149,7 +149,7 @@ function uploadNodeFile($file, $field_name, $nid_or_type, $new_revision = TRUE,
 
     // Attach a file to the node.
     $edit['files[' . $field_name . '_' . $langcode . '_0]'] = drupal_realpath($file->uri);
-    $this->drupalPost("node/$nid/edit", $edit, t('Save'));
+    $this->drupalPost("node/$nid/edit", $edit, t('Publish'));
 
     return $nid;
   }
@@ -165,7 +165,7 @@ function removeNodeFile($nid, $new_revision = TRUE) {
     );
 
     $this->drupalPost('node/' . $nid . '/edit', array(), t('Remove'));
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
   }
 
   /**
@@ -178,7 +178,7 @@ function replaceNodeFile($file, $field_name, $nid, $new_revision = TRUE) {
     );
 
     $this->drupalPost('node/' . $nid . '/edit', array(), t('Remove'));
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
   }
 
   /**
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php
index 050931b..a3b355e 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldValidateTest.php
@@ -37,7 +37,7 @@ function testRequired() {
     // Try to post a new node without uploading a file.
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit = array("title" => $this->randomName());
-    $this->drupalPost('node/add/' . $type_name, $edit, t('Save'));
+    $this->drupalPost('node/add/' . $type_name, $edit, t('Publish'));
     $this->assertRaw(t('!title field is required.', array('!title' => $instance['label'])), t('Node save failed when required file field was empty.'));
 
     // Create a new node with the uploaded file.
@@ -56,7 +56,7 @@ function testRequired() {
 
     // Try to post a new node without uploading a file in the multivalue field.
     $edit = array('title' => $this->randomName());
-    $this->drupalPost('node/add/' . $type_name, $edit, t('Save'));
+    $this->drupalPost('node/add/' . $type_name, $edit, t('Publish'));
     $this->assertRaw(t('!title field is required.', array('!title' => $instance['label'])), t('Node save failed when required multiple value file field was empty.'));
 
     // Create a new node with the uploaded file into the multivalue field.
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldWidgetTest.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldWidgetTest.php
index 7fcf35f..1724798 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileFieldWidgetTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldWidgetTest.php
@@ -73,7 +73,7 @@ function testSingleValuedWidget() {
       $this->assertTrue(isset($label[0]), 'Label for upload found.');
 
       // Save the node and ensure it does not have the file.
-      $this->drupalPost(NULL, array(), t('Save'));
+      $this->drupalPost(NULL, array(), t('Publish'));
       $node = node_load($nid, TRUE);
       $this->assertTrue(empty($node->{$field_name}[LANGUAGE_NOT_SPECIFIED][0]['fid']), t('File was successfully removed from the node.'));
     }
@@ -191,7 +191,7 @@ function testMultiValuedWidget() {
       $this->assertNoFieldByXPath('//input[@type="submit"]', t('Remove'), t('After removing all files, there is no "Remove" button displayed (JSMode=%type).', array('%type' => $type)));
 
       // Save the node and ensure it does not have any files.
-      $this->drupalPost(NULL, array('title' => $this->randomName()), t('Save'));
+      $this->drupalPost(NULL, array('title' => $this->randomName()), t('Publish'));
       $matches = array();
       preg_match('/node\/([0-9]+)/', $this->getUrl(), $matches);
       $nid = $matches[1];
@@ -268,7 +268,7 @@ function testPrivateFileComment() {
     $edit = array(
       'title' => $this->randomName(),
     );
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($edit['title']);
 
     // Add a comment with a file.
@@ -302,10 +302,7 @@ function testPrivateFileComment() {
 
     // Unpublishes node.
     $this->drupalLogin($this->admin_user);
-    $edit = array(
-      'status' => FALSE,
-    );
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', array(), t('Unpublish'));
 
     // Ensures normal user can no longer download the file.
     $this->drupalLogin($user);
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterAdminTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterAdminTest.php
index c2b76d2..e5f5ab9 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterAdminTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterAdminTest.php
@@ -220,7 +220,7 @@ function testFilterAdmin() {
     $edit["title"] = $this->randomName();
     $edit["body[$langcode][0][value]"] = $text;
     $edit["body[$langcode][0][format]"] = $filtered;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been created.', array('%title' => $edit["title"])), 'Filtered node created.');
 
     $node = $this->drupalGetNodeByTitle($edit["title"]);
@@ -232,7 +232,7 @@ function testFilterAdmin() {
     // Use plain text and see if it escapes all tags, whether allowed or not.
     $edit = array();
     $edit["body[$langcode][0][format]"] = $plain;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->drupalGet('node/' . $node->nid);
     $this->assertText(check_plain($text), 'The "Plain text" text format escapes all HTML tags.');
 
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php
index a71a9e9..93edb32 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php
@@ -207,7 +207,7 @@ function testFormatWidgetPermissions() {
     $edit['title'] = $this->randomName(8);
     $edit[$body_value_key] = $this->randomName(16);
     $edit[$body_format_key] = $this->disallowed_format->format;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($edit['title']);
 
     // Try to edit with a less privileged user.
@@ -225,7 +225,7 @@ function testFormatWidgetPermissions() {
     $this->assertText($edit[$body_value_key], 'Old body found in preview.');
 
     // Save and verify that only the title was changed.
-    $this->drupalPost(NULL, $new_edit, t('Save'));
+    $this->drupalPost(NULL, $new_edit, t('Publish'));
     $this->assertNoText($edit['title'], 'Old title not found.');
     $this->assertText($new_edit['title'], 'New title found.');
     $this->assertText($edit[$body_value_key], 'Old body found.');
@@ -262,7 +262,7 @@ function testFormatWidgetPermissions() {
     $old_title = $new_edit['title'];
     $new_title = $this->randomName(8);
     $edit = array('title' => $new_title);
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertText(t('!name field is required.', array('!name' => t('Text format'))), 'Error message is displayed.');
     $this->drupalGet('node/' . $node->nid);
     $this->assertText($old_title, 'Old title found.');
@@ -270,7 +270,7 @@ function testFormatWidgetPermissions() {
 
     // Now select a new text format and make sure the node can be saved.
     $edit[$body_format_key] = filter_fallback_format();
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertUrl('node/' . $node->nid);
     $this->assertText($new_title, 'New title found.');
     $this->assertNoText($old_title, 'Old title not found.');
@@ -279,7 +279,7 @@ function testFormatWidgetPermissions() {
     // other formats on the site (leaving only the fallback format).
     $this->drupalLogin($this->admin_user);
     $edit = array($body_format_key => $this->allowed_format->format);
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertUrl('node/' . $node->nid);
     foreach (filter_formats() as $format) {
       if ($format->format != filter_fallback_format()) {
@@ -296,13 +296,13 @@ function testFormatWidgetPermissions() {
     $old_title = $new_title;
     $new_title = $this->randomName(8);
     $edit = array('title' => $new_title);
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertText(t('!name field is required.', array('!name' => t('Text format'))), 'Error message is displayed.');
     $this->drupalGet('node/' . $node->nid);
     $this->assertText($old_title, 'Old title found.');
     $this->assertNoText($new_title, 'New title not found.');
     $edit[$body_format_key] = filter_fallback_format();
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertUrl('node/' . $node->nid);
     $this->assertText($new_title, 'New title found.');
     $this->assertNoText($old_title, 'Old title not found.');
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterHooksTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterHooksTest.php
index 496a5f3..a5e381f 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterHooksTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterHooksTest.php
@@ -75,7 +75,7 @@ function testFilterHooks() {
       "body[$language_not_specified][0][value]" => $this->randomName(32),
       "body[$language_not_specified][0][format]" => $format_id,
     );
-    $this->drupalPost("node/add/{$type->type}", $edit, t('Save'));
+    $this->drupalPost("node/add/{$type->type}", $edit, t('Publish'));
     $this->assertText(t('@type @title has been created.', array('@type' => $type_name, '@title' => $title)), 'New node successfully created.');
 
     // Disable the text format.
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php
index f36c5a9..0665b57 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php
@@ -172,7 +172,7 @@ protected function createForumTopics($count = 5) {
       );
 
       // Create the forum topic, preselecting the forum ID via a URL parameter.
-      $this->drupalPost('node/add/forum/1', $edit, t('Save'));
+      $this->drupalPost('node/add/forum/1', $edit, t('Publish'));
       $topics[] = $title;
     }
 
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumIndexTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumIndexTest.php
index 7ae7d5f..ee73563 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumIndexTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumIndexTest.php
@@ -55,7 +55,7 @@ function testForumIndexStatus() {
     );
 
     // Create the forum topic, preselecting the forum ID via a URL parameter.
-    $this->drupalPost('node/add/forum/' . $tid, $edit, t('Save'));
+    $this->drupalPost('node/add/forum/' . $tid, $edit, t('Publish'));
 
     // Check that the node exists in the database.
     $node = $this->drupalGetNodeByTitle($title);
@@ -66,10 +66,7 @@ function testForumIndexStatus() {
     $this->assertText($title, 'Published forum topic appears on index.');
 
     // Unpublish the node.
-    $edit = array(
-      'status' => FALSE,
-    );
-    $this->drupalPost("node/{$node->nid}/edit", $edit, t('Save'));
+    $this->drupalPost("node/{$node->nid}/edit", array(), t('Unpublish'));
     $this->drupalGet("node/{$node->nid}");
     $this->assertText(t('Access denied'), 'Unpublished node is no longer accessible.');
 
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumNodeAccessTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumNodeAccessTest.php
index e619923..23f654d 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumNodeAccessTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumNodeAccessTest.php
@@ -61,7 +61,7 @@ function testForumNodeAccess() {
       "body[$langcode][0][value]" => $this->randomName(200),
       'private' => TRUE,
     );
-    $this->drupalPost('node/add/forum/1', $edit, t('Save'));
+    $this->drupalPost('node/add/forum/1', $edit, t('Publish'));
     $private_node = $this->drupalGetNodeByTitle($private_node_title);
     $this->assertTrue(!empty($private_node), 'New private forum node found in database.');
 
@@ -71,7 +71,7 @@ function testForumNodeAccess() {
       'title' => $public_node_title,
       "body[$langcode][0][value]" => $this->randomName(200),
     );
-    $this->drupalPost('node/add/forum/1', $edit, t('Save'));
+    $this->drupalPost('node/add/forum/1', $edit, t('Publish'));
     $public_node = $this->drupalGetNodeByTitle($public_node_title);
     $this->assertTrue(!empty($public_node), 'New public forum node found in database.');
 
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
index 7b0bef7..a86aa8c 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
@@ -210,7 +210,7 @@ function testForum() {
     // Test editing a forum topic that has a comment.
     $this->drupalLogin($this->edit_any_topics_user);
     $this->drupalGet('forum/' . $this->forum['tid']);
-    $this->drupalPost("node/$node->nid/edit", array(), t('Save'));
+    $this->drupalPost("node/$node->nid/edit", array(), t('Publish'));
     $this->assertResponse(200);
   }
 
@@ -230,7 +230,7 @@ function testAddOrphanTopic() {
 
     // Create an orphan forum item.
     $this->drupalLogin($this->admin_user);
-    $this->drupalPost('node/add/forum', array('title' => $this->randomName(10), 'body[' . LANGUAGE_NOT_SPECIFIED .'][0][value]' => $this->randomName(120)), t('Save'));
+    $this->drupalPost('node/add/forum', array('title' => $this->randomName(10), 'body[' . LANGUAGE_NOT_SPECIFIED .'][0][value]' => $this->randomName(120)), t('Publish'));
 
     $nid_count = db_query('SELECT COUNT(nid) FROM {node}')->fetchField();
     $this->assertEqual(0, $nid_count, 'A forum node was not created when missing a forum vocabulary.');
@@ -465,7 +465,7 @@ function createForumTopic($forum, $container = FALSE) {
     $tid = $forum['tid'];
 
     // Create the forum topic, preselecting the forum ID via a URL parameter.
-    $this->drupalPost('node/add/forum/' . $tid, $edit, t('Save'));
+    $this->drupalPost('node/add/forum/' . $tid, $edit, t('Publish'));
 
     $type = t('Forum topic');
     if ($container) {
@@ -549,7 +549,7 @@ private function verifyForums($node_user, Node $node, $admin, $response = 200) {
       // Assume the topic is initially associated with $forum.
       $edit["taxonomy_forums[$langcode]"] = $this->root_forum['tid'];
       $edit['shadow'] = TRUE;
-      $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+      $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
       $this->assertRaw(t('Forum topic %title has been updated.', array('%title' => $edit["title"])), 'Forum node was edited');
 
       // Verify topic was moved to a different forum.
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
index 1cfda9f..fd12707 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDisplayTest.php
@@ -187,7 +187,7 @@ function testImageFieldSettings() {
       $field_name . '[' . LANGUAGE_NOT_SPECIFIED . '][0][alt]' => $image_info['alt'],
       $field_name . '[' . LANGUAGE_NOT_SPECIFIED . '][0][title]' => $image_info['title'],
     );
-    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Publish'));
     $default_output = theme('image', $image_info);
     $this->assertRaw($default_output, 'Image displayed using user supplied alt and title attributes.');
 
@@ -197,7 +197,7 @@ function testImageFieldSettings() {
       $field_name . '[' . LANGUAGE_NOT_SPECIFIED . '][0][alt]' => $this->randomName($test_size),
       $field_name . '[' . LANGUAGE_NOT_SPECIFIED . '][0][title]' => $this->randomName($test_size),
     );
-    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Publish'));
     $this->assertRaw(t('Alternate text cannot be longer than %max characters but is currently %length characters long.', array(
       '%max' => $schema['fields'][$field_name .'_alt']['length'],
       '%length' => $test_size,
diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
index 760e72d..87af2bd 100644
--- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
+++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php
@@ -118,7 +118,7 @@ function uploadNodeImage($image, $field_name, $type) {
       'title' => $this->randomName(),
     );
     $edit['files[' . $field_name . '_' . LANGUAGE_NOT_SPECIFIED . '_0]'] = drupal_realpath($image->uri);
-    $this->drupalPost('node/add/' . $type, $edit, t('Save'));
+    $this->drupalPost('node/add/' . $type, $edit, t('Publish'));
 
     // Retrieve ID of the newly created node from the current URL.
     $matches = array();
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
index a424457..59f9b5d 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
@@ -126,7 +126,7 @@ function testContentTypeLanguageConfiguration() {
     $edit = array(
       'langcode' => 'en',
     );
-    $this->drupalPost($path, $edit, t('Save'));
+    $this->drupalPost($path, $edit, t('Publish'));
     $this->assertRaw(t('%title has been updated.', array('%title' => $node_title)));
 
     $this->drupalLogout();
diff --git a/core/modules/menu/lib/Drupal/menu/Tests/MenuNodeTest.php b/core/modules/menu/lib/Drupal/menu/Tests/MenuNodeTest.php
index cf01fbe..6e543f9 100644
--- a/core/modules/menu/lib/Drupal/menu/Tests/MenuNodeTest.php
+++ b/core/modules/menu/lib/Drupal/menu/Tests/MenuNodeTest.php
@@ -66,7 +66,7 @@ function testMenuNodeFormWidget() {
       "title" => $node_title,
       "body[$langcode][0][value]" => $this->randomString(),
     );
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($node_title);
     // Assert that there is no link for the node.
     $this->drupalGet('test-page');
@@ -76,7 +76,7 @@ function testMenuNodeFormWidget() {
     $edit = array(
       'menu[enabled]' => 1,
     );
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     // Assert that there is no link for the node.
     $this->drupalGet('test-page');
     $this->assertNoLink($node_title);
@@ -87,7 +87,7 @@ function testMenuNodeFormWidget() {
       'menu[link_title]' => $node_title,
       'menu[weight]' => 17,
     );
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     // Assert that the link exists.
     $this->drupalGet('test-page');
     $this->assertLink($node_title);
@@ -99,7 +99,7 @@ function testMenuNodeFormWidget() {
     $edit = array(
       'menu[enabled]' => FALSE,
     );
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     // Assert that there is no link for the node.
     $this->drupalGet('test-page');
     $this->assertNoLink($node_title);
@@ -117,7 +117,7 @@ function testMenuNodeFormWidget() {
     $this->drupalGet('node/' . $node->nid . '/edit');
     $this->assertText('Provide a menu link', 'Link in not allowed menu not shown in node edit form');
     // Assert that the link is still in the Administration menu after save.
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $link = menu_link_load($item['mlid']);
     $this->assertTrue($link, 'Link in not allowed menu still exists after saving node');
 
diff --git a/core/modules/node/css/node-admin.css b/core/modules/node/css/node-admin.css
new file mode 100644
index 0000000..5fb2f67
--- /dev/null
+++ b/core/modules/node/css/node-admin.css
@@ -0,0 +1,20 @@
+/**
+ * The .css file is intended to only contain positioning and size declarations
+ * For example: display, position, float, clear, and overflow.
+ */
+
+/**
+* Node form dropbuttons.
+*/
+.form-actions .dropbutton-wrapper {
+  width: 120px;
+  float: left;
+  margin-right: 1em;
+}
+
+.form-actions .dropbutton-wrapper li a,
+.form-actions .dropbutton-wrapper input {
+  padding: 4px 17px;
+  margin-bottom: 0em;
+}
+
diff --git a/core/modules/node/css/node-admin.theme.css b/core/modules/node/css/node-admin.theme.css
new file mode 100644
index 0000000..de5c892
--- /dev/null
+++ b/core/modules/node/css/node-admin.theme.css
@@ -0,0 +1,26 @@
+/**
+ * The .theme.css file is intended to contain presentation declarations including
+ * images, borders, colors, and fonts.
+ */
+
+/**
+ * Node form dropbuttons.
+ */
+.form-actions .dropbutton-wrapper li a,
+.form-actions .dropbutton-wrapper input {
+  border: medium;
+  border-radius: 0;
+  background: none;
+}
+
+.form-actions .dropbutton-wrapper input:hover {
+  background: none;
+  border: none;
+}
+
+/**
+ * Revisions overview screen.
+ */
+.revision-current {
+  background: #ffc;
+}
diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php
index 08ecf08..11dcb3e 100644
--- a/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -204,7 +204,7 @@ public function form(array $form, array &$form_state, EntityInterface $node) {
     $form['options'] = array(
       '#type' => 'details',
       '#access' => user_access('administer nodes'),
-      '#title' => t('Publishing options'),
+      '#title' => t('Promotion options'),
       '#collapsible' => TRUE,
       '#collapsed' => TRUE,
       '#group' => 'additional_settings',
@@ -217,12 +217,6 @@ public function form(array $form, array &$form_state, EntityInterface $node) {
       '#weight' => 95,
     );
 
-    $form['options']['status'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Published'),
-      '#default_value' => $node->status,
-    );
-
     $form['options']['promote'] = array(
       '#type' => 'checkbox',
       '#title' => t('Promoted to front page'),
@@ -246,6 +240,53 @@ public function form(array $form, array &$form_state, EntityInterface $node) {
   }
 
   /**
+   * Overrides Drupal\entity\EntityFormController::actionsElement().
+   */
+  protected function actionsElement(array $form, array &$form_state) {
+    $element = parent::actionsElement($form, $form_state);
+    $node = $this->getEntity($form_state);
+
+    // Because some of the 'links' are actually submit buttons, we have to
+    // manually wrap each item in <li> and the whole list in <ul>. The
+    // <ul> is added with a theme_wrapper function.
+    $element['operations'] = array(
+      '#type' => 'operations',
+      '#subtype' => 'node',
+      '#attached' => array (
+        'css' => array(
+          drupal_get_path('module', 'node') . '/css/node-admin.css',
+          drupal_get_path('module', 'node') . '/css/node-admin.theme.css'
+        ),
+      ),
+    );
+
+    $element['operations']['actions'] = array(
+      '#theme_wrappers' => array('dropbutton_list_wrapper')
+    );
+    $element['operations']['actions']['publish'] = array(
+      '#type' => 'submit',
+      '#value' => t('Publish'),
+      '#submit' => array(array($this, 'publish'), array($this, 'submit'), array($this, 'save')),
+      '#validate' => array(array($this, 'validate')),
+      '#button_type' => 'primary',
+      '#prefix' => '<li class="publish">',
+      '#suffix' => '</li>',
+    );
+    $element['operations']['actions']['unpublish'] = array(
+      '#type' => 'submit',
+      '#value' => t('Unpublish'),
+      '#submit' => array(array($this, 'unpublish'), array($this, 'submit'), array($this, 'save')),
+      '#validate' => array(array($this, 'validate')),
+      '#prefix' => '<li class="unpublish">',
+      "#suffix" => '</li>',
+    );
+
+    unset($element['submit']);
+
+    return $element;
+  }
+
+  /*
    * Overrides Drupal\Core\Entity\EntityFormController::actions().
    */
   protected function actions(array $form, array &$form_state) {
@@ -352,6 +393,34 @@ public function preview(array $form, array &$form_state) {
   }
 
   /**
+   * Form submission handler for the 'publish' action.
+   *
+   * @param $form
+   *   An associative array containing the structure of the form.
+   * @param $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function publish(array $form, array &$form_state) {
+    $node = $this->getEntity($form_state);
+    $node->status = TRUE;
+    return $node;
+  }
+
+  /**
+   * Form submission handler for the 'unpublish' action.
+   *
+   * @param $form
+   *   An associative array containing the structure of the form.
+   * @param $form_state
+   *   A reference to a keyed array containing the current state of the form.
+   */
+  public function unpublish(array $form, array &$form_state) {
+    $node = $this->getEntity($form_state);
+    $node->status = FALSE;
+    return $node;
+  }
+
+  /**
    * Overrides Drupal\Core\Entity\EntityFormController::save().
    */
   public function save(array $form, array &$form_state) {
diff --git a/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php b/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php
index 873c7ea..769db0a 100644
--- a/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php
@@ -42,14 +42,12 @@ function setUp() {
   function testMultiStepNodeFormBasicOptions() {
     $edit = array(
       'title' => 'a',
-      'status' => FALSE,
       'promote' => FALSE,
       'sticky' => 1,
       'choice[new:0][chtext]' => 'a',
       'choice[new:1][chtext]' => 'a',
     );
     $this->drupalPost('node/add/poll', $edit, t('Add another choice'));
-    $this->assertNoFieldChecked('edit-status', 'status stayed unchecked');
     $this->assertNoFieldChecked('edit-promote', 'promote stayed unchecked');
     $this->assertFieldChecked('edit-sticky', 'sticky stayed checked');
   }
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php
index 6b7d00d..f36a969 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessBaseTableTest.php
@@ -84,7 +84,7 @@ function testNodeAccessBasic() {
           $edit['field_tags[und]'] = 'public';
         }
 
-        $this->drupalPost('node/add/article', $edit, t('Save'));
+        $this->drupalPost('node/add/article', $edit, t('Publish'));
         $nid = db_query('SELECT nid FROM {node} WHERE title = :title', array(':title' => $edit['title']))->fetchField();
         $private_status = db_query('SELECT private FROM {node_access_test} where nid = :nid', array(':nid' => $nid))->fetchField();
         $this->assertTrue($is_private == $private_status, 'The private status of the node was properly set in the node_access_test table.');
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php
index 36baad2..f05bcf4 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeCreationTest.php
@@ -48,7 +48,7 @@ function testNodeCreation() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName(8);
     $edit["body[$langcode][0][value]"] = $this->randomName(16);
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the Basic page has been created.
     $this->assertRaw(t('!post %title has been created.', array('!post' => 'Basic page', '%title' => $edit["title"])), 'Basic page created.');
@@ -113,7 +113,7 @@ function testUnpublishedNodeCreation() {
     $edit = array();
     $edit["title"] = $this->randomName(8);
     $edit["body[" . LANGUAGE_NOT_SPECIFIED . "][0][value]"] = $this->randomName(16);
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Unpublish'));
 
     // Check that the user was redirected to the home page.
     $this->assertUrl('');
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeEntityViewModeAlterTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeEntityViewModeAlterTest.php
index b66944a..fbdee3c 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeEntityViewModeAlterTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeEntityViewModeAlterTest.php
@@ -38,7 +38,7 @@ function testNodeViewModeChange() {
     $edit["title"] = $this->randomName(8);
     $edit["body[$langcode][0][value]"] = t('Data that should appear only in the body for the node.');
     $edit["body[$langcode][0][summary]"] = t('Extra data that should appear only in the teaser for the node.');
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     $node = $this->drupalGetNodeByTitle($edit["title"]);
 
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
index 6ea519a..d2f6777 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeFieldMultilingualTestCase.php
@@ -79,7 +79,7 @@ function testMultilingualNodeForm() {
     $edit = array();
     $edit[$title_key] = $title_value;
     $edit[$body_key] = $body_value;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the node exists in the database.
     $node = $this->drupalGetNodeByTitle($edit[$title_key]);
@@ -94,7 +94,7 @@ function testMultilingualNodeForm() {
       $title_key => $this->randomName(8),
       'langcode' => 'it'
     );
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($edit[$title_key], TRUE);
     $this->assertTrue($node, 'Node found in database.');
 
@@ -127,7 +127,7 @@ function testMultilingualDisplaySettings() {
     $edit = array();
     $edit[$title_key] = $title_value;
     $edit[$body_key] = $body_value;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the node exists in the database.
     $node = $this->drupalGetNodeByTitle($edit[$title_key]);
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php b/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php
index ce48614..4d53c8b 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodePostSettingsTest.php
@@ -42,7 +42,7 @@ function testPagePostInfo() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName(8);
     $edit["body[$langcode][0][value]"] = $this->randomName(16);
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the post information is displayed.
     $node = $this->drupalGetNodeByTitle($edit["title"]);
@@ -65,7 +65,7 @@ function testPageNotPostInfo() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName(8);
     $edit["body[$langcode][0][value]"] = $this->randomName(16);
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the post information is displayed.
     $node = $this->drupalGetNodeByTitle($edit["title"]);
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
index c57cf53..3ea5bac 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTypeInitialLanguageTest.php
@@ -105,7 +105,7 @@ function testLanguageFieldVisibility() {
       'title' => $this->randomName(8),
       "body[$langcode][0][value]" => $this->randomName(16),
     );
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($edit['title']);
     $this->assertTrue($node, 'Node found in database.');
 
diff --git a/core/modules/node/lib/Drupal/node/Tests/PageEditTest.php b/core/modules/node/lib/Drupal/node/Tests/PageEditTest.php
index 20ebfbd..12eec15 100644
--- a/core/modules/node/lib/Drupal/node/Tests/PageEditTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/PageEditTest.php
@@ -42,7 +42,7 @@ function testPageEdit() {
     $edit = array();
     $edit[$title_key] = $this->randomName(8);
     $edit[$body_key] = $this->randomName(16);
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the node exists in the database.
     $node = $this->drupalGetNodeByTitle($edit[$title_key]);
@@ -66,7 +66,7 @@ function testPageEdit() {
     $edit[$title_key] = $this->randomName(8);
     $edit[$body_key] = $this->randomName(16);
     // Stay on the current page, without reloading.
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
 
     // Check that the title and body fields are displayed with the updated values.
     $this->assertText($edit[$title_key], 'Title displayed.');
@@ -81,7 +81,7 @@ function testPageEdit() {
     $edit['title'] = $this->randomName(8);
     $edit[$body_key] = $this->randomName(16);
     $edit['revision'] = TRUE;
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
 
     // Ensure that the node revision has been created.
     $revised_node = $this->drupalGetNodeByTitle($edit['title'], TRUE);
@@ -108,7 +108,7 @@ function testPageAuthoredBy() {
     $edit = array();
     $edit['title'] = $this->randomName(8);
     $edit[$body_key] = $this->randomName(16);
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     // Check that the node was authored by the currently logged in user.
     $node = $this->drupalGetNodeByTitle($edit['title']);
@@ -118,20 +118,20 @@ function testPageAuthoredBy() {
     $edit = array(
       'name' => 'invalid-name',
     );
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertText('The username invalid-name does not exist.');
 
     // Change the authored by field to an empty string, which should assign
     // authorship to the anonymous user (uid 0).
     $edit['name'] = '';
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $node = node_load($node->nid, TRUE);
     $this->assertIdentical($node->uid, '0', 'Node authored by anonymous user.');
 
     // Change the authored by field to another user's name (that is not
     // logged in).
     $edit['name'] = $this->web_user->name;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $node = node_load($node->nid, TRUE);
     $this->assertIdentical($node->uid, $this->web_user->uid, 'Node authored by normal user.');
 
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 74f100c..10a12c6 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -435,7 +435,7 @@ function node_admin_nodes() {
     '#attributes' => array('class' => array('container-inline')),
     '#access' => $admin_access,
     '#attached' => array (
-      'css' => array(drupal_get_path('module', 'node') . '/node.admin.css'),
+      'css' => array(drupal_get_path('module', 'node') . '/css/node-admin.theme.css'),
     ),
   );
   $options = array();
diff --git a/core/modules/node/node.js b/core/modules/node/node.js
index cdc8cbe..b61c117 100644
--- a/core/modules/node/node.js
+++ b/core/modules/node/node.js
@@ -38,14 +38,15 @@ Drupal.behaviors.nodeDetailsSummaries = {
       var $context = $(context);
       var vals = [];
 
-      $context.find('input:checked').parent().each(function () {
-        vals.push(Drupal.checkPlain($.trim($(this).text())));
-      });
-
-      if (!$context.find('.form-item-status input').is(':checked')) {
-        vals.unshift(Drupal.t('Not published'));
+      if ($context.find('input').is(':checked')) {
+        $context.find('input:checked').parent().each(function () {
+          vals.push(Drupal.checkPlain($.trim($(this).text())));
+        });
+        return vals.join(', ');
+      }
+      else {
+        return Drupal.t('Not promoted');
       }
-      return vals.join(', ');
     });
 
     $context.find('fieldset.node-translation-options').drupalSetSummary(function (context) {
diff --git a/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php b/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php
index 23ff7f7..2294ed4 100644
--- a/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php
+++ b/core/modules/path/lib/Drupal/path/Tests/PathAliasTest.php
@@ -141,7 +141,7 @@ function testNodeAlias() {
     // Create alias.
     $edit = array();
     $edit['path[alias]'] = $this->randomName(8);
-    $this->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Publish'));
 
     // Confirm that the alias works.
     $this->drupalGet($edit['path[alias]']);
@@ -153,7 +153,7 @@ function testNodeAlias() {
     $edit['path[alias]'] = "- ._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters.
       "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string.
       "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets.
-    $this->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node1->nid . '/edit', $edit, t('Publish'));
 
     // Confirm that the alias works.
     $this->drupalGet($edit['path[alias]']);
@@ -170,13 +170,13 @@ function testNodeAlias() {
 
     // Set alias to second test node.
     // Leave $edit['path[alias]'] the same.
-    $this->drupalPost('node/' . $node2->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node2->nid . '/edit', $edit, t('Publish'));
 
     // Confirm that the alias didn't make a duplicate.
     $this->assertText(t('The alias is already in use.'), 'Attempt to moved alias was rejected.');
 
     // Delete alias.
-    $this->drupalPost('node/' . $node1->nid . '/edit', array('path[alias]' => ''), t('Save'));
+    $this->drupalPost('node/' . $node1->nid . '/edit', array('path[alias]' => ''), t('Publish'));
 
     // Confirm that the alias no longer works.
     $this->drupalGet($edit['path[alias]']);
@@ -205,11 +205,11 @@ function testDuplicateNodeAlias() {
     $node_one = $this->drupalCreateNode();
     $edit = array();
     $edit['path[alias]'] = $this->randomName();
-    $this->drupalPost('node/' . $node_one->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node_one->nid . '/edit', $edit, t('Publish'));
 
     // Now create another node and try to set the same alias.
     $node_two = $this->drupalCreateNode();
-    $this->drupalPost('node/' . $node_two->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node_two->nid . '/edit', $edit, t('Publish'));
     $this->assertText(t('The alias is already in use.'));
     $this->assertFieldByXPath("//input[@name='path[alias]' and contains(@class, 'error')]", $edit['path[alias]'], 'Textfield exists and has the error class.');
   }
diff --git a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
index b3e2fcf..117854c 100644
--- a/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
+++ b/core/modules/path/lib/Drupal/path/Tests/PathLanguageTest.php
@@ -64,7 +64,7 @@ function testAliasTranslation() {
     $edit = array();
     $edit['langcode'] = 'en';
     $edit['path[alias]'] = $english_alias;
-    $this->drupalPost('node/' . $english_node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $english_node->nid . '/edit', $edit, t('Publish'));
 
     // Confirm that the alias works.
     $this->drupalGet($english_alias);
@@ -79,7 +79,7 @@ function testAliasTranslation() {
     $edit["body[$langcode][0][value]"] = $this->randomName();
     $french_alias = $this->randomName();
     $edit['path[alias]'] = $french_alias;
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
 
     // Clear the path lookup cache.
     drupal_container()->get('path.alias_manager')->cacheClear();
diff --git a/core/modules/php/lib/Drupal/php/Tests/PhpFilterTest.php b/core/modules/php/lib/Drupal/php/Tests/PhpFilterTest.php
index ffab8c5..0b838f8 100644
--- a/core/modules/php/lib/Drupal/php/Tests/PhpFilterTest.php
+++ b/core/modules/php/lib/Drupal/php/Tests/PhpFilterTest.php
@@ -39,7 +39,7 @@ function testPhpFilter() {
     $edit = array();
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit["body[$langcode][0][format]"] = $this->php_code_format->format;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node->label())), 'PHP code filter turned on.');
 
     // Make sure that the PHP code shows up as text.
diff --git a/core/modules/poll/lib/Drupal/poll/Tests/PollDeleteChoiceTest.php b/core/modules/poll/lib/Drupal/poll/Tests/PollDeleteChoiceTest.php
index ccbd044..9672b19 100644
--- a/core/modules/poll/lib/Drupal/poll/Tests/PollDeleteChoiceTest.php
+++ b/core/modules/poll/lib/Drupal/poll/Tests/PollDeleteChoiceTest.php
@@ -32,7 +32,7 @@ function testChoiceRemoval() {
     // Edit the poll, and try to delete first poll choice.
     $this->drupalGet("node/$poll_nid/edit");
     $edit['choice[chid:1][chtext]'] = '';
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
 
     // Click on the poll title to go to node page.
     $this->drupalGet('poll');
diff --git a/core/modules/poll/lib/Drupal/poll/Tests/PollExpirationTest.php b/core/modules/poll/lib/Drupal/poll/Tests/PollExpirationTest.php
index 2cfe9e5..dffd288 100644
--- a/core/modules/poll/lib/Drupal/poll/Tests/PollExpirationTest.php
+++ b/core/modules/poll/lib/Drupal/poll/Tests/PollExpirationTest.php
@@ -40,7 +40,7 @@ function testAutoExpire() {
     $edit = array();
     $poll_expiration = 604800; // One week.
     $edit['runtime'] = $poll_expiration;
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
     $this->assertRaw(t('Poll %title has been updated.', array('%title' => $title)), 'Poll expiration settings saved.');
 
     // Make sure that the changed expiration settings is kept.
diff --git a/core/modules/poll/lib/Drupal/poll/Tests/PollTestBase.php b/core/modules/poll/lib/Drupal/poll/Tests/PollTestBase.php
index 94da1ef..fcbf8f2 100644
--- a/core/modules/poll/lib/Drupal/poll/Tests/PollTestBase.php
+++ b/core/modules/poll/lib/Drupal/poll/Tests/PollTestBase.php
@@ -51,7 +51,7 @@ function pollCreate($title, $choices, $preview = TRUE) {
     // Verify that the vote count element only allows non-negative integers.
     $edit['choice[new:1][chvotes]'] = -1;
     $edit['choice[new:0][chvotes]'] = $this->randomString(7);
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
     $this->assertText(t('Vote count for new choice must be higher or equal to 0.'));
     $this->assertText(t('Vote count for new choice must be a number.'));
 
@@ -75,7 +75,7 @@ function pollCreate($title, $choices, $preview = TRUE) {
       list($edit, $index) = $this->_pollGenerateEdit($title, $choices, $index);
     }
 
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($title);
     $this->assertText(t('@type @title has been created.', array('@type' => node_type_get_label('poll'), '@title' => $title)), 'Poll has been created.');
     $this->assertTrue($node->nid, 'Poll has been found in the database.');
@@ -196,7 +196,7 @@ function assertPollChoiceOrder(array $choices, $index = 0, $preview = FALSE) {
    */
   function pollUpdate($nid, $title, $edit) {
     // Edit the poll node.
-    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $nid . '/edit', $edit, t('Publish'));
     $this->assertText(t('@type @title has been updated.', array('@type' => node_type_get_label('poll'), '@title' => $title)), 'Poll has been updated.');
   }
 }
diff --git a/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php b/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
index 8cc01e7..e0bf34f 100644
--- a/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
+++ b/core/modules/poll/lib/Drupal/poll/Tests/PollTranslateTest.php
@@ -65,7 +65,7 @@ function testPollTranslate() {
     $edit['choice[chid:1][chvotes]'] = 200;
     // Set the language to Dutch.
     $edit['langcode'] = 'nl';
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
 
     // Translate the Dutch poll.
     $this->drupalGet('node/add/poll', array('query' => array('translation' => $poll_nid, 'target' => 'en')));
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
index 1c69a0e..97ca82f 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php
@@ -144,7 +144,7 @@ function testAttributesInMarkupFile() {
 
     // Create node and save, then edit node to upload files.
     $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     // Get filenames and nid for comparison with HTML output.
     $file_filename = $file->filename;
@@ -171,7 +171,7 @@ function testAttributesInMarkupFile() {
     $tag2 = $this->randomName(8);
     $edit = array();
     $edit['field_tags[' . LANGUAGE_NOT_SPECIFIED . ']'] = "$tag1, $tag2";
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     // Ensures the RDFa markup for the relationship between the node and its
     // tags is correct.
     $term_rdfa_meta = $this->xpath('//div[@about=:node-url and contains(@typeof, "sioc:Item") and contains(@typeof, "foaf:Document")]//ul[@class="links"]/li[@rel="dc:subject"]/a[@typeof="skos:Concept" and @datatype="" and text()=:term-name]', array(
diff --git a/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php b/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php
index 3e80c72..9e32d2e 100644
--- a/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php
+++ b/core/modules/search/lib/Drupal/search/Tests/SearchConfigSettingsFormTest.php
@@ -45,7 +45,7 @@ function setUp() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $body_key = "body[$langcode][0][value]";
     $edit[$body_key] = l($node->label(), 'node/' . $node->nid) . ' pizza sandwich';
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     node_update_index();
     search_update_totals();
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
index bb3ac2c..9cec635 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityTranslationFormTest.php
@@ -68,7 +68,7 @@ function testEntityFormLanguage() {
 
     $this->drupalGet('node/add/page');
     $form_langcode = variable_get('entity_form_langcode', FALSE);
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
 
     $node = $this->drupalGetNodeByTitle($edit["title"]);
     $this->assertTrue($node->langcode == $form_langcode, 'Form language is the same as the entity language.');
@@ -97,7 +97,7 @@ function testEntityFormLanguage() {
     $edit["title"] = $this->randomName(8);
     $edit["body[$field_langcode][0][value]"] = $this->randomName(16);
     $edit['langcode'] = $langcode;
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been created.', array('%title' => $edit["title"])), 'Basic page created.');
 
     // Check to make sure the node was created.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php
index 3c0c0c5..ffd1f8f 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php
@@ -100,7 +100,7 @@ function testPreserveFormActionAfterAJAX() {
     // occurred, because this test is for testing what happens when a form is
     // re-rendered without being re-built, which is what happens when there's
     // a validation error.
-    $this->drupalPost(NULL, array(), t('Save'));
+    $this->drupalPost(NULL, array(), t('Publish'));
     $this->assertText('Title field is required.', 'Non-AJAX submission correctly triggered a validation error.');
 
     // Ensure that the form contains two items in the multi-valued field, so we
diff --git a/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php b/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php
index 88f188a..5911952 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php
@@ -281,7 +281,7 @@ function testBreadCrumbs() {
     $edit = array(
       'menu[parent]' => $link['menu_name'] . ':' . $link['mlid'],
     );
-    $this->drupalPost("node/{$parent->nid}/edit", $edit, t('Save'));
+    $this->drupalPost("node/{$parent->nid}/edit", $edit, t('Publish'));
     $expected = array(
       "node" => $link['link_title'],
     );
@@ -307,7 +307,7 @@ function testBreadCrumbs() {
     $edit = array(
       "field_tags[$langcode]" => implode(',', array_keys($tags)),
     );
-    $this->drupalPost("node/{$parent->nid}/edit", $edit, t('Save'));
+    $this->drupalPost("node/{$parent->nid}/edit", $edit, t('Publish'));
 
     // Put both terms into a hierarchy Drupal » Breadcrumbs. Required for both
     // the menu links and the terms itself, since taxonomy_term_page() resets
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/PageTitleFilteringTest.php b/core/modules/system/lib/Drupal/system/Tests/System/PageTitleFilteringTest.php
index 7e89cf7..7174006 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/PageTitleFilteringTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/PageTitleFilteringTest.php
@@ -75,7 +75,7 @@ function testTitleTags() {
       "body[$langcode][0][value]" => '!SimpleTest! test body' . $this->randomName(200),
     );
     // Create the node with HTML in the title.
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
 
     $node = $this->drupalGetNodeByTitle($edit["title"]);
     $this->assertNotNull($node, 'Node created and found in database');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/LegacyTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/LegacyTest.php
index d00f373..85c9e8b 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/LegacyTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/LegacyTest.php
@@ -39,7 +39,7 @@ function testTaxonomyLegacyNode() {
     $edit['date'] = '1969-01-01 00:00:00 -0500';
     $edit["body[$langcode][0][value]"] = $this->randomName();
     $edit["field_tags[$langcode]"] = $this->randomName();
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
     // Checks that the node has been saved.
     $node = $this->drupalGetNodeByTitle($edit['title']);
     $this->assertEqual($node->created, strtotime($edit['date']), 'Legacy node was saved with the right date.');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
index 278db90..0f16d43 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php
@@ -93,7 +93,7 @@ function testTaxonomyRss() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName();
     $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term1->tid;
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
 
     // Check that the term is displayed when the RSS feed is viewed.
     $this->drupalGet('rss.xml');
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
index f9cba0d..b6b3948 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php
@@ -106,7 +106,7 @@ function testTaxonomyIndex() {
     $edit["body[$langcode][0][value]"] = $this->randomName();
     $edit["{$this->field_name_1}[$langcode][]"] = $term_1->tid;
     $edit["{$this->field_name_2}[$langcode][]"] = $term_1->tid;
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
 
     // Check that the term is indexed, and only once.
     $node = $this->drupalGetNodeByTitle($edit["title"]);
@@ -118,7 +118,7 @@ function testTaxonomyIndex() {
 
     // Update the article to change one term.
     $edit["{$this->field_name_1}[$langcode][]"] = $term_2->tid;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     // Check that both terms are indexed.
     $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
@@ -134,7 +134,7 @@ function testTaxonomyIndex() {
 
     // Update the article to change another term.
     $edit["{$this->field_name_2}[$langcode][]"] = $term_2->tid;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     // Check that only one term is indexed.
     $index_count = db_query('SELECT COUNT(*) FROM {taxonomy_index} WHERE nid = :nid AND tid = :tid', array(
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
index 93cc8d4..2f5ceda 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php
@@ -110,7 +110,7 @@ function testTaxonomyNode() {
     $edit["title"] = $this->randomName();
     $edit["body[$langcode][0][value]"] = $this->randomName();
     $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term1->tid;
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
 
     // Check that the term is displayed when the node is viewed.
     $node = $this->drupalGetNodeByTitle($edit["title"]);
@@ -119,12 +119,12 @@ function testTaxonomyNode() {
 
     $this->clickLink(t('Edit'));
     $this->assertText($term1->name, 'Term is displayed when editing the node.');
-    $this->drupalPost(NULL, array(), t('Save'));
+    $this->drupalPost(NULL, array(), t('Publish'));
     $this->assertText($term1->name, 'Term is displayed after saving the node with no changes.');
 
     // Edit the node with a different term.
     $edit[$this->instance['field_name'] . '[' . $langcode . '][]'] = $term2->tid;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     $this->drupalGet('node/' . $node->nid);
     $this->assertText($term2->name, 'Term is displayed when viewing the node.');
@@ -180,7 +180,7 @@ function testNodeTermCreationAndDeletion() {
     taxonomy_terms_static_reset();
 
     // Save, creating the terms.
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
     $this->assertRaw(t('@type %title has been created.', array('@type' => t('Article'), '%title' => $edit["title"])), 'The node was created successfully.');
     foreach ($terms as $term) {
       $this->assertText($term, 'The term was saved and appears on the node page.');
@@ -516,13 +516,13 @@ function testReSavingTags() {
     $edit["title"] = $this->randomName(8);
     $edit["body[$langcode][0][value]"] = $this->randomName(16);
     $edit[$this->instance['field_name'] . '[' . $langcode . ']'] = $term->label();
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
 
     // Check that the term is displayed when editing and saving the node with no
     // changes.
     $this->clickLink(t('Edit'));
     $this->assertRaw($term->label(), 'Term is displayed when editing the node.');
-    $this->drupalPost(NULL, array(), t('Save'));
+    $this->drupalPost(NULL, array(), t('Publish'));
     $this->assertRaw($term->label(), 'Term is displayed after saving the node with no changes.');
   }
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
index ea73152..6f2c492 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php
@@ -78,7 +78,7 @@ function testTaxonomyTokenReplacement() {
     $edit = array();
     $node = $this->drupalCreateNode(array('type' => 'article'));
     $edit[$this->instance['field_name'] . '[' . $this->langcode . '][]'] = $term2->tid;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
 
     // Generate and test sanitized tokens for term1.
     $tests = array();
diff --git a/core/modules/text/lib/Drupal/text/Tests/TextSummaryTest.php b/core/modules/text/lib/Drupal/text/Tests/TextSummaryTest.php
index 29825ee..c8ecd16 100644
--- a/core/modules/text/lib/Drupal/text/Tests/TextSummaryTest.php
+++ b/core/modules/text/lib/Drupal/text/Tests/TextSummaryTest.php
@@ -175,7 +175,7 @@ function testOnlyTextSummary() {
       "title" => $this->randomName(),
       "body[und][0][summary]" => $summary,
     );
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($edit['title']);
 
     $this->assertIdentical($node->body['und'][0]['summary'], $summary, 'Article with with summary and no body has been submitted.');
diff --git a/core/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php b/core/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
index 25da4c6..07a91ee 100644
--- a/core/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
+++ b/core/modules/text/lib/Drupal/text/Tests/TextTranslationTest.php
@@ -77,7 +77,7 @@ function testTextField() {
     );
 
     // Translate the article in french.
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
     $node = $this->drupalGetNodeByTitle($edit['title']);
     $this->drupalGet("node/$node->nid/translate");
     $this->clickLink(t('add translation'));
@@ -106,7 +106,7 @@ function testTextFieldFormatted() {
       'title' => $title,
       'langcode' => 'en',
     );
-    $this->drupalPost('node/add/article', $edit, t('Save'));
+    $this->drupalPost('node/add/article', $edit, t('Publish'));
 
     // Populate the body field: the first item gets the "Full HTML" input
     // format, the second one "Filtered HTML".
@@ -117,7 +117,7 @@ function testTextFieldFormatted() {
         "body[$langcode][$delta][value]" => $value,
         "body[$langcode][$delta][format]" => array_shift($formats),
       );
-      $this->drupalPost('node/1/edit', $edit, t('Save'));
+      $this->drupalPost('node/1/edit', $edit, t('Publish'));
       $this->assertText($body[$delta], t('The body field with delta @delta has been saved.', array('@delta' => $delta)));
     }
 
diff --git a/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php b/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
index b3c1ec1..6eea702 100644
--- a/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
+++ b/core/modules/translation/lib/Drupal/translation/Tests/TranslationTest.php
@@ -75,9 +75,9 @@ function testContentTranslation() {
     // Unpublish the original node to check that this has no impact on the
     // translation overview page, publish it again afterwards.
     $this->drupalLogin($this->admin_user);
-    $this->drupalPost('node/' . $node->nid . '/edit', array('status' => FALSE), t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', array(), t('Unpublish'));
     $this->drupalGet('node/' . $node->nid . '/translate');
-    $this->drupalPost('node/' . $node->nid . '/edit', array('status' => NODE_PUBLISHED), t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', array(), t('Publish'));
     $this->drupalLogin($this->translator);
 
     // Check that the "add translation" link uses a localized path.
@@ -108,7 +108,7 @@ function testContentTranslation() {
     $langcode = LANGUAGE_NOT_SPECIFIED;
     $edit["title"] = $this->randomName();
     $edit["body[$langcode][0][value]"] = $this->randomName();
-    $this->drupalPost('node/add/page', $edit, t('Save'), array('query' => array('translation' => $node->nid, 'language' => 'es')));
+    $this->drupalPost('node/add/page', $edit, t('Publish'), array('query' => array('translation' => $node->nid, 'language' => 'es')));
     $duplicate = $this->drupalGetNodeByTitle($edit["title"]);
     $this->assertEqual($duplicate->tnid, 0, 'The node does not have a tnid.');
 
@@ -118,7 +118,7 @@ function testContentTranslation() {
     $edit = array();
     $edit["body[$langcode][0][value]"] = $node_body;
     $edit['translation[retranslate]'] = TRUE;
-    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_title)), 'Original node updated.');
 
     // Check to make sure that interface shows translation as outdated.
@@ -129,7 +129,7 @@ function testContentTranslation() {
     $edit = array();
     $edit["body[$langcode][0][value]"] = $this->randomName();
     $edit['translation[status]'] = FALSE;
-    $this->drupalPost('node/' . $node_translation->nid . '/edit', $edit, t('Save'));
+    $this->drupalPost('node/' . $node_translation->nid . '/edit', $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been updated.', array('%title' => $node_translation_title)), 'Translated node updated.');
 
     // Confirm that language neutral is an option for translators when there are
@@ -169,8 +169,7 @@ function testLanguageSwitchLinks() {
     // Unpublish the Spanish translation to check that the related language
     // switch link is not shown.
     $this->drupalLogin($this->admin_user);
-    $edit = array('status' => FALSE);
-    $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
+    $this->drupalPost("node/$translation_es->nid/edit", array(), t('Unpublish'));
     $this->drupalLogin($this->translator);
     $this->assertLanguageSwitchLinks($node, $translation_es, FALSE);
 
@@ -180,8 +179,7 @@ function testLanguageSwitchLinks() {
     $edit = array('language_interface[enabled][language-url]' => FALSE);
     $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
     $this->resetCaches();
-    $edit = array('status' => TRUE);
-    $this->drupalPost("node/$translation_es->nid/edit", $edit, t('Save'));
+    $this->drupalPost("node/$translation_es->nid/edit", array(), t('Publish'));
     $this->drupalLogin($this->translator);
     $this->assertLanguageSwitchLinks($node, $translation_es, TRUE, 'node');
   }
@@ -351,7 +349,7 @@ function createPage($title, $body, $langcode = NULL) {
     if (!empty($langcode)) {
       $edit['langcode'] = $langcode;
     }
-    $this->drupalPost('node/add/page', $edit, t('Save'));
+    $this->drupalPost('node/add/page', $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), 'Basic page created.');
 
     // Check to make sure the node was created.
@@ -387,7 +385,7 @@ function createTranslation(Node $node, $title, $body, $langcode) {
     $edit = array();
     $edit["title"] = $title;
     $edit[$body_key] = $body;
-    $this->drupalPost(NULL, $edit, t('Save'));
+    $this->drupalPost(NULL, $edit, t('Publish'));
     $this->assertRaw(t('Basic page %title has been created.', array('%title' => $title)), 'Translation created.');
 
     // Check to make sure that translation was successful.
diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
index 42be87c..5308e39 100644
--- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
+++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationUITest.php
@@ -164,9 +164,10 @@ function testTranslationUI() {
     $values[$langcode] = $this->getNewEntityValues($langcode);
 
     $controller = translation_entity_controller($this->entityType);
+    $publish_button = $this->entityType == 'node' ? t('Publish') : t('Save');
     $base_path = $controller->getBasePath($entity);
     $path = $langcode . '/' . $base_path . '/translations/add/' . $default_langcode . '/' . $langcode;
-    $this->drupalPost($path, $this->getEditValues($values, $langcode), t('Save'));
+    $this->drupalPost($path, $this->getEditValues($values, $langcode), $publish_button);
     if ($this->testLanguageSelector) {
       $this->assertNoFieldByXPath('//select[@id="edit-langcode"]', NULL, 'Language selector correclty disabled on translations.');
     }
@@ -183,7 +184,7 @@ function testTranslationUI() {
     // Add another translation and mark the other ones as outdated.
     $values[$langcode] = $this->getNewEntityValues($langcode);
     $edit = $this->getEditValues($values, $langcode) + array('translation[retranslate]' => TRUE);
-    $this->drupalPost($path, $edit, t('Save'));
+    $this->drupalPost($path, $edit, $publish_button);
     $entity = entity_load($this->entityType, $entity->id(), TRUE);
 
     // Check that the entered values have been correctly stored.
@@ -208,7 +209,7 @@ function testTranslationUI() {
       else {
         $this->assertFieldByXPath('//input[@name="translation[translate]"]', TRUE, 'The translate flag is checked by default.');
         $edit = array('translation[translate]' => FALSE);
-        $this->drupalPost($path, $edit, t('Save'));
+        $this->drupalPost($path, $edit, $publish_button);
         $this->drupalGet($path);
         $this->assertFieldByXPath('//input[@name="translation[retranslate]"]', FALSE, 'The retranslate flag is now shown.');
         $entity = entity_load($this->entityType, $entity->id(), TRUE);
diff --git a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
index 693ed68..fb066c8 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php
@@ -107,14 +107,14 @@ function testTaggedWith() {
     $edit = array();
     $edit['title'] = $node_tag1_title = $this->randomName();
     $edit[$tag_field] = 'tag1';
-    $this->drupalPost($node_add_path, $edit, t('Save'));
+    $this->drupalPost($node_add_path, $edit, t('Publish'));
     $edit = array();
     $edit['title'] = $node_tag1_tag2_title = $this->randomName();
     $edit[$tag_field] = 'tag1, tag2';
-    $this->drupalPost($node_add_path, $edit, t('Save'));
+    $this->drupalPost($node_add_path, $edit, t('Publish'));
     $edit = array();
     $edit['title'] = $node_no_tags_title = $this->randomName();
-    $this->drupalPost($node_add_path, $edit, t('Save'));
+    $this->drupalPost($node_add_path, $edit, t('Publish'));
 
     // Create a view that filters by taxonomy term "tag1". It should show only
     // the two nodes from above that are tagged with "tag1".
diff --git a/core/themes/seven/style.css b/core/themes/seven/style.css
index 9c4fff4..fcc0a02 100644
--- a/core/themes/seven/style.css
+++ b/core/themes/seven/style.css
@@ -753,9 +753,12 @@ select.form-select:focus {
     margin-right: 0;
     margin-top: 10px;
     padding-bottom: 6px;
-    padding-top: 6px;
     width: 100%;
   }
+  .form-actions input:first-child,
+  .form-wrapper input[type="submit"]:first-child {
+    margin-top: 0;
+  }
   .exposed-filters .filters,
   .exposed-filters .form-item label,
   .exposed-filters .form-select {
@@ -1074,6 +1077,34 @@ div.add-or-remove-shortcuts {
   text-overflow: clip;
 }
 
+.js .form-actions .dropbutton-widget {
+  background-color: #9dcae7;
+  background-image: none;
+  border: 1px solid #8eB7cd;
+  border-bottom-color: #7691a2;
+  color: #133B54;
+}
+.js .form-actions .dropbutton-widget:focus,
+.js .form-actions .dropbutton-widget:hover {
+  background-color: #73b3dd;
+  border: 1px solid #6ea3bf;
+  border-bottom-color: #4680a0;
+}
+.js .form-actions .dropbutton-widget:active {
+  background-color: #3981b1;
+  border: 1px solid #36647c;
+  border-bottom-color: #284657;
+}
+.js .form-actions .dropbutton-multiple.open .dropbutton-widget:hover {
+  background-color: #9dcae7;
+}
+.js .form-actions .dropbutton-multiple.open .dropbutton-widget:hover {
+  background-color: #9dcae7;
+}
+.js .form-actions .dropbutton-multiple.open .dropbutton-action:hover {
+  background-color: #73b3dd;
+}
+
 /* Disable overlay message */
 #overlay-disable-message {
   background-color: #addafc;
