diff --git a/daemon/mgmt/cs-manager.cpp b/daemon/mgmt/cs-manager.cpp
new file mode 100644
index 0000000..62c0b8f
--- /dev/null
+++ b/daemon/mgmt/cs-manager.cpp
@@ -0,0 +1,51 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon).
+ * See AUTHORS.md for complete list of NFD authors and contributors.
+ *
+ * NFD is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD 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
+ * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "cs-manager.hpp"
+#include <ndn-cxx/mgmt/nfd/cs-info.hpp>
+
+namespace nfd {
+
+CsManager::CsManager(Cs& cs, const ForwarderCounters& fwCnt,
+                     Dispatcher& dispatcher, CommandAuthenticator& authenticator)
+  : NfdManagerBase(dispatcher, authenticator, "cs")
+  , m_fwCnt(fwCnt)
+{
+  registerStatusDatasetHandler("info", bind(&CsManager::serveInfo, this, _1, _2, _3));
+}
+
+void
+CsManager::serveInfo(const Name& topPrefix, const Interest& interest,
+                     ndn::mgmt::StatusDatasetContext& context) const
+{
+  ndn::nfd::CsInfo info;
+  info.setNHits(m_fwCnt.nCsHits);
+  info.setNMisses(m_fwCnt.nCsMisses);
+
+  context.append(info.wireEncode());
+  context.end();
+}
+
+} // namespace nfd
diff --git a/daemon/mgmt/cs-manager.hpp b/daemon/mgmt/cs-manager.hpp
new file mode 100644
index 0000000..800502d
--- /dev/null
+++ b/daemon/mgmt/cs-manager.hpp
@@ -0,0 +1,57 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon).
+ * See AUTHORS.md for complete list of NFD authors and contributors.
+ *
+ * NFD is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD 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
+ * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NFD_DAEMON_MGMT_CS_MANAGER_HPP
+#define NFD_DAEMON_MGMT_CS_MANAGER_HPP
+
+#include "nfd-manager-base.hpp"
+#include "table/cs.hpp"
+#include "fw/forwarder-counters.hpp"
+
+namespace nfd {
+
+/** \brief implement the CS Management of NFD Management Protocol.
+ *  \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt
+ */
+class CsManager : public NfdManagerBase
+{
+public:
+  CsManager(Cs& cs, const ForwarderCounters& fwCnt,
+            Dispatcher& dispatcher, CommandAuthenticator& authenticator);
+
+private:
+  /** \brief serve CS information dataset
+   */
+  void
+  serveInfo(const Name& topPrefix, const Interest& interest,
+            ndn::mgmt::StatusDatasetContext& context) const;
+
+private:
+  const ForwarderCounters& m_fwCnt;
+};
+
+} // namespace nfd
+
+#endif // NFD_DAEMON_MGMT_CS_MANAGER_HPP
diff --git a/daemon/nfd.cpp b/daemon/nfd.cpp
index 8a917a9..e3bcb75 100644
--- a/daemon/nfd.cpp
+++ b/daemon/nfd.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017,  Regents of the University of California,
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -25,19 +25,20 @@
 
 #include "nfd.hpp"
 
+#include "core/config-file.hpp"
 #include "core/global-io.hpp"
 #include "core/logger-factory.hpp"
 #include "core/privilege-helper.hpp"
-#include "core/config-file.hpp"
-#include "fw/forwarder.hpp"
 #include "face/face-system.hpp"
-#include "face/null-face.hpp"
 #include "face/internal-face.hpp"
-#include "mgmt/fib-manager.hpp"
+#include "face/null-face.hpp"
+#include "fw/forwarder.hpp"
+#include "mgmt/cs-manager.hpp"
 #include "mgmt/face-manager.hpp"
-#include "mgmt/strategy-choice-manager.hpp"
+#include "mgmt/fib-manager.hpp"
 #include "mgmt/forwarder-status-manager.hpp"
 #include "mgmt/general-config-section.hpp"
+#include "mgmt/strategy-choice-manager.hpp"
 #include "mgmt/tables-config-section.hpp"
 
 namespace nfd {
@@ -140,6 +141,8 @@
   m_faceManager.reset(new FaceManager(*m_faceSystem, *m_dispatcher, *m_authenticator));
   m_fibManager.reset(new FibManager(m_forwarder->getFib(), m_forwarder->getFaceTable(),
                                     *m_dispatcher, *m_authenticator));
+  m_csManager.reset(new CsManager(m_forwarder->getCs(), m_forwarder->getCounters(),
+                                  *m_dispatcher, *m_authenticator));
   m_strategyChoiceManager.reset(new StrategyChoiceManager(m_forwarder->getStrategyChoice(),
                                                           *m_dispatcher, *m_authenticator));
 
diff --git a/daemon/nfd.hpp b/daemon/nfd.hpp
index ff7b1c4..f9f43c4 100644
--- a/daemon/nfd.hpp
+++ b/daemon/nfd.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2014-2017,  Regents of the University of California,
+ * Copyright (c) 2014-2018,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
  *                           University Pierre & Marie Curie, Sorbonne University,
@@ -43,10 +43,13 @@
 
 class Forwarder;
 class CommandAuthenticator;
-class FibManager;
-class FaceManager;
-class StrategyChoiceManager;
+
+// forward-declare management modules, in the order as defined in management protocol
 class ForwarderStatusManager;
+class FaceManager;
+class FibManager;
+class CsManager;
+class StrategyChoiceManager;
 
 namespace face {
 class Face;
@@ -120,6 +123,7 @@
   unique_ptr<ForwarderStatusManager> m_forwarderStatusManager;
   unique_ptr<FaceManager> m_faceManager;
   unique_ptr<FibManager> m_fibManager;
+  unique_ptr<CsManager> m_csManager;
   unique_ptr<StrategyChoiceManager> m_strategyChoiceManager;
 
   shared_ptr<ndn::net::NetworkMonitor> m_netmon;
diff --git a/tests/daemon/mgmt/cs-manager.t.cpp b/tests/daemon/mgmt/cs-manager.t.cpp
new file mode 100644
index 0000000..a6bbb89
--- /dev/null
+++ b/tests/daemon/mgmt/cs-manager.t.cpp
@@ -0,0 +1,73 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014-2018,  Regents of the University of California,
+ *                           Arizona Board of Regents,
+ *                           Colorado State University,
+ *                           University Pierre & Marie Curie, Sorbonne University,
+ *                           Washington University in St. Louis,
+ *                           Beijing Institute of Technology,
+ *                           The University of Memphis.
+ *
+ * This file is part of NFD (Named Data Networking Forwarding Daemon).
+ * See AUTHORS.md for complete list of NFD authors and contributors.
+ *
+ * NFD is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NFD 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
+ * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "mgmt/cs-manager.hpp"
+#include "nfd-manager-common-fixture.hpp"
+#include <ndn-cxx/mgmt/nfd/cs-info.hpp>
+
+namespace nfd {
+namespace tests {
+
+class CsManagerFixture : public NfdManagerCommonFixture
+{
+public:
+  CsManagerFixture()
+    : m_cs(m_forwarder.getCs())
+    , m_fwCnt(const_cast<ForwarderCounters&>(m_forwarder.getCounters()))
+    , m_manager(m_cs, m_fwCnt, m_dispatcher, *m_authenticator)
+  {
+    setTopPrefix();
+    // setPrivilege("cs"); not needed until there's a control command
+  }
+
+protected:
+  Cs& m_cs;
+  ForwarderCounters& m_fwCnt;
+  CsManager m_manager;
+};
+
+BOOST_AUTO_TEST_SUITE(Mgmt)
+BOOST_FIXTURE_TEST_SUITE(TestCsManager, CsManagerFixture)
+
+BOOST_AUTO_TEST_CASE(Info)
+{
+  m_fwCnt.nCsHits.set(362);
+  m_fwCnt.nCsMisses.set(1493);
+
+  receiveInterest(Interest("/localhost/nfd/cs/info"));
+  Block dataset = concatenateResponses();
+  dataset.parse();
+  BOOST_REQUIRE_EQUAL(dataset.elements_size(), 1);
+
+  ndn::nfd::CsInfo info(*dataset.elements_begin());
+  BOOST_CHECK_EQUAL(info.getNHits(), 362);
+  BOOST_CHECK_EQUAL(info.getNMisses(), 1493);
+}
+
+BOOST_AUTO_TEST_SUITE_END() // TestCsManager
+BOOST_AUTO_TEST_SUITE_END() // Mgmt
+
+} // namespace tests
+} // namespace nfd
