diff --git a/model/ccnx-content-object-header.cc b/model/ccnx-content-object-header.cc
index 070c366..0dba3cb 100644
--- a/model/ccnx-content-object-header.cc
+++ b/model/ccnx-content-object-header.cc
@@ -462,10 +462,10 @@
   Buffer::Iterator i = start;
   i.Prev (2); // Trailer interface requires us to go backwards
 
-  uint8_t __attribute__ ((unused)) closing_tag_content = i.ReadU8 ();
+  uint8_t closing_tag_content = i.ReadU8 ();
   NS_ASSERT_MSG (closing_tag_content==0, "Should be a closing tag </Content> (0x00)");
 
-  uint8_t __attribute__ ((unused)) closing_tag_content_object = i.ReadU8 ();
+  uint8_t closing_tag_content_object = i.ReadU8 ();
   NS_ASSERT_MSG (closing_tag_content_object==0, "Should be a closing tag </ContentObject> (0x00)");
 
   return 2;
diff --git a/model/ccnx-content-store-lru.cc b/model/ccnx-content-store-lru.cc
new file mode 100644
index 0000000..bb35c1b
--- /dev/null
+++ b/model/ccnx-content-store-lru.cc
@@ -0,0 +1,173 @@
+/* -*-  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>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "ccnx-content-store-lru.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/ccnx-interest-header.h"
+#include "ns3/ccnx-content-object-header.h"
+#include "ns3/uinteger.h"
+
+NS_LOG_COMPONENT_DEFINE ("CcnxContentStoreLru");
+
+namespace ns3
+{
+
+NS_OBJECT_ENSURE_REGISTERED (CcnxContentStoreLru);
+
+using namespace __ccnx_private;
+
+TypeId 
+CcnxContentStoreLru::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::CcnxContentStoreLru")
+    .SetGroupName ("Ccnx")
+    .SetParent<CcnxContentStore> ()
+    .AddConstructor<CcnxContentStoreLru> ()
+    .AddAttribute ("Size",
+                   "Maximum number of packets that content storage can hold",
+                   UintegerValue (100),
+                   MakeUintegerAccessor (&CcnxContentStoreLru::SetMaxSize,
+                                         &CcnxContentStoreLru::GetMaxSize),
+                   MakeUintegerChecker<uint32_t> ())
+    ;
+
+  return tid;
+}
+
+void
+CcnxContentStoreLru::SetMaxSize (uint32_t maxSize)
+{
+  m_maxSize = maxSize;
+}
+
+uint32_t
+CcnxContentStoreLru::GetMaxSize () const
+{
+  return m_maxSize;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Helper classes
+//////////////////////////////////////////////////////////////////////
+/**
+ * \ingroup ccnx
+ * \brief Typedef for hash index of content store container
+ */
+struct CcnxContentStoreByPrefix
+{
+  typedef
+  CcnxContentStoreLruContainer::type::index<i_prefix>::type
+  type;
+};
+
+/**
+ * \ingroup ccnx
+ * \brief Typedef for MRU index of content store container
+ */
+struct CcnxContentStoreByMru
+{
+  typedef
+  CcnxContentStoreLruContainer::type::index<i_mru>::type
+  type;
+};
+
+#ifdef _DEBUG
+#define DUMP_INDEX_TAG i_ordered
+#define DUMP_INDEX     CcnxContentStoreOrderedPrefix
+/**
+ * \ingroup ccnx
+ * \brief Typedef for ordered index of content store container
+ */
+struct CcnxContentStoreOrderedPrefix
+{
+  typedef
+  CcnxContentStoreLruContainer::type::index<i_ordered>::type
+  type;
+};
+#else
+#define DUMP_INDEX_TAG i_mru
+#define DUMP_INDEX     CcnxContentStoreByMru
+#endif
+
+
+
+CcnxContentStoreLru::CcnxContentStoreLru ()
+  : m_maxSize (100)
+{ } // this value shouldn't matter, NS-3 should call SetSize with default value specified in AddAttribute earlier
+        
+CcnxContentStoreLru::~CcnxContentStoreLru () 
+{ }
+
+
+boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
+CcnxContentStoreLru::Lookup (Ptr<const CcnxInterestHeader> interest)
+{
+  NS_LOG_FUNCTION (this << interest->GetName ());
+  CcnxContentStoreLruContainer::type::iterator it = m_contentStore.get<i_prefix> ().find (interest->GetName ());
+  if (it != m_contentStore.end ())
+    {
+      // promote entry to the top
+      m_contentStore.get<i_mru> ().relocate (m_contentStore.get<i_mru> ().begin (),
+                                           m_contentStore.project<i_mru> (it));
+
+      // return fully formed CCNx packet
+      return boost::make_tuple (it->GetFullyFormedCcnxPacket (), it->GetHeader (), it->GetPacket ());
+    }
+  return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader>, Ptr<Packet> > (0, 0, 0);
+}   
+    
+bool 
+CcnxContentStoreLru::Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
+{
+  NS_LOG_FUNCTION (this << header->GetName ());
+  CcnxContentStoreLruContainer::type::iterator it = m_contentStore.get<i_prefix> ().find (header->GetName ());
+  if (it == m_contentStore.end ())
+    { // add entry to the top
+      m_contentStore.get<i_mru> ().push_front (CcnxContentStoreEntry (header, packet));
+      if (m_contentStore.size () > m_maxSize)
+        m_contentStore.get<i_mru> ().pop_back ();
+      return false;
+    }
+  else
+    {
+      /// @todo Wrong!!! Record should be updated and relocated, not just relocated
+      // promote entry to the top
+      m_contentStore.get<i_mru> ().relocate (m_contentStore.get<i_mru> ().begin (),
+                                             m_contentStore.project<i_mru> (it));
+      return true;
+    }
+}
+    
+void 
+CcnxContentStoreLru::Print() const
+{
+  for( DUMP_INDEX::type::iterator it=m_contentStore.get<DUMP_INDEX_TAG> ().begin ();
+       it != m_contentStore.get<DUMP_INDEX_TAG> ().end ();
+       it++
+       )
+    {
+      NS_LOG_INFO (it->GetName ());
+    }
+}
+
+} // namespace ns3
diff --git a/model/ccnx-content-store-lru.h b/model/ccnx-content-store-lru.h
new file mode 100644
index 0000000..66a81a2
--- /dev/null
+++ b/model/ccnx-content-store-lru.h
@@ -0,0 +1,138 @@
+/* -*-  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_CONTENT_STORE_LRU_H
+#define	CCNX_CONTENT_STORE_LRU_H
+
+#include "ccnx-content-store.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>
+#include <boost/tuple/tuple.hpp>
+
+#include "ccnx.h"
+#include "ccnx-name-components-hash-helper.h"
+// #include "ccnx-content-object-header.h"
+// #include "ccnx-interest-header.h"
+// #include "ccnx-name-components.h"
+
+namespace  ns3
+{
+/**
+ * \ingroup ccnx
+ * \brief Typedef for content store container implemented as a Boost.MultiIndex container
+ *
+ * - First index (tag<prefix>) is a unique hash index based on NDN prefix of the stored content.
+ * - Second index (tag<mru>) is a sequential index used to maintain up to m_maxSize most recent used (MRU) entries in the content store
+ * - Third index (tag<ordered>) is just a helper to provide stored prefixes in ordered way. Should be disabled in production build
+ *
+ * \see http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/ for more information on Boost.MultiIndex library
+ */
+struct CcnxContentStoreLruContainer
+{
+  /// @cond include_hidden
+  typedef
+  boost::multi_index::multi_index_container<
+    CcnxContentStoreEntry,
+    boost::multi_index::indexed_by<
+      boost::multi_index::hashed_unique<
+        boost::multi_index::tag<__ccnx_private::i_prefix>,
+        boost::multi_index::const_mem_fun<CcnxContentStoreEntry,
+                                          const CcnxNameComponents&,
+                                          &CcnxContentStoreEntry::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<CcnxContentStoreEntry,
+                                          const CcnxNameComponents&,
+                                          &CcnxContentStoreEntry::GetName>
+          >
+#endif
+      >
+    > type;
+  /// @endcond
+};
+
+/**
+ * \ingroup ccnx
+ * \brief NDN content store entry
+ */
+class CcnxContentStoreLru : public CcnxContentStore
+{
+public:
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static TypeId GetTypeId ();
+
+  /**
+   * Default constructor
+   */
+  CcnxContentStoreLru ();
+  virtual ~CcnxContentStoreLru ();
+
+  /**
+   * \brief Set maximum size of content store
+   *
+   * \param size size in packets
+   */
+  void
+  SetMaxSize (uint32_t maxSize);
+
+  /**
+   * \brief Get maximum size of content store
+   *
+   * \returns size in packets
+   */
+  uint32_t
+  GetMaxSize () const;
+  
+  // from CcnxContentStore
+  virtual boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
+  Lookup (Ptr<const CcnxInterestHeader> interest);
+            
+  virtual bool
+  Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+
+  virtual void
+  Print () const;
+  
+private:
+  size_t m_maxSize; ///< \brief maximum number of entries in cache
+
+  /**
+   * \brief Content store implemented as a Boost.MultiIndex container
+   * \internal
+   */
+  CcnxContentStoreLruContainer::type m_contentStore;
+};
+
+} //namespace ns3
+
+#endif // CCNX_CONTENT_STORE_LRU_H
diff --git a/model/ccnx-content-store.cc b/model/ccnx-content-store.cc
index f21841a..986405f 100644
--- a/model/ccnx-content-store.cc
+++ b/model/ccnx-content-store.cc
@@ -1,6 +1,6 @@
 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2011 University of California, Los Angeles
+ * Copyright (c) 2011,2012 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
@@ -15,16 +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
  *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         
  */
 
 #include "ccnx-content-store.h"
 #include "ns3/log.h"
 #include "ns3/packet.h"
+#include "ns3/ccnx-name-components.h"
 #include "ns3/ccnx-interest-header.h"
 #include "ns3/ccnx-content-object-header.h"
-#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxContentStore");
 
@@ -33,79 +34,28 @@
 
 NS_OBJECT_ENSURE_REGISTERED (CcnxContentStore);
 
-using namespace __ccnx_private;
-
 TypeId 
 CcnxContentStore::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::CcnxContentStore")
     .SetGroupName ("Ccnx")
     .SetParent<Object> ()
-    .AddConstructor<CcnxContentStore> ()
-    .AddAttribute ("Size",
-                   "Maximum number of packets that content storage can hold",
-                   UintegerValue (100),
-                   MakeUintegerAccessor (&CcnxContentStore::SetMaxSize,
-                                         &CcnxContentStore::GetMaxSize),
-                   MakeUintegerChecker<uint32_t> ())
     ;
 
   return tid;
 }
 
-//////////////////////////////////////////////////////////////////////
-// Helper classes
-//////////////////////////////////////////////////////////////////////
-/**
- * \ingroup ccnx
- * \brief Typedef for hash index of content store container
- */
-struct CcnxContentStoreByPrefix
-{
-  typedef
-  CcnxContentStoreContainer::type::index<i_prefix>::type
-  type;
-};
 
-/**
- * \ingroup ccnx
- * \brief Typedef for MRU index of content store container
- */
-struct CcnxContentStoreByMru
+CcnxContentStore::~CcnxContentStore () 
 {
-  typedef
-  CcnxContentStoreContainer::type::index<i_mru>::type
-  type;
-};
-
-#ifdef _DEBUG
-#define DUMP_INDEX_TAG i_ordered
-#define DUMP_INDEX     CcnxContentStoreOrderedPrefix
-/**
- * \ingroup ccnx
- * \brief Typedef for ordered index of content store container
- */
-struct CcnxContentStoreOrderedPrefix
-{
-  typedef
-  CcnxContentStoreContainer::type::index<i_ordered>::type
-  type;
-};
-#else
-#define DUMP_INDEX_TAG i_mru
-#define DUMP_INDEX     CcnxContentStoreByMru
-#endif
+}
 
 //////////////////////////////////////////////////////////////////////
 
 CcnxContentStoreEntry::CcnxContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
   : m_header (header)
+  , m_packet (packet->Copy ())
 {
-  static CcnxContentObjectTail tail; ///< \internal for optimization purposes
-
-  m_packet = packet->Copy ();
-  //m_packet->RemoveHeader (*header);//causes bug
-  //m_packet->RemoveTrailer (tail);
 }
 
 Ptr<Packet>
@@ -119,83 +69,22 @@
   return packet;
 }
 
-// /// Disabled copy constructor
-// CcnxContentStoreEntry::CcnxContentStoreEntry (const CcnxContentStoreEntry &o)
-// {
-// }
-
-// /// Disables copy operator
-// CcnxContentStoreEntry& CcnxContentStoreEntry::operator= (const CcnxContentStoreEntry &o)
-// {
-//   return *this;
-// }
-
-
-
-CcnxContentStore::CcnxContentStore( )
-  : m_maxSize(100) { } // this value shouldn't matter, NS-3 should call SetSize with default value specified in AddAttribute earlier
-        
-CcnxContentStore::~CcnxContentStore( ) 
-{ }
-
-/// Disabled copy constructor
-CcnxContentStore::CcnxContentStore (const CcnxContentStore &o)
+const CcnxNameComponents&
+CcnxContentStoreEntry::GetName () const
 {
+  return m_header->GetName ();
 }
 
-/// Disables copy operator
-CcnxContentStore& CcnxContentStore::operator= (const CcnxContentStore &o)
+Ptr<const CcnxContentObjectHeader>
+CcnxContentStoreEntry::GetHeader () const
 {
-  return *this;
+  return m_header;
 }
 
-
-boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
-CcnxContentStore::Lookup (Ptr<const CcnxInterestHeader> interest)
+Ptr<const Packet>
+CcnxContentStoreEntry::GetPacket () const
 {
-  NS_LOG_FUNCTION (this << interest->GetName ());
-  CcnxContentStoreContainer::type::iterator it = m_contentStore.get<i_prefix> ().find (interest->GetName ());
-  if (it != m_contentStore.end ())
-    {
-      // promote entry to the top
-      m_contentStore.get<i_mru> ().relocate (m_contentStore.get<i_mru> ().begin (),
-                                           m_contentStore.project<i_mru> (it));
-
-      // return fully formed CCNx packet
-      return boost::make_tuple (it->GetFullyFormedCcnxPacket (), it->GetHeader (), it->GetPacket ());
-    }
-  return boost::tuple<Ptr<Packet>, Ptr<CcnxContentObjectHeader>, Ptr<Packet> > (0, 0, 0);
-}   
-    
-void 
-CcnxContentStore::Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
-{
-  NS_LOG_FUNCTION (this << header->GetName ());
-  CcnxContentStoreContainer::type::iterator it = m_contentStore.get<i_prefix> ().find (header->GetName ());
-  if (it == m_contentStore.end ())
-    { // add entry to the top
-      m_contentStore.get<i_mru> ().push_front (CcnxContentStoreEntry (header, packet));
-      if (m_contentStore.size () > m_maxSize)
-        m_contentStore.get<i_mru> ().pop_back ();
-    }
-  else
-    {
-      // promote entry to the top
-      m_contentStore.get<i_mru> ().relocate (m_contentStore.get<i_mru> ().begin (),
-                                           m_contentStore.project<i_mru> (it));
-    }
-}
-    
-void 
-CcnxContentStore::Print() const
-{
-  for( DUMP_INDEX::type::iterator it=m_contentStore.get<DUMP_INDEX_TAG> ().begin ();
-       it != m_contentStore.get<DUMP_INDEX_TAG> ().end ();
-       it++
-       )
-    {
-      NS_LOG_INFO (it->GetName ());
-    }
+  return m_packet;
 }
 
 } // namespace ns3
diff --git a/model/ccnx-content-store.h b/model/ccnx-content-store.h
index 6c0e876..dd56867 100644
--- a/model/ccnx-content-store.h
+++ b/model/ccnx-content-store.h
@@ -1,6 +1,6 @@
 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2011 University of California, Los Angeles
+ * Copyright (c) 2011,2012 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
@@ -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: Ilya Moiseenko <iliamo@cs.ucla.edu>
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
 #ifndef CCNX_CONTENT_STORE_H
@@ -23,28 +24,16 @@
 
 #include "ns3/object.h"
 #include "ns3/ptr.h"
-#include "ns3/packet.h"
-
-#include <list>
-#include <string>
-#include <iostream>
-
-#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>
 #include <boost/tuple/tuple.hpp>
 
-#include "ccnx.h"
-#include "ccnx-name-components-hash-helper.h"
-#include "ccnx-content-object-header.h"
-#include "ccnx-interest-header.h"
-#include "ccnx-name-components.h"
-
 namespace  ns3
 {
+
+class Packet;
+class CcnxContentObjectHeader;
+class CcnxInterestHeader;
+class CcnxNameComponents;
+
 /**
  * \ingroup ccnx
  * \brief NDN content store entry
@@ -74,21 +63,21 @@
    * \brief Get prefix of the stored entry
    * \returns prefix of the stored entry
    */
-  inline const CcnxNameComponents&
+  const CcnxNameComponents&
   GetName () const;
 
   /**
    * \brief Get CcnxContentObjectHeader of the stored entry
    * \returns CcnxContentObjectHeader of the stored entry
    */
-  inline Ptr<const CcnxContentObjectHeader>
+  Ptr<const CcnxContentObjectHeader>
   GetHeader () const;
 
   /**
    * \brief Get content of the stored entry
    * \returns content of the stored entry
    */
-  inline Ptr<const Packet>
+  Ptr<const Packet>
   GetPacket () const;
 
   /**
@@ -98,58 +87,17 @@
   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
 };
 
-/**
- * \ingroup ccnx
- * \brief Typedef for content store container implemented as a Boost.MultiIndex container
- *
- * - First index (tag<prefix>) is a unique hash index based on NDN prefix of the stored content.
- * - Second index (tag<mru>) is a sequential index used to maintain up to m_maxSize most recent used (MRU) entries in the content store
- * - Third index (tag<ordered>) is just a helper to provide stored prefixes in ordered way. Should be disabled in production build
- *
- * \see http://www.boost.org/doc/libs/1_46_1/libs/multi_index/doc/ for more information on Boost.MultiIndex library
- */
-struct CcnxContentStoreContainer
-{
-  /// @cond include_hidden
-  typedef
-  boost::multi_index::multi_index_container<
-    CcnxContentStoreEntry,
-    boost::multi_index::indexed_by<
-      boost::multi_index::hashed_unique<
-        boost::multi_index::tag<__ccnx_private::i_prefix>,
-        boost::multi_index::const_mem_fun<CcnxContentStoreEntry,
-                                          const CcnxNameComponents&,
-                                          &CcnxContentStoreEntry::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<CcnxContentStoreEntry,
-                                          const CcnxNameComponents&,
-                                          &CcnxContentStoreEntry::GetName>
-          >
-#endif
-      >
-    > type;
-  /// @endcond
-};
 
 /**
  * \ingroup ccnx
- * \brief NDN content store entry
+ * \brief Base class for NDN content store
+ *
+ * Particular implementations should implement Lookup, Add, and Print methods
  */
 class CcnxContentStore : public Object
 {
@@ -159,13 +107,13 @@
    *
    * \return interface ID
    */
-  static TypeId GetTypeId ();
+  static
+  TypeId GetTypeId ();
 
   /**
-   * Default constructor
+   * @brief Virtual destructor
    */
-  CcnxContentStore( );
-  virtual ~CcnxContentStore( );
+  virtual ~CcnxContentStore ();
             
   /**
    * \brief Find corresponding CS entry for the given interest
@@ -176,8 +124,8 @@
    * If an entry is found, it is promoted to the top of most recent
    * used entries index, \see m_contentStore
    */
-  boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
-  Lookup (Ptr<const CcnxInterestHeader> interest);
+  virtual boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
+  Lookup (Ptr<const CcnxInterestHeader> interest) = 0;
             
   /**
    * \brief Add a new content to the content store.
@@ -185,28 +133,19 @@
    * \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
+   * @returns true if an existing entry was updated, false otherwise
    */
-  void
-  Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet);
+  virtual bool
+  Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet) = 0;
 
-  /**
-   * \brief Set maximum size of content store
-   *
-   * \param size size in packets
-   */
-  inline void
-  SetMaxSize (uint32_t maxSize);
-
-  /**
-   * \brief Get maximum size of content store
-   *
-   * \returns size in packets
-   */
-  inline uint32_t
-  GetMaxSize () const;
+  // /**
+  //  * \brief Add a new content to the content store.
+  //  *
+  //  * \param header Interest header for which an entry should be removed
+  //  * @returns true if an existing entry was removed, false otherwise
+  //  */
+  // virtual bool
+  // Remove (Ptr<CcnxInterestHeader> header) = 0;
   
   /**
    * \brief Print out content store entries
@@ -216,21 +155,8 @@
    *
    * Release build dumps everything in MRU order
    */
-  void Print () const;
-
-private:
-  CcnxContentStore (const CcnxContentStore &o); ///< Disabled copy constructor
-  CcnxContentStore& operator= (const CcnxContentStore &o); ///< Disabled copy operator
- 
-private:
-  size_t m_maxSize; ///< \brief maximum number of entries in cache \internal
-  // string_key_hash_t<CsEntry>  m_contentStore;     ///< \brief actual content store \internal
-
-  /**
-   * \brief Content store implemented as a Boost.MultiIndex container
-   * \internal
-   */
-  CcnxContentStoreContainer::type m_contentStore;
+  virtual void
+  Print () const = 0;
 };
 
 inline std::ostream&
@@ -240,37 +166,6 @@
   return os;
 }
 
-const CcnxNameComponents&
-CcnxContentStoreEntry::GetName () const
-{
-  return m_header->GetName ();
-}
-
-Ptr<const CcnxContentObjectHeader>
-CcnxContentStoreEntry::GetHeader () const
-{
-  return m_header;
-}
-
-Ptr<const Packet>
-CcnxContentStoreEntry::GetPacket () const
-{
-  return m_packet;
-}
-
-
-inline void
-CcnxContentStore::SetMaxSize (uint32_t maxSize)
-{
-  m_maxSize = maxSize;
-}
-
-inline uint32_t
-CcnxContentStore::GetMaxSize () const
-{
-  return m_maxSize;
-}
-
-} //namespace ns3
+} // namespace ns3
 
 #endif // CCNX_CONTENT_STORE_H
diff --git a/model/ccnx-interest-header.cc b/model/ccnx-interest-header.cc
index 06777e3..554cded 100644
--- a/model/ccnx-interest-header.cc
+++ b/model/ccnx-interest-header.cc
@@ -26,6 +26,7 @@
 #include "ccnx-interest-header.h"
 
 #include "ns3/log.h"
+#include "ns3/unused.h"
 #include "../helper/ccnx-encoding-helper.h"
 #include "../helper/ccnx-decoding-helper.h"
 
@@ -198,8 +199,8 @@
 void
 CcnxInterestHeader::Serialize (Buffer::Iterator start) const
 {
-  size_t size __attribute__ ((__unused__)) = CcnxEncodingHelper::Serialize (start, *this);
-  
+  size_t size = CcnxEncodingHelper::Serialize (start, *this);
+  NS_UNUSED (size);
   NS_LOG_INFO ("Serialize size = " << size);
 }
 
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index 83ab9d2..013a2ee 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -98,7 +98,6 @@
   NS_LOG_FUNCTION (this);
   
   m_pit = CreateObject<CcnxPit> ();
-  m_contentStore = CreateObject<CcnxContentStore> ();
 }
 
 CcnxL3Protocol::~CcnxL3Protocol ()
@@ -125,7 +124,7 @@
 {
   if (m_node == 0)
     {
-      Ptr<Node>node = this->GetObject<Node>();
+      Ptr<Node> node = this->GetObject<Node>();
       // verify that it's a valid node and that
       // the node has not been set before
       if (node != 0)
@@ -133,6 +132,11 @@
           this->SetNode (node);
         }
     }
+  if (m_contentStore == 0)
+    {
+      m_contentStore = this->GetObject<CcnxContentStore> ();
+    }
+
   Object::NotifyNewAggregate ();
 }
 
