diff --git a/daemon/common.hpp b/daemon/common.hpp
index 3d1a53a..18a33c9 100644
--- a/daemon/common.hpp
+++ b/daemon/common.hpp
@@ -24,6 +24,9 @@
 #include <vector>
 #include <list>
 #include <set>
+#include <sstream>
+#include <istream>
+#include <fstream>
 
 #include "core/logger.hpp"
 
diff --git a/daemon/mgmt/config-file.cpp b/daemon/mgmt/config-file.cpp
new file mode 100644
index 0000000..a55650e
--- /dev/null
+++ b/daemon/mgmt/config-file.cpp
@@ -0,0 +1,116 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (C) 2014 Named Data Networking Project
+ * See COPYING for copyright and distribution information.
+ */
+
+
+#include "config-file.hpp"
+
+#include <boost/property_tree/info_parser.hpp>
+
+namespace nfd {
+
+NFD_LOG_INIT("ConfigFile");
+
+ConfigFile::ConfigFile()
+{
+
+}
+
+void
+ConfigFile::addSectionHandler(const std::string& sectionName,
+                              OnConfig subscriber)
+{
+  m_subscriptions[sectionName] = subscriber;
+}
+
+void
+ConfigFile::parse(const char* filename, bool isDryRun)
+{
+  std::ifstream inputFile;
+  inputFile.open(filename);
+  if (!inputFile.is_open())
+    {
+      std::string msg = "Failed to read configuration file: ";
+      msg += filename;
+      throw Error(filename);
+    }
+  parse(inputFile, isDryRun, filename);
+  inputFile.close();
+}
+
+void
+ConfigFile::parse(const std::string& input, bool isDryRun, const char* filename)
+{
+  std::istringstream inputStream(input);
+  parse(inputStream, isDryRun, filename);
+}
+
+
+void
+ConfigFile::parse(std::istream& input, bool isDryRun, const char* filename)
+{
+  try
+    {
+      boost::property_tree::read_info(input, m_global);
+    }
+  catch (const boost::property_tree::info_parser_error& error)
+    {
+      std::stringstream msg;
+      msg << "Failed to parse configuration file";
+      if (filename != 0)
+        {
+          msg << " " << filename;
+        }
+      msg << " " << error.message() << " line " << error.line();
+      throw Error(msg.str());
+    }
+
+  process(isDryRun, filename);
+}
+
+void
+ConfigFile::process(bool isDryRun, const char* filename)
+{
+  // NFD_LOG_DEBUG("processing..." << ((isDryRun)?("dry run"):("")));
+
+  if (m_global.begin() == m_global.end())
+    {
+      std::string msg = "Error processing configuration file";
+      if (filename != 0)
+        {
+          msg += ": ";
+          msg += filename;
+        }
+      msg += " no data";
+      throw Error(msg);
+    }
+
+  for (ConfigSection::const_iterator i = m_global.begin(); i != m_global.end(); ++i)
+    {
+      const std::string& sectionName = i->first;
+      const ConfigSection& section = i->second;
+
+      SubscriptionTable::iterator subscriberIt = m_subscriptions.find(sectionName);
+      if (subscriberIt != m_subscriptions.end())
+        {
+          OnConfig subscriber = subscriberIt->second;
+          subscriber(section, isDryRun);
+        }
+      else
+        {
+          std::string msg = "Error processing configuration file";
+          if (filename != 0)
+            {
+              msg += " ";
+              msg += filename;
+            }
+          msg += " no module subscribed for section: " + sectionName;
+          throw Error(msg);
+        }
+    }
+}
+
+}
+
diff --git a/daemon/mgmt/config-file.hpp b/daemon/mgmt/config-file.hpp
new file mode 100644
index 0000000..2b72e7f
--- /dev/null
+++ b/daemon/mgmt/config-file.hpp
@@ -0,0 +1,89 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (C) 2014 Named Data Networking Project
+ * See COPYING for copyright and distribution information.
+ */
+
+#ifndef NFD_MGMT_CONFIG_FILE_HPP
+#define NFD_MGMT_CONFIG_FILE_HPP
+
+#include "common.hpp"
+
+#include <boost/property_tree/ptree.hpp>
+
+namespace nfd {
+
+typedef boost::property_tree::ptree ConfigSection;
+
+/// \brief callback for config file sections
+typedef function<void(const ConfigSection&, bool)> OnConfig;
+
+class ConfigFile
+{
+public:
+
+  class Error : public std::runtime_error
+  {
+  public:
+    Error(const std::string& what)
+      : std::runtime_error(what)
+    {
+
+    }
+  };
+
+  ConfigFile();
+
+  /// \brief setup notification of configuration file sections
+  void
+  addSectionHandler(const std::string& sectionName,
+                    OnConfig subscriber);
+
+
+  /**
+   * \param filename file to parse
+   * \param isDryRun true if performing a dry run of configuration, false otherwise
+   * \throws ConfigFile::Error if file not found
+   * \throws ConfigFile::Error if parse error
+   */
+  void
+  parse(const char* filename, bool isDryRun=false);
+
+  /**
+   * \param input configuration (as a string) to parse
+   * \param isDryRun true if performing a dry run of configuration, false otherwise
+   * \param filename optional convenience argument to provide more detailed error messages (if available)
+   * \throws ConfigFile::Error if file not found
+   * \throws ConfigFile::Error if parse error
+   */
+  void
+  parse(const std::string& input, bool isDryRun=false, const char* filename=0);
+
+  /**
+   * \param input stream to parse
+   * \param isDryRun true if performing a dry run of configuration, false otherwise
+   * \param filename optional convenience argument to provide more detailed error messages (if available)
+   * \throws ConfigFile::Error if parse error
+   */
+  void
+  parse(std::istream& input, bool isDryRun=false, const char* filename=0);
+
+private:
+
+  void
+  process(bool isDryRun, const char* filename);
+
+private:
+
+  typedef std::map<std::string, OnConfig> SubscriptionTable;
+
+  SubscriptionTable m_subscriptions;
+
+  ConfigSection m_global;
+};
+
+} // namespace nfd
+
+
+#endif // NFD_MGMT_CONFIG_FILE_HPP
+
