diff --git a/daemon/mgmt/fib-manager.cpp b/daemon/mgmt/fib-manager.cpp
index 569a3be..5885e48 100644
--- a/daemon/mgmt/fib-manager.cpp
+++ b/daemon/mgmt/fib-manager.cpp
@@ -11,58 +11,63 @@
 #include "mgmt/internal-face.hpp"
 #include "mgmt/app-face.hpp"
 
+
+
+#include <ndn-cpp-dev/management/fib-management-options.hpp>
+#include <ndn-cpp-dev/encoding/tlv.hpp>
+
 #include <ndn-cpp-dev/management/fib-management-options.hpp>
 
 namespace nfd {
 
 NFD_LOG_INIT("FibManager");
 
-const Name FibManager::FIB_MANAGER_REQUEST_PREFIX = "/localhost/nfd/fib";
+const Name FibManager::FIB_MANAGER_COMMAND_PREFIX = "/localhost/nfd/fib";
 
-// In the future this should be 3 (Signature TLV, Signature Info TLV, Timestamp)
-const size_t FibManager::FIB_MANAGER_REQUEST_SIGNED_INTEREST_NCOMPS = 0;
-
-const size_t FibManager::FIB_MANAGER_REQUEST_COMMAND_MIN_NCOMPS =
-  FibManager::FIB_MANAGER_REQUEST_PREFIX.size() +
+const size_t FibManager::FIB_MANAGER_COMMAND_UNSIGNED_NCOMPS =
+  FibManager::FIB_MANAGER_COMMAND_PREFIX.size() +
   1 + // verb
-  1 + // verb options
-  FibManager::FIB_MANAGER_REQUEST_SIGNED_INTEREST_NCOMPS;
+  1;  // verb options
 
-const Name::Component FibManager::FIB_MANAGER_REQUEST_VERB_INSERT = "insert";
-const Name::Component FibManager::FIB_MANAGER_REQUEST_VERB_DELETE = "delete";
-const Name::Component FibManager::FIB_MANAGER_REQUEST_VERB_ADD_NEXTHOP = "add-nexthop";
-const Name::Component FibManager::FIB_MANAGER_REQUEST_VERB_REMOVE_NEXTHOP = "remove-nexthop";
-const Name::Component FibManager::FIB_MANAGER_REQUEST_VERB_STRATEGY = "strategy";
+const size_t FibManager::FIB_MANAGER_COMMAND_SIGNED_NCOMPS =
+  FibManager::FIB_MANAGER_COMMAND_UNSIGNED_NCOMPS +
+  0; // No signed Interest support in mock, otherwise 3 (timestamp, signed info tlv, signature tlv)
+
+const Name::Component FibManager::FIB_MANAGER_COMMAND_VERB_INSERT = "insert";
+const Name::Component FibManager::FIB_MANAGER_COMMAND_VERB_DELETE = "delete";
+const Name::Component FibManager::FIB_MANAGER_COMMAND_VERB_ADD_NEXTHOP = "add-nexthop";
+const Name::Component FibManager::FIB_MANAGER_COMMAND_VERB_REMOVE_NEXTHOP = "remove-nexthop";
+const Name::Component FibManager::FIB_MANAGER_COMMAND_VERB_STRATEGY = "strategy";
 
 
-const FibManager::VerbAndProcessor FibManager::FIB_MANAGER_REQUEST_VERBS[] =
+const FibManager::VerbAndProcessor FibManager::FIB_MANAGER_COMMAND_VERBS[] =
   {
     // Unsupported
 
     // VerbAndProcessor(
-    //                  FibManager::FIB_MANAGER_REQUEST_VERB_INSERT,
+    //                  FibManager::FIB_MANAGER_COMMAND_VERB_INSERT,
     //                  &FibManager::fibInsert
     //                  ),
 
     // VerbAndProcessor(
-    //                  FibManager::FIB_MANAGER_REQUEST_VERB_DELETE,
+    //                  FibManager::FIB_MANAGER_COMMAND_VERB_DELETE,
     //                  &FibManager::fibDelete
     //                  ),
 
     VerbAndProcessor(
-                     FibManager::FIB_MANAGER_REQUEST_VERB_ADD_NEXTHOP,
+                     FibManager::FIB_MANAGER_COMMAND_VERB_ADD_NEXTHOP,
                      &FibManager::fibAddNextHop
                      ),
 
     // Unsupported
 
     // VerbAndProcessor(
-    //                  FibManager::FIB_MANAGER_REQUEST_VERB_REMOVE_NEXTHOP,
+    //                  FibManager::FIB_MANAGER_COMMAND_VERB_REMOVE_NEXTHOP,
     //                  &FibManager::fibRemoveNextHop
     //                  ),
 
     // VerbAndProcessor(
-    //                  FibManager::FIB_MANAGER_REQUEST_VERB_STRATEGY,
+    //                  FibManager::FIB_MANAGER_COMMAND_VERB_STRATEGY,
     //                  &FibManager::fibStrategy
     //                  )
 
@@ -74,41 +79,51 @@
   : ManagerBase(face),
     m_managedFib(fib),
     m_getFace(getFace),
-    m_verbDispatch(FIB_MANAGER_REQUEST_VERBS,
-                   FIB_MANAGER_REQUEST_VERBS +
-                   (sizeof(FIB_MANAGER_REQUEST_VERBS) / sizeof(VerbAndProcessor)))
+    m_verbDispatch(FIB_MANAGER_COMMAND_VERBS,
+                   FIB_MANAGER_COMMAND_VERBS +
+                   (sizeof(FIB_MANAGER_COMMAND_VERBS) / sizeof(VerbAndProcessor)))
 {
-
+  face->setInterestFilter("/localhost/nfd/fib",
+                          bind(&FibManager::onFibRequest, this, _2));
 }
 
 void
 FibManager::onFibRequest(const Interest& request)
 {
-  const Name& requestCommand = request.getName();
+  const Name& command = request.getName();
+  const size_t commandNComps = command.size();
 
   /// \todo Separate out response status codes 400 and 401
 
-  if (requestCommand.size() < FIB_MANAGER_REQUEST_COMMAND_MIN_NCOMPS ||
-      !FIB_MANAGER_REQUEST_PREFIX.isPrefixOf(requestCommand))
+  if (FIB_MANAGER_COMMAND_UNSIGNED_NCOMPS <= commandNComps &&
+      commandNComps < FIB_MANAGER_COMMAND_SIGNED_NCOMPS)
     {
-      NFD_LOG_INFO("Malformed command: " << requestCommand);
-      sendResponse(request.getName(), 404, "MALFORMED");
+      NFD_LOG_INFO("Unsigned command: " << command);
+      sendResponse(command, 401, "SIGREQ");
+
+      return;
+    }
+  else if (commandNComps < FIB_MANAGER_COMMAND_SIGNED_NCOMPS ||
+      !FIB_MANAGER_COMMAND_PREFIX.isPrefixOf(command))
+    {
+      NFD_LOG_INFO("Malformed command: " << command);
+      sendResponse(command, 400, "MALFORMED");
       return;
     }
 
-  const Name::Component& requestVerb = requestCommand.get(FIB_MANAGER_REQUEST_PREFIX.size());
 
-  VerbDispatchTable::const_iterator verbProcessor = m_verbDispatch.find (requestVerb);
-  if (verbProcessor == m_verbDispatch.end())
+  const Name::Component& verb = command.get(FIB_MANAGER_COMMAND_PREFIX.size());
+
+  VerbDispatchTable::const_iterator verbProcessor = m_verbDispatch.find (verb);
+  if (verbProcessor != m_verbDispatch.end())
     {
-      NFD_LOG_INFO("Unsupported command verb: " << requestVerb);
-      sendResponse(request.getName(), 404, "UNSUPPORTED");
-
+      NFD_LOG_INFO("Processing command verb: " << verb);
+      (verbProcessor->second)(this, request);
     }
   else
     {
-      NFD_LOG_INFO("Processing command verb: " << requestVerb);
-      (verbProcessor->second)(this, request);
+      NFD_LOG_INFO("Unsupported command verb: " << verb);
+      sendResponse(request.getName(), 404, "UNSUPPORTED");
     }
 
 }
@@ -128,23 +143,32 @@
 void
 FibManager::fibAddNextHop(const Interest& request)
 {
+  const Name& command = request.getName();
   ndn::FibManagementOptions options;
   const size_t optionCompIndex =
-    FIB_MANAGER_REQUEST_PREFIX.size() + 1;
+    FIB_MANAGER_COMMAND_PREFIX.size() + 1;
 
   const ndn::Buffer& optionBuffer =
     request.getName()[optionCompIndex].getValue();
-  shared_ptr<const ndn::Buffer> tmpOptionBuffer(new ndn::Buffer(optionBuffer));
-  Block rawOptions(tmpOptionBuffer);
+  shared_ptr<const ndn::Buffer> tmpOptionBuffer(make_shared<ndn::Buffer>(optionBuffer));
 
-  options.wireDecode(rawOptions);
+  try
+    {
+      Block rawOptions(tmpOptionBuffer);
+      options.wireDecode(rawOptions);
+    }
+  catch (const ndn::Tlv::Error& e)
+    {
+      NFD_LOG_INFO("Bad command option parse: " << command);
+      sendResponse(request.getName(), 400, "MALFORMED");
+      return;
+    }
 
   /// \todo authorize command
   if (false)
     {
-      NFD_LOG_INFO("Unauthorized command attempt");
-
-      sendResponse(request.getName(), 403, "");
+      NFD_LOG_INFO("Unauthorized command attempt: " << command);
+      sendResponse(request.getName(), 403, "UNAUTHORIZED");
       return;
     }
 
@@ -153,7 +177,7 @@
                << " Cost: " << options.getCost());
 
   shared_ptr<Face> nextHopFace = m_getFace(options.getFaceId());
-  if (nextHopFace)
+  if (nextHopFace != 0)
     {
       std::pair<shared_ptr<fib::Entry>, bool> insertResult = m_managedFib.insert(options.getName());
       insertResult.first->addNextHop(nextHopFace, options.getCost());
@@ -161,7 +185,8 @@
     }
   else
     {
-      sendResponse(request.getName(), 400, "INCORRECT");
+      NFD_LOG_INFO("Unknown FaceId: " << command);
+      sendResponse(request.getName(), 400, "MALFORMED");
     }
 }
 
