Index: /trunk/src/VBox/Devices/Network/DrvNAT.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 68443)
+++ /trunk/src/VBox/Devices/Network/DrvNAT.cpp	(revision 68444)
@@ -1656,12 +1656,11 @@
         slirp_set_mtu(pThis->pNATState, MTU);
         slirp_set_somaxconn(pThis->pNATState, i32SoMaxConn);
+
         char *pszBindIP = NULL;
         GET_STRING_ALLOC(rc, pThis, pCfg, "BindIP", pszBindIP);
-        rc = slirp_set_binding_address(pThis->pNATState, pszBindIP);
-        if (rc != 0 && pszBindIP && *pszBindIP)
-            LogRel(("NAT: Value of BindIP has been ignored\n"));
-
-        if(pszBindIP != NULL)
+        slirp_set_binding_address(pThis->pNATState, pszBindIP);
+        if (pszBindIP != NULL)
             MMR3HeapFree(pszBindIP);
+
 #define SLIRP_SET_TUNING_VALUE(name, setter)                    \
             do                                                  \
Index: /trunk/src/VBox/Devices/Network/slirp/slirp.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 68443)
+++ /trunk/src/VBox/Devices/Network/slirp/slirp.c	(revision 68444)
@@ -1694,10 +1694,30 @@
 int slirp_set_binding_address(PNATState pData, char *addr)
 {
-    if (addr == NULL || (inet_aton(addr, &pData->bindIP) == 0))
-    {
+    int ok;
+
+    pData->bindIP.s_addr = INADDR_ANY;
+
+    if (addr == NULL || *addr == '\0')
+        return VINF_SUCCESS;
+
+    ok = inet_aton(addr, &pData->bindIP);
+    if (!ok)
+    {
+        LogRel(("NAT: Unable to parse binding address: %s\n", addr));
+        return VERR_INVALID_PARAMETER;
+    }
+
+    if (pData->bindIP.s_addr == INADDR_ANY)
+        return VINF_SUCCESS;
+
+    if ((pData->bindIP.s_addr & RT_N2H_U32_C(0xe0000000)) == RT_N2H_U32_C(0xe0000000))
+    {
+        LogRel(("NAT: Ignoring multicast binding address %RTnaipv4\n", pData->bindIP.s_addr));
         pData->bindIP.s_addr = INADDR_ANY;
-        return 1;
-    }
-    return 0;
+        return VERR_INVALID_PARAMETER;
+    }
+
+    LogRel(("NAT: Binding address %RTnaipv4\n", pData->bindIP.s_addr));
+    return VINF_SUCCESS;
 }
 
Index: /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c
===================================================================
--- /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c	(revision 68443)
+++ /trunk/src/VBox/Devices/Network/slirp/tcp_subr.c	(revision 68444)
@@ -417,4 +417,19 @@
         opt = 1;
         setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(opt));
+
+        if (pData->bindIP.s_addr != INADDR_ANY)
+        {
+            struct sockaddr_in self;
+            self.sin_family = AF_INET;
+            self.sin_addr = pData->bindIP;
+            self.sin_port = 0;
+
+            ret = bind(s, (struct sockaddr *)&self, sizeof(self));
+            if (ret != 0)
+            {
+                Log2(("NAT: bind(%RTnaipv4): %s\n", pData->bindIP.s_addr, strerror(errno)));
+                return ret;
+            }
+        }
 
         addr.sin_family = AF_INET;
Index: /trunk/src/VBox/Main/src-server/NATEngineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/NATEngineImpl.cpp	(revision 68443)
+++ /trunk/src/VBox/Main/src-server/NATEngineImpl.cpp	(revision 68444)
@@ -403,5 +403,19 @@
 HRESULT NATEngine::setHostIP(const com::Utf8Str &aHostIP)
 {
-    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+    if (aHostIP.isNotEmpty())
+    {
+        RTNETADDRIPV4 addr;
+
+        /* parses as an IPv4 address */
+        int rc = RTNetStrToIPv4Addr(aHostIP.c_str(), &addr);
+        if (RT_FAILURE(rc))
+            return E_INVALIDARG;
+
+        /* is a unicast address */
+        if ((addr.u & RT_N2H_U32_C(0xe0000000)) == RT_N2H_U32_C(0xe0000000))
+            return E_INVALIDARG;
+    }
+
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);    
     if (mData->m->strBindIP != aHostIP)
     {
