Index: /trunk/src/VBox/Main/src-server/HostDnsService.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostDnsService.cpp	(revision 55222)
+++ /trunk/src/VBox/Main/src-server/HostDnsService.cpp	(revision 55223)
@@ -29,4 +29,5 @@
 
 #include <algorithm>
+#include <set>
 #include <string>
 #include "HostDnsService.h"
@@ -39,9 +40,21 @@
 
 
-bool HostDnsInformation::equals(const HostDnsInformation &info) const
-{
-    return    (servers == info.servers)
-           && (domain == info.domain)
-           && (searchList == info.searchList);
+bool HostDnsInformation::equals(const HostDnsInformation &info, bool fDNSOrderIgnore) const
+{
+    if (fDNSOrderIgnore)
+    {
+        std::set<std::string> l(servers.begin(), servers.end());
+        std::set<std::string> r(info.servers.begin(), info.servers.end());
+
+        return (l == r)
+            && (domain == info.domain)
+            && (searchList == info.searchList); // XXX: also ignore order?
+    }
+    else
+    {
+        return (servers == info.servers)
+            && (domain == info.domain)
+            && (searchList == info.searchList);
+    }
 }
 
@@ -57,5 +70,6 @@
 struct HostDnsMonitor::Data
 {
-    Data(bool aThreaded) :
+    Data(bool aThreaded)
+      : fDNSOrderIgnore(false),
         fThreaded(aThreaded)
     {}
@@ -63,4 +77,5 @@
     std::vector<PCHostDnsMonitorProxy> proxies;
     HostDnsInformation info;
+    bool fDNSOrderIgnore;
     const bool fThreaded;
     RTTHREAD hMonitoringThread;
@@ -108,5 +123,5 @@
 }
 
-const HostDnsMonitor *HostDnsMonitor::getHostDnsMonitor()
+const HostDnsMonitor *HostDnsMonitor::getHostDnsMonitor(VirtualBox *aParent)
 {
     /* XXX: Moved initialization from HostImpl.cpp */
@@ -128,5 +143,5 @@
         g_monitor = new HostDnsService();
 # endif
-        g_monitor->init();
+        g_monitor->init(aParent);
     }
 
@@ -179,5 +194,12 @@
     dumpHostDnsInformation(info);
 
+    bool fIgnore = m->fDNSOrderIgnore && info.equals(m->info, m->fDNSOrderIgnore);
     m->info = info;
+
+    if (fIgnore)
+    {
+        LogRel(("HostDnsMonitor: order change only, not notifying\n"));
+        return;
+    }
 
     std::vector<PCHostDnsMonitorProxy>::const_iterator it;
@@ -186,6 +208,21 @@
 }
 
-HRESULT HostDnsMonitor::init()
-{
+HRESULT HostDnsMonitor::init(VirtualBox *virtualbox)
+{
+    const com::Bstr bstrHostDNSOrderIgnoreKey("VBoxInternal2/HostDNSOrderIgnore");
+    com::Bstr bstrHostDNSOrderIgnore;
+    virtualbox->GetExtraData(bstrHostDNSOrderIgnoreKey.raw(),
+                             bstrHostDNSOrderIgnore.asOutParam());
+
+    if (bstrHostDNSOrderIgnore.isNotEmpty())
+    {
+        LogRel(("HostDnsMonitor: %ls=%ls\n",
+                bstrHostDNSOrderIgnoreKey.raw(),
+                bstrHostDNSOrderIgnore.raw()));
+
+        if (bstrHostDNSOrderIgnore != "0")
+            m->fDNSOrderIgnore = true;
+    }
+
     if (m->fThreaded)
     {
Index: /trunk/src/VBox/Main/src-server/HostDnsService.h
===================================================================
--- /trunk/src/VBox/Main/src-server/HostDnsService.h	(revision 55222)
+++ /trunk/src/VBox/Main/src-server/HostDnsService.h	(revision 55223)
@@ -39,5 +39,5 @@
     std::string domain;
     std::vector<std::string> searchList;
-    bool equals(const HostDnsInformation &) const;
+    bool equals(const HostDnsInformation &, bool fDNSOrderIgnore = false) const;
 };
 
@@ -49,5 +49,5 @@
 {
   public:
-    static const HostDnsMonitor *getHostDnsMonitor();
+    static const HostDnsMonitor *getHostDnsMonitor(VirtualBox *virtualbox);
     static void shutdown();
 
@@ -57,5 +57,5 @@
     /* @note: method will wait till client call
        HostDnsService::monitorThreadInitializationDone() */
-    virtual HRESULT init();
+    virtual HRESULT init(VirtualBox *virtualbox);
 
   protected:
@@ -91,5 +91,5 @@
     HostDnsMonitorProxy();
     ~HostDnsMonitorProxy();
-    void init(const HostDnsMonitor *aMonitor, VirtualBox *aParent);
+    void init(const HostDnsMonitor *aMonitor, VirtualBox *virtualbox);
     void notify() const;
 
@@ -117,5 +117,5 @@
     HostDnsServiceDarwin();
     ~HostDnsServiceDarwin();
-    HRESULT init();
+    virtual HRESULT init(VirtualBox *virtualbox);
 
     protected:
@@ -136,5 +136,5 @@
     HostDnsServiceWin();
     ~HostDnsServiceWin();
-    HRESULT init();
+    virtual HRESULT init(VirtualBox *virtualbox);
 
     protected:
@@ -156,5 +156,5 @@
     explicit HostDnsServiceResolvConf(bool fThreaded = false) : HostDnsMonitor(fThreaded), m(NULL) {}
     virtual ~HostDnsServiceResolvConf();
-    virtual HRESULT init(const char *aResolvConfFileName);
+    virtual HRESULT init(VirtualBox *virtualbox, const char *aResolvConfFileName);
     const std::string& resolvConf() const;
 
@@ -180,5 +180,7 @@
     HostDnsServiceSolaris(){}
     ~HostDnsServiceSolaris(){}
-    HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
+    virtual HRESULT init(VirtualBox *virtualbox) {
+	return HostDnsServiceResolvConf::init(virtualbox, "/etc/resolv.conf");
+    }
 };
 
@@ -189,5 +191,7 @@
     HostDnsServiceLinux():HostDnsServiceResolvConf(true){}
     virtual ~HostDnsServiceLinux();
-    virtual HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
+    virtual HRESULT init(VirtualBox *virtualbox) {
+	return HostDnsServiceResolvConf::init(virtualbox, "/etc/resolv.conf");
+    }
 
   protected:
@@ -202,5 +206,7 @@
     HostDnsServiceFreebsd(){}
     ~HostDnsServiceFreebsd(){}
-    HRESULT init(){ return HostDnsServiceResolvConf::init("/etc/resolv.conf");}
+    virtual HRESULT init(VirtualBox *virtualbox) {
+	return HostDnsServiceResolvConf::init(virtualbox, "/etc/resolv.conf");
+    }
 };
 
@@ -212,5 +218,7 @@
     ~HostDnsServiceOs2(){}
     /* XXX: \\MPTN\\ETC should be taken from environment variable ETC  */
-    HRESULT init(){ return init("\\MPTN\\ETC\\RESOLV2");}
+    virtual HRESULT init(VirtualBox *virtualbox) {
+	return HostDnsServiceResolvConf::init(virtualbox, "\\MPTN\\ETC\\RESOLV2");
+    }
 };
 
Index: /trunk/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp	(revision 55222)
+++ /trunk/src/VBox/Main/src-server/HostDnsServiceResolvConf.cpp	(revision 55223)
@@ -67,9 +67,9 @@
 }
 
-HRESULT HostDnsServiceResolvConf::init(const char *aResolvConfFileName)
+HRESULT HostDnsServiceResolvConf::init(VirtualBox *virtualbox, const char *aResolvConfFileName)
 {
     m = new Data(aResolvConfFileName);
 
-    HostDnsMonitor::init();
+    HostDnsMonitor::init(virtualbox);
 
     readResolvConf();
Index: /trunk/src/VBox/Main/src-server/HostImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostImpl.cpp	(revision 55222)
+++ /trunk/src/VBox/Main/src-server/HostImpl.cpp	(revision 55223)
@@ -300,5 +300,5 @@
     i_updateNetIfList();
 
-    m->hostDnsMonitorProxy.init(HostDnsMonitor::getHostDnsMonitor(), m->pParent);
+    m->hostDnsMonitorProxy.init(HostDnsMonitor::getHostDnsMonitor(m->pParent), m->pParent);
 
 #if defined(RT_OS_WINDOWS)
