diff --git a/apps/ccnx-producer.h b/apps/ccnx-producer.h
index 55049dd..840400b 100644
--- a/apps/ccnx-producer.h
+++ b/apps/ccnx-producer.h
@@ -45,10 +45,73 @@
 #include "ns3/header.h"
 #include "ns3/ccnx.h"
 #include "ns3/ccnx-content-object-header.h"
+#include "ns3/ccnx-name-components.h"
+#include "ns3/ccnx-fib.h"
+
+#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/tag.hpp>
+#include <boost/multi_index/ordered_index.hpp>
+#include <boost/multi_index/sequenced_index.hpp>
+#include <boost/multi_index/hashed_index.hpp>
+#include <boost/multi_index/mem_fun.hpp>
 
 namespace ns3 
 {
     
+    class DataStoreEntry
+    {
+    public:
+        /**
+         * \brief Construct data store entry
+         *
+         * \param header Parsed CcnxContentObject header
+         * \param packet Original CCNx packet
+         *
+         * The constructor will make a copy of the supplied packet and calls
+         * RemoveHeader and RemoveTail on the copy.
+         */
+        DataStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+        
+        /**
+         * \brief Get prefix of the stored entry
+         * \returns prefix of the stored entry
+         */
+        inline const CcnxNameComponents&
+        GetName () const;
+        
+        /**
+         * \brief Get CcnxContentObjectHeader of the stored entry
+         * \returns CcnxContentObjectHeader of the stored entry
+         */
+        inline Ptr<const CcnxContentObjectHeader>
+        GetHeader () const;
+        
+        /**
+         * \brief Get content of the stored entry
+         * \returns content of the stored entry
+         */
+        inline Ptr<const Packet>
+        GetPacket () const;
+        
+        /**
+         * \brief Convenience method to create a fully formed CCNx packet from stored header and content
+         * \returns A read-write copy of the packet with CcnxContentObjectHeader and CcxnContentObjectTail
+         */
+        Ptr<Packet>
+        GetFullyFormedCcnxPacket () const;
+        
+        // Copy constructor is required by the container. Though, we're
+        // storing only two pointers, so shouldn't be a problem
+        // private:
+        //   CcnxContentStoreEntry (const CcnxContentStoreEntry &); ///< disabled copy constructor
+        //   CcnxContentStoreEntry& operator= (const CcnxContentStoreEntry&); ///< disabled copy operator
+        
+    private:
+        //Ptr<CcnxContentObjectHeader> m_header; ///< \brief non-modifiable CcnxContentObjectHeader
+        //Ptr<Packet> m_packet; ///< \brief non-modifiable content of the ContentObject packet
+    };
+
+    
 class CcnxProducer: public Application
 {
 public: 
@@ -58,9 +121,26 @@
         
     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);
+    //void HandlePacket (const Ptr<CcnxFace> &face, const Ptr<const Packet> &packet);
+    //uint32_t GetStoreCapacity();
+    //void SetStoreCapacity(uint32_t capacity);
+    //void AddContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+    
+    void OnInterest(const Ptr<const CcnxInterestHeader> &interest);
+    
+    CcnxNameComponents GetPrefix() const;  
+    /**
+     * \brief Add a new content to the data store.
+     *
+     * \param header Fully parsed CcnxContentObjectHeader
+     * \param packet Fully formed CCNx packet to add to content store
+     * (will be copied and stripped down of headers)
+     *
+     * If entry with the same prefix exists, the old entry will be
+     * promoted to the top of the MRU hash
+     */
+    //void
+    //Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
     
 protected:
     virtual void DoDispose (void);
@@ -69,48 +149,59 @@
     virtual void StartApplication (void);    // Called at time specified by Start
     virtual void StopApplication (void);     // Called at time specified by Stop
         
+    /**
+     * \brief Find corresponding CS entry for the given interest
+     *
+     * \param interest Interest for which matching content store entry
+     * will be searched
+     *
+     * If an entry is found, it is promoted to the top of most recent
+     * used entries index, \see m_contentStore
+     */
+    //Ptr<Packet>
+    //Lookup (Ptr<const CcnxInterestHeader> interest);
+
+    
     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;
-        
+    /*struct DataStoreContainer
+    {
+        typedef
+        boost::multi_index::multi_index_container<
+          DataStoreEntry,
+          boost::multi_index::indexed_by<
+            boost::multi_index::hashed_unique<
+              boost::multi_index::tag<__ccnx_private::i_prefix>,
+              boost::multi_index::const_mem_fun<DataStoreEntry,
+                                                const CcnxNameComponents&,
+                                                &DataStoreEntry::GetName>,
+              CcnxPrefixHash>,
+          boost::multi_index::sequenced<boost::multi_index::tag<__ccnx_private::i_mru> >
+#ifdef _DEBUG
+          ,
+          boost::multi_index::ordered_unique<
+          boost::multi_index::tag<__ccnx_private::i_ordered>,
+          boost::multi_index::const_mem_fun<DataStoreEntry,
+          const CcnxNameComponents&,
+          &CcnxContentStoreEntry::GetName>
+          >
+#endif
+        >
+      > type;
+    };*/
+
     //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;
-        
+    
+    //DataStoreContainer::type m_availableData;
+    //uint32_t m_storeCapacity;
+    uint32_t m_virtualPayloadSize;
+    CcnxNameComponents m_prefix;
     TracedCallback<const Ptr<CcnxFace>&,const Ptr<const Packet>& > m_interestsTrace;
     TracedCallback<const Ptr<CcnxFace>&,const Ptr<const Packet>& > m_contentObjectsTrace;
 };
