diff --git a/tools/ndn-autoconfigserver.cpp b/tools/ndn-autoconfig-server.cpp
similarity index 100%
rename from tools/ndn-autoconfigserver.cpp
rename to tools/ndn-autoconfig-server.cpp
diff --git a/tools/nfd-status.cpp b/tools/nfd-status.cpp
new file mode 100644
index 0000000..2c27c9a
--- /dev/null
+++ b/tools/nfd-status.cpp
@@ -0,0 +1,319 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+/**
+ * Copyright (C) 2014 University of Arizona.
+ *
+ * Author: Jerald Paul Abraham <jeraldabraham@email.arizona.edu>
+ */
+
+#include <ndn-cpp-dev/face.hpp>
+#include <ndn-cpp-dev/name.hpp>
+#include <ndn-cpp-dev/interest.hpp>
+
+#include <ndn-cpp-dev/management/nfd-fib-entry.hpp>
+#include <ndn-cpp-dev/management/nfd-face-status.hpp>
+#include <ndn-cpp-dev/management/nfd-status.hpp>
+
+namespace ndn {
+
+class NfdStatus
+{
+public:
+  NfdStatus(char* toolName)
+    : m_toolName(toolName)
+    , m_needVersionRetrieval(false)
+    , m_needFaceStatusRetrieval(false)
+    , m_needFibEnumerationRetrieval(false)
+    , m_face()
+  {
+  }
+
+  void
+  usage()
+  {
+    std::cout << "\nUsage: " << m_toolName << " [options]\n"
+      "Shows NFD Status Information\n"
+      "Displays Version Information (NFD Version, Start Timestamp, Current Timestamp).\n"
+      "Face Status Information via NFD Face Status Protocol (FaceID, URI, Counters).\n"
+      "FIB Information via NFD FIB Enumeration Protocol (Prefix, Nexthop).\n"
+      "If no options are provided, all information is retrieved.\n"
+      "  [-v] - retrieve version information\n"
+      "  [-f] - retrieve face status information\n"
+      "  [-b] - retrieve FIB information\n"
+      "  [-h] - print help and exit\n\n";
+  }
+
+  void
+  enableVersionRetrieval()
+  {
+    m_needVersionRetrieval = true;
+  }
+
+  void
+  enableFaceStatusRetrieval()
+  {
+    m_needFaceStatusRetrieval = true;
+  }
+
+  void
+  enableFibEnumerationRetrieval()
+  {
+    m_needFibEnumerationRetrieval = true;
+  }
+
+  void
+  onTimeout()
+  {
+    std::cerr << "Request timed out" << std::endl;
+  }
+
+  void
+  fetchSegments(const Data& data, void (NfdStatus::*onDone)())
+  {
+    m_buffer->write((const char*)data.getContent().value(),
+                    data.getContent().value_size());
+
+    uint64_t currentSegment = data.getName().get(-1).toSegment();
+
+    const name::Component& finalBlockId = data.getMetaInfo().getFinalBlockId();
+    if (finalBlockId.empty() ||
+        finalBlockId.toSegment() > currentSegment)
+      {
+        m_face.expressInterest(data.getName().getPrefix(-1).appendSegment(currentSegment+1),
+                               bind(&NfdStatus::fetchSegments, this, _2, onDone),
+                               bind(&NfdStatus::onTimeout, this));
+      }
+    else
+      {
+        return (this->*onDone)();
+      }
+  }
+
+  void
+  afterFetchedVersionInformation(const Data& data)
+  {
+    std::cout << "General NFD status:" << std::endl;
+
+    nfd::Status status(data.getContent());
+    std::cout << "               version="
+              << status.getNfdVersion() << std::endl;
+    std::cout << "             startTime="
+              << time::toIsoString(status.getStartTimestamp()) << std::endl;
+    std::cout << "           currentTime="
+              << time::toIsoString(status.getCurrentTimestamp()) << std::endl;
+    std::cout << "                uptime="
+              << time::duration_cast<time::seconds>(status.getCurrentTimestamp()
+                                                    - status.getStartTimestamp()) << std::endl;
+
+    std::cout << "      nNameTreeEntries=" << status.getNNameTreeEntries()     << std::endl;
+    std::cout << "           nFibEntries=" << status.getNFibEntries()          << std::endl;
+    std::cout << "           nPitEntries=" << status.getNPitEntries()          << std::endl;
+    std::cout << "  nMeasurementsEntries=" << status.getNMeasurementsEntries() << std::endl;
+    std::cout << "            nCsEntries=" << status.getNCsEntries()           << std::endl;
+    std::cout << "          nInInterests=" << status.getNInInterests()         << std::endl;
+    std::cout << "         nOutInterests=" << status.getNOutInterests()        << std::endl;
+    std::cout << "              nInDatas=" << status.getNInDatas()             << std::endl;
+    std::cout << "             nOutDatas=" << status.getNOutDatas()            << std::endl;
+
+    if (m_needFaceStatusRetrieval)
+      {
+        fetchFaceStatusInformation();
+      }
+    else if (m_needFibEnumerationRetrieval)
+      {
+        fetchFibEnumerationInformation();
+      }
+  }
+
+  void
+  fetchVersionInformation()
+  {
+    Interest interest("/localhost/nfd/status");
+    interest.setChildSelector(1);
+    interest.setMustBeFresh(true);
+    m_face.expressInterest(
+                           interest,
+                           bind(&NfdStatus::afterFetchedVersionInformation, this, _2),
+                           bind(&NfdStatus::onTimeout, this));
+  }
+
+  void
+  afterFetchedFaceStatusInformation()
+  {
+    try
+      {
+        std::cout << "Faces:" << std::endl;
+
+        ConstBufferPtr buf = m_buffer->buf();
+
+        size_t offset = 0;
+        while (offset < buf->size())
+          {
+            Block block(buf, buf->begin() + offset, buf->end(), false);
+            offset += block.size();
+
+            nfd::FaceStatus faceStatus(block);
+
+            std::cout << "  faceid=" << faceStatus.getFaceId()
+                      << " uri=" << faceStatus.getUri()
+                      << " counters={"
+                      << "in={" << faceStatus.getInInterest() << "i "
+                                << faceStatus.getInData() << "d}"
+                      << " out={" << faceStatus.getOutInterest() << "i "
+                                 << faceStatus.getOutData() << "d}"
+                      << "}" << std::endl;
+          }
+
+      }
+    catch(Tlv::Error& e)
+      {
+        std::cerr << e.what() << std::endl;
+      }
+
+    if (m_needFibEnumerationRetrieval)
+      {
+        fetchFibEnumerationInformation();
+      }
+  }
+
+  void
+  fetchFaceStatusInformation()
+  {
+    m_buffer = make_shared<OBufferStream>();
+
+    Interest interest("/localhost/nfd/faces/list");
+    interest.setChildSelector(1);
+    interest.setMustBeFresh(true);
+
+    m_face.expressInterest(interest,
+                           bind(&NfdStatus::fetchSegments, this, _2,
+                                &NfdStatus::afterFetchedFaceStatusInformation),
+                           bind(&NfdStatus::onTimeout, this));
+  }
+
+  void
+  afterFetchedFibEnumerationInformation()
+  {
+    try
+      {
+        std::cout << "FIB:" << std::endl;
+
+        ConstBufferPtr buf = m_buffer->buf();
+
+        size_t offset = 0;
+        while (offset < buf->size())
+          {
+            Block block(buf, buf->begin() + offset, buf->end(), false);
+            offset += block.size();
+
+            nfd::FibEntry fibEntry(block);
+
+            std::cout << "  " << fibEntry.getPrefix() << " nexthops={";
+            for (std::list<nfd::NextHopRecord>::const_iterator
+                   nextHop = fibEntry.getNextHopRecords().begin();
+                 nextHop != fibEntry.getNextHopRecords().end();
+                 ++nextHop)
+              {
+                if (nextHop != fibEntry.getNextHopRecords().begin())
+                  std::cout << ", ";
+                std::cout << "faceid=" << nextHop->getFaceId()
+                          << " (cost=" << nextHop->getCost() << ")";
+              }
+            std::cout << "}" << std::endl;
+          }
+      }
+    catch(Tlv::Error& e)
+      {
+        std::cerr << e.what() << std::endl;
+      }
+  }
+
+  void
+  fetchFibEnumerationInformation()
+  {
+    m_buffer = make_shared<OBufferStream>();
+
+    Interest interest("/localhost/nfd/fib/list");
+    interest.setChildSelector(1);
+    interest.setMustBeFresh(true);
+    m_face.expressInterest(interest,
+                           bind(&NfdStatus::fetchSegments, this, _2,
+                                &NfdStatus::afterFetchedFibEnumerationInformation),
+                           bind(&NfdStatus::onTimeout, this));
+  }
+
+  void
+  fetchInformation()
+  {
+    if (!m_needVersionRetrieval &&
+        !m_needFaceStatusRetrieval &&
+        !m_needFibEnumerationRetrieval)
+      {
+        enableVersionRetrieval();
+        enableFaceStatusRetrieval();
+        enableFibEnumerationRetrieval();
+      }
+
+    if (m_needVersionRetrieval)
+      {
+        fetchVersionInformation();
+      }
+    else if (m_needFaceStatusRetrieval)
+      {
+        fetchFaceStatusInformation();
+      }
+    else if (m_needFibEnumerationRetrieval)
+      {
+        fetchFibEnumerationInformation();
+      }
+
+    m_face.processEvents();
+  }
+
+private:
+  std::string m_toolName;
+  bool m_needVersionRetrieval;
+  bool m_needFaceStatusRetrieval;
+  bool m_needFibEnumerationRetrieval;
+  Face m_face;
+
+  shared_ptr<OBufferStream> m_buffer;
+};
+
+}
+
+int main( int argc, char* argv[] )
+{
+  int option;
+  ndn::NfdStatus nfdStatus (argv[0]);
+
+  while ((option = getopt(argc, argv, "hvfb")) != -1) {
+    switch (option) {
+    case 'h':
+      nfdStatus.usage();
+      break;
+    case 'v':
+      nfdStatus.enableVersionRetrieval();
+      break;
+    case 'f':
+      nfdStatus.enableFaceStatusRetrieval();
+      break;
+    case 'b':
+      nfdStatus.enableFibEnumerationRetrieval();
+      break;
+    default :
+      nfdStatus.usage();
+      return 1;
+      break;
+    }
+  }
+
+  try {
+    nfdStatus.fetchInformation();
+  }
+  catch(std::exception& e) {
+    std::cerr << "ERROR: " << e.what() << std::endl;
+    return 2;
+  }
+
+  return 0;
+}
