Index: Include/Protocol/DisplayProtocol.h
===================================================================
--- Include/Protocol/DisplayProtocol.h	(revision 17502)
+++ Include/Protocol/DisplayProtocol.h	(working copy)
@@ -39,6 +39,7 @@
 #define BROWSER_INCONSISTENT_IF           BROWSER_ERROR | 0x06
 #define BROWSER_WARNING_IF                BROWSER_ERROR | 0x07
 #define BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF  BROWSER_ERROR | 0x08
+#define BROWSER_RECONNECT_FAIL            BROWSER_ERROR | 0x09
 
 #define FORM_DISPLAY_ENGINE_STATEMENT_VERSION_1  0x10000
 #define FORM_DISPLAY_ENGINE_VERSION_1            0x10000
Index: Universal/DisplayEngineDxe/FormDisplay.c
===================================================================
--- Universal/DisplayEngineDxe/FormDisplay.c	(revision 17502)
+++ Universal/DisplayEngineDxe/FormDisplay.c	(working copy)
@@ -113,9 +113,10 @@
 //
 // Browser Global Strings
 //
+CHAR16            *gReconnectFail;
 CHAR16            *gFormNotFound;
 CHAR16            *gNoSubmitIf;
-CHAR16            *gBrwoserError;
+CHAR16            *gBrowserError;
 CHAR16            *gSaveFailed;
 CHAR16            *gNoSubmitIfFailed;
 CHAR16            *gSaveProcess;
@@ -206,6 +207,7 @@
   mUnknownString        = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle);
   gSaveFailed           = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);
   gNoSubmitIfFailed     = GetToken (STRING_TOKEN (NO_SUBMIT_IF_CHECK_FAILED), gHiiHandle);
+  gReconnectFail        = GetToken (STRING_TOKEN (RECONNECT_FAILED), gHiiHandle);
   gSaveProcess          = GetToken (STRING_TOKEN (DISCARD_OR_JUMP), gHiiHandle);
   gSaveNoSubmitProcess  = GetToken (STRING_TOKEN (DISCARD_OR_CHECK), gHiiHandle);
   gDiscardChange        = GetToken (STRING_TOKEN (DISCARD_OR_JUMP_DISCARD), gHiiHandle);
@@ -225,7 +227,7 @@
   gProtocolNotFound     = GetToken (STRING_TOKEN (PROTOCOL_NOT_FOUND), gHiiHandle);
   gFormNotFound         = GetToken (STRING_TOKEN (STATUS_BROWSER_FORM_NOT_FOUND), gHiiHandle);
   gNoSubmitIf           = GetToken (STRING_TOKEN (STATUS_BROWSER_NO_SUBMIT_IF), gHiiHandle);
-  gBrwoserError         = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle);
+  gBrowserError         = GetToken (STRING_TOKEN (STATUS_BROWSER_ERROR), gHiiHandle);
   gConfirmDefaultMsg    = GetToken (STRING_TOKEN (CONFIRM_DEFAULT_MESSAGE), gHiiHandle);
   gConfirmDiscardMsg    = GetToken (STRING_TOKEN (CONFIRM_DISCARD_MESSAGE), gHiiHandle);
   gConfirmSubmitMsg     = GetToken (STRING_TOKEN (CONFIRM_SUBMIT_MESSAGE), gHiiHandle);
@@ -256,6 +258,7 @@
   FreePool (gEmptyString);
   FreePool (gSaveFailed);
   FreePool (gNoSubmitIfFailed);
+  FreePool (gReconnectFail);
   FreePool (gSaveProcess);
   FreePool (gSaveNoSubmitProcess);
   FreePool (gDiscardChange);
@@ -272,7 +275,7 @@
   FreePool (gOptionMismatch);
   FreePool (gFormSuppress);
   FreePool (gProtocolNotFound);
-  FreePool (gBrwoserError);
+  FreePool (gBrowserError);
   FreePool (gNoSubmitIf);
   FreePool (gFormNotFound);
   FreePool (gConfirmDefaultMsg);
@@ -3776,8 +3779,12 @@
       ErrorInfo = gNoSubmitIfFailed;
       break;
 
+    case BROWSER_RECONNECT_FAIL:
+      ErrorInfo = gReconnectFail;
+      break;
+
     default:
-      ErrorInfo = gBrwoserError;
+      ErrorInfo = gBrowserError;
       break;
     }
   }
Index: Universal/DisplayEngineDxe/FormDisplayStr.uni
===================================================================
--- Universal/DisplayEngineDxe/FormDisplayStr.uni	(revision 17502)
+++ Universal/DisplayEngineDxe/FormDisplayStr.uni	(working copy)
@@ -214,4 +214,8 @@
  
  # s t r i n g   C O N F I R M _ O P T I O N _ E N D                           # l a n g u a g e   e n - U S     " ? "   
-                                                                               # l a n g u a g e   f r - F R     " ? " 
\ No newline at end of file
+                                                                               # l a n g u a g e   f r - F R     " ? " + 
+ # s t r i n g   R E C O N N E C T _ F A I L E D                               # l a n g u a g e   e n - U S     " R e c o n n e c t   t h e   c o n t r o l l e r   f a i l e d ! " + 
+                                                                               # l a n g u a g e   f r - F R     " R e c o n n e c t   t h e   c o n t r o l l e r   f a i l e d ! " 
\ No newline at end of file
Index: Universal/SetupBrowserDxe/Presentation.c
===================================================================
--- Universal/SetupBrowserDxe/Presentation.c	(revision 17502)
+++ Universal/SetupBrowserDxe/Presentation.c	(working copy)
@@ -1238,6 +1238,7 @@
                          by user.
 
   @param Scope           Data save or discard scope, form or formset.
+  @param SavedChanges    Whether save the change success.
 
   @retval                TRUE   Success process the changed data, will return to the parent form.
   @retval                FALSE  Reject to process the changed data, will stay at  current form.
@@ -1245,12 +1246,16 @@
 BOOLEAN
 ProcessChangedData (
   IN OUT UI_MENU_SELECTION       *Selection,
-  IN     BROWSER_SETTING_SCOPE   Scope
+  IN     BROWSER_SETTING_SCOPE   Scope,
+  OUT    BOOLEAN                 *SavedChanges
   )
 {
   BOOLEAN    RetValue;
   EFI_STATUS Status;
 
+  if (SavedChanges != NULL) {
+    *SavedChanges = FALSE;
+  }
   RetValue = TRUE;
   switch (mFormDisplay->ConfirmDataChange()) {
     case BROWSER_ACTION_DISCARD:
@@ -1261,6 +1266,8 @@
       Status = SubmitForm (Selection->FormSet, Selection->Form, Scope);
       if (EFI_ERROR (Status)) {
         RetValue = FALSE;
+      } else if (SavedChanges != NULL) {
+        *SavedChanges = TRUE;
       }
       break;
 
@@ -1375,7 +1382,7 @@
       //
       if ((gBrowserSettingScope == FormLevel || gBrowserSettingScope == FormSetLevel) &&
           IsNvUpdateRequiredForFormSet(Selection->FormSet)) {
-        if (!ProcessChangedData(Selection, FormSetLevel)) {
+        if (!ProcessChangedData(Selection, FormSetLevel, NULL)) {
           return EFI_SUCCESS;
         }
       }
@@ -1404,7 +1411,7 @@
       //
       if ((gBrowserSettingScope == FormLevel || gBrowserSettingScope == FormSetLevel) &&
          IsNvUpdateRequiredForFormSet(Selection->FormSet)) {
-        if (!ProcessChangedData(Selection, FormSetLevel)) {
+        if (!ProcessChangedData(Selection, FormSetLevel, NULL)) {
           return EFI_SUCCESS;
         }
       }
@@ -1429,7 +1436,7 @@
     //
     if (Statement->HiiValue.Value.ref.FormId != Selection->FormId) {
       if ((gBrowserSettingScope == FormLevel && IsNvUpdateRequiredForForm(Selection->Form))) {
-        if (!ProcessChangedData (Selection, FormLevel)) {
+        if (!ProcessChangedData (Selection, FormLevel, NULL)) {
           return EFI_SUCCESS;
         }
       }
@@ -1825,6 +1832,7 @@
   FORM_ENTRY_INFO            *CurrentMenu;
   FORM_ENTRY_INFO            *ParentMenu;
   BROWSER_SETTING_SCOPE      Scope;
+  BOOLEAN                    Saved;
   
   CurrentMenu = Selection->CurrentMenu;
   Scope       = FormSetLevel;
@@ -1847,8 +1855,19 @@
   //
   if ((gBrowserSettingScope == FormLevel && IsNvUpdateRequiredForForm (Selection->Form)) ||
       (gBrowserSettingScope == FormSetLevel && IsNvUpdateRequiredForFormSet(Selection->FormSet) && Scope == FormSetLevel)) {
-    if (!ProcessChangedData(Selection, gBrowserSettingScope)) {
+    if (!ProcessChangedData(Selection, gBrowserSettingScope, &Saved)) {
+      //
+      // Save changes failed, don't need to do reconnect anymore.
+      //
+      if (gCallbackReconnect) {
+        gCallbackReconnect = FALSE;
+      }
       return FALSE;
+    } else if (!Saved && gCallbackReconnect) {
+      //
+      // User discard the changes, don't need to do reconnect anymore.
+      //
+      gCallbackReconnect = FALSE;
     }
   }
 
@@ -1885,6 +1904,30 @@
 }
 
 /**
+  Reconnect the controller.
+
+  @param DriverHandle          The controller handle which need to be reconnect.
+
+  @retval   TRUE     do the reconnect behavior success.
+  @retval   FALSE    do the reconnect behavior failed.
+  
+**/
+BOOLEAN
+ReconnectController (
+  IN EFI_HANDLE   DriverHandle
+  )
+{
+  EFI_STATUS                      Status;
+
+  Status = gBS->DisconnectController(DriverHandle, NULL, NULL);
+  if (!EFI_ERROR (Status)) {
+    Status = gBS->ConnectController(DriverHandle, NULL, NULL, FALSE);
+  }
+
+  return Status == EFI_SUCCESS;
+}
+
+/**
   Call the call back function for the question and process the return action.
 
   @param Selection             On input, Selection tell setup browser the information
@@ -2055,6 +2098,10 @@
           SettingLevel          = FormLevel;
           break;
 
+        case EFI_BROWSER_ACTION_REQUEST_RECONNECT:
+          gCallbackReconnect    = TRUE;
+          break;
+
         default:
           break;
         }
@@ -2153,6 +2200,14 @@
     DiscardForm (FormSet, Form, SettingLevel);
   }
 
+  if (gCallbackReconnect) {
+    //
+    // Exit current formset before do the reconnect.
+    //
+    NeedExit = TRUE;
+    SettingLevel = FormSetLevel;
+  }
+
   if (NeedExit) {
     FindNextMenu (Selection, SettingLevel);
   }
@@ -2465,13 +2520,18 @@
       }
 
       //
-      // If question has EFI_IFR_FLAG_RESET_REQUIRED flag and without storage and process question success till here, 
-      // trig the gResetFlag.
+      // If question has EFI_IFR_FLAG_RESET_REQUIRED/EFI_IFR_FLAG_RECONNECT_REQUIRED flag and without storage 
+      // and process question success till here, trig the gResetFlag/gFlagReconnect.
       //
       if ((Status == EFI_SUCCESS) && 
-          (Statement->Storage == NULL) && 
-          ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {
-        gResetRequired = TRUE;
+          (Statement->Storage == NULL)) { 
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {
+          gResetRequired = TRUE;
+        }
+
+        if ((Statement->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {
+          gFlagReconnect = TRUE;
+        }
       }
     }
 
Index: Universal/SetupBrowserDxe/Setup.c
===================================================================
--- Universal/SetupBrowserDxe/Setup.c	(revision 17502)
+++ Universal/SetupBrowserDxe/Setup.c	(working copy)
@@ -55,6 +55,8 @@
 BOOLEAN               mSystemSubmit = FALSE;
 BOOLEAN               gResetRequired;
 BOOLEAN               gExitRequired;
+BOOLEAN               gFlagReconnect;
+BOOLEAN               gCallbackReconnect;
 BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel;
 BOOLEAN               mBrowserScopeFirstSet = TRUE;
 EXIT_HANDLER          ExitHandlerFunction = NULL;
@@ -483,6 +485,7 @@
   UINTN                         Index;
   FORM_BROWSER_FORMSET          *FormSet;
   FORM_ENTRY_INFO               *MenuList;
+  BOOLEAN                       RetVal;
 
   //
   // If EDKII_FORM_DISPLAY_ENGINE_PROTOCOL not found, return EFI_UNSUPPORTED.
@@ -496,8 +499,10 @@
   //
   SaveBrowserContext ();
 
+  gFlagReconnect = FALSE;
   gResetRequired = FALSE;
   gExitRequired  = FALSE;
+  gCallbackReconnect = FALSE;
   Status         = EFI_SUCCESS;
   gEmptyString   = L"";
   gDisplayFormData.ScreenDimensions = (EFI_SCREEN_DESCRIPTOR *) ScreenDimensions;
@@ -547,6 +552,15 @@
       gCurrentSelection = NULL;
       mSystemLevelFormSet = NULL;
 
+      if (gFlagReconnect || gCallbackReconnect) {
+        RetVal = ReconnectController (FormSet->DriverHandle);
+        if (!RetVal) {
+          PopupErrorMessage(BROWSER_RECONNECT_FAIL, NULL, NULL, NULL);
+        }
+        gFlagReconnect = FALSE;
+        gCallbackReconnect = FALSE;
+      }
+
       //
       // If no data is changed, don't need to save current FormSet into the maintain list.
       //
@@ -2523,8 +2537,14 @@
     //
     // Only the changed data has been saved, then need to set the reset flag.
     //
-    if (SetFlag && OldValue && !Question->ValueChanged && ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0)) {
-      gResetRequired = TRUE;
+    if (SetFlag && OldValue && !Question->ValueChanged) {
+      if ((Question->QuestionFlags & EFI_IFR_FLAG_RESET_REQUIRED) != 0) {
+        gResetRequired = TRUE;
+      }
+
+      if ((Question->QuestionFlags & EFI_IFR_FLAG_RECONNECT_REQUIRED) != 0) {
+        gFlagReconnect = TRUE;
+      }
     } 
   }
 }
@@ -5524,6 +5544,8 @@
   //
   Context->Selection            = gCurrentSelection;
   Context->ResetRequired        = gResetRequired;
+  Context->FlagReconnect        = gFlagReconnect;
+  Context->CallbackReconnect    = gCallbackReconnect;
   Context->ExitRequired         = gExitRequired;
   Context->HiiHandle            = mCurrentHiiHandle;
   Context->FormId               = mCurrentFormId;
@@ -5579,6 +5601,8 @@
   //
   gCurrentSelection     = Context->Selection;
   gResetRequired        = Context->ResetRequired;
+  gFlagReconnect        = Context->FlagReconnect;
+  gCallbackReconnect    = Context->CallbackReconnect;
   gExitRequired         = Context->ExitRequired;
   mCurrentHiiHandle     = Context->HiiHandle;
   mCurrentFormId        = Context->FormId;
Index: Universal/SetupBrowserDxe/Setup.h
===================================================================
--- Universal/SetupBrowserDxe/Setup.h	(revision 17502)
+++ Universal/SetupBrowserDxe/Setup.h	(working copy)
@@ -528,6 +528,8 @@
   //
   // Globals defined in Setup.c
   //
+  BOOLEAN                  FlagReconnect;
+  BOOLEAN                  CallbackReconnect;
   BOOLEAN                  ResetRequired;
   BOOLEAN                  ExitRequired;
   EFI_HII_HANDLE           HiiHandle;
@@ -566,6 +568,8 @@
 extern EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *mPathFromText;
 extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;
 
+extern BOOLEAN               gCallbackReconnect;
+extern BOOLEAN               gFlagReconnect;
 extern BOOLEAN               gResetRequired;
 extern BOOLEAN               gExitRequired;
 extern LIST_ENTRY            gBrowserFormSetList;
@@ -1831,4 +1835,18 @@
   IN BROWSER_STORAGE       *Storage
   );
 
+/**
+  Reconnect the controller.
+
+  @param DriverHandle          The controller handle which need to be reconnect.
+
+  @retval   TRUE     do the reconnect behavior success.
+  @retval   FALSE    do the reconnect behavior failed.
+  
+**/
+BOOLEAN
+ReconnectController (
+  IN EFI_HANDLE   DriverHandle
+  );
+
 #endif
