diff --git a/tools/ndnputchunks.cpp b/tools/ndnputchunks.cpp
new file mode 100644
index 0000000..68755a9
--- /dev/null
+++ b/tools/ndnputchunks.cpp
@@ -0,0 +1,131 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 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: Wentao Shang <wentao@cs.ucla.edu>
+ */
+
+#include <ndn-cpp/face.hpp>
+#include <ndn-cpp/security/key-chain.hpp>
+
+#if NDN_CPP_HAVE_CXX11
+// In the std library, the placeholders are in a different namespace than boost.
+using namespace ndn::func_lib::placeholders;
+#endif
+
+#define MAX_SEG_SIZE 4096
+
+class Producer
+{
+public:
+  Producer (const char* name)
+  : m_name (name)
+  , m_verbose (false)
+  {
+    int segnum = 0;
+    char* buf = new char[MAX_SEG_SIZE];
+    do
+      {
+        std::cin.read (buf, MAX_SEG_SIZE);
+        int got = std::cin.gcount ();
+
+        if (got > 0)
+          {
+            ndn::ptr_lib::shared_ptr<ndn::Data> data = ndn::ptr_lib::make_shared<ndn::Data> (ndn::Name(m_name).appendSegment (segnum));
+            data->setFreshnessPeriod (10000); // 10 sec
+            data->setContent (reinterpret_cast<const uint8_t*>(buf), got);
+            
+            m_keychain.sign(*data);
+            m_store.push_back(data);
+            segnum++;
+          }
+      }
+    while (std::cin);
+
+    if (m_verbose)
+      std::cerr << "Created " << segnum << " chunks for prefix [" << m_name << "]" << std::endl;
+  }
+
+  void
+  onInterest (const ndn::ptr_lib::shared_ptr<const ndn::Name>& name, const ndn::ptr_lib::shared_ptr<const ndn::Interest>& interest)
+  {
+    if (m_verbose)
+      std::cerr << "<< I: " << *interest << std::endl;
+    
+    size_t segnum = static_cast<size_t>(interest->getName ().rbegin ()->toSegment ());
+
+    if (segnum < m_store.size())
+      {
+        m_face.put (*m_store[segnum]);
+      }
+  }
+
+  void
+  onRegisterFailed (const ndn::ptr_lib::shared_ptr<const ndn::Name>&)
+  {
+    std::cerr << "ERROR: Failed to register prefix in local hub's daemon" << std::endl;
+    m_face.shutdown ();
+  }
+  
+  void
+  run ()
+  {
+    if (m_store.empty())
+      {
+        std::cerr << "Nothing to serve. Exiting." << std::endl;
+        return;
+      }
+    
+    m_face.setInterestFilter (m_name,
+                              ndn::func_lib::bind (&Producer::onInterest, this, _1, _2),
+                              ndn::func_lib::bind (&Producer::onRegisterFailed, this, _1));
+    m_face.processEvents ();
+  }
+
+private:
+  ndn::Name m_name;
+  ndn::Face m_face;
+  ndn::KeyChain m_keychain;
+  
+  std::vector< ndn::ptr_lib::shared_ptr<ndn::Data> > m_store;
+
+  bool m_verbose;
+};
+
+int
+main (int argc, char *argv[])
+{
+  if (argc < 2)
+    {
+      std::cerr << "Usage: ./ndnputchunks [data_prefix]\n";
+      return -1;
+    }
+  
+  try
+    {
+      ndn::MillisecondsSince1970 time = ndn::getNow();
+      
+      std::cerr << "Preparing the input..." << std::endl;
+      Producer producer (argv[1]);
+      std::cerr << "Ready... (took " << ((ndn::getNow() - time)/1000) << " seconds)" << std::endl;
+      producer.run ();
+    }
+  catch (std::exception& e)
+    {
+      std::cerr << "ERROR: " << e.what () << std::endl;
+    }
+  return 0;
+}
