Index: /trunk/src/VBox/NetworkServices/NAT/Makefile.kmk
===================================================================
--- /trunk/src/VBox/NetworkServices/NAT/Makefile.kmk	(revision 49834)
+++ /trunk/src/VBox/NetworkServices/NAT/Makefile.kmk	(revision 49835)
@@ -48,5 +48,6 @@
 	../NetLib/VBoxNetIntIf.cpp \
 	../NetLib/VBoxNetUDP.cpp \
-	../NetLib/VBoxNetARP.cpp
+	../NetLib/VBoxNetARP.cpp \
+	../NetLib/ComHostUtils.cpp
 
 VBoxNetLwipNAT_LIBS = \
Index: /trunk/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
===================================================================
--- /trunk/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp	(revision 49834)
+++ /trunk/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp	(revision 49835)
@@ -70,4 +70,5 @@
 #endif
 
+#include <map>
 #include <vector>
 #include <string>
@@ -75,4 +76,5 @@
 #include "../NetLib/VBoxNetLib.h"
 #include "../NetLib/VBoxNetBaseService.h"
+#include "../NetLib/utils.h"
 #include "VBoxLwipCore.h"
 
@@ -118,38 +120,6 @@
 
 
-class VBoxNetLwipNAT;
-
-
-class NATNetworkListener
-{
-public:
-    NATNetworkListener():m_pNAT(NULL){}
-
-    HRESULT init(VBoxNetLwipNAT *pNAT)
-    {
-        AssertPtrReturn(pNAT, E_INVALIDARG);
-
-        m_pNAT = pNAT;
-        return S_OK;
-    }
-
-    HRESULT init()
-    {
-        m_pNAT = NULL;
-        return S_OK;
-    }
-
-    void uninit() { m_pNAT = NULL; }
-
-    STDMETHOD(HandleEvent)(VBoxEventType_T aEventType, IEvent *pEvent);
-
-private:
-    VBoxNetLwipNAT *m_pNAT;
-};
-typedef ListenerImpl<NATNetworkListener, VBoxNetLwipNAT *> NATNetworkListenerImpl;
-VBOX_LISTENER_DECLARE(NATNetworkListenerImpl)
-
-
-class VBoxNetLwipNAT: public VBoxNetBaseService
+
+class VBoxNetLwipNAT: public VBoxNetBaseService, public NATNetworkEventAdapter
 {
     friend class NATNetworkListener;
@@ -185,11 +155,11 @@
     /* Our NAT network descriptor in Main */
     ComPtr<INATNetwork> m_net;
-    ComObjPtr<NATNetworkListenerImpl> m_listener;
+    ComNatListenerPtr m_listener;
 
     ComPtr<IHost> m_host;
-    ComObjPtr<NATNetworkListenerImpl> m_vboxListener;
+    ComNatListenerPtr m_vboxListener;
     static INTNETSEG aXmitSeg[64];
 
-    STDMETHOD(HandleEvent)(VBoxEventType_T aEventType, IEvent *pEvent);
+    HRESULT HandleEvent(VBoxEventType_T aEventType, IEvent *pEvent);
 
     const char **getHostNameservers();
@@ -215,14 +185,4 @@
 static VBoxNetLwipNAT *g_pLwipNat;
 INTNETSEG VBoxNetLwipNAT::aXmitSeg[64];
-
-STDMETHODIMP NATNetworkListener::HandleEvent(VBoxEventType_T aEventType, IEvent *pEvent)
-{
-    if (m_pNAT)
-        return m_pNAT->HandleEvent(aEventType, pEvent);
-    else
-        return E_FAIL;
-}
-
-
 
 STDMETHODIMP VBoxNetLwipNAT::HandleEvent(VBoxEventType_T aEventType,
@@ -740,5 +700,4 @@
 int VBoxNetLwipNAT::init()
 {
-    HRESULT hrc;
     LogFlowFuncEnter();
 
@@ -748,44 +707,23 @@
 
     std::string networkName = getNetwork();
-    hrc = virtualbox->FindNATNetworkByName(com::Bstr(networkName.c_str()).raw(),
-                                                  m_net.asOutParam());
-    AssertComRCReturn(hrc, VERR_NOT_FOUND);
-
-    hrc = m_listener.createObject();
-    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
-
-    hrc = m_listener->init(new NATNetworkListener(), this);
-    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
-
-    ComPtr<IEventSource> esNet;
-    hrc = m_net->COMGETTER(EventSource)(esNet.asOutParam());
-    AssertComRC(hrc);
-
-    com::SafeArray<VBoxEventType_T> aNetEvents;
+    rc = findNatNetwork(virtualbox, networkName, m_net);
+    AssertRCReturn(rc, rc);
+
+    ComEventTypeArray aNetEvents;
     aNetEvents.push_back(VBoxEventType_OnNATNetworkPortForward);
     aNetEvents.push_back(VBoxEventType_OnNATNetworkSetting);
-    hrc = esNet->RegisterListener(m_listener, ComSafeArrayAsInParam(aNetEvents), true);
-    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+    rc = createNatListener(m_listener, virtualbox, this, aNetEvents);
+    AssertRCReturn(rc, rc);
 
 
     // resolver changes are reported on vbox but are retrieved from
     // host so stash a pointer for future lookups
-    hrc = virtualbox->COMGETTER(Host)(m_host.asOutParam());
+    HRESULT hrc = virtualbox->COMGETTER(Host)(m_host.asOutParam());
     AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
 
-    hrc = m_vboxListener.createObject();
-    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
-
-    hrc = m_vboxListener->init(new NATNetworkListener(), this);
-    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
-
-    ComPtr<IEventSource> esVBox;
-    hrc = virtualbox->COMGETTER(EventSource)(esVBox.asOutParam());
-    AssertComRC(hrc);
-
-    com::SafeArray<VBoxEventType_T> aVBoxEvents;
+    ComEventTypeArray aVBoxEvents;
     aVBoxEvents.push_back(VBoxEventType_OnHostNameResolutionConfigurationChange);
-    hrc = esVBox->RegisterListener(m_vboxListener, ComSafeArrayAsInParam(aVBoxEvents), true);
-    AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
+    rc = createNatListener(m_vboxListener, virtualbox, this, aVBoxEvents);
+    AssertRCReturn(rc, rc);
 
     BOOL fIPv6Enabled = FALSE;
