diff --git a/core/modules/ckeditor/ckeditor.admin.inc b/core/modules/ckeditor/ckeditor.admin.inc
index 21be21d..2a5a6b2 100644
--- a/core/modules/ckeditor/ckeditor.admin.inc
+++ b/core/modules/ckeditor/ckeditor.admin.inc
@@ -70,10 +70,10 @@ function template_preprocess_ckeditor_settings_toolbar(&$variables) {
     elseif (isset($button['image_alternative'])) {
       $value = $button['image_alternative'];
     }
-    elseif (isset($button['image'])) {
+    elseif (isset($button['image']) || isset($button['image' . $rtl])) {
       $value = array(
         '#theme' => 'image',
-        '#uri' => $button['image' . $rtl],
+        '#uri' => isset($button['image' . $rtl]) ? $button['image' . $rtl] : $button['image'],
         '#title' => $button['label'],
         '#prefix' => '<a href="#" role="button" title="' . $button['label'] . '" aria-label="' . $button['label'] . '"><span class="cke_button_icon">',
         '#suffix' => '</span></a>',
diff --git a/core/modules/ckeditor/css/ckeditor.admin.css b/core/modules/ckeditor/css/ckeditor.admin.css
index f8e9727..d318737 100644
--- a/core/modules/ckeditor/css/ckeditor.admin.css
+++ b/core/modules/ckeditor/css/ckeditor.admin.css
@@ -182,11 +182,16 @@
 .ckeditor-buttons li .cke-icon-only {
   text-indent: -9999px;
   width: 16px;
-  direction: ltr;
   /* Firefox includes the offscreen text in the focus indicator, resulting in a
      far too wide focus indicator. This fixes that. */
   overflow: hidden;
 }
+.ckeditor-buttons li .cke_ltr {
+  direction: ltr;
+}
+.ckeditor-buttons li .cke_rtl {
+  direction: rtl;
+}
 .ckeditor-buttons li a:focus,
 .ckeditor-buttons li a:active,
 .ckeditor-multiple-buttons li a:focus {
diff --git a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
index 4959625..7b4afcd 100644
--- a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
@@ -149,48 +149,59 @@ public function getButtons() {
       'Bold' => array(
         'label' => t('Bold'),
         'image_alternative' => $button('bold'),
+        'image_alternative_rtl' => $button('bold', 'rtl'),
       ),
       'Italic' => array(
         'label' => t('Italic'),
         'image_alternative' => $button('italic'),
+        'image_alternative_rtl' => $button('italic', 'rtl'),
       ),
       'Underline' => array(
         'label' => t('Underline'),
         'image_alternative' => $button('underline'),
+        'image_alternative_rtl' => $button('underline', 'rtl'),
       ),
       'Strike' => array(
         'label' => t('Strike-through'),
         'image_alternative' => $button('strike'),
+        'image_alternative_rtl' => $button('strike', 'rtl'),
       ),
       'Superscript' => array(
         'label' => t('Superscript'),
         'image_alternative' => $button('super script'),
+        'image_alternative_rtl' => $button('super script', 'rtl'),
       ),
       'Subscript' => array(
         'label' => t('Subscript'),
         'image_alternative' => $button('sub script'),
+        'image_alternative_rtl' => $button('sub script', 'rtl'),
       ),
       // "removeformat" plugin.
       'RemoveFormat' => array(
         'label' => t('Remove format'),
         'image_alternative' => $button('remove format'),
+        'image_alternative_rtl' => $button('remove format', 'rtl'),
       ),
       // "justify" plugin.
       'JustifyLeft' => array(
         'label' => t('Align left'),
         'image_alternative' => $button('justify left'),
+        'image_alternative_rtl' => $button('justify left', 'rtl'),
       ),
       'JustifyCenter' => array(
         'label' => t('Align center'),
         'image_alternative' => $button('justify center'),
+        'image_alternative_rtl' => $button('justify center', 'rtl'),
       ),
       'JustifyRight' => array(
         'label' => t('Align right'),
         'image_alternative' => $button('justify right'),
+        'image_alternative_rtl' => $button('justify right', 'rtl'),
       ),
       'JustifyBlock' => array(
         'label' => t('Justify'),
         'image_alternative' => $button('justify block'),
+        'image_alternative_rtl' => $button('justify block', 'rtl'),
       ),
       // "list" plugin.
       'BulletedList' => array(
@@ -229,11 +240,13 @@ public function getButtons() {
       'Blockquote' => array(
         'label' => t('Blockquote'),
         'image_alternative' => $button('blockquote'),
+        'image_alternative_rtl' => $button('blockquote', 'rtl'),
       ),
       // "horizontalrule" plugin
       'HorizontalRule' => array(
         'label' => t('Horizontal rule'),
         'image_alternative' => $button('horizontal rule'),
+        'image_alternative_rtl' => $button('horizontal rule', 'rtl'),
       ),
       // "clipboard" plugin.
       'Cut' => array(
@@ -267,6 +280,7 @@ public function getButtons() {
       'SpecialChar' => array(
         'label' => t('Character map'),
         'image_alternative' => $button('special char'),
+        'image_alternative_rtl' => $button('special char', 'rtl'),
       ),
       'Format' => array(
         'label' => t('HTML block format'),
@@ -282,6 +296,7 @@ public function getButtons() {
       'Table' => array(
         'label' => t('Table'),
         'image_alternative' => $button('table'),
+        'image_alternative_rtl' => $button('table', 'rtl'),
       ),
       // "showblocks" plugin.
       'ShowBlocks' => array(
@@ -293,11 +308,13 @@ public function getButtons() {
       'Source' => array(
         'label' => t('Source code'),
         'image_alternative' => $button('source'),
+        'image_alternative_rtl' => $button('source', 'rtl'),
       ),
       // "maximize" plugin.
       'Maximize' => array(
         'label' => t('Maximize'),
         'image_alternative' => $button('maximize'),
+        'image_alternative_rtl' => $button('maximize', 'rtl'),
       ),
       // No plugin, separator "button" for toolbar builder UI use only.
       '-' => array(
diff --git a/core/modules/ckeditor/src/Tests/CKEditorToolbarButtonTest.php b/core/modules/ckeditor/src/Tests/CKEditorToolbarButtonTest.php
new file mode 100644
index 0000000..5751f86
--- /dev/null
+++ b/core/modules/ckeditor/src/Tests/CKEditorToolbarButtonTest.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\ckeditor\Tests\CKEditorToolbarButtonTest.
+ */
+
+namespace Drupal\ckeditor\Tests;
+
+
+use Drupal\filter\Entity\FilterFormat;
+use Drupal\editor\Entity\Editor;
+use Drupal\simpletest\WebTestBase;
+use Drupal\Component\Serialization\Json;
+
+/**
+ * Tests CKEditor toolbar buttons when the language direction is RTL.
+ *
+ * @group ckeditor
+ */
+class CKEditorToolbarButtonTest extends WebTestBase {
+
+  /**
+   * Modules to enable for this test.
+   *
+   * @var array
+   */
+  public static $modules = ['filter', 'editor', 'ckeditor', 'locale'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create a text format and associate this with CKEditor.
+    FilterFormat::create([
+      'format' => 'full_html',
+      'name' => 'Full HTML',
+      'weight' => 1,
+      'filters' => [],
+    ])->save();
+    Editor::create([
+      'format' => 'full_html',
+      'editor' => 'ckeditor',
+    ])->save();
+
+    // Create a new user with admin rights.
+    $this->admin_user = $this->drupalCreateUser([
+      'administer languages',
+      'access administration pages',
+      'administer site configuration',
+      'administer filters',
+    ]);
+  }
+
+  /**
+   * Method tests CKEditor image buttons.
+   */
+  public function testImageButtonDisplay() {
+    global $base_url;
+    $this->drupalLogin($this->admin_user);
+
+    // Install the Arabic language (which is RTL) and configure as the default.
+    $edit = [];
+    $edit['predefined_langcode'] = 'ar';
+    $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language'));
+
+    $edit = ['site_default_language' => 'ar'];
+    $this->drupalPostForm('admin/config/regional/language', $edit, t('Save configuration'));
+    // Once the default language is changed, go to the tested text format
+    // configuration page.
+    $this->drupalGet('admin/config/content/formats/manage/full_html');
+
+    // Check if any image button is loaded in CKEditor json.
+    $json_encode = function($html) {
+      return trim(Json::encode($html), '"');
+    };
+    $markup = $json_encode($base_url . '/core/modules/ckeditor/js/plugins/drupalimage/image.png');
+    $this->assertRaw($markup);
+  }
+
+}
