diff --git a/contrib/epee/include/md5_l.inl b/contrib/epee/include/md5_l.inl
index 2aa881092..8e339e006 100644
--- a/contrib/epee/include/md5_l.inl
+++ b/contrib/epee/include/md5_l.inl
@@ -58,14 +58,11 @@ These notices must be retained in any copies of any part of this
 documentation and/or software.
 */
 
-/* do i need all of this just for htonl()? damn. */
-//#include <sys/types.h>
-//#include <sys/param.h>
-//#include <sys/socket.h>
-//#include <netinet/in.h>
-
-
-
+#ifdef _WIN32
+# include <winsock2.h>
+#else
+# include <arpa/inet.h>
+#endif
 #include "md5global.h"
 #include "md5_l.h"
 #include "hmac-md5.h"
diff --git a/contrib/epee/include/net/levin_protocol_handler_async.h b/contrib/epee/include/net/levin_protocol_handler_async.h
index cc6987e8f..891089be6 100644
--- a/contrib/epee/include/net/levin_protocol_handler_async.h
+++ b/contrib/epee/include/net/levin_protocol_handler_async.h
@@ -25,6 +25,7 @@
 // 
 
 #pragma once
+#include <boost/asio/deadline_timer.hpp>
 #include <boost/uuid/uuid_generators.hpp>
 #include <boost/unordered_map.hpp>
 #include <boost/interprocess/detail/atomic.hpp>
diff --git a/contrib/epee/include/net/net_utils_base.h b/contrib/epee/include/net/net_utils_base.h
index 76f247e83..4334029f7 100644
--- a/contrib/epee/include/net/net_utils_base.h
+++ b/contrib/epee/include/net/net_utils_base.h
@@ -29,6 +29,7 @@
 #ifndef _NET_UTILS_BASE_H_
 #define _NET_UTILS_BASE_H_
 
+#include <boost/asio/io_service.hpp>
 #include <boost/uuid/uuid.hpp>
 #include "string_tools.h"
 #include "misc_log_ex.h"
diff --git a/contrib/epee/include/string_tools.h b/contrib/epee/include/string_tools.h
index 6292e471c..530000028 100644
--- a/contrib/epee/include/string_tools.h
+++ b/contrib/epee/include/string_tools.h
@@ -29,17 +29,21 @@
 #ifndef _STRING_TOOLS_H_
 #define _STRING_TOOLS_H_
 
+// Previously pulled in by ASIO, further cleanup still required ...
+#ifdef _WIN32
+# include <winsock2.h>
+# include <windows.h>
+#endif
+
 //#include <objbase.h>
 #include <locale>
 #include <cstdlib>
 #include <iomanip>
+#include <map>
 #include <type_traits>
-//#include <strsafe.h>
 #include <boost/uuid/uuid.hpp>
 #include <boost/uuid/uuid_io.hpp>
 #include <boost/lexical_cast.hpp>
-#include <boost/asio.hpp>
-#include <boost/algorithm/string/compare.hpp>
 #include <boost/algorithm/string.hpp>
 #include "warnings.h"
 
@@ -327,26 +331,9 @@ POP_WARNINGS
   }
 
 	//----------------------------------------------------------------------------
-//#ifdef _WINSOCK2API_
-	inline std::string get_ip_string_from_int32(uint32_t ip)
-	{
-		in_addr adr;
-		adr.s_addr = ip;
-		const char* pbuf = inet_ntoa(adr);
-		if(pbuf)
-			return pbuf;
-		else
-			return "[failed]";
-	}
+	std::string get_ip_string_from_int32(uint32_t ip);
 	//----------------------------------------------------------------------------
-	inline bool get_ip_int32_from_string(uint32_t& ip, const std::string& ip_str)
-	{
-		ip = inet_addr(ip_str.c_str());
-		if(INADDR_NONE == ip)
-			return false;
-
-		return true;
-	}
+	bool get_ip_int32_from_string(uint32_t& ip, const std::string& ip_str);
   //----------------------------------------------------------------------------
   inline bool parse_peer_from_string(uint32_t& ip, uint32_t& port, const std::string& addres)
   {
@@ -376,7 +363,6 @@ POP_WARNINGS
     return true;
   }
 
-//#endif
 	//----------------------------------------------------------------------------
   template<typename t>
 	inline std::string get_t_as_hex_nwidth(const t& v, std::streamsize w = 8)
diff --git a/contrib/epee/src/CMakeLists.txt b/contrib/epee/src/CMakeLists.txt
index c07a90e9f..1e79755e5 100644
--- a/contrib/epee/src/CMakeLists.txt
+++ b/contrib/epee/src/CMakeLists.txt
@@ -26,8 +26,7 @@
 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-add_library(epee STATIC http_auth.cpp mlog.cpp)
-
+add_library(epee STATIC http_auth.cpp mlog.cpp string_tools.cpp)
 # Build and install libepee if we're building for GUI
 if (BUILD_GUI_DEPS)
     if(IOS)
diff --git a/contrib/epee/src/string_tools.cpp b/contrib/epee/src/string_tools.cpp
new file mode 100644
index 000000000..c861cb1d6
--- /dev/null
+++ b/contrib/epee/src/string_tools.cpp
@@ -0,0 +1,60 @@
+// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Andrey N. Sabelnikov nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER  BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+#include "string_tools.h"
+
+#ifdef _WIN32
+# include <winsock2.h>
+#else
+# include <arpa/inet.h>
+#endif
+
+namespace epee
+{
+namespace string_tools
+{
+  std::string get_ip_string_from_int32(uint32_t ip)
+  {
+    in_addr adr;
+    adr.s_addr = ip;
+    const char* pbuf = inet_ntoa(adr);
+    if(pbuf)
+      return pbuf;
+    else
+      return "[failed]";
+  }
+  //----------------------------------------------------------------------------
+  bool get_ip_int32_from_string(uint32_t& ip, const std::string& ip_str)
+  {
+    ip = inet_addr(ip_str.c_str());
+    if(INADDR_NONE == ip)
+      return false;
+
+    return true;
+  }
+}
+}
+
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h
index 7dac608c1..9dacba363 100644
--- a/src/cryptonote_core/blockchain.h
+++ b/src/cryptonote_core/blockchain.h
@@ -29,6 +29,7 @@
 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
 
 #pragma once
+#include <boost/asio/io_service.hpp>
 #include <boost/serialization/serialization.hpp>
 #include <boost/serialization/version.hpp>
 #include <boost/serialization/list.hpp>
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt
index 0ff8d5842..3c0e8067e 100644
--- a/tests/unit_tests/CMakeLists.txt
+++ b/tests/unit_tests/CMakeLists.txt
@@ -40,6 +40,7 @@ set(unit_tests_sources
   dns_resolver.cpp
   epee_boosted_tcp_server.cpp
   epee_levin_protocol_handler_async.cpp
+  epee_utils.cpp
   fee.cpp
   get_xtype_from_string.cpp
   http.cpp
diff --git a/tests/unit_tests/epee_utils.cpp b/tests/unit_tests/epee_utils.cpp
new file mode 100644
index 000000000..25b2bddd9
--- /dev/null
+++ b/tests/unit_tests/epee_utils.cpp
@@ -0,0 +1,97 @@
+// Copyright (c) 2014-2017, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <array>
+#ifdef _WIN32
+# include <winsock.h>
+#else
+# include <arpa/inet.h>
+#endif
+
+#include <cstdint>
+#include <gtest/gtest.h>
+#include <string>
+
+#include "string_tools.h"
+
+TEST(StringTools, GetIpString)
+{
+  EXPECT_EQ(
+    std::string{"0.0.0.0"}, epee::string_tools::get_ip_string_from_int32(0)
+  );
+  EXPECT_EQ(
+    std::string{"255.0.255.0"},
+    epee::string_tools::get_ip_string_from_int32(htonl(0xff00ff00))
+  );
+  EXPECT_EQ(
+    std::string{"255.255.255.255"},
+    epee::string_tools::get_ip_string_from_int32(htonl(0xffffffff))
+  );
+}
+
+TEST(StringTools, GetIpInt32)
+{
+  std::uint32_t ip = 0;
+  EXPECT_FALSE(epee::string_tools::get_ip_int32_from_string(ip, ""));
+  EXPECT_FALSE(epee::string_tools::get_ip_int32_from_string(ip, "1."));
+  EXPECT_FALSE(epee::string_tools::get_ip_int32_from_string(ip, "1.1."));
+  EXPECT_FALSE(epee::string_tools::get_ip_int32_from_string(ip, "1.1.1."));
+  EXPECT_FALSE(epee::string_tools::get_ip_int32_from_string(ip, "ff.0.ff.0"));
+  EXPECT_FALSE(epee::string_tools::get_ip_int32_from_string(ip, "1.1.1.256"));
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "1"));
+  EXPECT_EQ(htonl(1), ip);
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "1.1"));
+  EXPECT_EQ(htonl(0x1000001), ip);
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "1.1.1"));
+  EXPECT_EQ(htonl(0x1010001), ip);
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "0.0.0.0"));
+  EXPECT_EQ(0, ip);
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "1.1.1.1"));
+  EXPECT_EQ(htonl(0x01010101), ip);
+
+/*
+  The existing epee conversion function does not work with 255.255.255.255, for
+  the reasons specified in the inet_addr documentation. Consider fixing in a
+  future patch. This address is not likely to be used for purposes within
+  monero.
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "255.255.255.255"));
+  EXPECT_EQ(htonl(0xffffffff), ip);
+*/
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "10.0377.0.0377"));
+  EXPECT_EQ(htonl(0xaff00ff), ip);
+
+  EXPECT_TRUE(epee::string_tools::get_ip_int32_from_string(ip, "0xff.10.0xff.0"));
+  EXPECT_EQ(htonl(0xff0aff00), ip);
+}
+