diff --git a/tools/Makefile.am b/tools/Makefile.am
index a1a0094..216bb82 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,6 +1,11 @@
 
-bin_PROGRAMS=tlvdump
+bin_PROGRAMS = tlvdump ndncatchunks ndnputchunks
 
 tlvdump_SOURCES = tlvdump.cpp
-
 tlvdump_LDADD = ../libndn-cpp.la @BOOST_SYSTEM_LIB@
+
+ndncatchunks_SOURCES = ndncatchunks.cpp
+ndncatchunks_LDADD = ../libndn-cpp.la @BOOST_SYSTEM_LIB@
+
+ndnputchunks_SOURCES = ndnputchunks.cpp
+ndnputchunks_LDADD = ../libndn-cpp.la @BOOST_SYSTEM_LIB@
diff --git a/tools/ndncatchunks.cpp b/tools/ndncatchunks.cpp
new file mode 100644
index 0000000..6bfb07a
--- /dev/null
+++ b/tools/ndncatchunks.cpp
@@ -0,0 +1,192 @@
+/* -*- 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 <stdexcept>
+#include <iostream>
+
+#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
+
+class Consumer
+{
+public:
+  Consumer (const std::string &data_name, int pipe_size, int total_seg)
+    : m_data_name (data_name), m_pipe_size (pipe_size), m_total_seg (total_seg),
+      m_next_seg (0), m_total_size (0), m_output (false)
+  {
+  }
+
+  inline void
+  enable_output ()
+  {
+    m_output = true;
+  }
+
+  void
+  run ();
+  
+private:
+  void
+  on_data (const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest,
+	   const ndn::ptr_lib::shared_ptr<ndn::Data> &data);
+
+  void
+  on_timeout (const ndn::ptr_lib::shared_ptr<const ndn::Interest> &interest);
+  
+  ndn::Face m_face;
+  ndn::Name m_data_name;
+  int m_pipe_size;
+  int m_total_seg;
+  int m_next_seg;
+  int m_total_size;
+  bool m_output;  // set to false by default
+};
+
+void
+Consumer::run ()
+{
+  try
+    {
+      for (int i = 0; i < m_pipe_size; i++)
+	{
+	  ndn::Interest inst (ndn::Name(m_data_name).appendSegment (m_next_seg++));
+	  inst.setScope (1);
+	  inst.setInterestLifetime (1000);
+	  inst.setMustBeFresh (true);
+	  
+	  m_face.expressInterest (inst,
+				  ndn::func_lib::bind (&Consumer::on_data, this, _1, _2),
+				  ndn::func_lib::bind (&Consumer::on_timeout, this, _1));
+	}
+      
+      // processEvents will block until the requested data received or timeout occurs
+      m_face.processEvents ();
+    }
+  catch (std::exception& e)
+    {
+      std::cerr << "ERROR: " << e.what () << std::endl;
+    }
+}
+
+void
+Consumer::on_data (const ndn::ptr_lib::shared_ptr<const ndn::Interest>& interest, const ndn::ptr_lib::shared_ptr<ndn::Data>& data)
+{
+  const ndn::Block& content = data->getContent ();
+  const ndn::Name& name = data->getName ();
+
+  if (m_output)
+    {
+      std::cout.write(reinterpret_cast<const char*>(content.value()), content.value_size());
+    }
+
+  m_total_size += content.value_size ();
+  
+  if ((int) (name.rbegin ()->toSegment ()) + 1 == m_total_seg)
+    {
+      std::cerr << "Last segment received." << std::endl;
+      std::cerr << "Total # bytes of content received: " << m_total_size << std::endl;
+    }
+  else
+    {
+      // Send interest for next segment
+      ndn::Interest inst (ndn::Name(m_data_name).appendSegment (m_next_seg++));
+      inst.setScope (1);
+      inst.setInterestLifetime (1000);
+      inst.setMustBeFresh (true);
+      
+      m_face.expressInterest (inst,
+			      ndn::func_lib::bind (&Consumer::on_data, this, _1, _2),
+			      ndn::func_lib::bind (&Consumer::on_timeout, this, _1));  
+    }
+}
+
+
+void
+Consumer::on_timeout (const ndn::ptr_lib::shared_ptr<const ndn::Interest>& interest)
+{
+  //XXX: currently no retrans
+  std::cerr << "TIMEOUT: last interest sent for segment #" << (m_next_seg - 1) << std::endl;
+}
+
+
+int
+usage(const std::string &filename)
+{
+  std::cerr << "Usage: \n    " << filename << " [-p pipe_size] [-c total_segment] [-o] /ndn/name\n";
+  return 1;
+}
+
+
+int
+main (int argc, char **argv)
+{
+  std::string name;
+  int pipe_size = 1;
+  int total_seg = std::numeric_limits<int>::max();
+  bool output = false;
+
+  int opt;
+  while ((opt = getopt(argc, argv, "op:c:")) != -1)
+    {
+      switch (opt)
+	{
+        case 'p':
+	  pipe_size = atoi (optarg);
+	  if (pipe_size <= 0)
+	    pipe_size = 1;
+	  std::cerr << "main (): set pipe size = " << pipe_size << std::endl;
+	  break;
+	case 'c':
+	  total_seg = atoi (optarg);
+	  if (total_seg <= 0)
+	    total_seg = 1;
+	  std::cerr << "main (): set total seg = " << total_seg << std::endl;
+	  break;
+	case 'o':
+	  output = true;
+	  break;
+        default: 
+	  return usage(argv[0]);
+        }
+    }
+
+  if (optind < argc)
+    {
+      name = argv[optind];
+    }
+  
+  if (name.empty())
+    {
+      return usage(argv[0]);
+    }
+  
+  Consumer consumer (name, pipe_size, total_seg);
+
+  if (output)
+    consumer.enable_output ();
+  
+  consumer.run ();
+
+  return 0;
+}
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;
+}
