diff --git a/core/modules/ckeditor/ckeditor.admin.inc b/core/modules/ckeditor/ckeditor.admin.inc
index 21be21d..ace8422 100644
--- a/core/modules/ckeditor/ckeditor.admin.inc
+++ b/core/modules/ckeditor/ckeditor.admin.inc
@@ -70,7 +70,7 @@ function template_preprocess_ckeditor_settings_toolbar(&$variables) {
     elseif (isset($button['image_alternative'])) {
       $value = $button['image_alternative'];
     }
-    elseif (isset($button['image'])) {
+    elseif (isset($button['image' . $rtl]) ) {
       $value = array(
         '#theme' => 'image',
         '#uri' => $button['image' . $rtl],
diff --git a/core/modules/ckeditor/css/ckeditor.admin.css b/core/modules/ckeditor/css/ckeditor.admin.css
index f8e9727..35f4bff 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/DrupalImage.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php
index 080c017..dfdbe82 100644
--- a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php
@@ -11,6 +11,7 @@
 use Drupal\ckeditor\CKEditorPluginConfigurableInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\editor\Entity\Editor;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Defines the "drupalimage" plugin.
@@ -53,10 +54,12 @@ public function getConfig(Editor $editor) {
    * {@inheritdoc}
    */
   public function getButtons() {
+    $language_interface = \Drupal::languageManager()->getCurrentLanguage();
+    $rtl = $language_interface->getDirection() === LanguageInterface::DIRECTION_RTL ? '_rtl' : '';
     return array(
       'DrupalImage' => array(
         'label' => t('Image'),
-        'image' => drupal_get_path('module', 'ckeditor') . '/js/plugins/drupalimage/image.png',
+        'image' . $rtl => drupal_get_path('module', 'ckeditor') . '/js/plugins/drupalimage/image.png',
       ),
     );
   }
diff --git a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalLink.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalLink.php
index dbfc07f..07613cc 100644
--- a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalLink.php
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalLink.php
@@ -9,6 +9,7 @@
 
 use Drupal\ckeditor\CKEditorPluginBase;
 use Drupal\editor\Entity\Editor;
+use Drupal\Core\Language\LanguageInterface;
 
 /**
  * Defines the "drupallink" plugin.
@@ -52,14 +53,16 @@ public function getConfig(Editor $editor) {
    */
   public function getButtons() {
     $path = drupal_get_path('module', 'ckeditor') . '/js/plugins/drupallink';
+    $language_interface = \Drupal::languageManager()->getCurrentLanguage();
+    $rtl = $language_interface->getDirection() === LanguageInterface::DIRECTION_RTL ? '_rtl' : '';
     return array(
       'DrupalLink' => array(
         'label' => t('Link'),
-        'image' => $path . '/link.png',
+        'image' . $rtl => $path . '/link.png',
       ),
       'DrupalUnlink' => array(
         'label' => t('Unlink'),
-        'image' => $path . '/unlink.png',
+        'image' . $rtl => $path . '/unlink.png',
       ),
     );
   }
diff --git a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
index 2e469da..e447ee0 100644
--- a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
+++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/Internal.php
@@ -146,48 +146,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(
@@ -226,11 +237,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(
@@ -264,6 +277,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'),
@@ -279,6 +293,7 @@ public function getButtons() {
       'Table' => array(
         'label' => t('Table'),
         'image_alternative' => $button('table'),
+        'image_alternative_rtl' => $button('table', 'rtl'),
       ),
       // "showblocks" plugin.
       'ShowBlocks' => array(
@@ -290,11 +305,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..0ff7aaf
--- /dev/null
+++ b/core/modules/ckeditor/src/Tests/CKEditorToolbarButtonTest.php
@@ -0,0 +1,81 @@
+<?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
+ * @package Drupal\ckeditor\Tests
+ */
+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);
+  }
+}
