Index: /trunk/src/VBox/Main/include/NetworkServiceRunner.h
===================================================================
--- /trunk/src/VBox/Main/include/NetworkServiceRunner.h	(revision 54704)
+++ /trunk/src/VBox/Main/include/NetworkServiceRunner.h	(revision 54705)
@@ -37,8 +37,7 @@
     int setOption(const std::string& key, const std::string& val);
 
-    int start();
-    int stop();
+    int  start(bool aKillProcOnStop);
+    int  stop();
     bool isRunning();
-
     void detachFromServer();
 
Index: /trunk/src/VBox/Main/src-server/DHCPServerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/DHCPServerImpl.cpp	(revision 54704)
+++ /trunk/src/VBox/Main/src-server/DHCPServerImpl.cpp	(revision 54705)
@@ -40,5 +40,8 @@
 struct DHCPServer::Data
 {
-    Data() : enabled(FALSE) {}
+    Data()
+        : enabled(FALSE)
+        , router(false)
+    {}
 
     Bstr IPAddress;
@@ -47,4 +50,5 @@
 
     BOOL enabled;
+    bool router;
     DHCPServerRunner dhcp;
 
@@ -55,5 +59,6 @@
 
 DHCPServer::DHCPServer()
-  : m(NULL), mVirtualBox(NULL)
+  : m(NULL)
+  , mVirtualBox(NULL)
 {
     m = new DHCPServer::Data();
@@ -391,5 +396,8 @@
     /* Indirect way to understand that we're on NAT network */
     if (aOption == DhcpOpt_Router)
+    {
         m->dhcp.setOption(NetworkServiceRunner::kNsrKeyNeedMain, "on");
+        m->router = true;
+    }
 
     alock.release();
@@ -566,5 +574,5 @@
 
     /* XXX: This parameters Dhcp Server will fetch via API */
-    return RT_FAILURE(m->dhcp.start()) ? E_FAIL : S_OK;
+    return RT_FAILURE(m->dhcp.start(!m->router /* KillProcOnExit */)) ? E_FAIL : S_OK;
     //m->dhcp.detachFromServer(); /* need to do this to avoid server shutdown on runner destruction */
 }
Index: /trunk/src/VBox/Main/src-server/NATNetworkImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/NATNetworkImpl.cpp	(revision 54704)
+++ /trunk/src/VBox/Main/src-server/NATNetworkImpl.cpp	(revision 54705)
@@ -797,5 +797,5 @@
     }
 
-    if (RT_SUCCESS(m->NATRunner.start()))
+    if (RT_SUCCESS(m->NATRunner.start(false /* KillProcOnStop */)))
     {
         mVirtualBox->i_onNATNetworkStartStop(Bstr(mName).raw(), TRUE);
@@ -813,12 +813,12 @@
 {
 #ifdef VBOX_WITH_NAT_SERVICE
+    mVirtualBox->i_onNATNetworkStartStop(Bstr(mName).raw(), FALSE);
+
     if (!m->dhcpServer.isNull())
         m->dhcpServer->Stop();
 
     if (RT_SUCCESS(m->NATRunner.stop()))
-    {
-        mVirtualBox->i_onNATNetworkStartStop(Bstr(mName).raw(), FALSE);
         return S_OK;
-    }
+
     /** @todo missing setError()! */
     return E_FAIL;
Index: /trunk/src/VBox/Main/src-server/NetworkServiceRunner.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/NetworkServiceRunner.cpp	(revision 54704)
+++ /trunk/src/VBox/Main/src-server/NetworkServiceRunner.cpp	(revision 54705)
@@ -22,21 +22,28 @@
 #include <iprt/param.h>
 #include <iprt/env.h>
+#include <iprt/log.h>
+#include <iprt/thread.h>
 
 
-const std::string NetworkServiceRunner::kNsrKeyName = "--name";
-const std::string NetworkServiceRunner::kNsrKeyNetwork = "--network";
+const std::string NetworkServiceRunner::kNsrKeyName      = "--name";
+const std::string NetworkServiceRunner::kNsrKeyNetwork   = "--network";
 const std::string NetworkServiceRunner::kNsrKeyTrunkType = "--trunk-type";
-const std::string NetworkServiceRunner::kNsrTrunkName = "--trunk-name";
-const std::string NetworkServiceRunner::kNsrMacAddress = "--mac-address";
-const std::string NetworkServiceRunner::kNsrIpAddress = "--ip-address";
-const std::string NetworkServiceRunner::kNsrIpNetmask = "--netmask";
-const std::string NetworkServiceRunner::kNsrKeyNeedMain = "--need-main";
+const std::string NetworkServiceRunner::kNsrTrunkName    = "--trunk-name";
+const std::string NetworkServiceRunner::kNsrMacAddress   = "--mac-address";
+const std::string NetworkServiceRunner::kNsrIpAddress    = "--ip-address";
+const std::string NetworkServiceRunner::kNsrIpNetmask    = "--netmask";
+const std::string NetworkServiceRunner::kNsrKeyNeedMain  = "--need-main";
 
 struct NetworkServiceRunner::Data
 {
-    Data(const char* aProcName):mProcName(aProcName), mProcess(NIL_RTPROCESS){}
+    Data(const char* aProcName)
+        : mProcName(aProcName)
+        , mProcess(NIL_RTPROCESS)
+        , mKillProcOnStop(false)
+    {}
     const char *mProcName;
     RTPROCESS mProcess;
     std::map<std::string, std::string> mOptions;
+    bool mKillProcOnStop;
 };
 
@@ -44,5 +51,4 @@
 {
     m = new NetworkServiceRunner::Data(aProcName);
-
 }
 
@@ -69,5 +75,5 @@
 
 
-int NetworkServiceRunner::start()
+int NetworkServiceRunner::start(bool aKillProcOnStop)
 {
     if (isRunning())
@@ -108,4 +114,5 @@
         m->mProcess = NIL_RTPROCESS;
 
+    m->mKillProcOnStop = aKillProcOnStop;
     return rc;
 }
@@ -114,6 +121,37 @@
 int NetworkServiceRunner::stop()
 {
+    /*
+     * If the process already terminated, this function will also grab the exit
+     * status and transition the process out of zombie status.
+     */
     if (!isRunning())
         return VINF_OBJECT_DESTROYED;
+
+    bool fDoKillProc = true;
+
+    if (!m->mKillProcOnStop)
+    {
+        /*
+         * This is a VBoxSVC Main client. Do NOT kill it but assume it was shut
+         * down politely. Wait up to 1 second until the process is killed before
+         * doing the final hard kill.
+         */
+        int rc = VINF_SUCCESS;
+        for (unsigned int i = 0; i < 100; i++)
+        {
+            rc = RTProcWait(m->mProcess, RTPROCWAIT_FLAGS_NOBLOCK, NULL);
+            if (RT_SUCCESS(rc))
+                break;
+            RTThreadSleep(10);
+        }
+        if (rc != VERR_PROCESS_RUNNING)
+            fDoKillProc = false;
+    }
+
+    if (fDoKillProc)
+    {
+        int rc = RTProcTerminate(m->mProcess);
+        rc = RTProcWait(m->mProcess, RTPROCWAIT_FLAGS_BLOCK, NULL);
+    }
 
     m->mProcess = NIL_RTPROCESS;
