diff --git a/ndn.cxx/ndn-api-face.cc b/ndn.cxx/ndn-api-face.cc
new file mode 100644
index 0000000..6b80251
--- /dev/null
+++ b/ndn.cxx/ndn-api-face.cc
@@ -0,0 +1,213 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ *         Chaoyi Bian <bcy@pku.edu.cn>
+ */
+
+#include "ndn-api-face.h"
+
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+namespace ll = boost::lambda;
+
+#include <ns3/packet.h>
+
+#include <ns3/ndn-interest.h>
+#include <ns3/ndn-content-object.h>
+#include <ns3/ndn-face.h>
+#include <ns3/ndn-fib.h>
+#include <ns3/log.h>
+
+typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str;
+typedef boost::error_info<struct tag_errmsg, int> errmsg_info_int;
+
+using namespace std;
+using namespace boost;
+using namespace ns3;
+
+#define INIT_LOGGER NS_LOG_COMPONENT_DEFINE
+#define _LOG_DEBUG NS_LOG_DEBUG
+#define _LOG_TRACE NS_LOG_TRACE
+#define _LOG_INFO NS_LOG_INFO
+
+
+INIT_LOGGER ("ndn.ApiFace");
+
+namespace ns3 {
+namespace ndn {
+
+// ApiFace::ApiFace()
+//   : m_rand (0, std::numeric_limits<uint32_t>::max ())
+// {
+// }
+
+// ApiFace::~ApiFace()
+// {
+// }
+
+// int
+// ApiFace::publishRawData (const std::string &name, const char *buf, size_t len, int freshness)
+// {
+//   // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
+//   _LOG_INFO (">> publishRawData " << name);
+
+//   static ndn::ContentObjectTail trailer;
+  
+//   ndn::ContentObject data;
+//   data.SetName (name);
+//   data.SetFreshness (Seconds (freshness));
+
+//   Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t*> (buf), len);
+//   // packet->AddPacketTag (CreateObject<TypeTag> (TypeTag::DATA));
+//   packet->AddHeader (data);
+//   packet->AddTrailer (trailer);
+
+//   m_protocolHandler (packet);
+
+//   m_transmittedContentObjects (&data, packet, this, m_face);
+
+//   return 0;
+// }
+
+
+// void
+// RawDataCallback2StringDataCallback (ApiFace::StringDataCallback callback, std::string str, const char *buf, size_t len)
+// {
+//   callback (str, string (buf, len));
+// }
+
+// int
+// ApiFace::sendInterestForString (const std::string &strInterest, const StringDataCallback &strDataCallback/*, int retry*/)
+// {
+//   return sendInterest (strInterest, boost::bind (RawDataCallback2StringDataCallback, strDataCallback, _1, _2, _3));
+// }
+
+// int ApiFace::sendInterest (const string &strInterest, const RawDataCallback &rawDataCallback)
+// {
+//   // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
+//   _LOG_INFO (">> I " << strInterest);
+//   Ptr<ndn::Name> name = Create<ndn::Name> (strInterest);
+
+//   ndn::Interest interestHeader;
+//   interestHeader.SetNonce            (m_rand.GetValue ());
+//   interestHeader.SetName             (*name);
+//   interestHeader.SetInterestLifetime (Seconds (9.9)); // really long-lived interests
+
+//   Ptr<Packet> packet = Create<Packet> ();
+//   // packet->AddPacketTag (CreateObject<TypeTag> (TypeTag::INTEREST));
+//   packet->AddHeader (interestHeader);
+
+//   // NS_LOG_DEBUG (interestHeader);
+  
+//   // Record the callback
+//   FilterEntryContainer<RawDataCallback>::iterator entry = m_dataCallbacks.find_exact (*name);
+//   if (entry == m_dataCallbacks.end ())
+//     {
+//       pair<FilterEntryContainer<RawDataCallback>::iterator, bool> status =
+//         m_dataCallbacks.insert (*name, Create< FilterEntry<RawDataCallback> > (name));
+
+//       entry = status.first;
+//     }
+//   entry->payload ()->AddCallback (rawDataCallback);
+
+//   m_protocolHanler (packet);
+//   m_transmittedInterests (&interestHeader, this, m_face);
+  
+//   return 0;
+// }
+
+// int ApiFace::setInterestFilter (const string &prefix, const InterestCallback &interestCallback)
+// {
+//   NS_LOG_DEBUG ("== setInterestFilter " << prefix << " (" << GetNode ()->GetId () << ")");
+//   Ptr<ndn::Name> name = Create<ndn::Name> (prefix);
+
+//   FilterEntryContainer<InterestCallback>::iterator entry = m_interestCallbacks.find_exact (*name);
+//   if (entry == m_interestCallbacks.end ())
+//     {
+//       pair<FilterEntryContainer<InterestCallback>::iterator, bool> status =
+//         m_interestCallbacks.insert (*name, Create < FilterEntry<InterestCallback> > (name));
+
+//       entry = status.first;
+//     }
+
+//   entry->payload ()->AddCallback (interestCallback);
+
+//   // creating actual face
+//   Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
+//   Ptr<ndn::fib::Entry> fibEntry = fib->Add (name, m_face, 0);
+//   fibEntry->UpdateStatus (m_face, ndn::fib::FaceMetric::NDN_FIB_GREEN);
+
+//   return 0;
+// }
+
+// void
+// ApiFace::clearInterestFilter (const std::string &prefix)
+// {
+//   Ptr<ndn::Name> name = Create<ndn::Name> (prefix);
+
+//   FilterEntryContainer<InterestCallback>::iterator entry = m_interestCallbacks.find_exact (*name);
+//   if (entry == m_interestCallbacks.end ())
+//     return;
+
+//   entry->payload ()->ClearCallback ();
+// }
+
+// void
+// ApiFace::OnInterest (const Ptr<const ndn::Interest> &interest, Ptr<Packet> packet)
+// {
+//   ndn::App::OnInterest (interest, packet);
+
+//   // the app cannot set several filters for the same prefix
+//   FilterEntryContainer<InterestCallback>::iterator entry = m_interestCallbacks.longest_prefix_match (interest->GetName ());
+//   if (entry == m_interestCallbacks.end ())
+//     {
+//       _LOG_DEBUG ("No Interest callback set");
+//       return;
+//     }
+  
+//   entry->payload ()->m_callback (lexical_cast<string> (interest->GetName ()));  
+// }
+
+// void
+// ApiFace::OnContentObject (const Ptr<const ndn::ContentObject> &contentObject,
+//                               Ptr<Packet> payload)
+// {
+//   ndn::App::OnContentObject (contentObject, payload);
+//   NS_LOG_DEBUG ("<< D " << contentObject->GetName ());
+
+//   FilterEntryContainer<RawDataCallback>::iterator entry = m_dataCallbacks.longest_prefix_match (contentObject->GetName ());
+//   if (entry == m_dataCallbacks.end ())
+//     {
+//       _LOG_DEBUG ("No Data callback set");
+//       return;
+//     }
+
+//   while (entry != m_dataCallbacks.end ())
+//     {
+//       entry->payload ()->m_callback (lexical_cast<string> (contentObject->GetName ()), payload);
+//       m_dataCallbacks.erase (entry);
+
+//       entry = m_dataCallbacks.longest_prefix_match (contentObject->GetName ());
+//     }
+// }
+
+}
+}
diff --git a/ndn.cxx/ndn-api-face.h b/ndn.cxx/ndn-api-face.h
new file mode 100644
index 0000000..133f29c
--- /dev/null
+++ b/ndn.cxx/ndn-api-face.h
@@ -0,0 +1,169 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ *         Chaoyi Bian <bcy@pku.edu.cn>
+ */
+
+#ifndef NDN_API_FACE_H
+#define NDN_API_FACE_H
+
+#include <boost/exception/all.hpp>
+#include <boost/function.hpp>
+#include <string>
+
+#include <ns3/ptr.h>
+#include <ns3/node.h>
+#include <ns3/random-variable.h>
+#include <ns3/ndn-app.h>
+#include <ns3/ndn-name.h>
+
+#include <ns3/ndnSIM/utils/trie/trie-with-policy.h>
+#include <ns3/ndnSIM/utils/trie/counting-policy.h>
+
+namespace ns3 {
+namespace ndn {
+
+template<class Callback>
+struct FilterEntry : public ns3::SimpleRefCount< FilterEntry<Callback> >
+{
+public:
+  FilterEntry (ns3::Ptr<const ns3::ndn::Name> prefix)
+    : m_prefix (prefix)
+  { }
+  
+  const ns3::ndn::Name &
+  GetPrefix () const
+  { return *m_prefix; }
+
+  void
+  AddCallback (Callback callback)
+  { 
+    m_callback = callback;
+  }
+
+  void
+  ClearCallback ()
+  {
+    m_callback = 0;
+  }
+  
+public:
+  ns3::Ptr<const ns3::ndn::Name> m_prefix; ///< \brief Prefix of the PIT entry
+  Callback m_callback;
+};
+
+
+template<class Callback>
+struct FilterEntryContainer :
+    public ns3::ndn::ndnSIM::trie_with_policy<ns3::ndn::Name,
+                                              ns3::ndn::ndnSIM::smart_pointer_payload_traits< FilterEntry<Callback> >,
+                                              ns3::ndn::ndnSIM::counting_policy_traits>
+{
+};
+
+
+struct OperationException : virtual boost::exception, virtual std::exception { };
+/**
+ * \ingroup sync
+ * @brief A handler for NDN; clients of this code do not need to deal
+ * with NDN API directly
+ */
+class ApiFace
+  // : private ns3::ndn::Face
+{
+public:
+  // typedef boost::function<void (const ndn::Name &, Ptr<Packet>)> DataCallback;
+  // typedef boost::function<void (const ndn::Name &)> InterestCallback;
+  
+  // /**
+  //  * @brief initialize the handler; a lot of things needs to be done. 1) init
+  //  * keystore 2) init keylocator 3) start a thread to hold a loop of ccn_run
+  //  *
+  //  */
+  // ApiFace (Ptr<Node> node);
+  // ~ApiFace ();
+
+  // /**
+  //  * @brief send Interest; need to grab lock m_mutex first
+  //  *
+  //  * @param name the Interest name
+  //  * @param dataCallback the callback function to deal with the returned data
+  //  * @return the return code of ccn_express_interest
+  //  */
+  // // int
+  // // sendInterestForString (const std::string &strInterest, const StringDataCallback &strDataCallback/*, int retry = 0*/);
+
+  // int
+  // sendInterest (const ndn::Name &name, const DataCallback &rawDataCallback/*, int retry = 0*/);
+  
+  // /**
+  //  * @brief set Interest filter (specify what interest you want to receive)
+  //  *
+  //  * @param prefix the prefix of Interest
+  //  * @param interestCallback the callback function to deal with the returned data
+  //  * @return the return code of ccn_set_interest_filter
+  //  */
+  // int
+  // setInterestFilter (const ndn::Name &prefix, const InterestCallback &interestCallback);
+
+  // /**
+  //  * @brief clear Interest filter
+  //  * @param prefix the prefix of Interest
+  //  */
+  // void
+  // clearInterestFilter (const std::string &prefix);
+
+  /**
+   * @brief publish data and put it to local ccn content store; need to grab
+   * lock m_mutex first
+   *
+   * @param name the name for the data object
+   * @param dataBuffer the data to be published
+   * @param freshness the freshness time for the data object
+   * @return code generated by NDN library calls, >0 if success
+   */
+  // int
+  // publishStringData (const std::string &name, const std::string &dataBuffer, int freshness)
+  // {
+  //   return publishRawData (name, dataBuffer.c_str(), dataBuffer.length(), freshness);
+  // }
+
+  // int
+  // publishRawData (const std::string &name, const char *buf, size_t len, int freshness);
+
+private:
+  // // from ndn::App
+  // virtual void
+  // OnInterest (const ns3::Ptr<const ns3::ndn::Interest> &interest, ns3::Ptr<ns3::Packet> packet);
+ 
+  // virtual void
+  // OnContentObject (const ns3::Ptr<const ns3::ndn::ContentObject> &contentObject,
+  //                  ns3::Ptr<ns3::Packet> payload);
+
+private:
+  ns3::UniformVariable m_rand; // nonce generator
+
+  FilterEntryContainer<RawDataCallback> m_dataCallbacks;
+  FilterEntryContainer<InterestCallback> m_interestCallbacks;
+};
+
+}
+}
+
+#endif // NDN_API_HANDLER_H
diff --git a/ndn.cxx/ndn-handler.cc b/ndn.cxx/ndn-handler.cc
deleted file mode 100644
index c7c9e66..0000000
--- a/ndn.cxx/ndn-handler.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Chaoyi Bian <bcy@pku.edu.cn>
- */
-
-#include "ndn-handler.h"
-
-#include <boost/throw_exception.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-#include <ns3/packet.h>
-
-#include <ns3/ndn-interest.h>
-#include <ns3/ndn-content-object.h>
-#include <ns3/ndn-face.h>
-#include <ns3/ndn-fib.h>
-#include <ns3/log.h>
-
-typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str;
-typedef boost::error_info<struct tag_errmsg, int> errmsg_info_int;
-
-using namespace std;
-using namespace boost;
-using namespace ns3;
-
-#define INIT_LOGGER NS_LOG_COMPONENT_DEFINE
-#define _LOG_DEBUG NS_LOG_DEBUG
-#define _LOG_TRACE NS_LOG_TRACE
-#define _LOG_INFO NS_LOG_INFO
-
-
-INIT_LOGGER ("ndn.Handler");
-
-namespace ns3 {
-namespace ndn {
-
-Handler::Handler()
-  : m_rand (0, std::numeric_limits<uint32_t>::max ())
-{
-}
-
-Handler::~Handler()
-{
-}
-
-void
-Handler::StartApplication ()
-{
-  ndn::App::StartApplication ();
-}
-
-void
-Handler::StopApplication ()
-{
-  ndn::App::StopApplication ();
-}
-
-int
-Handler::publishRawData (const std::string &name, const char *buf, size_t len, int freshness)
-{
-  // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
-  _LOG_INFO (">> publishRawData " << name);
-
-  static ndn::ContentObjectTail trailer;
-  
-  ndn::ContentObject data;
-  data.SetName (name);
-  data.SetFreshness (Seconds (freshness));
-
-  Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t*> (buf), len);
-  // packet->AddPacketTag (CreateObject<TypeTag> (TypeTag::DATA));
-  packet->AddHeader (data);
-  packet->AddTrailer (trailer);
-
-  m_protocolHandler (packet);
-
-  m_transmittedContentObjects (&data, packet, this, m_face);
-
-  return 0;
-}
-
-
-// void
-// RawDataCallback2StringDataCallback (Handler::StringDataCallback callback, std::string str, const char *buf, size_t len)
-// {
-//   callback (str, string (buf, len));
-// }
-
-// int
-// Handler::sendInterestForString (const std::string &strInterest, const StringDataCallback &strDataCallback/*, int retry*/)
-// {
-//   return sendInterest (strInterest, boost::bind (RawDataCallback2StringDataCallback, strDataCallback, _1, _2, _3));
-// }
-
-int Handler::sendInterest (const string &strInterest, const RawDataCallback &rawDataCallback)
-{
-  // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
-  _LOG_INFO (">> I " << strInterest);
-  Ptr<ndn::Name> name = Create<ndn::Name> (strInterest);
-
-  ndn::Interest interestHeader;
-  interestHeader.SetNonce            (m_rand.GetValue ());
-  interestHeader.SetName             (*name);
-  interestHeader.SetInterestLifetime (Seconds (9.9)); // really long-lived interests
-
-  Ptr<Packet> packet = Create<Packet> ();
-  // packet->AddPacketTag (CreateObject<TypeTag> (TypeTag::INTEREST));
-  packet->AddHeader (interestHeader);
-
-  // NS_LOG_DEBUG (interestHeader);
-  
-  // Record the callback
-  FilterEntryContainer<RawDataCallback>::iterator entry = m_dataCallbacks.find_exact (*name);
-  if (entry == m_dataCallbacks.end ())
-    {
-      pair<FilterEntryContainer<RawDataCallback>::iterator, bool> status =
-        m_dataCallbacks.insert (*name, Create< FilterEntry<RawDataCallback> > (name));
-
-      entry = status.first;
-    }
-  entry->payload ()->AddCallback (rawDataCallback);
-
-  m_protocolHandler (packet);
-  m_transmittedInterests (&interestHeader, this, m_face);
-  
-  return 0;
-}
-
-int Handler::setInterestFilter (const string &prefix, const InterestCallback &interestCallback)
-{
-  NS_LOG_DEBUG ("== setInterestFilter " << prefix << " (" << GetNode ()->GetId () << ")");
-  Ptr<ndn::Name> name = Create<ndn::Name> (prefix);
-
-  FilterEntryContainer<InterestCallback>::iterator entry = m_interestCallbacks.find_exact (*name);
-  if (entry == m_interestCallbacks.end ())
-    {
-      pair<FilterEntryContainer<InterestCallback>::iterator, bool> status =
-        m_interestCallbacks.insert (*name, Create < FilterEntry<InterestCallback> > (name));
-
-      entry = status.first;
-    }
-
-  entry->payload ()->AddCallback (interestCallback);
-
-  // creating actual face
-  Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
-  Ptr<ndn::fib::Entry> fibEntry = fib->Add (name, m_face, 0);
-  fibEntry->UpdateStatus (m_face, ndn::fib::FaceMetric::NDN_FIB_GREEN);
-
-  return 0;
-}
-
-void
-Handler::clearInterestFilter (const std::string &prefix)
-{
-  Ptr<ndn::Name> name = Create<ndn::Name> (prefix);
-
-  FilterEntryContainer<InterestCallback>::iterator entry = m_interestCallbacks.find_exact (*name);
-  if (entry == m_interestCallbacks.end ())
-    return;
-
-  entry->payload ()->ClearCallback ();
-}
-
-void
-Handler::OnInterest (const Ptr<const ndn::Interest> &interest, Ptr<Packet> packet)
-{
-  ndn::App::OnInterest (interest, packet);
-
-  // the app cannot set several filters for the same prefix
-  FilterEntryContainer<InterestCallback>::iterator entry = m_interestCallbacks.longest_prefix_match (interest->GetName ());
-  if (entry == m_interestCallbacks.end ())
-    {
-      _LOG_DEBUG ("No Interest callback set");
-      return;
-    }
-  
-  entry->payload ()->m_callback (lexical_cast<string> (interest->GetName ()));  
-}
-
-void
-Handler::OnContentObject (const Ptr<const ndn::ContentObject> &contentObject,
-                              Ptr<Packet> payload)
-{
-  ndn::App::OnContentObject (contentObject, payload);
-  NS_LOG_DEBUG ("<< D " << contentObject->GetName ());
-
-  FilterEntryContainer<RawDataCallback>::iterator entry = m_dataCallbacks.longest_prefix_match (contentObject->GetName ());
-  if (entry == m_dataCallbacks.end ())
-    {
-      _LOG_DEBUG ("No Data callback set");
-      return;
-    }
-
-  while (entry != m_dataCallbacks.end ())
-    {
-      entry->payload ()->m_callback (lexical_cast<string> (contentObject->GetName ()), payload);
-      m_dataCallbacks.erase (entry);
-
-      entry = m_dataCallbacks.longest_prefix_match (contentObject->GetName ());
-    }
-}
-
-}
-}
diff --git a/ndn.cxx/ndn-handler.h b/ndn.cxx/ndn-handler.h
deleted file mode 100644
index 420645d..0000000
--- a/ndn.cxx/ndn-handler.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Chaoyi Bian <bcy@pku.edu.cn>
- */
-
-#ifndef NDN_HANDLER_H
-#define NDN_HANDLER_H
-
-#include <boost/exception/all.hpp>
-#include <boost/function.hpp>
-#include <string>
-
-#include <ns3/ptr.h>
-#include <ns3/node.h>
-#include <ns3/random-variable.h>
-#include <ns3/ndn-app.h>
-#include <ns3/ndn-name.h>
-
-#include <ns3/ndnSIM/utils/trie/trie-with-policy.h>
-#include <ns3/ndnSIM/utils/trie/counting-policy.h>
-
-namespace ns3 {
-namespace ndn {
-
-template<class Callback>
-struct FilterEntry : public ns3::SimpleRefCount< FilterEntry<Callback> >
-{
-public:
-  FilterEntry (ns3::Ptr<const ns3::ndn::Name> prefix)
-    : m_prefix (prefix)
-  { }
-  
-  const ns3::ndn::Name &
-  GetPrefix () const
-  { return *m_prefix; }
-
-  void
-  AddCallback (Callback callback)
-  { 
-    m_callback = callback;
-  }
-
-  void
-  ClearCallback ()
-  {
-    m_callback = 0;
-  }
-  
-public:
-  ns3::Ptr<const ns3::ndn::Name> m_prefix; ///< \brief Prefix of the PIT entry
-  Callback m_callback;
-};
-
-
-template<class Callback>
-struct FilterEntryContainer :
-    public ns3::ndn::ndnSIM::trie_with_policy<ns3::ndn::Name,
-                                              ns3::ndn::ndnSIM::smart_pointer_payload_traits< FilterEntry<Callback> >,
-                                              ns3::ndn::ndnSIM::counting_policy_traits>
-{
-};
-
-
-struct OperationException : virtual boost::exception, virtual std::exception { };
-/**
- * \ingroup sync
- * @brief A handler for NDN; clients of this code do not need to deal
- * with NDN API directly
- */
-class Handler
-  : public ns3::ndn::App
-{
-public:
-  typedef boost::function<void (std::string, std::string)> StringDataCallback;
-  typedef boost::function<void (std::string, Ptr<Packet>)> RawDataCallback;
-  typedef boost::function<void (std::string)> InterestCallback;
-
-  
-  /**
-   * @brief initialize the handler; a lot of things needs to be done. 1) init
-   * keystore 2) init keylocator 3) start a thread to hold a loop of ccn_run
-   *
-   */
-  Handler();
-  ~Handler();
-
-  /**
-   * @brief send Interest; need to grab lock m_mutex first
-   *
-   * @param strInterest the Interest name
-   * @param dataCallback the callback function to deal with the returned data
-   * @return the return code of ccn_express_interest
-   */
-  // int
-  // sendInterestForString (const std::string &strInterest, const StringDataCallback &strDataCallback/*, int retry = 0*/);
-
-  int
-  sendInterest (const std::string &strInterest, const RawDataCallback &rawDataCallback/*, int retry = 0*/);
-  
-  /**
-   * @brief set Interest filter (specify what interest you want to receive)
-   *
-   * @param prefix the prefix of Interest
-   * @param interestCallback the callback function to deal with the returned data
-   * @return the return code of ccn_set_interest_filter
-   */
-  int
-  setInterestFilter (const std::string &prefix, const InterestCallback &interestCallback);
-
-  /**
-   * @brief clear Interest filter
-   * @param prefix the prefix of Interest
-   */
-  void
-  clearInterestFilter (const std::string &prefix);
-
-  /**
-   * @brief publish data and put it to local ccn content store; need to grab
-   * lock m_mutex first
-   *
-   * @param name the name for the data object
-   * @param dataBuffer the data to be published
-   * @param freshness the freshness time for the data object
-   * @return code generated by NDN library calls, >0 if success
-   */
-  int
-  publishStringData (const std::string &name, const std::string &dataBuffer, int freshness)
-  {
-    return publishRawData (name, dataBuffer.c_str(), dataBuffer.length(), freshness);
-  }
-
-  int
-  publishRawData (const std::string &name, const char *buf, size_t len, int freshness);
-  
-  // from ndn::App
-  virtual void
-  OnInterest (const ns3::Ptr<const ns3::ndn::Interest> &interest, ns3::Ptr<ns3::Packet> packet);
- 
-  virtual void
-  OnContentObject (const ns3::Ptr<const ns3::ndn::ContentObject> &contentObject,
-                   ns3::Ptr<ns3::Packet> payload);
-
-
-public:
-  // inherited from Application base class.
-  virtual void
-  StartApplication ();    // Called at time specified by Start
-
-  virtual void
-  StopApplication ();     // Called at time specified by Stop
-
-private:
-  ns3::UniformVariable m_rand; // nonce generator
-
-  FilterEntryContainer<RawDataCallback> m_dataCallbacks;
-  FilterEntryContainer<InterestCallback> m_interestCallbacks;
-};
-
-}
-}
-
-#endif // NDN_HANDLER_H
