diff --git a/tools/nfdc/available-commands.cpp b/tools/nfdc/available-commands.cpp
index 272c13d..fca0745 100644
--- a/tools/nfdc/available-commands.cpp
+++ b/tools/nfdc/available-commands.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,7 +25,6 @@
 
 #include "available-commands.hpp"
 #include "face-module.hpp"
-#include "help.hpp"
 #include "rib-module.hpp"
 #include "status.hpp"
 #include "strategy-choice-module.hpp"
@@ -37,7 +36,6 @@
 void
 registerCommands(CommandParser& parser)
 {
-  registerHelpCommand(parser);
   registerStatusCommands(parser);
   FaceModule::registerCommands(parser);
   RibModule::registerCommands(parser);
diff --git a/tools/nfdc/command-parser.cpp b/tools/nfdc/command-parser.cpp
index 74ecf36..59c4912 100644
--- a/tools/nfdc/command-parser.cpp
+++ b/tools/nfdc/command-parser.cpp
@@ -108,7 +108,7 @@
 }
 
 std::tuple<std::string, std::string, CommandArguments, ExecuteCommand>
-CommandParser::parse(std::vector<std::string> tokens, ParseMode mode) const
+CommandParser::parse(const std::vector<std::string>& tokens, ParseMode mode) const
 {
   BOOST_ASSERT(mode == ParseMode::ONE_SHOT);
 
@@ -130,20 +130,6 @@
       i = m_commands.find({noun, ""});
     }
     nameLen = std::min<size_t>(1, tokens.size());
-
-    if (i == m_commands.end()) {
-      const auto helpStrings = {"help", "--help", "-h"};
-      auto helpIt = std::find_first_of(tokens.begin(), tokens.end(),
-                                       helpStrings.begin(), helpStrings.end());
-      if (helpIt != tokens.end()) {
-        NDN_LOG_TRACE("fallback to noun=help verb=");
-        i = m_commands.find({"help", ""});
-        if (i != m_commands.end()) {
-          tokens.erase(helpIt);
-          nameLen = 0;
-        }
-      }
-    }
   }
 
   if (i == m_commands.end() || (i->second->modes & static_cast<AvailableIn>(mode)) == 0) {
diff --git a/tools/nfdc/command-parser.hpp b/tools/nfdc/command-parser.hpp
index 5ff5217..a872fcd 100644
--- a/tools/nfdc/command-parser.hpp
+++ b/tools/nfdc/command-parser.hpp
@@ -103,7 +103,7 @@
    *  \return noun, verb, arguments, execute function
    */
   std::tuple<std::string, std::string, CommandArguments, ExecuteCommand>
-  parse(std::vector<std::string> tokens, ParseMode mode) const;
+  parse(const std::vector<std::string>& tokens, ParseMode mode) const;
 
 private:
   typedef std::pair<std::string, std::string> CommandName;
diff --git a/tools/nfdc/help.cpp b/tools/nfdc/help.cpp
index e67992c..88ebff2 100644
--- a/tools/nfdc/help.cpp
+++ b/tools/nfdc/help.cpp
@@ -28,6 +28,8 @@
 
 #include <ndn-cxx/util/logger.hpp>
 
+#include <cerrno>
+#include <cstring>
 #include <unistd.h>
 
 namespace nfd {
@@ -71,35 +73,31 @@
   std::string manpage = "nfdc-" + noun;
 
   ::execlp("man", "man", manpage.data(), nullptr);
-  NDN_LOG_FATAL("Error opening man page for " << manpage);
+  NDN_LOG_FATAL("Error opening man page for " << manpage << ": " << std::strerror(errno));
 }
 
-void
-help(ExecuteContext& ctx, const CommandParser& parser)
+int
+help(std::ostream& os, const CommandParser& parser, std::vector<std::string> args)
 {
-  auto noun = ctx.args.get<std::string>("noun", "");
-  auto verb = ctx.args.get<std::string>("verb", "");
+  const auto helpOpts = {"help", "--help", "-h"};
+  auto it = std::find_first_of(args.begin(), args.end(), helpOpts.begin(), helpOpts.end());
+  if (it == args.end())
+    return 2;
+
+  args.erase(it);
+  auto noun = args.size() > 0 ? args[0] : "";
+  auto verb = args.size() > 1 ? args[1] : "";
 
   if (noun.empty()) {
-    helpList(ctx.out, parser);
+    helpList(os, parser);
+    return 0;
   }
   else {
     helpCommand(noun, verb); // should not return
-    ctx.exitCode = 1;
+    return 1;
   }
 }
 
-void
-registerHelpCommand(CommandParser& parser)
-{
-  CommandDefinition defHelp("help", "");
-  defHelp
-    .setTitle("display help information")
-    .addArg("noun", ArgValueType::STRING, Required::NO, Positional::YES)
-    .addArg("verb", ArgValueType::STRING, Required::NO, Positional::YES);
-  parser.addCommand(defHelp, bind(&help, _1, cref(parser)));
-}
-
 } // namespace nfdc
 } // namespace tools
 } // namespace nfd
diff --git a/tools/nfdc/help.hpp b/tools/nfdc/help.hpp
index 07fce90..ccad718 100644
--- a/tools/nfdc/help.hpp
+++ b/tools/nfdc/help.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,
@@ -32,19 +32,29 @@
 namespace tools {
 namespace nfdc {
 
+/** \brief writes the list of available commands to a stream
+ *  \param os the output stream to write the list to
+ *  \param parser instance of CommandParser containing the commands to list
+ *  \param mode only the commands available in this mode are listed
+ *  \param noun if not empty, only the commands starting with this noun are listed
+ */
 void
 helpList(std::ostream& os, const CommandParser& parser,
          ParseMode mode = ParseMode::ONE_SHOT, const std::string& noun = "");
 
-/** \brief the 'help' command
+/** \brief tries to help the user, if requested on the command line
+ *
+ *  Depending on the provided command line arguments \p args, this function can either
+ *  open the man page for a specific command, or list all commands available in \p parser.
+ *  In the former case, this function never returns if successful.
+ *
+ *  \retval 0 a list of available commands was successfully written to \p os
+ *  \retval 1 help was requested, but an error was encountered while exec'ing the `man` binary
+ *  \retval 2 help was not provided because \p args did not contain any help-related options
  */
-void
-help(ExecuteContext& ctx, const CommandParser& parser);
-
-/** \brief registers 'help' command
- */
-void
-registerHelpCommand(CommandParser& parser);
+int
+help(std::ostream& os, const CommandParser& parser,
+     std::vector<std::string> args);
 
 } // namespace nfdc
 } // namespace tools
diff --git a/tools/nfdc/main.cpp b/tools/nfdc/main.cpp
index a164a8e..5a7ce13 100644
--- a/tools/nfdc/main.cpp
+++ b/tools/nfdc/main.cpp
@@ -41,7 +41,7 @@
   CommandParser parser;
   registerCommands(parser);
 
-  if (args.empty() || args[0] == "-h" || args[0] == "--help") {
+  if (args.empty()) {
     helpList(std::cout, parser);
     return 0;
   }
@@ -55,11 +55,13 @@
   CommandArguments ca;
   ExecuteCommand execute;
   try {
-    std::tie(noun, verb, ca, execute) = parser.parse(std::move(args), ParseMode::ONE_SHOT);
+    std::tie(noun, verb, ca, execute) = parser.parse(args, ParseMode::ONE_SHOT);
   }
   catch (const std::invalid_argument& e) {
-    std::cerr << e.what() << std::endl;
-    return 2;
+    int ret = help(std::cout, parser, std::move(args));
+    if (ret == 2)
+      std::cerr << e.what() << std::endl;
+    return ret;
   }
 
   try {
diff --git a/tools/nfdc/status.cpp b/tools/nfdc/status.cpp
index 495a21e..5365fbb 100644
--- a/tools/nfdc/status.cpp
+++ b/tools/nfdc/status.cpp
@@ -121,7 +121,7 @@
 {
   CommandDefinition defStatusReport("status", "report");
   defStatusReport
-    .setTitle("print NFD status report")
+    .setTitle("print full status report")
     .addArg("format", ArgValueType::REPORT_FORMAT, Required::NO, Positional::YES);
   parser.addCommand(defStatusReport, &reportStatusComprehensive);
 
