diff --git a/utils/topology/annotated-topology-reader.cpp b/utils/topology/annotated-topology-reader.cpp
index c62b7e5..2874616 100644
--- a/utils/topology/annotated-topology-reader.cpp
+++ b/utils/topology/annotated-topology-reader.cpp
@@ -38,9 +38,9 @@
 #include "ns3/pointer.h"
 #include "ns3/uinteger.h"
 #include "ns3/ipv4-address.h"
-#include "ns3/random-variable.h"
 #include "ns3/error-model.h"
 #include "ns3/constant-position-mobility-model.h"
+#include "ns3/double.h"
 
 #include "model/ndn-l3-protocol.hpp"
 #include "model/ndn-net-device-face.hpp"
@@ -66,13 +66,19 @@
 
 AnnotatedTopologyReader::AnnotatedTopologyReader(const std::string& path, double scale /*=1.0*/)
   : m_path(path)
-  , m_randX(0, 100.0)
-  , m_randY(0, 100.0)
+  , m_randX(CreateObject<UniformRandomVariable>())
+  , m_randY(CreateObject<UniformRandomVariable>())
   , m_scale(scale)
   , m_requiredPartitions(1)
 {
   NS_LOG_FUNCTION(this);
 
+  m_randX->SetAttribute("Min", DoubleValue(0));
+  m_randX->SetAttribute("Max", DoubleValue(100.0));
+
+  m_randY->SetAttribute("Min", DoubleValue(0));
+  m_randY->SetAttribute("Max", DoubleValue(100.0));
+
   SetMobilityModel("ns3::ConstantPositionMobilityModel");
 }
 
@@ -81,8 +87,11 @@
 {
   NS_LOG_FUNCTION(this << ulx << uly << lrx << lry);
 
-  m_randX = UniformVariable(ulx, lrx);
-  m_randY = UniformVariable(uly, lry);
+  m_randX->SetAttribute("Min", DoubleValue(ulx));
+  m_randX->SetAttribute("Max", DoubleValue(lrx));
+
+  m_randY->SetAttribute("Min", DoubleValue(uly));
+  m_randY->SetAttribute("Max", DoubleValue(lry));
 }
 
 void
@@ -188,8 +197,8 @@
     if (abs(latitude) > 0.001 && abs(latitude) > 0.001)
       node = CreateNode(name, m_scale * longitude, -m_scale * latitude, systemId);
     else {
-      UniformVariable var(0, 200);
-      node = CreateNode(name, var.GetValue(), var.GetValue(), systemId);
+      Ptr<UniformRandomVariable> var = CreateObject<UniformRandomVariable>();
+      node = CreateNode(name, var->GetValue(0, 200), var->GetValue(0, 200), systemId);
       // node = CreateNode (name, systemId);
     }
   }
diff --git a/utils/topology/annotated-topology-reader.hpp b/utils/topology/annotated-topology-reader.hpp
index 7ae3b3f..343743d 100644
--- a/utils/topology/annotated-topology-reader.hpp
+++ b/utils/topology/annotated-topology-reader.hpp
@@ -23,7 +23,7 @@
 #define __ANNOTATED_TOPOLOGY_READER_H__
 
 #include "ns3/topology-reader.h"
-#include "ns3/random-variable.h"
+#include "ns3/random-variable-stream.h"
 #include "ns3/object-factory.h"
 
 namespace ns3 {
@@ -140,8 +140,8 @@
   AnnotatedTopologyReader&
   operator=(const AnnotatedTopologyReader&);
 
-  UniformVariable m_randX;
-  UniformVariable m_randY;
+  Ptr<UniformRandomVariable> m_randX;
+  Ptr<UniformRandomVariable> m_randY;
 
   ObjectFactory m_mobilityFactory;
   double m_scale;
diff --git a/utils/topology/rocketfuel-map-reader.cpp b/utils/topology/rocketfuel-map-reader.cpp
index b53b03b..969dd6e 100644
--- a/utils/topology/rocketfuel-map-reader.cpp
+++ b/utils/topology/rocketfuel-map-reader.cpp
@@ -40,7 +40,6 @@
 #include "ns3/uinteger.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/node-list.h"
-#include "ns3/random-variable.h"
 
 #include "ns3/mobility-model.h"
 
@@ -64,6 +63,7 @@
 RocketfuelMapReader::RocketfuelMapReader(const std::string& path /*=""*/, double scale /*=1.0*/,
                                          const std::string& referenceOspfRate)
   : AnnotatedTopologyReader(path, scale)
+  , m_randVar(CreateObject<UniformRandomVariable>())
   , m_referenceOspfRate(boost::lexical_cast<DataRate>(referenceOspfRate))
 {
 }
@@ -103,15 +103,15 @@
   Link link(node1, nodeName1, node2, nodeName2);
 
   DataRate randBandwidth(
-    m_randVar.GetInteger(static_cast<uint32_t>(lexical_cast<DataRate>(minBw).GetBitRate()),
-                         static_cast<uint32_t>(lexical_cast<DataRate>(maxBw).GetBitRate())));
+    m_randVar->GetInteger(static_cast<uint32_t>(lexical_cast<DataRate>(minBw).GetBitRate()),
+                          static_cast<uint32_t>(lexical_cast<DataRate>(maxBw).GetBitRate())));
 
   int32_t metric = std::max(1, static_cast<int32_t>(1.0 * m_referenceOspfRate.GetBitRate()
                                                     / randBandwidth.GetBitRate()));
 
   Time randDelay =
-    Time::FromDouble((m_randVar.GetValue(lexical_cast<Time>(minDelay).ToDouble(Time::US),
-                                         lexical_cast<Time>(maxDelay).ToDouble(Time::US))),
+    Time::FromDouble((m_randVar->GetValue(lexical_cast<Time>(minDelay).ToDouble(Time::US),
+                                          lexical_cast<Time>(maxDelay).ToDouble(Time::US))),
                      Time::US);
 
   uint32_t queue = ceil(averageRtt * (randBandwidth.GetBitRate() / 8.0 / 1100.0));
@@ -273,7 +273,6 @@
   ifstream topgen;
   topgen.open(GetFileName().c_str());
   // NodeContainer nodes;
-  UniformVariable var;
 
   istringstream lineBuffer;
   string line;
@@ -708,11 +707,11 @@
     subgraphs[component].push_back(*bb);
   }
 
-  UniformVariable randVar;
+  Ptr<UniformRandomVariable> randVar = CreateObject<UniformRandomVariable>();
 
   for (int i = 1; i < num; i++) {
-    int node1 = randVar.GetInteger(0, subgraphs[i - 1].size() - 1);
-    int node2 = randVar.GetInteger(0, subgraphs[i].size() - 1);
+    int node1 = randVar->GetInteger(0, subgraphs[i - 1].size() - 1);
+    int node2 = randVar->GetInteger(0, subgraphs[i].size() - 1);
 
     Traits::vertex_descriptor v1 = get(vertex_name, bbGraph, subgraphs[i - 1][node1]),
                               v2 = get(vertex_name, bbGraph, subgraphs[i][node2]);
diff --git a/utils/topology/rocketfuel-map-reader.hpp b/utils/topology/rocketfuel-map-reader.hpp
index 3cf5ee2..1c089f0 100644
--- a/utils/topology/rocketfuel-map-reader.hpp
+++ b/utils/topology/rocketfuel-map-reader.hpp
@@ -25,7 +25,6 @@
 #include "annotated-topology-reader.hpp"
 
 #include "ns3/net-device-container.h"
-#include "ns3/random-variable.h"
 #include "ns3/data-rate.h"
 
 #include <set>
@@ -147,7 +146,7 @@
   ConnectBackboneRouters();
 
 private:
-  UniformVariable m_randVar;
+  Ptr<UniformRandomVariable> m_randVar;
 
   NodeContainer m_backboneRouters;
   NodeContainer m_gatewayRouters;
diff --git a/utils/trie/random-policy.hpp b/utils/trie/random-policy.hpp
index 813dae5..1e2aa4a 100644
--- a/utils/trie/random-policy.hpp
+++ b/utils/trie/random-policy.hpp
@@ -22,7 +22,7 @@
 
 /// @cond include_hidden
 
-#include "ns3/random-variable.h"
+#include "ns3/random-variable-stream.h"
 
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/set.hpp>
@@ -89,9 +89,11 @@
 
       type(Base& base)
         : base_(base)
-        , u_rand(0, std::numeric_limits<uint32_t>::max())
+        , u_rand(CreateObject<UniformRandomVariable>())
         , max_size_(100)
       {
+        u_rand->SetAttribute("Min", UintegerValue(0));
+        u_rand->SetAttribute("Max", UintegerValue(std::numeric_limits<uint32_t>::max()));
       }
 
       inline void
@@ -103,7 +105,7 @@
       inline bool
       insert(typename parent_trie::iterator item)
       {
-        get_order(item) = u_rand.GetValue();
+        get_order(item) = u_rand->GetValue();
 
         if (max_size_ != 0 && policy_container::size() >= max_size_) {
           if (MemberHookLess<Container>()(*item, *policy_container::begin())) {
@@ -157,7 +159,7 @@
 
     private:
       Base& base_;
-      ns3::UniformVariable u_rand;
+      Ptr<UniformRandomVariable> u_rand;
       size_t max_size_;
     };
   };
