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 c182207..0ae1f6d 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", PointerValue (interestName));
 }
     
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
+
