diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 6a17f73..728100d 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -431,17 +431,7 @@ function language_save($language) {
   $language_entity->direction = isset($language->direction) ? $language->direction : '0';
   $language_entity->locked = !empty($language->locked);
   $language_entity->weight = isset($language->weight) ? $language->weight : 0;
-
-  // Save the record and inform others about the change.
-  $multilingual = \Drupal::languageManager()->isMultilingual();
   $language_entity->save();
-  $t_args = array('%language' => $language->name, '%langcode' => $language->id);
-  if ($language->is_new) {
-    watchdog('language', 'The %language (%langcode) language has been created.', $t_args);
-  }
-  else {
-    watchdog('language', 'The %language (%langcode) language has been updated.', $t_args);
-  }
 
   if (!empty($language->default)) {
     // Update the config. Saving the configuration fires and event that causes
@@ -450,21 +440,12 @@ function language_save($language) {
     \Drupal::service('language.default')->set($language);
   }
 
-  $language_manager = \Drupal::languageManager();
-  $language_manager->reset();
-  if ($language_manager instanceof ConfigurableLanguageManagerInterface) {
-    $language_manager->updateLockedLanguageWeights();
+  $t_args = array('%language' => $language->name, '%langcode' => $language->id);
+  if ($language->is_new) {
+    watchdog('language', 'The %language (%langcode) language has been created.', $t_args);
   }
-
-  // Update URL Prefixes for all languages after the new default language is
-  // propagated and the LanguageManagerInterface::getLanguages() cache is
-  // flushed.
-  language_negotiation_url_prefixes_update();
-
-  // If after adding this language the site will become multilingual, we need to
-  // rebuild language services.
-  if (!$multilingual && $language->is_new) {
-    ConfigurableLanguageManager::rebuildServices();
+  else {
+    watchdog('language', 'The %language (%langcode) language has been updated.', $t_args);
   }
 
   return $language;
diff --git a/core/modules/language/lib/Drupal/language/Entity/Language.php b/core/modules/language/lib/Drupal/language/Entity/Language.php
index 77015cd..dcb99b7 100644
--- a/core/modules/language/lib/Drupal/language/Entity/Language.php
+++ b/core/modules/language/lib/Drupal/language/Entity/Language.php
@@ -9,6 +9,8 @@
 
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\language\ConfigurableLanguageManager;
+use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\language\Exception\DeleteDefaultLanguageException;
 use Drupal\language\LanguageInterface;
 
@@ -78,10 +80,21 @@ class Language extends ConfigEntityBase implements LanguageInterface {
   public $locked = FALSE;
 
   /**
+   * Used to detect when the site becomes multilingual.
+   *
+   * @var bool
+   */
+  protected $preSaveMultilingual;
+
+  /**
    * {@inheritdoc}
    */
   public function preSave(EntityStorageInterface $storage) {
     parent::preSave($storage);
+    // Store whether or not the site is already multilingual so that we can
+    // rebuild services if necessary during
+    // \Drupal\language\Entity\Language::postSave().
+    $this->preSaveMultilingual = \Drupal::languageManager()->isMultilingual();
     // Languages are picked from a predefined list which is given in English.
     // For the uncommon case of custom languages the label should be given in
     // English.
@@ -90,6 +103,30 @@ public function preSave(EntityStorageInterface $storage) {
 
   /**
    * {@inheritdoc}
+   */
+  public function postSave(EntityStorageInterface $storage, $update = TRUE) {
+    parent::postSave($storage, $update);
+
+    $language_manager = \Drupal::languageManager();
+    $language_manager->reset();
+    if ($language_manager instanceof ConfigurableLanguageManagerInterface) {
+      $language_manager->updateLockedLanguageWeights();
+    }
+
+    // Update URL Prefixes for all languages after the new default language is
+    // propagated and the LanguageManagerInterface::getLanguages() cache is
+    // flushed.
+    language_negotiation_url_prefixes_update();
+
+    // If after adding this language the site will become multilingual, we need
+    // to rebuild language services.
+    if (!$this->preSaveMultilingual && !$update) {
+      ConfigurableLanguageManager::rebuildServices();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
    *
    * @throws \RuntimeException
    */
