Index: /trunk/src/VBox/Main/src-server/HostDnsService.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/HostDnsService.cpp	(revision 55796)
+++ /trunk/src/VBox/Main/src-server/HostDnsService.cpp	(revision 55797)
@@ -41,21 +41,31 @@
 
 
-bool HostDnsInformation::equals(const HostDnsInformation &info, bool fDNSOrderIgnore) const
-{
-    if (fDNSOrderIgnore)
+bool HostDnsInformation::equals(const HostDnsInformation &info, uint32_t fLaxComparison) const
+{
+    bool fSameServers;
+    if ((fLaxComparison & IGNORE_SERVER_ORDER) == 0)
+    {
+        fSameServers = (servers == info.servers);
+    }
+    else
     {
         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?
+        
+        fSameServers = (l == r);
+    }
+
+    bool fSameDomain, fSameSearchList;
+    if ((fLaxComparison & IGNORE_SUFFIXES) == 0)
+    {
+        fSameDomain = (domain == info.domain);
+        fSameSearchList = (searchList == info.searchList);
     }
     else
     {
-        return (servers == info.servers)
-            && (domain == info.domain)
-            && (searchList == info.searchList);
-    }
+        fSameDomain = fSameSearchList = true;
+    }
+
+    return fSameServers && fSameDomain && fSameSearchList;
 }
 
@@ -73,5 +83,5 @@
     Data(bool aThreaded)
       : uLastExtraDataPoll(0),
-        fDNSOrderIgnore(false),
+        fLaxComparison(0),
         fThreaded(aThreaded),
         virtualbox(NULL)
@@ -81,5 +91,5 @@
     HostDnsInformation info;
     uint64_t uLastExtraDataPoll;
-    bool fDNSOrderIgnore;
+    uint32_t fLaxComparison;
     const bool fThreaded;
     RTTHREAD hMonitoringThread;
@@ -201,10 +211,10 @@
     dumpHostDnsInformation(info);
 
-    bool fIgnore = m->fDNSOrderIgnore && info.equals(m->info, m->fDNSOrderIgnore);
+    bool fIgnore = m->fLaxComparison && info.equals(m->info, m->fLaxComparison);
     m->info = info;
 
     if (fIgnore)
     {
-        LogRel(("HostDnsMonitor: order change only, not notifying\n"));
+        LogRel(("HostDnsMonitor: lax comparison %#x, not notifying\n", m->fLaxComparison));
         return;
     }
@@ -244,21 +254,48 @@
         m->uLastExtraDataPoll = uNow;
 
+        /*
+         * Should we ignore the order of DNS servers?
+         */
         const com::Bstr bstrHostDNSOrderIgnoreKey("VBoxInternal2/HostDNSOrderIgnore");
         com::Bstr bstrHostDNSOrderIgnore;
         m->virtualbox->GetExtraData(bstrHostDNSOrderIgnoreKey.raw(),
                                     bstrHostDNSOrderIgnore.asOutParam());
-        bool fDNSOrderIgnore = false;
+        uint32_t fDNSOrderIgnore = 0;
         if (bstrHostDNSOrderIgnore.isNotEmpty())
         {
             if (bstrHostDNSOrderIgnore != "0")
-                fDNSOrderIgnore = true;
+                fDNSOrderIgnore = HostDnsInformation::IGNORE_SERVER_ORDER;
         }
 
-        if (fDNSOrderIgnore != m->fDNSOrderIgnore)
+        if (fDNSOrderIgnore != (m->fLaxComparison & HostDnsInformation::IGNORE_SERVER_ORDER))
         {
-            m->fDNSOrderIgnore = fDNSOrderIgnore;
+
+            m->fLaxComparison ^= HostDnsInformation::IGNORE_SERVER_ORDER;
             LogRel(("HostDnsMonitor: %ls=%ls\n",
                     bstrHostDNSOrderIgnoreKey.raw(),
                     bstrHostDNSOrderIgnore.raw()));
+        }
+
+        /*
+         * Should we ignore changes to the domain name or the search list?
+         */
+        const com::Bstr bstrHostDNSSuffixesIgnoreKey("VBoxInternal2/HostDNSSuffixesIgnore");
+        com::Bstr bstrHostDNSSuffixesIgnore;
+        m->virtualbox->GetExtraData(bstrHostDNSSuffixesIgnoreKey.raw(),
+                                    bstrHostDNSSuffixesIgnore.asOutParam());
+        uint32_t fDNSSuffixesIgnore = 0;
+        if (bstrHostDNSSuffixesIgnore.isNotEmpty())
+        {
+            if (bstrHostDNSSuffixesIgnore != "0")
+                fDNSSuffixesIgnore = HostDnsInformation::IGNORE_SUFFIXES;
+        }
+
+        if (fDNSSuffixesIgnore != (m->fLaxComparison & HostDnsInformation::IGNORE_SUFFIXES))
+        {
+
+            m->fLaxComparison ^= HostDnsInformation::IGNORE_SUFFIXES;
+            LogRel(("HostDnsMonitor: %ls=%ls\n",
+                    bstrHostDNSSuffixesIgnoreKey.raw(),
+                    bstrHostDNSSuffixesIgnore.raw()));
         }
     }
Index: /trunk/src/VBox/Main/src-server/HostDnsService.h
===================================================================
--- /trunk/src/VBox/Main/src-server/HostDnsService.h	(revision 55796)
+++ /trunk/src/VBox/Main/src-server/HostDnsService.h	(revision 55797)
@@ -36,8 +36,12 @@
 {
   public:
+    static const uint32_t IGNORE_SERVER_ORDER = RT_BIT_32(0);
+    static const uint32_t IGNORE_SUFFIXES     = RT_BIT_32(1);
+
+  public:
     std::vector<std::string> servers;
     std::string domain;
     std::vector<std::string> searchList;
-    bool equals(const HostDnsInformation &, bool fDNSOrderIgnore = false) const;
+    bool equals(const HostDnsInformation &, uint32_t fLaxComparison = 0) const;
 };
 
