diff --git a/tmgmt_microsoft.plugin.inc b/tmgmt_microsoft.plugin.inc
index f26db25..ebcfaf6 100644
--- a/tmgmt_microsoft.plugin.inc
+++ b/tmgmt_microsoft.plugin.inc
@@ -72,11 +72,12 @@ class TMGMTMicrosoftTranslatorPluginController extends TMGMTDefaultTranslatorPlu
     // Pull the source data array through the job and flatten it.
     $data = array_filter(tmgmt_flatten_data($job->getData()), '_tmgmt_filter_data');
     $translation = array();
+    $translator = $job->getTranslator();
     foreach ($data as $key => $value) {
       // Query the translator API.
       $result = $this->doRequest($job->getTranslator(), 'Translate', array(
-        'from' => $job->source_language,
-        'to' => $job->target_language,
+        'from' => $translator->mapToRemoteLanguage($job->source_language),
+        'to' => $translator->mapToRemoteLanguage($job->target_language),
         'contentType' => 'text/plain',
         'text' => $value['#text'],
       ), array(
@@ -110,9 +111,9 @@ class TMGMTMicrosoftTranslatorPluginController extends TMGMTDefaultTranslatorPlu
   }
 
   /**
-   * Overrides TMGMTDefaultTranslatorPluginController::getSupportedTargetLanguages().
+   * Overrides TMGMTDefaultTranslatorPluginController::getSupportedRemoteLanguages().
    */
-  public function getSupportedTargetLanguages(TMGMTTranslator $translator, $source_language) {
+  public function getSupportedRemoteLanguages(TMGMTTranslator $translator) {
     $languages = array();
     $request = $this->doRequest($translator, 'GetLanguagesForTranslate');
     if ($request->code == 200) {
@@ -122,21 +123,39 @@ class TMGMTMicrosoftTranslatorPluginController extends TMGMTDefaultTranslatorPlu
         $languages[$item->nodeValue] = $item->nodeValue;
       }
     }
-    // Microsoft translator reports chinese language codes with their old names.
-    // Replace them with the offical identifiers.
-    if (isset($languages['zh-CHS'])) {
-      unset($languages['zh-CHS']);
-      $languages['zh-hans'] = 'zh-hans';
-    }
-    if (isset($languages['zh-CHT'])) {
-      unset($languages['zh-CHT']);
-      $languages['zh-hant'] = 'zh-hant';
+
+    return $languages;
+  }
+
+  /**
+   * Overrides TMGMTDefaultTranslatorPluginController::getDefaultRemoteLanguagesMappings().
+   */
+  public function getDefaultRemoteLanguagesMappings() {
+    return array(
+      'zh-hans' => 'zh-CHS',
+      'zh-hant' => 'zh-CHT',
+    );
+  }
+
+  /**
+   * Overrides TMGMTDefaultTranslatorPluginController::getSupportedTargetLanguages().
+   */
+  public function getSupportedTargetLanguages(TMGMTTranslator $translator, $source_language) {
+
+    $remote_languages = $this->getSupportedRemoteLanguages($translator);
+    $languages = array();
+
+    foreach ($remote_languages as $remote_language) {
+      $local_language = $translator->mapToLocalLanguage($remote_language);
+      $languages[$local_language] = $local_language;
     }
+
     // Check if the source language is available.
     if (array_key_exists($source_language, $languages)) {
       unset($languages[$source_language]);
       return $languages;
     }
+
     return array();
   }
 
