diff --git a/apps/ccnx-consumer.cc b/apps/ccnx-consumer.cc
new file mode 100644
index 0000000..5e39fd3
--- /dev/null
+++ b/apps/ccnx-consumer.cc
@@ -0,0 +1,176 @@
+/* -*-  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-consumer.h"
+
+NS_LOG_COMPONENT_DEFINE ("CcnxConsumer");
+
+namespace ns3
+{    
+    
+NS_OBJECT_ENSURE_REGISTERED (CcnxConsumer);
+    
+TypeId
+CcnxConsumer::GetTypeId (void)
+{
+    static TypeId tid = TypeId ("ns3::CcnxConsumer")
+    .SetParent<Application> ()
+    .AddConstructor<CcnxConsumer> ()
+    .AddAttribute ("OffTime", "Time interval between packets",
+                    TimeValue (Seconds (0.1)),
+                    MakeTimeAccessor (&CcnxConsumer::m_offTime),
+                    MakeTimeChecker ())
+    .AddAttribute ("Face","Local face to be used",
+                    PointerValue (CreateObject<CcnxLocalFace> ()),
+                    MakePointerAccessor (&CcnxConsumer::m_face),
+                    MakePointerChecker<CcnxLocalFace> ())
+    .AddAttribute ("InterestName","CcnxName of the Interest (use CcnxNameComponents)",
+                    PointerValue (CreateObject<CcnxNameComponents> ()),
+                    MakePointerAccessor (&CcnxConsumer::m_interestName),
+                    MakePointerChecker<CcnxNameComponents> ())
+    .AddAttribute ("LifeTime", "LifeTime fo interest packet",
+                    TimeValue (Seconds (4.0)),
+                    MakeTimeAccessor (&CcnxConsumer::m_interestLifeTime),
+                    MakeTimeChecker ())
+    .AddAttribute ("MinSuffixComponents", "MinSuffixComponents",
+                    IntegerValue(-1),
+                    MakeIntegerAccessor(&CcnxConsumer::m_minSuffixComponents),
+                    MakeIntegerChecker<int32_t>())
+    .AddAttribute ("MaxSuffixComponents", "MaxSuffixComponents",
+                    IntegerValue(-1),
+                    MakeIntegerAccessor(&CcnxConsumer::m_maxSuffixComponents),
+                    MakeIntegerChecker<int32_t>())
+    .AddAttribute ("ChildSelector", "ChildSelector",
+                    BooleanValue(false),
+                    MakeBooleanAccessor(&CcnxConsumer::m_childSelector),
+                    MakeBooleanChecker())
+    .AddAttribute ("Exclude", "only simple name matching is supported (use CcnxNameComponents)",
+                   PointerValue (CreateObject<CcnxNameComponents> ()),
+                   MakePointerAccessor (&CcnxConsumer::m_exclude),
+                   MakePointerChecker<CcnxNameComponents> ())
+    .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;
+}
+    
+CcnxConsumer::CcnxConsumer ()
+{
+    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
+{
+    NS_LOG_FUNCTION_NOARGS ();
+    ScheduleNextTx();
+}
+    
+void 
+CcnxConsumer::StopApplication () // Called at time specified by Stop
+{
+    NS_LOG_FUNCTION_NOARGS ();
+        
+    CancelEvents ();
+}
+    
+void 
+CcnxConsumer::CancelEvents ()
+{
+    NS_LOG_FUNCTION_NOARGS ();
+        
+    Simulator::Cancel (m_sendEvent);
+}
+    
+void 
+CcnxConsumer::ScheduleNextTx ()
+{
+    NS_LOG_FUNCTION_NOARGS ();
+        
+    Time nextTime = Seconds(m_offTime);
+    m_sendEvent = Simulator::Schedule (nextTime, &CcnxConsumer::SendPacket, this);
+}
+    
+void
+CcnxConsumer::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);
+    interestHeader.SetName(m_interestName);
+    interestHeader.SetInterestLifetime(m_interestLifeTime);
+    interestHeader.SetChildSelector(m_childSelector);
+    interestHeader.SetExclude(m_exclude);
+    interestHeader.SetMaxSuffixComponents(m_maxSuffixComponents);
+    interestHeader.SetMinSuffixComponents(m_minSuffixComponents);
+        
+    Ptr<Packet> packet = Create<Packet> ();
+    packet->AddHeader (interestHeader);
+        
+    m_face->Receive(packet);
+        
+    ScheduleNextTx();
+}
+    
+void
+CcnxConsumer::HandlePacket(const Ptr<CcnxFace> &face, const Ptr<const Packet> &packet)
+{
+    uint8_t type[2];
+    uint32_t read = packet->CopyData (type,2);
+    if (read!=2)
+    {
+        NS_LOG_INFO ("Unknown CcnxPacket");
+        return;
+    }
+    
+    if (type[0] == INTEREST_BYTE0 && type[1] == INTEREST_BYTE1)
+    {
+        m_interestsTrace(face,packet);
+    }
+    else if (type[0] == CONTENT_OBJECT_BYTE0 && type[1] == CONTENT_OBJECT_BYTE1)
+    {
+        m_contentObjectsTrace(face,packet);
+    }
+}
+}
diff --git a/apps/ccnx-consumer.h b/apps/ccnx-consumer.h
new file mode 100644
index 0000000..a9a311f
--- /dev/null
+++ b/apps/ccnx-consumer.h
@@ -0,0 +1,111 @@
+/* -*-  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_CONSUMER_H
+#define CCNX_CONSUMER_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"
+#include "ns3/traced-callback.h"
+#include "ns3/ccnx-header-helper.h"
+
+#include "ns3/packet.h"
+#include "ns3/header.h"
+
+namespace ns3 
+{
+
+class CcnxConsumer: public Application
+{
+public: 
+    static TypeId GetTypeId (void);
+        
+    CcnxConsumer ();
+        
+    virtual ~CcnxConsumer ();
+    
+    void HandlePacket (const Ptr<CcnxFace> &face, const Ptr<const Packet> &packet);
+        
+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_offTime;
+    Ptr<CcnxNameComponents> m_interestName;
+    Time m_interestLifeTime;
+    int32_t m_minSuffixComponents;
+    int32_t m_maxSuffixComponents;
+    bool m_childSelector;
+    Ptr<CcnxNameComponents> m_exclude;
+    uint32_t m_initialNonce;
+        
+    EventId         m_sendEvent;    // Eventid of pending "send packet" event
+    TypeId          m_tid;
+    Ptr<CcnxLocalFace> m_face;
+        
+    //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
+                    );
+        
+    // Event handlers
+    void StartSending ();
+    void StopSending ();
+    void SendPacket ();
+    //typedef Callback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>& > ProtocolHandler;
+     
+private:
+    void ScheduleNextTx ();
+    //typedef Callback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>& > ProtocolHandler;
+    
+    TracedCallback<const Ptr<CcnxFace>&,const Ptr<const Packet>& > m_interestsTrace;
+    TracedCallback<const Ptr<CcnxFace>&,const Ptr<const Packet>& > m_contentObjectsTrace;
+};
+}
+#endif
diff --git a/apps/ccnx-producer.cc b/apps/ccnx-producer.cc
new file mode 100644
index 0000000..7fcd1da
--- /dev/null
+++ b/apps/ccnx-producer.cc
@@ -0,0 +1,191 @@
+/* -*-  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-producer.h"
+
+
+NS_LOG_COMPONENT_DEFINE ("CcnxProducer");
+
+namespace ns3
+{    
+    
+NS_OBJECT_ENSURE_REGISTERED (CcnxProducer);
+    
+TypeId
+CcnxProducer::GetTypeId (void)
+{
+    static TypeId tid = TypeId ("ns3::CcnxProducer")
+    .SetParent<Application> ()
+    .AddConstructor<CcnxProducer> ()
+    .AddAttribute ("Face","Local face to be used",
+                    PointerValue (CreateObject<CcnxLocalFace> ()),
+                    MakePointerAccessor (&CcnxProducer::m_face),
+                    MakePointerChecker<CcnxLocalFace> ())
+    .AddAttribute ("Ccnx","Ccnx is needed to access ContentStore",
+                   PointerValue (NULL),
+                   MakePointerAccessor (&CcnxProducer::m_ccnx),
+                   MakePointerChecker<Ccnx> ())
+
+        /*.AddAttribute ("InterestName","CcnxName of the Interest (use CcnxNameComponents)",
+                       PointerValue (CreateObject<CcnxNameComponents> ()),
+                       MakePointerAccessor (&CcnxConsumer::m_interestName),
+                       MakePointerChecker<CcnxNameComponents> ())
+        .AddAttribute ("LifeTime", "LifeTime fo interest packet",
+                       TimeValue (Seconds (4.0)),
+                       MakeTimeAccessor (&CcnxConsumer::m_interestLifeTime),
+                       MakeTimeChecker ())
+        .AddAttribute ("MinSuffixComponents", "MinSuffixComponents",
+                       IntegerValue(-1),
+                       MakeIntegerAccessor(&CcnxConsumer::m_minSuffixComponents),
+                       MakeIntegerChecker<int32_t>())
+        .AddAttribute ("MaxSuffixComponents", "MaxSuffixComponents",
+                       IntegerValue(-1),
+                       MakeIntegerAccessor(&CcnxConsumer::m_maxSuffixComponents),
+                       MakeIntegerChecker<int32_t>())
+        .AddAttribute ("ChildSelector", "ChildSelector",
+                       BooleanValue(false),
+                       MakeBooleanAccessor(&CcnxConsumer::m_childSelector),
+                       MakeBooleanChecker())
+        .AddAttribute ("Exclude", "only simple name matching is supported (use CcnxNameComponents)",
+                       PointerValue (CreateObject<CcnxNameComponents> ()),
+                       MakePointerAccessor (&CcnxConsumer::m_exclude),
+                       MakePointerChecker<CcnxNameComponents> ())*/
+    .AddAttribute ("Capacity", "Capacity of the ContentStore",
+                    UintegerValue(100),
+                    MakeUintegerAccessor(&CcnxProducer::m_storeCapacity),
+                    MakeUintegerChecker<uint32_t>())
+    .AddTraceSource ("InterestTrace", "Interests that were received",
+                    MakeTraceSourceAccessor (&CcnxProducer::m_interestsTrace))
+    .AddTraceSource ("ContentObjectTrace", "ContentObjects that were sent",
+                    MakeTraceSourceAccessor (&CcnxProducer::m_contentObjectsTrace))
+    ;
+        
+    return tid;
+}
+    
+CcnxProducer::CcnxProducer ()
+{
+    NS_LOG_FUNCTION_NOARGS ();
+}
+    
+CcnxProducer::~CcnxProducer()
+{
+    NS_LOG_FUNCTION_NOARGS ();
+}
+    
+void
+CcnxProducer::DoDispose (void)
+{
+    NS_LOG_FUNCTION_NOARGS ();
+        
+    Application::DoDispose ();
+}
+    
+    // Application Methods
+void 
+CcnxProducer::StartApplication () // Called at time specified by Start
+{
+    NS_LOG_FUNCTION_NOARGS ();
+//    ScheduleNextTx();
+}
+    
+void 
+CcnxProducer::StopApplication () // Called at time specified by Stop
+{
+    NS_LOG_FUNCTION_NOARGS ();
+        
+    CancelEvents ();
+}
+    
+void 
+CcnxProducer::CancelEvents ()
+{
+    NS_LOG_FUNCTION_NOARGS ();
+        
+    Simulator::Cancel (m_sendEvent);
+}
+    
+/*void 
+CcnxProducer::ScheduleNextTx ()
+{
+        NS_LOG_FUNCTION_NOARGS ();
+        
+        Time nextTime = Seconds(m_offTime);
+        m_sendEvent = Simulator::Schedule (nextTime, &CcnxConsumer::SendPacket, this);
+    }
+    */
+    
+/*void
+CcnxConsumer::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);
+        interestHeader.SetName(m_interestName);
+        interestHeader.SetInterestLifetime(m_interestLifeTime);
+        interestHeader.SetChildSelector(m_childSelector);
+        interestHeader.SetExclude(m_exclude);
+        interestHeader.SetMaxSuffixComponents(m_maxSuffixComponents);
+        interestHeader.SetMinSuffixComponents(m_minSuffixComponents);
+        
+        Ptr<Packet> packet = Create<Packet> ();
+        packet->AddHeader (interestHeader);
+        
+        m_face->Receive(packet);
+        
+        ScheduleNextTx();
+    }*/
+    
+uint32_t
+CcnxProducer::GetStoreCapacity()
+{
+    return m_storeCapacity;
+}
+    
+void
+CcnxProducer::HandlePacket(const Ptr<CcnxFace> &face, const Ptr<const Packet> &packet)
+{
+    uint8_t type[2];
+    uint32_t read = packet->CopyData (type,2);
+    if (read!=2)
+    {
+        NS_LOG_INFO ("Unknown CcnxPacket");
+        return;
+    }
+        
+    if (type[0] == INTEREST_BYTE0 && type[1] == INTEREST_BYTE1)
+    {
+        m_interestsTrace(face,packet);
+    }
+    else if (type[0] == CONTENT_OBJECT_BYTE0 && type[1] == CONTENT_OBJECT_BYTE1)
+    {
+        m_contentObjectsTrace(face,packet);
+    }
+}
+    
+void 
+CcnxProducer::AddContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
+{
+    m_ccnx->m_contentStore->Add (header, packet);
+}
+}
diff --git a/apps/ccnx-producer.h b/apps/ccnx-producer.h
new file mode 100644
index 0000000..55049dd
--- /dev/null
+++ b/apps/ccnx-producer.h
@@ -0,0 +1,118 @@
+/* -*-  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_PRODUCER_H
+#define CCNX_PRODUCER_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"
+#include "ns3/traced-callback.h"
+#include "ns3/ccnx-header-helper.h"
+
+#include "ns3/packet.h"
+#include "ns3/header.h"
+#include "ns3/ccnx.h"
+#include "ns3/ccnx-content-object-header.h"
+
+namespace ns3 
+{
+    
+class CcnxProducer: public Application
+{
+public: 
+    static TypeId GetTypeId (void);
+        
+    CcnxProducer ();
+        
+    virtual ~CcnxProducer ();
+        
+    void HandlePacket (const Ptr<CcnxFace> &face, const Ptr<const Packet> &packet);
+    uint32_t GetStoreCapacity();
+    void AddContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+    
+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
+        
+    Ptr<Ccnx> m_ccnx;
+    Time m_offTime;
+    //Ptr<CcnxNameComponents> m_interestName;
+    //Time m_interestLifeTime;
+    //int32_t m_minSuffixComponents;
+    //int32_t m_maxSuffixComponents;
+    //bool m_childSelector;
+    //Ptr<CcnxNameComponents> m_exclude;
+    //uint32_t m_initialNonce;
+        
+    //EventId         m_sendEvent;    // Eventid of pending "send packet" event
+    TypeId          m_tid;
+    Ptr<CcnxLocalFace> m_face;
+    
+    uint32_t m_storeCapacity;
+        
+    //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
+                    );
+        
+    // Event handlers
+    void StartSending ();
+    void StopSending ();
+    void SendPacket ();
+    //typedef Callback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>& > ProtocolHandler;
+        
+private:
+    void ScheduleNextTx ();
+    //typedef Callback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>& > ProtocolHandler;
+        
+    TracedCallback<const Ptr<CcnxFace>&,const Ptr<const Packet>& > m_interestsTrace;
+    TracedCallback<const Ptr<CcnxFace>&,const Ptr<const Packet>& > m_contentObjectsTrace;
+};
+}
+#endif
diff --git a/helper/ccnx-consumer-helper.cc b/helper/ccnx-consumer-helper.cc
new file mode 100644
index 0000000..5add077
--- /dev/null
+++ b/helper/ccnx-consumer-helper.cc
@@ -0,0 +1,83 @@
+/* -*-  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-consumer-helper.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/string.h"
+#include "ns3/names.h"
+
+namespace ns3 
+{
+    
+CcnxConsumerHelper::CcnxConsumerHelper (Ptr<CcnxNameComponents> interestName)
+{
+    m_factory.SetTypeId ("ns3::CcnxConsumer");
+    m_factory.Set ("InterestName", PointerValue (interestName));
+}
+    
+void 
+CcnxConsumerHelper::SetAttribute (std::string name, const AttributeValue &value)
+{
+    m_factory.Set (name, value);
+}
+    
+ApplicationContainer
+CcnxConsumerHelper::Install (Ptr<Node> node)
+{
+    return ApplicationContainer (InstallPriv (node));
+}
+    
+ApplicationContainer
+CcnxConsumerHelper::Install (std::string nodeName)
+{
+    Ptr<Node> node = Names::Find<Node> (nodeName);
+    return ApplicationContainer (InstallPriv (node));
+}
+    
+ApplicationContainer
+CcnxConsumerHelper::Install (NodeContainer c)
+{
+    ApplicationContainer apps;
+    for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+        apps.Add (InstallPriv (*i));
+    }
+    
+    return apps;
+}
+    
+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();
+        
+    node->AddApplication (app);
+        
+    return app;
+}
+}
\ No newline at end of file
diff --git a/helper/ccnx-consumer-helper.h b/helper/ccnx-consumer-helper.h
new file mode 100644
index 0000000..e512a8f
--- /dev/null
+++ b/helper/ccnx-consumer-helper.h
@@ -0,0 +1,107 @@
+/* -*-  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_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"
+
+namespace ns3 
+{    
+/**
+* \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);
+        
+/**
+* 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 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);
+        
+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;
+
+};    
+}
+
+#endif
+
diff --git a/helper/ccnx-header-helper.cc b/helper/ccnx-header-helper.cc
index fdc986a..288162c 100644
--- a/helper/ccnx-header-helper.cc
+++ b/helper/ccnx-header-helper.cc
@@ -30,11 +30,6 @@
 
 NS_LOG_COMPONENT_DEFINE ("CcnxHeaderHelper");
 
-#define INTEREST_BYTE0 0x01
-#define INTEREST_BYTE1 0xD2
-
-#define CONTENT_OBJECT_BYTE0 0x04
-#define CONTENT_OBJECT_BYTE1 0x82
 
 namespace ns3
 {
diff --git a/helper/ccnx-header-helper.h b/helper/ccnx-header-helper.h
index 72d030c..0cfbd12 100644
--- a/helper/ccnx-header-helper.h
+++ b/helper/ccnx-header-helper.h
@@ -23,6 +23,12 @@
 
 #include "ns3/ptr.h"
 
+#define INTEREST_BYTE0 0x01
+#define INTEREST_BYTE1 0xD2
+
+#define CONTENT_OBJECT_BYTE0 0x04
+#define CONTENT_OBJECT_BYTE1 0x82
+
 namespace ns3
 {
 
diff --git a/helper/ccnx-interest-sender-helper.cc b/helper/ccnx-interest-sender-helper.cc
index 463743b..addd9de 100644
--- a/helper/ccnx-interest-sender-helper.cc
+++ b/helper/ccnx-interest-sender-helper.cc
@@ -29,7 +29,7 @@
     
 CcnxInterestSenderHelper::CcnxInterestSenderHelper (Ptr<CcnxNameComponents> interestName)
 {
-    m_factory.SetTypeId ("ns3::CcnxInterestSender");
+    m_factory.SetTypeId ("ns3::CcnxConsumer");
     m_factory.Set ("InterestName", CcnxNameComponentsValue (*interestName));
 }
     
@@ -77,4 +77,4 @@
         
     return app;
 }
-}
+}
\ No newline at end of file
diff --git a/helper/ccnx-producer-helper.cc b/helper/ccnx-producer-helper.cc
new file mode 100644
index 0000000..71a7c32
--- /dev/null
+++ b/helper/ccnx-producer-helper.cc
@@ -0,0 +1,107 @@
+/* -*-  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-producer-helper.h"
+#include "ns3/string.h"
+#include "ns3/names.h"
+
+namespace ns3 
+{
+    
+CcnxProducerHelper::CcnxProducerHelper (uint32_t storeCapacity)
+{
+    m_factory.SetTypeId ("ns3::CcnxProducer");
+    m_factory.Set ("Capacity", UintegerValue (storeCapacity));
+}
+    
+void 
+CcnxProducerHelper::SetAttribute (std::string name, const AttributeValue &value)
+{
+    m_factory.Set (name, value);
+}
+    
+ApplicationContainer
+CcnxProducerHelper::Install (Ptr<Node> node)
+{
+    return ApplicationContainer (InstallPriv (node));
+}
+    
+ApplicationContainer
+CcnxProducerHelper::Install (std::string nodeName)
+{
+    Ptr<Node> node = Names::Find<Node> (nodeName);
+    return ApplicationContainer (InstallPriv (node));
+}
+    
+ApplicationContainer
+CcnxProducerHelper::Install (NodeContainer c)
+{
+    ApplicationContainer apps;
+    for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+        apps.Add (InstallPriv (*i));
+    }
+        
+    return apps;
+}
+    
+    /*CcnxStackHelper::CreateAndAggregateObjectFromTypeId (Ptr<Node> node, const std::string typeId)
+    {
+        ObjectFactory factory;
+        factory.SetTypeId (typeId);
+        Ptr<Object> protocol = factory.Create <Object> ();
+        node->AggregateObject (protocol);
+    }*/
+Ptr<Application>
+CcnxProducerHelper::InstallPriv (Ptr<Node> node)
+{
+    Ptr<CcnxLocalFace> localFace = CreateObject<CcnxLocalFace> ();
+    localFace->SetNode(node);
+    
+    
+    
+    //CreateAndAggregateObjectFromTypeId (node, "ns3::CcnxL3Protocol");
+    ObjectFactory factory;
+    factory.SetTypeId("ns3::CcnxL3Protocol");
+    Ptr<Object> protocol = factory.Create<Object> ();
+    node->AggregateObject(protocol);
+    
+    Ptr<Ccnx> ccnx = node->GetObject<Ccnx> ();
+    
+    if (ccnx == NULL)
+    {
+        NS_FATAL_ERROR ("CcnxProducerHelper::InstallPriv (): Getting Ccnx " 
+                        "a CcnxStack must be installed on the node");
+        return 0;
+    }
+
+    m_factory.Set ("Face", PointerValue (localFace));
+    m_factory.Set ("Ccnx", PointerValue (ccnx));
+    Ptr<CcnxProducer> app = m_factory.Create<CcnxProducer> ();
+
+    //app->m_ccnx->m_contentStore->SetMaxSize(app->GetStoreCapacity());
+    localFace->RegisterProtocolHandler (MakeCallback (&CcnxProducer::HandlePacket, app));
+    localFace->SetUp();
+        
+    node->AddApplication (app);
+        
+    return app;
+}
+}
\ No newline at end of file
diff --git a/helper/ccnx-producer-helper.h b/helper/ccnx-producer-helper.h
new file mode 100644
index 0000000..eda0d04
--- /dev/null
+++ b/helper/ccnx-producer-helper.h
@@ -0,0 +1,108 @@
+/* -*-  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_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"
+
+namespace ns3 
+{    
+/**
+* \brief A helper to make it easier to instantiate an ns3::CcnxProducer application
+* on a set of nodes.
+*/
+    
+class CcnxProducerHelper
+{
+public:
+/**
+* Create an CcnxProducerHelper to make it easier to work with CcnxProducer applications
+*
+*/
+CcnxProducerHelper (uint32_t storeCapacity);
+        
+/**
+* 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::CcnxProducer 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 CcnxProducer 
+* will be installed.
+* \returns Container of Ptr to the applications installed.
+*/
+ApplicationContainer Install (NodeContainer c);
+        
+/**
+* Install an ns3::CcnxProducer on the node configured with all the 
+* attributes set with SetAttribute.
+*
+* \param node The node on which an CcnxProducer will be installed.
+* \returns Container of Ptr to the applications installed.
+*/
+ApplicationContainer Install (Ptr<Node> node);
+        
+/**
+* Install an ns3::CcnxProducer on the node configured with all the 
+* attributes set with SetAttribute.
+*
+* \param nodeName The node on which an CcnxProducer will be installed.
+* \returns Container of Ptr to the applications installed.
+*/
+ApplicationContainer Install (std::string nodeName);
+        
+private:
+/**
+* \internal
+* Install an ns3::CcnxProducer on the node configured with all the 
+* attributes set with SetAttribute.
+*
+* \param node The node on which an CcnxProducer will be installed.
+* \returns Ptr to the application installed.
+*/
+Ptr<Application> InstallPriv (Ptr<Node> node);
+ObjectFactory m_factory;
+
+};
+}
+
+#endif
+
diff --git a/model/ccnx-content-store.h b/model/ccnx-content-store.h
index d364917..b9a8138 100644
--- a/model/ccnx-content-store.h
+++ b/model/ccnx-content-store.h
@@ -23,6 +23,7 @@
 
 #include "ns3/object.h"
 #include "ns3/ptr.h"
+#include "ns3/packet.h"
 
 #include <list>
 #include <string>
@@ -42,8 +43,6 @@
 
 namespace  ns3
 {
-class Packet;
-
 /**
  * \ingroup ccnx
  * \brief NDN content store entry
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 6167fd0..8c92c93 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -41,7 +41,7 @@
 class Header;
 class CcnxInterestHeader;
 class CcnxContentObjectHeader;
-class CcnxContentStore;
+//class CcnxContentStore;
 
 /**
  * \ingroup ccnx
@@ -161,7 +161,7 @@
   Ptr<Node> m_node; ///< \brief node on which ccnx stack is installed
   Ptr<CcnxForwardingStrategy> m_forwardingStrategy; ///< \brief smart pointer to the selected forwarding strategy
 
-  Ptr<CcnxContentStore> m_contentStore;
+  //Ptr<CcnxContentStore> m_contentStore;
   
   /**
    * \brief Trace of transmitted packets, including all headers
diff --git a/model/ccnx-local-face.cc b/model/ccnx-local-face.cc
index 3dd9924..c047934 100644
--- a/model/ccnx-local-face.cc
+++ b/model/ccnx-local-face.cc
@@ -15,7 +15,8 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author:
+ * Author:  Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+            Ilya Moiseenko <iliamo@cs.ucla.edu>
  *
  */
 
@@ -29,7 +30,8 @@
 
 NS_LOG_COMPONENT_DEFINE ("CcnxLocalFace");
 
-namespace ns3 {
+namespace ns3 
+{
 
 NS_OBJECT_ENSURE_REGISTERED (CcnxLocalFace);
 
@@ -77,6 +79,13 @@
 
   
 }
+    
+void
+CcnxLocalFace::Receive (Ptr<Packet> p)
+{
+    //ypedef Callback<void,const Ptr<CcnxFace>&,const Ptr<const Packet>& > ProtocolHandler;
+    m_protocolHandler ((const Ptr<CcnxFace>)this,(const Ptr<Packet>)p);
+}
 
 std::ostream& operator<< (std::ostream& os, const CcnxLocalFace &localFace)
 {
diff --git a/model/ccnx-local-face.h b/model/ccnx-local-face.h
index 792ef4d..3510eba 100644
--- a/model/ccnx-local-face.h
+++ b/model/ccnx-local-face.h
@@ -15,14 +15,17 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Authors: 
+ * Authors:     Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+                Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
+
 #ifndef CCNX_LOCAL_FACE_H
 #define CCNX_LOCAL_FACE_H
 
 #include "ccnx-face.h"
 
-namespace ns3 {
+namespace ns3 
+{
 
 /**
  * \ingroup ccnx-face
@@ -57,6 +60,8 @@
 
   virtual void Send (Ptr<Packet> p);
 
+  void Receive (Ptr<Packet> p);
+
   ////////////////////////////////////////////////////////////////////
 
   /// \todo Need methods to implement application hooks
diff --git a/model/ccnx.h b/model/ccnx.h
index 666158f..7c0e1d0 100644
--- a/model/ccnx.h
+++ b/model/ccnx.h
@@ -26,6 +26,7 @@
 #include "ns3/callback.h"
 
 #include "ccnx-face.h"
+#include "ccnx-content-store.h"
 
 namespace ns3 {
 
@@ -140,6 +141,8 @@
    */
   virtual Ptr<CcnxFace>
   GetFace (uint32_t face) const = 0;
+    
+  Ptr<CcnxContentStore> m_contentStore;
 };
 
 } // namespace ns3 
