diff --git a/model/cs/content-store-nocache.cc b/model/cs/content-store-nocache.cc
new file mode 100644
index 0000000..8814c13
--- /dev/null
+++ b/model/cs/content-store-nocache.cc
@@ -0,0 +1,102 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * 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
+ * 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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Ilya Moiseenko <iliamo@cs.ucla.edu>
+ *         
+ */
+
+#include "content-store-nocache.h"
+#include "ns3/log.h"
+#include "ns3/packet.h"
+#include "ns3/ndn-name.h"
+#include "ns3/ndn-interest.h"
+#include "ns3/ndn-content-object.h"
+
+NS_LOG_COMPONENT_DEFINE ("ndn.cs.Nocache");
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+NS_OBJECT_ENSURE_REGISTERED (Nocache);
+
+TypeId 
+Nocache::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("ns3::ndn::cs::Nocache")
+    .SetGroupName ("Ndn")
+    .SetParent<ContentStore> ()
+    .AddConstructor< Nocache > ()
+    ;
+
+  return tid;
+}
+
+Nocache::Nocache ()
+{
+}
+
+Nocache::~Nocache () 
+{
+}
+
+boost::tuple<Ptr<Packet>, Ptr<const ContentObject>, Ptr<const Packet> >
+Nocache::Lookup (Ptr<const Interest> interest)
+{
+  this->m_cacheMissesTrace (interest);
+  return boost::tuple<Ptr<Packet>, Ptr<const ContentObject>, Ptr<const Packet> > (0, 0, 0);
+}
+
+bool
+Nocache::Add (Ptr<const ContentObject> header, Ptr<const Packet> packet)
+{
+  return false;
+}
+
+void
+Nocache::Print (std::ostream &os) const
+{
+}
+
+uint32_t
+Nocache::GetSize () const
+{
+  return 0;
+}
+
+Ptr<cs::Entry>
+Nocache::Begin ()
+{
+  return 0;
+}
+
+Ptr<cs::Entry>
+Nocache::End ()
+{
+  return 0;
+}
+
+Ptr<cs::Entry>
+Nocache::Next (Ptr<cs::Entry>)
+{
+  return 0;
+}
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
diff --git a/model/cs/content-store-nocache.h b/model/cs/content-store-nocache.h
new file mode 100644
index 0000000..6d38f40
--- /dev/null
+++ b/model/cs/content-store-nocache.h
@@ -0,0 +1,84 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2013, Regents of the University of California
+ *                     Alexander Afanasyev
+ *
+ * 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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef NDN_CONTENT_STORE_NOCACHE_H
+#define	NDN_CONTENT_STORE_NOCACHE_H
+
+#include "ns3/ndn-content-store.h"
+
+namespace ns3 {
+namespace ndn {
+namespace cs {
+
+/**
+ * \ingroup ndn
+ * \brief Implementation of ContentStore that completely disables caching
+ */
+class Nocache : public ContentStore
+{
+public:
+  /**
+   * \brief Interface ID
+   *
+   * \return interface ID
+   */
+  static
+  TypeId GetTypeId ();
+
+  /**
+   * @brief Default constructor
+   */
+  Nocache ();
+  
+  /**
+   * @brief Virtual destructor
+   */
+  virtual
+  ~Nocache ();
+
+  virtual boost::tuple<Ptr<Packet>, Ptr<const ContentObject>, Ptr<const Packet> >
+  Lookup (Ptr<const Interest> interest);
+
+  virtual bool
+  Add (Ptr<const ContentObject> header, Ptr<const Packet> packet);
+
+  virtual void
+  Print (std::ostream &os) const;
+
+  virtual uint32_t
+  GetSize () const;
+
+  virtual Ptr<cs::Entry>
+  Begin ();
+
+  virtual Ptr<cs::Entry>
+  End ();
+
+  virtual Ptr<cs::Entry>
+  Next (Ptr<cs::Entry>);
+
+};
+
+} // namespace cs
+} // namespace ndn
+} // namespace ns3
+
+#endif // NDN_CONTENT_STORE_NOCACHE_H
