diff --git a/src/init.cpp b/src/init.cpp
index 48fd5ae97..1eee4d247 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -3,11 +3,12 @@
 // Distributed under the MIT/X11 software license, see the accompanying
 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 
+#include "init.h"
+#include "main.h"
 #include "txdb.h"
 #include "walletdb.h"
 #include "bitcoinrpc.h"
 #include "net.h"
-#include "init.h"
 #include "util.h"
 #include "ui_interface.h"
 #include "checkpoints.h"
@@ -569,6 +570,10 @@ bool AppInit2(boost::thread_group& threadGroup)
 
     // ********************************************************* Step 6: network initialization
 
+    SetProcessMessagesHandler(ProcessMessages);
+    SetSendMessagesHandler(SendMessages);
+    SetStartShutdownHandler(StartShutdown);
+    
     int nSocksVersion = GetArg("-socks", 5);
     if (nSocksVersion != 4 && nSocksVersion != 5)
         return InitError(strprintf(_("Unknown -socks proxy version requested: %i"), nSocksVersion));
diff --git a/src/net.cpp b/src/net.cpp
index 7a1fcc503..5932f5f8e 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -5,7 +5,7 @@
 
 #include "db.h"
 #include "net.h"
-#include "init.h"
+#include "main.h"
 #include "addrman.h"
 #include "ui_interface.h"
 #include "script.h"
@@ -68,6 +68,28 @@ CCriticalSection cs_vAddedNodes;
 
 static CSemaphore *semOutbound = NULL;
 
+//
+// Handlers that need to be registered
+//
+static ProcessMessagesHandler fnProcessMessages = NULL;
+static SendMessagesHandler fnSendMessages = NULL;
+static StartShutdownHandler fnStartShutdown = NULL;
+
+void SetProcessMessagesHandler(ProcessMessagesHandler handler)
+{
+    fnProcessMessages = handler;
+}
+
+void SetSendMessagesHandler(SendMessagesHandler handler)
+{
+    fnSendMessages = handler;
+}
+
+void SetStartShutdownHandler(StartShutdownHandler handler)
+{
+    fnStartShutdown = handler;
+}
+
 void AddOneShot(string strDest)
 {
     LOCK(cs_vOneShots);
@@ -1632,8 +1654,8 @@ void ThreadMessageHandler()
             // Send messages
             {
                 TRY_LOCK(pnode->cs_vSend, lockSend);
-                if (lockSend)
-                    SendMessages(pnode, pnode == pnodeTrickle);
+                if (lockSend && fnSendMessages)
+                    fnSendMessages(pnode, pnode == pnodeTrickle);
             }
             boost::this_thread::interruption_point();
         }
diff --git a/src/net.h b/src/net.h
index 6f7bea939..1c8c99aa3 100644
--- a/src/net.h
+++ b/src/net.h
@@ -45,6 +45,17 @@ void StartNode(boost::thread_group& threadGroup);
 bool StopNode();
 void SocketSendData(CNode *pnode);
 
+//
+// Handlers that require registration
+//
+typedef bool (*ProcessMessagesHandler)(CNode* pfrom);
+typedef bool (*SendMessagesHandler)(CNode* pto, bool fSendTrickle);
+typedef void (*StartShutdownHandler)();
+
+void SetProcessMessagesHandler(ProcessMessagesHandler handler);
+void SetSendMessagesHandler(SendMessagesHandler handler);
+void SetStartShutdownHandler(StartShutdownHandler handler);
+
 enum
 {
     LOCAL_NONE,   // unknown
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 88bbe49af..1e22467a3 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -6,7 +6,6 @@
 #include "protocol.h"
 #include "util.h"
 #include "netbase.h"
-#include "main.h"
 
 #ifndef WIN32
 # include <arpa/inet.h>