diff --git a/daemon/rib/service.cpp b/daemon/rib/service.cpp
index f7b4719..f98d771 100644
--- a/daemon/rib/service.cpp
+++ b/daemon/rib/service.cpp
@@ -34,17 +34,17 @@
 #include "common/global.hpp"
 #include "common/logger.hpp"
 
-#include <boost/property_tree/info_parser.hpp>
-#include <ndn-cxx/transport/tcp-transport.hpp>
-#include <ndn-cxx/transport/unix-transport.hpp>
+#include "ns3/node-list.h"
+#include "ns3/node.h"
+#include "ns3/simulator.h"
+
+#include "ns3/ndnSIM/model/ndn-l3-protocol.hpp"
 
 namespace nfd {
 namespace rib {
 
 NFD_LOG_INIT(RibService);
 
-Service* Service::s_instance = nullptr;
-
 const std::string CFG_SECTION = "rib";
 const std::string CFG_LOCALHOST_SECURITY = "localhost_security";
 const std::string CFG_LOCALHOP_SECURITY = "localhop_security";
@@ -55,48 +55,8 @@
 const uint64_t PROPAGATE_DEFAULT_COST = 15;
 const time::milliseconds PROPAGATE_DEFAULT_TIMEOUT = 10_s;
 
-static ConfigSection
-loadConfigSectionFromFile(const std::string& filename)
-{
-  ConfigSection config;
-  // Any format errors should have been caught already
-  boost::property_tree::read_info(filename, config);
-  return config;
-}
-
-/**
- * \brief Look into the config file and construct appropriate transport to communicate with NFD
- * If NFD-RIB instance was initialized with config file, INFO format is assumed
- */
-static shared_ptr<ndn::Transport>
-makeLocalNfdTransport(const ConfigSection& config)
-{
-  if (config.get_child_optional("face_system.unix")) {
-    // default socket path should be the same as in UnixStreamFactory::processConfig
-    auto path = config.get<std::string>("face_system.unix.path", "/var/run/nfd.sock");
-    return make_shared<ndn::UnixTransport>(path);
-  }
-  else if (config.get_child_optional("face_system.tcp") &&
-           config.get<std::string>("face_system.tcp.listen", "yes") == "yes") {
-    // default port should be the same as in TcpFactory::processConfig
-    auto port = config.get<std::string>("face_system.tcp.port", "6363");
-    return make_shared<ndn::TcpTransport>("localhost", port);
-  }
-  else {
-    NDN_THROW(ConfigFile::Error("No transport is available to communicate with NFD"));
-  }
-}
-
-Service::Service(const std::string& configFile, ndn::KeyChain& keyChain)
-  : Service(keyChain, makeLocalNfdTransport(loadConfigSectionFromFile(configFile)),
-            [&configFile] (ConfigFile& config, bool isDryRun) {
-              config.parse(configFile, isDryRun);
-            })
-{
-}
-
-Service::Service(const ConfigSection& configSection, ndn::KeyChain& keyChain)
-  : Service(keyChain, makeLocalNfdTransport(configSection),
+Service::Service(const ConfigSection& configSection, ndn::Face& face, ndn::KeyChain& keyChain)
+  : Service(keyChain, face,
             [&configSection] (ConfigFile& config, bool isDryRun) {
               config.parse(configSection, isDryRun, "internal://nfd.conf");
             })
@@ -104,23 +64,15 @@
 }
 
 template<typename ConfigParseFunc>
-Service::Service(ndn::KeyChain& keyChain, shared_ptr<ndn::Transport> localNfdTransport,
-                 const ConfigParseFunc& configParse)
+Service::Service(ndn::KeyChain& keyChain, ndn::Face& face, const ConfigParseFunc& configParse)
   : m_keyChain(keyChain)
-  , m_face(std::move(localNfdTransport), getGlobalIoService(), m_keyChain)
+  , m_face(face)
+  , m_scheduler(m_face.getIoService())
   , m_nfdController(m_face, m_keyChain)
   , m_fibUpdater(m_rib, m_nfdController)
   , m_dispatcher(m_face, m_keyChain)
   , m_ribManager(m_rib, m_face, m_keyChain, m_nfdController, m_dispatcher)
 {
-  if (s_instance != nullptr) {
-    NDN_THROW(std::logic_error("RIB service cannot be instantiated more than once"));
-  }
-  if (&getGlobalIoService() != &getRibIoService()) {
-    NDN_THROW(std::logic_error("RIB service must run on RIB thread"));
-  }
-  s_instance = this;
-
   ConfigFile config(ConfigFile::ignoreUnknownSection);
   config.addSectionHandler(CFG_SECTION, bind(&Service::processConfig, this, _1, _2, _3));
   configParse(config, true);
@@ -132,19 +84,14 @@
 
 Service::~Service()
 {
-  s_instance = nullptr;
 }
 
 Service&
 Service::get()
 {
-  if (s_instance == nullptr) {
-    NDN_THROW(std::logic_error("RIB service is not instantiated"));
-  }
-  if (&getGlobalIoService() != &getRibIoService()) {
-    NDN_THROW(std::logic_error("Must get RIB service on RIB thread"));
-  }
-  return *s_instance;
+  auto node = ::ns3::NodeList::GetNode(::ns3::Simulator::GetContext());
+  auto l3 = node->GetObject<::ns3::ndn::L3Protocol>();
+  return l3->getRibService();
 }
 
 void
diff --git a/daemon/rib/service.hpp b/daemon/rib/service.hpp
index ca5f57b..21f7d77 100644
--- a/daemon/rib/service.hpp
+++ b/daemon/rib/service.hpp
@@ -52,26 +52,7 @@
 class Service : noncopyable
 {
 public:
-  /**
-   * \brief create NFD-RIB service
-   * \param configFile absolute or relative path of configuration file
-   * \param keyChain the KeyChain
-   * \throw std::logic_error Instance of rib::Service has been already constructed
-   * \throw std::logic_error Instance of rib::Service is not constructed on RIB thread
-   */
-  Service(const std::string& configFile, ndn::KeyChain& keyChain);
-
-  /**
-   * \brief create NFD-RIB service
-   * \param configSection parsed configuration section
-   * \param keyChain the KeyChain
-   * \note This constructor overload is more appropriate for integrated environments,
-   *       such as NS-3 or android. Error messages related to configuration file
-   *       will use "internal://nfd.conf" as configuration filename.
-   * \throw std::logic_error Instance of rib::Service has been already constructed
-   * \throw std::logic_error Instance of rib::Service is not constructed on RIB thread
-   */
-  Service(const ConfigSection& configSection, ndn::KeyChain& keyChain);
+  Service(const ConfigSection& configSection, ndn::Face& face, ndn::KeyChain& keyChain);
 
   /**
    * \brief Destructor
@@ -94,7 +75,7 @@
 
 private:
   template<typename ConfigParseFunc>
-  Service(ndn::KeyChain& keyChain, shared_ptr<ndn::Transport> localNfdTransport,
+  Service(ndn::KeyChain& keyChain, ndn::Face& face,
           const ConfigParseFunc& configParse);
 
   void
@@ -107,10 +88,9 @@
   applyConfig(const ConfigSection& section, const std::string& filename);
 
 private:
-  static Service* s_instance;
-
   ndn::KeyChain& m_keyChain;
-  ndn::Face m_face;
+  ndn::Face& m_face;
+  ndn::util::Scheduler m_scheduler;
   ndn::nfd::Controller m_nfdController;
 
   Rib m_rib;
