diff --git a/helper/ccnx-consumer-helper.cc b/helper/ccnx-consumer-helper.cc
index adb3c6e..f6fcb7c 100644
--- a/helper/ccnx-consumer-helper.cc
+++ b/helper/ccnx-consumer-helper.cc
@@ -19,6 +19,10 @@
  */
 
 #include "ccnx-consumer-helper.h"
+#include "ns3/log.h"
+#include "ns3/ccnx-name-components.h"
+#include "ns3/names.h"
+#include "../apps/ccnx-consumer.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxConsumerHelper");
 
diff --git a/helper/ccnx-consumer-helper.h b/helper/ccnx-consumer-helper.h
index 7d0011f..158ede7 100644
--- a/helper/ccnx-consumer-helper.h
+++ b/helper/ccnx-consumer-helper.h
@@ -21,22 +21,11 @@
 #ifndef CCNX_CONSUMER_HELPER_H
 #define CCNX_CONSUMER_HELPER_H
 
-#include <stdint.h>
-#include <string>
 #include "ns3/object-factory.h"
-#include "ns3/address.h"
 #include "ns3/attribute.h"
-#include "ns3/net-device.h"
 #include "ns3/node-container.h"
 #include "ns3/application-container.h"
-#include "ns3/ccnx-name-components.h"
-#include "ns3/pointer.h"
-#include "ns3/ccnx-local-face.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-consumer.h"
-#include "ns3/log.h"
-#include "ns3/string.h"
-#include "ns3/names.h"
+#include "ns3/ptr.h"
 
 namespace ns3 
 {    
diff --git a/helper/ccnx-forwarding-helper.cc b/helper/ccnx-forwarding-helper.cc
deleted file mode 100644
index 0e74e97..0000000
--- a/helper/ccnx-forwarding-helper.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ns3/node.h"
-#include "ns3/node-list.h"
-#include "ns3/simulator.h"
-#include "ns3/ccnx-forwarding-strategy.h"
-#include "ns3/ccnx-bestroute-strategy.h"
-#include "ccnx-forwarding-helper.h"
-
-namespace ns3 {
-    
-CcnxForwardingHelper::CcnxForwardingHelper ()
-{
-}
-
-// void
-// CcnxForwardingHelper::PrintForwardingTableAllAt (Time printTime, Ptr<OutputStreamWrapper> stream) const
-// {
-//   for (uint32_t i = 0; i < NodeList::GetNNodes (); i++)
-//     {
-//       Ptr<Node> node = NodeList::GetNode (i);
-//       Simulator::Schedule (printTime, &CcnxForwardingHelper::Print, this, node, stream);
-//     }
-// }
-
-// void
-// CcnxForwardingHelper::PrintForwardingTableAllEvery (Time printInterval, Ptr<OutputStreamWrapper> stream) const
-// {
-//   for (uint32_t i = 0; i < NodeList::GetNNodes (); i++)
-//     {
-//       Ptr<Node> node = NodeList::GetNode (i);
-//       Simulator::Schedule (printInterval, &CcnxForwardingHelper::PrintEvery, this, printInterval, node, stream);
-//     }
-// }
-
-// void
-// CcnxForwardingHelper::PrintForwardingTableAt (Time printTime, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
-// {
-//   Simulator::Schedule (printTime, &CcnxForwardingHelper::Print, this, node, stream);
-// }
-
-// void
-// CcnxForwardingHelper::PrintForwardingTableEvery (Time printInterval,Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
-// {
-//   Simulator::Schedule (printInterval, &CcnxForwardingHelper::PrintEvery, this, printInterval, node, stream);
-// }
-
-// void
-// CcnxForwardingHelper::Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
-// {
-//   Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-//   Ptr<CcnxForwardingStrategy> rp = ccnx->GetForwardingStrategy ();
-//   NS_ASSERT (rp);
-//   rp->PrintForwardingTable (stream);
-// }
-
-// void
-// CcnxForwardingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const
-// {
-//   Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-//   Ptr<CcnxForwardingStrategy> rp = ccnx->GetForwardingStrategy ();
-//   NS_ASSERT (rp);
-//   rp->PrintForwardingTable (stream);
-//   Simulator::Schedule (printInterval, &CcnxForwardingHelper::PrintEvery, this, printInterval, node, stream);
-// }
-
-} // namespace ns3
diff --git a/helper/ccnx-forwarding-helper.h b/helper/ccnx-forwarding-helper.h
deleted file mode 100644
index 5a59381..0000000
--- a/helper/ccnx-forwarding-helper.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#ifndef CCNX_FORWARDING_HELPER_H
-#define CCNX_FORWARDING_HELPER_H
-
-#include "ns3/ptr.h"
-#include "ns3/nstime.h"
-#include "ns3/output-stream-wrapper.h"
-#include "ns3/ccnx.h"
-#include "ns3/ccnx-flooding-strategy.h"
-#include "ns3/ccnx-pit.h"
-
-namespace ns3 {
-
-class Node;
-
-/**
- * \ingroup ccnx-helpers
- *
- * \brief a factory to create ns3::CcnxForwardingStrategy objects
- *
- * \todo Document this class
- */
-class CcnxForwardingHelper
-{
-public:
-  /*
-   * \brief Default constructor
-   */
-  CcnxForwardingHelper();
-    
-  // /**
-  //  * \brief prints the forwarding tables of all nodes at a particular time.
-  //  * \param printTime the time at which the forwarding table is supposed to be printed.
-  //  * \param stream The output stream object to use 
-  //  *
-  //  * This method calls the PrintForwardingTable() method of the 
-  //  * CcnxForwardingStrategy stored in the Ccnx object, for all nodes at the
-  //  * specified time; the output format is forwarding protocol-specific.
-  //  */
-  // void PrintForwardingTableAllAt (Time printTime, Ptr<OutputStreamWrapper> stream) const;
-
-  // /**
-  //  * \brief prints the forwarding tables of all nodes at regular intervals specified by user.
-  //  * \param printInterval the time interval for which the forwarding table is supposed to be printed.
-  //  * \param stream The output stream object to use
-  //  *
-  //  * This method calls the PrintForwardingTable() method of the 
-  //  * CcnxForwardingStrategy stored in the Ccnx object, for all nodes at the
-  //  * specified time interval; the output format is forwarding protocol-specific.
-  //  */
-  // void PrintForwardingTableAllEvery (Time printInterval, Ptr<OutputStreamWrapper> stream) const;
-
-  // /**
-  //  * \brief prints the forwarding tables of a node at a particular time.
-  //  * \param printTime the time at which the forwarding table is supposed to be printed.
-  //  * \param node The node ptr for which we need the forwarding table to be printed
-  //  * \param stream The output stream object to use
-  //  *
-  //  * This method calls the PrintForwardingTable() method of the 
-  //  * CcnxForwardingStrategy stored in the Ccnx object, for the selected node 
-  //  * at the specified time; the output format is forwarding protocol-specific.
-  //  */
-  // void PrintForwardingTableAt (Time printTime, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
-
-  // /**
-  //  * \brief prints the forwarding tables of a node at regular intervals specified by user.
-  //  * \param printInterval the time interval for which the forwarding table is supposed to be printed.
-  //  * \param node The node ptr for which we need the forwarding table to be printed
-  //  * \param stream The output stream object to use
-  //  *
-  //  * This method calls the PrintForwardingTable() method of the 
-  //  * CcnxForwardingStrategy stored in the Ccnx object, for the selected node 
-  //  * at the specified interval; the output format is forwarding protocol-specific.
-  //  */
-  // void PrintForwardingTableEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
-
-private:
-  // void Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
-  // void PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputStreamWrapper> stream) const;
-};
-
-} // namespace ns3
-
-
-#endif /* CCNX_FORWARDING_HELPER_H */
diff --git a/helper/ccnx-producer-helper.cc b/helper/ccnx-producer-helper.cc
index 6e40712..2bf369b 100644
--- a/helper/ccnx-producer-helper.cc
+++ b/helper/ccnx-producer-helper.cc
@@ -19,6 +19,11 @@
  */
 
 #include "ccnx-producer-helper.h"
+#include "ns3/log.h"
+#include "ns3/ccnx-name-components.h"
+#include "ns3/uinteger.h"
+#include "ns3/names.h"
+#include "../apps/ccnx-producer.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxProducerHelper");
 
diff --git a/helper/ccnx-producer-helper.h b/helper/ccnx-producer-helper.h
index 24e494c..31f76da 100644
--- a/helper/ccnx-producer-helper.h
+++ b/helper/ccnx-producer-helper.h
@@ -21,24 +21,11 @@
 #ifndef CCNX_PRODUCER_HELPER_H
 #define CCNX_PRODUCER_HELPER_H
 
-#include <stdint.h>
-#include <string>
 #include "ns3/object-factory.h"
-#include "ns3/address.h"
 #include "ns3/attribute.h"
-#include "ns3/net-device.h"
 #include "ns3/node-container.h"
 #include "ns3/application-container.h"
-#include "ns3/ccnx-name-components.h"
-#include "ns3/pointer.h"
-#include "ns3/ccnx-local-face.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-producer.h"
-#include "ns3/uinteger.h"
-#include "ns3/ccnx-stack-helper.h"
-#include "ns3/log.h"
-#include "ns3/string.h"
-#include "ns3/names.h"
+#include "ns3/ptr.h"
 
 namespace ns3 
 {    
@@ -46,7 +33,9 @@
 * \brief A helper to make it easier to instantiate an ns3::CcnxProducer application
 * on a set of nodes.
 */
-    
+
+class Node;
+
 class CcnxProducerHelper
 {
 public:
diff --git a/helper/ccnx-stack-helper.cc b/helper/ccnx-stack-helper.cc
index 074bdde..0809d58 100644
--- a/helper/ccnx-stack-helper.cc
+++ b/helper/ccnx-stack-helper.cc
@@ -66,7 +66,11 @@
 #include "ns3/callback.h"
 #include "ns3/node.h"
 #include "ns3/core-config.h"
-#include "ns3/ccnx-forwarding-strategy.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/point-to-point-helper.h"
+
+#include "../model/ccnx-forwarding-strategy.h"
+
 #include "ns3/ccnx-net-device-face.h"
 #include "ns3/ccnx-l3-protocol.h"
 #include "ns3/ccnx-fib.h"
@@ -82,7 +86,6 @@
 
 #include "ccnx-face-container.h"
 #include "ccnx-stack-helper.h"
-#include "ccnx-forwarding-helper.h"
 
 #include <limits>
 #include <map>
diff --git a/helper/ccnx-stack-helper.h b/helper/ccnx-stack-helper.h
index bcfab3f..5147722 100644
--- a/helper/ccnx-stack-helper.h
+++ b/helper/ccnx-stack-helper.h
@@ -25,17 +25,13 @@
 #include "ns3/packet.h"
 #include "ns3/ptr.h"
 #include "ns3/object-factory.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ccnx-trace-helper.h"
-#include "ns3/ccnx-forwarding-helper.h"
-#include "ns3/ccnx.h"
-#include "ns3/ccnx-interest-header.h"
 #include "ns3/nstime.h"
 
 namespace ns3 {
 
 class Node;
 class CcnxFaceContainer;
+class CcnxFace;
 
 /**
  * \ingroup ccnx
@@ -58,7 +54,7 @@
  * attribute or a set of functionality that may be of interest to many other
  * classes.
  */
-class CcnxStackHelper //: public PcapHelperForCcnx, public AsciiTraceHelperForCcnx
+class CcnxStackHelper 
 {
 public:
   /**
diff --git a/helper/ccnx-trace-helper.cc b/helper/ccnx-trace-helper.cc
deleted file mode 100644
index a4b7170..0000000
--- a/helper/ccnx-trace-helper.cc
+++ /dev/null
@@ -1,302 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2010 University of Washington
- *
- * 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
- */
-
-#include <stdint.h>
-#include <string>
-#include <fstream>
-
-#include "ns3/abort.h"
-#include "ns3/assert.h"
-#include "ns3/log.h"
-#include "ns3/ptr.h"
-#include "ns3/node.h"
-#include "ns3/names.h"
-#include "ns3/net-device.h"
-#include "ns3/pcap-file-wrapper.h"
-
-#include "ccnx-trace-helper.h"
-
-NS_LOG_COMPONENT_DEFINE ("CcnxTraceHelper");
-
-namespace ns3 {
-
-void 
-PcapHelperForCcnx::EnablePcapCcnx (std::string prefix, Ptr<Ccnx> ccnx, uint32_t interface, bool explicitFilename)
-{
-  EnablePcapCcnxInternal (prefix, ccnx, interface, explicitFilename);
-}
-
-void 
-PcapHelperForCcnx::EnablePcapCcnx (std::string prefix, std::string ccnxName, uint32_t interface, bool explicitFilename)
-{
-  Ptr<Ccnx> ccnx = Names::Find<Ccnx> (ccnxName);
-  EnablePcapCcnx (prefix, ccnx, interface, explicitFilename);
-}
-
-  /// \todo This call is broken
-void 
-PcapHelperForCcnx::EnablePcapCcnx (std::string prefix, CcnxFaceContainer c)
-{
-  for (CcnxFaceContainer::Iterator i = c.Begin (); i != c.End (); ++i)
-    {
-      // EnablePcapCcnx (prefix, (*i)->GetCcnx (), 0,false);
-    }
-}
-
-void
-PcapHelperForCcnx::EnablePcapCcnx (std::string prefix, NodeContainer n)
-{
-  for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
-    {
-      Ptr<Node> node = *i;
-      Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-      if (ccnx)
-        {
-          for (uint32_t j = 0; j < ccnx->GetNFaces (); ++j)
-            {
-              EnablePcapCcnx (prefix, ccnx, j, false);
-            }
-        }
-    }
-}
-
-void
-PcapHelperForCcnx::EnablePcapCcnxAll (std::string prefix)
-{
-  EnablePcapCcnx (prefix, NodeContainer::GetGlobal ());
-}
-
-void 
-PcapHelperForCcnx::EnablePcapCcnx (std::string prefix, uint32_t nodeid, uint32_t interface, bool explicitFilename)
-{
-  NodeContainer n = NodeContainer::GetGlobal ();
-
-  for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
-    {
-      Ptr<Node> node = *i;
-      if (node->GetId () != nodeid) 
-        {
-          continue;
-        }
-
-      Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-      if (ccnx)
-        {
-          EnablePcapCcnx (prefix, ccnx, interface, explicitFilename);
-        }
-      return;
-    }
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (std::string prefix, Ptr<Ccnx> ccnx, uint32_t interface, bool explicitFilename)
-{
-  EnableAsciiCcnxInternal (Ptr<OutputStreamWrapper> (), prefix, ccnx, interface, explicitFilename);
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, Ptr<Ccnx> ccnx, uint32_t interface)
-{
-  EnableAsciiCcnxInternal (stream, std::string (), ccnx, interface, false);
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (
-  std::string prefix, 
-  std::string ccnxName, 
-  uint32_t interface,
-  bool explicitFilename)
-{
-  EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> (), prefix, ccnxName, interface, explicitFilename);
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, std::string ccnxName, uint32_t interface)
-{
-  EnableAsciiCcnxImpl (stream, std::string (), ccnxName, interface, false);
-}
-
-//
-// Private API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnxImpl (
-  Ptr<OutputStreamWrapper> stream, 
-  std::string prefix, 
-  std::string ccnxName, 
-  uint32_t interface,
-  bool explicitFilename)
-{
-  Ptr<Ccnx> ccnx = Names::Find<Ccnx> (ccnxName);
-  EnableAsciiCcnxInternal (stream, prefix, ccnx, interface, explicitFilename);
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (std::string prefix, CcnxFaceContainer c)
-{
-  EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> (), prefix, c);
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, CcnxFaceContainer c)
-{
-  EnableAsciiCcnxImpl (stream, std::string (), c);
-}
-
-//
-// Private API
-// \todo This method is broken
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, std::string prefix, CcnxFaceContainer c)
-{
-  for (CcnxFaceContainer::Iterator i = c.Begin (); i != c.End (); ++i)
-    {
-      // EnableAsciiCcnxInternal (stream, prefix, pair.first, pair.second, false);
-    }
-}
-
-//
-// Public API
-//
-void
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (std::string prefix, NodeContainer n)
-{
-  EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> (), prefix, n);
-}
-
-//
-// Public API
-//
-void
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, NodeContainer n)
-{
-  EnableAsciiCcnxImpl (stream, std::string (), n);
-}
-
-//
-// Private API
-//
-void
-AsciiTraceHelperForCcnx::EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, std::string prefix, NodeContainer n)
-{
-  for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
-    {
-      Ptr<Node> node = *i;
-      Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-      if (ccnx)
-        {
-          for (uint32_t j = 0; j < ccnx->GetNFaces (); ++j)
-            {
-              EnableAsciiCcnxInternal (stream, prefix, ccnx, j, false);
-            }
-        }
-    }
-}
-
-//
-// Public API
-//
-void
-AsciiTraceHelperForCcnx::EnableAsciiCcnxAll (std::string prefix)
-{
-  EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> (), prefix, NodeContainer::GetGlobal ());
-}
-
-//
-// Public API
-//
-void
-AsciiTraceHelperForCcnx::EnableAsciiCcnxAll (Ptr<OutputStreamWrapper> stream)
-{
-  EnableAsciiCcnxImpl (stream, std::string (), NodeContainer::GetGlobal ());
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (
-  Ptr<OutputStreamWrapper> stream, 
-  uint32_t nodeid, 
-  uint32_t interface,
-  bool explicitFilename)
-{
-  EnableAsciiCcnxImpl (stream, std::string (), nodeid, interface, explicitFilename);
-}
-
-//
-// Public API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnx (std::string prefix, uint32_t nodeid, uint32_t interface, bool explicitFilename)
-{
-  EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> (), prefix, nodeid, interface, explicitFilename);
-}
-
-//
-// Private API
-//
-void 
-AsciiTraceHelperForCcnx::EnableAsciiCcnxImpl (
-  Ptr<OutputStreamWrapper> stream, 
-  std::string prefix, 
-  uint32_t nodeid, 
-  uint32_t interface,
-  bool explicitFilename)
-{
-  NodeContainer n = NodeContainer::GetGlobal ();
-
-  for (NodeContainer::Iterator i = n.Begin (); i != n.End (); ++i)
-    {
-      Ptr<Node> node = *i;
-      if (node->GetId () != nodeid) 
-        {
-          continue;
-        }
-
-      Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-      if (ccnx)
-        {
-          EnableAsciiCcnxInternal (stream, prefix, ccnx, interface, explicitFilename);
-        }
-
-      return;
-    }
-}
-
-
-} // namespace ns3
-
diff --git a/helper/ccnx-trace-helper.h b/helper/ccnx-trace-helper.h
deleted file mode 100644
index 49ad8e0..0000000
--- a/helper/ccnx-trace-helper.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2010 University of Washington
- *
- * 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
- *
- * Authors: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef CCNX_TRACE_HELPER_H
-#define CCNX_TRACE_HELPER_H
-
-#include "ns3/assert.h"
-#include "ns3/ccnx-face-container.h"
-#include "ns3/ccnx.h"
-#include "ns3/trace-helper.h"
-
-namespace ns3 {
-
-/**
- * \ingroup ccnx-helpers
- *
- * @brief Base class providing common user-level pcap operations for helpers
- * representing Ccnx protocols .
- */
-class PcapHelperForCcnx
-{
-public:
-  /**
-   * @brief Construct a PcapHelperForCcnx.
-   */
-  PcapHelperForCcnx () {}
-
-  /**
-   * @brief Destroy a PcapHelperForCcnx.
-   */
-  virtual ~PcapHelperForCcnx () {}
-
-  /**
-   * @brief Enable pcap output the indicated Ccnx and interface pair.
-   * @internal
-   *
-   * @param prefix Filename prefix to use for pcap files.
-   * @param Ccnx Ptr<Ccnx> on which you want to enable tracing.
-   * @param interface Interface on Ccnx on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true
-   */
-  virtual void EnablePcapCcnxInternal (std::string prefix, 
-                                       Ptr<Ccnx> ccnx, 
-                                       uint32_t interface,
-                                       bool explicitFilename) = 0;
-
-  /**
-   * @brief Enable pcap output the indicated Ccnx and interface pair.
-   *
-   * @param prefix Filename prefix to use for pcap files.
-   * @param ccnx Ptr<Ccnx> on which you want to enable tracing.
-   * @param interface Interface on ccnx on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true.
-   */
-  void EnablePcapCcnx (std::string prefix, Ptr<Ccnx> ccnx, uint32_t interface, bool explicitFilename = false);
-
-  /**
-   * @brief Enable pcap output the indicated ccnx and interface pair using a
-   * Ptr<Ccnx> previously named using the ns-3 object name service.
-   *
-   * @param prefix filename prefix to use for pcap files.
-   * @param ccnxName Name of the Ptr<Ccnx> on which you want to enable tracing.
-   * @param interface Interface on ccnx on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true.
-   */
-  void EnablePcapCcnx (std::string prefix, std::string ccnxName, uint32_t interface, bool explicitFilename = false);
-
-  /**
-   * @brief Enable pcap output on each Ccnx and interface pair in the container.
-   *
-   * @param prefix Filename prefix to use for pcap files.
-   * @param c CcnxFaceContainer of Ccnx and interface pairs
-   */
-  void EnablePcapCcnx (std::string prefix, CcnxFaceContainer c);
-
-  /**
-   * @brief Enable pcap output on all Ccnx and interface pairs existing in the
-   * nodes provided in the container.
-   *
-   * \param prefix Filename prefix to use for pcap files.
-   * \param n container of nodes.
-   */
-  void EnablePcapCcnx (std::string prefix, NodeContainer n);
-
-  /**
-   * @brief Enable pcap output on the Ccnx and interface pair specified by a 
-   * global node-id (of a previously created node) and interface.  Since there
-   * can be only one Ccnx aggregated to a node, the node-id unambiguously 
-   * determines the Ccnx.
-   *
-   * @param prefix Filename prefix to use for pcap files.
-   * @param nodeid The node identifier/number of the node on which to enable tracing.
-   * @param interface Interface on ccnx on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true
-   */
-  void EnablePcapCcnx (std::string prefix, uint32_t nodeid, uint32_t interface, bool explicitFilename);
-
-  /**
-   * @brief Enable pcap output on all Ccnx and interface pairs existing in the 
-   * set of all nodes created in the simulation.
-   *
-   * @param prefix Filename prefix to use for pcap files.
-   */
-  void EnablePcapCcnxAll (std::string prefix);
-
-};
-
-/**
- * \ingroup ccnx-helpers
- *
- * @brief Base class providing common user-level ascii trace operations for 
- * helpers representing Ccnx protocols .
- */
-class AsciiTraceHelperForCcnx
-{
-public:
-  /**
-   * @brief Construct an AsciiTraceHelperForCcnx.
-   */
-  AsciiTraceHelperForCcnx () {}
-
-  /**
-   * @brief Destroy an AsciiTraceHelperForCcnx
-   */
-  virtual ~AsciiTraceHelperForCcnx () {}
-
-  /**
-   * @brief Enable ascii trace output on the indicated Ccnx and interface pair.
-   * @internal
-   *
-   * The implementation is expected to use a provided Ptr<OutputStreamWrapper>
-   * if it is non-null.  If the OutputStreamWrapper is null, the implementation
-   * is expected to use a provided prefix to construct a new file name for
-   * each net device using the rules described in the class overview.
-   *
-   * If the prefix is provided, there will be one file per Ccnx and interface pair
-   * created.  In this case, adding a trace context to the file would be pointless,
-   * so the helper implementation is expected to TraceConnectWithoutContext.
-   *
-   * If the output stream object is provided, there may be many different Ccnx 
-   * and interface pairs writing to a single file.  In this case, the trace 
-   * context could be important, so the helper implementation is expected to 
-   * TraceConnect.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   * @param prefix Filename prefix to use for ascii trace files.
-   * @param ccnx Ptr<Ccnx> on which you want to enable tracing.
-   * @param interface The interface on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true.
-   */
-  virtual void EnableAsciiCcnxInternal (Ptr<OutputStreamWrapper> stream, 
-                                        std::string prefix, 
-                                        Ptr<Ccnx> ccnx, 
-                                        uint32_t interface,
-                                        bool explicitFilename) = 0;
-
-  /**
-   * @brief Enable ascii trace output on the indicated ccnx and interface pair.
-   *
-   * @param prefix Filename prefix to use for ascii files.
-   * @param ccnx Ptr<Ccnx> on which you want to enable tracing.
-   * @param interface The interface on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true.
-   */
-  void EnableAsciiCcnx (std::string prefix, Ptr<Ccnx> ccnx, uint32_t interface, bool explicitFilename = false);
-
-  /**
-   * @brief Enable ascii trace output on the indicated Ccnx and interface pair.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   * @param ccnx Ptr<Ccnx> on which you want to enable tracing.
-   * @param interface The interface on which you want to enable tracing.
-   */
-  void EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, Ptr<Ccnx> ccnx, uint32_t interface);
-
-  /**
-   * @brief Enable ascii trace output the indicated ccnx and interface pair
-   * using an ccnx previously named using the ns-3 object name service.
-   *
-   * @param prefix filename prefix to use for ascii files.
-   * @param ccnxName The name of the ccnx on which you want to enable tracing.
-   * @param interface The interface on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true.
-   */
-  void EnableAsciiCcnx (std::string prefix, std::string ccnxName, uint32_t interface, bool explicitFilename = false);
-
-  /**
-   * @brief Enable ascii trace output the indicated net device using a device 
-   * previously named using the ns-3 object name service.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   * @param ccnxName The name of the ccnx on which you want to enable tracing.
-   * @param interface The interface on which you want to enable tracing.
-   */
-  void EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, std::string ccnxName, uint32_t interface);
-
-  /**
-   * @brief Enable ascii trace output on each Ccnx and interface pair in the 
-   * container
-   *
-   * @param prefix Filename prefix to use for ascii files.
-   * @param c CcnxFaceContainer of Ccnx and interface pairs on which to 
-   *          enable tracing.
-   */
-  void EnableAsciiCcnx (std::string prefix, CcnxFaceContainer c);
-
-  /**
-   * @brief Enable ascii trace output on each device in the container which is
-   * of the appropriate type.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   * @param c ccnxInterfaceContainer of ccnx and interface pairs on which to 
-   *          enable tracing.
-   */
-  void EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, CcnxFaceContainer c);
-
-  /**
-   * @brief Enable ascii trace output on all ccnx and interface pairs existing
-   * in the nodes provided in the container.
-   *
-   * \param prefix Filename prefix to use for ascii files.
-   * \param n container of nodes.
-   */
-  void EnableAsciiCcnx (std::string prefix, NodeContainer n);
-
-  /**
-   * @brief Enable ascii trace output on all ccnx and interface pairs existing
-   * in the nodes provided in the container.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   * \param n container of nodes.
-   */
-  void EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, NodeContainer n);
-
-  /**
-   * @brief Enable ascii trace output on all Ccnx and interface pairs existing
-   * in the set of all nodes created in the simulation.
-   *
-   * @param prefix Filename prefix to use for ascii files.
-   */
-  void EnableAsciiCcnxAll (std::string prefix);
-
-  /**
-   * @brief Enable ascii trace output on each device (which is of the
-   * appropriate type) in the set of all nodes created in the simulation.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   */
-  void EnableAsciiCcnxAll (Ptr<OutputStreamWrapper> stream);
-
-  /**
-   * @brief Enable pcap output on the Ccnx and interface pair specified by a 
-   * global node-id (of a previously created node) and interface.  Since there
-   * can be only one Ccnx aggregated to a node, the node-id unambiguously 
-   * determines the Ccnx.
-   *
-   * @param prefix Filename prefix to use when creating ascii trace files
-   * @param nodeid The node identifier/number of the node on which to enable
-   *               ascii tracing
-   * @param deviceid The device identifier/index of the device on which to enable
-   *                 ascii tracing
-   * @param explicitFilename Treat the prefix as an explicit filename if true
-   */
-  void EnableAsciiCcnx (std::string prefix, uint32_t nodeid, uint32_t deviceid, bool explicitFilename);
-
-  /**
-   * @brief Enable pcap output on the ccnx and interface pair specified by a 
-   * global node-id (of a previously created node) and interface.  Since there
-   * can be only one ccnx aggregated to a node, the node-id unambiguously 
-   * determines the ccnx.
-   *
-   * @param stream An OutputStreamWrapper representing an existing file to use
-   *               when writing trace data.
-   * @param nodeid The node identifier/number of the node on which to enable
-   *               ascii tracing
-   * @param interface The interface on which you want to enable tracing.
-   * @param explicitFilename Treat the prefix as an explicit filename if true
-   */
-  void EnableAsciiCcnx (Ptr<OutputStreamWrapper> stream, uint32_t nodeid, uint32_t interface, bool explicitFilename);
-
-private:
-  /**
-   * @internal Avoid code duplication.
-   */
-  void EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, 
-                            std::string prefix, 
-                            uint32_t nodeid, 
-                            uint32_t interface,
-                            bool explicitFilename);
-
-  /**
-   * @internal Avoid code duplication.
-   */
-  void EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, std::string prefix, NodeContainer n);
-
-  /**
-   * @internal Avoid code duplication.
-   */
-  void EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, std::string prefix, CcnxFaceContainer c);
-
-  /**
-   * @internal Avoid code duplication.
-   */
-  void EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, 
-                            std::string prefix, 
-                            std::string ccnxName, 
-                            uint32_t interface,
-                            bool explicitFilename);
-
-  /**
-   * @internal Avoid code duplication.
-   */
-  void EnableAsciiCcnxImpl (Ptr<OutputStreamWrapper> stream, 
-                            std::string prefix, 
-                            Ptr<Ccnx> ccnx, 
-                            uint32_t interface,
-                            bool explicitFilename);
-};
-
-} // namespace ns3
-
-#endif /* CCNX_TRACE_HELPER_H */
diff --git a/helper/ndnabstraction-helper.cc b/helper/ndnabstraction-helper.cc
deleted file mode 100644
index d8d5db3..0000000
--- a/helper/ndnabstraction-helper.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; c-set-offset 'innamespace 0; -*- */
-/*
- *  ndnabstraction-helper.c
- *  XcodeProject
- *
- *  Created by Ilya Moiseenko on 7/18/11.
- *  Copyright 2011 University of California, Los Angeles. All rights reserved.
- *
- */
-
-#include "ndnabstraction-helper.h"
-
-namespace ns3{
-
-}
-
diff --git a/helper/ndnabstraction-helper.h b/helper/ndnabstraction-helper.h
deleted file mode 100644
index 22e64c7..0000000
--- a/helper/ndnabstraction-helper.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- *  ndnabstraction-helper.h
- *  XcodeProject
- *
- *  Created by Ilya Moiseenko on 7/18/11.
- *  Copyright 2011 University of California, Los Angeles. All rights reserved.
- *
- */
-
-namespace ns3 {
-
-}
