diff --git a/daemon/mgmt/face-manager.cpp b/daemon/mgmt/face-manager.cpp
index 5b7c08d..64d7af4 100644
--- a/daemon/mgmt/face-manager.cpp
+++ b/daemon/mgmt/face-manager.cpp
@@ -46,6 +46,7 @@
 #endif // HAVE_WEBSOCKET
 
 #include <ndn-cxx/management/nfd-face-event-notification.hpp>
+#include <ndn-cxx/management/nfd-face-query-filter.hpp>
 
 namespace nfd {
 
@@ -101,6 +102,11 @@
                              Name::Component("channels"),
                              &FaceManager::listChannels
                              ),
+
+    UnsignedVerbAndProcessor(
+                             Name::Component("query"),
+                             &FaceManager::listQueriedFaces
+                             ),
   };
 
 const Name FaceManager::FACES_LIST_DATASET_PREFIX("/localhost/nfd/faces/list");
@@ -111,6 +117,9 @@
 const Name FaceManager::CHANNELS_LIST_DATASET_PREFIX("/localhost/nfd/faces/channels");
 const size_t FaceManager::CHANNELS_LIST_DATASET_NCOMPS = CHANNELS_LIST_DATASET_PREFIX.size();
 
+const Name FaceManager::FACES_QUERY_DATASET_PREFIX("/localhost/nfd/faces/query");
+const size_t FaceManager::FACES_QUERY_DATASET_NCOMPS = FACES_QUERY_DATASET_PREFIX.size() + 1;
+
 FaceManager::FaceManager(FaceTable& faceTable,
                          shared_ptr<InternalFace> face,
                          ndn::KeyChain& keyChain)
@@ -1148,6 +1157,39 @@
   m_channelStatusPublisher.publish();
 }
 
+void
+FaceManager::listQueriedFaces(const Interest& request)
+{
+  NFD_LOG_DEBUG("in listQueriedFaces");
+  const Name& query = request.getName();
+  const size_t queryNComps = query.size();
+
+  if (queryNComps < FACES_QUERY_DATASET_NCOMPS ||
+      !FACES_QUERY_DATASET_PREFIX.isPrefixOf(query))
+    {
+      NFD_LOG_DEBUG("query result: malformed");
+      //sendNack(query);
+      return;
+    }
+
+  ndn::nfd::FaceQueryFilter faceFilter;
+  try
+    {
+      faceFilter.wireDecode(query[-1].blockFromValue());
+    }
+  catch (tlv::Error&)
+    {
+      NFD_LOG_DEBUG("query result: malformed filter");
+      //sendNack(query);
+      return;
+    }
+
+  FaceQueryStatusPublisher
+    faceQueryStatusPublisher(m_faceTable, *m_face, query, faceFilter, m_keyChain);
+
+  faceQueryStatusPublisher.publish();
+}
+
 shared_ptr<ProtocolFactory>
 FaceManager::findFactory(const std::string& protocol)
 {
diff --git a/daemon/mgmt/face-manager.hpp b/daemon/mgmt/face-manager.hpp
index 6a3994e..bb06f2b 100644
--- a/daemon/mgmt/face-manager.hpp
+++ b/daemon/mgmt/face-manager.hpp
@@ -32,6 +32,7 @@
 #include "mgmt/manager-base.hpp"
 #include "mgmt/face-status-publisher.hpp"
 #include "mgmt/channel-status-publisher.hpp"
+#include "mgmt/face-query-status-publisher.hpp"
 
 #include <ndn-cxx/management/nfd-control-parameters.hpp>
 #include <ndn-cxx/management/nfd-control-response.hpp>
@@ -82,6 +83,9 @@
   void
   listChannels(const Interest& request);
 
+  void
+  listQueriedFaces(const Interest& request);
+
   shared_ptr<ProtocolFactory>
   findFactory(const std::string& protocol);
 
@@ -211,6 +215,9 @@
   static const Name CHANNELS_LIST_DATASET_PREFIX;
   static const size_t CHANNELS_LIST_DATASET_NCOMPS;
 
+  static const Name FACES_QUERY_DATASET_PREFIX;
+  static const size_t FACES_QUERY_DATASET_NCOMPS;
+
   static const Name FACE_EVENTS_PREFIX;
 };
 
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
diff --git a/daemon/mgmt/face-query-status-publisher.hpp b/daemon/mgmt/face-query-status-publisher.hpp
new file mode 100644
index 0000000..237cecb
--- /dev/null
+++ b/daemon/mgmt/face-query-status-publisher.hpp
@@ -0,0 +1,64 @@
+/* -*- 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/>.
+ */
+
+#ifndef NFD_DAEMON_MGMT_QUERIED_FACE_STATUS_PUBLISHER_HPP
+#define NFD_DAEMON_MGMT_QUERIED_FACE_STATUS_PUBLISHER_HPP
+
+#include "core/segment-publisher.hpp"
+#include "mgmt/app-face.hpp"
+#include "fw/face-table.hpp"
+
+#include <ndn-cxx/management/nfd-face-query-filter.hpp>
+
+namespace nfd {
+
+class FaceQueryStatusPublisher : public SegmentPublisher<AppFace>
+{
+public:
+  FaceQueryStatusPublisher(const FaceTable& faceTable,
+                           AppFace& face,
+                           const Name& prefix,
+                           const ndn::nfd::FaceQueryFilter& filter,
+                           ndn::KeyChain& keyChain);
+
+  virtual
+  ~FaceQueryStatusPublisher();
+
+  bool
+  doesMatchFilter(const shared_ptr<Face>& face);
+
+protected:
+
+  virtual size_t
+  generate(ndn::EncodingBuffer& outBuffer);
+
+private:
+  const FaceTable& m_faceTable;
+  const ndn::nfd::FaceQueryFilter& m_faceFilter;
+};
+
+} // namespace nfd
+
+#endif // NFD_DAEMON_MGMT_QUERIED_FACE_STATUS_PUBLISHER_HPP
diff --git a/daemon/mgmt/manager-base.cpp b/daemon/mgmt/manager-base.cpp
index 04e2705..da553a5 100644
--- a/daemon/mgmt/manager-base.cpp
+++ b/daemon/mgmt/manager-base.cpp
@@ -99,6 +99,22 @@
   m_face->put(*responseData);
 }
 
+// for future commit
+//void
+//ManagerBase::sendNack(const Name& name)
+//{
+//  NFD_LOG_DEBUG("responding NACK to " << name);
+//
+//  ndn::MetaInfo meta;
+//  meta.setType(ndn::tlv::ContentType_Nack);
+//
+//  shared_ptr<Data> responseData(make_shared<Data>(name));
+//  responseData->setMetaInfo(meta);
+//
+//  m_keyChain.sign(*responseData);
+//  m_face->put(*responseData);
+//}
+
 bool
 ManagerBase::validateParameters(const ControlCommand& command,
                                 ControlParameters& parameters)
diff --git a/daemon/mgmt/manager-base.hpp b/daemon/mgmt/manager-base.hpp
index 15c19ee..feaa54a 100644
--- a/daemon/mgmt/manager-base.hpp
+++ b/daemon/mgmt/manager-base.hpp
@@ -94,6 +94,9 @@
                const std::string& text,
                const Block& body);
 
+  //void
+  //sendNack(const Name& name);
+
   virtual bool
   validateParameters(const ControlCommand& command,
                      ControlParameters& parameters);
