diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index b3b2348..1c66523 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -122,6 +122,12 @@
             {
                 link.SetAttribute ("DataRate", linkAttr);
             }
+            
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("OSPF", linkAttr);
+            }
                 
             lineBuffer >> linkAttr;
             if ( !linkAttr.empty () )
@@ -156,18 +162,57 @@
 void
 AnnotatedTopologyReader::ApplySettings(NetDeviceContainer* ndc, NodeContainer* nc)
 {
+    InternetStackHelper stack;
+    Ipv4AddressHelper address;
+    address.SetBase ("10.1.0.0", "255.255.255.0");
+    
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+    
+    
+    
+    //This loop passes all links and checks if ipv4 is installed on the node
+    // if not, it installs. 
+    // We can't use stack.Install(nc) because in nc there are duplicates and assertion fails
+    TopologyReader::ConstLinksIterator iter;
+    int j = 0;
+    for ( iter = this->LinksBegin (); iter != this->LinksEnd (); iter++, j++ )
+    {
+        NodeContainer twoNodes = nc[j];
+        
+        Ptr<Node> nd = twoNodes.Get(0);
+        if(nd==NULL)
+            NS_LOG_INFO("nd = null");
+        
+        Ptr<Node> nd2 = twoNodes.Get(1);
+        if(nd2==NULL)
+            NS_LOG_INFO("nd2 = null");
+        
+        Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
+        if(ipv4 == 0)
+        {
+            NS_LOG_INFO("ipv4 = null");
+            stack.Install(nd);
+        }
+        
+        Ptr<Ipv4> ipv42 = nd2->GetObject<Ipv4>();
+        if(ipv42 == 0)
+        {
+            NS_LOG_INFO("ipv42 = null");
+            stack.Install(nd2);
+        }
+        
+        //NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
+        //NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
+    }
+    
+    NS_LOG_INFO("ITER2");
+    uint32_t base = 0;
     PointToPointHelper p2p;
     TopologyReader::ConstLinksIterator iter2;
     int i = 0;
     for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
     {
-        /*std::string dataRate = iter2->GetAttribute("DataRate");
-        NS_LOG_INFO("dataRate = "<<dataRate);
-        dataRate += "Kbps";
-        std::string delay = iter2->GetAttribute("Delay");
-        NS_LOG_INFO("delay = "<<delay);
-        delay += "ms";*/
-        
         p2p.SetDeviceAttribute("DataRate", StringValue(iter2->GetAttribute("DataRate")+"Kbps"));
         NS_LOG_INFO("DataRate = " + iter2->GetAttribute("DataRate")+"Kbps");
         p2p.SetChannelAttribute("Delay", StringValue(iter2->GetAttribute("Delay")+"ms"));
@@ -175,6 +220,8 @@
         p2p.SetQueue("ns3::DropTailQueue","MaxPackets",StringValue("100"));
         ndc[i] = p2p.Install(nc[i]);
         
+        Ipv4Address address1(base+i*256 + 1);
+        Ipv4Address address2(base+i*256 + 2);
         
         NodeContainer twoNodes = nc[i];
             
@@ -182,6 +229,8 @@
         if(nd==NULL)
             NS_LOG_INFO("nd = null");
         
+        
+        
         Ptr<Node> nd2 = twoNodes.Get(1);
         if(nd2==NULL)
             NS_LOG_INFO("nd2 = null");
@@ -190,18 +239,82 @@
         NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
         NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
             
-        Ptr<PointToPointNetDevice> device = nd->GetDevice(nd->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
-            
+        Ptr<NetDevice> device = nd->GetDevice(nd->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
+        
         if(device==NULL)
             NS_LOG_INFO("device = 0");
+        
+        std::string ospf = iter2->GetAttribute("OSPF");
+        uint16_t metric = atoi(ospf.c_str());
+        NS_LOG_INFO("OSPF metric = " << metric);
+        
+        {
+        NetDeviceContainer* temp = new NetDeviceContainer[1];
+        temp->Add(device);
+        address.Assign (*temp);
+        }
+        
+        Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
+        if(ipv4 == 0)
+        {
+            NS_LOG_INFO("ipv4 = null");
+            //stack.Install(nd);
+            /*NetDeviceContainer* temp = new NetDeviceContainer[1];
+            temp->Add(device);
+            address.Assign (*temp);
+            ipv4 = nd->GetObject<Ipv4>();*/
+        }
+        
+        NS_LOG_INFO("Before GetID");
+        int32_t interfaceId = ipv4->GetInterfaceForDevice(device);
+        NS_LOG_INFO("InterfaceID = " << interfaceId);
+        ipv4->SetMetric(interfaceId,metric);
+        
+        
+        
+
+        
+        /*Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
+        
+        if(ipv4 == 0)
+            NS_LOG_INFO("ipv4 = null");
+        int32_t interfaceId = ipv4->GetInterfaceForDevice(device);
+        ipv4->SetMetric(interfaceId,metric);*/
+        
+        //Ptr<Ipv4Interface> interface = nd->GetDevice(nd->GetNDevices()-1)->GetObject<Ipv4Interface> ();
+        //ipv4->SetMetric(metric);
             
         //NS_LOG_INFO("2");
             
-        Ptr<PointToPointNetDevice> device2 = nd2->GetDevice(nd2->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
+        Ptr<NetDevice> device2 = nd2->GetDevice(nd2->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
             
         if(device2==NULL)
             NS_LOG_INFO("device2 = 0");
             
+        {
+            NetDeviceContainer* temp = new NetDeviceContainer[1];
+            temp->Add(device2);
+            address.Assign (*temp);
+        }
+        
+        Ptr<Ipv4> ipv42 = nd2->GetObject<Ipv4>();
+        if(ipv42 == 0)
+        {
+            NS_LOG_INFO("ipv42 = null");
+            /*stack.Install(nd2);
+            NetDeviceContainer* temp = new NetDeviceContainer[1];
+            temp->Add(device2);
+            address.Assign (*temp);
+            ipv42 = nd2->GetObject<Ipv4>();*/
+        }
+        
+        NS_LOG_INFO("Before GetID");
+        interfaceId = ipv42->GetInterfaceForDevice(device2);
+        NS_LOG_INFO("InterfaceID = " << interfaceId);
+        ipv42->SetMetric(interfaceId,metric);
+
+        
+        
         PointerValue tmp1;
         device->GetAttribute ("TxQueue", tmp1);
         //NS_LOG_INFO("2.5");
@@ -231,5 +344,189 @@
         NS_LOG_INFO ("NetDevice #"<< device2->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
     }
 }
+
+    /*
+void
+AnnotatedTopologyReader::ApplyOspfMetric(NetDeviceContainer* ndc, NodeContainer* nc)
+{
+    InternetStackHelper stack;
+    Ipv4AddressHelper address;
+    address.SetBase ("10.0.0.0", "255.255.255.252");
+    
+    Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
+    stack.SetRoutingHelper (ipv4RoutingHelper);
+
+    
+    TopologyReader::ConstLinksIterator iter2;
+    int i = 0;
+    for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
+    {
+        NodeContainer twoNodes = nc[i];
+        Ptr<NetDevice> device = ndc[i].Get(0);
+        Ptr<NetDevice> device2 = ndc[i].Get(1);
+        
+        //Ptr<Node> nd = twoNodes.Get(0);
+        Ptr<Node> nd = device->GetNode();
+        if(nd==NULL)
+            NS_LOG_INFO("nd = null");
+        
+        //Ptr<Node> nd2 = twoNodes.Get(1);
+        Ptr<Node> nd2 = device->GetNode();
+        if(nd2==NULL)
+            NS_LOG_INFO("nd2 = null");
+
+        
+        
+        std::string ospf = iter2->GetAttribute("OSPF");
+        uint16_t metric = atoi(ospf.c_str());
+        NS_LOG_INFO("OSPF metric = " << metric);
+        
+        Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
+        
+        if(ipv4 == 0)
+        {
+            NS_LOG_INFO("ipv4 = null");
+            stack.Install(nd);
+            NetDeviceContainer* temp = new NetDeviceContainer[1];
+            temp->Add(device);
+            address.Assign (*temp);
+            ipv4 = nd->GetObject<Ipv4>();
+        }
+        
+        NS_LOG_INFO("Before GetID");
+        int32_t interfaceId = ipv4->GetInterfaceForDevice(device);
+        NS_LOG_INFO("InterfaceID = " << interfaceId);
+        ipv4->SetMetric(interfaceId,metric);
+        
+        
+        
+        Ptr<Ipv4> ipv42 = nd2->GetObject<Ipv4>();
+        if(ipv42 == 0)
+        {
+            NS_LOG_INFO("ipv42 = null");
+            stack.Install(nd2);
+            NetDeviceContainer* temp = new NetDeviceContainer[1];
+            temp->Add(device2);
+            address.Assign (*temp);
+            ipv42 = nd2->GetObject<Ipv4>();
+        }
+
+        //if(ipv4 == 0)
+        //    NS_LOG_INFO("ipv4 = null");
+        
+        NS_LOG_INFO("Before GetID");
+        interfaceId = ipv42->GetInterfaceForDevice(device2);
+        if(interfaceId == -1)
+        {
+            NS_LOG_INFO("interfaceID = -1");
+            stack.Install(nd2);
+            NetDeviceContainer* temp = new NetDeviceContainer[1];
+            temp->Add(device2);
+            address.Assign (*temp);
+            ipv42 = nd2->GetObject<Ipv4>();
+            interfaceId = ipv42->GetInterfaceForDevice(device2);
+        }
+        NS_LOG_INFO("InterfaceID = " << interfaceId);
+        ipv42->SetMetric(interfaceId,metric);
+
+    }
+}*/
+
+void
+AnnotatedTopologyReader::BoundingBox (NodeContainer* nc, double ulx, double uly, double lrx, double lry)
+{
+    
+    UniformVariable randX(ulx, lrx);
+    double x = 0.0;
+    UniformVariable randY(uly, lry);
+    double y = 0.0;
+
+
+    PointToPointHelper p2p;
+    TopologyReader::ConstLinksIterator iter2;
+    int i = 0;
+    for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
+    {
+        NodeContainer twoNodes = nc[i];
+        
+        Ptr<Node> nd = twoNodes.Get(0);
+        if(nd==NULL)
+            NS_LOG_INFO("nd = null");
+        
+        Ptr<Node> nd2 = twoNodes.Get(1);
+        if(nd2==NULL)
+            NS_LOG_INFO("nd2 = null");
+        
+        Ptr<ConstantPositionMobilityModel> loc = nd->GetObject<ConstantPositionMobilityModel> ();
+        if (loc ==0)
+        {
+            loc = CreateObject<ConstantPositionMobilityModel> ();
+            nd->AggregateObject (loc);
+        }
+        
+        x = randX.GetValue();
+        y = randY.GetValue();
+        NS_LOG_INFO("X = "<<x <<"Y = "<<y);
+        Vector locVec (x, y, 0);
+        loc->SetPosition (locVec);
+        
+        
+        Ptr<ConstantPositionMobilityModel> loc2 = nd2->GetObject<ConstantPositionMobilityModel> ();
+        if (loc2 ==0)
+        {
+            loc2 = CreateObject<ConstantPositionMobilityModel> ();
+            nd2->AggregateObject (loc2);
+        }
+        
+        x = randX.GetValue();
+        y = randY.GetValue();
+        NS_LOG_INFO("X = "<<x <<"Y = "<<y);
+        Vector locVec2 (x, y, 0);
+        loc2->SetPosition (locVec2);
+    }
+    /*
+        double xDist; 
+        double yDist; 
+        if (lrx > ulx)
+        {
+            xDist = lrx - ulx;
+        }
+        else
+        {
+            xDist = ulx - lrx;
+        }
+        if (lry > uly)
+        {
+            yDist = lry - uly;
+        }
+        else
+        {
+            yDist = uly - lry;
+        }
+        double xAdder = xDist / m_xSize;
+        double yAdder = yDist / m_ySize;
+        double yLoc = yDist / 2;
+        for (uint32_t i = 0; i < m_ySize; ++i)
+        {
+            double xLoc = xDist / 2;
+            for (uint32_t j = 0; j < m_xSize; ++j)
+            {
+                Ptr<Node> node = GetNode (i, j);
+                Ptr<ConstantPositionMobilityModel> loc = node->GetObject<ConstantPositionMobilityModel> ();
+                if (loc ==0)
+                {
+                    loc = CreateObject<ConstantPositionMobilityModel> ();
+                    node->AggregateObject (loc);
+                }
+                Vector locVec (xLoc, yLoc, 0);
+                loc->SetPosition (locVec);
+                
+                xLoc += xAdder;
+            }
+            yLoc += yAdder;
+        }
+    }
+*/
+}
 }
 
