port Applications to Attributes
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 27 Feb 2008 00:05:23 +0100
changeset 2494 1c69ea12779c
parent 2493 2cd8723ece97
child 2495 91109d479b4c
port Applications to Attributes
examples/csma-broadcast.cc
examples/csma-multicast.cc
examples/csma-one-subnet.cc
examples/csma-packet-socket.cc
examples/mixed-global-routing.cc
examples/simple-alternate-routing.cc
examples/simple-error-model.cc
examples/simple-global-routing.cc
examples/simple-point-to-point-olsr.cc
examples/simple-point-to-point.cc
examples/tcp-large-transfer-errors.cc
examples/tcp-large-transfer.cc
examples/tcp-small-transfer-oneloss.cc
examples/tcp-small-transfer.cc
examples/udp-echo.cc
samples/main-adhoc-wifi.cc
samples/main-ap-wifi.cc
src/applications/onoff/onoff-application.cc
src/applications/onoff/onoff-application.h
src/applications/packet-sink/packet-sink.cc
src/applications/packet-sink/packet-sink.h
src/applications/udp-echo/udp-echo-client.cc
src/applications/udp-echo/udp-echo-client.h
src/applications/udp-echo/udp-echo-server.cc
src/applications/udp-echo/udp-echo-server.h
src/node/application.cc
src/node/application.h
tutorial/tutorial-bus-network.cc
tutorial/tutorial-csma-echo-ascii-trace.cc
tutorial/tutorial-csma-echo-pcap-trace.cc
tutorial/tutorial-csma-echo.cc
tutorial/tutorial-linear-dumbbell.cc
tutorial/tutorial-point-to-point.cc
tutorial/tutorial-star-routing.cc
tutorial/tutorial-star.cc
--- a/examples/csma-broadcast.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/csma-broadcast.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -154,30 +154,36 @@
   // Create the OnOff application to send UDP datagrams of size
   // 512 bytes (default) at a rate of 500 Kb/s (default) from n0
   NS_LOG_INFO ("Create Applications.");
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("255.255.255.255", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("255.255.255.255", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.0));
   ooff->Stop (Seconds(10.0));
   
   // Create an optional packet sink to receive these packets
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n1,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n1,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                  "Protocol", TypeId::LookupByName ("Udp"));
+  n1->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.0));
   sink->Stop (Seconds (10.0));
 
   // Create an optional packet sink to receive these packets
-  sink = CreateObject<PacketSink> (
-    n2,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  sink = CreateObjectWith<PacketSink> (
+                                       "Node", n2,
+                                       "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                       "Protocol", TypeId::LookupByName ("Udp"));
+  n2->AddApplication (sink);
+
   // Start the sink
   sink->Start (Seconds (1.0));
   sink->Stop (Seconds (10.0));
--- a/examples/csma-multicast.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/csma-multicast.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -52,6 +52,7 @@
 #include "ns3/ipv4-route.h"
 #include "ns3/onoff-application.h"
 #include "ns3/packet-sink.h"
+#include "ns3/uinteger.h"
 
 using namespace ns3;
 
@@ -281,14 +282,16 @@
 
   // Configure a multicast packet generator that generates a packet
   // every few seconds
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress (multicastGroup, port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0),
-    DataRate ("255b/s"),
-    128);
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress (multicastGroup, port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0),
+                                        "DataRate", MakeDataRate ("255b/s"),
+                                        "PacketSize", Uinteger (128));
+  n0->AddApplication (ooff);
 //
 // Tell the application when to start and stop.
 //
@@ -298,10 +301,12 @@
   // Create an optional packet sink to receive these packets
   // If you enable logging on this (above) it will print a log statement
   // for every packet received
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n4,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n4,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                  "Protocol", TypeId::LookupByName ("Udp"));
+  n4->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.0));
   sink->Stop (Seconds (10.0));
--- a/examples/csma-one-subnet.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/csma-one-subnet.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -165,12 +165,15 @@
 //
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.1.2", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("10.1.1.2", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
+
 //
 // Tell the application when to start and stop.
 //
@@ -179,12 +182,13 @@
 // 
 // Create a similar flow from n3 to n0, starting at time 1.1 seconds
 //
-  ooff = CreateObject<OnOffApplication> (
-    n3, 
-    InetSocketAddress ("10.1.1.1", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                             "Node", n3, 
+                                             "Remote", Address (InetSocketAddress ("10.1.1.1", port)), 
+                                             "Protocol", TypeId::LookupByName ("Udp"),
+                                             "OnTime", ConstantVariable(1), 
+                                             "OffTime", ConstantVariable(0));
+  n3->AddApplication (ooff);
 
   ooff->Start(Seconds(1.1));
   ooff->Stop (Seconds(10.0));
--- a/examples/csma-packet-socket.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/csma-packet-socket.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -136,23 +136,26 @@
   // 210 bytes at a rate of 448 Kb/s
   // from n0 to n1
   NS_LOG_INFO ("Create Applications.");
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    n0ToN1,
-    "Packet",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (n0ToN1),
+                                        "Protocol", TypeId::LookupByName ("Packet"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.0));
   ooff->Stop (Seconds(10.0));
 
   // Create a similar flow from n3 to n0, starting at time 1.1 seconds
-  ooff = CreateObject<OnOffApplication> (
-    n3, 
-    n3ToN0,
-    "Packet",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                             "Node", n3, 
+                                             "Remote", Address (n3ToN0),
+                                             "Protocol", TypeId::LookupByName ("Packet"),
+                                             "OnTime", ConstantVariable(1), 
+                                             "OffTime", ConstantVariable(0));
+  n3->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.1));
   ooff->Stop (Seconds(10.0));
--- a/examples/mixed-global-routing.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/mixed-global-routing.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -42,6 +42,7 @@
 #include "ns3/default-value.h"
 #include "ns3/ptr.h"
 #include "ns3/random-variable.h"
+#include "ns3/config.h"
 
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
@@ -65,6 +66,7 @@
 #include "ns3/point-to-point-topology.h"
 #include "ns3/onoff-application.h"
 #include "ns3/global-route-manager.h"
+#include "ns3/uinteger.h"
 
 using namespace ns3;
 
@@ -110,10 +112,8 @@
   // topology code
   DefaultValue::Bind ("Queue", "DropTailQueue");
 
-  DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
-  DefaultValue::Bind ("OnOffApplicationDataRate", "448kb/s");
-
-  //DefaultValue::Bind ("DropTailQueue::m_maxPackets", 30);   
+  Config::SetDefault ("OnOffApplication::PacketSize", Uinteger (210));
+  Config::SetDefault ("OnOffApplication::DataRate", MakeDataRate ("448kb/s"));
 
   // Allow the user to override any of the defaults and the above
   // Bind ()s at run-time, via command-line arguments
@@ -191,14 +191,16 @@
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.3.2", port), 
-    "Udp",
-    ConstantVariable (1), 
-    ConstantVariable (0),
-    DataRate("300bps"),
-    50);
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable (1), 
+                                        "OffTime", ConstantVariable (0),
+                                        "DataRate", MakeDataRate("300bps"),
+                                        "PacketSize", Uinteger (50));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds (1.0));
   ooff->Stop (Seconds (10.0));
--- a/examples/simple-alternate-routing.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/simple-alternate-routing.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -43,6 +43,8 @@
 #include "ns3/default-value.h"
 #include "ns3/ptr.h"
 #include "ns3/random-variable.h"
+#include "ns3/config.h"
+#include "ns3/uinteger.h"
 
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
@@ -105,8 +107,8 @@
   // instantiate, when the queue factory is invoked in the topology code
   DefaultValue::Bind ("Queue", "DropTailQueue");
 
-  DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
-  DefaultValue::Bind ("OnOffApplicationDataRate", "300b/s");
+  Config::SetDefault ("OnOffApplication::PacketSize", Uinteger (210));
+  Config::SetDefault ("OnOffApplication::DataRate", MakeDataRate ("300b/s"));
 
   // The below metric, if set to 3 or higher, will cause packets between
   // n1 and n3 to take the 2-hop route through n2
@@ -182,21 +184,25 @@
   uint16_t port = 9;   // Discard port (RFC 863)
 
   // Create a flow from n3 to n1, starting at time 1.1 seconds
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n3, 
-    InetSocketAddress ("10.1.1.1", port),
-    "Udp",
-    ConstantVariable (1), 
-    ConstantVariable (0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n3, 
+                                        "Remote", Address (InetSocketAddress ("10.1.1.1", port)),
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable (1), 
+                                        "OffTime", ConstantVariable (0));
+  n3->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds (1.1));
   ooff->Stop (Seconds (10.0));
 
   // Create a packet sink to receive these packets
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n1, 
-    InetSocketAddress (Ipv4Address::GetAny (), port), 
-    "Udp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n1, 
+                                  "Remote", Address (InetSocketAddress (Ipv4Address::GetAny (), port)), 
+                                  "Protocol", TypeId::LookupByName ("Udp"));
+  n1->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.1));
   sink->Stop (Seconds (10.0));
--- a/examples/simple-error-model.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/simple-error-model.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -43,6 +43,8 @@
 #include "ns3/command-line.h"
 #include "ns3/default-value.h"
 #include "ns3/ptr.h"
+#include "ns3/config.h"
+#include "ns3/uinteger.h"
 
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
@@ -79,15 +81,12 @@
   LogComponentEnable ("SimplePointToPointExample", LOG_LEVEL_INFO);
 #endif
 
-  // Set up some default values for the simulation.  Use the Bind()
-  // technique to tell the system what subclass of ErrorModel to use
-  DefaultValue::Bind ("ErrorModel", "RateErrorModel");
   // Set a few parameters
-  DefaultValue::Bind ("RateErrorModelErrorRate", "0.01");
-  DefaultValue::Bind ("RateErrorModelErrorUnit", "EU_PKT");
-
-  DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
-  DefaultValue::Bind ("OnOffApplicationDataRate", "448kb/s");
+  Config::SetDefault ("RateErrorModel::ErrorRate", Double (0.01));
+  Config::SetDefault ("RateErrorModel::ErrorUnit", "EU_PKT");
+  
+  Config::SetDefault ("OnOffApplication::PacketSize", Uinteger (210));
+  Config::SetDefault ("OnOffApplication::DataRate", MakeDataRate ("448kb/s"));
 
 
   // Allow the user to override any of the defaults and the above
@@ -143,41 +142,46 @@
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.3.2", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.0));
   ooff->Stop (Seconds(10.0));
 
   // Create an optional packet sink to receive these packets
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n3,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  Ptr<PacketSink> sink = CreateObjectWith<PacketSink> (
+                                                       "Node", n3,
+                                                       "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                                       "Protocol", TypeId::LookupByName ("Udp"));
+  n3->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.0));
   sink->Stop (Seconds (10.0));
 
   // Create a similar flow from n3 to n1, starting at time 1.1 seconds
-  ooff = CreateObject<OnOffApplication> (
-    n3, 
-    InetSocketAddress ("10.1.2.1", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                         "Node", n3, 
+                                         "Remote", Address (InetSocketAddress ("10.1.2.1", port)), 
+                                         "Protocol", TypeId::LookupByName ("Udp"),
+                                         "OnTime", ConstantVariable(1), 
+                                         "OffTime", ConstantVariable(0));
+  n3->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.1));
   ooff->Stop (Seconds(10.0));
 
   // Create a packet sink to receive these packets
-  sink = CreateObject<PacketSink> (
-    n1,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  sink = CreateObjectWith<PacketSink> (
+                                   "Node", n1,
+                                   "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                   "Protocol", TypeId::LookupByName ("Udp"));
+  n1->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.1));
   sink->Stop (Seconds (10.0));
--- a/examples/simple-global-routing.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/simple-global-routing.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -48,6 +48,8 @@
 #include "ns3/default-value.h"
 #include "ns3/ptr.h"
 #include "ns3/random-variable.h"
+#include "ns3/config.h"
+#include "ns3/uinteger.h"
 
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
@@ -110,8 +112,8 @@
   // instantiate, when the queue factory is invoked in the topology code
   DefaultValue::Bind ("Queue", "DropTailQueue");
 
-  DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
-  DefaultValue::Bind ("OnOffApplicationDataRate", "448kb/s");
+  Config::SetDefault ("OnOffApplication::PacketSize", Uinteger (210));
+  Config::SetDefault ("OnOffApplication::DataRate", MakeDataRate ("448kb/s"));
 
   //DefaultValue::Bind ("DropTailQueue::m_maxPackets", 30);   
 
@@ -163,42 +165,45 @@
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.3.2", port), 
-    "Udp",
-    ConstantVariable (1), 
-    ConstantVariable (0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> ("Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable (1), 
+                                        "OffTime", ConstantVariable (0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds (1.0));
   ooff->Stop (Seconds (10.0));
 
   // Create a packet sink to receive these packets
   // The last argument "true" disables output from the Receive callback
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n3, 
-    InetSocketAddress (Ipv4Address::GetAny (), port), 
-    "Udp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> ("Node", n3, 
+                                  "Remote", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                  "Protocol", TypeId::LookupByName ("Udp"));
+  n3->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.0));
   sink->Stop (Seconds (10.0));
 
   // Create a similar flow from n3 to n1, starting at time 1.1 seconds
-  ooff = CreateObject<OnOffApplication> (
-    n3, 
-    InetSocketAddress ("10.1.2.1", port),
-    "Udp",
-    ConstantVariable (1), 
-    ConstantVariable (0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                             "Node", n3, 
+                                             "Remote", Address (InetSocketAddress ("10.1.2.1", port)),
+                                             "Protocol", TypeId::LookupByName ("Udp"),
+                                             "OnTime", ConstantVariable (1), 
+                                             "OffTime", ConstantVariable (0));
+  n3->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds (1.1));
   ooff->Stop (Seconds (10.0));
 
   // Create a packet sink to receive these packets
-  sink = CreateObject<PacketSink> (
-    n1, 
-    InetSocketAddress (Ipv4Address::GetAny (), port), 
-    "Udp");
+  sink = CreateObjectWith<PacketSink> ("Node", n1,
+                                       "Remote", Address (InetSocketAddress (Ipv4Address::GetAny (), port)), 
+                                       "Protocol", TypeId::LookupByName ("Udp"));
+  n1->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.1));
   sink->Stop (Seconds (10.0));
--- a/examples/simple-point-to-point-olsr.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/simple-point-to-point-olsr.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -43,6 +43,7 @@
 #include "ns3/default-value.h"
 #include "ns3/ptr.h"
 #include "ns3/random-variable.h"
+#include "ns3/config.h"
 
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
@@ -98,16 +99,10 @@
   LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_ALL);
 #endif
 
-  // Set up some default values for the simulation.  Use the Bind()
-  // technique to tell the system what subclass of Queue to use,
-  // and what the queue limit is
+  // Set up some default values for the simulation.
 
-  // The below Bind command tells the queue factory which class to
-  // instantiate, when the queue factory is invoked in the topology code
-  DefaultValue::Bind ("Queue", "DropTailQueue");
-
-  DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
-  DefaultValue::Bind ("OnOffApplicationDataRate", "448kb/s");
+  Config::SetDefault ("OnOffApplication::PacketSize", "210");
+  Config::SetDefault ("OnOffApplication::DataRate", "448kb/s");
 
   //DefaultValue::Bind ("DropTailQueue::m_maxPackets", 30);   
 
@@ -162,38 +157,44 @@
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.3.2", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.0));
 
   // Create an optional packet sink to receive these packets
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n3,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n3,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                  "Protocol", TypeId::LookupByName ("Udp"));
+  n3->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.0));
 
   // Create a similar flow from n3 to n1, starting at time 1.1 seconds
-  ooff = CreateObject<OnOffApplication> (
-    n3, 
-    InetSocketAddress ("10.1.2.1", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                             "Node", n3, 
+                                             "Remote", Address (InetSocketAddress ("10.1.2.1", port)), 
+                                             "Protocol", TypeId::LookupByName ("Udp"),
+                                             "OnTime", ConstantVariable(1), 
+                                             "OffTime", ConstantVariable(0));
+  n3->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds(1.1));
 
   // Create a packet sink to receive these packets
-  sink = CreateObject<PacketSink> (
-    n1,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  sink = CreateObjectWith<PacketSink> (
+                                       "Node", n1,
+                                       "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                       "Protocol", TypeId::LookupByName ("Udp"));
+  n1->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.1));
 
--- a/examples/simple-point-to-point.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/simple-point-to-point.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -43,6 +43,7 @@
 #include "ns3/default-value.h"
 #include "ns3/ptr.h"
 #include "ns3/random-variable.h"
+#include "ns3/config.h"
 
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
@@ -75,16 +76,10 @@
   LogComponentEnable ("SimplePointToPointExample", LOG_LEVEL_ALL);
 #endif
 
-  // Set up some default values for the simulation.  Use the Bind()
-  // technique to tell the system what subclass of Queue to use,
-  // and what the queue limit is
+  // Set up some default values for the simulation.
 
-  // The below Bind command tells the queue factory which class to
-  // instantiate, when the queue factory is invoked in the topology code
-  DefaultValue::Bind ("Queue", "DropTailQueue");
-
-  DefaultValue::Bind ("OnOffApplicationPacketSize", "210");
-  DefaultValue::Bind ("OnOffApplicationDataRate", "448kb/s");
+  Config::SetDefault ("OnOffApplication::PacketSize", "210");
+  Config::SetDefault ("OnOffApplication::DataRate", "448kb/s");
 
   // Allow the user to override any of the defaults and the above
   // Bind()s at run-time, via command-line arguments
@@ -139,38 +134,44 @@
   // 210 bytes at a rate of 448 Kb/s
   NS_LOG_INFO ("Create Applications.");
   uint16_t port = 9;   // Discard port (RFC 863)
-  Ptr<OnOffApplication> ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.3.2", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  Ptr<OnOffApplication> ooff = 
+    CreateObjectWith<OnOffApplication> (
+                                        "Node", n0, 
+                                        "Remote", Address (InetSocketAddress ("10.1.3.2", port)), 
+                                        "Protocol", TypeId::LookupByName ("Udp"),
+                                        "OnTime", ConstantVariable(1), 
+                                        "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds(1.0));
 
   // Create an optional packet sink to receive these packets
-  Ptr<PacketSink> sink = CreateObject<PacketSink> (
-    n3,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n3,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                  "Protocol", TypeId::LookupByName ("Udp"));
+  n3->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.0));
 
   // Create a similar flow from n3 to n1, starting at time 1.1 seconds
-  ooff = CreateObject<OnOffApplication> (
-    n3, 
-    InetSocketAddress ("10.1.2.1", port), 
-    "Udp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                             "Node", n3, 
+                                             "Remote", Address (InetSocketAddress ("10.1.2.1", port)), 
+                                             "Protocol", TypeId::LookupByName ("Udp"),
+                                             "OnTime", ConstantVariable(1), 
+                                             "OffTime", ConstantVariable(0));
+  n3->AddApplication (ooff);
   // Start the application
   ooff->Start(Seconds(1.1));
 
   // Create a packet sink to receive these packets
-  sink = CreateObject<PacketSink> (
-    n1,
-    InetSocketAddress (Ipv4Address::GetAny (), port),
-    "Udp");
+  sink = CreateObjectWith<PacketSink> (
+                                       "Node", n1,
+                                       "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
+                                       "Protocol", TypeId::LookupByName ("Udp"));
+  n1->AddApplication (sink);
   // Start the sink
   sink->Start (Seconds (1.1));
 
@@ -178,21 +179,23 @@
   // Create a file transfer from n0 to n3, starting at time 1.2
   uint16_t servPort = 500;
 
-  ooff = CreateObject<OnOffApplication> (
-    n0, 
-    InetSocketAddress ("10.1.3.2", servPort), 
-    "Tcp",
-    ConstantVariable(1), 
-    ConstantVariable(0));
+  ooff = CreateObjectWith<OnOffApplication> (
+                                             "Node", n0, 
+                                             "Remote", Address (InetSocketAddress ("10.1.3.2", servPort)), 
+                                             "Protocol", TypeId::LookupByName ("Tcp"),
+                                             "OnTime", ConstantVariable(1), 
+                                             "OffTime", ConstantVariable(0));
+  n0->AddApplication (ooff);
   // Start the application
   ooff->Start (Seconds(1.2));
   ooff->Stop (Seconds(1.35));
 
   // Create a packet sink to receive these TCP packets
-  sink = Create<PacketSink> (
-    n3,
-    InetSocketAddress (Ipv4Address::GetAny (), servPort),
-    "Tcp");
+  sink = CreateObjectWith<PacketSink> (
+                                       "Node", n3,
+                                       "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), servPort)),
+                                       "Protocol", TypeId::LookupByName ("Tcp"));
+  n3->AddApplication (sink);
   sink->Start (Seconds (1.2));
 
   // Here, finish off packet routing configuration
--- a/examples/tcp-large-transfer-errors.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/tcp-large-transfer-errors.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -196,10 +196,12 @@
   localSocket->Bind ();
 
   // Create a packet sink to receive these packets
-  Ptr<PacketSink> sink = Create<PacketSink> (
-    n2,
-    InetSocketAddress (Ipv4Address::GetAny (), servPort),
-    "Tcp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n2,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), servPort)),
+                                  "Protocol", TypeId::LookupByName ("Tcp"));
+  n2->AddApplication (sink);
   sink->Start (Seconds (0.0));
   sink->Stop (Seconds (10000.0));
 
--- a/examples/tcp-large-transfer.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/tcp-large-transfer.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -196,10 +196,12 @@
   localSocket->Bind ();
 
   // Create a packet sink to receive these packets
-  Ptr<PacketSink> sink = Create<PacketSink> (
-    n2,
-    InetSocketAddress (Ipv4Address::GetAny (), servPort),
-    "Tcp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n2,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), servPort)),
+                                  "Protocol", TypeId::LookupByName ("Tcp"));
+  n2->AddApplication (sink);
   sink->Start (Seconds (0.0));
   sink->Stop (Seconds (100.0));
 
--- a/examples/tcp-small-transfer-oneloss.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/tcp-small-transfer-oneloss.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -178,10 +178,12 @@
   localSocket->Bind ();
 
   // Create a packet sink to receive these packets
-  Ptr<PacketSink> sink = Create<PacketSink> (
-    n2,
-    InetSocketAddress (Ipv4Address::GetAny (), servPort),
-    "Tcp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n2,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), servPort)),
+                                  "Protocol", TypeId::LookupByName ("Tcp"));
+  n2->AddApplication (sink);
   sink->Start (Seconds (0.0));
   sink->Stop (Seconds (100.0));
 
--- a/examples/tcp-small-transfer.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/tcp-small-transfer.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -188,10 +188,12 @@
   localSocket->Bind ();
 
   // Create a packet sink to receive these packets
-  Ptr<PacketSink> sink = Create<PacketSink> (
-    n2,
-    InetSocketAddress (Ipv4Address::GetAny (), servPort),
-    "Tcp");
+  Ptr<PacketSink> sink = 
+    CreateObjectWith<PacketSink> (
+                                  "Node", n2,
+                                  "Local", Address (InetSocketAddress (Ipv4Address::GetAny (), servPort)),
+                                  "Protocol", TypeId::LookupByName ("Tcp"));
+  n2->AddApplication (sink);
   sink->Start (Seconds (0.0));
   sink->Stop (Seconds (100.0));
 
--- a/examples/udp-echo.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/examples/udp-echo.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -47,6 +47,7 @@
 #include "ns3/ipv4-route.h"
 #include "ns3/udp-echo-client.h"
 #include "ns3/udp-echo-server.h"
+#include "ns3/uinteger.h"
 
 using namespace ns3;
 
@@ -167,7 +168,9 @@
 //
   uint16_t port = 9;  // well-known echo port number
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                                               "Port", Uinteger (port));
+  n1->AddApplication (server);
 //
 // Create a UdpEchoClient application to send UDP datagrams from node zero to
 // node one.
@@ -176,8 +179,14 @@
   uint32_t maxPacketCount = 1;
   Time interPacketInterval = Seconds (1.);
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n0, "10.1.1.2", port, 
-    maxPacketCount, interPacketInterval, packetSize);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"),
+                                     "RemotePort", Uinteger (port),
+                                     "MaxPackets", Uinteger (maxPacketCount), 
+                                     "Interval", interPacketInterval, 
+                                     "PacketSize", Uinteger (packetSize));
+  n0->AddApplication (client);
 //
 // Tell the applications when to start and stop.
 //
--- a/samples/main-adhoc-wifi.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/samples/main-adhoc-wifi.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -33,6 +33,7 @@
 #include "ns3/socket-factory.h"
 #include "ns3/command-line.h"
 #include "ns3/gnuplot.h"
+#include "ns3/uinteger.h"
 
 
 #include <iostream>
@@ -122,12 +123,15 @@
   destination.SetProtocol (1);
   destination.SetSingleDevice (0);
   destination.SetPhysicalAddress (Mac48Address ("00:00:00:00:00:02"));
-  Ptr<Application> app = CreateObject<OnOffApplication> (a, destination, 
-                                                   "Packet", 
-                                                   ConstantVariable (250),
-                                                   ConstantVariable (0),
-                                                   DataRate (60000000),
-                                                   2000);
+  Ptr<Application> app = 
+    CreateObjectWith<OnOffApplication> ("Node", a, 
+                                        "Remote", Address (destination),
+                                        "Protocol", TypeId::LookupByName ("Packet"),
+                                        "OnTime", ConstantVariable (250),
+                                        "OffTime", ConstantVariable (0),
+                                        "DataRate", DataRate (60000000),
+                                        "PacketSize", Uinteger (2000));
+  a->AddApplication (app);
 
   app->Start (Seconds (0.5));
   app->Stop (Seconds (250.0));
--- a/samples/main-ap-wifi.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/samples/main-ap-wifi.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -172,10 +172,13 @@
   destination.SetProtocol (1);
   destination.SetSingleDevice (0);
   destination.SetPhysicalAddress (Mac48Address ("00:00:00:00:00:03"));
-  Ptr<Application> app = CreateObject<OnOffApplication> (b, destination, 
-                                                   "Packet", 
-                                                   ConstantVariable (42),
-                                                   ConstantVariable (0));
+  Ptr<Application> app = 
+    CreateObjectWith<OnOffApplication> ("Node", b, 
+                                        "Remote", Address (destination), 
+                                        "Protocol", TypeId::LookupByName ("Packet"),
+                                        "OnTime", ConstantVariable (42),
+                                        "OffTime", ConstantVariable (0));
+  b->AddApplication (app);
   app->Start (Seconds (0.5));
   app->Stop (Seconds (43.0));
 
--- a/src/applications/onoff/onoff-application.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/onoff/onoff-application.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -31,10 +31,11 @@
 #include "ns3/socket.h"
 #include "ns3/simulator.h"
 #include "ns3/socket-factory.h"
-#include "ns3/default-value.h"
 #include "ns3/packet.h"
-#include "ns3/composite-trace-resolver.h"
+#include "ns3/uinteger.h"
+#include "ns3/trace-source-accessor.h"
 #include "onoff-application.h"
+#include "ns3/udp.h"
 
 NS_LOG_COMPONENT_DEFINE ("OnOffApplication");
 
@@ -42,63 +43,54 @@
 
 namespace ns3 {
 
-// Defaults for rate/size
-static DataRateDefaultValue g_defaultRate ("OnOffApplicationDataRate", 
-                                           "The data rate in on state for OnOffApplication",
-                                           MakeDataRate ("500kb/s"));
-static NumericDefaultValue<uint32_t> g_defaultSize ("OnOffApplicationPacketSize", 
-                                                    "The size of packets sent in on state for OnOffApplication",
-                                                    512, 1);
-// Constructors
+NS_OBJECT_ENSURE_REGISTERED (OnOffApplication);
 
-OnOffApplication::OnOffApplication(Ptr<Node> n, 
-                                   const Address &remote,
-                                   std::string tid,
-                                   const  RandomVariable& ontime,
-                                   const  RandomVariable& offtime)
-  :  Application(n),
-     m_cbrRate (g_defaultRate.GetValue ())
+TypeId
+OnOffApplication::GetTypeId (void)
 {
-  Construct (n, remote, tid,
-             ontime, offtime, 
-             g_defaultSize.GetValue ());
+  static TypeId tid = TypeId ("OnOffApplication")
+    .SetParent<Application> ()
+    .AddConstructor<OnOffApplication> ()
+    .AddAttribute ("DataRate", "The data rate in on state.",
+                   MakeDataRate ("500kb/s"),
+                   MakeDataRateAccessor (&OnOffApplication::m_cbrRate),
+                   MakeDataRateChecker ())
+    .AddAttribute ("PacketSize", "The size of packets sent in on state",
+                   Uinteger (512),
+                   MakeUintegerAccessor (&OnOffApplication::m_pktSize),
+                   MakeUintegerChecker<uint32_t> (1))
+    .AddAttribute ("Remote", "The address of the destination",
+                   Address (),
+                   MakeAddressAccessor (&OnOffApplication::m_peer),
+                   MakeAddressChecker ())
+    .AddAttribute ("OnTime", "A RandomVariable used to pick the duration of the 'On' state.",
+                   ConstantVariable (1.0),
+                   MakeRandomVariableAccessor (&OnOffApplication::m_onTime),
+                   MakeRandomVariableChecker ())
+    .AddAttribute ("OffTime", "A RandomVariable used to pick the duration of the 'Off' state.",
+                   ConstantVariable (1.0),
+                   MakeRandomVariableAccessor (&OnOffApplication::m_offTime),
+                   MakeRandomVariableChecker ())
+    .AddAttribute ("Protocol", "The type of protocol to use.",
+                   Udp::GetTypeId (),
+                   MakeTypeIdAccessor (&OnOffApplication::m_tid),
+                   MakeTypeIdChecker ())
+    .AddTraceSource ("Tx", "A new packet is created and is sent",
+                     MakeTraceSourceAccessor (&OnOffApplication::m_txTrace))
+    ;
+  return tid;
 }
 
-OnOffApplication::OnOffApplication(Ptr<Node> n, 
-                                   const Address &remote,
-                                   std::string tid,
-                                   const  RandomVariable& ontime,
-                                   const  RandomVariable& offtime,
-                                   DataRate  rate,
-                                   uint32_t size)
-  :  Application(n),
-     m_cbrRate (rate)
+
+OnOffApplication::OnOffApplication ()
 {
   NS_LOG_FUNCTION;
-  Construct (n, remote, tid, ontime, offtime, size);
-}
-
-void
-OnOffApplication::Construct (Ptr<Node> n, 
-                             const Address &remote,
-                             std::string tid,
-                             const  RandomVariable& onTime,
-                             const  RandomVariable& offTime,
-                             uint32_t size)
-{
-  NS_LOG_FUNCTION;
-
   m_socket = 0;
-  m_peer = remote;
   m_connected = false;
-  m_onTime = onTime;
-  m_offTime = offTime;
-  m_pktSize = size;
   m_residualBits = 0;
   m_lastStartTime = Seconds (0);
   m_maxBytes = 0;
   m_totBytes = 0;
-  m_tid = tid;
 }
 
 OnOffApplication::~OnOffApplication()
@@ -114,21 +106,6 @@
   m_maxBytes = maxBytes;
 }
 
-void
-OnOffApplication::SetDefaultRate (const DataRate &rate)
-{
-  NS_LOG_FUNCTION;
-  NS_LOG_PARAMS (&rate);
-  g_defaultRate.SetValue (rate);
-}
-
-void 
-OnOffApplication::SetDefaultSize (uint32_t size)
-{
-  NS_LOG_FUNCTION;
-  NS_LOG_PARAMS (size);
-  g_defaultSize.SetValue (size);
-}
 
 void
 OnOffApplication::DoDispose (void)
@@ -148,8 +125,7 @@
   // Create the socket if not already
   if (!m_socket)
     {
-      TypeId tid = TypeId::LookupByName (m_tid);
-      Ptr<SocketFactory> socketFactory = GetNode ()->GetObject<SocketFactory> (tid);
+      Ptr<SocketFactory> socketFactory = GetNode ()->GetObject<SocketFactory> (m_tid);
       m_socket = socketFactory->CreateSocket ();
       m_socket->Bind ();
       m_socket->Connect (m_peer);
@@ -258,17 +234,4 @@
   cout << "OnOffApplication, Connection Failed" << endl;
 }
 
-Ptr<TraceResolver> 
-OnOffApplication::GetTraceResolver (void) const
-{
-  Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
-  resolver->AddSource ("tx",
-                       TraceDoc ("A new packet is created and is sent",
-                                 "Ptr<const Packet>",
-                                 "The newly-created packet."),
-                       m_txTrace);
-  resolver->SetParentResolver (Application::GetTraceResolver ());
-  return resolver;
-}
-
 } // Namespace ns3
--- a/src/applications/onoff/onoff-application.h	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/onoff/onoff-application.h	Wed Feb 27 00:05:23 2008 +0100
@@ -29,8 +29,8 @@
 #include "ns3/event-id.h"
 #include "ns3/ptr.h"
 #include "ns3/data-rate.h"
-#include "ns3/callback-trace-source.h"
 #include "ns3/random-variable.h"
+#include "ns3/traced-callback.h"
 
 namespace ns3 {
 
@@ -52,56 +52,14 @@
 class OnOffApplication : public Application 
 {
 public:
-  /**
-   * \param n node associated to this application
-   * \param remote remote ip address
-   * \param tid
-   * \param ontime on time random variable
-   * \param offtime off time random variable
-   */
-  OnOffApplication(Ptr<Node> n,
-                   const Address &remote,
-                   std::string tid,
-                   const RandomVariable& ontime,
-                   const RandomVariable& offtime);
+  static TypeId GetTypeId (void);
 
-  /**
-   * \param n node associated to this application
-   * \param remote remote ip address
-   * \param tid
-   * \param ontime on time random variable
-   * \param offtime off time random variable
-   * \param rate data rate when on
-   * \param size size of packets when sending data.
-   */
-  OnOffApplication(Ptr<Node> n,
-                   const Address &remote,
-                   std::string tid,
-                   const RandomVariable& ontime,
-                   const RandomVariable& offtime,
-                   DataRate  rate,
-                   uint32_t size);
+  OnOffApplication ();
 
   virtual ~OnOffApplication();
 
   void SetMaxBytes(uint32_t maxBytes);
 
-  /**
-   * \param r the data rate
-   *
-   * Set the data rate to use for every OnOffApplication for which
-   * the user does not specify an explicit data rate.
-   */
-  static void SetDefaultRate(const DataRate & r);
-
-  /**
-   * \param size the packet size
-   *
-   * Set the packet size to use for every OnOffApplication for
-   * which the user does not specify an explicit packet size.
-   */
-  static void SetDefaultSize (uint32_t size);
-
 protected:
   virtual void DoDispose (void);
 private:
@@ -125,8 +83,8 @@
   Ptr<Socket>     m_socket;       // Associated socket
   Address         m_peer;         // Peer address
   bool            m_connected;    // True if connected
-  RandomVariable m_onTime;       // rng for On Time
-  RandomVariable m_offTime;      // rng for Off Time
+  RandomVariable  m_onTime;       // rng for On Time
+  RandomVariable  m_offTime;      // rng for Off Time
   DataRate        m_cbrRate;      // Rate that data is generated
   uint32_t        m_pktSize;      // Size of packets
   uint32_t        m_residualBits; // Number of generated, but not sent, bits
@@ -136,11 +94,10 @@
   EventId         m_startStopEvent;     // Event id for next start or stop event
   EventId         m_sendEvent;    // Eventid of pending "send packet" event
   bool            m_sending;      // True if currently in sending state
-  std::string     m_tid;
-  CallbackTraceSource<Ptr<const Packet> > m_txTrace;
+  TypeId          m_tid;
+  TracedCallback<Ptr<const Packet> > m_txTrace;
   
 private:
-  virtual Ptr<TraceResolver> GetTraceResolver (void) const;
   void ScheduleNextTx();
   void ScheduleStartEvent();
   void ScheduleStopEvent();
--- a/src/applications/packet-sink/packet-sink.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/packet-sink/packet-sink.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -25,7 +25,8 @@
 #include "ns3/simulator.h"
 #include "ns3/socket-factory.h"
 #include "ns3/packet.h"
-#include "ns3/composite-trace-resolver.h"
+#include "ns3/trace-source-accessor.h"
+#include "ns3/udp.h"
 #include "packet-sink.h"
 
 using namespace std;
@@ -33,25 +34,30 @@
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("PacketSinkApplication");
-
-// Constructors
+NS_OBJECT_ENSURE_REGISTERED (PacketSink);
 
-PacketSink::PacketSink (Ptr<Node> n, 
-                        const Address &local,
-                        std::string tid)
-  :  Application(n)
+TypeId 
+PacketSink::GetTypeId (void)
 {
-  Construct (n, local, tid);
+  static TypeId tid = TypeId ("PacketSink")
+    .SetParent<Application> ()
+    .AddAttribute ("Local", "The Address on which to Bind the rx socket.",
+                   Address (),
+                   MakeAddressAccessor (&PacketSink::m_local),
+                   MakeAddressChecker ())
+    .AddAttribute ("Protocol", "The type id of the protocol to use for the rx socket.",
+                   Udp::GetTypeId (),
+                   MakeTypeIdAccessor (&PacketSink::m_tid),
+                   MakeTypeIdChecker ())
+    .AddTraceSource ("Rx", "A packet has been received",
+                     MakeTraceSourceAccessor (&PacketSink::m_rxTrace))
+    ;
+  return tid;
 }
 
-void
-PacketSink::Construct (Ptr<Node> n, 
-                       const Address &local,
-                       std::string tid)
+PacketSink::PacketSink ()
 {
   m_socket = 0;
-  m_local = local;
-  m_tid = tid;
 }
 
 PacketSink::~PacketSink()
@@ -73,9 +79,8 @@
   // Create the socket if not already
   if (!m_socket)
     {
-      TypeId tid = TypeId::LookupByName (m_tid);
       Ptr<SocketFactory> socketFactory = 
-        GetNode ()->GetObject<SocketFactory> (tid);
+        GetNode ()->GetObject<SocketFactory> (m_tid);
       m_socket = socketFactory->CreateSocket ();
       m_socket->Bind (m_local);
       m_socket->Listen (0);
@@ -116,19 +121,4 @@
   socket->Close ();
 }
 
-Ptr<TraceResolver> 
-PacketSink::GetTraceResolver (void) const
-{
-  Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
-  resolver->AddSource ("rx",
-                       TraceDoc ("A new packet has been received",
-                                 "Ptr<const Packet>",
-                                 "The newly-received packet.",
-                                 "const Address &",
-                                 "The source address of the received packet."),
-                       m_rxTrace);
-  resolver->SetParentResolver (Application::GetTraceResolver ());
-  return resolver;
-}
-
 } // Namespace ns3
--- a/src/applications/packet-sink/packet-sink.h	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/packet-sink/packet-sink.h	Wed Feb 27 00:05:23 2008 +0100
@@ -24,7 +24,7 @@
 #include "ns3/application.h"
 #include "ns3/event-id.h"
 #include "ns3/ptr.h"
-#include "ns3/callback-trace-source.h"
+#include "ns3/traced-callback.h"
 #include "ns3/address.h"
 
 namespace ns3 {
@@ -53,14 +53,13 @@
 class PacketSink : public Application 
 {
 public:
+  static TypeId GetTypeId (void);
   /**
    * \param n node associated to this application
    * \param local local address to bind to
    * \param tid string to identify transport protocol of interest
    */
-  PacketSink (Ptr<Node> n,
-              const Address &local,
-              std::string tid);
+  PacketSink ();
 
   virtual ~PacketSink ();
 
@@ -70,20 +69,14 @@
   // inherited from Application base class.
   virtual void StartApplication (void);    // Called at time specified by Start
   virtual void StopApplication (void);     // Called at time specified by Stop
-  // inherited from Object base class.
-  virtual Ptr<TraceResolver> GetTraceResolver (void) const;
-
-  void Construct (Ptr<Node> n,
-                  const Address &local,
-                  std::string tid);
 
   virtual void Receive (Ptr<Socket> socket, Ptr<Packet> packet, const Address& from);
   virtual void CloseConnection (Ptr<Socket> socket);
 
   Ptr<Socket>     m_socket;       // Associated socket
   Address         m_local;        // Local address to bind to
-  std::string     m_tid;          // Protocol name (e.g., "Udp")
-  CallbackTraceSource<Ptr<const Packet>, const Address &> m_rxTrace;
+  TypeId          m_tid;          // Protocol TypeId
+  TracedCallback<Ptr<const Packet>, const Address &> m_rxTrace;
   
 };
 
--- a/src/applications/udp-echo/udp-echo-client.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/udp-echo/udp-echo-client.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -23,27 +23,50 @@
 #include "ns3/simulator.h"
 #include "ns3/socket-factory.h"
 #include "ns3/packet.h"
+#include "ns3/uinteger.h"
 #include "udp-echo-client.h"
 
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("UdpEchoClientApplication");
+NS_OBJECT_ENSURE_REGISTERED (UdpEchoClient);
 
-UdpEchoClient::UdpEchoClient (
-  Ptr<Node> n,
-  Ipv4Address serverAddress,
-  uint16_t serverPort,
-  uint32_t count,
-  Time interval,
-  uint32_t size)
-: 
-  Application(n)
+TypeId
+UdpEchoClient::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("UdpEchoClient")
+    .SetParent<Application> ()
+    .AddConstructor<UdpEchoClient> ()
+    .AddAttribute ("MaxPackets", "XXX",
+                   Uinteger (100),
+                   MakeUintegerAccessor (&UdpEchoClient::m_count),
+                   MakeUintegerChecker<uint32_t> ())
+    .AddAttribute ("Interval", "XXX",
+                   Seconds (1.0),
+                   MakeTimeAccessor (&UdpEchoClient::m_interval),
+                   MakeTimeChecker ())
+    .AddAttribute ("RemoteIpv4", "XXX",
+                   Ipv4Address (),
+                   MakeIpv4AddressAccessor (&UdpEchoClient::m_peerAddress),
+                   MakeIpv4AddressChecker ())
+    .AddAttribute ("RemotePort", "XXX",
+                   Uinteger (0),
+                   MakeUintegerAccessor (&UdpEchoClient::m_peerPort),
+                   MakeUintegerChecker<uint16_t> ())
+    .AddAttribute ("PacketSize", "Size of packets generated",
+                   Uinteger (100),
+                   MakeUintegerAccessor (&UdpEchoClient::m_size),
+                   MakeUintegerChecker<uint32_t> ())
+    ;
+  return tid;
+}
+
+UdpEchoClient::UdpEchoClient ()
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAMS (this << n << serverAddress << serverPort << count
-                 << interval << size);
-
-  Construct (n, serverAddress, serverPort, count, interval, size);
+  m_sent = 0;
+  m_socket = 0;
+  m_sendEvent = EventId ();
 }
 
 UdpEchoClient::~UdpEchoClient()
@@ -52,32 +75,6 @@
 }
 
 void
-UdpEchoClient::Construct (
-  Ptr<Node> n,
-  Ipv4Address serverAddress,
-  uint16_t serverPort,
-  uint32_t count,
-  Time interval,
-  uint32_t size)
-{
-  NS_LOG_FUNCTION;
-  NS_LOG_PARAMS (this << n << serverAddress << serverPort
-                 << count << interval << size);
-
-  m_node = n;
-  m_serverAddress = serverAddress;
-  m_serverPort = serverPort;
-  m_count = count;
-  m_interval = interval;
-  m_size = size;
-
-  m_sent = 0;
-  m_socket = 0;
-  m_peer = InetSocketAddress (serverAddress, serverPort);
-  m_sendEvent = EventId ();
-}
-
-void
 UdpEchoClient::DoDispose (void)
 {
   NS_LOG_FUNCTION;
@@ -96,7 +93,7 @@
         GetNode ()->GetObject<SocketFactory> (tid);
       m_socket = socketFactory->CreateSocket ();
       m_socket->Bind ();
-      m_socket->Connect (m_peer);
+      m_socket->Connect (InetSocketAddress (m_peerAddress, m_peerPort));
     }
 
   m_socket->SetRecvCallback(MakeCallback(&UdpEchoClient::Receive, this));
@@ -136,7 +133,7 @@
   m_socket->Send (p);
   ++m_sent;
 
-  NS_LOG_INFO ("Sent " << m_size << " bytes to " << m_serverAddress);
+  NS_LOG_INFO ("Sent " << m_size << " bytes to " << m_peerAddress);
 
   if (m_sent < m_count) 
     {
--- a/src/applications/udp-echo/udp-echo-client.h	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/udp-echo/udp-echo-client.h	Wed Feb 27 00:05:23 2008 +0100
@@ -32,8 +32,9 @@
 class UdpEchoClient : public Application 
 {
 public:
-  UdpEchoClient (Ptr<Node> n, Ipv4Address serverAddr, uint16_t serverPort,
-    uint32_t count, Time interval, uint32_t size);
+  static TypeId GetTypeId (void);
+
+  UdpEchoClient ();
 
   virtual ~UdpEchoClient ();
 
@@ -41,8 +42,6 @@
   virtual void DoDispose (void);
 
 private:
-  void Construct (Ptr<Node> n, Ipv4Address serverAddr, uint16_t serverPort,
-    uint32_t count, Time interval, uint32_t size);
 
   virtual void StartApplication (void);
   virtual void StopApplication (void);
@@ -52,16 +51,14 @@
 
   void Receive(Ptr<Socket> socket, Ptr<Packet> packet, const Address &from);
 
-  Ptr<Node> m_node;
-  Ipv4Address m_serverAddress;
-  uint16_t m_serverPort;
   uint32_t m_count;
   Time m_interval;
   uint32_t m_size;
 
   uint32_t m_sent;
   Ptr<Socket> m_socket;
-  Address m_peer;
+  Ipv4Address m_peerAddress;
+  uint16_t m_peerPort;
   EventId m_sendEvent;
 
 };
--- a/src/applications/udp-echo/udp-echo-server.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/udp-echo/udp-echo-server.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -24,23 +24,32 @@
 #include "ns3/simulator.h"
 #include "ns3/socket-factory.h"
 #include "ns3/packet.h"
+#include "ns3/uinteger.h"
 
 #include "udp-echo-server.h"
 
 namespace ns3 {
 
 NS_LOG_COMPONENT_DEFINE ("UdpEchoServerApplication");
+NS_OBJECT_ENSURE_REGISTERED (UdpEchoServer);
 
-UdpEchoServer::UdpEchoServer (
-  Ptr<Node> n,
-  uint16_t port)
-: 
-  Application(n)
+TypeId
+UdpEchoServer::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("UdpEchoServer")
+    .SetParent<Application> ()
+    .AddConstructor<UdpEchoServer> ()
+    .AddAttribute ("Port", "Client Port",
+                   Uinteger (0),
+                   MakeUintegerAccessor (&UdpEchoServer::m_port),
+                   MakeUintegerChecker<uint16_t> ())
+    ;
+  return tid;
+}
+
+UdpEchoServer::UdpEchoServer ()
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAMS (this << n << port);
-
-  Construct (n, port);
 }
 
 UdpEchoServer::~UdpEchoServer()
@@ -49,21 +58,6 @@
 }
 
 void
-UdpEchoServer::Construct (
-  Ptr<Node> n,
-  uint16_t port)
-{
-  NS_LOG_FUNCTION;
-  NS_LOG_PARAMS (this << n << port);
-
-  m_node = n;
-  m_port = port;
-
-  m_socket = 0;
-  m_local = InetSocketAddress (Ipv4Address::GetAny (), port);
-}
-
-void
 UdpEchoServer::DoDispose (void)
 {
   NS_LOG_FUNCTION;
@@ -81,7 +75,8 @@
       Ptr<SocketFactory> socketFactory = 
         GetNode ()->GetObject<SocketFactory> (tid);
       m_socket = socketFactory->CreateSocket ();
-      m_socket->Bind (m_local);
+      InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), m_port);
+      m_socket->Bind (local);
     }
 
   m_socket->SetRecvCallback(MakeCallback(&UdpEchoServer::Receive, this));
--- a/src/applications/udp-echo/udp-echo-server.h	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/applications/udp-echo/udp-echo-server.h	Wed Feb 27 00:05:23 2008 +0100
@@ -32,23 +32,21 @@
 class UdpEchoServer : public Application 
 {
 public:
-  UdpEchoServer (Ptr<Node> n, uint16_t clientPort);
+  static TypeId GetTypeId (void);
+  UdpEchoServer ();
   virtual ~UdpEchoServer ();
 
 protected:
   virtual void DoDispose (void);
 
 private:
-  void Construct (Ptr<Node> n, uint16_t clientPort);
 
   virtual void StartApplication (void);
   virtual void StopApplication (void);
 
   void Receive(Ptr<Socket> socket, Ptr<Packet> packet, const Address &from);
 
-  Ptr<Node> m_node;
   uint16_t m_port;
-
   Ptr<Socket> m_socket;
   Address m_local;
 };
--- a/src/node/application.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/node/application.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -31,14 +31,26 @@
 
 namespace ns3 {
 
+NS_OBJECT_ENSURE_REGISTERED (Application);
+
 // Application Methods
 
+TypeId 
+Application::GetTypeId (void)
+{
+  static TypeId tid = TypeId ("Application")
+    .SetParent<Object> ()
+    .AddAttribute ("Node", "The on which this application resides",
+                   Ptr<Node> (0),
+                   MakePtrAccessor (&Application::m_node),
+                   MakePtrChecker<Node> ())
+    ;
+  return tid;
+}
+
 // \brief Application Constructor
-Application::Application(Ptr<Node> n) 
-    : m_node (n)
-{
-  m_node->AddApplication (this);
-}
+Application::Application()
+{}
   
 // \brief Application Destructor
 Application::~Application()
--- a/src/node/application.h	Tue Feb 26 23:27:19 2008 +0100
+++ b/src/node/application.h	Wed Feb 27 00:05:23 2008 +0100
@@ -52,7 +52,8 @@
 class Application : public Object
 {
 public:
-  Application(Ptr<Node>);
+  static TypeId GetTypeId (void);
+  Application();
   virtual ~Application();
   
   /**
--- a/tutorial/tutorial-bus-network.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-bus-network.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -21,6 +21,8 @@
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
 #include "ns3/ascii-trace.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 #include "ipv4-bus-network.h"
 
@@ -41,11 +43,19 @@
   uint32_t port = 7;
 
   Ptr<Node> n0 = bus.GetNode (0);
-  Ptr<UdpEchoClient> client =  CreateObject<UdpEchoClient> (n0, "10.1.0.1", 
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client =  
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+				     "RemoteIpv4", Ipv4Address ("10.1.0.1"),
+				     "RemotePort", Uinteger (port),
+				     "MaxPackets", Uinteger (1), 
+				     "Interval", Seconds(1.), 
+				     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
   Ptr<Node> n1 = bus.GetNode (1);
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));
--- a/tutorial/tutorial-csma-echo-ascii-trace.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-csma-echo-ascii-trace.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -27,6 +27,8 @@
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
 #include "ns3/ascii-trace.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE ("UdpEchoSimulation");
 
@@ -66,10 +68,19 @@
 
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n0, "10.1.1.2", 
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"),
+                                     "RemotePort", Uinteger (port), 
+                                     "MaxPackets", Uinteger (1), 
+                                     "Interval", Seconds(1.), 
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                     "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));
--- a/tutorial/tutorial-csma-echo-pcap-trace.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-csma-echo-pcap-trace.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -28,6 +28,8 @@
 #include "ns3/nstime.h"
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE ("UdpEchoSimulation");
 
@@ -67,10 +69,19 @@
 
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n0, "10.1.1.2",
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"),
+                                     "RemotePort", Uinteger (port), 
+                                     "MaxPackets", Uinteger (1), 
+                                     "Interval", Seconds(1.), 
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                     "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));
--- a/tutorial/tutorial-csma-echo.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-csma-echo.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -26,6 +26,8 @@
 #include "ns3/udp-echo-server.h"
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
+#include "ns3/uinteger.h"
+#include "ns3/inet-socket-address.h"
 
 NS_LOG_COMPONENT_DEFINE ("UdpEchoSimulation");
 
@@ -65,10 +67,19 @@
 
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n0, "10.1.1.2",
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"),
+                                     "RemotePort", Uinteger (port), 
+                                     "MaxPackets", Uinteger (1), 
+                                     "Interval", Seconds(1.), 
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                     "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));
--- a/tutorial/tutorial-linear-dumbbell.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-linear-dumbbell.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -32,6 +32,8 @@
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
 #include "ns3/global-route-manager.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE ("DumbbellSimulation");
 
@@ -124,19 +126,55 @@
 //
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client0 = CreateObject<UdpEchoClient> (n0, "10.1.2.1", 
-    port, 100, Seconds(.01), 1024);
-  Ptr<UdpEchoClient> client1 = CreateObject<UdpEchoClient> (n1, "10.1.2.2", 
-    port, 100, Seconds(.01), 1024);
-  Ptr<UdpEchoClient> client2 = CreateObject<UdpEchoClient> (n2, "10.1.2.3", 
-    port, 100, Seconds(.01), 1024);
-  Ptr<UdpEchoClient> client3 = CreateObject<UdpEchoClient> (n3, "10.1.2.4", 
-    port, 100, Seconds(.01), 1024);
+  Ptr<UdpEchoClient> client0 = 
+    CreateObjectWith<UdpEchoClient> (
+                                     "Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.2.1"),
+                                     "RemotePort", Uinteger (port),
+                                     "MaxPackets", Uinteger (100),
+                                     "Interval", Seconds (0.01),
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client0);
+  Ptr<UdpEchoClient> client1 = 
+    CreateObjectWith<UdpEchoClient> (
+                                     "Node", n1, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.2.2"),
+                                     "RemotePort", Uinteger (port),
+                                     "MaxPackets", Uinteger (100),
+                                     "Interval", Seconds (0.01),
+                                     "PacketSize", Uinteger (1024));
+  n1->AddApplication (client1);
+  Ptr<UdpEchoClient> client2 = 
+    CreateObjectWith<UdpEchoClient> (
+                                     "Node", n2, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.2.3"),
+                                     "RemotePort", Uinteger (port),
+                                     "MaxPackets", Uinteger (100),
+                                     "Interval", Seconds (0.01),
+                                     "PacketSize", Uinteger (1024));
+  n2->AddApplication (client2);
+  Ptr<UdpEchoClient> client3 = 
+    CreateObjectWith<UdpEchoClient> (
+                                     "Node", n3, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.2.4"),
+                                     "RemotePort", Uinteger (port),
+                                     "MaxPackets", Uinteger (100),
+                                     "Interval", Seconds (0.01),
+                                     "PacketSize", Uinteger (1024));
+  n3->AddApplication (client3);
 
-  Ptr<UdpEchoServer> server4 = CreateObject<UdpEchoServer> (n4, port);
-  Ptr<UdpEchoServer> server5 = CreateObject<UdpEchoServer> (n5, port);
-  Ptr<UdpEchoServer> server6 = CreateObject<UdpEchoServer> (n6, port);
-  Ptr<UdpEchoServer> server7 = CreateObject<UdpEchoServer> (n7, port);
+  Ptr<UdpEchoServer> server4 = 
+    CreateObjectWith<UdpEchoServer> ("Node", n4, "Port", Uinteger (port));
+  n4->AddApplication (server4);
+  Ptr<UdpEchoServer> server5 = 
+    CreateObjectWith<UdpEchoServer> ("Node", n5, "Port", Uinteger (port));
+  n5->AddApplication (server5);
+  Ptr<UdpEchoServer> server6 = 
+    CreateObjectWith<UdpEchoServer> ("Node", n6, "Port", Uinteger (port));
+  n6->AddApplication (server6);
+  Ptr<UdpEchoServer> server7 = 
+    CreateObjectWith<UdpEchoServer> ("Node", n7, "Port", Uinteger (port));
+  n7->AddApplication (server7);
 
   server4->Start(Seconds(1.));
   server5->Start(Seconds(1.));
--- a/tutorial/tutorial-point-to-point.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-point-to-point.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -28,6 +28,8 @@
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
 #include "ns3/global-route-manager.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 NS_LOG_COMPONENT_DEFINE ("PointToPointSimulation");
 
@@ -58,10 +60,19 @@
 
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n0, "10.1.1.2", 
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"), 
+                                     "RemotePort", Uinteger (port), 
+                                     "MaxPackets", Uinteger (1), 
+                                     "Interval", Seconds(1.), 
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                     "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));
--- a/tutorial/tutorial-star-routing.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-star-routing.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -27,6 +27,8 @@
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
 #include "ns3/global-route-manager.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 #include "point-to-point-ipv4-topology.h"
 
@@ -145,10 +147,19 @@
 
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n4, "10.1.1.2", 
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n4, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"),
+                                     "RemotePort", Uinteger (port), 
+                                     "MaxPackets", Uinteger (1), 
+                                     "Interval", Seconds(1.), 
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                     "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));
--- a/tutorial/tutorial-star.cc	Tue Feb 26 23:27:19 2008 +0100
+++ b/tutorial/tutorial-star.cc	Wed Feb 27 00:05:23 2008 +0100
@@ -27,6 +27,8 @@
 #include "ns3/ascii-trace.h"
 #include "ns3/pcap-trace.h"
 #include "ns3/global-route-manager.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/uinteger.h"
 
 #include "point-to-point-ipv4-topology.h"
 
@@ -145,10 +147,19 @@
 
   uint16_t port = 7;
 
-  Ptr<UdpEchoClient> client = CreateObject<UdpEchoClient> (n0, "10.1.1.2", 
-    port, 1, Seconds(1.), 1024);
+  Ptr<UdpEchoClient> client = 
+    CreateObjectWith<UdpEchoClient> ("Node", n0, 
+                                     "RemoteIpv4", Ipv4Address ("10.1.1.2"),
+                                     "RemotePort", Uinteger (port), 
+                                     "MaxPackets", Uinteger (1), 
+                                     "Interval", Seconds(1.), 
+                                     "PacketSize", Uinteger (1024));
+  n0->AddApplication (client);
 
-  Ptr<UdpEchoServer> server = CreateObject<UdpEchoServer> (n1, port);
+  Ptr<UdpEchoServer> server = 
+    CreateObjectWith<UdpEchoServer> ("Node", n1, 
+                                     "Port", Uinteger (port));
+  n1->AddApplication (server);
 
   server->Start(Seconds(1.));
   client->Start(Seconds(2.));