diff --git a/tools/network.hpp b/core/network.cpp
similarity index 63%
rename from tools/network.hpp
rename to core/network.cpp
index 044b915..b9a6c36 100644
--- a/tools/network.hpp
+++ b/core/network.cpp
@@ -1,11 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014  Regents of the University of California,
- *                     Arizona Board of Regents,
- *                     Colorado State University,
- *                     University Pierre & Marie Curie, Sorbonne University,
- *                     Washington University in St. Louis,
- *                     Beijing Institute of Technology
+ * Copyright (c) 2014,  Regents of the University of California,
+ *                      Arizona Board of Regents,
+ *                      Colorado State University,
+ *                      University Pierre & Marie Curie, Sorbonne University,
+ *                      Washington University in St. Louis,
+ *                      Beijing Institute of Technology,
+ *                      The University of Memphis
  *
  * This file is part of NFD (Named Data Networking Forwarding Daemon).
  * See AUTHORS.md for complete list of NFD authors and contributors.
@@ -22,74 +23,45 @@
  * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
  **/
 
-#ifndef NFD_TOOLS_NETWORK_HPP
-#define NFD_TOOLS_NETWORK_HPP
+#include "network.hpp"
 
-#include <boost/asio.hpp>
+namespace nfd {
 
-class Network
+void
+Network::print(std::ostream& os) const
 {
-public:
-  Network()
-  {
-  }
+  os << m_minAddress << " <-> " << m_maxAddress;
+}
 
-  Network(const boost::asio::ip::address& minAddress,
-          const boost::asio::ip::address& maxAddress)
-    : m_minAddress(minAddress)
-    , m_maxAddress(maxAddress)
-  {
-  }
+const Network&
+Network::getMaxRangeV4()
+{
+  using boost::asio::ip::address_v4;
+  static Network range = Network(address_v4(0), address_v4(0xFFFFFFFF));
+  return range;
+}
 
-  void
-  print(std::ostream& os) const
-  {
-    os << m_minAddress << " <-> " << m_maxAddress;
-  }
+const Network&
+Network::getMaxRangeV6()
+{
+  using boost::asio::ip::address_v6;
+  static address_v6::bytes_type maxV6 = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+                                          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
+  static Network range = Network(address_v6(), address_v6(maxV6));
+  return range;
+}
 
-  bool
-  doesContain(const boost::asio::ip::address& address) const
-  {
-    return (m_minAddress <= address && address <= m_maxAddress);
-  }
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
 
-  static const Network&
-  getMaxRangeV4()
-  {
-    using boost::asio::ip::address_v4;
-    static Network range = Network(address_v4(0), address_v4(0xFFFFFFFF));
-    return range;
-  }
-
-  static const Network&
-  getMaxRangeV6()
-  {
-    using boost::asio::ip::address_v6;
-    static address_v6::bytes_type maxV6 = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-                                            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
-    static Network range = Network(address_v6(), address_v6(maxV6));
-    return range;
-  }
-
-private:
-  boost::asio::ip::address m_minAddress;
-  boost::asio::ip::address m_maxAddress;
-
-  friend std::istream&
-  operator>>(std::istream& is, Network& network);
-
-  friend std::ostream&
-  operator<<(std::ostream& os, const Network& network);
-};
-
-inline std::ostream&
+std::ostream&
 operator<<(std::ostream& os, const Network& network)
 {
   network.print(os);
   return os;
 }
 
-inline std::istream&
+std::istream&
 operator>>(std::istream& is, Network& network)
 {
   using namespace boost::asio;
@@ -158,4 +130,4 @@
   return is;
 }
 
-#endif // NFD_TOOLS_NETWORK_HPP
+} // namespace nfd
diff --git a/core/network.hpp b/core/network.hpp
new file mode 100644
index 0000000..1c0f6d3
--- /dev/null
+++ b/core/network.hpp
@@ -0,0 +1,95 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014,  Regents of the University of California,
+ *                      Arizona Board of Regents,
+ *                      Colorado State University,
+ *                      University Pierre & Marie Curie, Sorbonne University,
+ *                      Washington University in St. Louis,
+ *                      Beijing Institute of Technology,
+ *                      The University of Memphis
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon).
+ * See AUTHORS.md for complete list of NFD authors and contributors.
+ *
+ * NFD is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NFD_CORE_NETWORK_HPP
+#define NFD_CORE_NETWORK_HPP
+
+#include <boost/asio.hpp>
+#include <boost/utility/value_init.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace nfd {
+
+class Network
+{
+public:
+  Network()
+  {
+  }
+
+  Network(const boost::asio::ip::address& minAddress,
+          const boost::asio::ip::address& maxAddress)
+    : m_minAddress(minAddress)
+    , m_maxAddress(maxAddress)
+  {
+  }
+
+  void
+  print(std::ostream& os) const;
+
+  bool
+  doesContain(const boost::asio::ip::address& address) const
+  {
+    return (m_minAddress <= address && address <= m_maxAddress);
+  }
+
+  static const Network&
+  getMaxRangeV4();
+
+  static const Network&
+  getMaxRangeV6();
+
+  bool
+  operator==(const Network& rhs) const
+  {
+    return m_minAddress == rhs.m_minAddress && m_maxAddress == rhs.m_maxAddress;
+  }
+
+  bool
+  operator!=(const Network& rhs) const
+  {
+    return !(*this == rhs);
+  }
+
+private:
+  boost::asio::ip::address m_minAddress;
+  boost::asio::ip::address m_maxAddress;
+
+  friend std::istream&
+  operator>>(std::istream& is, Network& network);
+
+  friend std::ostream&
+  operator<<(std::ostream& os, const Network& network);
+};
+
+std::ostream&
+operator<<(std::ostream& os, const Network& network);
+
+std::istream&
+operator>>(std::istream& is, Network& network);
+
+} // namespace nfd
+
+#endif // NFD_CORE_NETWORK_HPP
diff --git a/tests/core/network.cpp b/tests/core/network.cpp
new file mode 100644
index 0000000..866d0b7
--- /dev/null
+++ b/tests/core/network.cpp
@@ -0,0 +1,150 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014,  Regents of the University of California,
+ *                      Arizona Board of Regents,
+ *                      Colorado State University,
+ *                      University Pierre & Marie Curie, Sorbonne University,
+ *                      Washington University in St. Louis,
+ *                      Beijing Institute of Technology,
+ *                      The University of Memphis
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon).
+ * See AUTHORS.md for complete list of NFD authors and contributors.
+ *
+ * NFD is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "core/network.hpp"
+
+#include "tests/test-common.hpp"
+
+namespace nfd {
+namespace tests {
+
+BOOST_FIXTURE_TEST_SUITE(CoreNetwork, BaseFixture)
+
+using boost::asio::ip::address;
+
+BOOST_AUTO_TEST_CASE(Empty)
+{
+  Network n;
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.2.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:0:3025:ccc5:eeeb:86d3")),
+                    false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("0.0.0.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("255.255.255.255")), false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("::")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")),
+                    false);
+}
+
+BOOST_AUTO_TEST_CASE(MaxRangeV4)
+{
+  Network n = Network::getMaxRangeV4();
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.2.1")), true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:1:3025:ccc5:eeeb:86d3")),
+                    false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("0.0.0.1")), true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("255.255.255.255")), true);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("::")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")),
+                    false);
+}
+
+BOOST_AUTO_TEST_CASE(RangeV4)
+{
+  Network n = boost::lexical_cast<Network>("192.0.2.0/24");
+  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(n), "192.0.2.0 <-> 192.0.2.255");
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.2.1")), true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.2.254")), true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.1.255")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.3.0")), false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:1:3025:ccc5:eeeb:86d3")),
+                    false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("0.0.0.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("255.255.255.255")), false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("::")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")),
+                    false);
+}
+
+BOOST_AUTO_TEST_CASE(MaxRangeV6)
+{
+  Network n = Network::getMaxRangeV6();
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.2.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:1:3025:ccc5:eeeb:86d3")),
+                    true);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("0.0.0.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("255.255.255.255")), false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("::")), true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")),
+                    true);
+}
+
+BOOST_AUTO_TEST_CASE(RangeV6)
+{
+  Network n = boost::lexical_cast<Network>("2001:db8:3f9:1::/64");
+  BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(n),
+                    "2001:db8:3f9:1:: <-> 2001:db8:3f9:1:ffff:ffff:ffff:ffff");
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("192.0.2.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:1:3025:ccc5:eeeb:86d3")),
+                    true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:1::")),
+                    true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:1:ffff:ffff:ffff:ffff")),
+                    true);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:0:ffff:ffff:ffff:ffff")),
+                    false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("2001:db8:3f9:2::")),
+                    false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("0.0.0.1")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("255.255.255.255")), false);
+
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("::")), false);
+  BOOST_CHECK_EQUAL(n.doesContain(address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")),
+                    false);
+}
+
+BOOST_AUTO_TEST_CASE(Comparisons)
+{
+  BOOST_CHECK_EQUAL(boost::lexical_cast<Network>("192.0.2.0/24"),
+                    boost::lexical_cast<Network>("192.0.2.127/24"));
+
+  BOOST_CHECK_EQUAL(boost::lexical_cast<Network>("2001:db8:3f9:0::/64"),
+                    boost::lexical_cast<Network>("2001:db8:3f9:0:ffff::/64"));
+
+  BOOST_CHECK_NE(boost::lexical_cast<Network>("192.0.2.0/24"),
+                 boost::lexical_cast<Network>("192.0.3.127/24"));
+
+  BOOST_CHECK_NE(boost::lexical_cast<Network>("2001:db8:3f9:0::/64"),
+                 boost::lexical_cast<Network>("2001:db8:3f9:1::/64"));
+
+  BOOST_CHECK_NE(boost::lexical_cast<Network>("192.0.2.0/24"),
+                 boost::lexical_cast<Network>("2001:db8:3f9:0::/64"));
+}
+
+BOOST_AUTO_TEST_SUITE_END() // CoreNetwork
+
+} // namespace tests
+} // namespace nfd
diff --git a/tools/nfd-autoreg.cpp b/tools/nfd-autoreg.cpp
index 0b6f7a5..dc013ea 100644
--- a/tools/nfd-autoreg.cpp
+++ b/tools/nfd-autoreg.cpp
@@ -37,7 +37,7 @@
 
 #include "version.hpp"
 #include "core/face-uri.hpp"
-#include "network.hpp"
+#include "core/network.hpp"
 
 namespace po = boost::program_options;
 
