diff --git a/plugin/tmgmt.ui.translator.inc b/plugin/tmgmt.ui.translator.inc
index 15578d2..ce521c1 100644
--- a/plugin/tmgmt.ui.translator.inc
+++ b/plugin/tmgmt.ui.translator.inc
@@ -16,9 +16,17 @@ class TMGMTDefaultTranslatorUIController extends TMGMTPluginBase implements TMGM
       $controller = tmgmt_translator_plugin_controller($translator->plugin);
     }
 
-    // If current translator is configured to provide remote language mapping
-    // provide the form to configure mappings, unless it does not exists yet.
-    if (!empty($controller) && tmgmt_provide_remote_languages_mappings($translator)) {
+    // We have supported remote languages therefore we can display the config
+    // form for languages mappings.
+    if (tmgmt_provide_remote_languages_mappings($translator) && !empty($controller)) {
+
+      // Load the supported remote languages.
+      $supported_remote_languages = array();
+      if (!empty($controller)) {
+        $supported_remote_languages = $controller->getSupportedRemoteLanguages($translator);
+      }
+
+      $form_state['supported_remote_languages'] = $supported_remote_languages;
 
       $form['remote_languages_mappings'] = array(
         '#tree' => TRUE,
@@ -29,26 +37,46 @@ class TMGMTDefaultTranslatorUIController extends TMGMTPluginBase implements TMGM
         '#collapsed' => TRUE,
       );
 
-      $options = array();
-      foreach ($controller->getSupportedRemoteLanguages($translator) as $language) {
+      $options = array(LANGUAGE_NONE => '(' . t('Undefined') . ')');
+      $non_configured = array();
+      foreach ($supported_remote_languages as $language) {
         $options[$language] = $language;
       }
 
       foreach ($controller->getRemoteLanguagesMappings($translator) as $local_language => $remote_language) {
+
+        // Check if the remote language is among supported remote languages and
+        // if not select the "und" option and add it to the non configured
+        // languages.
+        $default = $remote_language;
+        if (empty($remote_language) || !isset($options[$remote_language]) || $remote_language == LANGUAGE_NONE) {
+          $non_configured[$local_language] = $local_language;
+          $default = LANGUAGE_NONE;
+        }
+
         $form['remote_languages_mappings'][$local_language] = array(
-          '#type' => 'textfield',
+          '#type' => 'select',
           '#title' => tmgmt_language_label($local_language) . ' (' . $local_language . ')',
-          '#default_value' => $remote_language,
-          '#size' => 6,
+          '#default_value' => $default,
+          '#options' => $options,
+          '#element_validate' => array('tmgmt_ui_remote_mappings_validate'),
         );
 
-        if (!empty($options)) {
-          $form['remote_languages_mappings'][$local_language]['#type'] = 'select';
-          $form['remote_languages_mappings'][$local_language]['#options'] = $options;
-          $form['remote_languages_mappings'][$local_language]['#empty_option'] = ' - ';
-          unset($form['remote_languages_mappings'][$local_language]['#size']);
+        // In case we do not have any remote languages output a textfield
+        // instead of the select.
+        if (empty($supported_remote_languages)) {
+          $form['remote_languages_mappings'][$local_language]['#type'] = 'textfield';
+          $form['remote_languages_mappings'][$local_language]['#size'] = 6;
         }
       }
+
+      if (!empty($non_configured)) {
+        $form['remote_languages_mappings']['#collapsed'] = FALSE;
+        drupal_set_message(format_plural(count($non_configured),
+          'Local language %list does not have target language and thus cannot be used for translation.',
+          'Local languages %list do not have target language and thus cannot be used for translation.',
+          array('%list' => implode(', ', $non_configured))), 'warning');
+      }
     }
 
     if (!element_children($form)) {
diff --git a/tests/tmgmt_test.plugin.translator.inc b/tests/tmgmt_test.plugin.translator.inc
index ab21147..dfb5ac4 100644
--- a/tests/tmgmt_test.plugin.translator.inc
+++ b/tests/tmgmt_test.plugin.translator.inc
@@ -105,4 +105,11 @@ class TMGMTTestTranslatorPluginController extends TMGMTDefaultTranslatorPluginCo
   public function rejectForm($form, &$form_state) {
     return $form;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSupportedRemoteLanguages(TMGMTTranslator $translator) {
+    return variable_get('tmgmt_test_supported_remote_languages', array());
+  }
 }
diff --git a/ui/tmgmt_ui.module b/ui/tmgmt_ui.module
index 5dd392c..80fa259 100644
--- a/ui/tmgmt_ui.module
+++ b/ui/tmgmt_ui.module
@@ -1193,3 +1193,31 @@ function tmgmt_ui_help($path, $arg) {
 
   return $output;
 }
+
+/**
+ * Remote languages mappings form validator.
+ *
+ * @see TMGMTDefaultTranslatorUIController::pluginSettingsForm().
+ */
+function tmgmt_ui_remote_mappings_validate($element, &$form_state, $form) {
+  $duplicates = array();
+
+  foreach ($form_state['values']['settings']['remote_languages_mappings'] as $remote_language) {
+    // Keep track of remote languages assigned to multiple local languages.
+    if (array_key_exists($remote_language, $duplicates) && $remote_language != LANGUAGE_NONE) {
+      $duplicates[$remote_language] = $remote_language;
+    }
+    else {
+      $duplicates[$remote_language] = NULL;
+    }
+  }
+
+  $duplicates = array_filter($duplicates);
+  if (!empty($duplicates)) {
+    form_set_error('settings][remote_languages_mappings', format_plural(count($duplicates),
+      'Remote language %list is assigned to more than one local language.',
+      'Remote languages %list are assigned to more than one local language.',
+      array('%list' => implode(', ', $duplicates)))
+    );
+  }
+}
diff --git a/ui/tmgmt_ui.test b/ui/tmgmt_ui.test
index 7b6528b..e0c781a 100644
--- a/ui/tmgmt_ui.test
+++ b/ui/tmgmt_ui.test
@@ -628,4 +628,59 @@ class TMGMTUITestCase extends TMGMTBaseTestCase {
     $this->assertNoText($node_sk->title);
   }
 
+  /**
+   * Test the translator language mapping settings form part.
+   */
+  function testLanguageMappingSettingsUi() {
+    $this->loginAsAdmin();
+
+    // The initial state when no supported remote languages are provided.
+    $this->drupalGet('admin/config/regional/tmgmt_translator/manage/test_translator');
+    $this->assertFieldByName('settings[remote_languages_mappings][en]', LANGUAGE_NONE);
+    $this->assertFieldByName('settings[remote_languages_mappings][de]', LANGUAGE_NONE);
+    $this->assertFieldByName('settings[remote_languages_mappings][el]', LANGUAGE_NONE);
+    $this->assertFieldByName('settings[remote_languages_mappings][es]', LANGUAGE_NONE);
+
+    // Set supported remote languages that need to correspond with the result
+    // of getDefaultRemoteLanguagesMappings().
+    variable_set('tmgmt_test_supported_remote_languages', array('en-us', 'de-ch', 'el'));
+    $this->drupalGet('admin/config/regional/tmgmt_translator/manage/test_translator');
+
+    // Test if the values have been preselected correctly in the initial state.
+    $this->assertFieldByName('settings[remote_languages_mappings][en]', 'en-us');
+    $this->assertFieldByName('settings[remote_languages_mappings][de]', 'de-ch');
+    $this->assertFieldByName('settings[remote_languages_mappings][el]', 'el');
+    $this->assertFieldByName('settings[remote_languages_mappings][es]', LANGUAGE_NONE);
+
+    // As "es" language has no target language we should get the warning msg.
+    $this->assertRaw(t('Local language %list does not have target language and thus cannot be used for translation.', array('%list' => 'es')));
+
+    // Save the settings form with having "el" language selected for two local
+    // languages. It must trigger an validation error.
+    $this->drupalPost(NULL, array('settings[remote_languages_mappings][es]' => 'el'), t('Save translator'));
+    $this->assertRaw(t('Remote language %list is assigned to more than one local language.', array('%list' => 'el')));
+
+    // Save the mappings and test if saved correctly.
+    $this->drupalPost(NULL, array('settings[remote_languages_mappings][es]' => LANGUAGE_NONE), t('Save translator'));
+    entity_get_controller('tmgmt_translator')->resetCache();
+    $translator = tmgmt_translator_load('test_translator');
+    $this->assertEqual($translator->getSetting('remote_languages_mappings'), array (
+      'en' => 'en-us',
+      'de' => 'de-ch',
+      'el' => 'el',
+      'es' => 'und',
+    ));
+
+    // Simulate a change of the supported remote language list.
+    variable_set('tmgmt_test_supported_remote_languages', array('en-us', 'de-ch', 'es'));
+    $this->drupalGet('admin/config/regional/tmgmt_translator/manage/test_translator');
+    // The "el" language disappeared and is now not configured. The "es"
+    // language appeared but is still considered as not configured.
+    $this->assertRaw(t('Local languages %list do not have target language and thus cannot be used for translation.', array('%list' => 'el, es')));
+    $this->assertFieldByName('settings[remote_languages_mappings][en]', 'en-us');
+    $this->assertFieldByName('settings[remote_languages_mappings][de]', 'de-ch');
+    $this->assertFieldByName('settings[remote_languages_mappings][el]', LANGUAGE_NONE);
+    $this->assertFieldByName('settings[remote_languages_mappings][es]', LANGUAGE_NONE);
+  }
+
 }
