Index: Applications/SMPMediaPortalRestart/SMPMediaPortalRestart.cs
===================================================================
--- Applications/SMPMediaPortalRestart/SMPMediaPortalRestart.cs	(revision 2465)
+++ Applications/SMPMediaPortalRestart/SMPMediaPortalRestart.cs	(working copy)
@@ -28,13 +28,84 @@
     {
       // The Parameter we need is in postion 1, assume MediaPortal not starting in fullscreen
       bool weIsFullscreen = false;
-        string[] args = Environment.GetCommandLineArgs();
-        if (args.Length >= 2)
+      bool isRestartingMp = true; // By default MP will restart
+      bool isUpgrading = false; // By default SMP is not upgrading
+      bool isUpgradingUnattented = false; // By default silent upgrade is off
+      string upgradePath = string.Empty;
+      
+      string[] args = Environment.GetCommandLineArgs();
+      
+      // Argument structure (can be used in conjuction but in specific order):
+      //    /upgrade {FileNameToExecute} [/unattended]
+      //        Performs upgrade of MP. Executes the [FileNameToExecute] with unattended option if specified
+      //    /restartmp [{true|false}] [{splashScreenImage}]
+      //        Restarts MP in fullscreen or not with a specified splashscreen
+
+      if (args.Length > 0)
+      {
+        int currentArgumentIndex = 1;
+        isRestartingMp = false; // There are command line arguments, by default MP will not restart
+        
+        if (args[currentArgumentIndex++] == "/upgrade")
         {
-          weIsFullscreen = bool.Parse(args[1]);
-          splashScreenImage = args[2];
+          isUpgrading = true;
+          upgradePath = args[currentArgumentIndex++];
+          
+          if (args.Length > currentArgumentIndex)
+          {
+            if (args[currentArgumentIndex++] == "/unattended")
+            {
+              isUpgradingUnattented = true;
+            }
+          }
         }
+
+        if (args.Length > currentArgumentIndex)
+        {
+          if (args[currentArgumentIndex++] == "/restartmp")
+          {
+            isRestartingMp = true;
+            
+            if (args.Length > currentArgumentIndex)
+            {
+              bool.TryParse(args[currentArgumentIndex++], out weIsFullscreen);
+              
+              if (args.Length > currentArgumentIndex)
+              {
+                splashScreenImage = args[currentArgumentIndex++];
+              }
+            }
+          }
+        }
+      }
       
+      if (isUpgrading && !string.IsNullOrEmpty(upgradePath))
+      {
+        ProcessStartInfo upgradeProcess = new ProcessStartInfo(upgradePath);
+        upgradeProcess.WorkingDirectory = Path.GetDirectoryName(upgradePath);
+        if (isUpgradingUnattented) upgradeProcess.Arguments = " /unattended";
+        Process p = System.Diagnostics.Process.Start(upgradeProcess);   // Kick off an elevated process. Our process remains un-elevated to restart MP !!
+        int dontWaitForeverCounter = 300; // 10 minutes are enough
+
+        while (!p.HasExited)
+	    {
+	      p.WaitForExit(2000);
+          dontWaitForeverCounter--;
+          
+          if (dontWaitForeverCounter < 0)
+          {
+            break;
+          }
+	    }
+
+        if (dontWaitForeverCounter <= 0)
+        {
+            Application.Exit(); // users will probably restart mp themshelves after 10 minutes
+        }
+      }
+      
+      if (!isRestartingMp) Application.Exit();
+      
       pbSplashScreen.Image = Image.FromFile(splashScreenImage);
 
       lbStatus.Parent = pbSplashScreen;
Index: Applications/StreamedMPConfig/GUI/SkinUpdateGUI.cs
===================================================================
--- Applications/StreamedMPConfig/GUI/SkinUpdateGUI.cs	(revision 2465)
+++ Applications/StreamedMPConfig/GUI/SkinUpdateGUI.cs	(working copy)
@@ -130,12 +130,23 @@
                   //Lets run it
                   if (File.Exists(optionDownloadPath))
                   {
-                    ProcessStartInfo upgradeProcess = new ProcessStartInfo(optionDownloadPath);
-                    upgradeProcess.WorkingDirectory = Path.GetDirectoryName(optionDownloadPath);
+                    string restartExe = Path.Combine(SkinInfo.mpPaths.sMPbaseDir, "SMPMediaPortalRestart.exe");
+                    ProcessStartInfo upgradeProcess = new ProcessStartInfo(restartExe);
+                    upgradeProcess.UseShellExecute = false;
+                    upgradeProcess.WorkingDirectory = Path.GetDirectoryName(restartExe);
+                    upgradeProcess.Arguments = string.Concat("/upgrade \"", optionDownloadPath, "\"");
+
                     if (StreamedMPConfig.patchUtilityRunUnattended)
-                      upgradeProcess.Arguments = " /unattended";
+                    {
+                      upgradeProcess.Arguments += " /unattended";
+                    }
+                    
                     if (StreamedMPConfig.patchUtilityRestartMP)
-                      upgradeProcess.Arguments += " /restartmp";
+                    {
+                      upgradeProcess.Arguments += " /restartmp ";
+                      upgradeProcess.Arguments += StreamedMPConfig.smpSettings.mpSetAsFullScreen ? "true" : "false";
+                      upgradeProcess.Arguments += " \"" + Path.Combine(Path.Combine(SkinInfo.mpPaths.streamedMPpath, "Media"), "splashscreen.png") + "\"";
+                    }
 
                     // signal to next run that we have applied update and settings need updating
                     StreamedMPConfig.patchAppliedLastRun = true;
Index: Applications/StreamedMPConfig/StreamedMPConfig.cs
===================================================================
--- Applications/StreamedMPConfig/StreamedMPConfig.cs	(revision 2465)
+++ Applications/StreamedMPConfig/StreamedMPConfig.cs	(working copy)
@@ -46,7 +46,7 @@
     public string[] mostMovPicsRecentsWatched = new string[3];    
     //Declare Timer for use with Most Recent TVSeries/Movies
     System.Windows.Forms.Timer mrTimer = new System.Windows.Forms.Timer();
-    static settings smpSettings = new settings();
+    internal static settings smpSettings = new settings();
     SkinInfo skInfo = new SkinInfo();
     
     public static List<int> mostRecentEpisodeControlIDs = new List<int>();
@@ -1132,7 +1132,8 @@
     {
       string restartExe = Path.Combine(SkinInfo.mpPaths.sMPbaseDir, "SMPMediaPortalRestart.exe");
       ProcessStartInfo processStart = new ProcessStartInfo(restartExe);
-      processStart.Arguments = smpSettings.mpSetAsFullScreen ? "true" : "false";
+      processStart.Arguments = @"/restartmp ";
+      processStart.Arguments += smpSettings.mpSetAsFullScreen ? "true" : "false";
       processStart.Arguments += " \"" + Path.Combine(Path.Combine(SkinInfo.mpPaths.streamedMPpath, "Media"), "splashscreen.png") + "\"";
 
       smcLog.WriteLog("SMPMediaPortalRestart Parameter: " + processStart.Arguments, LogLevel.Info);
