diff --git a/src/common.hpp b/src/common.hpp
index 6a45506..8212a7e 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -73,6 +73,7 @@
 #include <string>
 #include <type_traits>
 #include <unistd.h>
+#include <utility>
 
 #if defined(__GNUC__) || defined(__clang__)
 #  define DEPRECATED(func) func __attribute__ ((deprecated))
@@ -137,4 +138,6 @@
 using boost::noncopyable;
 }
 
+#include "util/backports.hpp"
+
 #endif // NDN_COMMON_HPP
diff --git a/src/security/key-chain.hpp b/src/security/key-chain.hpp
index c9ed28c..c5082d3 100644
--- a/src/security/key-chain.hpp
+++ b/src/security/key-chain.hpp
@@ -911,7 +911,7 @@
 KeyChain::registerPib(std::initializer_list<std::string> aliases)
 {
   registerPibImpl(*aliases.begin(), aliases, [] (const std::string& locator) {
-      return unique_ptr<SecPublicInfo>(new PibType(locator));
+      return make_unique<PibType>(locator);
     });
 }
 
@@ -920,7 +920,7 @@
 KeyChain::registerTpm(std::initializer_list<std::string> aliases)
 {
   registerTpmImpl(*aliases.begin(), aliases, [] (const std::string& locator) {
-      return unique_ptr<SecTpm>(new TpmType(locator));
+      return make_unique<TpmType>(locator);
     });
 }
 
diff --git a/src/util/backports.hpp b/src/util/backports.hpp
new file mode 100644
index 0000000..19b33c4
--- /dev/null
+++ b/src/util/backports.hpp
@@ -0,0 +1,48 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2015, 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 ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#ifndef NDN_UTIL_BACKPORTS_HPP
+#define NDN_UTIL_BACKPORTS_HPP
+
+#include "../common.hpp"
+
+namespace ndn {
+
+#if __cpp_lib_make_unique
+using std::make_unique;
+#else
+template<typename T, typename... Args>
+inline unique_ptr<T>
+make_unique(Args&&... args)
+{
+  return unique_ptr<T>(new T(std::forward<Args>(args)...));
+}
+#endif // __cpp_lib_make_unique
+
+} // namespace ndn
+
+#endif // NDN_UTIL_BACKPORTS_HPP
diff --git a/tests/unit-tests/util/backports.t.cpp b/tests/unit-tests/util/backports.t.cpp
new file mode 100644
index 0000000..550651a
--- /dev/null
+++ b/tests/unit-tests/util/backports.t.cpp
@@ -0,0 +1,79 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2013-2015 Regents of the University of California.
+ *
+ * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
+ *
+ * ndn-cxx library is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * ndn-cxx library 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 Lesser General Public License for more details.
+ *
+ * You should have received copies of the GNU General Public License and GNU Lesser
+ * General Public License along with ndn-cxx, e.g., in COPYING.md file.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
+ */
+
+#include "util/backports.hpp"
+
+#include "boost-test.hpp"
+
+namespace ndn {
+namespace tests {
+
+BOOST_AUTO_TEST_SUITE(Util)
+BOOST_AUTO_TEST_SUITE(TestBackports)
+
+BOOST_AUTO_TEST_CASE(MakeUnique)
+{
+  std::unique_ptr<int> v0 = make_unique<int>();
+  std::unique_ptr<int> v1 = make_unique<int>(1728);
+  BOOST_CHECK_EQUAL(*v0, 0);
+  BOOST_CHECK_EQUAL(*v1, 1728);
+
+  auto str = make_unique<std::string>("meow");
+  BOOST_CHECK_EQUAL(*str, "meow");
+
+  class Movable
+  {
+  public:
+    Movable()
+      : value(42)
+    {
+    }
+
+    Movable(const Movable&) = delete;
+    Movable(Movable&&) = default;
+
+  public:
+    int value;
+  };
+
+  class Container
+  {
+  public:
+    explicit
+    Container(Movable m)
+      : m(std::move(m))
+    {
+    }
+
+  public:
+    Movable m;
+  };
+
+  Movable m;
+  auto ptr = make_unique<Container>(std::move(m));
+  BOOST_CHECK_EQUAL(ptr->m.value, 42);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+BOOST_AUTO_TEST_SUITE_END()
+
+} // namespace tests
+} // namespace ndn
diff --git a/tests/unit-tests/util/signal.t.cpp b/tests/unit-tests/util/signal.t.cpp
index 153ad91..3b263b4 100644
--- a/tests/unit-tests/util/signal.t.cpp
+++ b/tests/unit-tests/util/signal.t.cpp
@@ -184,7 +184,7 @@
 
 BOOST_AUTO_TEST_CASE(ManualDisconnectDestructed)
 {
-  unique_ptr<SignalOwner0> so(new SignalOwner0());
+  auto so = make_unique<SignalOwner0>();
 
   int hit = 0;
   Connection connection = so->sig.connect([&hit] { ++hit; });
