diff --git a/core/modules/locale/locale.admin.inc b/core/modules/locale/locale.admin.inc
index 2c78e17..ff20d56 100644
--- a/core/modules/locale/locale.admin.inc
+++ b/core/modules/locale/locale.admin.inc
@@ -330,6 +330,19 @@ function language_negotiation_configure_url_form_validate($form, &$form_state) {
       form_error($form['domain'][$langcode], t('The domain for %language, %value, is not unique.', array('%language' => $language->name, '%value' => $value)));
     }
   }
+
+  // Domain names should not contain protocol and/or ports.
+  foreach ($languages as $langcode => $name) {
+    $value = $form_state['values']['domain'][$langcode];
+    if (!empty($value)) {
+      // Ensure we have a protocol but only one protocol in the setting for
+      // parse_url() checking against the hostname.
+      $host = 'http://' . str_replace(array('http://', 'https://'), '', $value);
+      if (parse_url($host, PHP_URL_HOST) != $value) {
+        form_error($form['domain'][$langcode], t('The domain for %language may only contain the domain name, not a protocol and/or port.', array( '%language' => $name)));
+      }
+    }
+  }
 }
 
 /**
diff --git a/core/modules/locale/locale.install b/core/modules/locale/locale.install
index d3f0152..eb11e4f 100644
--- a/core/modules/locale/locale.install
+++ b/core/modules/locale/locale.install
@@ -317,6 +317,38 @@ function locale_update_8002() {
 }
 
 /**
+ * Converts language domains to new format.
+ */
+function locale_update_8003() {
+  $message = '';
+  $domains = variable_get('locale_language_negotiation_url_domains', array());
+  // $used_domains keeps track of the domain names in use.
+  $used_domains = array();
+  foreach ($domains as $langcode => $domain) {
+    // Domain names can not contain protocol and/or ports.
+    if (!empty($domain)) {
+      $host = 'http://' . str_replace(array('http://', 'https://'), '', $domain);
+      if (parse_url($host, PHP_URL_HOST) != $domain) {
+        $domains[$langcode] = parse_url($host, PHP_URL_HOST);
+      }
+      if (array_key_exists($domain, $used_domains)) {
+        if (empty($message)) {
+          $message = 'Some languages are using the same domain name, you should change these domain names at ' . l('URL language detection configuration', 'admin/config/regional/language/configure/url' . '.');
+        }
+      }
+      else {
+        $used_domains[$domain] = $domain;
+      }
+    }
+  }
+  variable_set('locale_language_negotiation_url_domains', $domains);
+
+  if (!empty($message)) {
+    return $message;
+  }
+}
+
+/**
  * @} End of "addtogroup updates-7.x-to-8.x"
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/locale/locale.test b/core/modules/locale/locale.test
index 7d1e55c..4c58e91 100644
--- a/core/modules/locale/locale.test
+++ b/core/modules/locale/locale.test
@@ -2280,8 +2280,8 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
     $this->assertResponse(404, "Unknown language path prefix should return 404");
 
     // Setup for domain negotiation, first configure the language to have domain
-    // URL. We use https and a port to make sure that only the domain name is used.
-    $edit = array("domain[$langcode]" => "https://$language_domain:99");
+    // URL.
+    $edit = array("domain[$langcode]" => $language_domain);
     $this->drupalPost("admin/config/regional/language/detection/url", $edit, t('Save configuration'));
     // Set the site to use domain language negotiation.
 
diff --git a/core/modules/simpletest/tests/upgrade/upgrade.language.test b/core/modules/simpletest/tests/upgrade/upgrade.language.test
index 0dbbf2e..9edf03a 100644
--- a/core/modules/simpletest/tests/upgrade/upgrade.language.test
+++ b/core/modules/simpletest/tests/upgrade/upgrade.language.test
@@ -97,4 +97,18 @@ class LanguageUpgradePathTestCase extends UpgradePathTestCase {
     $file = db_query('SELECT * FROM {file_managed} WHERE fid = :fid', array(':fid' => 1))->fetchObject();
     $this->assertEqual($file->langcode, LANGUAGE_NONE);
   }
+
+  /**
+   * Tests language domain upgrade path.
+   */
+  public function testLanguageUrlUpgrade() {
+    $language_domain = 'ca.example.com';
+    db_update('languages')->fields(array('domain' => 'http://' . $language_domain . ':8888'))->condition('language', 'ca')->execute();
+    variable_set('locale_language_negotiation_url_part', 1);
+
+    $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));
+
+    $domains = locale_language_negotiation_url_domains();
+    $this->assertTrue($domains['ca'] == $language_domain, t('Language domain for Catalan properly upgraded.'));
+  }
 }
