Index: Application/Shell/ShellProtocol.c
===================================================================
--- Application/Shell/ShellProtocol.c	(revision 14608)
+++ Application/Shell/ShellProtocol.c	(working copy)
@@ -645,8 +645,6 @@
   UINTN                             LoopVar;
   CHAR16                            *DeviceNameToReturn;
   CHAR8                             *Lang;
-  CHAR8                             *TempChar;
-
   UINTN                             ParentControllerCount;
   EFI_HANDLE                        *ParentControllerBuffer;
   UINTN                             ParentDriverCount;
@@ -703,23 +701,7 @@
       if (EFI_ERROR(Status)) {
         continue;
       }
-      if (Language == NULL) {
-        Lang = AllocateZeroPool(AsciiStrSize(CompName2->SupportedLanguages));
-        if (Lang == NULL) {
-          return (EFI_OUT_OF_RESOURCES);
-        }
-        AsciiStrCpy(Lang, CompName2->SupportedLanguages);
-        TempChar = AsciiStrStr(Lang, ";");
-        if (TempChar != NULL){
-          *TempChar = CHAR_NULL;
-        }
-      } else {
-        Lang = AllocateZeroPool(AsciiStrSize(Language));
-        if (Lang == NULL) {
-          return (EFI_OUT_OF_RESOURCES);
-        }
-        AsciiStrCpy(Lang, Language);
-      }
+      Lang = GetBestLanguageForDriver(CompName2->SupportedLanguages, Language, FALSE);
       Status = CompName2->GetControllerName(CompName2, DeviceHandle, NULL, Lang, &DeviceNameToReturn);
       FreePool(Lang);
       Lang = NULL;
@@ -762,23 +744,7 @@
           if (EFI_ERROR(Status)) {
             continue;
           }
-          if (Language == NULL) {
-            Lang = AllocateZeroPool(AsciiStrSize(CompName2->SupportedLanguages));
-            if (Lang == NULL) {
-              return (EFI_OUT_OF_RESOURCES);
-            }
-            AsciiStrCpy(Lang, CompName2->SupportedLanguages);
-            TempChar = AsciiStrStr(Lang, ";");
-            if (TempChar != NULL){
-              *TempChar = CHAR_NULL;
-            }
-          } else {
-            Lang = AllocateZeroPool(AsciiStrSize(Language));
-            if (Lang == NULL) {
-              return (EFI_OUT_OF_RESOURCES);
-            }
-            AsciiStrCpy(Lang, Language);
-          }
+          Lang = GetBestLanguageForDriver(CompName2->SupportedLanguages, Language, FALSE);
           Status = CompName2->GetControllerName(CompName2, ParentControllerBuffer[LoopVar], DeviceHandle, Lang, &DeviceNameToReturn);
           FreePool(Lang);
           Lang = NULL;
Index: Include/Library/HandleParsingLib.h
===================================================================
--- Include/Library/HandleParsingLib.h	(revision 14608)
+++ Include/Library/HandleParsingLib.h	(working copy)
@@ -95,6 +95,27 @@
   IN CONST CHAR8      *Language
   );
 
+/**
+  Get best support language for this driver.
+  
+  First base on the user input language  to search, second base on the current 
+  platform used language to search, third get the first language from the 
+  support language list. The caller need to free the buffer of the best language.
+
+  @param[in] SupportedLanguages      The support languages for this driver.
+  @param[in] InputLanguage           The user input language.
+  @param[in] Iso639Language          Whether get language for ISO639.
+
+  @return                            The best support language for this driver.
+**/
+CHAR8 *
+EFIAPI
+GetBestLanguageForDriver (
+  IN CONST CHAR8  *SupportedLanguages,
+  IN CONST CHAR8  *InputLanguage,
+  IN BOOLEAN      Iso639Language
+  );
+
 #define HR_UNKNOWN                     0
 #define HR_IMAGE_HANDLE                BIT1
 #define HR_DRIVER_BINDING_HANDLE       BIT2 // has driver binding
Index: Library/UefiDpLib/DpUtilities.c
===================================================================
--- Library/UefiDpLib/DpUtilities.c	(revision 14608)
+++ Library/UefiDpLib/DpUtilities.c	(working copy)
@@ -23,6 +23,7 @@
 #include <Library/PcdLib.h>
 #include <Library/UefiLib.h>
 #include <Library/DevicePathLib.h>
+#include <Library/HandleParsingLib.h>
 
 #include <Pi/PiFirmwareFile.h>
 #include <Library/DxeServicesLib.h>
@@ -252,7 +253,7 @@
     //
     // Get the current platform language setting
     //
-    GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&PlatformLanguage, NULL);
+    PlatformLanguage = GetBestLanguageForDriver(ComponentName2->SupportedLanguages, NULL, FALSE);
     Status = ComponentName2->GetDriverName (
                                ComponentName2,
                                PlatformLanguage != NULL ? PlatformLanguage : "en-US",
Index: Library/UefiHandleParsingLib/UefiHandleParsingLib.c
===================================================================
--- Library/UefiHandleParsingLib/UefiHandleParsingLib.c	(revision 14608)
+++ Library/UefiHandleParsingLib/UefiHandleParsingLib.c	(working copy)
@@ -778,18 +778,21 @@
 /**
   Get best support language for this driver.
   
-  First base on the current platform used language to search,Second base on the 
-  default language to search. The caller need to free the buffer of the best 
-  language.
+  First base on the user input language  to search, second base on the current 
+  platform used language to search, third get the first language from the 
+  support language list. The caller need to free the buffer of the best language.
 
   @param[in] SupportedLanguages      The support languages for this driver.
+  @param[in] InputLanguage           The user input language.
   @param[in] Iso639Language          Whether get language for ISO639.
 
   @return                            The best support language for this driver.
 **/
 CHAR8 *
+EFIAPI
 GetBestLanguageForDriver (
-  IN CONST CHAR8  *SupportedLanguages, 
+  IN CONST CHAR8  *SupportedLanguages,
+  IN CONST CHAR8  *InputLanguage,
   IN BOOLEAN      Iso639Language
   )
 {
@@ -801,8 +804,9 @@
   BestLanguage = GetBestLanguage(
                    SupportedLanguages,
                    Iso639Language,
+                   (InputLanguage != NULL) ? InputLanguage : "",
                    (LanguageVariable != NULL) ? LanguageVariable : "",
-                   Iso639Language ? "en" : "en-US",
+                   SupportedLanguages,
                    NULL
                    );
 
@@ -845,12 +849,8 @@
     NULL,
     EFI_OPEN_PROTOCOL_GET_PROTOCOL);
   if (!EFI_ERROR(Status)) {
-    if (Language == NULL) {
-      BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE);
-      Language = BestLang;
-    }
-    Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal);
-
+    BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);
+    Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);
     if (BestLang != NULL) {
       FreePool (BestLang);
       BestLang = NULL;
@@ -867,12 +867,8 @@
     NULL,
     EFI_OPEN_PROTOCOL_GET_PROTOCOL);
   if (!EFI_ERROR(Status)) {
-    if (Language == NULL) {
-      BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE);
-      Language = BestLang;
-    }
-    Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal);
-    
+    BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);
+    Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);   
     if (BestLang != NULL) {
       FreePool (BestLang);
     }
Index: Library/UefiShellDriver1CommandsLib/Dh.c
===================================================================
--- Library/UefiShellDriver1CommandsLib/Dh.c	(revision 14608)
+++ Library/UefiShellDriver1CommandsLib/Dh.c	(working copy)
@@ -60,7 +60,6 @@
   )
 {
   CHAR8                             *Lang;
-  CHAR8                             *TempChar;
   EFI_STATUS                        Status;
   EFI_COMPONENT_NAME2_PROTOCOL      *CompName2;
   CHAR16                            *NameToReturn;
@@ -87,23 +86,7 @@
   if (EFI_ERROR(Status)) {
     return (EFI_NOT_FOUND);
   }
-  if (Language == NULL) {
-    Lang = AllocateZeroPool(AsciiStrSize(CompName2->SupportedLanguages));
-    if (Lang == NULL) {
-      return (EFI_OUT_OF_RESOURCES);
-    }
-    AsciiStrCpy(Lang, CompName2->SupportedLanguages);
-    TempChar = AsciiStrStr(Lang, ";");
-    if (TempChar != NULL){
-      *TempChar = CHAR_NULL;
-    }
-  } else {
-    Lang = AllocateZeroPool(AsciiStrSize(Language));
-    if (Lang == NULL) {
-      return (EFI_OUT_OF_RESOURCES);
-    }
-    AsciiStrCpy(Lang, Language);
-  }
+  Lang = GetBestLanguageForDriver (CompName2->SupportedLanguages, Language, FALSE);
   Status = CompName2->GetDriverName(CompName2, Lang, &NameToReturn);
   FreePool(Lang);
 
Index: Library/UefiShellDriver1CommandsLib/DrvDiag.c
===================================================================
--- Library/UefiShellDriver1CommandsLib/DrvDiag.c	(revision 14608)
+++ Library/UefiShellDriver1CommandsLib/DrvDiag.c	(working copy)
@@ -71,7 +71,6 @@
   UINTN                               HandleIndex1;
   UINTN                               HandleIndex2;
   CHAR8                               *Language;
-  CHAR8                               *TempChar;
   BOOLEAN                             Found;
 
   if ((ChildHandle != NULL && AllChilds) || (Mode >= TestModeMax)){
@@ -181,23 +180,7 @@
                 NULL,
                 EFI_OPEN_PROTOCOL_GET_PROTOCOL);
               if (!EFI_ERROR(Status)) {
-                if (Lang == NULL) {
-                  Language = AllocateZeroPool(AsciiStrSize(DriverDiagnostics2->SupportedLanguages));
-                  if (Language == NULL) {
-                    return (EFI_OUT_OF_RESOURCES);
-                  }
-                  AsciiStrCpy(Language, DriverDiagnostics2->SupportedLanguages);
-                  TempChar = AsciiStrStr(Language, ";");
-                  if (TempChar != NULL){
-                    *TempChar = CHAR_NULL;
-                  }
-                } else {
-                  Language = AllocateZeroPool(AsciiStrSize(Lang));
-                  if (Language == NULL) {
-                    return (EFI_OUT_OF_RESOURCES);
-                  }
-                  AsciiStrCpy(Language, Lang);
-                }
+                Language = GetBestLanguageForDriver(DriverDiagnostics2->SupportedLanguages, Lang, FALSE);
                 Found = TRUE;
                 Status = DriverDiagnostics2->RunDiagnostics(
                   DriverDiagnostics2,
@@ -220,23 +203,7 @@
                 NULL,
                 EFI_OPEN_PROTOCOL_GET_PROTOCOL);
               if (!EFI_ERROR(Status)) {
-                if (Lang == NULL) {
-                  Language = AllocateZeroPool(AsciiStrSize(DriverDiagnostics2->SupportedLanguages));
-                  if (Language == NULL) {
-                    return (EFI_OUT_OF_RESOURCES);
-                  }
-                  AsciiStrCpy(Language, DriverDiagnostics2->SupportedLanguages);
-                  TempChar = AsciiStrStr(Language, ";");
-                  if (TempChar != NULL){
-                    *TempChar = CHAR_NULL;
-                  }
-                } else {
-                  Language = AllocateZeroPool(AsciiStrSize(Lang));
-                  if (Language == NULL) {
-                    return (EFI_OUT_OF_RESOURCES);
-                  }
-                  AsciiStrCpy(Language, Lang);
-                }
+                Language = GetBestLanguageForDriver(DriverDiagnostics2->SupportedLanguages, Lang, FALSE);
                 Status = DriverDiagnostics->RunDiagnostics(
                   DriverDiagnostics,
                   ControllerHandleList[ControllerHandleListLoop],
Index: Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h
===================================================================
--- Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h	(revision 14608)
+++ Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h	(working copy)
@@ -54,6 +54,7 @@
 #include <Library/PrintLib.h>
 #include <Library/HandleParsingLib.h>
 #include <Library/PeCoffGetEntryPointLib.h>
+#include <Library/HandleParsingLib.h>
 
 
 extern        EFI_HANDLE                        gShellDriver1HiiHandle;
