diff --git a/daemon/mgmt/face-query-status-publisher.cpp b/daemon/mgmt/face-query-status-publisher.cpp
new file mode 100644
index 0000000..02fd4b6
--- /dev/null
+++ b/daemon/mgmt/face-query-status-publisher.cpp
@@ -0,0 +1,110 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014,  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 "face-query-status-publisher.hpp"
+#include "core/logger.hpp"
+
+#include <ndn-cxx/management/nfd-face-status.hpp>
+
+namespace nfd {
+
+NFD_LOG_INIT("FaceQueryStatusPublisher");
+
+
+FaceQueryStatusPublisher::FaceQueryStatusPublisher(const FaceTable& faceTable,
+                                                   AppFace& face,
+                                                   const Name& prefix,
+                                                   const ndn::nfd::FaceQueryFilter& filter,
+                                                   ndn::KeyChain& keyChain)
+  : SegmentPublisher(face, prefix, keyChain)
+  , m_faceTable(faceTable)
+  , m_faceFilter(filter)
+{
+}
+
+FaceQueryStatusPublisher::~FaceQueryStatusPublisher()
+{
+}
+
+bool
+FaceQueryStatusPublisher::doesMatchFilter(const shared_ptr<Face>& face)
+{
+  if (m_faceFilter.hasFaceId() &&
+      m_faceFilter.getFaceId() != static_cast<uint64_t>(face->getId())) {
+    return false;
+  }
+
+  if (m_faceFilter.hasUriScheme() &&
+      (m_faceFilter.getUriScheme() != face->getRemoteUri().getScheme() ||
+       m_faceFilter.getUriScheme() != face->getLocalUri().getScheme())) {
+    return false;
+  }
+
+  if (m_faceFilter.hasRemoteUri() &&
+      m_faceFilter.getRemoteUri() != face->getRemoteUri().toString()) {
+    return false;
+  }
+
+  if (m_faceFilter.hasLocalUri() && m_faceFilter.getLocalUri() != face->getLocalUri().toString()) {
+    return false;
+  }
+
+  if (m_faceFilter.hasFaceScope() &&
+      (m_faceFilter.getFaceScope() == ndn::nfd::FACE_SCOPE_LOCAL) != face->isLocal()) {
+    return false;
+  }
+
+  if (m_faceFilter.hasFacePersistency() &&
+      (m_faceFilter.getFacePersistency() == ndn::nfd::FACE_PERSISTENCY_ON_DEMAND) !=
+      face->isOnDemand()) {
+    return false;
+  }
+
+  if (m_faceFilter.hasLinkType() &&
+      (m_faceFilter.getLinkType() == ndn::nfd::LINK_TYPE_MULTI_ACCESS) != face->isMultiAccess()) {
+    return false;
+  }
+
+  return true;
+}
+
+size_t
+FaceQueryStatusPublisher::generate(ndn::EncodingBuffer& outBuffer)
+{
+  size_t totalLength = 0;
+
+  for (FaceTable::const_reverse_iterator i = m_faceTable.rbegin();
+       i != m_faceTable.rend(); ++i) {
+    const shared_ptr<Face>& face = *i;
+
+    if (doesMatchFilter(face)) {
+      ndn::nfd::FaceStatus status = face->getFaceStatus();
+      totalLength += status.wireEncode(outBuffer);
+    }
+  }
+  return totalLength;
+}
+
+} // namespace nfd
