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;
