Index: Include/Protocol/DisplayProtocol.h
===================================================================
--- Include/Protocol/DisplayProtocol.h	(revision 17502)
+++ Include/Protocol/DisplayProtocol.h	(working copy)
@@ -39,6 +39,9 @@
 #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_REQUIRED        BROWSER_ERROR | 0x09
+#define BROWSER_RECONNECT_FAIL            BROWSER_ERROR | 0x0A
+#define BROWSER_RECONNECT_SAVE_CHANGES    BROWSER_ERROR | 0x0B
 
 #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,13 @@
 //
 // Browser Global Strings
 //
+CHAR16            *gConfirmChanges;
+CHAR16            *gReconnectFail;
+CHAR16            *gReconnectRequired;
+CHAR16            *gChangesOpt;
 CHAR16            *gFormNotFound;
 CHAR16            *gNoSubmitIf;
-CHAR16            *gBrwoserError;
+CHAR16            *gBrowserError;
 CHAR16            *gSaveFailed;
 CHAR16            *gNoSubmitIfFailed;
 CHAR16            *gSaveProcess;
@@ -206,6 +210,10 @@
   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);
+  gReconnectRequired    = GetToken (STRING_TOKEN (RECONNECT_REQUIRED), gHiiHandle);
+  gConfirmChanges       = GetToken (STRING_TOKEN (RECONNECT_CONFIRM_CHANGES), gHiiHandle);
+  gChangesOpt           = GetToken (STRING_TOKEN (RECONNECT_CHANGES_OPTIONS), 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 +233,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 +264,10 @@
   FreePool (gEmptyString);
   FreePool (gSaveFailed);
   FreePool (gNoSubmitIfFailed);
+  FreePool (gReconnectFail);
+  FreePool (gReconnectRequired);
+  FreePool (gChangesOpt);
+  FreePool (gConfirmChanges);
   FreePool (gSaveProcess);
   FreePool (gSaveNoSubmitProcess);
   FreePool (gDiscardChange);
@@ -272,7 +284,7 @@
   FreePool (gOptionMismatch);
   FreePool (gFormSuppress);
   FreePool (gProtocolNotFound);
-  FreePool (gBrwoserError);
+  FreePool (gBrowserError);
   FreePool (gNoSubmitIf);
   FreePool (gFormNotFound);
   FreePool (gConfirmDefaultMsg);
@@ -3776,8 +3788,20 @@
       ErrorInfo = gNoSubmitIfFailed;
       break;
 
+    case BROWSER_RECONNECT_FAIL:
+      ErrorInfo = gReconnectFail;
+      break;
+
+    case BROWSER_RECONNECT_SAVE_CHANGES:
+      ErrorInfo = gConfirmChanges;
+      break;
+
+    case BROWSER_RECONNECT_REQUIRED:
+      ErrorInfo = gReconnectRequired;
+      break;
+
     default:
-      ErrorInfo = gBrwoserError;
+      ErrorInfo = gBrowserError;
       break;
     }
   }
@@ -3785,15 +3809,21 @@
   switch (gFormData->BrowserStatus) {
   case BROWSER_SUBMIT_FAIL:
   case BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF:
+  case BROWSER_RECONNECT_SAVE_CHANGES:
     ASSERT (gUserInput != NULL);
     if (gFormData->BrowserStatus == (BROWSER_SUBMIT_FAIL)) {
       PrintString = gSaveProcess;
       JumpToFormSet = gJumpToFormSet[0];
-    } else {
+      DiscardChange = gDiscardChange[0];
+    } else if (gFormData->BrowserStatus == (BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF)){
       PrintString = gSaveNoSubmitProcess;
       JumpToFormSet = gCheckError[0];
+      DiscardChange = gDiscardChange[0];
+    } else {
+      PrintString = gChangesOpt;
+      JumpToFormSet = gConfirmOptYes[0];
+      DiscardChange = gConfirmOptNo[0];
     }
-    DiscardChange = gDiscardChange[0];
 
     do {
       CreateDialog (&Key, gEmptyString, ErrorInfo, PrintString, gEmptyString, NULL);
Index: Universal/DisplayEngineDxe/FormDisplayStr.uni
===================================================================
--- Universal/DisplayEngineDxe/FormDisplayStr.uni	(revision 17502)
+++ Universal/DisplayEngineDxe/FormDisplayStr.uni	(working copy)
@@ -214,4 +214,20 @@
  
  # 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 ! " + 
+ # s t r i n g   R E C O N N E C T _ C O N F I R M _ C H A N G E S             # l a n g u a g e   e n - U S     " R e c o n n e c t   i s   r e q u i r e d ,   c o n f i r m   t h e   c h a n g e s   t h e n   e x i t   a n d   r e c o n n e c t " + 
+                                                                               # l a n g u a g e   f r - F R     " R e c o n n e c t   i s   r e q u i r e d ,   c o n f i r m   t h e   c h a n g e s   t h e n   e x i t   a n d   r e c o n n e c t " + 
+ # s t r i n g   R E C O N N E C T _ C H A N G E S _ O P T I O N S             # l a n g u a g e   e n - U S     " P r e s s   ' Y '   t o   s a v e ,   ' N '   t o   d i s c a r d " + 
+                                                                               # l a n g u a g e   f r - F R     " P r e s s   ' Y '   t o   s a v e ,   ' N '   t o   d i s c a r d " + 
+ # s t r i n g   R E C O N N E C T _ R E Q U I R E D                           # l a n g u a g e   e n - U S     " R e c o n n e c t   i s   r e q u i r e d ,   e x i t   a n d   r e c o n n e c t " + 
+                                                                               # l a n g u a g e   f r - F R     " R e c o n n e c t   i s   r e q u i r e d ,   e x i t   a n d   r e c o n n e c t " 
\ No newline at end of file
Index: Universal/SetupBrowserDxe/Presentation.c
===================================================================
--- Universal/SetupBrowserDxe/Presentation.c	(revision 17502)
+++ Universal/SetupBrowserDxe/Presentation.c	(working copy)
@@ -1885,6 +1885,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 +2079,10 @@
           SettingLevel          = FormLevel;
           break;
 
+        case EFI_BROWSER_ACTION_REQUEST_RECONNECT:
+          gCallbackReconnect    = TRUE;
+          break;
+
         default:
           break;
         }
@@ -2145,6 +2173,28 @@
     }
   }
 
+  if (gCallbackReconnect && (EFI_BROWSER_ACTION_CHANGED == Action)) {
+    //
+    // Confirm changes with user first.
+    //
+    if (IsNvUpdateRequiredForFormSet(FormSet)) {
+      if (BROWSER_ACTION_DISCARD == PopupErrorMessage(BROWSER_RECONNECT_SAVE_CHANGES, NULL, NULL, NULL)) {
+        gCallbackReconnect = FALSE;
+        DiscardFormIsRequired = TRUE;
+      } else {
+        SubmitFormIsRequired = TRUE;
+      }
+    } else {
+      PopupErrorMessage(BROWSER_RECONNECT_REQUIRED, NULL, NULL, NULL);
+    }
+
+    //
+    // Exit current formset before do the reconnect.
+    //
+    NeedExit = TRUE;
+    SettingLevel = FormSetLevel;
+  }
+
   if (SubmitFormIsRequired && !SkipSaveOrDiscard) {
     SubmitForm (FormSet, Form, SettingLevel);
   }
@@ -2465,13 +2515,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
