diff --git a/daemon/table/cs-policy.cpp b/daemon/table/cs-policy.cpp
index 9726269..3d22c1e 100644
--- a/daemon/table/cs-policy.cpp
+++ b/daemon/table/cs-policy.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California,
+ * Copyright (c) 2014-2016,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -41,9 +41,7 @@
 void
 Policy::setLimit(size_t nMaxEntries)
 {
-  BOOST_ASSERT(nMaxEntries > 0);
   m_limit = nMaxEntries;
-
   this->evictEntries();
 }
 
diff --git a/daemon/table/cs.cpp b/daemon/table/cs.cpp
index 4550361..19df21a 100644
--- a/daemon/table/cs.cpp
+++ b/daemon/table/cs.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California,
+ * Copyright (c) 2014-2016,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -78,17 +78,22 @@
   m_policy->setLimit(limit);
 }
 
-bool
+void
 Cs::insert(const Data& data, bool isUnsolicited)
 {
   NFD_LOG_DEBUG("insert " << data.getName());
 
+  if (m_policy->getLimit() == 0) {
+    // shortcut for disabled CS
+    return;
+  }
+
   // recognize CachePolicy
   shared_ptr<lp::CachePolicyTag> tag = data.getTag<lp::CachePolicyTag>();
   if (tag != nullptr) {
     lp::CachePolicyType policy = tag->get().getPolicy();
     if (policy == lp::CachePolicyType::NO_CACHE) {
-      return false;
+      return;
     }
   }
 
@@ -111,8 +116,6 @@
   else {
     m_policy->afterInsert(it);
   }
-
-  return true;
 }
 
 void
diff --git a/daemon/table/cs.hpp b/daemon/table/cs.hpp
index 5a24bde..3a9b1ca 100644
--- a/daemon/table/cs.hpp
+++ b/daemon/table/cs.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California,
+ * Copyright (c) 2014-2016,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -69,9 +69,8 @@
   Cs(size_t nMaxPackets = 10, unique_ptr<Policy> policy = makeDefaultPolicy());
 
   /** \brief inserts a Data packet
-   *  \return true
    */
-  bool
+  void
   insert(const Data& data, bool isUnsolicited = false);
 
   typedef std::function<void(const Interest&, const Data& data)> HitCallback;
diff --git a/tests/daemon/fw/forwarder.t.cpp b/tests/daemon/fw/forwarder.t.cpp
index 8337491..906e2ca 100644
--- a/tests/daemon/fw/forwarder.t.cpp
+++ b/tests/daemon/fw/forwarder.t.cpp
@@ -108,7 +108,7 @@
   BOOST_CHECK_EQUAL(pit.size(), 0);
 
   Cs& cs = forwarder.getCs();
-  BOOST_REQUIRE(cs.insert(*dataA));
+  cs.insert(*dataA);
 
   face1->receiveInterest(*interestA);
   limitedIo.run(LimitedIo::UNLIMITED_OPS, time::milliseconds(5));
diff --git a/tests/daemon/table/cs.t.cpp b/tests/daemon/table/cs.t.cpp
index 63caa44..a4c5d74 100644
--- a/tests/daemon/table/cs.t.cpp
+++ b/tests/daemon/table/cs.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California,
+ * Copyright (c) 2014-2016,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -36,7 +36,8 @@
 
 using namespace nfd::tests;
 
-BOOST_FIXTURE_TEST_SUITE(TableCs, BaseFixture)
+BOOST_AUTO_TEST_SUITE(Table)
+BOOST_FIXTURE_TEST_SUITE(TestCs, BaseFixture)
 
 class FindFixture : protected BaseFixture
 {
@@ -313,7 +314,28 @@
   CHECK_CS_FIND(1);
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+/// \todo test MustBeFresh
+
+BOOST_AUTO_TEST_SUITE_END() // Find
+
+// When the capacity limit is set to zero, Data cannot be inserted;
+// this test case covers this situation.
+// The behavior of non-zero capacity limit depends on the eviction policy,
+// and is tested in policy test suites.
+BOOST_FIXTURE_TEST_CASE(ZeroCapacity, FindFixture)
+{
+  m_cs.setLimit(0);
+
+  BOOST_CHECK_EQUAL(m_cs.getLimit(), 0);
+  BOOST_CHECK_EQUAL(m_cs.size(), 0);
+  BOOST_CHECK(m_cs.begin() == m_cs.end());
+
+  insert(1, "ndn:/A");
+  BOOST_CHECK_EQUAL(m_cs.size(), 0);
+
+  startInterest("ndn:/A");
+  CHECK_CS_FIND(0);
+}
 
 BOOST_AUTO_TEST_CASE(CachePolicyNoCache)
 {
@@ -321,12 +343,11 @@
 
   shared_ptr<Data> dataA = makeData("ndn:/A");
   dataA->wireEncode();
-
   dataA->setTag(make_shared<lp::CachePolicyTag>(
                 lp::CachePolicy().setPolicy(lp::CachePolicyType::NO_CACHE)));
+  cs.insert(*dataA);
 
-  BOOST_CHECK_EQUAL(cs.insert(*dataA), false);
-
+  BOOST_CHECK_EQUAL(cs.size(), 0);
   cs.find(Interest("ndn:/A"),
           bind([] { BOOST_CHECK(false); }),
           bind([] { BOOST_CHECK(true); }));
@@ -368,7 +389,8 @@
   BOOST_CHECK_EQUAL_COLLECTIONS(actual.begin(), actual.end(), expected.begin(), expected.end());
 }
 
-BOOST_AUTO_TEST_SUITE_END()
+BOOST_AUTO_TEST_SUITE_END() // TestCs
+BOOST_AUTO_TEST_SUITE_END() // Table
 
 } // namespace tests
 } // namespace cs
