diff --git a/daemon/fw/ncc-strategy.hpp b/daemon/fw/ncc-strategy.hpp
index 72f39e4..14a4696 100644
--- a/daemon/fw/ncc-strategy.hpp
+++ b/daemon/fw/ncc-strategy.hpp
@@ -56,6 +56,12 @@
   class MeasurementsEntryInfo : public StrategyInfo
   {
   public:
+    static constexpr int
+    getTypeId()
+    {
+      return 1000;
+    }
+
     MeasurementsEntryInfo();
 
     void
@@ -93,6 +99,12 @@
   class PitEntryInfo : public StrategyInfo
   {
   public:
+    static constexpr int
+    getTypeId()
+    {
+      return 1001;
+    }
+
     virtual
     ~PitEntryInfo();
 
diff --git a/daemon/fw/strategy-info.hpp b/daemon/fw/strategy-info.hpp
index d670f10..b701fc5 100644
--- a/daemon/fw/strategy-info.hpp
+++ b/daemon/fw/strategy-info.hpp
@@ -1,11 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014  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
+ * Copyright (c) 2014,  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.
@@ -20,7 +21,7 @@
  *
  * 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/>.
- **/
+ */
 
 #ifndef NFD_DAEMON_FW_STRATEGY_INFO_HPP
 #define NFD_DAEMON_FW_STRATEGY_INFO_HPP
@@ -30,12 +31,21 @@
 namespace nfd {
 namespace fw {
 
-/** \class StrategyInfo
- *  \brief contains arbitrary information forwarding strategy places on table entries
+/** \brief contains arbitrary information forwarding strategy places on table entries
  */
 class StrategyInfo
 {
 public:
+  /** \fn static constexpr int getTypeId()
+   *  \return an integer that uniquely identifies this StrategyInfo type
+   *  \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyInfoType
+   */
+  // static constexpr int
+  // getTypeId()
+  // {
+  //   return <type-identifier>;
+  // }
+
   virtual
   ~StrategyInfo();
 };
diff --git a/daemon/table/strategy-info-host.cpp b/daemon/table/strategy-info-host.cpp
index 9c46f1e..4961c68 100644
--- a/daemon/table/strategy-info-host.cpp
+++ b/daemon/table/strategy-info-host.cpp
@@ -1,11 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014  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
+ * Copyright (c) 2014,  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.
@@ -20,7 +21,7 @@
  *
  * 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 "strategy-info-host.hpp"
 
@@ -29,7 +30,7 @@
 void
 StrategyInfoHost::clearStrategyInfo()
 {
-  m_strategyInfo.reset();
+  m_items.clear();
 }
 
 } // namespace nfd
diff --git a/daemon/table/strategy-info-host.hpp b/daemon/table/strategy-info-host.hpp
index c7aa7da..1f6d940 100644
--- a/daemon/table/strategy-info-host.hpp
+++ b/daemon/table/strategy-info-host.hpp
@@ -1,11 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014  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
+ * Copyright (c) 2014,  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.
@@ -20,7 +21,7 @@
  *
  * 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/>.
- **/
+ */
 
 #ifndef NFD_DAEMON_TABLE_STRATEGY_INFO_HOST_HPP
 #define NFD_DAEMON_TABLE_STRATEGY_INFO_HOST_HPP
@@ -29,72 +30,88 @@
 
 namespace nfd {
 
-/** \class StrategyInfoHost
- *  \brief base class for an entity onto which StrategyInfo may be placed
+/** \brief base class for an entity onto which StrategyInfo objects may be placed
  */
 class StrategyInfoHost
 {
 public:
-  template<typename T>
-  void
-  setStrategyInfo(shared_ptr<T> strategyInfo);
-
+  /** \brief get a StrategyInfo item
+   *  \tparam T type of StrategyInfo, must be a subclass of from nfd::fw::StrategyInfo
+   *  \retval nullptr if no StrategyInfo of type T is stored
+   */
   template<typename T>
   shared_ptr<T>
   getStrategyInfo() const;
 
+  /** \brief set a StrategyInfo item
+   *  \tparam T type of StrategyInfo, must be a subclass of from nfd::fw::StrategyInfo
+   */
   template<typename T>
-  shared_ptr<T>
-  getOrCreateStrategyInfo();
+  void
+  setStrategyInfo(shared_ptr<T> strategyInfo);
 
-  template<typename T, typename T1>
+  /** \brief get or create a StrategyInfo item
+   *  \tparam T type of StrategyInfo, must be a subclass of from nfd::fw::StrategyInfo
+   *
+   *  If no StrategyInfo of type T is stored, it's created with \p{args};
+   *  otherwise, the existing item is returned.
+   */
+  template<typename T, typename ...A>
   shared_ptr<T>
-  getOrCreateStrategyInfo(T1& a1);
+  getOrCreateStrategyInfo(A&&... args);
 
+  /** \brief clear all StrategyInfo items
+   */
   void
   clearStrategyInfo();
 
 private:
-  shared_ptr<fw::StrategyInfo> m_strategyInfo;
+  std::map<int, shared_ptr<fw::StrategyInfo>> m_items;
 };
 
 
 template<typename T>
-void
-StrategyInfoHost::setStrategyInfo(shared_ptr<T> strategyInfo)
-{
-  m_strategyInfo = strategyInfo;
-}
-
-template<typename T>
 shared_ptr<T>
 StrategyInfoHost::getStrategyInfo() const
 {
-  return static_pointer_cast<T, fw::StrategyInfo>(m_strategyInfo);
+  static_assert(std::is_base_of<fw::StrategyInfo, T>::value,
+                "T must inherit from StrategyInfo");
+
+  auto it = m_items.find(T::getTypeId());
+  if (it == m_items.end()) {
+    return nullptr;
+  }
+  return static_pointer_cast<T, fw::StrategyInfo>(it->second);
 }
 
 template<typename T>
-shared_ptr<T>
-StrategyInfoHost::getOrCreateStrategyInfo()
+void
+StrategyInfoHost::setStrategyInfo(shared_ptr<T> item)
 {
-  shared_ptr<T> info = this->getStrategyInfo<T>();
-  if (!static_cast<bool>(info)) {
-    info = make_shared<T>();
-    this->setStrategyInfo(info);
+  static_assert(std::is_base_of<fw::StrategyInfo, T>::value,
+                "T must inherit from StrategyInfo");
+
+  if (item == nullptr) {
+    m_items.erase(T::getTypeId());
   }
-  return info;
+  else {
+    m_items[T::getTypeId()] = item;
+  }
 }
 
-template<typename T, typename T1>
+template<typename T, typename ...A>
 shared_ptr<T>
-StrategyInfoHost::getOrCreateStrategyInfo(T1& a1)
+StrategyInfoHost::getOrCreateStrategyInfo(A&&... args)
 {
-  shared_ptr<T> info = this->getStrategyInfo<T>();
-  if (!static_cast<bool>(info)) {
-    info = make_shared<T>(ref(a1));
-    this->setStrategyInfo(info);
+  static_assert(std::is_base_of<fw::StrategyInfo, T>::value,
+                "T must inherit from StrategyInfo");
+
+  shared_ptr<T> item = this->getStrategyInfo<T>();
+  if (!static_cast<bool>(item)) {
+    item = make_shared<T>(std::forward<A>(args)...);
+    this->setStrategyInfo(item);
   }
-  return info;
+  return item;
 }
 
 } // namespace nfd
diff --git a/tests/daemon/table/strategy-choice.cpp b/tests/daemon/table/strategy-choice.cpp
index 7817d51..494c76b 100644
--- a/tests/daemon/table/strategy-choice.cpp
+++ b/tests/daemon/table/strategy-choice.cpp
@@ -164,6 +164,12 @@
 
 class PStrategyInfo : public fw::StrategyInfo
 {
+public:
+  static constexpr int
+  getTypeId()
+  {
+    return 10;
+  }
 };
 
 BOOST_AUTO_TEST_CASE(ClearStrategyInfo)
diff --git a/tests/daemon/table/strategy-info-host.cpp b/tests/daemon/table/strategy-info-host.cpp
index 82d4fcc..5c0c14f 100644
--- a/tests/daemon/table/strategy-info-host.cpp
+++ b/tests/daemon/table/strategy-info-host.cpp
@@ -1,11 +1,12 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014  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
+ * Copyright (c) 2014,  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.
@@ -20,7 +21,7 @@
  *
  * 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 "table/strategy-info-host.hpp"
 
@@ -29,18 +30,27 @@
 namespace nfd {
 namespace tests {
 
+using fw::StrategyInfo;
+
 static int g_DummyStrategyInfo_count = 0;
 
-class DummyStrategyInfo : public fw::StrategyInfo
+class DummyStrategyInfo : public StrategyInfo
 {
 public:
+  static constexpr int
+  getTypeId()
+  {
+    return 1;
+  }
+
   DummyStrategyInfo(int id)
     : m_id(id)
   {
     ++g_DummyStrategyInfo_count;
   }
 
-  virtual ~DummyStrategyInfo()
+  virtual
+  ~DummyStrategyInfo()
   {
     --g_DummyStrategyInfo_count;
   }
@@ -48,31 +58,82 @@
   int m_id;
 };
 
+class DummyStrategyInfo2 : public StrategyInfo
+{
+public:
+  static constexpr int
+  getTypeId()
+  {
+    return 2;
+  }
+
+  DummyStrategyInfo2(int id)
+    : m_id(id)
+  {
+  }
+
+  int m_id;
+};
+
 BOOST_FIXTURE_TEST_SUITE(TableStrategyInfoHost, BaseFixture)
 
 BOOST_AUTO_TEST_CASE(SetGetClear)
 {
   StrategyInfoHost host;
 
-  BOOST_CHECK(!static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
 
   g_DummyStrategyInfo_count = 0;
 
   shared_ptr<DummyStrategyInfo> info = make_shared<DummyStrategyInfo>(7591);
   host.setStrategyInfo(info);
-  BOOST_REQUIRE(static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
   BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 7591);
 
   info.reset(); // unlink local reference
   // host should still have a reference to info
-  BOOST_REQUIRE(static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
   BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 7591);
 
   host.clearStrategyInfo();
-  BOOST_CHECK(!static_cast<bool>(host.getStrategyInfo<DummyStrategyInfo>()));
+  BOOST_CHECK(host.getStrategyInfo<DummyStrategyInfo>() == nullptr);
   BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 0);
 }
 
+BOOST_AUTO_TEST_CASE(Create)
+{
+  StrategyInfoHost host;
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(3503);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 3503);
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(1032);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 3503);
+
+  host.setStrategyInfo<DummyStrategyInfo>(nullptr);
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(9956);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 9956);
+}
+
+BOOST_AUTO_TEST_CASE(Types)
+{
+  StrategyInfoHost host;
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo>(8063);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 8063);
+
+  host.getOrCreateStrategyInfo<DummyStrategyInfo2>(2871);
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo2>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo2>()->m_id, 2871);
+
+  BOOST_REQUIRE(host.getStrategyInfo<DummyStrategyInfo>() != nullptr);
+  BOOST_CHECK_EQUAL(host.getStrategyInfo<DummyStrategyInfo>()->m_id, 8063);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
 } // namespace tests
