diff --git a/model/ndn-l3-protocol.cpp b/model/ndn-l3-protocol.cpp
index ad9c0d7..3cbda38 100644
--- a/model/ndn-l3-protocol.cpp
+++ b/model/ndn-l3-protocol.cpp
@@ -214,7 +214,7 @@
 void
 L3Protocol::initializeManagement()
 {
-  auto keyChain = std::ref(StackHelper::getKeyChain());
+  auto& keyChain = StackHelper::getKeyChain();
   auto& forwarder = m_impl->m_forwarder;
   using namespace nfd;
 
diff --git a/model/ndn-l3-protocol.hpp b/model/ndn-l3-protocol.hpp
index 9b63255..ea0052b 100644
--- a/model/ndn-l3-protocol.hpp
+++ b/model/ndn-l3-protocol.hpp
@@ -116,7 +116,6 @@
   shared_ptr<nfd::StrategyChoiceManager>
   getStrategyChoiceManager();
 
-
   /**
    * \brief Add face to NDN stack
    *
diff --git a/ndn-cxx b/ndn-cxx
index 55d61d2..36ec104 160000
--- a/ndn-cxx
+++ b/ndn-cxx
@@ -1 +1 @@
-Subproject commit 55d61d2b42eebd056237e8d27d40c788a27c7d44
+Subproject commit 36ec104e23ba5395a8b4df411b776cdbef9c5cd4
diff --git a/tests/unit-tests/ndn-cxx/face.t.cpp b/tests/unit-tests/ndn-cxx/face.t.cpp
new file mode 100644
index 0000000..d50f8a9
--- /dev/null
+++ b/tests/unit-tests/ndn-cxx/face.t.cpp
@@ -0,0 +1,298 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2015  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM 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.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#include <ndn-cxx/face.hpp>
+#include <ndn-cxx/util/scheduler.hpp>
+#include <ndn-cxx/util/scheduler-scoped-event-id.hpp>
+
+#include "ns3/ndnSIM/helper/ndn-app-helper.hpp"
+
+#include "../tests-common.hpp"
+
+namespace ns3 {
+namespace ndn {
+
+class NndCxxFaceFixture : public ScenarioHelperWithCleanupFixture
+{
+public:
+  NndCxxFaceFixture()
+    : hasFired(false)
+  {
+    Config::SetDefault("ns3::PointToPointNetDevice::DataRate", StringValue("10Mbps"));
+    Config::SetDefault("ns3::PointToPointChannel::Delay", StringValue("10ms"));
+    Config::SetDefault("ns3::DropTailQueue::MaxPackets", StringValue("20"));
+
+    createTopology({{"A", "B"}});
+    addRoutes({{"A", "B", "/test", 1}});
+  }
+
+protected:
+  bool hasFired;
+};
+
+BOOST_FIXTURE_TEST_SUITE(NdnCxxFace, NndCxxFaceFixture)
+
+class BaseTesterApp
+{
+public:
+  typedef std::function<void(const Name&)> NameCallback;
+  typedef std::function<void()> VoidCallback;
+
+protected:
+  ::ndn::Face m_face;
+};
+
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+
+class BasicProducer : public BaseTesterApp
+{
+public:
+  BasicProducer(const Name& name, const NameCallback& onInterest, const VoidCallback& onFail)
+  {
+    m_face.setInterestFilter(name,
+                             [this, onInterest] (const ::ndn::InterestFilter& filter, const Interest& interest) {
+                               auto data = make_shared<Data>(Name(interest.getName()));
+                               StackHelper::getKeyChain().sign(*data);
+                               m_face.put(*data);
+                               onInterest(interest.getName());
+                             },
+                             std::bind(onFail));
+  }
+};
+
+BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(SetInterestFilter, 2);
+BOOST_AUTO_TEST_CASE(SetInterestFilter)
+{
+  FactoryCallbackApp::Install(getNode("B"), [this] () -> shared_ptr<void> {
+      return make_shared<BasicProducer>("/test", [this] (const Name& interest) {
+          BOOST_CHECK_EQUAL(interest, "/test/prefix/%FE%00");
+          this->hasFired = true;
+        },
+        [] {
+          BOOST_ERROR("Unexpected failure to set interest filter");
+        });
+    })
+    .Start(Seconds(0.01));
+
+  addApps({{"A", "ns3::ndn::ConsumerBatches",
+            {{"Prefix", "/test/prefix"}, {"Batches", "0s 1"}}, "1s", "5.1s"}});
+
+  Simulator::Stop(Seconds(20));
+  Simulator::Run();
+
+  BOOST_CHECK(hasFired);
+}
+
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+
+class SingleInterest : public BaseTesterApp
+{
+public:
+  SingleInterest(const Name& name, const NameCallback& onData, const VoidCallback& onTimeout)
+  {
+    m_face.expressInterest(name, std::bind([onData] (const Data& data) {
+          onData(data.getName());
+        }, _2),
+      std::bind(onTimeout));
+  }
+};
+
+
+
+BOOST_AUTO_TEST_CASE(ExpressInterestLocalhost)
+{
+  // Retrieve data from remote
+  FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
+      return make_shared<SingleInterest>("/localhost", [this] (const Name& data) {
+          BOOST_CHECK(Name("/localhost").isPrefixOf(data));
+          this->hasFired = true;
+          BOOST_CHECK_LE(Simulator::Now().ToDouble(Time::S), 1.01);
+        },
+        [] {
+          BOOST_ERROR("Unexpected timeout");
+        });
+    })
+    .Start(Seconds(1.01));
+
+  Simulator::Stop(Seconds(20));
+  Simulator::Run();
+
+  BOOST_CHECK(hasFired);
+}
+
+BOOST_AUTO_TEST_CASE(ExpressInterestRemote)
+{
+  addApps({{"B", "ns3::ndn::Producer", {{"Prefix", "/test"}}, "0s", "100s"}});
+
+  // Retrieve data from remote
+  FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
+      return make_shared<SingleInterest>("/test/prefix", [this] (const Name& data) {
+          BOOST_CHECK_EQUAL(data, "/test/prefix");
+          this->hasFired = true;
+          BOOST_CHECK_LE(Simulator::Now().ToDouble(Time::S), 2.0);
+        },
+        [] {
+          BOOST_ERROR("Unexpected timeout");
+        });
+    })
+    .Start(Seconds(1.01));
+
+  Simulator::Stop(Seconds(20));
+  Simulator::Run();
+
+  BOOST_CHECK(hasFired);
+}
+
+BOOST_AUTO_TEST_CASE(ExpressInterestTimeout)
+{
+  FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
+      return make_shared<SingleInterest>("/test/prefix", [] (const Name&) {
+          BOOST_ERROR("Unexpected data");
+        },
+        [this] {
+          BOOST_CHECK_GT(Simulator::Now().ToDouble(Time::S), 6.0);
+          this->hasFired = true;
+        });
+    })
+    .Start(Seconds(2.01));
+
+  Simulator::Stop(Seconds(20));
+  Simulator::Run();
+
+  BOOST_CHECK(hasFired);
+}
+
+// Expected failure until issue #3121 is resolved
+BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES(ExpressInterestWithRib, 2);
+BOOST_AUTO_TEST_CASE(ExpressInterestWithRib)
+{
+  addApps({{"A", "ns3::ndn::Producer", {{"Prefix", "/"}}, "0s", "100s"}});
+
+  // Retrieve data from remote
+  FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
+      return make_shared<SingleInterest>("/test/prefix", [this] (const Name& data) {
+          BOOST_CHECK_EQUAL(data, "/test/prefix");
+          this->hasFired = true;
+          BOOST_CHECK_LE(Simulator::Now().ToDouble(Time::S), 2.0);
+        },
+        [] {
+          BOOST_ERROR("Unexpected timeout");
+        });
+    })
+    .Start(Seconds(1.01));
+
+  Simulator::Stop(Seconds(20));
+  Simulator::Run();
+
+  BOOST_CHECK(hasFired);
+}
+
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+
+class MultipleInterest : public BaseTesterApp
+{
+public:
+  MultipleInterest(const Name& name, const NameCallback& onData, const VoidCallback& onTimeout)
+    : m_scheduler(m_face.getIoService())
+    , m_event(m_scheduler)
+  {
+    expressNextInterest(name, 0, onData, onTimeout);
+  }
+
+private:
+  void
+  expressNextInterest(const Name& name, uint32_t seqNo, const NameCallback& onData, const VoidCallback& onTimeout)
+  {
+    m_face.expressInterest(Name(name).appendSegment(seqNo), std::bind([=] (const Data& data) {
+          onData(data.getName());
+
+          m_event = m_scheduler.scheduleEvent(time::seconds(1),
+                                              std::bind(&MultipleInterest::expressNextInterest, this,
+                                                        name, seqNo + 1, onData, onTimeout));
+        }, _2),
+      std::bind(onTimeout));
+  }
+
+private:
+  ::ndn::Scheduler m_scheduler;
+  ::ndn::util::scheduler::ScopedEventId m_event;
+};
+
+BOOST_AUTO_TEST_CASE(ExpressMultipleInterests)
+{
+  addApps({{"B", "ns3::ndn::Producer", {{"Prefix", "/test"}}, "0s", "100s"}});
+
+  size_t recvCount = 0;
+
+  // Retrieve data from remote
+  FactoryCallbackApp::Install(getNode("A"), [this, &recvCount] () -> shared_ptr<void> {
+      return make_shared<MultipleInterest>("/test/prefix", [this, &recvCount] (const Name& data) {
+          BOOST_CHECK_EQUAL(data, Name("/test/prefix").appendSegment(recvCount));
+          ++recvCount;
+        },
+        [] {
+          BOOST_ERROR("Unexpected timeout");
+        });
+    })
+    .Start(Seconds(1.01));
+
+  Simulator::Stop(Seconds(10.9)); // this test case also checks that apps stops properly
+  Simulator::Run();
+
+  BOOST_CHECK_EQUAL(recvCount, 10);
+}
+
+class SingleInterestWithFaceShutdown : public BaseTesterApp
+{
+public:
+  SingleInterestWithFaceShutdown()
+  {
+    m_face.expressInterest(Name("/interest/to/timeout"),
+                           std::bind([] {
+                               BOOST_ERROR("Unexpected response");
+                             }),
+                           std::bind([this] {
+                               m_face.shutdown();
+                             }));
+  }
+};
+
+BOOST_AUTO_TEST_CASE(FaceShutdownFromTimeoutCallback)
+{
+  // This test case to check if Face.shutdown from an onTimeout callback doesn't cause segfaults
+
+  FactoryCallbackApp::Install(getNode("A"), [this] () -> shared_ptr<void> {
+      return make_shared<SingleInterestWithFaceShutdown>();
+    })
+    .Start(Seconds(1.01));
+
+  Simulator::Stop(Seconds(20));
+  Simulator::Run();
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace ndn
+} // namespace ns3
