diff --git a/helper/ccnx-consumer-helper.cc b/helper/ccnx-consumer-helper.cc
index b99e0b6..765f6b6 100644
--- a/helper/ccnx-consumer-helper.cc
+++ b/helper/ccnx-consumer-helper.cc
@@ -27,10 +27,13 @@
 namespace ns3 
 {
     
-CcnxConsumerHelper::CcnxConsumerHelper (Ptr<CcnxNameComponents> interestName)
+CcnxConsumerHelper::CcnxConsumerHelper (const std::string &prefix)
 {
     m_factory.SetTypeId ("ns3::CcnxConsumer");
-    m_factory.Set ("InterestName", CcnxNameComponentsValue (*interestName));
+    
+    CcnxNameComponentsValue prefixValue;
+    prefixValue.DeserializeFromString (prefix, MakeCcnxNameComponentsChecker ());
+    m_factory.Set ("InterestName", prefixValue);
 }
     
 void 
@@ -67,17 +70,10 @@
 Ptr<Application>
 CcnxConsumerHelper::InstallPriv (Ptr<Node> node)
 {
-    Ptr<CcnxLocalFace> localFace = CreateObject<CcnxLocalFace> ();
-    localFace->SetNode(node);
-    
-    m_factory.Set ("Face", PointerValue (localFace));
-    Ptr<CcnxConsumer> app = m_factory.Create<CcnxConsumer> ();
-        
-    localFace->RegisterProtocolHandler (MakeCallback (&CcnxConsumer::HandlePacket, app));
-    localFace->SetUp();
-        
+    Ptr<CcnxConsumer> app = m_factory.Create<CcnxConsumer> ();        
     node->AddApplication (app);
         
     return app;
 }
+
 }
diff --git a/helper/ccnx-consumer-helper.h b/helper/ccnx-consumer-helper.h
index e512a8f..d885e2e 100644
--- a/helper/ccnx-consumer-helper.h
+++ b/helper/ccnx-consumer-helper.h
@@ -38,69 +38,70 @@
 namespace ns3 
 {    
 /**
-* \brief A helper to make it easier to instantiate an ns3::CcnxConsumer Application
-* on a set of nodes.
-*/
+ * \brief A helper to make it easier to instantiate an ns3::CcnxConsumer Application
+ * on a set of nodes.
+ */
     
 class CcnxConsumerHelper
 {        
 public:
 
-/**
-* Create an CcnxConsumerHelper to make it easier to work with CcnxConsumer Apps
-*
-*/
-CcnxConsumerHelper (Ptr<CcnxNameComponents> interestName);
+  /**
+   * \brief Create an CcnxConsumerHelper to make it easier to work with CcnxConsumer Apps
+   *
+   * \param prefix Prefix which will be requested by the consumer applications
+   */
+  CcnxConsumerHelper (const std::string &prefix);
         
-/**
-* Helper function used to set the underlying application attributes.
-*
-* \param name the name of the application attribute to set
-* \param value the value of the application attribute to set
-*/
-void SetAttribute (std::string name, const AttributeValue &value);
+  /**
+   * \brief Helper function used to set the underlying application attributes.
+   *
+   * \param name the name of the application attribute to set
+   * \param value the value of the application attribute to set
+   */
+  void SetAttribute (std::string name, const AttributeValue &value);
         
-/**
-* Install an ns3::CcnxConsumer on each node of the input container
-* configured with all the attributes set with SetAttribute.
-*
-* \param c NodeContainer of the set of nodes on which an CcnxConsumer 
-* will be installed.
-* \returns Container of Ptr to the applications installed.
-*/
-ApplicationContainer Install (NodeContainer c);
+  /**
+   * Install an ns3::CcnxConsumer on each node of the input container
+   * configured with all the attributes set with SetAttribute.
+   *
+   * \param c NodeContainer of the set of nodes on which an CcnxConsumer 
+   * will be installed.
+   * \returns Container of Ptr to the applications installed.
+   */
+  ApplicationContainer Install (NodeContainer c);
         
-/**
-* Install an ns3::CcnxConsumer on the node configured with all the 
-* attributes set with SetAttribute.
-*
-* \param node The node on which an CcnxConsumer will be installed.
-* \returns Container of Ptr to the applications installed.
-*/
-ApplicationContainer Install (Ptr<Node> node);
+  /**
+   * Install an ns3::CcnxConsumer on the node configured with all the 
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an CcnxConsumer will be installed.
+   * \returns Container of Ptr to the applications installed.
+   */
+  ApplicationContainer Install (Ptr<Node> node);
         
-/**
-* Install an ns3::CcnxConsumer on the node configured with all the 
-* attributes set with SetAttribute.
-*
-* \param nodeName The node on which an CcnxConsumer will be installed.
-* \returns Container of Ptr to the applications installed.
-*/
-ApplicationContainer Install (std::string nodeName);
+  /**
+   * Install an ns3::CcnxConsumer on the node configured with all the 
+   * attributes set with SetAttribute.
+   *
+   * \param nodeName The node on which an CcnxConsumer will be installed.
+   * \returns Container of Ptr to the applications installed.
+   */
+  ApplicationContainer Install (std::string nodeName);
         
 private:
-/**
-* \internal
-* Install an ns3::CcnxConsumer on the node configured with all the 
-* attributes set with SetAttribute.
-*
-* \param node The node on which an CcnxConsumer will be installed.
-* \returns Ptr to the application installed.
-*/
-Ptr<Application> InstallPriv (Ptr<Node> node);
-ObjectFactory m_factory;
+  /**
+   * \internal
+   * Install an ns3::CcnxConsumer on the node configured with all the 
+   * attributes set with SetAttribute.
+   *
+   * \param node The node on which an CcnxConsumer will be installed.
+   * \returns Ptr to the application installed.
+   */
+  Ptr<Application> InstallPriv (Ptr<Node> node);
+  ObjectFactory m_factory;
+};
 
-};    
 }
 
 #endif
diff --git a/helper/ccnx-face-container.cc b/helper/ccnx-face-container.cc
index ce595bb..8a7a9e2 100644
--- a/helper/ccnx-face-container.cc
+++ b/helper/ccnx-face-container.cc
@@ -76,16 +76,16 @@
   return m_faces.size ();
 }
 
-void 
-CcnxFaceContainer::SetMetricToAll (uint16_t metric)
-{
-  for (FaceContainer::iterator it=m_faces.begin ();
-       it != m_faces.end ();
-       it++)
-    {
-      (*it)->SetMetric (metric);
-    }
-}
+// void 
+// CcnxFaceContainer::SetMetricToAll (uint16_t metric)
+// {
+//   for (FaceContainer::iterator it=m_faces.begin ();
+//        it != m_faces.end ();
+//        it++)
+//     {
+//       (*it)->SetMetric (metric);
+//     }
+// }
 
 void 
 CcnxFaceContainer::Add (const Ptr<CcnxFace> &face)
diff --git a/helper/ccnx-face-container.h b/helper/ccnx-face-container.h
index ecb29d9..39391f8 100644
--- a/helper/ccnx-face-container.h
+++ b/helper/ccnx-face-container.h
@@ -26,11 +26,10 @@
 
 #include "ns3/ptr.h"
 #include "ns3/simple-ref-count.h"
+#include "ns3/ccnx-face.h"
 
 namespace ns3 {
 
-class CcnxFace;
-
 /**
  * \ingroup ccnx-helpers
  * \brief A pool for CCNx faces
@@ -105,12 +104,12 @@
    */
   uint32_t GetN () const;
 
-  /**
-   * \brief Set a metric for all faces in the container
-   *
-   * \param metric value of metric to assign to all faces in the container
-   */
-  void SetMetricToAll (uint16_t metric);
+  // /**
+  //  * \brief Set a metric for all faces in the container
+  //  *
+  //  * \param metric value of metric to assign to all faces in the container
+  //  */
+  // void SetMetricToAll (uint16_t metric);
 
   /**
    * Add an entry to the container
diff --git a/helper/ccnx-header-helper.cc b/helper/ccnx-header-helper.cc
index 85c88f1..1c7a806 100644
--- a/helper/ccnx-header-helper.cc
+++ b/helper/ccnx-header-helper.cc
@@ -27,6 +27,7 @@
 
 #include "ns3/ccnx-interest-header.h"
 #include "ns3/ccnx-content-object-header.h"
+#include <iomanip>
 
 NS_LOG_COMPONENT_DEFINE ("CcnxHeaderHelper");
 
@@ -35,12 +36,12 @@
 {
 
 CcnxHeaderHelper::Type
-CcnxHeaderHelper::CreateCorrectCcnxHeader (Ptr<const Packet> packet)
+CcnxHeaderHelper::GetCcnxHeaderType (Ptr<const Packet> packet)
 {
   uint8_t type[2];
   uint32_t read=packet->CopyData (type,2);
   if (read!=2) throw CcnxUnknownHeaderException();
-  
+
   if (type[0] == INTEREST_BYTE0 && type[1] == INTEREST_BYTE1)
     {
       return CcnxHeaderHelper::INTEREST;
diff --git a/helper/ccnx-header-helper.h b/helper/ccnx-header-helper.h
index 996b874..f4096db 100644
--- a/helper/ccnx-header-helper.h
+++ b/helper/ccnx-header-helper.h
@@ -74,7 +74,7 @@
    */
   
   static Type
-  CreateCorrectCcnxHeader (Ptr<const Packet> packet);
+  GetCcnxHeaderType (Ptr<const Packet> packet);
 };
 
   /**
diff --git a/helper/ccnx-interest-sender-helper.cc b/helper/ccnx-interest-sender-helper.cc
deleted file mode 100644
index addd9de..0000000
--- a/helper/ccnx-interest-sender-helper.cc
+++ /dev/null
@@ -1,80 +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 "ccnx-interest-sender-helper.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/packet-socket-address.h"
-#include "ns3/string.h"
-#include "ns3/names.h"
-
-namespace ns3 
-{
-    
-CcnxInterestSenderHelper::CcnxInterestSenderHelper (Ptr<CcnxNameComponents> interestName)
-{
-    m_factory.SetTypeId ("ns3::CcnxConsumer");
-    m_factory.Set ("InterestName", CcnxNameComponentsValue (*interestName));
-}
-    
-void 
-CcnxInterestSenderHelper::SetAttribute (std::string name, const AttributeValue &value)
-{
-    m_factory.Set (name, value);
-}
-    
-ApplicationContainer
-CcnxInterestSenderHelper::Install (Ptr<Node> node)
-{
-    return ApplicationContainer (InstallPriv (node));
-}
-    
-ApplicationContainer
-CcnxInterestSenderHelper::Install (std::string nodeName)
-{
-    Ptr<Node> node = Names::Find<Node> (nodeName);
-    return ApplicationContainer (InstallPriv (node));
-}
-    
-ApplicationContainer
-CcnxInterestSenderHelper::Install (NodeContainer c)
-{
-    ApplicationContainer apps;
-    for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
-    {
-        apps.Add (InstallPriv (*i));
-    }
-        
-    return apps;
-}
-    
-Ptr<Application>
-CcnxInterestSenderHelper::InstallPriv (Ptr<Node> node)
-{
-    Ptr<CcnxLocalFace> localFace = Create<CcnxLocalFace> ();
-    localFace->SetNode(node);
-    localFace->SetUp();
-    m_factory.Set ("Face", PointerValue (localFace));
-    
-    Ptr<Application> app = m_factory.Create<Application> ();
-    node->AddApplication (app);
-        
-    return app;
-}
-}
\ No newline at end of file
diff --git a/helper/ccnx-interest-sender-helper.h b/helper/ccnx-interest-sender-helper.h
deleted file mode 100644
index b58b41f..0000000
--- a/helper/ccnx-interest-sender-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_INTEREST_SENDER_HELPER_H
-#define CCNX_INTEREST_SENDER_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"
-
-namespace ns3 
-{    
-/**
- * \brief A helper to make it easier to instantiate an ns3::CcnxInterestSenderApplication
- * on a set of nodes.
- */
-
-class CcnxInterestSenderHelper
-{
-
-public:
-    /**
-     * Create an CcnxInterestSenderHelper to make it easier to work with CcnxInterestSenderApps
-     *
-     */
-    CcnxInterestSenderHelper (Ptr<CcnxNameComponents> interestName);
-        
-    /**
-     * Helper function used to set the underlying application attributes.
-     *
-     * \param name the name of the application attribute to set
-     * \param value the value of the application attribute to set
-     */
-    void SetAttribute (std::string name, const AttributeValue &value);
-        
-    /**
-     * Install an ns3::CcnxInterestSender on each node of the input container
-     * configured with all the attributes set with SetAttribute.
-     *
-     * \param c NodeContainer of the set of nodes on which an CcnxInterestSender 
-     * will be installed.
-     * \returns Container of Ptr to the applications installed.
-     */
-    ApplicationContainer Install (NodeContainer c);
-        
-    /**
-     * Install an ns3::CcnxInterestSender on the node configured with all the 
-     * attributes set with SetAttribute.
-     *
-     * \param node The node on which an CcnxInterestSender will be installed.
-     * \returns Container of Ptr to the applications installed.
-     */
-    ApplicationContainer Install (Ptr<Node> node);
-        
-    /**
-     * Install an ns3::CcnxInterestSender on the node configured with all the 
-     * attributes set with SetAttribute.
-     *
-     * \param nodeName The node on which an CcnxInterestSender will be installed.
-     * \returns Container of Ptr to the applications installed.
-     */
-    ApplicationContainer Install (std::string nodeName);
-        
-private:
-    /**
-     * \internal
-     * Install an ns3::CcnxInterestSender on the node configured with all the 
-     * attributes set with SetAttribute.
-     *
-     * \param node The node on which an CcnxInterestSender will be installed.
-     * \returns Ptr to the application installed.
-    */
-    Ptr<Application> InstallPriv (Ptr<Node> node);
-    ObjectFactory m_factory;
-};    
-}
-
-#endif
-
diff --git a/helper/ccnx-producer-helper.cc b/helper/ccnx-producer-helper.cc
index 71a7c32..433a15a 100644
--- a/helper/ccnx-producer-helper.cc
+++ b/helper/ccnx-producer-helper.cc
@@ -72,11 +72,9 @@
 Ptr<Application>
 CcnxProducerHelper::InstallPriv (Ptr<Node> node)
 {
-    Ptr<CcnxLocalFace> localFace = CreateObject<CcnxLocalFace> ();
+    Ptr<CcnxLocalFace> localFace = Create<CcnxLocalFace> ();
     localFace->SetNode(node);
-    
-    
-    
+        
     //CreateAndAggregateObjectFromTypeId (node, "ns3::CcnxL3Protocol");
     ObjectFactory factory;
     factory.SetTypeId("ns3::CcnxL3Protocol");
@@ -92,7 +90,7 @@
         return 0;
     }
 
-    m_factory.Set ("Face", PointerValue (localFace));
+    // m_factory.Set ("Face", PointerValue (localFace));
     m_factory.Set ("Ccnx", PointerValue (ccnx));
     Ptr<CcnxProducer> app = m_factory.Create<CcnxProducer> ();
 
@@ -104,4 +102,4 @@
         
     return app;
 }
-}
\ No newline at end of file
+}
diff --git a/helper/ccnx-stack-helper.cc b/helper/ccnx-stack-helper.cc
index d59827e..428ddef 100644
--- a/helper/ccnx-stack-helper.cc
+++ b/helper/ccnx-stack-helper.cc
@@ -69,6 +69,7 @@
 #include "ns3/ccnx-forwarding-strategy.h"
 #include "ns3/ccnx-net-device-face.h"
 #include "ns3/ccnx-l3-protocol.h"
+#include "ns3/ccnx-fib.h"
 
 #include "ccnx-face-container.h"
 #include "ccnx-stack-helper.h"
@@ -112,37 +113,15 @@
 static FaceStreamMapCcnx g_faceStreamMapCcnx; /**< A mapping of Ccnx/face pairs to ascii streams */
 
 CcnxStackHelper::CcnxStackHelper ()
-  : m_forwarding (0)
-  , m_ccnxEnabled (true)
 {
-  Initialize ();
-}
-
-// private method called by both constructor and Reset ()
-void
-CcnxStackHelper::Initialize ()
-{
-  // CcnxStaticForwardingHelper staticForwarding;
-  // CcnxGlobalForwardingHelper globalForwarding;
-  // CcnxListForwardingHelper listForwarding;
-  // listForwarding.Add (staticForwarding, 0);
-  // listForwarding.Add (globalForwarding, -10);
-  // SetForwardingHelper (listForwarding);
 }
 
 CcnxStackHelper::~CcnxStackHelper ()
 {
-  if (m_forwarding)
-    {
-      delete m_forwarding;
-      m_forwarding = 0;
-    }
 }
 
 CcnxStackHelper::CcnxStackHelper (const CcnxStackHelper &o)
 {
-  m_forwarding = o.m_forwarding->Copy ();
-  m_ccnxEnabled = o.m_ccnxEnabled;
 }
 
 CcnxStackHelper &
@@ -152,30 +131,14 @@
     {
       return *this;
     }
-  m_forwarding = o.m_forwarding->Copy ();
   return *this;
 }
 
-void
-CcnxStackHelper::Reset (void)
-{
-  delete m_forwarding;
-  m_forwarding = 0;
-  m_ccnxEnabled = true;
-  Initialize ();
-}
-
 void 
 CcnxStackHelper::SetForwardingHelper (const CcnxForwardingHelper &forwarding)
 {
-  delete m_forwarding;
-  m_forwarding = forwarding.Copy ();
-}
-
-void
-CcnxStackHelper::SetCcnxStackInstall (bool enable)
-{
-  m_ccnxEnabled = enable;
+  // delete m_forwarding;
+  // m_forwarding = forwarding.Copy ();
 }
 
 Ptr<CcnxFaceContainer>
@@ -195,14 +158,14 @@
   return Install (NodeContainer::GetGlobal ());
 }
 
-void
-CcnxStackHelper::CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId)
-{
-  ObjectFactory factory;
-  factory.SetTypeId (typeId);
-  Ptr<Object> protocol = factory.Create <Object> ();
-  node->AggregateObject (protocol);
-}
+// void
+// CcnxStackHelper::CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId)
+// {
+//   ObjectFactory factory;
+//   factory.SetTypeId (typeId);
+//   Ptr<Object> protocol = factory.Create <Object> ();
+//   node->AggregateObject (protocol);
+// }
 
 Ptr<CcnxFaceContainer>
 CcnxStackHelper::Install (Ptr<Node> node) const
@@ -210,30 +173,31 @@
   // NS_ASSERT_MSG (m_forwarding, "SetForwardingHelper() should be set prior calling Install() method");
   Ptr<CcnxFaceContainer> faces = Create<CcnxFaceContainer> ();
   
-  if (m_ccnxEnabled)
+  if (node->GetObject<Ccnx> () != 0)
     {
-      if (node->GetObject<Ccnx> () != 0)
-        {
-          NS_FATAL_ERROR ("CcnxStackHelper::Install (): Installing " 
-                          "a CcnxStack to a node with an existing Ccnx object");
-          return 0;
-        }
-
-      CreateAndAggregateObjectFromTypeId (node, "ns3::CcnxL3Protocol");
-      // Set forwarding
-      Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
-      for (uint32_t index=0; index < node->GetNDevices (); index++)
-        {
-          Ptr<CcnxNetDeviceFace> face = Create<CcnxNetDeviceFace> (node->GetDevice (index));
-          uint32_t __attribute__ ((unused)) face_id = ccnx->AddFace (face);
-          NS_LOG_LOGIC ("Node " << node->GetId () << ": added CcxnNetDeviceFace as face #" << face_id);
-
-          faces->Add (face);
-        }
-      // Ptr<CcnxForwardingStrategy> ccnxForwarding = m_forwarding->Create (node);
-      // ccnx->SetForwardingStrategy (ccnxForwarding);
+      NS_FATAL_ERROR ("CcnxStackHelper::Install (): Installing " 
+                      "a CcnxStack to a node with an existing Ccnx object");
+      return 0;
     }
 
+  Ptr<CcnxFib> fib = CreateObject<CcnxFib> ();
+  node->AggregateObject (fib);
+
+  Ptr<Ccnx> ccnx = CreateObject<CcnxL3Protocol> ();
+  node->AggregateObject (ccnx);
+
+  for (uint32_t index=0; index < node->GetNDevices (); index++)
+    {
+      Ptr<CcnxNetDeviceFace> face = Create<CcnxNetDeviceFace> (node->GetDevice (index));
+      face->SetNode (node);
+      uint32_t __attribute__ ((unused)) face_id = ccnx->AddFace (face);
+      NS_LOG_LOGIC ("Node " << node->GetId () << ": added CcxnNetDeviceFace as face #" << face_id);
+
+      faces->Add (face);
+    }
+  // Ptr<CcnxForwardingStrategy> ccnxForwarding = m_forwarding->Create (node);
+  // ccnx->SetForwardingStrategy (ccnxForwarding);
+
   return faces;
 }
 
@@ -244,6 +208,26 @@
   return Install (node);
 }
 
+
+void
+CcnxStackHelper::AddRoute (std::string nodeName, std::string prefix, uint32_t faceId, int32_t metric)
+{
+  NS_LOG_LOGIC ("[" << nodeName << "]$ route add " << prefix << " via " << faceId << " metric " << metric);
+  
+  Ptr<Node> node = Names::Find<Node> (nodeName);
+  NS_ASSERT_MSG (node != 0, "Node [" << nodeName << "] does not exist");
+  
+  Ptr<Ccnx>     ccnx = node->GetObject<Ccnx> ();
+  Ptr<CcnxFib>  fib  = node->GetObject<CcnxFib> ();
+  Ptr<CcnxFace> face = ccnx->GetFace (faceId);
+  NS_ASSERT_MSG (node != 0, "Face with ID [" << faceId << "] does not exist on node [" << nodeName << "]");
+
+  CcnxNameComponentsValue prefixValue;
+  prefixValue.DeserializeFromString (prefix, MakeCcnxNameComponentsChecker ());
+  fib->Add (prefixValue.Get (), face, metric);
+}
+
+
 static void
 CcnxL3ProtocolRxTxSink (Ptr<const Packet> p, Ptr<Ccnx> ccnx, uint32_t face)
 {
@@ -286,12 +270,6 @@
 {
   NS_LOG_FUNCTION (prefix << ccnx << face);
 
-  if (!m_ccnxEnabled)
-    {
-      NS_LOG_INFO ("Call to enable Ccnx pcap tracing but Ccnx not enabled");
-      return;
-    }
-
   //
   // We have to create a file and a mapping from protocol/face to file 
   // irrespective of how many times we want to trace a particular protocol.
@@ -412,12 +390,6 @@
   uint32_t face,
   bool explicitFilename)
 {
-  if (!m_ccnxEnabled)
-    {
-      NS_LOG_INFO ("Call to enable Ccnx ascii tracing but Ccnx not enabled");
-      return;
-    }
-
   //
   // Our trace sinks are going to use packet printing, so we have to 
   // make sure that is turned on.
diff --git a/helper/ccnx-stack-helper.h b/helper/ccnx-stack-helper.h
index 060b0a7..1e587e3 100644
--- a/helper/ccnx-stack-helper.h
+++ b/helper/ccnx-stack-helper.h
@@ -72,11 +72,6 @@
   CcnxStackHelper &operator = (const CcnxStackHelper &o);
 
   /**
-   * \brief Return helper internal state to that of a newly constructed one
-   */
-  void Reset ();
-
-  /**
    * Set forwarding strategy helper
    *
    * \param forwarding a new forwarding helper
@@ -142,12 +137,15 @@
   InstallAll () const;
 
   /**
-   * \brief Enable/disable ccnx stack install.
+   * \brief Add forwarding entry in FIB
    *
-   * \param enable enable state
+   * \param nodeName Node name
+   * \param prefix Routing prefix
+   * \param faceId Face index
+   * \param metric Routing metric
    */
   void
-  SetCcnxStackInstall (bool enable);
+  AddRoute (std::string nodeName, std::string prefix, uint32_t faceId, int32_t metric);
 
 private:
   /**
@@ -179,14 +177,10 @@
                                         uint32_t interface,
                                         bool explicitFilename);
 
-  void Initialize (void);
-  ObjectFactory m_tcpFactory;
-  const CcnxForwardingHelper *m_forwarding;
-
-  /**
-   * \internal
-   */
-  static void CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId);
+  // /**
+  //  * \internal
+  //  */
+  // static void CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId);
 
   /**
    * \internal
@@ -202,11 +196,6 @@
    * \internal
    */
   bool AsciiHooked (Ptr<Ccnx> ccnx);
-
-  /**
-   * \brief Ccnx install state (enabled/disabled) ?
-   */
-  bool m_ccnxEnabled;
 };
 
 } // namespace ns3
