diff --git a/core/modules/ckeditor/ckeditor.admin.inc b/core/modules/ckeditor/ckeditor.admin.inc
index 0dff9f5..45891aa 100644
--- a/core/modules/ckeditor/ckeditor.admin.inc
+++ b/core/modules/ckeditor/ckeditor.admin.inc
@@ -53,9 +53,12 @@ function theme_ckeditor_settings_toolbar($variables) {
 
   $build_button_item = function($button, $rtl) {
     // Value of the button item.
-    if (isset($button['image_alternative'])) {
+    if (isset($button['image_alternative' . $rtl])) {
       $value = $button['image_alternative' . $rtl];
     }
+    elseif (isset($button['image_alternative'])) {
+      $value = $button['image_alternative'];
+    }
     elseif (isset($button['image'])) {
       $value = theme('image', array('uri' => $button['image' . $rtl], 'title' => $button['label']));
     }
diff --git a/core/modules/ckeditor/ckeditor.module b/core/modules/ckeditor/ckeditor.module
index c566f3a..7e34570 100644
--- a/core/modules/ckeditor/ckeditor.module
+++ b/core/modules/ckeditor/ckeditor.module
@@ -85,6 +85,31 @@ function ckeditor_theme() {
 }
 
 /**
+ * Implements hook_ckeditor_css_alter().
+ *
+ * This function emulates language_css_alter() and ensures that RTL stylesheets
+ * are automatically added to CKEditor instances if the editor is displayed in
+ * an RTL language.
+ */
+function ckeditor_ckeditor_css_alter(&$css, $editor) {
+  $language_interface = language(LANGUAGE_TYPE_INTERFACE);
+
+  // If the current language is RTL, add the CSS file with the RTL overrides.
+  if ($language_interface->direction == LANGUAGE_RTL) {
+    $css_with_rtl = array();
+    foreach ($css as $path) {
+      $css_with_rtl[] = $path;
+      // Only provide RTL overrides for files.
+      $rtl_path = str_replace('.css', '-rtl.css', $path);
+      if (file_exists($rtl_path) && !in_array($rtl_path, $css)) {
+        $css_with_rtl[] = $rtl_path;
+      }
+    }
+    $css = $css_with_rtl;
+  }
+}
+
+/**
  * Retrieves the default theme's CKEditor stylesheets defined in the .info file.
  *
  * Themes may specify iframe-specific CSS files for use with CKEditor by
diff --git a/core/modules/ckeditor/css/ckeditor.admin-rtl.css b/core/modules/ckeditor/css/ckeditor.admin-rtl.css
index 548a4f9..bd07009 100644
--- a/core/modules/ckeditor/css/ckeditor.admin-rtl.css
+++ b/core/modules/ckeditor/css/ckeditor.admin-rtl.css
@@ -8,6 +8,10 @@
   float: right;
 }
 
+.ckeditor-toolbar-dividers {
+  float: left;
+}
+
 ul.ckeditor-buttons li {
   float: right;
 }
diff --git a/core/modules/ckeditor/css/ckeditor.admin.css b/core/modules/ckeditor/css/ckeditor.admin.css
index 272e3ea..2c0f57b 100644
--- a/core/modules/ckeditor/css/ckeditor.admin.css
+++ b/core/modules/ckeditor/css/ckeditor.admin.css
@@ -28,7 +28,7 @@
   margin-bottom: 1em;
 }
 .ckeditor-toolbar-dividers {
-  float: right;
+  float: right; /* LTR */
 }
 .ckeditor-toolbar-disabled ul.ckeditor-buttons {
   border: 0;
diff --git a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/ckeditor/plugin/Internal.php b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/ckeditor/plugin/Internal.php
index 86fe66f..f26826c 100644
--- a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/ckeditor/plugin/Internal.php
+++ b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/ckeditor/plugin/Internal.php
@@ -43,10 +43,18 @@ public function getFile() {
    * Implements \Drupal\ckeditor\Plugin\CKEditorPluginInterface::getConfig().
    */
   public function getConfig(Editor $editor) {
+    // In order to allow CSS to fully flip alignment, RTL languages need to
+    // have the alignment buttons flip their class names.
+    $language_interface = language(LANGUAGE_TYPE_INTERFACE);
+    $rtl = $language_interface->direction == LANGUAGE_RTL;
+
     // Reasonable defaults that provide expected basic behavior.
     $config = array(
       'customConfig' => '', // Don't load CKEditor's config.js file.
       'pasteFromWordPromptCleanup' => TRUE,
+      'indentClasses' => array('indent1', 'indent2', 'indent3'),
+      'justifyClasses' => array($rtl ? 'align-right' : 'align-left', 'align-center', $rtl ? 'align-left' : 'align-right', 'align-justify'),
+      'coreStyles_underline' => array('element' => 'span', 'attributes' => array('class' => 'underline')),
       'removeDialogTabs' => 'image:Link;image:advanced;link:advanced',
       'resize_dir' => 'vertical',
       'keystrokes' =>  array(
@@ -83,6 +91,10 @@ public function getButtons() {
         'label' => t('Italic'),
         'image_alternative' => $button('italic'),
       ),
+      'Underline' => array(
+        'label' => t('Underline'),
+        'image_alternative' => $button('underline'),
+      ),
       'Strike' => array(
         'label' => t('Strike-through'),
         'image_alternative' => $button('strike'),
@@ -100,6 +112,23 @@ public function getButtons() {
         'label' => t('Remove format'),
         'image_alternative' => $button('remove format'),
       ),
+      // "justify" plugin.
+      'JustifyLeft' => array(
+        'label' => t('Align left'),
+        'image_alternative' => $button('justify left'),
+      ),
+      'JustifyCenter' => array(
+        'label' => t('Align center'),
+        'image_alternative' => $button('justify center'),
+      ),
+      'JustifyRight' => array(
+        'label' => t('Align right'),
+        'image_alternative' => $button('justify right'),
+      ),
+      'JustifyBlock' => array(
+        'label' => t('Justify'),
+        'image_alternative' => $button('justify block'),
+      ),
       // "list" plugin.
       'BulletedList' => array(
         'label' => t('Bullet list'),
diff --git a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php
index e4c0948..e009a6d 100644
--- a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php
+++ b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php
@@ -188,6 +188,7 @@ public function buildToolbarJSSetting(Editor $editor) {
   public function buildContentsCssJSSetting(Editor $editor) {
     $css = array(
       drupal_get_path('module', 'ckeditor') . '/css/ckeditor-iframe.css',
+      drupal_get_path('module', 'system') . '/system.base.css',
     );
     $css = array_merge($css, _ckeditor_theme_css());
     drupal_alter('ckeditor_css', $css, $editor);
diff --git a/core/modules/system/system.base-rtl.css b/core/modules/system/system.base-rtl.css
index d01792e..1bbddc2 100644
--- a/core/modules/system/system.base-rtl.css
+++ b/core/modules/system/system.base-rtl.css
@@ -53,3 +53,36 @@ div.tree-child-last {
   text-align: left;
 }
 
+/**
+ * Content display classes.
+ */
+.align-left {
+  text-align: right;
+}
+.align-right {
+  text-align: left;
+}
+.align-center {
+  text-align: center;
+}
+.align-justify {
+  text-align: justify;
+}
+img.align-left {
+  float: right;
+}
+img.align-right {
+  float: left;
+}
+.indent1 {
+  margin-left: 0;
+  margin-right: 2em;
+}
+.indent2 {
+  margin-left: 0;
+  margin-right: 4em;
+}
+.indent3 {
+  margin-left: 0;
+  margin-right: 6em;
+}
diff --git a/core/modules/system/system.base.css b/core/modules/system/system.base.css
index 233c6d7..5af62de 100644
--- a/core/modules/system/system.base.css
+++ b/core/modules/system/system.base.css
@@ -258,6 +258,37 @@ tr .ajax-progress-throbber .throbber {
 }
 
 /**
+ * Content display classes.
+ */
+.align-left {
+  text-align: left; /* LTR */
+}
+.align-right {
+  text-align: right; /* LTR */
+}
+.align-center {
+  text-align: center;
+}
+.align-justify {
+  text-align: justify;
+}
+.indent1 {
+  margin-left: 2em; /* LTR */
+  margin-right: 0; /* LTR */
+}
+.indent2 {
+  margin-left: 4em; /* LTR */
+  margin-right: 0; /* LTR */
+}
+.indent3 {
+  margin-left: 6em; /* LTR */
+  margin-right: 0; /* LTR */
+}
+.underline {
+  text-decoration: underline;
+}
+
+/**
  * Block-level HTML5 display definition.
  *
  * Provides display values for browsers that don't recognize the new elements
