diff --git a/common.hpp b/common.hpp
index 0271006..b77604e 100644
--- a/common.hpp
+++ b/common.hpp
@@ -49,6 +49,7 @@
 #include <ndn-cxx/common.hpp>
 #include <ndn-cxx/interest.hpp>
 #include <ndn-cxx/data.hpp>
+#include <ndn-cxx/util/event-emitter.hpp>
 
 #include <boost/algorithm/string.hpp>
 #include <boost/asio.hpp>
@@ -86,6 +87,7 @@
 using ndn::Name;
 using ndn::Exclude;
 using ndn::Block;
+using ndn::util::EventEmitter;
 
 namespace tlv {
 // Don't write "namespace tlv = ndn::tlv", because NFD can add other members into this namespace.
diff --git a/core/event-emitter.hpp b/core/event-emitter.hpp
deleted file mode 100644
index e63e111..0000000
--- a/core/event-emitter.hpp
+++ /dev/null
@@ -1,356 +0,0 @@
-/* -*- 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_EVENT_EMITTER_HPP
-#define NFD_CORE_EVENT_EMITTER_HPP
-
-#include "common.hpp"
-
-namespace nfd {
-
-struct empty
-{
-};
-
-/** \class EventEmitter
- *  \brief provides a lightweight event system
- *
- *  To declare an event:
- *    EventEmitter<TArgs> onEventName;
- *  To subscribe to an event:
- *    eventSource->onEventName += eventHandler;
- *    Multiple functions can subscribe to the same event.
- *  To trigger an event:
- *    onEventName(args);
- *  To clear event subscriptions:
- *    onEventName.clear();
- */
-
-// four arguments
-template<typename T1 = empty, typename T2 = empty,
-         typename T3 = empty, typename T4 = empty>
-class EventEmitter : noncopyable
-{
-public:
-  /// represents a handler that can subscribe to the event
-  typedef function<void(const T1&, const T2&,
-                               const T3&, const T4&)> Handler;
-
-  /// adds an subscription
-  void
-  operator+=(Handler handler);
-
-  /// returns true if there is no subscription,
-  /// otherwise returns false
-  bool
-  isEmpty();
-
-  /// clears all subscriptions
-  void
-  clear();
-
-  /// triggers the event
-  void
-  operator()(const T1& a1, const T2& a2, const T3& a3, const T4& a4);
-
-private:
-  /// stores all subscribed handlers
-  std::vector<Handler> m_handlers;
-};
-
-// zero argument
-template<>
-class EventEmitter<empty, empty, empty, empty> : noncopyable
-{
-public:
-  typedef function<void()> Handler;
-
-  void
-  operator+=(Handler handler);
-
-  bool
-  isEmpty();
-
-  void
-  clear();
-
-  void
-  operator()();
-
-private:
-  std::vector<Handler> m_handlers;
-};
-
-
-// one argument
-template<typename T1>
-class EventEmitter<T1, empty, empty, empty> : noncopyable
-{
-public:
-  typedef function<void(const T1&)> Handler;
-
-  void
-  operator+=(Handler handler);
-
-  bool
-  isEmpty();
-
-  void
-  clear();
-
-  void
-  operator()(const T1& a1);
-
-private:
-  std::vector<Handler> m_handlers;
-};
-
-
-// two arguments
-template<typename T1, typename T2>
-class EventEmitter<T1, T2, empty, empty> : noncopyable
-{
-public:
-  typedef function<void(const T1&, const T2&)> Handler;
-
-  void
-  operator+=(Handler handler);
-
-  bool
-  isEmpty();
-
-  void
-  clear();
-
-  void
-  operator()(const T1& a1, const T2& a2);
-
-private:
-  std::vector<Handler> m_handlers;
-};
-
-
-// three arguments
-template<typename T1, typename T2, typename T3>
-class EventEmitter<T1, T2, T3, empty> : noncopyable
-{
-public:
-  typedef function<void(const T1&, const T2&, const T3&)> Handler;
-
-  void
-  operator+=(Handler handler);
-
-  bool
-  isEmpty();
-
-  void
-  clear();
-
-  void
-  operator()(const T1& a1, const T2& a2, const T3& a3);
-
-private:
-  std::vector<Handler> m_handlers;
-};
-
-
-// zero argument
-
-inline void
-EventEmitter<empty, empty, empty, empty>::operator+=(Handler handler)
-{
-  m_handlers.push_back(handler);
-}
-
-inline bool
-EventEmitter<empty, empty, empty, empty>::isEmpty()
-{
-  return m_handlers.empty();
-}
-
-inline void
-EventEmitter<empty, empty, empty, empty>::clear()
-{
-  return m_handlers.clear();
-}
-
-inline void
-EventEmitter<empty, empty, empty, empty>::operator()()
-{
-  std::vector<Handler>::iterator it;
-  for (it = m_handlers.begin(); it != m_handlers.end(); ++it) {
-    (*it)();
-    if (m_handlers.empty()) // .clear has been called
-      return;
-  }
-}
-
-// one argument
-
-template<typename T1>
-inline void
-EventEmitter<T1, empty, empty, empty>::operator+=(Handler handler)
-{
-  m_handlers.push_back(handler);
-}
-
-template<typename T1>
-inline bool
-EventEmitter<T1, empty, empty, empty>::isEmpty()
-{
-  return m_handlers.empty();
-}
-
-template<typename T1>
-inline void
-EventEmitter<T1, empty, empty, empty>::clear()
-{
-  return m_handlers.clear();
-}
-
-template<typename T1>
-inline void
-EventEmitter<T1, empty, empty, empty>::operator()(const T1& a1)
-{
-  typename std::vector<Handler>::iterator it;
-  for (it = m_handlers.begin(); it != m_handlers.end(); ++it) {
-    (*it)(a1);
-    if (m_handlers.empty()) // .clear has been called
-      return;
-  }
-}
-
-// two arguments
-
-template<typename T1, typename T2>
-inline void
-EventEmitter<T1, T2, empty, empty>::operator+=(Handler handler)
-{
-  m_handlers.push_back(handler);
-}
-
-template<typename T1, typename T2>
-inline bool
-EventEmitter<T1, T2, empty, empty>::isEmpty()
-{
-  return m_handlers.empty();
-}
-
-template<typename T1, typename T2>
-inline void
-EventEmitter<T1, T2, empty, empty>::clear()
-{
-  return m_handlers.clear();
-}
-
-template<typename T1, typename T2>
-inline void
-EventEmitter<T1, T2, empty, empty>::operator()
-    (const T1& a1, const T2& a2)
-{
-  typename std::vector<Handler>::iterator it;
-  for (it = m_handlers.begin(); it != m_handlers.end(); ++it) {
-    (*it)(a1, a2);
-    if (m_handlers.empty()) // .clear has been called
-      return;
-  }
-}
-
-// three arguments
-
-template<typename T1, typename T2, typename T3>
-inline void
-EventEmitter<T1, T2, T3, empty>::operator+=(Handler handler)
-{
-  m_handlers.push_back(handler);
-}
-
-template<typename T1, typename T2, typename T3>
-inline bool
-EventEmitter<T1, T2, T3, empty>::isEmpty()
-{
-  return m_handlers.empty();
-}
-
-template<typename T1, typename T2, typename T3>
-inline void
-EventEmitter<T1, T2, T3, empty>::clear()
-{
-  return m_handlers.clear();
-}
-
-template<typename T1, typename T2, typename T3>
-inline void
-EventEmitter<T1, T2, T3, empty>::operator()
-    (const T1& a1, const T2& a2, const T3& a3)
-{
-  typename std::vector<Handler>::iterator it;
-  for (it = m_handlers.begin(); it != m_handlers.end(); ++it) {
-    (*it)(a1, a2, a3);
-    if (m_handlers.empty()) // .clear has been called
-      return;
-  }
-}
-
-// four arguments
-
-template<typename T1, typename T2, typename T3, typename T4>
-inline void
-EventEmitter<T1, T2, T3, T4>::operator+=(Handler handler)
-{
-  m_handlers.push_back(handler);
-}
-
-template<typename T1, typename T2, typename T3, typename T4>
-inline bool
-EventEmitter<T1, T2, T3, T4>::isEmpty()
-{
-  return m_handlers.empty();
-}
-
-template<typename T1, typename T2, typename T3, typename T4>
-inline void
-EventEmitter<T1, T2, T3, T4>::clear()
-{
-  return m_handlers.clear();
-}
-
-template<typename T1, typename T2, typename T3, typename T4>
-inline void
-EventEmitter<T1, T2, T3, T4>::operator()
-    (const T1& a1, const T2& a2, const T3& a3, const T4& a4)
-{
-  typename std::vector<Handler>::iterator it;
-  for (it = m_handlers.begin(); it != m_handlers.end(); ++it) {
-    (*it)(a1, a2, a3, a4);
-    if (m_handlers.empty()) // .clear has been called
-      return;
-  }
-}
-
-
-} // namespace nfd
-
-#endif // NFD_CORE_EVENT_EMITTER_HPP
diff --git a/daemon/face/face.hpp b/daemon/face/face.hpp
index 8234102..240e270 100644
--- a/daemon/face/face.hpp
+++ b/daemon/face/face.hpp
@@ -27,7 +27,6 @@
 #define NFD_DAEMON_FACE_FACE_HPP
 
 #include "common.hpp"
-#include "core/event-emitter.hpp"
 #include "core/face-uri.hpp"
 #include "face-counters.hpp"
 
diff --git a/daemon/face/ndnlp-partial-message-store.hpp b/daemon/face/ndnlp-partial-message-store.hpp
index 7b2733a..c707d92 100644
--- a/daemon/face/ndnlp-partial-message-store.hpp
+++ b/daemon/face/ndnlp-partial-message-store.hpp
@@ -26,7 +26,6 @@
 #define NFD_DAEMON_FACE_NDNLP_PARTIAL_MESSAGE_STORE_HPP
 
 #include "ndnlp-parse.hpp"
-#include "core/event-emitter.hpp"
 #include "core/scheduler.hpp"
 
 namespace nfd {
diff --git a/tests/core/event-emitter.cpp b/tests/core/event-emitter.cpp
deleted file mode 100644
index b03f71d..0000000
--- a/tests/core/event-emitter.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-/* -*- 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
- *
- * 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/event-emitter.hpp"
-
-#include "tests/test-common.hpp"
-
-namespace nfd {
-namespace tests {
-
-BOOST_FIXTURE_TEST_SUITE(UtilEventEmitter, BaseFixture)
-
-class EventEmitterTester : noncopyable
-{
-public:
-  EventEmitterTester();
-
-  int m_hit;
-  int m_a1;
-  int m_a2;
-  int m_a3;
-  int m_a4;
-
-  void
-  clear();
-
-  void
-  f0();
-
-  void
-  f1(int a1);
-
-  void
-  f2(int a1, int a2);
-
-  void
-  f3(int a1, int a2, int a3);
-
-  void
-  f4(int a1, int a2, int a3, int a4);
-};
-
-EventEmitterTester::EventEmitterTester()
-{
-  this->clear();
-}
-
-void
-EventEmitterTester::clear()
-{
-  m_hit = 0;
-  m_a1 = 0;
-  m_a2 = 0;
-  m_a3 = 0;
-  m_a4 = 0;
-}
-
-void
-EventEmitterTester::f0()
-{
-  ++m_hit;
-}
-
-void
-EventEmitterTester::f1(int a1)
-{
-  ++m_hit;
-  m_a1 = a1;
-}
-
-void
-EventEmitterTester::f2(int a1, int a2)
-{
-  ++m_hit;
-  m_a1 = a1;
-  m_a2 = a2;
-}
-
-void
-EventEmitterTester::f3(int a1, int a2, int a3)
-{
-  ++m_hit;
-  m_a1 = a1;
-  m_a2 = a2;
-  m_a3 = a3;
-}
-
-void
-EventEmitterTester::f4(int a1, int a2, int a3, int a4)
-{
-  ++m_hit;
-  m_a1 = a1;
-  m_a2 = a2;
-  m_a3 = a3;
-  m_a4 = a4;
-}
-
-static int g_EventEmitterTest_RefObject_copyCount;
-
-class EventEmitterTest_RefObject
-{
-public:
-  EventEmitterTest_RefObject() {}
-
-  EventEmitterTest_RefObject(const EventEmitterTest_RefObject& other);
-};
-
-EventEmitterTest_RefObject::EventEmitterTest_RefObject(const EventEmitterTest_RefObject& other)
-{
-  ++g_EventEmitterTest_RefObject_copyCount;
-}
-
-void
-EventEmitterTest_RefObject_byVal(EventEmitterTest_RefObject a1) {}
-
-void
-EventEmitterTest_RefObject_byRef(const EventEmitterTest_RefObject& a1) {}
-
-
-BOOST_AUTO_TEST_CASE(ZeroListener)
-{
-  EventEmitter<> ee;
-  BOOST_CHECK_NO_THROW(ee());
-}
-
-BOOST_AUTO_TEST_CASE(TwoListeners)
-{
-  EventEmitterTester eet1;
-  EventEmitterTester eet2;
-  EventEmitter<> ee;
-  ee += bind(&EventEmitterTester::f0, &eet1);
-  ee += bind(&EventEmitterTester::f0, &eet2);
-  ee();
-
-  BOOST_CHECK_EQUAL(eet1.m_hit, 1);
-  BOOST_CHECK_EQUAL(eet2.m_hit, 1);
-}
-
-BOOST_AUTO_TEST_CASE(ZeroArgument)
-{
-  EventEmitterTester eet;
-  EventEmitter<> ee;
-  ee += bind(&EventEmitterTester::f0, &eet);
-  ee();
-
-  BOOST_CHECK_EQUAL(eet.m_hit, 1);
-}
-
-BOOST_AUTO_TEST_CASE(OneArgument)
-{
-  EventEmitterTester eet;
-  EventEmitter<int> ee;
-  ee += bind(&EventEmitterTester::f1, &eet, _1);
-  ee(11);
-
-  BOOST_CHECK_EQUAL(eet.m_hit, 1);
-  BOOST_CHECK_EQUAL(eet.m_a1, 11);
-}
-
-BOOST_AUTO_TEST_CASE(TwoArguments)
-{
-  EventEmitterTester eet;
-  EventEmitter<int,int> ee;
-  ee += bind(&EventEmitterTester::f2, &eet, _1, _2);
-  ee(21, 22);
-
-  BOOST_CHECK_EQUAL(eet.m_hit, 1);
-  BOOST_CHECK_EQUAL(eet.m_a1, 21);
-  BOOST_CHECK_EQUAL(eet.m_a2, 22);
-}
-
-BOOST_AUTO_TEST_CASE(ThreeArguments)
-{
-  EventEmitterTester eet;
-  EventEmitter<int,int,int> ee;
-  ee += bind(&EventEmitterTester::f3, &eet, _1, _2, _3);
-  ee(31, 32, 33);
-
-  BOOST_CHECK_EQUAL(eet.m_hit, 1);
-  BOOST_CHECK_EQUAL(eet.m_a1, 31);
-  BOOST_CHECK_EQUAL(eet.m_a2, 32);
-  BOOST_CHECK_EQUAL(eet.m_a3, 33);
-}
-
-BOOST_AUTO_TEST_CASE(FourArguments)
-{
-  EventEmitterTester eet;
-  EventEmitter<int,int,int,int> ee;
-  ee += bind(&EventEmitterTester::f4, &eet, _1, _2, _3, _4);
-  ee(41, 42, 43, 44);
-
-  BOOST_CHECK_EQUAL(eet.m_hit, 1);
-  BOOST_CHECK_EQUAL(eet.m_a1, 41);
-  BOOST_CHECK_EQUAL(eet.m_a2, 42);
-  BOOST_CHECK_EQUAL(eet.m_a3, 43);
-  BOOST_CHECK_EQUAL(eet.m_a4, 44);
-}
-
-// EventEmitter passes arguments by reference,
-// but it also allows a handler that accept arguments by value
-BOOST_AUTO_TEST_CASE(HandlerByVal)
-{
-  EventEmitterTest_RefObject refObject;
-  g_EventEmitterTest_RefObject_copyCount = 0;
-
-  EventEmitter<EventEmitterTest_RefObject> ee;
-  ee += &EventEmitterTest_RefObject_byVal;
-  ee(refObject);
-
-  BOOST_CHECK_EQUAL(g_EventEmitterTest_RefObject_copyCount, 1);
-}
-
-// EventEmitter passes arguments by reference, and no copying
-// is necessary when handler accepts arguments by reference
-BOOST_AUTO_TEST_CASE(HandlerByRef)
-{
-  EventEmitterTest_RefObject refObject;
-  g_EventEmitterTest_RefObject_copyCount = 0;
-
-  EventEmitter<EventEmitterTest_RefObject> ee;
-  ee += &EventEmitterTest_RefObject_byRef;
-  ee(refObject);
-
-  BOOST_CHECK_EQUAL(g_EventEmitterTest_RefObject_copyCount, 0);
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-} // namespace tests
-} // namespace nfd
