diff --git a/apps/ccnx-app.cc b/apps/ccnx-app.cc
index a23167e..7b9c2b9 100644
--- a/apps/ccnx-app.cc
+++ b/apps/ccnx-app.cc
@@ -20,9 +20,14 @@
 
 #include "ccnx-app.h"
 #include "ns3/log.h"
+#include "ns3/assert.h"
 #include "ns3/packet.h"
+
 #include "ns3/ccnx-interest-header.h"
 #include "ns3/ccnx-content-object-header.h"
+#include "ns3/ccnx.h"
+#include "ns3/ccnx-fib.h"
+#include "ns3/ccnx-local-face.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxApp");
 
@@ -32,7 +37,7 @@
 NS_OBJECT_ENSURE_REGISTERED (CcnxApp);
     
 TypeId
-CcnxConsumer::GetTypeId (void)
+CcnxApp::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::CcnxApp")
     .SetParent<Application> ()
@@ -43,7 +48,7 @@
     
 CcnxApp::CcnxApp ()
   : m_protocolHandler (0)
-  , m_active (true)
+  , m_active (false)
   , m_face (0)
 {
 }
@@ -54,12 +59,12 @@
 }
 
 void
-CcnxProducer::DoDispose (void)
+CcnxApp::DoDispose (void)
 {
   NS_LOG_FUNCTION_NOARGS ();
 
   StopApplication ();
-  CcnxApp::DoDispose ();
+  Application::DoDispose ();
 }
 
 void
@@ -96,16 +101,14 @@
   NS_ASSERT (m_active != true);
   m_active = true;
 
-  NS_ASSERT_MSG (GetObject<Ccnx> () != 0,
+  NS_ASSERT_MSG (GetNode ()->GetObject<Ccnx> () != 0,
                  "Ccnx stack should be installed on the node " << GetNode ());
-  NS_ASSERT_MSG (GetObject<CcnxFib> () != 0);
 
   // step 1. Create a face
   m_face = Create<CcnxLocalFace> (/*Ptr<CcnxApp> (this)*/this);
     
   // step 2. Add face to the CCNx stack
-  GetObject<CcnxFib> ()->Add (m_prefix, m_face, 0);
-  GetObject<Ccnx> ()->AddFace (m_face);
+  GetNode ()->GetObject<Ccnx> ()->AddFace (m_face);
 
   // step 3. Enable face
   m_face->SetUp (true);
@@ -118,8 +121,7 @@
 
   if (!m_active) return; //don't assert here, just return
  
-  NS_ASSERT (GetObject<Ccnx> () != 0);
-  NS_ASSERT (GetObject<CcnxFib> () != 0);
+  NS_ASSERT (GetNode ()->GetObject<Ccnx> () != 0);
 
   m_active = false;
 
@@ -127,14 +129,14 @@
   m_face->SetUp (false);
 
   // step 2. Remove face from CCNx stack
-  GetObject<Ccnx> ()->RemoveFace (m_face);
-  GetObject<CcnxFib> ()->Add (m_prefix, m_face, 0);
+  GetNode ()->GetObject<Ccnx> ()->RemoveFace (m_face);
+  GetNode ()->GetObject<CcnxFib> ()->RemoveFromAll (m_face);
 
   // step 3. Destroy face
   NS_ASSERT_MSG (m_face->GetReferenceCount ()==1,
-                 "At this point, nobody else should have referenced this face");
+                 "At this point, nobody else should have referenced this face, but we have "
+                 << m_face->GetReferenceCount () << " references");
   m_face = 0;
 }
 
-
 }
diff --git a/apps/ccnx-app.h b/apps/ccnx-app.h
index 4f2cb83..f94018f 100644
--- a/apps/ccnx-app.h
+++ b/apps/ccnx-app.h
@@ -31,6 +31,7 @@
 class Packet;
 class CcnxInterestHeader;
 class CcnxContentObjectHeader;
+class CcnxFace;
 
 /**
  * @ingroup ccnx
@@ -41,7 +42,7 @@
 class CcnxApp: public Application
 {
 public:
-  typedef Callback<bool, const Ptr<CcnxFace>&> ProtocolHandler;
+  typedef Callback<bool, const Ptr<const Packet>&> ProtocolHandler;
   
   static TypeId GetTypeId ();
 
@@ -94,8 +95,6 @@
 protected:
   ProtocolHandler m_protocolHandler;
   bool m_active; 
-
-private:
   Ptr<CcnxFace> m_face; // local face that is created 
 };
 
diff --git a/apps/ccnx-consumer.cc b/apps/ccnx-consumer.cc
index 01a5b1d..5d2ce7c 100644
--- a/apps/ccnx-consumer.cc
+++ b/apps/ccnx-consumer.cc
@@ -20,12 +20,21 @@
 
 #include "ccnx-consumer.h"
 #include "ns3/ptr.h"
-#include "ns3/ccnx-local-face.h"
-#include "ns3/ccnx.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
+#include "ns3/packet.h"
 #include "ns3/callback.h"
 #include "ns3/string.h"
+#include "ns3/boolean.h"
+#include "ns3/uinteger.h"
+
+#include "ns3/ccnx.h"
+#include "ns3/ccnx-local-face.h"
+#include "ns3/ccnx-interest-header.h"
 #include "ns3/ccnx-content-object-header.h"
 
+#include <boost/ref.hpp>
+
 NS_LOG_COMPONENT_DEFINE ("CcnxConsumer");
 
 namespace ns3
@@ -67,14 +76,14 @@
                    CcnxNameComponentsValue (),
                    MakeCcnxNameComponentsAccessor (&CcnxConsumer::m_exclude),
                    MakeCcnxNameComponentsChecker ())
-    .AddAttribute ("Initial Nonce", "If 0 then nonce is not used",
-                   UintegerValue(1),
-                   MakeUintegerAccessor(&CcnxConsumer::m_initialNonce),
-                   MakeUintegerChecker<uint32_t>())
-    .AddTraceSource ("InterestTrace", "Interests that were sent",
-                     MakeTraceSourceAccessor (&CcnxConsumer::m_interestsTrace))
-    .AddTraceSource ("ContentObjectTrace", "ContentObjects that were received",
-                     MakeTraceSourceAccessor (&CcnxConsumer::m_contentObjectsTrace))
+    // .AddAttribute ("Initial Nonce", "If 0 then nonce is not used",
+    //                UintegerValue(1),
+    //                MakeUintegerAccessor(&CcnxConsumer::m_initialNonce),
+    //                MakeUintegerChecker<uint32_t>())
+    // .AddTraceSource ("InterestTrace", "Interests that were sent",
+    //                  MakeTraceSourceAccessor (&CcnxConsumer::m_interestsTrace))
+    // .AddTraceSource ("ContentObjectTrace", "ContentObjects that were received",
+    //                  MakeTraceSourceAccessor (&CcnxConsumer::m_contentObjectsTrace))
     ;
 
   return tid;
@@ -87,19 +96,6 @@
   NS_LOG_FUNCTION_NOARGS ();
 }
     
-CcnxConsumer::~CcnxConsumer()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-}
-    
-void
-CcnxConsumer::DoDispose (void)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-        
-  Application::DoDispose ();
-}
-    
 // Application Methods
 void 
 CcnxConsumer::StartApplication () // Called at time specified by Start
@@ -129,11 +125,10 @@
 CcnxConsumer::SendPacket ()
 {
   NS_LOG_FUNCTION_NOARGS ();
-  NS_LOG_INFO ("Sending Interest at " << Simulator::Now ());
     
   //
   Ptr<CcnxNameComponents> nameWithSequence = Create<CcnxNameComponents> (m_interestName);
-  (*name) (m_seq++);
+  (*nameWithSequence) (m_seq++);
   //
 
   CcnxInterestHeader interestHeader;
@@ -145,7 +140,7 @@
   interestHeader.SetMaxSuffixComponents (m_maxSuffixComponents);
   interestHeader.SetMinSuffixComponents (m_minSuffixComponents);
         
-  NS_LOG_INFO ("Interest: \n" << interestHeader);
+  NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
 
   Ptr<Packet> packet = Create<Packet> ();
   packet->AddHeader (interestHeader);
@@ -161,7 +156,7 @@
 {
   NS_LOG_FUNCTION (this << contentObject << payload);
 
-  NS_LOG_INFO ("Received content object: " << cref(*contentObject));
+  NS_LOG_INFO ("Received content object: " << boost::cref(*contentObject));
 }
 
 } // namespace ns3
diff --git a/apps/ccnx-consumer.h b/apps/ccnx-consumer.h
index b2c115b..792c829 100644
--- a/apps/ccnx-consumer.h
+++ b/apps/ccnx-consumer.h
@@ -22,6 +22,8 @@
 #define CCNX_CONSUMER_H
 
 #include "ccnx-app.h"
+#include "ns3/random-variable.h"
+#include "ns3/ccnx-name-components.h"
 
 namespace ns3 
 {
diff --git a/apps/ccnx-interest-sender.cc b/apps/ccnx-interest-sender.cc
index bcf3d76..d110978 100644
--- a/apps/ccnx-interest-sender.cc
+++ b/apps/ccnx-interest-sender.cc
@@ -1,161 +1,160 @@
-/* -*-  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>
- */
+// /* -*-  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.h"
+// #include "ccnx-interest-sender.h"
 
-NS_LOG_COMPONENT_DEFINE ("CcnxInterestSender");
+// NS_LOG_COMPONENT_DEFINE ("CcnxInterestSender");
 
-namespace ns3
-{    
+// namespace ns3
+// {    
 
-NS_OBJECT_ENSURE_REGISTERED (CcnxInterestSender);
+// NS_OBJECT_ENSURE_REGISTERED (CcnxInterestSender);
 
-TypeId
-CcnxInterestSender::GetTypeId (void)
-{
-    static TypeId tid = TypeId ("ns3::CcnxInterestSender")
-    .SetParent<Application> ()
-    .AddConstructor<CcnxInterestSender> ()
-    .AddAttribute ("OffTime", "Time interval between packets",
-                   TimeValue (Seconds (0.1)),
-                   MakeTimeAccessor (&CcnxInterestSender::m_offTime),
-                   MakeTimeChecker ())
-    // Alex: this is incorrect. SetNode call is not called if face is created using this accessor
-    // .AddAttribute ("Face","Local face to be used",
-    //                PointerValue (CreateObject<CcnxLocalFace> ()),
-    //                MakePointerAccessor (&CcnxInterestSender::m_face),
-    //                MakePointerChecker<CcnxLocalFace> ())
-    .AddAttribute ("NameComponents","CcnxName of the Interest (use CcnxNameComponents)",
-                   CcnxNameComponentsValue (CcnxNameComponents (/* root */)),
-                   MakeCcnxNameComponentsAccessor (&CcnxInterestSender::m_interestName),
-                   MakeCcnxNameComponentsChecker ())
-    .AddAttribute ("LifeTime", "LifeTime fo interest packet",
-                   TimeValue (Seconds (4.0)),
-                   MakeTimeAccessor (&CcnxInterestSender::m_interestLifeTime),
-                   MakeTimeChecker ())
-    .AddAttribute ("MinSuffixComponents", "MinSuffixComponents",
-                   IntegerValue(-1),
-                   MakeIntegerAccessor(&CcnxInterestSender::m_minSuffixComponents),
-                   MakeIntegerChecker<int32_t>())
-    .AddAttribute ("MaxSuffixComponents", "MaxSuffixComponents",
-                   IntegerValue(-1),
-                   MakeIntegerAccessor(&CcnxInterestSender::m_maxSuffixComponents),
-                   MakeIntegerChecker<int32_t>())
-    .AddAttribute ("ChildSelector", "ChildSelector",
-                   BooleanValue(false),
-                   MakeBooleanAccessor(&CcnxInterestSender::m_childSelector),
-                   MakeBooleanChecker())
-    .AddAttribute ("Exclude","only simple name matching is supported (use CcnxNameComponents)",
-                   CcnxNameComponentsValue (CcnxNameComponents(/* root */)),
-                   MakeCcnxNameComponentsAccessor (&CcnxInterestSender::m_exclude),
-                   MakeCcnxNameComponentsChecker ())
-    .AddAttribute ("Initial Nonce", "If 0 then nonce is not used",
-                   UintegerValue(1),
-                   MakeUintegerAccessor(&CcnxInterestSender::m_initialNonce),
-                   MakeUintegerChecker<uint32_t>())
-    ;
-    /*
-    .AddAttribute ("NoiseModel",
-                   "A pointer to the model of the channel ambient noise.",
-                   PointerValue (CreateObject<UanNoiseModelDefault> ()),
-                   MakePointerAccessor (&UanChannel::m_noise),
-                   MakePointerChecker<UanNoiseModel> ())*/
-    return tid;
-}
+// TypeId
+// CcnxInterestSender::GetTypeId (void)
+// {
+//   static TypeId tid = TypeId ("ns3::CcnxInterestSender")
+//     .SetParent<Application> ()
+//     .AddConstructor<CcnxInterestSender> ()
+//     .AddAttribute ("OffTime", "Time interval between packets",
+//                    TimeValue (Seconds (0.1)),
+//                    MakeTimeAccessor (&CcnxInterestSender::m_offTime),
+//                    MakeTimeChecker ())
+//     // Alex: this is incorrect. SetNode call is not called if face is created using this accessor
+//     // .AddAttribute ("Face","Local face to be used",
+//     //                PointerValue (CreateObject<CcnxLocalFace> ()),
+//     //                MakePointerAccessor (&CcnxInterestSender::m_face),
+//     //                MakePointerChecker<CcnxLocalFace> ())
+//     .AddAttribute ("NameComponents","CcnxName of the Interest (use CcnxNameComponents)",
+//                    CcnxNameComponentsValue (CcnxNameComponents (/* root */)),
+//                    MakeCcnxNameComponentsAccessor (&CcnxInterestSender::m_interestName),
+//                    MakeCcnxNameComponentsChecker ())
+//     .AddAttribute ("LifeTime", "LifeTime fo interest packet",
+//                    TimeValue (Seconds (4.0)),
+//                    MakeTimeAccessor (&CcnxInterestSender::m_interestLifeTime),
+//                    MakeTimeChecker ())
+//     .AddAttribute ("MinSuffixComponents", "MinSuffixComponents",
+//                    IntegerValue(-1),
+//                    MakeIntegerAccessor(&CcnxInterestSender::m_minSuffixComponents),
+//                    MakeIntegerChecker<int32_t>())
+//     .AddAttribute ("MaxSuffixComponents", "MaxSuffixComponents",
+//                    IntegerValue(-1),
+//                    MakeIntegerAccessor(&CcnxInterestSender::m_maxSuffixComponents),
+//                    MakeIntegerChecker<int32_t>())
+//     .AddAttribute ("ChildSelector", "ChildSelector",
+//                    BooleanValue(false),
+//                    MakeBooleanAccessor(&CcnxInterestSender::m_childSelector),
+//                    MakeBooleanChecker())
+//     .AddAttribute ("Exclude","only simple name matching is supported (use CcnxNameComponents)",
+//                    CcnxNameComponentsValue (CcnxNameComponents(/* root */)),
+//                    MakeCcnxNameComponentsAccessor (&CcnxInterestSender::m_exclude),
+//                    MakeCcnxNameComponentsChecker ())
+//     .AddAttribute ("Initial Nonce", "If 0 then nonce is not used",
+//                    UintegerValue(1),
+//                    MakeUintegerAccessor(&CcnxInterestSender::m_initialNonce),
+//                    MakeUintegerChecker<uint32_t>())
+//     ;
+//   /*
+//     .AddAttribute ("NoiseModel",
+//     "A pointer to the model of the channel ambient noise.",
+//     PointerValue (CreateObject<UanNoiseModelDefault> ()),
+//     MakePointerAccessor (&UanChannel::m_noise),
+//     MakePointerChecker<UanNoiseModel> ())*/
+//   return tid;
+// }
     
-CcnxInterestSender::CcnxInterestSender ()
-{
-    NS_LOG_FUNCTION_NOARGS ();
-}
+// CcnxInterestSender::CcnxInterestSender ()
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
+// }
     
-CcnxInterestSender::~CcnxInterestSender()
-{
-    NS_LOG_FUNCTION_NOARGS ();
-}
+// CcnxInterestSender::~CcnxInterestSender()
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
+// }
     
-void
-CcnxInterestSender::DoDispose (void)
-{
-    NS_LOG_FUNCTION_NOARGS ();
+// void
+// CcnxInterestSender::DoDispose (void)
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
         
-    Application::DoDispose ();
-}
+//   Application::DoDispose ();
+// }
     
-// Application Methods
-void 
-CcnxInterestSender::StartApplication () // Called at time specified by Start
-{
-    NS_LOG_FUNCTION_NOARGS ();
-    ScheduleNextTx();
-}
+// // Application Methods
+// void 
+// CcnxInterestSender::StartApplication () // Called at time specified by Start
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
+//   ScheduleNextTx();
+// }
     
-void 
-CcnxInterestSender::StopApplication () // Called at time specified by Stop
-{
-    NS_LOG_FUNCTION_NOARGS ();
+// void 
+// CcnxInterestSender::StopApplication () // Called at time specified by Stop
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
     
-    CancelEvents ();
-}
+//   CancelEvents ();
+// }
     
-void 
-CcnxInterestSender::CancelEvents ()
-{
-    NS_LOG_FUNCTION_NOARGS ();
+// void 
+// CcnxInterestSender::CancelEvents ()
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
         
-    Simulator::Cancel (m_sendEvent);
-}
+//   Simulator::Cancel (m_sendEvent);
+// }
 
-void 
-CcnxInterestSender::ScheduleNextTx ()
-{
-    NS_LOG_FUNCTION_NOARGS ();
+// void 
+// CcnxInterestSender::ScheduleNextTx ()
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
         
-    Time nextTime = Seconds(m_offTime);
-    m_sendEvent = Simulator::Schedule (nextTime, &CcnxInterestSender::SendPacket, this);
-}
+//   Time nextTime = Seconds(m_offTime);
+//   m_sendEvent = Simulator::Schedule (nextTime, &CcnxInterestSender::SendPacket, this);
+// }
     
-void
-CcnxInterestSender::SendPacket ()
-{
-    NS_LOG_FUNCTION_NOARGS ();
-    // NS_LOG_INFO ("Sending Interest at " << Simulator::Now ());
+// void
+// CcnxInterestSender::SendPacket ()
+// {
+//   NS_LOG_FUNCTION_NOARGS ();
+//   // NS_LOG_INFO ("Sending Interest at " << Simulator::Now ());
     
-    uint32_t randomNonce = UniformVariable().GetInteger(1, std::numeric_limits<uint32_t>::max ());
-    CcnxInterestHeader interestHeader;
-    interestHeader.SetNonce(randomNonce);
-    //const Ptr<CcnxNameComponents> name = Create<CcnxNameComponents>(m_interestName);
-    interestHeader.SetName(Create<CcnxNameComponents> (m_interestName)); //making a copy of name
-    interestHeader.SetInterestLifetime(m_interestLifeTime);
-    interestHeader.SetChildSelector(m_childSelector);
-    //const Ptr<CcnxNameComponents> exclude = Create<CcnxNameComponents>(m_exclude);
-    interestHeader.SetExclude(Create<CcnxNameComponents> (m_exclude));
-    interestHeader.SetMaxSuffixComponents(m_maxSuffixComponents);
-    interestHeader.SetMinSuffixComponents(m_minSuffixComponents);
+//   uint32_t randomNonce = UniformVariable().GetInteger(1, std::numeric_limits<uint32_t>::max ());
+//   CcnxInterestHeader interestHeader;
+//   interestHeader.SetNonce(randomNonce);
+//   //const Ptr<CcnxNameComponents> name = Create<CcnxNameComponents>(m_interestName);
+//   interestHeader.SetName(Create<CcnxNameComponents> (m_interestName)); //making a copy of name
+//   interestHeader.SetInterestLifetime(m_interestLifeTime);
+//   interestHeader.SetChildSelector(m_childSelector);
+//   //const Ptr<CcnxNameComponents> exclude = Create<CcnxNameComponents>(m_exclude);
+//   interestHeader.SetExclude(Create<CcnxNameComponents> (m_exclude));
+//   interestHeader.SetMaxSuffixComponents(m_maxSuffixComponents);
+//   interestHeader.SetMinSuffixComponents(m_minSuffixComponents);
     
-    Ptr<Packet> packet = Create<Packet> ();
-    packet->AddHeader (interestHeader);
+//   Ptr<Packet> packet = Create<Packet> ();
+//   packet->AddHeader (interestHeader);
     
-    m_face->Send(packet);
+//   m_face->Send(packet);
     
-    ScheduleNextTx();
-}
-
+//   ScheduleNextTx();
+// }
     
-}
+// }
diff --git a/apps/ccnx-interest-sender.h b/apps/ccnx-interest-sender.h
index ad8de28..cbb54ad 100644
--- a/apps/ccnx-interest-sender.h
+++ b/apps/ccnx-interest-sender.h
@@ -1,106 +1,106 @@
-/* -*-  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>
- */
+// /* -*-  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/application.h"
-#include "ns3/log.h"
-#include "ns3/random-variable.h"
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-#include "ns3/ptr.h"
-#include "ns3/simulator.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-local-face.h"
-#include "ns3/ccnx-name-components.h"
-#include "ns3/packet.h"
-#include "ns3/boolean.h"
-#include "ns3/integer.h"
-#include "ns3/uinteger.h"
-#include "ns3/random-variable.h"
-#include <limits> 
-#include "ns3/pointer.h"
+// #include "ns3/application.h"
+// #include "ns3/log.h"
+// #include "ns3/random-variable.h"
+// #include "ns3/nstime.h"
+// #include "ns3/event-id.h"
+// #include "ns3/ptr.h"
+// #include "ns3/simulator.h"
+// #include "ns3/ccnx-interest-header.h"
+// #include "ns3/ccnx-local-face.h"
+// #include "ns3/ccnx-name-components.h"
+// #include "ns3/packet.h"
+// #include "ns3/boolean.h"
+// #include "ns3/integer.h"
+// #include "ns3/uinteger.h"
+// #include "ns3/random-variable.h"
+// #include <limits> 
+// #include "ns3/pointer.h"
 
-namespace ns3 
-{
+// namespace ns3 
+// {
     
-class Socket;
+// class Socket;
     
-class CcnxInterestSender: public Application
-{
-public: 
-  static TypeId GetTypeId (void);
+// class CcnxInterestSender: public Application
+// {
+// public: 
+//   static TypeId GetTypeId (void);
         
-  CcnxInterestSender ();
+//   CcnxInterestSender ();
         
-  virtual ~CcnxInterestSender ();
+//   virtual ~CcnxInterestSender ();
         
-protected:
-  virtual void DoDispose (void);
-private:
-  // inherited from Application base class.
-  virtual void StartApplication (void);    // Called at time specified by Start
-  virtual void StopApplication (void);     // Called at time specified by Stop
+// protected:
+//   virtual void DoDispose (void);
+// private:
+//   // inherited from Application base class.
+//   virtual void StartApplication (void);    // Called at time specified by Start
+//   virtual void StopApplication (void);     // Called at time specified by Stop
         
-  //Time m_onTime;
-  Time m_offTime;
-  CcnxNameComponents m_interestName;
+//   //Time m_onTime;
+//   Time m_offTime;
+//   CcnxNameComponents m_interestName;
   
-  Time m_interestLifeTime;
-  int32_t m_minSuffixComponents;
-  int32_t m_maxSuffixComponents;
-  bool m_childSelector;
-  CcnxNameComponents m_exclude;
-  uint32_t m_initialNonce;
+//   Time m_interestLifeTime;
+//   int32_t m_minSuffixComponents;
+//   int32_t m_maxSuffixComponents;
+//   bool m_childSelector;
+//   CcnxNameComponents m_exclude;
+//   uint32_t m_initialNonce;
     
-  //EventId         m_startStopEvent;     // Event id for next start or stop event
-  EventId         m_sendEvent;    // Eventid of pending "send packet" event
-  TypeId          m_tid;
-  Ptr<CcnxLocalFace> m_face;
+//   //EventId         m_startStopEvent;     // Event id for next start or stop event
+//   EventId         m_sendEvent;    // Eventid of pending "send packet" event
+//   TypeId          m_tid;
+//   Ptr<CcnxLocalFace> m_face;
         
-  //helpers
-  void CancelEvents ();
+//   //helpers
+//   void CancelEvents ();
         
-  void Construct (Ptr<Node> n,
-                  std::string tid,
-                  const Time& offtime,
-                  Ptr<CcnxLocalFace> face,
-                  Ptr<CcnxNameComponents> nameComponents,
-                  const Time& lifetime,
-                  const int32_t& minSuffixComponents,
-                  const int32_t& maxSuffixComponents,
-                  const bool childSelector,
-                  Ptr<CcnxNameComponents> exclude,
-                  const uint32_t& initialNonce
-                  );
+//   void Construct (Ptr<Node> n,
+//                   std::string tid,
+//                   const Time& offtime,
+//                   Ptr<CcnxLocalFace> face,
+//                   Ptr<CcnxNameComponents> nameComponents,
+//                   const Time& lifetime,
+//                   const int32_t& minSuffixComponents,
+//                   const int32_t& maxSuffixComponents,
+//                   const bool childSelector,
+//                   Ptr<CcnxNameComponents> exclude,
+//                   const uint32_t& initialNonce
+//                   );
     
-  // Event handlers
-  void StartSending ();
-  void StopSending ();
-  void SendPacket ();
+//   // Event handlers
+//   void StartSending ();
+//   void StopSending ();
+//   void SendPacket ();
         
-private:
-  void ScheduleNextTx ();
-  //void ScheduleStartEvent ();
-  //void ScheduleStopEvent ();
-  void ConnectionSucceeded (Ptr<Socket>);
-  void ConnectionFailed (Ptr<Socket>);
-  void Ignore (Ptr<Socket>);
+// private:
+//   void ScheduleNextTx ();
+//   //void ScheduleStartEvent ();
+//   //void ScheduleStopEvent ();
+//   void ConnectionSucceeded (Ptr<Socket>);
+//   void ConnectionFailed (Ptr<Socket>);
+//   void Ignore (Ptr<Socket>);
         
-};
-}
+// };
+// }
diff --git a/apps/ccnx-producer.cc b/apps/ccnx-producer.cc
index 1cec691..0a82d0c 100644
--- a/apps/ccnx-producer.cc
+++ b/apps/ccnx-producer.cc
@@ -20,11 +20,17 @@
  */
 
 #include "ccnx-producer.h"
+#include "ns3/log.h"
 #include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
 #include "ns3/string.h"
-#include "ns3/integer.h"
+#include "ns3/uinteger.h"
+#include "ns3/packet.h"
 
 #include "ns3/ccnx-local-face.h"
+#include "ns3/ccnx-fib.h"
+
+#include <boost/ref.hpp>
 
 NS_LOG_COMPONENT_DEFINE ("CcnxProducer");
 
@@ -60,7 +66,29 @@
 {
   // NS_LOG_FUNCTION_NOARGS ();
 }
-       
+
+// inherited from Application base class.
+void
+CcnxProducer::StartApplication ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  NS_ASSERT (GetNode ()->GetObject<CcnxFib> () != 0);
+
+  CcnxApp::StartApplication ();
+
+  GetNode ()->GetObject<CcnxFib> ()->Add (m_prefix, m_face, 0);
+}
+
+void
+CcnxProducer::StopApplication ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  NS_ASSERT (GetNode ()->GetObject<CcnxFib> () != 0);
+
+  CcnxApp::StopApplication ();
+}
+
+
 void
 CcnxProducer::OnInterest (const Ptr<const CcnxInterestHeader> &interest)
 {
@@ -71,12 +99,14 @@
   static CcnxContentObjectTail tail;
   Ptr<CcnxContentObjectHeader> header = Create<CcnxContentObjectHeader> ();
   header->SetName (Create<CcnxNameComponents> (interest->GetName ()));
+
+  NS_LOG_INFO ("Respodning with ContentObject:\n" << boost::cref(*header));
   
   Ptr<Packet> packet = Create<Packet> (m_virtualPayloadSize);
-  outgoingPacket->AddHeader (*header);
-  outgoingPacket->AddTrailer (tail);
+  packet->AddHeader (*header);
+  packet->AddTrailer (tail);
 
-  m_protocolHandler (outgoingPacket);
+  m_protocolHandler (packet);
 }
 
 } // namespace ns3
diff --git a/apps/ccnx-producer.h b/apps/ccnx-producer.h
index 289c22e..ac9a492 100644
--- a/apps/ccnx-producer.h
+++ b/apps/ccnx-producer.h
@@ -41,6 +41,14 @@
   // inherited from CcnxApp
   void OnInterest (const Ptr<const CcnxInterestHeader> &interest);
 
+protected:
+  // inherited from Application base class.
+  virtual void
+  StartApplication ();    // Called at time specified by Start
+
+  virtual void
+  StopApplication ();     // Called at time specified by Stop
+
 private:
   CcnxNameComponents m_prefix;
   uint32_t m_virtualPayloadSize;
