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
