diff --git a/tests/daemon/face/face-system-fixture.hpp b/tests/daemon/face/face-system-fixture.hpp
index 1d69179..b3ae91f 100644
--- a/tests/daemon/face/face-system-fixture.hpp
+++ b/tests/daemon/face/face-system-fixture.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,
@@ -47,6 +47,7 @@
   FaceSystemFixture()
     : netmon(make_shared<ndn::net::NetworkMonitorStub>(~0))
     , faceSystem(faceTable, netmon)
+    , netdevBound(*faceSystem.m_netdevBound)
   {
     faceSystem.setConfigFile(configFile);
   }
@@ -137,6 +138,7 @@
   FaceTable faceTable;
   shared_ptr<ndn::net::NetworkMonitorStub> netmon;
   FaceSystem faceSystem;
+  NetdevBound& netdevBound;
 };
 
 /** \brief FaceSystemFixture with a ProtocolFactory reference
@@ -154,6 +156,54 @@
   FactoryType& factory;
 };
 
+/** \brief A dummy ProtocolFactory for testing FaceSystem configuration parsing.
+ */
+class DummyProtocolFactory : public ProtocolFactory
+{
+public:
+  DummyProtocolFactory(const CtorParams& params)
+    : ProtocolFactory(params)
+  {
+  }
+
+  void
+  processConfig(OptionalConfigSection configSection,
+                FaceSystem::ConfigContext& context) final
+  {
+    processConfigHistory.push_back({configSection, context.isDryRun,
+                                    context.generalConfig.wantCongestionMarking});
+    if (!context.isDryRun) {
+      this->providedSchemes = this->newProvidedSchemes;
+    }
+  }
+
+  void
+  createFace(const CreateFaceRequest& req,
+             const FaceCreatedCallback& onCreated,
+             const FaceCreationFailedCallback& onFailure) final
+  {
+    BOOST_FAIL("createFace should not be called");
+  }
+
+  std::vector<shared_ptr<const Channel>>
+  getChannels() const final
+  {
+    BOOST_FAIL("getChannels should not be called");
+    return {};
+  }
+
+public:
+  struct ProcessConfigArgs
+  {
+    OptionalConfigSection configSection;
+    bool isDryRun;
+    bool wantCongestionMarking;
+  };
+  std::vector<ProcessConfigArgs> processConfigHistory;
+
+  std::set<std::string> newProvidedSchemes;
+};
+
 } // namespace tests
 } // namespace face
 } // namespace nfd
diff --git a/tests/daemon/face/face-system.t.cpp b/tests/daemon/face/face-system.t.cpp
index b22979a..a7be4c8 100644
--- a/tests/daemon/face/face-system.t.cpp
+++ b/tests/daemon/face/face-system.t.cpp
@@ -37,52 +37,6 @@
 
 BOOST_AUTO_TEST_SUITE(ProcessConfig)
 
-class DummyProtocolFactory : public ProtocolFactory
-{
-public:
-  DummyProtocolFactory(const CtorParams& params)
-    : ProtocolFactory(params)
-  {
-  }
-
-  void
-  processConfig(OptionalConfigSection configSection,
-                FaceSystem::ConfigContext& context) final
-  {
-    processConfigHistory.push_back({configSection, context.isDryRun,
-                                    context.generalConfig.wantCongestionMarking});
-    if (!context.isDryRun) {
-      this->providedSchemes = this->newProvidedSchemes;
-    }
-  }
-
-  void
-  createFace(const CreateFaceRequest& req,
-             const FaceCreatedCallback& onCreated,
-             const FaceCreationFailedCallback& onFailure) final
-  {
-    BOOST_FAIL("createFace should not be called");
-  }
-
-  std::vector<shared_ptr<const Channel>>
-  getChannels() const final
-  {
-    BOOST_FAIL("getChannels should not be called");
-    return {};
-  }
-
-public:
-  struct ProcessConfigArgs
-  {
-    OptionalConfigSection configSection;
-    bool isDryRun;
-    bool wantCongestionMarking;
-  };
-  std::vector<ProcessConfigArgs> processConfigHistory;
-
-  std::set<std::string> newProvidedSchemes;
-};
-
 BOOST_AUTO_TEST_CASE(Normal)
 {
   faceSystem.m_factories["f1"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
@@ -208,7 +162,7 @@
 BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
 
 BOOST_AUTO_TEST_SUITE_END() // TestFaceSystem
-BOOST_AUTO_TEST_SUITE_END() // Mgmt
+BOOST_AUTO_TEST_SUITE_END() // Face
 
 } // namespace tests
 } // namespace face
diff --git a/tests/daemon/face/netdev-bound.t.cpp b/tests/daemon/face/netdev-bound.t.cpp
new file mode 100644
index 0000000..9f71fc1
--- /dev/null
+++ b/tests/daemon/face/netdev-bound.t.cpp
@@ -0,0 +1,116 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014-2018,  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/netdev-bound.hpp"
+#include "face-system-fixture.hpp"
+
+#include "tests/test-common.hpp"
+
+namespace nfd {
+namespace face {
+namespace tests {
+
+BOOST_AUTO_TEST_SUITE(Face)
+BOOST_FIXTURE_TEST_SUITE(TestNetdevBound, FaceSystemFixture)
+
+BOOST_AUTO_TEST_SUITE(ProcessConfig)
+
+BOOST_AUTO_TEST_CASE(Normal)
+{
+  faceSystem.m_factories["pf"] = make_unique<DummyProtocolFactory>(faceSystem.makePFCtorParams());
+  auto pf = static_cast<DummyProtocolFactory*>(faceSystem.getFactoryById("pf"));
+  pf->newProvidedSchemes.insert("udp4+dev");
+
+  const std::string CONFIG = R"CONFIG(
+    face_system
+    {
+      pf
+      {
+      }
+      netdev_bound
+      {
+        rule
+        {
+          remote udp4://192.0.2.1:6363
+          remote udp4://192.0.2.2:6363
+          whitelist
+          {
+            *
+          }
+          blacklist
+          {
+            ifname wlan0
+          }
+        }
+        rule
+        {
+          remote udp4://192.0.2.3:6363
+          remote udp4://192.0.2.4:6363
+          whitelist
+          {
+            ifname eth0
+          }
+          blacklist
+          {
+          }
+        }
+        rule
+        {
+          remote udp4://192.0.2.5:6363
+        }
+      }
+    }
+  )CONFIG";
+
+  parseConfig(CONFIG, true);
+  parseConfig(CONFIG, false);
+}
+
+BOOST_AUTO_TEST_CASE(NonCanonicalRemote)
+{
+  const std::string CONFIG = R"CONFIG(
+    face_system
+    {
+      netdev_bound
+      {
+        rule
+        {
+          remote udp://192.0.2.1
+        }
+      }
+    }
+  )CONFIG";
+
+  BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
+
+BOOST_AUTO_TEST_SUITE_END() // TestNetdevBound
+BOOST_AUTO_TEST_SUITE_END() // Face
+
+} // namespace tests
+} // namespace face
+} // namespace nfd
