diff --git a/model/cs/ndn-content-store.hpp b/model/cs/ndn-content-store.hpp
index e007b32..f1e0ef7 100644
--- a/model/cs/ndn-content-store.hpp
+++ b/model/cs/ndn-content-store.hpp
@@ -28,7 +28,7 @@
 #include "ns3/ptr.h"
 #include "ns3/traced-callback.h"
 
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 
 namespace ns3 {
 
diff --git a/utils/trie/payload-with-policy.hpp b/utils/trie/payload-with-policy.hpp
index 4010511..5d2fe47 100644
--- a/utils/trie/payload-with-policy.hpp
+++ b/utils/trie/payload-with-policy.hpp
@@ -57,7 +57,7 @@
   // {
   //   iterator foundItem, lastItem;
   //   bool reachLast;
-  //   boost::tie (foundItem, reachLast, lastItem) = trie_.find (key);
+  //   std::tie (foundItem, reachLast, lastItem) = trie_.find (key);
 
   //   if (!reachLast || lastItem->payload () == PayloadTraits::empty_payload)
   //     return; // nothing to invalidate
diff --git a/utils/trie/trie-with-policy.hpp b/utils/trie/trie-with-policy.hpp
index 790dd0f..d6b00b3 100644
--- a/utils/trie/trie-with-policy.hpp
+++ b/utils/trie/trie-with-policy.hpp
@@ -71,7 +71,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
     if (!reachLast || lastItem->payload() == PayloadTraits::empty_payload)
       return; // nothing to invalidate
@@ -118,7 +118,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
     if (!reachLast || lastItem->payload() == PayloadTraits::empty_payload)
       return end();
@@ -134,7 +134,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
     if (foundItem != trie_.end()) {
       policy_.lookup(s_iterator_to(foundItem));
     }
@@ -150,7 +150,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find_if(key, pred);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find_if(key, pred);
     if (foundItem != trie_.end()) {
       policy_.lookup(s_iterator_to(foundItem));
     }
@@ -175,7 +175,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
     // guard in case we don't have anything in the trie
     if (lastItem == trie_.end())
@@ -202,7 +202,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
     // guard in case we don't have anything in the trie
     if (lastItem == trie_.end())
@@ -233,7 +233,7 @@
   {
     iterator foundItem, lastItem;
     bool reachLast;
-    boost::tie(foundItem, reachLast, lastItem) = trie_.find(key);
+    std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
     // guard in case we don't have anything in the trie
     if (lastItem == trie_.end())
diff --git a/utils/trie/trie.hpp b/utils/trie/trie.hpp
index 04ed980..dd10e6d 100644
--- a/utils/trie/trie.hpp
+++ b/utils/trie/trie.hpp
@@ -30,7 +30,7 @@
 #include <boost/intrusive/set.hpp>
 #include <boost/functional/hash.hpp>
 #include <boost/interprocess/smart_ptr/unique_ptr.hpp>
-#include <boost/tuple/tuple.hpp>
+#include <tuple>
 #include <boost/foreach.hpp>
 #include <boost/mpl/if.hpp>
 
@@ -274,7 +274,7 @@
     }
   }
 
-  // inline boost::tuple<const iterator, bool, const iterator>
+  // inline std::tuple<const iterator, bool, const iterator>
   // find (const FullKey &key) const
   // {
   //   return const_cast<trie*> (this)->find (key);
@@ -286,7 +286,7 @@
    *
    * @return ->second is true if prefix in ->first is longer than key
    */
-  inline boost::tuple<iterator, bool, iterator>
+  inline std::tuple<iterator, bool, iterator>
   find(const FullKey& key)
   {
     trie* trieNode = this;
@@ -307,7 +307,7 @@
       }
     }
 
-    return boost::make_tuple(foundNode, reachLast, trieNode);
+    return std::make_tuple(foundNode, reachLast, trieNode);
   }
 
   /**
@@ -317,7 +317,7 @@
    * @return ->second is true if prefix in ->first is longer than key
    */
   template<class Predicate>
-  inline boost::tuple<iterator, bool, iterator>
+  inline std::tuple<iterator, bool, iterator>
   find_if(const FullKey& key, Predicate pred)
   {
     trie* trieNode = this;
@@ -339,7 +339,7 @@
       }
     }
 
-    return boost::make_tuple(foundNode, reachLast, trieNode);
+    return std::make_tuple(foundNode, reachLast, trieNode);
   }
 
   /**
