diff --git a/examples/annotated-topology-read-example.cc b/examples/annotated-topology-read-example.cc
index a0bbfc8..53018a9 100644
--- a/examples/annotated-topology-read-example.cc
+++ b/examples/annotated-topology-read-example.cc
@@ -39,7 +39,6 @@
 
 int main (int argc, char *argv[])
 {
-    //Packet::EnablePrinting();
     GlobalValue::Bind ("SimulatorImplementationType", StringValue
                        ("ns3::VisualSimulatorImpl"));
     
@@ -55,17 +54,18 @@
     // ------------------------------------------------------------
     // -- Read topology data.
     // --------------------------------------------
+    
+    
+    Ptr<AnnotatedTopologyReader> reader = CreateObject<AnnotatedTopologyReader> ();
+    reader->SetFileName (input);
+    
     NodeContainer nodes;
-    
-    Ptr<AnnotatedTopologyReader> inFile = CreateObject<AnnotatedTopologyReader> ();
-    inFile->SetFileName (input);
-    
-    if (inFile != 0)
+    if (reader != 0)
     {
-        nodes = inFile->Read ();
+        nodes = reader->Read ();
     }
     
-    if (inFile->LinksSize () == 0)
+    if (reader->LinksSize () == 0)
     {
         NS_LOG_ERROR ("Problems reading the topology file. Failing.");
         return -1;
@@ -89,106 +89,25 @@
     Ipv4AddressHelper address;
     address.SetBase ("10.0.0.0", "255.255.255.252");
     
-    int totlinks = inFile->LinksSize ();
+    int totlinks = reader->LinksSize ();
     
+    
+    ///*** applying settings
     NS_LOG_INFO ("creating node containers");
     NodeContainer* nc = new NodeContainer[totlinks];
     TopologyReader::ConstLinksIterator iter;
     int i = 0;
-    for ( iter = inFile->LinksBegin (); iter != inFile->LinksEnd (); iter++, i++ )
+    for ( iter = reader->LinksBegin (); iter != reader->LinksEnd (); iter++, i++ )
     {
         nc[i] = NodeContainer (iter->GetFromNode (), iter->GetToNode ());
     }
     
-    NS_LOG_INFO ("creating net device containers");
-    ObjectFactory m_queueFactory;
-    m_queueFactory.SetTypeId("ns3::DropTailQueue");
-    //m_queueFactory.Set("Mode",
     NetDeviceContainer* ndc = new NetDeviceContainer[totlinks];
-    PointToPointHelper p2p;
-    TopologyReader::ConstLinksIterator iter2;
-    i = 0;
-    for ( iter2 = inFile->LinksBegin (); iter2 != inFile->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(dataRate));
-        p2p.SetChannelAttribute("Delay", StringValue(delay));
-        p2p.SetQueue("ns3::DropTailQueue","MaxPackets",StringValue("100"));
-        ndc[i] = p2p.Install(nc[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");
-        //NS_LOG_INFO("1");
-        NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
-        NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
-
-        Ptr<PointToPointNetDevice> device = nd->GetDevice(nd->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
-        if(device==NULL)
-            NS_LOG_INFO("device = 0");
-        
-        //NS_LOG_INFO("2");
-        
-        Ptr<PointToPointNetDevice> device2 = nd2->GetDevice(nd2->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
-
-        if(device2==NULL)
-            NS_LOG_INFO("device2 = 0");
-        
-        PointerValue tmp1;
-        device->GetAttribute ("TxQueue", tmp1);
-        //NS_LOG_INFO("2.5");
-        Ptr<Object> txQueue1 = tmp1.GetObject ();
-        
-        PointerValue tmp2;
-        device2->GetAttribute ("TxQueue", tmp2);
-        Ptr<Object> txQueue2 = tmp2.GetObject ();
-        //NS_LOG_INFO("3");
-        Ptr<DropTailQueue> dtq1 = txQueue1->GetObject <DropTailQueue> ();
-        NS_ASSERT (dtq1 != 0);
-        
-        Ptr<DropTailQueue> dtq2 = txQueue2->GetObject <DropTailQueue> ();
-        NS_ASSERT (dtq2 != 0);
-        
-        std::string queuesize1 = iter2->GetAttribute("QueueSizeNode1");
-        std::string queuesize2 = iter2->GetAttribute("QueueSizeNode2");
-        //NS_LOG_INFO("4");
-        txQueue1->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize1.c_str())));
-        txQueue2->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize2.c_str())));
-        
-        UintegerValue limit;
-        txQueue1->GetAttribute ("MaxPackets", limit);
-        NS_LOG_INFO ("txQueue1 limit changed: " << limit.Get () << " packets");
-        
-        txQueue2->GetAttribute ("MaxPackets", limit);
-        NS_LOG_INFO ("txQueue2 limit changed: " << limit.Get () << " packets");
-        
+    reader->ApplySettings(ndc,nc);
+    ///*** settings applied
     
-        /* //bauman way of doing things
-        m_queueFactory.Set("MaxPackets",StringValue(iter2->GetAttribute("QueueSizeNode1")));
-        NS_LOG_INFO("2.5");
-        Ptr<DropTailQueue> queue = m_queueFactory.Create<DropTailQueue>();
-        queue->SetMode(ns3::DropTailQueue::PACKETS);
-        NS_LOG_INFO("2,8");
-        device->SetQueue(queue);
-        NS_LOG_INFO("3");
-        m_queueFactory.Set("MaxPackets", StringValue(iter2->GetAttribute("QueueSizeNode2")));
-        
-        Ptr<DropTailQueue> queue2 = m_queueFactory.Create<DropTailQueue>();
-        queue2->SetMode(ns3::DropTailQueue::PACKETS);
-        device2->SetQueue(queue2);
-        */
-    }
+    
+    
     
     // it creates little subnets, one for each couple of nodes.
     NS_LOG_INFO ("creating ipv4 interfaces");
@@ -199,57 +118,6 @@
         address.NewNetwork ();
     }
     
-    
-    
-    
-    
-    
-    /*
-    NS_LOG_INFO ("Create Applications.");
-    uint16_t port = 9;   // Discard port (RFC 863)
-    
-    std::string sendsizeattr = "SendSize";
-    //flow2 7-->2
-    BulkSendHelper bulksend0 ("ns3::TcpSocketFactory", InetSocketAddress (ipic[1].GetAddress (0), port));
-    //bulksend0.SetAttribute(sendsizeattr, AttributeValue(ConstantVariable(2560)));
-    bulksend0.SetAttribute("MaxBytes", UintegerValue(2560));
-    ApplicationContainer apps = bulksend0.Install(nc[6]);
-    apps.Start(Seconds (1.0));
-    apps.Stop(Seconds (10.0));
-    
-    // Create a packet sink to receive these packets
-    PacketSinkHelper sink0 ("ns3::UdpSocketFactory", InetSocketAddress(Ipv4Address::GetAny (), port));
-    apps = sink0.Install(nc[1]);
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(20.0));
-    
-    //flow1 1-->6
-    BulkSendHelper bulksend ("ns3::TcpSocketFactory", InetSocketAddress (ipic[5].GetAddress (1), port));
-    //bulksend.SetAttribute(sendsizeattr, AttributeValue( ConstantVariable(2560)));
-    bulksend0.SetAttribute("MaxBytes", UintegerValue(2560));
-    apps = bulksend.Install (nc[0]);
-    apps.Start (Seconds (6.0));
-    apps.Stop (Seconds (20.0));
-    
-    // Create a packet sink to receive these packets
-    PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
-    apps = sink.Install (nc[5]);
-    apps.Start(Seconds(0.0));
-    apps.Stop(Seconds(20.0));
-    
-    AsciiTraceHelper ascii;
-    p2p.EnableAsciiAll (ascii.CreateFileStream ("annotated-topology-read.tr"));
-    p2p.EnablePcapAll ("annotated-topology-read");
-    
-    */
-    
-    
-    
-    
-    
-    
-    
-    
     // ------------------------------------------------------------
     // -- Run the simulation
     // --------------------------------------------
@@ -265,6 +133,4 @@
     NS_LOG_INFO ("Done.");
     
     return 0;
-    
-    // end main
 }
diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index c1c597f..b3b2348 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -19,147 +19,217 @@
  */
 
 #include "annotated-topology-reader.h"
-#include <fstream>
-#include <cstdlib>
-#include <iostream>
-#include <sstream>
-#include "ns3/log.h"
 
 using namespace std;
 
 namespace ns3 
 {    
-    NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
+
+NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
     
-    NS_OBJECT_ENSURE_REGISTERED (AnnotatedTopologyReader);
+NS_OBJECT_ENSURE_REGISTERED (AnnotatedTopologyReader);
     
-    TypeId AnnotatedTopologyReader::GetTypeId (void)
+TypeId AnnotatedTopologyReader::GetTypeId (void)
+{
+    static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
+    .SetParent<Object> ()
+    ;
+    return tid;
+}
+    
+AnnotatedTopologyReader::AnnotatedTopologyReader ()
+{
+    NS_LOG_FUNCTION (this);
+}
+    
+AnnotatedTopologyReader::~AnnotatedTopologyReader ()
+{
+    NS_LOG_FUNCTION (this);
+}
+    
+NodeContainer
+AnnotatedTopologyReader::Read (void)
+{
+    ifstream topgen;
+    topgen.open (GetFileName ().c_str ());
+    map<string, Ptr<Node> > nodeMap;
+    NodeContainer nodes;
+        
+    if ( !topgen.is_open () )
     {
-        static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
-        .SetParent<Object> ()
-        ;
-        return tid;
-    }
-    
-    AnnotatedTopologyReader::AnnotatedTopologyReader ()
-    {
-        NS_LOG_FUNCTION (this);
-    }
-    
-    AnnotatedTopologyReader::~AnnotatedTopologyReader ()
-    {
-        NS_LOG_FUNCTION (this);
-    }
-    
-    NodeContainer
-    AnnotatedTopologyReader::Read (void)
-    {
-        ifstream topgen;
-        topgen.open (GetFileName ().c_str ());
-        map<string, Ptr<Node> > nodeMap;
-        NodeContainer nodes;
-        
-        if ( !topgen.is_open () )
-        {
-            return nodes;
-        }
-        
-        string from;
-        string to;
-        string linkAttr;
-        
-        int linksNumber = 0;
-        int nodesNumber = 0;
-        
-        int totnode = 0;
-        int totlink = 0;
-        
-        istringstream lineBuffer;
-        string line;
-        
-        getline (topgen,line);
-        lineBuffer.str (line);
-        
-        lineBuffer >> totnode;
-        lineBuffer >> totlink;
-        NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
-        
-        if(!topgen.eof ())
-            NS_LOG_INFO("!EOF");
-        
-        /*for (int i = 0; i <= totnode; i++)
-        {
-            getline (topgen,line);
-        }*/
-        
-        for (int i = 0; i < totlink && !topgen.eof (); i++)
-        {
-            //NS_LOG_INFO("Line #" <<i);
-            getline (topgen,line);
-            lineBuffer.clear ();
-            lineBuffer.str (line);
-            
-            lineBuffer >> from;
-            lineBuffer >> to;
-            
-            
-            if ( (!from.empty ()) && (!to.empty ()) )
-            {
-                NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
-                
-                if ( nodeMap[from] == 0 )
-                {
-                    Ptr<Node> tmpNode = CreateObject<Node> ();
-                    nodeMap[from] = tmpNode;
-                    nodes.Add (tmpNode);
-                    nodesNumber++;
-                }
-                
-                if (nodeMap[to] == 0)
-                {
-                    Ptr<Node> tmpNode = CreateObject<Node> ();
-                    nodeMap[to] = tmpNode;
-                    nodes.Add (tmpNode);
-                    nodesNumber++;
-                }
-                
-                Link link ( nodeMap[from], from, nodeMap[to], to );
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("DataRate", linkAttr);
-                }
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("Delay", linkAttr);
-                }
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("QueueSizeNode1", linkAttr);
-                }
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("QueueSizeNode2", linkAttr);
-                }
-                
-                AddLink (link);
-                
-                linksNumber++;
-            }
-        }
-        
-        NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
-        topgen.close ();
-        
         return nodes;
     }
+        
+    string from;
+    string to;
+    string linkAttr;
+        
+    int linksNumber = 0;
+    int nodesNumber = 0;
+        
+    int totnode = 0;
+    int totlink = 0;
+        
+    istringstream lineBuffer;
+    string line;
+        
+    getline (topgen,line);
+    lineBuffer.str (line);
+        
+    lineBuffer >> totnode;
+    lineBuffer >> totlink;
+    NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
+        
+    if(!topgen.eof ())
+        NS_LOG_INFO("!EOF");
+
+        
+    for (int i = 0; i < totlink && !topgen.eof (); i++)
+    {
+        //NS_LOG_INFO("Line #" <<i);
+        getline (topgen,line);
+        lineBuffer.clear ();
+        lineBuffer.str (line);
+            
+        lineBuffer >> from;
+        lineBuffer >> to;
+            
+            
+        if ( (!from.empty ()) && (!to.empty ()) )
+        {
+            NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
+                
+            if ( nodeMap[from] == 0 )
+            {
+                Ptr<Node> tmpNode = CreateObject<Node> ();
+                nodeMap[from] = tmpNode;
+                nodes.Add (tmpNode);
+                nodesNumber++;
+            }
+                
+            if (nodeMap[to] == 0)
+            {
+                Ptr<Node> tmpNode = CreateObject<Node> ();
+                nodeMap[to] = tmpNode;
+                nodes.Add (tmpNode);
+                nodesNumber++;
+            }
+                
+            Link link ( nodeMap[from], from, nodeMap[to], to );
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("DataRate", linkAttr);
+            }
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("Delay", linkAttr);
+            }
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("QueueSizeNode1", linkAttr);
+            }
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("QueueSizeNode2", linkAttr);
+            }
+                
+            AddLink (link);
+                
+            linksNumber++;
+        }
+    }
+        
+    NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
+    topgen.close ();
+        
+    return nodes;
+}
     
-} /* namespace ns3 */
+void
+AnnotatedTopologyReader::ApplySettings(NetDeviceContainer* ndc, NodeContainer* nc)
+{
+    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"));
+        NS_LOG_INFO("Delay = " + iter2->GetAttribute("Delay")+"ms");
+        p2p.SetQueue("ns3::DropTailQueue","MaxPackets",StringValue("100"));
+        ndc[i] = p2p.Install(nc[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");
+        
+        //NS_LOG_INFO("1");
+        NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
+        NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
+            
+        Ptr<PointToPointNetDevice> device = nd->GetDevice(nd->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
+            
+        if(device==NULL)
+            NS_LOG_INFO("device = 0");
+            
+        //NS_LOG_INFO("2");
+            
+        Ptr<PointToPointNetDevice> device2 = nd2->GetDevice(nd2->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
+            
+        if(device2==NULL)
+            NS_LOG_INFO("device2 = 0");
+            
+        PointerValue tmp1;
+        device->GetAttribute ("TxQueue", tmp1);
+        //NS_LOG_INFO("2.5");
+        Ptr<Object> txQueue1 = tmp1.GetObject ();
+            
+        PointerValue tmp2;
+        device2->GetAttribute ("TxQueue", tmp2);
+        Ptr<Object> txQueue2 = tmp2.GetObject ();
+        //NS_LOG_INFO("3");
+        Ptr<DropTailQueue> dtq1 = txQueue1->GetObject <DropTailQueue> ();
+        NS_ASSERT (dtq1 != 0);
+            
+        Ptr<DropTailQueue> dtq2 = txQueue2->GetObject <DropTailQueue> ();
+        NS_ASSERT (dtq2 != 0);
+            
+        std::string queuesize1 = iter2->GetAttribute("QueueSizeNode1");
+        std::string queuesize2 = iter2->GetAttribute("QueueSizeNode2");
+        //NS_LOG_INFO("4");
+        txQueue1->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize1.c_str())));
+        txQueue2->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize2.c_str())));
+            
+        UintegerValue limit;
+        txQueue1->GetAttribute ("MaxPackets", limit);
+        NS_LOG_INFO ("NetDevice #"<< device->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
+            
+        txQueue2->GetAttribute ("MaxPackets", limit);
+        NS_LOG_INFO ("NetDevice #"<< device2->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
+    }
+}
+}
 
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index f979aba..c99a6a3 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -21,42 +21,62 @@
 #ifndef __ANNOTATED_TOPOLOGY_READER_H__
 #define __ANNOTATED_TOPOLOGY_READER_H__
 
-#include "ns3/nstime.h"
 #include "ns3/topology-reader.h"
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+#include "ns3/net-device-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
+#include <string>
+#include <fstream>
+#include <cstdlib>
+#include <iostream>
+#include <sstream>
 
 namespace ns3 
 {
+    
+/**
+* \brief This class reads annotated topology and apply settings to the corresponding nodes and links
+* Input File Format
+* 1st line is     NumberOfNodes    TAB     NumberofLinks
+* Nth line is     NodeID1  TAB    NodeID2   TAB  DataRateKBPS    TAB    DelayMiliseconds   TAB   QueueSizeInPacketsNode1     TAB    QueueSizeInPacketsNode2 
+*
+*/
+class AnnotatedTopologyReader : public TopologyReader
+{
+public:
+    typedef std::list< Link >::iterator LinksIterator;
+    static TypeId GetTypeId (void);
+        
+    AnnotatedTopologyReader ();
+    virtual ~AnnotatedTopologyReader ();
+        
+        
     /**
-     * Input File Format
-     * 1st line is     NumberOfNodes    TAB     NumberofLinks
-     * Nth line is     NodeID1  TAB    NodeID2   TAB  DataRateKBPS    TAB    DelayMiliseconds   TAB   QueueSizeInPackets1     TAB    QueueSizeInPackets2 
-     *
+    * \brief Main annotated topology reading function.
+    *
+    * This method opens an input stream and reads topology file with annotations.
+    *
+    * \return the container of the nodes created (or empty container if there was an error)
+    */
+    virtual NodeContainer Read (void);
+    
+    /**
+     * \brief This method applies setting to corresponding nodes and links
+     * NetDeviceContainer must be allocated
+     * NodeContainer from Read method
      */
-    class AnnotatedTopologyReader : public TopologyReader
-    {
-    public:
-        typedef std::list< Link >::iterator LinksIterator;
-        static TypeId GetTypeId (void);
+    void ApplySettings(NetDeviceContainer *ndc, NodeContainer* nc);
         
-        AnnotatedTopologyReader ();
-        virtual ~AnnotatedTopologyReader ();
-        
-        /**
-         * \brief Main topology reading function.
-         *
-         * This method opens an input stream and reads the Orbis-format file.
-         * Every row represents a topology link (the ids of a couple of nodes),
-         * so the input file is read line by line to figure out how many links
-         * and nodes are in the topology.
-         *
-         * \return the container of the nodes created (or empty container if there was an error)
-         */
-        virtual NodeContainer Read (void);
-        
-    private:
-        AnnotatedTopologyReader (const AnnotatedTopologyReader&);
-        AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
-    };
+private:
+    AnnotatedTopologyReader (const AnnotatedTopologyReader&);
+    AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
+};
 }
 
 
