merge with HEAD
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 15 Nov 2007 10:18:17 +0100
changeset 2114 bfd8e5afb36d
parent 2113 40048ae9496a (current diff)
parent 1829 4a4799006fab (diff)
child 2115 4be7e10e471e
merge with HEAD
doc/doxygen.conf
src/common/wscript
src/core/default-value.cc
src/core/default-value.h
src/mobility/position.cc
src/mobility/position.h
src/mobility/random-direction-2d-mobility-model.h
src/mobility/random-position.h
src/mobility/random-walk-2d-mobility-model.h
src/mobility/random-waypoint-mobility-model.h
src/mobility/speed.cc
src/mobility/speed.h
src/simulator/time.cc
--- a/doc/doxygen.conf	Thu Nov 15 09:44:23 2007 +0100
+++ b/doc/doxygen.conf	Thu Nov 15 10:18:17 2007 +0100
@@ -496,7 +496,7 @@
 INPUT                  = src \
                          doc/main.txt \
                          doc/introspected-doxygen.h \
-                         doc/tracing.h \
+                         doc/tracing.h
 
 # This tag can be used to specify the character encoding of the source files that 
 # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
--- a/doc/main.txt	Thu Nov 15 09:44:23 2007 +0100
+++ b/doc/main.txt	Thu Nov 15 10:18:17 2007 +0100
@@ -18,7 +18,7 @@
  *    - a Functor class: ns3::Callback
  *    - an os-independent interface to get access to the elapsed wall clock time: ns3::SystemWallClockMs
  *    - a class to register regression tests with the test manager: ns3::Test and ns3::TestManager
- *    - debugging facilities: \ref debugging, \ref assert, \ref error
+ *    - debugging facilities: \ref logging, \ref assert, \ref error
  *    - \ref randomvariable
  *    - \ref config
  *    - a base class for objects which need to support reference counting 
--- a/doc/tracing.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/doc/tracing.h	Thu Nov 15 10:18:17 2007 +0100
@@ -497,6 +497,8 @@
  *   };
  *   // called from MyModel::GetTraceResolver
  *   MyModelTraceType (enum Type type);
+ *   // needed for by the tracing subsystem.
+ *   MyModelTraceType ();
  *   // called from trace sink
  *   enum Type Get (void) const;
  *   // needed by the tracing subsystem
@@ -513,10 +515,14 @@
  * \endcode
  * The implementation does not require much thinking:
  * \code
+ * MyModelTraceType::MyModelTraceType ()
+ *  : m_type (RX)
+ * {// an arbitrary default value.
+ * }
  * MyModelTraceType::MyModelTraceType (enum Type type)
  *  : m_type (type)
  * {}
- * enum Type 
+ * enum MyModelTraceType::Type 
  * MyModelTraceType::Get (void) const
  * {
  *   return m_type;
@@ -531,14 +537,14 @@
  * }
  * void 
  * MyModelTraceType::Print (std::ostream &os) const
- * (
+ * {
  *   // this method is invoked by the print function of a TraceContext
  *   // if it contains an instance of this TraceContextElement.
  *   switch (m_type) {
  *     case RX: os << "rx"; break;
  *     // ...
  *   }
- * )
+ * }
  * std::string 
  * MyModelTraceType::GetTypeName (void) const
  * {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/simple-error-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -0,0 +1,240 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * ns-2 simple.tcl script (ported from ns-2)
+ * Originally authored by Steve McCanne, 12/19/1996
+ */
+
+// Port of ns-2/tcl/ex/simple.tcl to ns-3
+//
+// Network topology
+//
+//  n0
+//     \ 5 Mb/s, 2ms
+//      \          1.5Mb/s, 10ms
+//       n2 -------------------------n3
+//      /
+//     / 5 Mb/s, 2ms
+//   n1
+//
+// - all links are point-to-point links with indicated one-way BW/delay
+// - CBR/UDP flows from n0 to n3, and from n3 to n1
+// - FTP/TCP flow from n0 to n3, starting at time 1.2 to time 1.35 sec.
+// - UDP packet size of 210 bytes, with per-packet interval 0.00375 sec.
+//   (i.e., DataRate of 448,000 bps)
+// - DropTail queues 
+// - Tracing of queues and packet receptions to file 
+//   "simple-error-model.tr"
+
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/command-line.h"
+#include "ns3/default-value.h"
+#include "ns3/ptr.h"
+
+#include "ns3/simulator.h"
+#include "ns3/nstime.h"
+#include "ns3/data-rate.h"
+
+#include "ns3/ascii-trace.h"
+#include "ns3/pcap-trace.h"
+#include "ns3/internet-node.h"
+#include "ns3/default-value.h"
+#include "ns3/component-manager.h"
+#include "ns3/random-variable.h"
+#include "ns3/point-to-point-channel.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/ipv4.h"
+#include "ns3/socket.h"
+#include "ns3/ipv4-route.h"
+#include "ns3/point-to-point-topology.h"
+#include "ns3/onoff-application.h"
+#include "ns3/packet-sink.h"
+#include "ns3/error-model.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("SimpleErrorModelExample");
+
+int 
+main (int argc, char *argv[])
+{
+  // Users may find it convenient to turn on explicit debugging
+  // for selected modules; the below lines suggest how to do this
+#if 0 
+  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");
+
+
+  // Allow the user to override any of the defaults and the above
+  // Bind()s at run-time, via command-line arguments
+  CommandLine::Parse (argc, argv);
+
+  // Here, we will explicitly create four nodes.  In more sophisticated
+  // topologies, we could configure a node factory.
+  NS_LOG_INFO ("Create nodes.");
+  Ptr<Node> n0 = Create<InternetNode> ();
+  Ptr<Node> n1 = Create<InternetNode> (); 
+  Ptr<Node> n2 = Create<InternetNode> (); 
+  Ptr<Node> n3 = Create<InternetNode> ();
+
+  // We create the channels first without any IP addressing information
+  NS_LOG_INFO ("Create channels.");
+  Ptr<PointToPointChannel> channel0 = 
+    PointToPointTopology::AddPointToPointLink (
+      n0, n2, DataRate(5000000), MilliSeconds(2));
+
+  Ptr<PointToPointChannel> channel1 = 
+    PointToPointTopology::AddPointToPointLink (
+      n1, n2, DataRate(5000000), MilliSeconds(2));
+  
+  Ptr<PointToPointChannel> channel2 = 
+    PointToPointTopology::AddPointToPointLink (
+      n2, n3, DataRate(1500000), MilliSeconds(10));
+  
+  // Later, we add IP addresses.  
+  NS_LOG_INFO ("Assign IP Addresses.");
+  PointToPointTopology::AddIpv4Addresses (
+      channel0, n0, Ipv4Address("10.1.1.1"),
+      n2, Ipv4Address("10.1.1.2"));
+  
+  PointToPointTopology::AddIpv4Addresses (
+      channel1, n1, Ipv4Address("10.1.2.1"),
+      n2, Ipv4Address("10.1.2.2"));
+  
+  PointToPointTopology::AddIpv4Addresses (
+      channel2, n2, Ipv4Address("10.1.3.1"),
+      n3, Ipv4Address("10.1.3.2"));
+
+  // Finally, we add static routes.  These three steps (Channel and
+  // NetDevice creation, IP Address assignment, and routing) are 
+  // separated because there may be a need to postpone IP Address
+  // assignment (emulation) or modify to use dynamic routing
+  NS_LOG_INFO ("Add Static Routes.");
+  PointToPointTopology::AddIpv4Routes(n0, n2, channel0);
+  PointToPointTopology::AddIpv4Routes(n1, n2, channel1);
+  PointToPointTopology::AddIpv4Routes(n2, n3, channel2);
+
+  // Create the OnOff application to send UDP datagrams of size
+  // 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 = Create<OnOffApplication> (
+    n0, 
+    InetSocketAddress ("10.1.3.2", port), 
+    "Udp",
+    ConstantVariable(1), 
+    ConstantVariable(0));
+  // 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 = Create<PacketSink> (
+    n3,
+    InetSocketAddress (Ipv4Address::GetAny (), port),
+    "Udp");
+  // 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 = Create<OnOffApplication> (
+    n3, 
+    InetSocketAddress ("10.1.2.1", port), 
+    "Udp",
+    ConstantVariable(1), 
+    ConstantVariable(0));
+  // Start the application
+  ooff->Start(Seconds(1.1));
+  ooff->Stop (Seconds(10.0));
+
+  // Create a packet sink to receive these packets
+  sink = Create<PacketSink> (
+    n1,
+    InetSocketAddress (Ipv4Address::GetAny (), port),
+    "Udp");
+  // Start the sink
+  sink->Start (Seconds (1.1));
+  sink->Stop (Seconds (10.0));
+
+  // Here, finish off packet routing configuration
+  // This will likely set by some global StaticRouting object in the future
+  NS_LOG_INFO ("Set Default Routes.");
+  Ptr<Ipv4> ipv4;
+  ipv4 = n0->QueryInterface<Ipv4> (Ipv4::iid);
+  ipv4->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1);
+  ipv4 = n3->QueryInterface<Ipv4> (Ipv4::iid);
+  ipv4->SetDefaultRoute (Ipv4Address ("10.1.3.1"), 1);
+
+  //
+  // Error model
+  //
+  // We want to add an error model to node 3's NetDevice
+  // We can obtain a handle to the NetDevice via the channel and node 
+  // pointers
+  Ptr<PointToPointNetDevice> nd3 = PointToPointTopology::GetNetDevice
+    (n3, channel2);
+  // Create an ErrorModel based on the implementation (constructor)
+  // specified by the default classId
+  Ptr<ErrorModel> em = ErrorModel::CreateDefault ();
+  NS_ASSERT (em != 0);
+  // Now, query interface on the resulting em pointer to see if a 
+  // RateErrorModel interface exists.  If so, set the packet error rate
+  Ptr<RateErrorModel> bem = em->QueryInterface<RateErrorModel> 
+    (RateErrorModel::iid);
+  if (bem)
+    { 
+      bem->SetRandomVariable (UniformVariable ());
+      bem->SetRate (0.001);
+    }
+  nd3->AddReceiveErrorModel (em);
+
+  // Now, let's use the ListErrorModel and explicitly force a loss
+  // of the packets with pkt-uids = 11 and 17 on node 2, device 0
+  Ptr<PointToPointNetDevice> nd2 = PointToPointTopology::GetNetDevice
+    (n2, channel0);
+  std::list<uint32_t> sampleList;
+  sampleList.push_back (11);
+  sampleList.push_back (17);
+  // This time, we'll explicitly create the error model we want
+  Ptr<ListErrorModel> pem = Create<ListErrorModel> ();
+  pem->SetList (sampleList);
+  nd2->AddReceiveErrorModel (pem);
+
+  // Configure tracing of all enqueue, dequeue, and NetDevice receive events
+  // Trace output will be sent to the simple-error-model.tr file
+  NS_LOG_INFO ("Configure Tracing.");
+  AsciiTrace asciitrace ("simple-error-model.tr");
+  asciitrace.TraceAllQueues ();
+  asciitrace.TraceAllNetDeviceRx ();
+
+  NS_LOG_INFO ("Run Simulation.");
+  Simulator::Run ();    
+  Simulator::Destroy ();
+  NS_LOG_INFO ("Done.");
+}
--- a/examples/wscript	Thu Nov 15 09:44:23 2007 +0100
+++ b/examples/wscript	Thu Nov 15 10:18:17 2007 +0100
@@ -14,6 +14,10 @@
         ['point-to-point', 'internet-node'])
     obj.source = 'simple-point-to-point.cc'
 
+    obj = bld.create_ns3_program('simple-error-model',
+        ['point-to-point', 'internet-node'])
+    obj.source = 'simple-error-model.cc'
+
     obj = bld.create_ns3_program('csma-one-subnet',
         ['csma', 'internet-node'])
     obj.source = 'csma-one-subnet.cc'
--- a/samples/main-channel.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/samples/main-channel.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -73,7 +73,7 @@
 FakeInternetNode::UpperDoSendUp (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
   NS_LOG_INFO ("**** Receive inbound packet");
   m_dtqInbound.Enqueue(p);
   return m_dtqInbound.Dequeue(p);
@@ -83,7 +83,7 @@
 FakeInternetNode::UpperDoPull (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   return m_dtqOutbound.Dequeue(p);
 }
@@ -142,7 +142,7 @@
 FakePhysicalLayer::UpperDoSendUp (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   NS_ASSERT(m_upperPartner);
   return m_upperPartner->UpperSendUp(p);
@@ -152,7 +152,7 @@
 FakePhysicalLayer::UpperDoPull (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   return m_dtqOutbound.Dequeue(p);
 }
--- a/samples/main-grid-topology.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/samples/main-grid-topology.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -41,7 +41,7 @@
       Ptr<Object> object = *j;
       Ptr<MobilityModel> position = object->QueryInterface<MobilityModel> (MobilityModel::iid);
       NS_ASSERT (position != 0);
-      Position pos = position->Get ();
+      Vector pos = position->GetPosition ();
       std::cout << "x=" << pos.x << ", y=" << pos.y << ", z=" << pos.z << std::endl;
     }
 
--- a/samples/main-random-topology.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/samples/main-random-topology.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -17,7 +17,7 @@
 static void 
 CourseChange (const TraceContext &context, Ptr<const MobilityModel> position)
 {
-  Position pos = position->Get ();
+  Vector pos = position->GetPosition ();
   std::cout << Simulator::Now () << ", pos=" << position << ", x=" << pos.x << ", y=" << pos.y
             << ", z=" << pos.z << std::endl;
 }
--- a/samples/main-random-walk.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/samples/main-random-walk.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -18,11 +18,11 @@
 static void 
 CourseChange (ns3::TraceContext const&, Ptr<const MobilityModel> mobility)
 {
-  Position pos = mobility->Get ();
-  Speed vel = mobility->GetSpeed ();
+  Vector pos = mobility->GetPosition ();
+  Vector vel = mobility->GetVelocity ();
   std::cout << Simulator::Now () << ", model=" << mobility << ", POS: x=" << pos.x << ", y=" << pos.y
-            << ", z=" << pos.z << "; VEL:" << vel.dx << ", y=" << vel.dy
-            << ", z=" << vel.dz << std::endl;
+            << ", z=" << pos.z << "; VEL:" << vel.x << ", y=" << vel.y
+            << ", z=" << vel.z << std::endl;
 }
 
 int main (int argc, char *argv[])
--- a/src/applications/onoff/onoff-application.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/applications/onoff/onoff-application.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -109,7 +109,7 @@
 OnOffApplication::SetMaxBytes(uint32_t maxBytes)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << maxBytes << ")");
+  NS_LOG_PARAMS (this << maxBytes);
   m_maxBytes = maxBytes;
 }
 
@@ -117,7 +117,7 @@
 OnOffApplication::SetDefaultRate (const DataRate &rate)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &rate << ")");
+  NS_LOG_PARAMS (&rate);
   g_defaultRate.SetValue (rate);
 }
 
@@ -125,7 +125,7 @@
 OnOffApplication::SetDefaultSize (uint32_t size)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << size << ")");
+  NS_LOG_PARAMS (size);
   g_defaultSize.SetValue (size);
 }
 
--- a/src/applications/udp-echo/udp-echo-client.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/applications/udp-echo/udp-echo-client.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -40,9 +40,8 @@
   Application(n)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << n << ", " << serverAddress <<
-    ", " << serverPort << ", " << count << ", " << interval <<
-    ", " << size << ")");
+  NS_LOG_PARAMS (this << n << serverAddress << serverPort << count
+                 << interval << size);
 
   Construct (n, serverAddress, serverPort, count, interval, size);
 }
@@ -62,9 +61,8 @@
   uint32_t size)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << n << ", " << serverAddress <<
-    ", " << serverPort << ", " << count << ", " << interval <<
-    ", " << size << ")");
+  NS_LOG_PARAMS (this << n << serverAddress << serverPort
+                 << count << interval << size);
 
   m_node = n;
   m_serverAddress = serverAddress;
@@ -154,7 +152,7 @@
   const Address &from) 
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << socket << ", " << packet << ", " << from << ")");
+  NS_LOG_PARAMS (this << socket << packet << from);
 
   if (InetSocketAddress::IsMatchingType (from))
     {
--- a/src/applications/udp-echo/udp-echo-server.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/applications/udp-echo/udp-echo-server.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -38,7 +38,7 @@
   Application(n)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << n << ", " << port << ")");
+  NS_LOG_PARAMS (this << n << port);
 
   Construct (n, port);
 }
@@ -54,7 +54,7 @@
   uint16_t port)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << n << ", " << port << ")");
+  NS_LOG_PARAMS (this << n << port);
 
   m_node = n;
   m_port = port;
@@ -106,7 +106,7 @@
   const Address &from) 
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << socket << ", " << packet << ", " << from << ")");
+  NS_LOG_PARAMS (this << socket << packet << from);
 
   if (InetSocketAddress::IsMatchingType (from))
     {
--- a/src/common/data-rate.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/common/data-rate.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -145,32 +145,32 @@
   return v;
 }
 
-bool DataRate::operator < (const DataRate& rhs)
+bool DataRate::operator < (const DataRate& rhs) const
 {
 	return m_bps<rhs.m_bps;
 }
 
-bool DataRate::operator <= (const DataRate& rhs)
+bool DataRate::operator <= (const DataRate& rhs) const
 {
 	return m_bps<=rhs.m_bps;
 }
 
-bool DataRate::operator >  (const DataRate& rhs)
+bool DataRate::operator >  (const DataRate& rhs) const
 {
 	return m_bps>rhs.m_bps;
 }
 
-bool DataRate::operator >= (const DataRate& rhs)
+bool DataRate::operator >= (const DataRate& rhs) const
 {
 	return m_bps>=rhs.m_bps;
 }
 
-bool DataRate::operator == (const DataRate& rhs)
+bool DataRate::operator == (const DataRate& rhs) const
 {
 	return m_bps==rhs.m_bps;
 }
 
-bool DataRate::operator != (const DataRate& rhs)
+bool DataRate::operator != (const DataRate& rhs) const
 {
 	return m_bps!=rhs.m_bps;
 }
--- a/src/common/data-rate.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/common/data-rate.h	Thu Nov 15 10:18:17 2007 +0100
@@ -72,12 +72,12 @@
    */
   DataRate (const std::string s);
   
-  bool operator <  (const DataRate& rhs);
-  bool operator <= (const DataRate& rhs);
-  bool operator >  (const DataRate& rhs);
-  bool operator >= (const DataRate& rhs);
-  bool operator == (const DataRate& rhs);
-  bool operator != (const DataRate& rhs);
+  bool operator <  (const DataRate& rhs) const;
+  bool operator <= (const DataRate& rhs) const;
+  bool operator >  (const DataRate& rhs) const;
+  bool operator >= (const DataRate& rhs) const;
+  bool operator == (const DataRate& rhs) const;
+  bool operator != (const DataRate& rhs) const;
   
   /**
    * \brief Calculate transmission time
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/common/error-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -0,0 +1,300 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tom Henderson <tomhend@u.washington.edu>
+ * This code has been ported from ns-2 (queue/errmodel.{cc,h}
+ */
+
+#include <math.h>
+
+#include "error-model.h"
+
+#include "ns3/packet.h"
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/random-variable.h"
+#include "ns3/default-value.h"
+
+NS_LOG_COMPONENT_DEFINE ("ErrorModel");
+
+namespace ns3 {
+
+static ClassIdDefaultValue g_classIdErrorModelDefaultValue ("ErrorModel",
+  "Error Model", ErrorModel::iid, "RateErrorModel");
+
+const InterfaceId ErrorModel::iid = 
+  MakeInterfaceId ("ErrorModel", Object::iid);
+
+ErrorModel::ErrorModel () :
+  m_enable (true) 
+{
+  NS_LOG_FUNCTION;  
+  SetInterfaceId (ErrorModel::iid);
+}
+
+ErrorModel::~ErrorModel ()
+{
+  NS_LOG_FUNCTION;  
+}
+
+Ptr<ErrorModel>
+ErrorModel::CreateDefault (void)
+{ 
+  NS_LOG_FUNCTION;
+  ClassId classId = g_classIdErrorModelDefaultValue.GetValue ();
+  Ptr<ErrorModel> em = ComponentManager::Create<ErrorModel> (classId, 
+    ErrorModel::iid);
+  return em;
+}
+
+bool
+ErrorModel::IsCorrupt (Packet& p)
+{
+  NS_LOG_FUNCTION;
+  bool result;
+  // Insert any pre-conditions here
+  result = DoCorrupt (p);
+  // Insert any post-conditions here
+  return result;
+}
+
+void
+ErrorModel::Reset (void)
+{
+  NS_LOG_FUNCTION;  
+  DoReset ();
+}
+
+void
+ErrorModel::Enable (void)
+{
+  NS_LOG_FUNCTION;  
+  m_enable = true;
+}
+
+void
+ErrorModel::Disable (void)
+{
+  NS_LOG_FUNCTION;  
+  m_enable = false;
+}
+
+bool
+ErrorModel::IsEnabled (void) const
+{
+  NS_LOG_FUNCTION;  
+  return m_enable;
+}
+
+//
+// RateErrorModel
+//
+
+const InterfaceId RateErrorModel::iid = 
+  MakeInterfaceId ("RateErrorModel", ErrorModel::iid);
+
+const ClassId RateErrorModel::cid =
+  MakeClassId<RateErrorModel> ("RateErrorModel", ErrorModel::iid,
+  RateErrorModel::iid);
+
+// Defaults for rate/size
+static NumericDefaultValue<double> g_defaultRateErrorModelErrorRate
+  ("RateErrorModelErrorRate", "The error rate for the error model", 0.0);
+
+static EnumDefaultValue<enum ErrorUnit> 
+ g_defaultRateErrorModelErrorUnit ("RateErrorModelErrorUnit", 
+ "The error unit for this error model",
+    EU_BYTE, "EU_BYTE",
+    EU_PKT, "EU_PKT",
+    EU_BIT, "EU_BIT", 
+    0, (void*)0);
+
+RateErrorModel::RateErrorModel () : 
+  m_unit (g_defaultRateErrorModelErrorUnit.GetValue() ),
+  m_rate (g_defaultRateErrorModelErrorRate.GetValue() )
+{
+  NS_LOG_FUNCTION;
+  // Assume a uniform random variable if user does not specify
+  m_ranvar = new UniformVariable ();
+  SetInterfaceId (RateErrorModel::iid);
+}
+
+RateErrorModel::~RateErrorModel () 
+{
+  NS_LOG_FUNCTION;
+  delete m_ranvar;
+}
+
+enum ErrorUnit 
+RateErrorModel::GetUnit (void) const 
+{ 
+  NS_LOG_FUNCTION;
+  return m_unit; 
+}
+
+void 
+RateErrorModel::SetUnit (enum ErrorUnit error_unit) 
+{ 
+  NS_LOG_FUNCTION;
+  m_unit = error_unit; 
+}
+
+double
+RateErrorModel::GetRate (void) const 
+{ 
+  NS_LOG_FUNCTION;
+  return m_rate; 
+}
+
+void 
+RateErrorModel::SetRate (double rate)
+{ 
+  NS_LOG_FUNCTION;
+  m_rate = rate;
+}
+
+void 
+RateErrorModel::SetRandomVariable (const RandomVariable &ranvar)
+{
+  NS_LOG_FUNCTION;
+  delete m_ranvar;
+  m_ranvar = ranvar.Copy ();
+}
+
+bool 
+RateErrorModel::DoCorrupt (Packet& p) 
+{ 
+  NS_LOG_FUNCTION;
+  if (!m_enable)
+    {
+      return false;  
+    }
+  switch (m_unit) 
+    {
+    case EU_PKT:
+      return DoCorruptPkt (p);
+    case EU_BYTE:
+      return DoCorruptByte (p);
+    case EU_BIT:
+      return DoCorruptBit (p);
+    default:
+      NS_ASSERT_MSG (false, "m_unit not supported yet");
+      break;
+    }
+  return false;
+}
+
+bool
+RateErrorModel::DoCorruptPkt (Packet& p)
+{
+  NS_LOG_FUNCTION;
+  return (m_ranvar->GetValue () < m_rate);
+}
+
+bool
+RateErrorModel::DoCorruptByte (Packet& p)
+{
+  NS_LOG_FUNCTION;
+  // compute pkt error rate, assume uniformly distributed byte error
+  double per = 1 - pow (1.0 - m_rate, p.GetSize ());
+  return (m_ranvar->GetValue () < per);
+}
+
+bool
+RateErrorModel::DoCorruptBit(Packet& p)
+{
+  NS_LOG_FUNCTION;
+  // compute pkt error rate, assume uniformly distributed bit error
+  double per = 1 - pow (1.0 - m_rate, (8 * p.GetSize ()) );
+  return (m_ranvar->GetValue () < per);
+}
+
+void 
+RateErrorModel::DoReset (void) 
+{ 
+  NS_LOG_FUNCTION;
+  /* re-initialize any state; no-op for now */ 
+}
+
+//
+// ListErrorModel
+//
+
+const InterfaceId ListErrorModel::iid = 
+  MakeInterfaceId ("ListErrorModel", ErrorModel::iid);
+
+const ClassId ListErrorModel::cid =
+  MakeClassId<ListErrorModel> ("ListErrorModel", ErrorModel::iid,
+  ListErrorModel::iid);
+
+ListErrorModel::ListErrorModel ()  
+{
+  NS_LOG_FUNCTION;
+  SetInterfaceId (ListErrorModel::iid);
+}
+
+ListErrorModel::~ListErrorModel () 
+{
+  NS_LOG_FUNCTION;
+}
+
+std::list<uint32_t> 
+ListErrorModel::GetList (void) const 
+{ 
+  NS_LOG_FUNCTION;
+  return m_packetList; 
+}
+
+void 
+ListErrorModel::SetList (const std::list<uint32_t> &packetlist)
+{ 
+  NS_LOG_FUNCTION;
+  m_packetList = packetlist;
+}
+
+// When performance becomes a concern, the list provided could be 
+// converted to a dynamically-sized array of uint32_t to avoid 
+// list iteration below.
+bool 
+ListErrorModel::DoCorrupt (Packet& p) 
+{ 
+  NS_LOG_FUNCTION;
+  if (!m_enable)
+    {
+      return false;  
+    }
+  uint32_t uid = p.GetUid ();
+  for (PacketListCI i = m_packetList.begin (); 
+    i != m_packetList.end (); i++) 
+    {
+      if (uid == *i)
+      {
+        return true;
+      }
+    }
+  return false;
+}
+
+void 
+ListErrorModel::DoReset (void) 
+{ 
+  NS_LOG_FUNCTION;
+  m_packetList.clear();
+}
+
+
+} //namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/common/error-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -0,0 +1,236 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 University of Washington
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Tom Henderson <tomhend@u.washington.edu>
+ * This code has been ported from ns-2 (queue/errmodel.{cc,h}
+ */
+#ifndef ERROR_MODEL_H
+#define ERROR_MODEL_H
+
+#include <list>
+#include "ns3/object.h"
+#include "ns3/component-manager.h"
+
+namespace ns3 {
+
+class Packet;
+class RandomVariable;
+
+/**
+ * \brief General error model that can be used to corrupt packets
+ *
+ * This object is used to flag packets as being lost/errored or not.
+ * It is part of the Object framework and can be aggregated to 
+ * other ns3 objects and handled by the Ptr class.
+ *
+ * The main method is IsCorrupt(Packet& p) which returns true if 
+ * the packet is to be corrupted according to the underlying model.
+ * Depending on the error model, the packet itself may have its packet
+ * data buffer errored or not, or side information may be returned to
+ * the client in the form of a packet tag.
+ * The object can have state (resettable by Reset()).  
+ * The object can also be enabled and disabled via two public member functions.
+ * 
+ * Typical code (simplified) to use an ErrorModel may look something like 
+ * this:
+ * \code 
+ * Ptr<ErrorModel> rem = Create<RateErrorModel> ();
+ * rem->SetRandomVariable (UniformVariable ());
+ * rem->SetRate (0.001);
+ * ...
+ * Packet p;
+ * if (rem->IsCorrupt (p))
+ *   {
+ *     dropTrace(p);
+ *   } else {
+ *     Forward (p);
+ *   }
+ * \endcode
+ *
+ * Two practical error models, a ListErrorModel and a RateErrorModel,  
+ * are currently implemented. 
+ */
+class ErrorModel : public Object
+{
+public:
+  static const InterfaceId iid;
+  /**
+   * A factory method to generate a preconfigured default ErrorModel for use
+   * \return an ErrorModel smart pointer that is the default ErrorModel 
+   * type defined
+   */
+  static Ptr<ErrorModel> CreateDefault (void);
+  
+  ErrorModel ();
+  virtual ~ErrorModel ();
+
+ /**
+  * \returns true if the Packet is to be considered as errored/corrupted
+  * \param pkt Packet to apply error model to
+  */
+  bool IsCorrupt (Packet& pkt);
+ /**
+  * Reset any state associated with the error model
+  */
+  void Reset (void);
+ /**
+  * Enable the error model
+  */
+  void Enable (void);
+ /**
+  * Disable the error model
+  */
+  void Disable (void);
+  /**
+   * \return true if error model is enabled; false otherwise
+   */
+  bool IsEnabled (void) const;
+
+protected:
+  bool m_enable;
+
+private:
+  /*
+   * These methods must be implemented by subclasses
+   */
+  virtual bool DoCorrupt (Packet&) = 0;
+  virtual void DoReset (void) = 0;
+
+};
+
+enum ErrorUnit
+  {   
+    EU_BIT,
+    EU_BYTE,
+    EU_PKT
+  };
+
+/**
+ * \brief Determine which packets are errored corresponding to an underlying
+ * distribution, rate, and unit.
+ *
+ * This object is used to flag packets as being lost/errored or not.
+ * The two parameters that govern the behavior are the rate (or
+ * equivalently, the mean duration/spacing between errors), and the
+ * unit (which may be per-bit, per-byte, and per-packet).
+ * Users can optionally provide a RandomVariable object; the default
+ * is to use a Uniform(0,1) distribution.
+
+ * Reset() on this model will do nothing
+ *
+ * IsCorrupt() will not modify the packet data buffer
+ */
+class RateErrorModel : public ErrorModel
+{
+public:
+  static const InterfaceId iid;
+  static const ClassId cid;
+
+  RateErrorModel ();
+  virtual ~RateErrorModel ();
+
+  /**
+   * \returns the ErrorUnit being used by the underlying model
+   */ 
+  enum ErrorUnit GetUnit (void) const;
+  /**
+   * \param error_unit the ErrorUnit to be used by the underlying model
+   */ 
+  void SetUnit (enum ErrorUnit error_unit);
+
+  /**
+   * \returns the error rate being applied by the model
+   */ 
+  double GetRate (void) const;
+  /**
+   * \param rate the error rate to be used by the model
+   */ 
+  void SetRate (double rate);
+
+  /**
+   * \param ranvar A random variable distribution to generate random variates
+   */ 
+  void SetRandomVariable (const RandomVariable &ranvar);
+
+private:
+  virtual bool DoCorrupt (Packet& p);
+  virtual bool DoCorruptPkt (Packet& p);
+  virtual bool DoCorruptByte (Packet& p);
+  virtual bool DoCorruptBit (Packet& p);
+  virtual void DoReset (void);
+
+  enum ErrorUnit m_unit;
+  double m_rate;
+
+  RandomVariable* m_ranvar;
+};
+
+/**
+ * \brief Provide a list of Packet uids to corrupt
+ *
+ * This object is used to flag packets as being lost/errored or not.
+ * A note on performance:  the list is assumed to be unordered, and
+ * in general, Packet uids received may be unordered.  Therefore,
+ * each call to IsCorrupt() will result in a walk of the list with
+ * the present underlying implementation.
+ * 
+ * Note also that if one wants to target multiple packets from looking
+ * at an (unerrored) trace file, the act of erroring a given packet may
+ * cause subsequent packet uids to change.  For instance, suppose one wants 
+ * to error packets 11 and 17 on a given device.  It may be that erroring
+ * packet 11 will cause the subsequent uid stream to change and 17 may no
+ * longer correspond to the second packet that one wants to lose.  Therefore,
+ * be advised that it might take some trial and error to select the
+ * right uids when multiple are provided.
+ * 
+ * Reset() on this model will clear the list
+ *
+ * IsCorrupt() will not modify the packet data buffer
+ */
+class ListErrorModel : public ErrorModel
+{
+public:
+  static const InterfaceId iid;
+  static const ClassId cid;
+  ListErrorModel ();
+  virtual ~ListErrorModel ();
+
+  /**
+   * \return a copy of the underlying list
+   */
+  std::list<uint32_t> GetList (void) const;
+  /**
+   * \param packetlist The list of packet uids to error.
+   *
+   * This method overwrites any previously provided list.
+   */
+  void SetList (const std::list<uint32_t> &packetlist);
+
+private:
+  virtual bool DoCorrupt (Packet& p);
+  virtual void DoReset (void);
+
+  typedef std::list<uint32_t> PacketList;
+  typedef std::list<uint32_t>::const_iterator PacketListCI;
+
+  PacketList m_packetList;
+  
+};
+
+
+} //namespace ns3
+#endif
--- a/src/common/packet-metadata.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/common/packet-metadata.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -703,7 +703,7 @@
       m_metadataSkipped = true;
       return;
     }
-  NS_LOG_PARAM ("(uid=" << uid << ", size=" << size << ")");
+  NS_LOG_PARAMS ("(uid=" << uid << ", size=" << size << ")");
 
   struct PacketMetadata::SmallItem item;
   item.next = m_head;
@@ -723,7 +723,7 @@
       m_metadataSkipped = true;
       return;
     }
-  NS_LOG_PARAM ("(uid=" << uid << ", size=" << size << ")");
+  NS_LOG_PARAMS ("(uid=" << uid << ", size=" << size << ")");
   struct PacketMetadata::SmallItem item;
   struct PacketMetadata::ExtraItem extraItem;
   uint32_t read = ReadItems (m_head, &item, &extraItem);
--- a/src/common/wscript	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/common/wscript	Thu Nov 15 10:18:17 2007 +0100
@@ -14,6 +14,7 @@
         'pcap-writer.cc',
         'data-rate.cc',
         'gnuplot.cc',
+        'error-model.cc',
         ]
 
     headers = bld.create_obj('ns3header')
@@ -31,4 +32,5 @@
         'pcap-writer.h',
         'data-rate.h',
         'gnuplot.h',
+        'error-model.h',
         ]
--- a/src/core/default-value.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/core/default-value.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -461,7 +461,7 @@
   DefaultValue::Bind ("test-c", "257");  
   NumericDefaultValue<float> x ("test-x", "help-x", 10.0);
   NumericDefaultValue<double> y ("test-y", "help-y", 10.0);
-
+  DefaultValue::Bind ("test-y", "-3");  
 
   EnumDefaultValue<enum MyEnum> e ("test-e", "help-e",
 				   MY_ENUM_C, "C",
--- a/src/core/default-value.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/core/default-value.h	Thu Nov 15 10:18:17 2007 +0100
@@ -219,6 +219,7 @@
   virtual bool DoParseValue (const std::string &value);
   virtual std::string DoGetType (void) const;
   virtual std::string DoGetDefaultValue (void) const;
+  T RealMin (void) const;
   T m_defaultValue;
   T m_minValue;
   T m_maxValue;
@@ -413,7 +414,7 @@
 					     T defaultValue)
   : DefaultValueBase (name, help),
     m_defaultValue (defaultValue),
-    m_minValue (std::numeric_limits<T>::min ()),
+    m_minValue (RealMin ()),
     m_maxValue (std::numeric_limits<T>::max ()),
     m_value (defaultValue)
 {
@@ -505,6 +506,21 @@
   return oss.str ();
 }
 
+template <typename T>
+T
+NumericDefaultValue<T>::RealMin (void) const
+{
+  if (std::numeric_limits<T>::is_integer) 
+    {
+      return std::numeric_limits<T>::min ();
+    }
+  else 
+    {
+      return -std::numeric_limits<T>::max ();
+    }
+}
+
+
 /**************************************************************
  **************************************************************/
 
--- a/src/core/log.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/core/log.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -341,6 +341,11 @@
     }
 }
 
+
+ParameterLogger g_parameterLogger;
+EndParameterListStruct EndParameterList;
+
+
 } // namespace ns3
 
 #endif // NS3_LOG_ENABLE
--- a/src/core/log.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/core/log.h	Thu Nov 15 10:18:17 2007 +0100
@@ -75,6 +75,7 @@
 
 #endif
 
+
 /**
  * \ingroup logging
  * \param msg message to output
@@ -88,6 +89,84 @@
 
 #ifdef NS3_LOG_ENABLE
 
+
+namespace ns3 {
+
+struct EndParameterListStruct {};
+extern EndParameterListStruct EndParameterList;
+
+struct ParameterName
+{
+  const char *name;
+  ParameterName (const char *name_) : name (name_) {}
+};
+
+class ParameterLogger : public std::ostream
+{
+  int m_itemNumber;
+  const char *m_parameterName;
+public:
+  ParameterLogger ()
+    : m_itemNumber (0)
+  {}
+
+  template<typename T>
+  ParameterLogger& operator<< (T param)
+  {
+    switch (m_itemNumber)
+      {
+      case 0: // first item is actually the function name
+        if (m_parameterName)
+          {
+            std::clog << m_parameterName << "=" << param;
+            m_parameterName = 0;
+          }
+        else
+          {
+            std::clog << param;
+          }
+        break;
+      case 1:
+        if (m_parameterName)
+          {
+            std::clog << ", " << m_parameterName << "=" << param;
+            m_parameterName = 0;
+          }
+        else
+          {
+            std::clog << ", " << param;
+          }
+        break;
+      default: // parameter following a previous parameter
+        std::clog << ", " << param;
+        break;
+      }
+    m_itemNumber++;
+    return *this;
+  }
+
+  ParameterLogger&
+  operator << (ParameterName paramName)
+  {
+    m_parameterName = paramName.name;
+    return *this;
+  }
+  
+  ParameterLogger&
+  operator << (EndParameterListStruct dummy)
+  {
+    std::clog << ")" << std::endl;
+    m_itemNumber = 0;
+    return *this;
+  }
+};
+
+extern ParameterLogger g_parameterLogger;
+
+}
+
+
+
 /**
  * \param level the log level
  * \param msg the message to log
@@ -142,8 +221,33 @@
 #define NS_LOG_FUNCTION \
   NS_LOG_F(ns3::LOG_FUNCTION)
 
-#define NS_LOG_PARAM(msg) \
-  NS_LOG(ns3::LOG_PARAM, msg)
+
+
+#define NS_LOG_PARAMS(parameters)                       \
+  do                                                    \
+    {                                                   \
+      if (g_log.IsEnabled (ns3::LOG_PARAM))             \
+        {                                               \
+          g_parameterLogger << __PRETTY_FUNCTION__      \
+                            << parameters               \
+                            << EndParameterList;        \
+        }                                               \
+    }                                                   \
+  while (false)
+
+
+#define NS_LOG_PARAMS_BEGIN()                           \
+      if (g_log.IsEnabled (ns3::LOG_PARAM))             \
+        {                                               \
+          g_parameterLogger << __PRETTY_FUNCTION__;
+
+#define NS_LOG_PARAM(param) \
+          g_parameterLogger << ParameterName (#param) << param;
+
+#define NS_LOG_PARAMS_END()                             \
+          g_parameterLogger << EndParameterList;        \
+        }
+
 
 #define NS_LOG_LOGIC(msg) \
   NS_LOG(ns3::LOG_LOGIC, msg)
--- a/src/core/random-variable.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/core/random-variable.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -42,7 +42,6 @@
 //-----------------------------------------------------------------------------
 // RandomVariable methods
 
-uint32_t      RandomVariable::runNumber = 0;
 bool          RandomVariable::initialized = false;   // True if RngStream seed set 
 bool          RandomVariable::useDevRandom = false;  // True if use /dev/random
 bool          RandomVariable::globalSeedSet = false; // True if GlobalSeed called
@@ -50,6 +49,7 @@
 uint32_t      RandomVariable::globalSeed[6];
 unsigned long RandomVariable::heuristic_sequence;
 RngStream*    RandomVariable::m_static_generator = 0;
+uint32_t      RandomVariable::runNumber = 0;
 
 //the static object random_variable_initializer initializes the static members
 //of RandomVariable
@@ -58,9 +58,9 @@
   public:
   RandomVariableInitializer()
   {
-    RandomVariable::Initialize(); // sets the static package seed
-    RandomVariable::m_static_generator = new RngStream();
-    RandomVariable::m_static_generator->InitializeStream();
+//     RandomVariable::Initialize(); // sets the static package seed
+//     RandomVariable::m_static_generator = new RngStream();
+//     RandomVariable::m_static_generator->InitializeStream();
   }
   ~RandomVariableInitializer()
   {
@@ -69,15 +69,20 @@
 } random_variable_initializer;
 
 RandomVariable::RandomVariable() 
+  : m_generator(NULL)
 {
-  m_generator = new RngStream();
-  m_generator->InitializeStream();
-  m_generator->ResetNthSubstream(RandomVariable::runNumber);
+//   m_generator = new RngStream();
+//   m_generator->InitializeStream();
+//   m_generator->ResetNthSubstream(RandomVariable::runNumber);
 }
 
 RandomVariable::RandomVariable(const RandomVariable& r)
+  :m_generator(0)
 {
-  m_generator = new RngStream(*r.m_generator);
+  if(r.m_generator)
+  {
+    m_generator = new RngStream(*r.m_generator);
+  }
 }
 
 RandomVariable::~RandomVariable()
@@ -97,6 +102,12 @@
 
 void RandomVariable::GetSeed(uint32_t seed[6])
 {
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   m_generator->GetState(seed);
 }
 
@@ -202,6 +213,16 @@
 
 double UniformVariable::GetValue()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   return m_min + m_generator->RandU01() * (m_max - m_min);
 }
 
@@ -212,6 +233,12 @@
 
 double UniformVariable::GetSingleValue(double s, double l)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   return s + m_static_generator->RandU01() * (l - s);;
 }
 
@@ -305,6 +332,16 @@
 
 double ExponentialVariable::GetValue()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   double r = -m_mean*log(m_generator->RandU01());
   if (m_bound != 0 && r > m_bound) return m_bound;
   return r;
@@ -316,6 +353,12 @@
 }
 double ExponentialVariable::GetSingleValue(double m, double b/*=0*/)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   double r = -m*log(m_static_generator->RandU01());
   if (b != 0 && r > b) return b;
   return r;
@@ -341,6 +384,16 @@
 
 double ParetoVariable::GetValue()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   double scale = m_mean * ( m_shape - 1.0) / m_shape;
   double r = (scale * ( 1.0 / pow(m_generator->RandU01(), 1.0 / m_shape)));
   if (m_bound != 0 && r > m_bound) return m_bound;
@@ -354,6 +407,12 @@
 
 double ParetoVariable::GetSingleValue(double m, double s, double b/*=0*/)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   double scale = m * ( s - 1.0) / s;
   double r = (scale * ( 1.0 / pow(m_static_generator->RandU01(), 1.0 / s)));
   if (b != 0 && r > b) return b;
@@ -375,6 +434,16 @@
 
 double WeibullVariable::GetValue()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   double exponent = 1.0 / m_alpha;
   double r = m_mean * pow( -log(m_generator->RandU01()), exponent);
   if (m_bound != 0 && r > m_bound) return m_bound;
@@ -388,6 +457,12 @@
 
 double WeibullVariable::GetSingleValue(double m, double s, double b/*=0*/)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   double exponent = 1.0 / s;
   double r = m * pow( -log(m_static_generator->RandU01()), exponent);
   if (b != 0 && r > b) return b;
@@ -412,6 +487,16 @@
 
 double NormalVariable::GetValue()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   if (m_nextValid)
     { // use previously generated
       m_nextValid = false;
@@ -445,6 +530,12 @@
 
 double NormalVariable::GetSingleValue(double m, double v, double b)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   if (m_static_nextValid)
     { // use previously generated
       m_static_nextValid = false;
@@ -495,6 +586,16 @@
 double EmpiricalVariable::GetValue()
 { // Return a value from the empirical distribution
   // This code based (loosely) on code by Bruce Mah (Thanks Bruce!)
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   if (emp.size() == 0) return 0.0; // HuH? No empirical data
   if (!validated) Validate();      // Insure in non-decreasing
   double r = m_generator->RandU01();
@@ -642,6 +743,16 @@
 double
 LogNormalVariable::GetValue ()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   double u, v, r2, normal, z;
 
   do
@@ -665,6 +776,12 @@
 
 double LogNormalVariable::GetSingleValue (double mu, double sigma)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   double u, v, r2, normal, z;
   do
     {
@@ -698,6 +815,16 @@
 
 double TriangularVariable::GetValue()
 {
+  if(!RandomVariable::initialized)
+  {
+    RandomVariable::Initialize();
+  }
+  if(!m_generator)
+  {
+    m_generator = new RngStream();
+    m_generator->InitializeStream();
+    m_generator->ResetNthSubstream(RandomVariable::runNumber);
+  }
   double u = m_generator->RandU01();
   if(u <= (m_mode - m_min) / (m_max - m_min) )
     return m_min + sqrt(u * (m_max - m_min) * (m_mode - m_min) );
@@ -712,6 +839,12 @@
 
 double TriangularVariable::GetSingleValue(double s, double l, double mean)
 {
+  if(!RandomVariable::m_static_generator)
+  {
+    RandomVariable::Initialize(); // sets the static package seed
+    RandomVariable::m_static_generator = new RngStream();
+    RandomVariable::m_static_generator->InitializeStream();
+  }
   double mode = 3.0*mean-s-l;
   double u = m_static_generator->RandU01();
   if(u <= (mode - s) / (l - s) )
--- a/src/core/random-variable.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/core/random-variable.h	Thu Nov 15 10:18:17 2007 +0100
@@ -71,7 +71,7 @@
    * \brief Returns a random double from the underlying distribution
    * \return A floating point random value
    */
-  virtual double  GetValue() = 0;     
+  virtual double  GetValue() = 0;
 
   /**
    * \brief Returns a random integer integer from the underlying distribution
@@ -173,19 +173,19 @@
    */
   static void SetRunNumber(uint32_t n);
 private:
-  static void Initialize();    // Initialize  the RNG system
   static void GetRandomSeeds(uint32_t seeds[6]);
 private:
-  static bool initialized;     // True if package seed is set 
   static bool useDevRandom;    // True if using /dev/random desired
   static bool globalSeedSet;   // True if global seed has been specified
   static int  devRandom;       // File handle for /dev/random
   static uint32_t globalSeed[6]; // The global seed to use
-  static uint32_t runNumber;
   friend class RandomVariableInitializer;
 protected:
   static unsigned long heuristic_sequence;
   static RngStream* m_static_generator;
+  static uint32_t runNumber;
+  static void Initialize();    // Initialize  the RNG system
+  static bool initialized;     // True if package seed is set 
   RngStream* m_generator;  //underlying generator being wrapped
 };
 
--- a/src/devices/csma/csma-channel.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/csma/csma-channel.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -68,8 +68,7 @@
   m_delay (delay)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << Channel::GetName() << ", " << bps.GetBitRate() << 
-    ", " << delay << ")");
+  NS_LOG_PARAMS (this << Channel::GetName() << bps.GetBitRate() << delay);
   Init();
 }
 
@@ -83,8 +82,7 @@
   m_delay (delay)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << name << ", " << bps.GetBitRate() << ", " << delay << 
-    ")");
+  NS_LOG_PARAMS (this << name << bps.GetBitRate() << delay);
   Init();
 }
 
@@ -97,7 +95,7 @@
 CsmaChannel::Attach(Ptr<CsmaNetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << device << ")");
+  NS_LOG_PARAMS (this << device);
   NS_ASSERT(device != 0);
 
   CsmaDeviceRec rec(device);
@@ -110,7 +108,7 @@
 CsmaChannel::Reattach(Ptr<CsmaNetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << device << ")");
+  NS_LOG_PARAMS (this << device);
   NS_ASSERT(device != 0);
 
   std::vector<CsmaDeviceRec>::iterator it;
@@ -136,7 +134,7 @@
 CsmaChannel::Reattach(uint32_t deviceId)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << deviceId << ")");
+  NS_LOG_PARAMS (this << deviceId);
 
   if (deviceId < m_deviceList.size())
     {
@@ -158,7 +156,7 @@
 CsmaChannel::Detach(uint32_t deviceId)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << deviceId << ")");
+  NS_LOG_PARAMS (this << deviceId);
 
   if (deviceId < m_deviceList.size())
     {
@@ -189,7 +187,7 @@
 CsmaChannel::Detach(Ptr<CsmaNetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << device << ")");
+  NS_LOG_PARAMS (this << device);
   NS_ASSERT(device != 0);
 
   std::vector<CsmaDeviceRec>::iterator it;
@@ -208,7 +206,7 @@
 CsmaChannel::TransmitStart(Packet& p, uint32_t srcId)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ", " << srcId << ")");
+  NS_LOG_PARAMS (this << &p << srcId);
   NS_LOG_INFO ("UID is " << p.GetUid () << ")");
 
   if (m_state != IDLE)
@@ -240,7 +238,7 @@
 CsmaChannel::TransmitEnd()
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &m_currentPkt << ", " << m_currentSrc << ")");
+  NS_LOG_PARAMS (this << &m_currentPkt << m_currentSrc);
   NS_LOG_INFO ("UID is " << m_currentPkt.GetUid () << ")");
 
   NS_ASSERT(m_state == TRANSMITTING);
@@ -266,7 +264,7 @@
 CsmaChannel::PropagationCompleteEvent()
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &m_currentPkt << ")");
+  NS_LOG_PARAMS (this << &m_currentPkt);
   NS_LOG_INFO ("UID is " << m_currentPkt.GetUid () << ")");
 
   NS_ASSERT(m_state == PROPAGATING);
--- a/src/devices/csma/csma-net-device.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/csma/csma-net-device.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -28,6 +28,7 @@
 #include "ns3/ethernet-header.h"
 #include "ns3/ethernet-trailer.h"
 #include "ns3/llc-snap-header.h"
+#include "ns3/error-model.h"
 
 NS_LOG_COMPONENT_DEFINE ("CsmaNetDevice");
 
@@ -82,10 +83,11 @@
 
 CsmaNetDevice::CsmaNetDevice (Ptr<Node> node)
   : NetDevice (node, Mac48Address::Allocate ()),
-    m_bps (DataRate (0xffffffff))
+    m_bps (DataRate (0xffffffff)),
+    m_receiveErrorModel (0)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << node << ")");
+  NS_LOG_PARAMS (this << node);
   m_encapMode = IP_ARP;
   Init(true, true);
 }
@@ -93,10 +95,11 @@
 CsmaNetDevice::CsmaNetDevice (Ptr<Node> node, Mac48Address addr, 
                               CsmaEncapsulationMode encapMode) 
   : NetDevice(node, addr), 
-    m_bps (DataRate (0xffffffff))
+    m_bps (DataRate (0xffffffff)),
+    m_receiveErrorModel (0)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << node << ")");
+  NS_LOG_PARAMS (this << node);
   m_encapMode = encapMode;
 
   Init(true, true);
@@ -109,7 +112,7 @@
     m_bps (DataRate (0xffffffff))
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << node << ")");
+  NS_LOG_PARAMS (this << node);
   m_encapMode = encapMode;
 
   Init(sendEnable, receiveEnable);
@@ -142,7 +145,7 @@
 CsmaNetDevice::operator= (const CsmaNetDevice nd)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &nd << ")");
+  NS_LOG_PARAMS (this << &nd);
   return *this;
 }
 */
@@ -195,7 +198,10 @@
 CsmaNetDevice::SetDataRate (DataRate bps)
 {
   NS_LOG_FUNCTION;
-  m_bps = bps;
+  if (!m_channel || bps <= m_channel->GetDataRate ())
+    {
+      m_bps = bps;
+    }
 }
 
 void 
@@ -507,7 +513,7 @@
 CsmaNetDevice::Attach (Ptr<CsmaChannel> ch)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &ch << ")");
+  NS_LOG_PARAMS (this << &ch);
 
   m_channel = ch;
 
@@ -526,11 +532,20 @@
 CsmaNetDevice::AddQueue (Ptr<Queue> q)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << q << ")");
+  NS_LOG_PARAMS (this << q);
 
   m_queue = q;
 }
 
+void CsmaNetDevice::AddReceiveErrorModel (Ptr<ErrorModel> em)
+{
+  NS_LOG_FUNCTION;
+  NS_LOG_PARAM ("(" << em << ")");
+  
+  m_receiveErrorModel = em; 
+  AddInterface (em);
+}
+
 void
 CsmaNetDevice::Receive (const Packet& packet)
 {
@@ -593,38 +608,48 @@
       return;
     }
 
-  m_rxTrace (p);
+  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (p) )
+    {
+      NS_LOG_LOGIC ("Dropping pkt due to error model ");
+      m_dropTrace (packet);
+      // Do not forward up; let this packet go
+    }
+  else
+    {
+      m_rxTrace (p);
 //
 // protocol must be initialized to avoid a compiler warning in the RAW
 // case that breaks the optimized build.
 //
-  uint16_t protocol = 0;
+      uint16_t protocol = 0;
 
-  switch (m_encapMode)
-    {
-    case ETHERNET_V1:
-    case IP_ARP:
-      protocol = header.GetLengthType();
-      break;
-    case LLC: {
-      LlcSnapHeader llc;
-      p.RemoveHeader (llc);
-      protocol = llc.GetType ();
-    } break;
-    case RAW:
-      NS_ASSERT (false);
-      break;
+      switch (m_encapMode)
+        {
+        case ETHERNET_V1:
+        case IP_ARP:
+          protocol = header.GetLengthType();
+          break;
+        case LLC: 
+          {
+            LlcSnapHeader llc;
+            p.RemoveHeader (llc);
+            protocol = llc.GetType ();
+          } 
+          break;
+        case RAW:
+          NS_ASSERT (false);
+          break;
+        }
+      ForwardUp (p, protocol, header.GetSource ());
+      return;
     }
-  
-  ForwardUp (p, protocol, header.GetSource ());
-  return;
 }
 
 Address
 CsmaNetDevice::MakeMulticastAddress(Ipv4Address multicastGroup) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << multicastGroup << ")");
+  NS_LOG_PARAMS (this << multicastGroup);
 //
 // First, get the generic multicast address.
 //
@@ -687,4 +712,5 @@
   return m_channel;
 }
 
+
 } // namespace ns3
--- a/src/devices/csma/csma-net-device.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/csma/csma-net-device.h	Thu Nov 15 10:18:17 2007 +0100
@@ -40,6 +40,7 @@
 
 class Queue;
 class CsmaChannel;
+class ErrorModel;
 
 /**
  * \brief hold in a TraceContext the type of trace source from a CsmaNetDevice
@@ -193,6 +194,16 @@
    */
   void AddQueue (Ptr<Queue> queue);
   /**
+   * Attach a receive ErrorModel to the CsmaNetDevice.
+   *
+   * The CsmaNetDevice may optionally include an ErrorModel in
+   * the packet receive chain.
+   *
+   * @see ErrorModel
+   * @param em a pointer to the ErrorModel 
+   */
+  void AddReceiveErrorModel(Ptr<ErrorModel> em);
+  /**
    * Receive a packet from a connected CsmaChannel.
    *
    * The CsmaNetDevice receives packets from its connected channel
@@ -453,6 +464,12 @@
    * @see class DropTailQueue
    */
   Ptr<Queue> m_queue;
+
+  /**
+   * Error model for receive packet events
+   */
+  Ptr<ErrorModel> m_receiveErrorModel;
+
   /**
    * NOT TESTED
    * The trace source for the packet reception events that the device can
--- a/src/devices/point-to-point/point-to-point-channel.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/point-to-point/point-to-point-channel.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -52,8 +52,7 @@
   m_nDevices(0)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << Channel::GetName() << ", " << bps.GetBitRate() << 
-    ", " << delay << ")");
+  NS_LOG_PARAMS (this << Channel::GetName() << bps.GetBitRate() << delay);
 }
 
 PointToPointChannel::PointToPointChannel(
@@ -67,15 +66,14 @@
   m_nDevices(0)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << name << ", " << bps.GetBitRate() << ", " << 
-    delay << ")");
+  NS_LOG_PARAMS (this << name << bps.GetBitRate() << delay);
 }
 
 void
 PointToPointChannel::Attach(Ptr<PointToPointNetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << device << ")");
+  NS_LOG_PARAMS (this << device);
   NS_ASSERT(m_nDevices < N_DEVICES && "Only two devices permitted");
   NS_ASSERT(device != 0);
 
@@ -99,7 +97,7 @@
                                         const Time& txTime)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ", " << src << ")");
+  NS_LOG_PARAMS (this << &p << src);
   NS_LOG_LOGIC ("UID is " << p.GetUid () << ")");
 
   NS_ASSERT(m_link[0].m_state != INITIALIZING);
--- a/src/devices/point-to-point/point-to-point-net-device.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/point-to-point/point-to-point-net-device.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -26,6 +26,7 @@
 #include "ns3/composite-trace-resolver.h"
 #include "ns3/mac48-address.h"
 #include "ns3/llc-snap-header.h"
+#include "ns3/error-model.h"
 #include "point-to-point-net-device.h"
 #include "point-to-point-channel.h"
 
@@ -38,14 +39,28 @@
            "The default data rate for point to point links",
            DataRate ("10Mb/s"));
 
+PointToPointTraceType::PointToPointTraceType (enum Type type)
+  : m_type (type)
+{
+  NS_LOG_FUNCTION;
+}
 PointToPointTraceType::PointToPointTraceType ()
+  : m_type (RX)
 {
   NS_LOG_FUNCTION;
 }
+
 void 
 PointToPointTraceType::Print (std::ostream &os) const
 {
-  os << "dev-rx";
+  switch (m_type) {
+  case RX:
+    os << "dev-rx";
+    break;
+  case DROP:
+    os << "dev-drop";
+    break;
+  }
 }
 
 uint16_t 
@@ -63,6 +78,12 @@
   return "ns3::PointToPointTraceType";
 }
 
+enum PointToPointTraceType::Type
+PointToPointTraceType::Get (void) const
+{
+  NS_LOG_FUNCTION;
+  return m_type;
+}
 
 PointToPointNetDevice::PointToPointNetDevice (Ptr<Node> node,
                                               const DataRate& rate) 
@@ -73,10 +94,12 @@
   m_tInterframeGap (Seconds(0)),
   m_channel (0), 
   m_queue (0),
-  m_rxTrace ()
+  m_rxTrace (),
+  m_dropTrace (),
+  m_receiveErrorModel (0)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << node << ")");
+  NS_LOG_PARAMS (this << node);
 //
 // XXX BUGBUG
 //
@@ -94,6 +117,7 @@
 {
   NS_LOG_FUNCTION;
   m_queue = 0;
+  m_receiveErrorModel = 0;
 }
 
 void 
@@ -127,7 +151,10 @@
 void PointToPointNetDevice::SetDataRate(const DataRate& bps)
 {
   NS_LOG_FUNCTION;
-  m_bps = bps;
+  if (!m_channel || bps <= m_channel->GetDataRate ())
+    {
+      m_bps = bps;
+    }
 }
 
 void PointToPointNetDevice::SetInterframeGap(const Time& t)
@@ -174,7 +201,7 @@
 PointToPointNetDevice::TransmitStart (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
   NS_LOG_LOGIC ("UID is " << p.GetUid () << ")");
 //
 // This function is called to start the process of transmitting a packet.
@@ -221,7 +248,12 @@
                        TraceDoc ("receive MAC packet",
                                  "const Packet &", "packet received"),
                        m_rxTrace,
-                       PointToPointTraceType ());
+                       PointToPointTraceType (PointToPointTraceType::RX));
+  resolver->AddSource ("drop",
+                       TraceDoc ("drop MAC packet",
+                                 "const Packet &", "packet dropped"),
+                       m_dropTrace,
+                       PointToPointTraceType (PointToPointTraceType::DROP));
   resolver->SetParentResolver (NetDevice::GetTraceResolver ());
   return resolver;
 }
@@ -230,7 +262,7 @@
 PointToPointNetDevice::Attach (Ptr<PointToPointChannel> ch)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &ch << ")");
+  NS_LOG_PARAMS (this << &ch);
 
   m_channel = ch;
 
@@ -257,21 +289,38 @@
 void PointToPointNetDevice::AddQueue (Ptr<Queue> q)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << q << ")");
+  NS_LOG_PARAMS (this << q);
 
   m_queue = q;
 }
 
+void PointToPointNetDevice::AddReceiveErrorModel (Ptr<ErrorModel> em)
+{
+  NS_LOG_FUNCTION;
+  NS_LOG_PARAM ("(" << em << ")");
+
+  m_receiveErrorModel = em;
+  AddInterface (em);
+}
+
 void PointToPointNetDevice::Receive (Packet& p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
   uint16_t protocol = 0;
   Packet packet = p;
 
-  m_rxTrace (packet);
-  ProcessHeader(packet, protocol);
-  ForwardUp (packet, protocol, GetBroadcast ());
+  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (p) ) 
+    {
+      m_dropTrace (packet);
+      // Do not forward up; let this packet go
+    }
+  else 
+    {
+      m_rxTrace (packet);
+      ProcessHeader(packet, protocol);
+      ForwardUp (packet, protocol, GetBroadcast ());
+    }
 }
 
 Ptr<Queue> PointToPointNetDevice::GetQueue(void) const 
--- a/src/devices/point-to-point/point-to-point-net-device.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/point-to-point/point-to-point-net-device.h	Thu Nov 15 10:18:17 2007 +0100
@@ -37,6 +37,7 @@
 
 class Queue;
 class PointToPointChannel;
+class ErrorModel;
 
 /**
  * \brief hold in a TraceContext the type of trace source from a PointToPointNetDevice
@@ -44,10 +45,21 @@
 class PointToPointTraceType : public TraceContextElement
 {
 public:
+  enum Type {
+    RX,
+    DROP
+  };
+  PointToPointTraceType (enum Type type);
   PointToPointTraceType ();
   void Print (std::ostream &os) const;
   static uint16_t GetUid (void);
   std::string GetTypeName (void) const;
+  /**
+   * \returns the type of the trace source which generated an event.
+   */
+  enum Type Get (void) const;
+private:
+  enum Type m_type;
 };
 
 /**
@@ -134,6 +146,16 @@
    */
   void AddQueue (Ptr<Queue> queue);
   /**
+   * Attach a receive ErrorModel to the PointToPointNetDevice.
+   *
+   * The PointToPointNetDevice may optionally include an ErrorModel in
+   * the packet receive chain.
+   *
+   * @see ErrorModel
+   * @param em a pointer to the ErrorModel 
+   */
+  void AddReceiveErrorModel(Ptr<ErrorModel> em);
+  /**
    * Receive a packet from a connected PointToPointChannel.
    *
    * The PointToPointNetDevice receives packets from its connected channel
@@ -288,11 +310,23 @@
    * @see class TraceResolver
    */
   CallbackTraceSource<const Packet &> m_rxTrace;
+  /**
+   * The trace source for the packet drop events that the device can
+   * fire.
+   *
+   * @see class CallBackTraceSource
+   * @see class TraceResolver
+   */
+  CallbackTraceSource<const Packet &> m_dropTrace;
   /** 
    * Default data rate.  Used for all newly created p2p net devices
    */
    static DataRateDefaultValue g_defaultRate;
 
+  /**
+   * Error model for receive packet events
+   */
+  Ptr<ErrorModel> m_receiveErrorModel;
 };
 
 }; // namespace ns3
--- a/src/devices/point-to-point/point-to-point-topology.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/point-to-point/point-to-point-topology.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -62,6 +62,30 @@
   return channel;
 }
 
+Ptr<PointToPointNetDevice> 
+PointToPointTopology::GetNetDevice (Ptr<Node> n, Ptr<PointToPointChannel> chan)
+{
+  Ptr<PointToPointNetDevice> found = 0;
+
+  // The PointToPoint channel is used to find the relevant NetDevice
+  NS_ASSERT (chan->GetNDevices () == 2);
+  Ptr<PointToPointNetDevice> nd1 = chan->GetDevice (0);
+  Ptr<PointToPointNetDevice> nd2 = chan->GetDevice (1);
+  if ( nd1->GetNode ()->GetId () == n->GetId () ) 
+    {
+      found = nd1;
+    }
+  else if ( nd2->GetNode ()->GetId () == n->GetId () ) 
+    {
+      found = nd2;
+    }
+  else
+    {
+      NS_ASSERT (found);
+    }
+  return found;
+}
+
 void
 PointToPointTopology::AddIpv4Addresses(
   Ptr<const PointToPointChannel> chan,
--- a/src/devices/point-to-point/point-to-point-topology.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/devices/point-to-point/point-to-point-topology.h	Thu Nov 15 10:18:17 2007 +0100
@@ -56,6 +56,17 @@
     Ptr<Node> n1, Ptr<Node> n2, const DataRate& dataRate, const Time& delay);
 
   /** 
+   * \param n Node
+   * \param chan PointToPointChannel connected to node n
+   * \return Pointer to the corresponding PointToPointNetDevice
+   * 
+   * Utility function to retrieve a PointToPointNetDevice pointer
+   * corresponding to the input parameters
+   */
+  static Ptr<PointToPointNetDevice> GetNetDevice(
+    Ptr<Node> n, Ptr<PointToPointChannel> chan);
+
+  /** 
    * \param chan PointToPointChannel to use
    * \param n1 Node
    * \param addr1 Ipv4 Address for n1
--- a/src/internet-node/arp-ipv4-interface.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/arp-ipv4-interface.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -64,7 +64,7 @@
 ArpIpv4Interface::SendTo (Packet p, Ipv4Address dest)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ", " << dest << ")");
+  NS_LOG_PARAMS (this << &p << dest);
 
   NS_ASSERT (GetDevice () != 0);
   if (GetDevice ()->NeedsArp ())
--- a/src/internet-node/ipv4-end-point-demux.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/ipv4-end-point-demux.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -93,7 +93,7 @@
 Ipv4EndPointDemux::Allocate (Ipv4Address address)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << this << ", " << address << ")");
+  NS_LOG_PARAMS (this << address);
   uint16_t port = AllocateEphemeralPort ();
   if (port == 0) 
     {
@@ -117,7 +117,7 @@
 Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << this << ", " << address << ", " << port << ")");
+  NS_LOG_PARAMS (this << address << port);
   if (LookupLocal (address, port)) 
     {
       NS_LOG_WARN ("Duplicate address/port; failing.");
@@ -134,10 +134,7 @@
 			     Ipv4Address peerAddress, uint16_t peerPort)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(localAddress=" << localAddress
-    << ", localPort=" << localPort
-    << ", peerAddress=" << peerAddress
-    << ", peerPort=" << peerPort << ")");
+  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
   for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
     {
       if ((*i)->GetLocalPort () == localPort &&
@@ -189,8 +186,15 @@
   Ipv4EndPoint *generic = 0;
   EndPoints retval;
 
-  NS_LOG_PARAM ("(daddr=" << daddr << ", dport=" << dport
-    << ", saddr=" << saddr << ", sport=" << sport << ")");
+  //NS_LOG_PARAMS (this << daddr << dport << saddr << sport);
+  NS_LOG_PARAMS_BEGIN ();
+  NS_LOG_PARAM (this);
+  NS_LOG_PARAM (daddr);
+  NS_LOG_PARAM (dport);
+  NS_LOG_PARAM (saddr);
+  NS_LOG_PARAM (sport);
+  NS_LOG_PARAM (incomingInterface);
+  NS_LOG_PARAMS_END ();
 
   for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) 
     {
--- a/src/internet-node/ipv4-interface.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/ipv4-interface.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -41,7 +41,7 @@
     m_metric(1)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &nd << ")");
+  NS_LOG_PARAMS (this << &nd);
 }
 
 Ipv4Interface::~Ipv4Interface ()
@@ -68,7 +68,7 @@
 Ipv4Interface::SetAddress (Ipv4Address a)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << a << ")");
+  NS_LOG_PARAMS (this << a);
   m_address = a;
 }
 
@@ -76,7 +76,7 @@
 Ipv4Interface::SetNetworkMask (Ipv4Mask mask)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << mask << ")");
+  NS_LOG_PARAMS (this << mask);
   m_netmask = mask;
 }
 
@@ -101,7 +101,7 @@
 Ipv4Interface::SetMetric (uint16_t metric)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << metric << ")");
+  NS_LOG_PARAMS ("(" << metric << ")");
   m_metric = metric;
 }
 
--- a/src/internet-node/ipv4-l3-protocol.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/ipv4-l3-protocol.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -233,7 +233,7 @@
                       uint32_t interface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << dest << ", " << nextHop << ", " << interface << ")");
+  NS_LOG_PARAMS (this << dest << nextHop << interface);
   m_staticRouting->AddHostRouteTo (dest, nextHop, interface);
 }
 
@@ -242,7 +242,7 @@
 				uint32_t interface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << dest << ", " << interface << ")");
+  NS_LOG_PARAMS (this << dest << interface);
   m_staticRouting->AddHostRouteTo (dest, interface);
 }
 
@@ -253,8 +253,7 @@
 				   uint32_t interface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << network << ", " << networkMask << ", " << nextHop << 
-    ", " << interface << ")");
+  NS_LOG_PARAMS (this << network << networkMask << nextHop << interface);
   m_staticRouting->AddNetworkRouteTo (network, networkMask, nextHop, interface);
 }
 
@@ -264,8 +263,7 @@
 				   uint32_t interface)
 {
   NS_LOG_FUNCTION; 
-  NS_LOG_PARAM ("(" << network << ", " << networkMask << ", " << interface << 
-    ")");
+  NS_LOG_PARAMS (this << network << networkMask << interface);
   m_staticRouting->AddNetworkRouteTo (network, networkMask, interface);
 }
 
@@ -274,7 +272,7 @@
 				 uint32_t interface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << nextHop << ", " << interface << ")");
+  NS_LOG_PARAMS (this << nextHop << interface);
   m_staticRouting->SetDefaultRoute (nextHop, interface);
 }
 
@@ -285,7 +283,7 @@
   Ipv4RoutingProtocol::RouteReplyCallback routeReply)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &ipHeader << ", " << &packet << &routeReply << ")");
+  NS_LOG_PARAMS (this << &ipHeader << &packet << &routeReply);
 
   Lookup (Ipv4RoutingProtocol::IF_INDEX_ANY, ipHeader, packet, routeReply);
 }
@@ -298,8 +296,7 @@
   Ipv4RoutingProtocol::RouteReplyCallback routeReply)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << ifIndex << ", " << &ipHeader << ", " << &packet << 
-    &routeReply << ")");
+  NS_LOG_PARAMS (this << ifIndex << &ipHeader << &packet << &routeReply);
 
   for (Ipv4RoutingProtocolList::const_iterator rprotoIter = 
          m_routingProtocols.begin ();
@@ -348,7 +345,7 @@
                                     int priority)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &routingProtocol << ", " << priority << ")");
+  NS_LOG_PARAMS (this << &routingProtocol << priority);
   m_routingProtocols.push_back
     (std::pair<int, Ptr<Ipv4RoutingProtocol> > (-priority, routingProtocol));
   m_routingProtocols.sort ();
@@ -372,7 +369,7 @@
 Ipv4L3Protocol::RemoveRoute (uint32_t index)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM("(" << index << ")");
+  NS_LOG_PARAMS (this << index);
   m_staticRouting->RemoveRoute (index);
 }
 
@@ -383,8 +380,7 @@
                                    std::vector<uint32_t> outputInterfaces)
 {
   NS_LOG_FUNCTION; 
-  NS_LOG_PARAM ("(" << origin << ", " << group << ", " << inputInterface << 
-    ", " << &outputInterfaces << ")");
+  NS_LOG_PARAMS (this << origin << group << inputInterface << &outputInterfaces);
 
   m_staticRouting->AddMulticastRoute (origin, group, inputInterface,
     outputInterfaces);
@@ -394,7 +390,7 @@
 Ipv4L3Protocol::SetDefaultMulticastRoute (uint32_t outputInterface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << outputInterface << ")");
+  NS_LOG_PARAMS (this << outputInterface);
 
   m_staticRouting->SetDefaultMulticastRoute (outputInterface);
 }
@@ -410,7 +406,7 @@
 Ipv4L3Protocol::GetMulticastRoute (uint32_t index) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << index << ")");
+  NS_LOG_PARAMS (this << index);
   return m_staticRouting->GetMulticastRoute (index);
 }
 
@@ -420,8 +416,7 @@
                                        uint32_t inputInterface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << origin << ", " << group << ", " << inputInterface << 
-    ")");
+  NS_LOG_PARAMS (this << origin << group << inputInterface);
   m_staticRouting->RemoveMulticastRoute (origin, group, inputInterface);
 }
 
@@ -429,7 +424,7 @@
 Ipv4L3Protocol::RemoveMulticastRoute (uint32_t index)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << index << ")");
+  NS_LOG_PARAMS (this << index);
   m_staticRouting->RemoveMulticastRoute (index);
 }
 
@@ -437,7 +432,7 @@
 Ipv4L3Protocol::AddInterface (Ptr<NetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &device << ")");
+  NS_LOG_PARAMS (this << &device);
   Ptr<Ipv4Interface> interface = Create<ArpIpv4Interface> (m_node, device);
   return AddIpv4Interface (interface);
 }
@@ -446,7 +441,7 @@
 Ipv4L3Protocol::AddIpv4Interface (Ptr<Ipv4Interface>interface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << interface << ")");
+  NS_LOG_PARAMS (this << interface);
   uint32_t index = m_nInterfaces;
   m_interfaces.push_back (interface);
   m_nInterfaces++;
@@ -457,7 +452,7 @@
 Ipv4L3Protocol::GetInterface (uint32_t index) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << index << ")");
+  NS_LOG_PARAMS (this << index);
   uint32_t tmp = 0;
   for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
     {
@@ -481,7 +476,7 @@
 Ipv4L3Protocol::FindInterfaceForAddr (Ipv4Address addr) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << addr << ")");
+  NS_LOG_PARAMS (this << addr);
 
   uint32_t ifIndex = 0;
   for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
@@ -503,7 +498,7 @@
 Ipv4L3Protocol::FindInterfaceForAddr (Ipv4Address addr, Ipv4Mask mask) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << addr << ", " << mask << ")");
+  NS_LOG_PARAMS (this << addr << mask);
 
   uint32_t ifIndex = 0;
   for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
@@ -525,7 +520,7 @@
 Ipv4L3Protocol::FindInterfaceForDevice (Ptr<const NetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &device << ")");
+  NS_LOG_PARAMS (this << &device);
   for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
     {
       if ((*i)->GetDevice () == device)
@@ -540,8 +535,7 @@
 Ipv4L3Protocol::Receive( Ptr<NetDevice> device, const Packet& p, uint16_t protocol, const Address &from)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &device << ", " << &p << ", " << protocol << ", " << 
-    from << ")");
+  NS_LOG_PARAMS (this << &device << &p << protocol <<  from);
 
   NS_LOG_LOGIC ("Packet from " << from);
 
@@ -585,8 +579,7 @@
             uint8_t protocol)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &packet << ", " << source << ", " << ", " << 
-    destination << ", " << protocol << ")");
+  NS_LOG_PARAMS (this << &packet << source << destination << protocol);
 
   Ipv4Header ipHeader;
 
@@ -637,8 +630,7 @@
                              Ipv4Header const &ipHeader)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << found << ", " << &route << ", " << &packet << 
-    &ipHeader << ")");
+  NS_LOG_PARAMS (this << found << &route << &packet << &ipHeader);
 
   if (!found)
     {
@@ -673,8 +665,7 @@
   Ptr<NetDevice> device)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << ifIndex << ", " << &packet << ", " << &ipHeader << 
-    ", " << device << ")");
+  NS_LOG_PARAMS (ifIndex << &packet << &ipHeader<< device);
 
   for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin ();
        i != m_interfaces.end (); i++) 
@@ -751,7 +742,7 @@
                            Ptr<Ipv4Interface> incomingInterface)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ", " << &ip << ")");
+  NS_LOG_PARAMS (this << &p << &ip);
 
   Ptr<Ipv4L4Demux> demux = m_node->QueryInterface<Ipv4L4Demux> (Ipv4L4Demux::iid);
   Ptr<Ipv4L4Protocol> protocol = demux->GetProtocol (ip.GetProtocol ());
@@ -762,7 +753,7 @@
 Ipv4L3Protocol::JoinMulticastGroup (Ipv4Address origin, Ipv4Address group)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << origin << ", " << group << ")");
+  NS_LOG_PARAMS (this << origin << group);
   m_multicastGroups.push_back(
     std::pair<Ipv4Address, Ipv4Address> (origin, group));
 }
@@ -771,7 +762,7 @@
 Ipv4L3Protocol::LeaveMulticastGroup (Ipv4Address origin, Ipv4Address group)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << origin << ", " << group << ")");
+  NS_LOG_PARAMS (this << origin << group);
 
   for (Ipv4MulticastGroupList::iterator i = m_multicastGroups.begin ();
        i != m_multicastGroups.end (); 
@@ -789,7 +780,7 @@
 Ipv4L3Protocol::SetAddress (uint32_t i, Ipv4Address address)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ", " << address << ")");
+  NS_LOG_PARAMS (this << i << address);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   interface->SetAddress (address);
 }
@@ -798,7 +789,7 @@
 Ipv4L3Protocol::SetNetworkMask (uint32_t i, Ipv4Mask mask)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ", " << mask << ")");
+  NS_LOG_PARAMS (this << i << mask);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   interface->SetNetworkMask (mask);
 }
@@ -807,7 +798,7 @@
 Ipv4L3Protocol::GetNetworkMask (uint32_t i) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ")");
+  NS_LOG_PARAMS (this << i);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   return interface->GetNetworkMask ();
 }
@@ -816,7 +807,7 @@
 Ipv4L3Protocol::GetAddress (uint32_t i) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ")");
+  NS_LOG_PARAMS (this << i);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   return interface->GetAddress ();
 }
@@ -825,7 +816,7 @@
 Ipv4L3Protocol::SetMetric (uint32_t i, uint16_t metric)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ", " << metric << ")");
+  NS_LOG_PARAMS ("(" << i << ", " << metric << ")");
   Ptr<Ipv4Interface> interface = GetInterface (i);
   interface->SetMetric (metric);
 }
@@ -834,7 +825,7 @@
 Ipv4L3Protocol::GetMetric (uint32_t i) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ")");
+  NS_LOG_PARAMS ("(" << i << ")");
   Ptr<Ipv4Interface> interface = GetInterface (i);
   return interface->GetMetric ();
 }
@@ -844,7 +835,7 @@
   Ipv4Address destination, uint32_t& ifIndex) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << destination << ", " << &ifIndex << ")");
+  NS_LOG_PARAMS (this << destination << &ifIndex);
 //
 // The first thing we do in trying to determine a source address is to 
 // consult the routing protocols.  These will also check for a default route
@@ -911,7 +902,7 @@
 Ipv4L3Protocol::GetMtu (uint32_t i) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ")");
+  NS_LOG_PARAMS (this << i);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   return interface->GetMtu ();
 }
@@ -920,7 +911,7 @@
 Ipv4L3Protocol::IsUp (uint32_t i) const
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ")");
+  NS_LOG_PARAMS (this << i);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   return interface->IsUp ();
 }
@@ -929,7 +920,7 @@
 Ipv4L3Protocol::SetUp (uint32_t i)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << i << ")");
+  NS_LOG_PARAMS (this << i);
   Ptr<Ipv4Interface> interface = GetInterface (i);
   interface->SetUp ();
 
@@ -948,7 +939,7 @@
 Ipv4L3Protocol::SetDown (uint32_t ifaceIndex)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << ifaceIndex << ")");
+  NS_LOG_PARAMS (this << ifaceIndex);
   Ptr<Ipv4Interface> interface = GetInterface (ifaceIndex);
   interface->SetDown ();
 
--- a/src/internet-node/ipv4-loopback-interface.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/ipv4-loopback-interface.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -47,7 +47,7 @@
 Ipv4LoopbackInterface::SendTo (Packet packet, Ipv4Address dest)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &packet << ", " << dest << ")");
+  NS_LOG_PARAMS (this << &packet << dest);
 
   Ptr<Ipv4L3Protocol> ipv4 = 
     m_node->QueryInterface<Ipv4L3Protocol> (Ipv4L3Protocol::iid);
--- a/src/internet-node/ipv4-static-routing.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/ipv4-static-routing.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -522,8 +522,7 @@
   RouteReplyCallback routeReply)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << ifIndex << &ipHeader << ", " << &packet << ", " << 
-    &routeReply << ")");
+  NS_LOG_PARAMS (this << ifIndex << &ipHeader << &packet << &routeReply);
 
   NS_LOG_LOGIC ("source = " << ipHeader.GetSource ());
 
@@ -576,7 +575,7 @@
 Ipv4StaticRouting::RequestIfIndex (Ipv4Address destination, uint32_t& ifIndex)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << destination << ", " << &ifIndex << ")");
+  NS_LOG_PARAMS (this << destination << &ifIndex);
 //
 // First, see if this is a multicast packet we have a route for.  If we
 // have a route, then send the packet down each of the specified interfaces.
--- a/src/internet-node/udp-l4-protocol.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/udp-l4-protocol.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -83,7 +83,7 @@
 UdpL4Protocol::Allocate (Ipv4Address address)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << address << ")");
+  NS_LOG_PARAMS (this << address);
   return m_endPoints->Allocate (address);
 }
 
@@ -91,7 +91,7 @@
 UdpL4Protocol::Allocate (uint16_t port)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << port << ")");
+  NS_LOG_PARAMS (this << port);
   return m_endPoints->Allocate (port);
 }
 
@@ -99,7 +99,7 @@
 UdpL4Protocol::Allocate (Ipv4Address address, uint16_t port)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << address << ", " << port << ")");
+  NS_LOG_PARAMS (this << address << port);
   return m_endPoints->Allocate (address, port);
 }
 Ipv4EndPoint *
@@ -107,8 +107,7 @@
                Ipv4Address peerAddress, uint16_t peerPort)
 {
   NS_LOG_FUNCTION; 
-  NS_LOG_PARAM ("(" << localAddress << ", " << localPort << ", " << 
-    peerAddress << ", " << peerPort << ")");
+  NS_LOG_PARAMS (this << localAddress << localPort << peerAddress << peerPort);
   return m_endPoints->Allocate (localAddress, localPort,
                                 peerAddress, peerPort);
 }
@@ -117,7 +116,7 @@
 UdpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint)
 {
   NS_LOG_FUNCTION; 
-  NS_LOG_PARAM ("(" << endPoint << ")");
+  NS_LOG_PARAMS (this << endPoint);
   m_endPoints->DeAllocate (endPoint);
 }
 
@@ -128,8 +127,7 @@
                        Ptr<Ipv4Interface> interface)
 {
   NS_LOG_FUNCTION; 
-  NS_LOG_PARAM ("(" << &packet << ", " << source << ", " << destination << 
-    ")");
+  NS_LOG_PARAMS (this << &packet << source << destination);
 
   UdpHeader udpHeader;
   packet.RemoveHeader (udpHeader);
@@ -149,8 +147,7 @@
            uint16_t sport, uint16_t dport)
 {
   NS_LOG_FUNCTION; 
-  NS_LOG_PARAM ("(" << &packet << ", " << saddr << ", " << daddr << ", " << 
-    sport << ", " << dport << ")");
+  NS_LOG_PARAMS (this << &packet << saddr << daddr << sport << dport);
 
   UdpHeader udpHeader;
   udpHeader.SetDestination (dport);
--- a/src/internet-node/udp-socket.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/internet-node/udp-socket.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -117,7 +117,7 @@
 UdpSocket::Bind (const Address &address)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM("(" << address << ")");
+  NS_LOG_PARAMS (this << address);
 
   if (!InetSocketAddress::IsMatchingType (address))
     {
@@ -175,7 +175,7 @@
 UdpSocket::Connect(const Address & address)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << address << ")");
+  NS_LOG_PARAMS (this << address);
   Ipv4Route routeToDest;
   InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
   m_defaultAddress = transport.GetIpv4 ();
@@ -190,7 +190,7 @@
 UdpSocket::Send (const Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   if (!m_connected)
     {
@@ -226,7 +226,7 @@
 UdpSocket::DoSendTo (const Packet &p, const Address &address)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ", " << address << ")");
+  NS_LOG_PARAMS (this << &p << address);
 
   if (!m_connected)
     {
@@ -248,7 +248,7 @@
 UdpSocket::DoSendTo (const Packet &p, Ipv4Address dest, uint16_t port)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ", " << dest << ", " << port << ")");
+  NS_LOG_PARAMS (this << &p << dest << port);
 
   Ipv4Route routeToDest;
 
@@ -308,7 +308,7 @@
 UdpSocket::SendTo(const Address &address, const Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << address << ", " << &p << ")");
+  NS_LOG_PARAMS (this << address << &p);
   InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
   Ipv4Address ipv4 = transport.GetIpv4 ();
   uint16_t port = transport.GetPort ();
@@ -319,7 +319,7 @@
 UdpSocket::ForwardUp (const Packet &packet, Ipv4Address ipv4, uint16_t port)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &packet << ", " << ipv4 << ", " << port << ")");
+  NS_LOG_PARAMS (this << &packet << ipv4 << port);
 
   if (m_shutdownRecv)
     {
--- a/src/mobility/grid-topology.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/grid-topology.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -46,7 +46,7 @@
   Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_positionClassId,
                                                                          MobilityModel::iid);
   object->AddInterface (mobility);
-  mobility->Set (Position (x, y, 0.0));
+  mobility->SetPosition (Vector (x, y, 0.0));
 }
 
 void 
@@ -58,7 +58,7 @@
   Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_positionClassId, 
                                                                          MobilityModel::iid);
   object->AddInterface (mobility);
-  mobility->Set (Position (x, y, 0.0));
+  mobility->SetPosition (Vector (x, y, 0.0));
 }
 
 
--- a/src/mobility/hierarchical-mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/hierarchical-mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -56,34 +56,34 @@
   return m_parent;
 }
 
-Position 
-HierarchicalMobilityModel::DoGet (void) const
+Vector
+HierarchicalMobilityModel::DoGetPosition (void) const
 {
-  Position parentPosition = m_parent->Get ();
-  Position childPosition = m_child->Get ();
-  return Position (parentPosition.x + childPosition.x,
+  Vector parentPosition = m_parent->GetPosition ();
+  Vector childPosition = m_child->GetPosition ();
+  return Vector (parentPosition.x + childPosition.x,
 		   parentPosition.y + childPosition.y,
 		   parentPosition.z + childPosition.z);
 }
 void 
-HierarchicalMobilityModel::DoSet (const Position &position)
+HierarchicalMobilityModel::DoSetPosition (const Vector &position)
 {
-  // This implementation of DoSet is really an arbitraty choice.
+  // This implementation of DoSetPosition is really an arbitraty choice.
   // anything else would have been ok.
-  Position parentPosition = m_parent->Get ();
-  Position childPosition (position.x - parentPosition.x,
+  Vector parentPosition = m_parent->GetPosition ();
+  Vector childPosition (position.x - parentPosition.x,
 			  position.y - parentPosition.y,
 			  position.z - parentPosition.z);
-  m_child->Set (childPosition);
+  m_child->SetPosition (childPosition);
 }
-Speed 
-HierarchicalMobilityModel::DoGetSpeed (void) const
+Vector
+HierarchicalMobilityModel::DoGetVelocity (void) const
 {
-  Speed parentSpeed = m_parent->GetSpeed ();
-  Speed childSpeed = m_child->GetSpeed ();
-  Speed speed (parentSpeed.dx + childSpeed.dx,
-               parentSpeed.dy + childSpeed.dy,
-               parentSpeed.dz + childSpeed.dz);
+  Vector parentSpeed = m_parent->GetVelocity ();
+  Vector childSpeed = m_child->GetVelocity ();
+  Vector speed (parentSpeed.x + childSpeed.x,
+               parentSpeed.y + childSpeed.y,
+               parentSpeed.z + childSpeed.z);
   return speed;
 }
 
--- a/src/mobility/hierarchical-mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/hierarchical-mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -58,9 +58,9 @@
   Ptr<MobilityModel> GetParent (void) const;
   
 private:
-  virtual Position DoGet (void) const;
-  virtual void DoSet (const Position &position);
-  virtual Speed DoGetSpeed (void) const;
+  virtual Vector DoGetPosition (void) const;
+  virtual void DoSetPosition (const Vector &position);
+  virtual Vector DoGetVelocity (void) const;
 
   void ParentChanged (const TraceContext &context, Ptr<const MobilityModel> model);
   void ChildChanged (const TraceContext &context, Ptr<const MobilityModel> model);
--- a/src/mobility/mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -33,28 +33,28 @@
 MobilityModel::~MobilityModel ()
 {}
 
-Position
-MobilityModel::Get (void) const
+Vector
+MobilityModel::GetPosition (void) const
 {
-  return DoGet ();
+  return DoGetPosition ();
 }
-Speed 
-MobilityModel::GetSpeed (void) const
+Vector
+MobilityModel::GetVelocity (void) const
 {
-  return DoGetSpeed ();
+  return DoGetVelocity ();
 }
 
 void 
-MobilityModel::Set (const Position &position)
+MobilityModel::SetPosition (const Vector &position)
 {
-  DoSet (position);
+  DoSetPosition (position);
 }
 
 double 
 MobilityModel::GetDistanceFrom (Ptr<const MobilityModel> other) const
 {
-  Position oPosition = other->DoGet ();
-  Position position = DoGet ();
+  Vector oPosition = other->DoGetPosition ();
+  Vector position = DoGetPosition ();
   return CalculateDistance (position, oPosition);
 }
 
--- a/src/mobility/mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -21,8 +21,7 @@
 #define MOBILITY_MODEL_H
 
 #include "ns3/object.h"
-#include "position.h"
-#include "speed.h"
+#include "vector.h"
 
 namespace ns3 {
 
@@ -43,15 +42,15 @@
   /**
    * \returns the current position
    */
-  Position Get (void) const;
+  Vector GetPosition (void) const;
   /**
    * \param position the position to set.
    */
-  void Set (const Position &position);
+  void SetPosition (const Vector &position);
   /**
-   * \returns the current position.
+   * \returns the current velocity.
    */
-  Speed GetSpeed (void) const;
+  Vector GetVelocity (void) const;
   /**
    * \param position a reference to another mobility model
    * \returns the distance between the two objects. Unit is meters.
@@ -70,21 +69,21 @@
    * Concrete subclasses of this base class must 
    * implement this method.
    */
-  virtual Position DoGet (void) const = 0;
+  virtual Vector DoGetPosition (void) const = 0;
   /**
    * \param position the position to set.
    *
    * Concrete subclasses of this base class must 
    * implement this method.
    */
-  virtual void DoSet (const Position &position) = 0;
+  virtual void DoSetPosition (const Vector &position) = 0;
   /**
-   * \returns the current speed.
+   * \returns the current velocity.
    *
    * Concrete subclasses of this base class must 
    * implement this method.
    */
-  virtual Speed DoGetSpeed (void) const = 0;
+  virtual Vector DoGetVelocity (void) const = 0;
 };
 
 }; // namespace ns3
--- a/src/mobility/ns2-mobility-file-topology.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/ns2-mobility-file-topology.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -97,7 +97,7 @@
 	    {
 	      double value = ReadDouble (line.substr (endNodeId + 9, std::string::npos));
 	      std::string coordinate = line.substr (endNodeId + 6, 1);
-              Position position = model->Get ();
+              Vector position = model->GetPosition ();
 	      if (coordinate == "X")
 		{
                   position.x = value;
@@ -117,7 +117,7 @@
                 {
                   continue;
                 }
-              model->Set (position);
+              model->SetPosition (position);
 	    }
 	  else 
 	    {
@@ -129,7 +129,7 @@
 	      double zSpeed = ReadDouble (line.substr (ySpeedEnd + 1, std::string::npos));
 	      NS_LOG_DEBUG ("at=" << at << "xSpeed=" << xSpeed << ", ySpeed=" << ySpeed << ", zSpeed=" << zSpeed);
 	      Simulator::Schedule (Seconds (at), &StaticSpeedMobilityModel::SetSpeed, model,
-				   Speed (xSpeed, ySpeed, zSpeed));
+				   Vector (xSpeed, ySpeed, zSpeed));
 	    }
 	}
       file.close();
--- a/src/mobility/position.cc	Thu Nov 15 09:44:23 2007 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-#include "position.h"
-#include <cmath>
-
-namespace ns3 {
-
-
-Position::Position (double _x, double _y, double _z)
-  : x (_x),
-    y (_y),
-    z (_z)
-{}
-
-Position::Position ()
-  : x (0.0),
-    y (0.0),
-    z (0.0)
-{}
-
-double 
-CalculateDistance (const Position &a, const Position &b)
-{
-  double dx = b.x - a.x;
-  double dy = b.y - a.y;
-  double dz = b.z - a.z;
-  double distance = std::sqrt (dx * dx + dy * dy + dz * dz);
-  return distance;
-}
-
-} // namespace ns3
--- a/src/mobility/position.h	Thu Nov 15 09:44:23 2007 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-#ifndef POSITION_H
-#define POSITION_H
-
-namespace ns3 {
-
-/**
- * \brief a 3d cartesian position vector
- *
- * Unit is meters.
- */
-class Position
-{
-public:
-  /**
-   * \param _x x coordinate of position vector
-   * \param _y y coordinate of position vector
-   * \param _z z coordinate of position vector
-   *
-   * Create position vector (_x, _y, _z)
-   */
-  Position (double _x, double _y, double _z);
-  /**
-   * Create position vector (0.0, 0.0, 0.0)
-   */
-  Position ();
-  /**
-   * x coordinate of position vector
-   */
-  double x;
-  /**
-   * y coordinate of position vector
-   */
-  double y;
-  /**
-   * z coordinate of position vector
-   */
-  double z;
-};
-
-double CalculateDistance (const Position &a, const Position &b);
-
-} // namespace ns3
-
-#endif /* POSITION_H */
--- a/src/mobility/random-direction-2d-mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-direction-2d-mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -153,12 +153,12 @@
 {
   NS_LOG_FUNCTION;
   double speed = m_parameters->m_speedVariable->GetValue ();
-  const Speed vector (std::cos (direction) * speed,
-                      std::sin (direction) * speed,
-                      0.0);
-  Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
+  const Vector vector (std::cos (direction) * speed,
+                       std::sin (direction) * speed,
+                       0.0);
+  Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
   m_helper.Reset (vector);
-  Position next = m_parameters->m_bounds.CalculateIntersection (position, vector);
+  Vector next = m_parameters->m_bounds.CalculateIntersection (position, vector);
   Time delay = Seconds (CalculateDistance (position, next) / speed);
   m_event = Simulator::Schedule (delay,
 				 &RandomDirection2dMobilityModel::BeginPause, this);
@@ -169,7 +169,7 @@
 {
   double direction = UniformVariable::GetSingleValue (0, PI);
   
-  Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
+  Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
   switch (m_parameters->m_bounds.GetClosestSide (position))
     {
     case Rectangle::RIGHT:
@@ -187,22 +187,22 @@
     }
   SetDirectionAndSpeed (direction);
 }
-Position
-RandomDirection2dMobilityModel::DoGet (void) const
+Vector
+RandomDirection2dMobilityModel::DoGetPosition (void) const
 {
   return m_helper.GetCurrentPosition (m_parameters->m_bounds);
 }
 void
-RandomDirection2dMobilityModel::DoSet (const Position &position)
+RandomDirection2dMobilityModel::DoSetPosition (const Vector &position)
 {
   m_helper.InitializePosition (position);
   Simulator::Remove (m_event);
   m_event = Simulator::ScheduleNow (&RandomDirection2dMobilityModel::Start, this);
 }
-Speed 
-RandomDirection2dMobilityModel::DoGetSpeed (void) const
+Vector
+RandomDirection2dMobilityModel::DoGetVelocity (void) const
 {
-  return m_helper.GetSpeed ();
+  return m_helper.GetVelocity ();
 }
 
 
--- a/src/mobility/random-direction-2d-mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-direction-2d-mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -110,9 +110,9 @@
   void SetDirectionAndSpeed (double direction);
   void InitializeDirectionAndSpeed (void);
   virtual void DoDispose (void);
-  virtual Position DoGet (void) const;
-  virtual void DoSet (const Position &position);
-  virtual Speed DoGetSpeed (void) const;
+  virtual Vector DoGetPosition (void) const;
+  virtual void DoSetPosition (const Vector &position);
+  virtual Vector DoGetVelocity (void) const;
 
   static const double PI;
   Ptr<RandomDirection2dMobilityModelParameters> m_parameters;
--- a/src/mobility/random-position.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-position.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -91,12 +91,12 @@
   m_x = 0;
   m_y = 0;
 }
-Position
+Vector
 RandomRectanglePosition::Get (void) const
 {
   double x = m_x->GetValue ();
   double y = m_y->GetValue ();
-  return Position (x, y, 0.0);
+  return Vector (x, y, 0.0);
 }
 
 RandomDiscPosition::RandomDiscPosition ()
@@ -120,7 +120,7 @@
   m_theta = 0;
   m_rho = 0;
 }
-Position
+Vector
 RandomDiscPosition::Get (void) const
 {
   double theta = m_theta->GetValue ();
@@ -128,7 +128,7 @@
   double x = m_x + std::cos (theta) * rho;
   double y = m_y + std::sin (theta) * rho;
   NS_LOG_DEBUG ("Disc position x=" << x << ", y=" << y);
-  return Position (x, y, 0.0);
+  return Vector (x, y, 0.0);
 }
 
 
--- a/src/mobility/random-position.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-position.h	Thu Nov 15 10:18:17 2007 +0100
@@ -22,7 +22,7 @@
 
 #include "ns3/object.h"
 #include "ns3/component-manager.h"
-#include "position.h"
+#include "vector.h"
 
 namespace ns3 {
 
@@ -42,7 +42,7 @@
   /**
    * \returns the next randomly-choosen position.
    */
-  virtual Position Get (void) const = 0;
+  virtual Vector Get (void) const = 0;
 };
 
 /**
@@ -68,7 +68,7 @@
   RandomRectanglePosition (const RandomVariable &x,
 			   const RandomVariable &y);
   virtual ~RandomRectanglePosition ();
-  virtual Position Get (void) const;
+  virtual Vector Get (void) const;
 private:
   RandomVariable *m_x;
   RandomVariable *m_y;
@@ -106,7 +106,7 @@
 		      const RandomVariable &rho,
 		      double x, double y);
   virtual ~RandomDiscPosition ();
-  virtual Position Get (void) const;
+  virtual Vector Get (void) const;
 private:
   RandomVariable *m_theta;
   RandomVariable *m_rho;
--- a/src/mobility/random-topology.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-topology.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -70,8 +70,8 @@
   Ptr<MobilityModel> mobility = ComponentManager::Create<MobilityModel> (m_mobilityModel, 
                                                                          MobilityModel::iid);
   object->AddInterface (mobility);
-  Position position = m_positionModel->Get ();
-  mobility->Set (position);
+  Vector position = m_positionModel->Get ();
+  mobility->SetPosition (position);
 }
 
 
--- a/src/mobility/random-walk-2d-mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-walk-2d-mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -143,9 +143,9 @@
 {
   double speed = m_parameters->m_speed->GetValue ();
   double direction = m_parameters->m_direction->GetValue ();
-  Speed vector (std::cos (direction) * speed,
-                std::sin (direction) * speed,
-                0.0);
+  Vector vector (std::cos (direction) * speed,
+                 std::sin (direction) * speed,
+                 0.0);
   m_helper.Reset (vector);
 
   Time delayLeft;
@@ -163,11 +163,11 @@
 void
 RandomWalk2dMobilityModel::DoWalk (Time delayLeft)
 {
-  Position position = m_helper.GetCurrentPosition ();
-  Speed speed = m_helper.GetSpeed ();
-  Position nextPosition = position;
-  nextPosition.x += speed.dx * delayLeft.GetSeconds ();
-  nextPosition.y += speed.dy * delayLeft.GetSeconds ();
+  Vector position = m_helper.GetCurrentPosition ();
+  Vector speed = m_helper.GetVelocity ();
+  Vector nextPosition = position;
+  nextPosition.x += speed.x * delayLeft.GetSeconds ();
+  nextPosition.y += speed.y * delayLeft.GetSeconds ();
   if (m_parameters->m_bounds.IsInside (nextPosition))
     {
       m_event = Simulator::Schedule (delayLeft, &RandomWalk2dMobilityModel::Start, this);
@@ -175,7 +175,7 @@
   else
     {
       nextPosition = m_parameters->m_bounds.CalculateIntersection (position, speed);
-      Time delay = Seconds ((nextPosition.x - position.x) / speed.dx);
+      Time delay = Seconds ((nextPosition.x - position.x) / speed.x);
       m_event = Simulator::Schedule (delay, &RandomWalk2dMobilityModel::Rebound, this,
                                      delayLeft - delay);      
     }  
@@ -185,17 +185,17 @@
 void
 RandomWalk2dMobilityModel::Rebound (Time delayLeft)
 {
-  Position position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
-  Speed speed = m_helper.GetSpeed ();
+  Vector position = m_helper.GetCurrentPosition (m_parameters->m_bounds);
+  Vector speed = m_helper.GetVelocity ();
   switch (m_parameters->m_bounds.GetClosestSide (position))
     {
     case Rectangle::RIGHT:
     case Rectangle::LEFT:
-      speed.dx = - speed.dx;
+      speed.x = - speed.x;
       break;
     case Rectangle::TOP:
     case Rectangle::BOTTOM:
-      speed.dy = - speed.dy;
+      speed.y = - speed.y;
       break;
     }
   m_helper.Reset (speed);
@@ -209,23 +209,23 @@
   // chain up
   MobilityModel::DoDispose ();
 }
-Position
-RandomWalk2dMobilityModel::DoGet (void) const
+Vector
+RandomWalk2dMobilityModel::DoGetPosition (void) const
 {
   return m_helper.GetCurrentPosition (m_parameters->m_bounds);
 }
 void
-RandomWalk2dMobilityModel::DoSet (const Position &position)
+RandomWalk2dMobilityModel::DoSetPosition (const Vector &position)
 {
   NS_ASSERT (m_parameters->m_bounds.IsInside (position));
   m_helper.InitializePosition (position);
   Simulator::Remove (m_event);
   m_event = Simulator::ScheduleNow (&RandomWalk2dMobilityModel::Start, this);
 }
-Speed 
-RandomWalk2dMobilityModel::DoGetSpeed (void) const
+Vector
+RandomWalk2dMobilityModel::DoGetVelocity (void) const
 {
-  return m_helper.GetSpeed ();
+  return m_helper.GetVelocity ();
 }
 
 
--- a/src/mobility/random-walk-2d-mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-walk-2d-mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -141,9 +141,9 @@
   void Rebound (Time timeLeft);
   void DoWalk (Time timeLeft);
   virtual void DoDispose (void);
-  virtual Position DoGet (void) const;
-  virtual void DoSet (const Position &position);
-  virtual Speed DoGetSpeed (void) const;
+  virtual Vector DoGetPosition (void) const;
+  virtual void DoSetPosition (const Vector &position);
+  virtual Vector DoGetVelocity (void) const;
 
   StaticSpeedHelper m_helper;
   EventId m_event;
--- a/src/mobility/random-waypoint-mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-waypoint-mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -117,15 +117,15 @@
 void
 RandomWaypointMobilityModel::BeginWalk (void)
 {
-  Position m_current = m_helper.GetCurrentPosition ();
-  Position destination = m_parameters->m_position->Get ();
+  Vector m_current = m_helper.GetCurrentPosition ();
+  Vector destination = m_parameters->m_position->Get ();
   double speed = m_parameters->m_speed->GetValue ();
   double dx = (destination.x - m_current.x);
   double dy = (destination.y - m_current.y);
   double dz = (destination.z - m_current.z);
   double k = speed / std::sqrt (dx*dx + dy*dy + dz*dz);
 
-  m_helper.Reset (Speed (k*dx, k*dy, k*dz));
+  m_helper.Reset (Vector (k*dx, k*dy, k*dz));
   Time travelDelay = Seconds (CalculateDistance (destination, m_current) / speed);
   m_event = Simulator::Schedule (travelDelay,
 				 &RandomWaypointMobilityModel::Start, this);
@@ -141,22 +141,22 @@
   m_event = Simulator::Schedule (pause, &RandomWaypointMobilityModel::BeginWalk, this);
 }
 
-Position 
-RandomWaypointMobilityModel::DoGet (void) const
+Vector
+RandomWaypointMobilityModel::DoGetPosition (void) const
 {
   return m_helper.GetCurrentPosition ();
 }
 void 
-RandomWaypointMobilityModel::DoSet (const Position &position)
+RandomWaypointMobilityModel::DoSetPosition (const Vector &position)
 {
   m_helper.InitializePosition (position);
   Simulator::Remove (m_event);
   Simulator::ScheduleNow (&RandomWaypointMobilityModel::Start, this);
 }
-Speed 
-RandomWaypointMobilityModel::DoGetSpeed (void) const
+Vector
+RandomWaypointMobilityModel::DoGetVelocity (void) const
 {
-  return m_helper.GetSpeed ();
+  return m_helper.GetVelocity ();
 }
 
 
--- a/src/mobility/random-waypoint-mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/random-waypoint-mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -100,9 +100,9 @@
 private:
   void Start (void);
   void BeginWalk (void);
-  virtual Position DoGet (void) const;
-  virtual void DoSet (const Position &position);
-  virtual Speed DoGetSpeed (void) const;
+  virtual Vector DoGetPosition (void) const;
+  virtual void DoSetPosition (const Vector &position);
+  virtual Vector DoGetVelocity (void) const;
 
   StaticSpeedHelper m_helper;
   Ptr<RandomWaypointMobilityModelParameters> m_parameters;
--- a/src/mobility/rectangle.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/rectangle.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -18,8 +18,7 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 #include "rectangle.h"
-#include "position.h"
-#include "speed.h"
+#include "vector.h"
 #include "ns3/assert.h"
 #include <cmath>
 #include <algorithm>
@@ -42,7 +41,7 @@
 {}
 
 bool 
-Rectangle::IsInside (const Position &position) const
+Rectangle::IsInside (const Vector &position) const
 {
   return 
     position.x <= this->xMax && position.x >= this->xMin &&
@@ -50,7 +49,7 @@
 }
 
 Rectangle::Side 
-Rectangle::GetClosestSide (const Position &position) const
+Rectangle::GetClosestSide (const Vector &position) const
 {
   double xMinDist = std::abs (position.x - this->xMin);
   double xMaxDist = std::abs (this->xMax - position.x);
@@ -82,38 +81,38 @@
     }
 }
 
-Position
-Rectangle::CalculateIntersection (const Position &current, const Speed &speed) const
+Vector
+Rectangle::CalculateIntersection (const Vector &current, const Vector &speed) const
 {
-  double xMaxY = current.y + (this->xMax - current.x) / speed.dx * speed.dy;
-  double xMinY = current.y + (this->xMin - current.x) / speed.dx * speed.dy;
-  double yMaxX = current.x + (this->yMax - current.y) / speed.dy * speed.dx;
-  double yMinX = current.x + (this->yMin - current.y) / speed.dy * speed.dx;
+  double xMaxY = current.y + (this->xMax - current.x) / speed.x * speed.y;
+  double xMinY = current.y + (this->xMin - current.x) / speed.x * speed.y;
+  double yMaxX = current.x + (this->yMax - current.y) / speed.y * speed.x;
+  double yMinX = current.x + (this->yMin - current.y) / speed.y * speed.x;
   bool xMaxYOk = (xMaxY <= this->yMax && xMaxY >= this->yMin);
   bool xMinYOk = (xMinY <= this->yMax && xMinY >= this->yMin);
   bool yMaxXOk = (yMaxX <= this->xMax && yMaxX >= this->xMin);
   bool yMinXOk = (yMinX <= this->xMax && yMinX >= this->xMin);
-  if (xMaxYOk && speed.dx >= 0)
+  if (xMaxYOk && speed.x >= 0)
     {
-      return Position (this->xMax, xMaxY, 0.0);
+      return Vector (this->xMax, xMaxY, 0.0);
     }
-  else if (xMinYOk && speed.dx <= 0)
+  else if (xMinYOk && speed.x <= 0)
     {
-      return Position (this->xMin, xMinY, 0.0);
+      return Vector (this->xMin, xMinY, 0.0);
     }
-  else if (yMaxXOk && speed.dy >= 0)
+  else if (yMaxXOk && speed.y >= 0)
     {
-      return Position (yMaxX, this->yMax, 0.0);
+      return Vector (yMaxX, this->yMax, 0.0);
     }
-  else if (yMinXOk && speed.dy <= 0)
+  else if (yMinXOk && speed.y <= 0)
     {
-      return Position (yMinX, this->yMin, 0.0);
+      return Vector (yMinX, this->yMin, 0.0);
     }
   else
     {
       NS_ASSERT (false);
       // quiet compiler
-      return Position (0.0, 0.0, 0.0);
+      return Vector (0.0, 0.0, 0.0);
     }
 
 }
--- a/src/mobility/rectangle.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/rectangle.h	Thu Nov 15 10:18:17 2007 +0100
@@ -22,8 +22,7 @@
 
 namespace ns3 {
 
-class Position;
-class Speed;
+class Vector;
 
 /**
  * \brief a 2d rectangle
@@ -51,9 +50,9 @@
    * Create a zero-sized rectangle located at coordinates (0.0,0.0)
    */
   Rectangle ();
-  bool IsInside (const Position &position) const;
-  Side GetClosestSide (const Position &position) const;
-  Position CalculateIntersection (const Position &current, const Speed &speed) const;
+  bool IsInside (const Vector &position) const;
+  Side GetClosestSide (const Vector &position) const;
+  Vector CalculateIntersection (const Vector &current, const Vector &speed) const;
 
   double xMin;
   double xMax;
--- a/src/mobility/speed.cc	Thu Nov 15 09:44:23 2007 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-#include "speed.h"
-
-namespace ns3 {
-
-Speed::Speed (double _dx, double _dy, double _dz)
-  : dx (_dx),
-    dy (_dy),
-    dz (_dz)
-{}
-
-Speed::Speed ()
-  : dx (0.0),
-    dy (0.0),
-    dz (0.0)
-{}
-
-} // namespace ns3
--- a/src/mobility/speed.h	Thu Nov 15 09:44:23 2007 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
- */
-#ifndef SPEED_H
-#define SPEED_H
-
-namespace ns3 {
-
-/**
- * \brief keep track of 3d cartesian speed vectors
- *
- * Unit is meters/s.
- */
-class Speed 
-{
-public:
-  /**
-   * \param _dx x coordinate of speed vector
-   * \param _dy y coordinate of speed vector
-   * \param _dz z coordinate of speed vector
-   *
-   * Create speed vector (_dx, _dy, _dz)
-   */
-  Speed (double _dx, double _dy, double _dz);
-  /**
-   * Create speed vector (0.0, 0.0, 0.0)
-   */
-  Speed ();
-  /**
-   * x coordinate of speed vector
-   */
-  double dx;
-  /**
-   * y coordinate of speed vector
-   */
-  double dy;
-  /**
-   * z coordinate of speed vector
-   */
-  double dz;
-};
-
-} // namespace ns3
-
-#endif /* SPEED_H */
--- a/src/mobility/static-mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/static-mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -28,7 +28,7 @@
 {
   SetInterfaceId (StaticMobilityModel::iid);
 }
-StaticMobilityModel::StaticMobilityModel (const Position &position)
+StaticMobilityModel::StaticMobilityModel (const Vector &position)
   : m_position (position)
 {
   SetInterfaceId (StaticMobilityModel::iid);
@@ -36,21 +36,21 @@
 StaticMobilityModel::~StaticMobilityModel ()
 {}
 
-Position
-StaticMobilityModel::DoGet (void) const
+Vector
+StaticMobilityModel::DoGetPosition (void) const
 {
   return m_position;
 }
 void 
-StaticMobilityModel::DoSet (const Position &position)
+StaticMobilityModel::DoSetPosition (const Vector &position)
 {
   m_position = position;
   NotifyCourseChange ();
 }
-Speed 
-StaticMobilityModel::DoGetSpeed (void) const
+Vector
+StaticMobilityModel::DoGetVelocity (void) const
 {
-  return Speed ();
+  return Vector (0.0, 0.0, 0.0);
 }
 
 }; // namespace ns3
--- a/src/mobility/static-mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/static-mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -44,15 +44,15 @@
    * Create a position located at coordinates (x,y,z).
    * Unit is meters
    */
-  StaticMobilityModel (const Position &position);
+  StaticMobilityModel (const Vector &position);
   virtual ~StaticMobilityModel ();
 
 private:
-  virtual Position DoGet (void) const;
-  virtual void DoSet (const Position &position);
-  virtual Speed DoGetSpeed (void) const;
+  virtual Vector DoGetPosition (void) const;
+  virtual void DoSetPosition (const Vector &position);
+  virtual Vector DoGetVelocity (void) const;
 
-  Position m_position;
+  Vector m_position;
 };
 
 }; // namespace ns3
--- a/src/mobility/static-speed-helper.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/static-speed-helper.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -25,40 +25,40 @@
 
 StaticSpeedHelper::StaticSpeedHelper ()
 {}
-StaticSpeedHelper::StaticSpeedHelper (const Position &position)
+StaticSpeedHelper::StaticSpeedHelper (const Vector &position)
   : m_position (position)
 {}
-StaticSpeedHelper::StaticSpeedHelper (const Position &position,
-				      const Speed &speed)
+StaticSpeedHelper::StaticSpeedHelper (const Vector &position,
+				      const Vector &speed)
   : m_position (position),
     m_speed (speed),
     m_paused (true)
 {}
 void 
-StaticSpeedHelper::InitializePosition (const Position &position)
+StaticSpeedHelper::InitializePosition (const Vector &position)
 {
   m_position = position;
-  m_speed.dx = 0.0;
-  m_speed.dy = 0.0;
-  m_speed.dz = 0.0;
+  m_speed.x = 0.0;
+  m_speed.y = 0.0;
+  m_speed.z = 0.0;
   m_lastUpdate = Simulator::Now ();
   m_paused = true;
 }
 
-Position 
+Vector
 StaticSpeedHelper::GetCurrentPosition (void) const
 {
   Update ();
   return m_position;
 }
 
-Speed 
-StaticSpeedHelper::GetSpeed (void) const
+Vector 
+StaticSpeedHelper::GetVelocity (void) const
 {
-  return m_paused? Speed (0, 0, 0) : m_speed;
+  return m_paused? Vector (0.0, 0.0, 0.0) : m_speed;
 }
 void 
-StaticSpeedHelper::SetSpeed (const Speed &speed)
+StaticSpeedHelper::SetSpeed (const Vector &speed)
 {
   Update ();
   m_speed = speed;
@@ -76,13 +76,13 @@
   Time deltaTime = now - m_lastUpdate;
   m_lastUpdate = now;
   double deltaS = deltaTime.GetSeconds ();
-  m_position.x += m_speed.dx * deltaS;
-  m_position.y += m_speed.dy * deltaS;
-  m_position.z += m_speed.dz * deltaS;
+  m_position.x += m_speed.x * deltaS;
+  m_position.y += m_speed.y * deltaS;
+  m_position.z += m_speed.z * deltaS;
 }
 
 void 
-StaticSpeedHelper::Reset (const Speed &speed)
+StaticSpeedHelper::Reset (const Vector &speed)
 {
   Update ();
   m_speed = speed;
@@ -98,7 +98,7 @@
   m_position.y = std::max (bounds.yMin, m_position.y);
 }
 
-Position 
+Vector 
 StaticSpeedHelper::GetCurrentPosition (const Rectangle &bounds) const
 {
   UpdateFull (bounds);
--- a/src/mobility/static-speed-helper.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/static-speed-helper.h	Thu Nov 15 10:18:17 2007 +0100
@@ -21,8 +21,7 @@
 #define STATIC_SPEED_HELPER_H
 
 #include "ns3/nstime.h"
-#include "position.h"
-#include "speed.h"
+#include "vector.h"
 
 namespace ns3 {
 
@@ -32,16 +31,16 @@
 {
  public:
   StaticSpeedHelper ();
-  StaticSpeedHelper (const Position &position);
-  StaticSpeedHelper (const Position &position,
-		     const Speed &speed);
-  void InitializePosition (const Position &position);
+  StaticSpeedHelper (const Vector &position);
+  StaticSpeedHelper (const Vector &position,
+		     const Vector &speed);
+  void InitializePosition (const Vector &position);
 
-  void Reset (const Speed &speed);
-  Position GetCurrentPosition (const Rectangle &bounds) const;
-  Position GetCurrentPosition (void) const;
-  Speed GetSpeed (void) const;
-  void SetSpeed (const Speed &speed);
+  void Reset (const Vector &speed);
+  Vector GetCurrentPosition (const Rectangle &bounds) const;
+  Vector GetCurrentPosition (void) const;
+  Vector GetVelocity (void) const;
+  void SetSpeed (const Vector &speed);
   void Pause (void);
   void Unpause (void);
 
@@ -49,8 +48,8 @@
   void Update (void) const;
   void UpdateFull (const Rectangle &rectangle) const;
   mutable Time m_lastUpdate;
-  mutable Position m_position;
-  Speed m_speed;
+  mutable Vector m_position;
+  Vector m_speed;
   bool m_paused;
 };
 
--- a/src/mobility/static-speed-mobility-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/static-speed-mobility-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -33,13 +33,13 @@
 {
   SetInterfaceId (StaticSpeedMobilityModel::iid);
 }
-StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position)
+StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Vector &position)
   : m_helper (position)
 {
   SetInterfaceId (StaticSpeedMobilityModel::iid);
 }
-StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Position &position,
-                                                    const Speed &speed)
+StaticSpeedMobilityModel::StaticSpeedMobilityModel (const Vector &position,
+                                                    const Vector &speed)
   : m_helper (position, speed)
 {
   SetInterfaceId (StaticSpeedMobilityModel::iid);
@@ -49,28 +49,28 @@
 {}
 
 void 
-StaticSpeedMobilityModel::SetSpeed (const Speed speed)
+StaticSpeedMobilityModel::SetSpeed (const Vector &speed)
 {
   m_helper.SetSpeed (speed);
   NotifyCourseChange ();
 }
 
 
-Position
-StaticSpeedMobilityModel::DoGet (void) const
+Vector
+StaticSpeedMobilityModel::DoGetPosition (void) const
 {
   return m_helper.GetCurrentPosition ();
 }
 void 
-StaticSpeedMobilityModel::DoSet (const Position &position)
+StaticSpeedMobilityModel::DoSetPosition (const Vector &position)
 {
   m_helper.InitializePosition (position);
   NotifyCourseChange ();
 }
-Speed 
-StaticSpeedMobilityModel::DoGetSpeed (void) const
+Vector
+StaticSpeedMobilityModel::DoGetVelocity (void) const
 {
-  return m_helper.GetSpeed ();
+  return m_helper.GetVelocity ();
 }
 
 }; // namespace ns3
--- a/src/mobility/static-speed-mobility-model.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/static-speed-mobility-model.h	Thu Nov 15 10:18:17 2007 +0100
@@ -25,7 +25,6 @@
 #include "ns3/nstime.h"
 #include "ns3/component-manager.h"
 #include "static-speed-helper.h"
-#include "speed.h"
 
 namespace ns3 {
 
@@ -48,15 +47,15 @@
    * Create a position located at coordinates (x,y,z) with
    * speed (0,0,0).
    */
-  StaticSpeedMobilityModel (const Position &position);
+  StaticSpeedMobilityModel (const Vector &position);
   /**
    *
    * Create a position located at coordinates (x,y,z) with
    * speed (dx,dy,dz).
    * Unit is meters and meters/s
    */
-  StaticSpeedMobilityModel (const Position &position,
-                            const Speed &speed);
+  StaticSpeedMobilityModel (const Vector &position,
+                            const Vector &speed);
   virtual ~StaticSpeedMobilityModel ();
 
   /**
@@ -65,11 +64,11 @@
    * Set the current speed now to (dx,dy,dz)
    * Unit is meters/s
    */
-  void SetSpeed (const Speed speed);
+  void SetSpeed (const Vector &speed);
 private:
-  virtual Position DoGet (void) const;
-  virtual void DoSet (const Position &position);
-  virtual Speed DoGetSpeed (void) const;
+  virtual Vector DoGetPosition (void) const;
+  virtual void DoSetPosition (const Vector &position);
+  virtual Vector DoGetVelocity (void) const;
   void Update (void) const;
   StaticSpeedHelper m_helper;
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mobility/vector.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -0,0 +1,48 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#include "vector.h"
+#include <cmath>
+
+namespace ns3 {
+
+
+Vector::Vector (double _x, double _y, double _z)
+  : x (_x),
+    y (_y),
+    z (_z)
+{}
+
+Vector::Vector ()
+  : x (0.0),
+    y (0.0),
+    z (0.0)
+{}
+
+double 
+CalculateDistance (const Vector &a, const Vector &b)
+{
+  double dx = b.x - a.x;
+  double dy = b.y - a.y;
+  double dz = b.z - a.z;
+  double distance = std::sqrt (dx * dx + dy * dy + dz * dz);
+  return distance;
+}
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mobility/vector.h	Thu Nov 15 10:18:17 2007 +0100
@@ -0,0 +1,63 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2007 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+#ifndef VECTOR_H
+#define VECTOR_H
+
+namespace ns3 {
+
+/**
+ * \brief a 3d cartesian position vector
+ *
+ * Unit is meters.
+ */
+class Vector
+{
+public:
+  /**
+   * \param _x x coordinate of vector vector
+   * \param _y y coordinate of vector vector
+   * \param _z z coordinate of vector vector
+   *
+   * Create vector vector (_x, _y, _z)
+   */
+  Vector (double _x, double _y, double _z);
+  /**
+   * Create vector vector (0.0, 0.0, 0.0)
+   */
+  Vector ();
+  /**
+   * x coordinate of vector vector
+   */
+  double x;
+  /**
+   * y coordinate of vector vector
+   */
+  double y;
+  /**
+   * z coordinate of vector vector
+   */
+  double z;
+};
+
+double CalculateDistance (const Vector &a, const Vector &b);
+
+} // namespace ns3
+
+#endif /* VECTOR_H */
--- a/src/mobility/wscript	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/mobility/wscript	Thu Nov 15 10:18:17 2007 +0100
@@ -3,16 +3,15 @@
 def build(bld):
     mobility = bld.create_ns3_module('mobility', ['core', 'simulator'])
     mobility.source = [
+        'vector.cc',
         'grid-topology.cc',
         'hierarchical-mobility-model.cc',
         'mobility-model.cc',
         'mobility-model-notifier.cc',
-        'position.cc',
         'random-position.cc',
         'random-topology.cc',
         'rectangle.cc',
         'rectangle-default-value.cc',
-        'speed.cc',
         'static-mobility-model.cc',
         'static-speed-helper.cc',
         'static-speed-mobility-model.cc',
@@ -24,16 +23,15 @@
 
     headers = bld.create_obj('ns3header')
     headers.source = [
+        'vector.h',
         'grid-topology.h',
         'hierarchical-mobility-model.h',
         'mobility-model.h',
         'mobility-model-notifier.h',
-        'position.h',
         'random-position.h',
         'random-topology.h',
         'rectangle.h',
         'rectangle-default-value.h',
-        'speed.h',
         'static-mobility-model.h',
         'static-speed-helper.h',
         'static-speed-mobility-model.h',
--- a/src/node/channel.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/node/channel.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -37,7 +37,7 @@
   : m_name(name)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << name << ")");
+  NS_LOG_PARAMS (this << name);
   SetInterfaceId (Channel::iid);
 }
 
@@ -50,7 +50,7 @@
 Channel::SetName(std::string name)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << name << ")");
+  NS_LOG_PARAMS (this << name);
   m_name = name;
 }
 
--- a/src/node/drop-tail-queue.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/node/drop-tail-queue.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -45,7 +45,7 @@
 DropTailQueue::SetMaxPackets (uint32_t npackets)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << npackets << ")");
+  NS_LOG_PARAMS (this << npackets);
   m_maxPackets = npackets;
 }
 
@@ -61,7 +61,7 @@
 DropTailQueue::DoEnqueue (const Packet& p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   if (m_packets.size () >= m_maxPackets)
     {
@@ -78,7 +78,7 @@
 DropTailQueue::DoDequeue (Packet& p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   if (m_packets.empty()) 
     {
@@ -98,7 +98,7 @@
 DropTailQueue::DoPeek (Packet& p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   if (m_packets.empty()) 
     {
--- a/src/node/ipv4.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/node/ipv4.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -36,13 +36,11 @@
 {}
 
 uint32_t 
-Ipv4::GetIfIndexByAddress (Ptr<Node> node, Ipv4Address a, Ipv4Mask amask)
+Ipv4::GetIfIndexByAddress (Ipv4Address addr, Ipv4Mask mask)
 {
-  Ptr<Ipv4> ipv4 = node->QueryInterface<Ipv4> (Ipv4::iid);
-  NS_ASSERT_MSG (ipv4, "Ipv4::GetIfIndexByAddress:  No Ipv4 interface");
-  for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++)
+  for (uint32_t i = 0; i < GetNInterfaces (); i++)
     {
-      if (ipv4->GetAddress (i).CombineMask(amask) == a.CombineMask(amask) )
+      if (GetAddress (i).CombineMask(mask) == addr.CombineMask(mask) )
         {
           return i;
         }
@@ -52,44 +50,4 @@
   return 0;
 }
 
-//
-// XXX BUGBUG I don't think this is really the right approach here.  The call
-// to GetRoute () filters down into Ipv4L3Protocol where it translates into
-// a call into the Ipv4 static routing package.  This bypasses any other
-// routing packages.  At a minimum, the name is misleading.
-//
-bool 
-Ipv4::GetRouteToDestination (
-  Ptr<Node> node, 
-  Ipv4Route& route, 
-  Ipv4Address a, 
-  Ipv4Mask amask)
-{
-  Ipv4Route tempRoute;
-  Ptr<Ipv4> ipv4 = node->QueryInterface<Ipv4> (Ipv4::iid);
-  NS_ASSERT_MSG (ipv4, "Ipv4::GetRouteToDestination:  No Ipv4 interface");
-  for (uint32_t i = 0; i < ipv4->GetNRoutes (); i++) 
-    {
-      tempRoute = ipv4->GetRoute (i);
-      // Host route found
-      if ( tempRoute.IsNetwork () == false && tempRoute.GetDest () == a ) 
-        {
-          route = tempRoute;
-          return true;
-        }
-      else if ( tempRoute.IsNetwork () && 
-                tempRoute.GetDestNetwork () == a.CombineMask(amask) )
-        {
-          route = tempRoute;
-          return true;
-        }
-      else if ( tempRoute.IsDefault () )
-        {
-          route = tempRoute;
-          return true;
-        }
-    }
-  return false;
-}
-
 } // namespace ns3
--- a/src/node/ipv4.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/node/ipv4.h	Thu Nov 15 10:18:17 2007 +0100
@@ -449,16 +449,16 @@
    */
   virtual void SetDown (uint32_t i) = 0;
 
-/**
- * Convenience functions (Doxygen still needed)
- *
- * Return the ifIndex corresponding to the Ipv4Address provided.
- */
-  static uint32_t GetIfIndexByAddress (Ptr<Node> node, Ipv4Address a, 
-    Ipv4Mask amask = Ipv4Mask("255.255.255.255"));
-
-  static bool GetRouteToDestination (Ptr<Node> node, Ipv4Route& route, 
-    Ipv4Address a, Ipv4Mask amask = Ipv4Mask("255.255.255.255"));
+  /**
+   * \brief Convenience function to return the ifIndex corresponding
+   * to the Ipv4Address provided
+   *
+   * \param addr Ipv4Address
+   * \param mask corresponding Ipv4Mask
+   * \returns ifIndex corresponding to a/amask
+   */
+  virtual uint32_t GetIfIndexByAddress (Ipv4Address addr, 
+    Ipv4Mask mask = Ipv4Mask("255.255.255.255"));
 };
 
 } // namespace ns3 
--- a/src/node/queue.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/node/queue.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -139,7 +139,7 @@
 Queue::Enqueue (const Packet& p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
   NS_LOG_LOGIC ("m_traceEnqueue (p)");
 
   m_traceEnqueue (p);
@@ -157,7 +157,7 @@
 Queue::Dequeue (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   bool retval = DoDequeue (p);
 
@@ -189,7 +189,7 @@
 Queue::Peek (Packet &p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
   return DoPeek (p);
 }
 
@@ -264,7 +264,7 @@
 Queue::Drop (const Packet& p)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << &p << ")");
+  NS_LOG_PARAMS (this << &p);
 
   m_nTotalDroppedPackets++;
   m_nTotalDroppedBytes += p.GetSize ();
--- a/src/routing/global-routing/candidate-queue.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/routing/global-routing/candidate-queue.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -52,7 +52,7 @@
 CandidateQueue::Push (SPFVertex *vNew)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << vNew << ")");
+  NS_LOG_PARAMS (this << vNew);
 
   CandidateList_t::iterator i = m_candidates.begin ();  
 
--- a/src/routing/global-routing/global-route-manager-impl.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/routing/global-routing/global-route-manager-impl.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -975,7 +975,7 @@
 GlobalRouteManagerImpl::SPFCalculate (Ipv4Address root)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << root << ")");
+  NS_LOG_PARAMS (this << root);
 
   SPFVertex *v;
 //
@@ -1172,7 +1172,7 @@
 // we're looking for.  If we find one, return the corresponding interface
 // index.
 //
-          return (Ipv4::GetIfIndexByAddress (node, a, amask) );
+          return (ipv4->GetIfIndexByAddress (a, amask) );
         }
     }
 //
--- a/src/routing/global-routing/global-router-interface.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/routing/global-routing/global-router-interface.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -58,8 +58,7 @@
   m_metric (metric)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << linkType << ", " << linkId << ", " << linkData << 
-    ", " << metric << ")");
+  NS_LOG_PARAMS (this << linkType << linkId << linkData << metric);
 }
 
 GlobalRoutingLinkRecord::~GlobalRoutingLinkRecord ()
@@ -157,8 +156,7 @@
   m_status(status)
 {
   NS_LOG_FUNCTION;
-  NS_LOG_PARAM ("(" << status << ", " << linkStateId << ", " << 
-    advertisingRtr << ")");
+  NS_LOG_PARAMS (this << status << linkStateId << advertisingRtr);
 }
 
 GlobalRoutingLSA::GlobalRoutingLSA (GlobalRoutingLSA& lsa)
--- a/src/routing/olsr/olsr-agent-impl.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/routing/olsr/olsr-agent-impl.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -2112,40 +2112,3 @@
 }} // namespace olsr, ns3
 
 
-
-#ifdef RUN_SELF_TESTS
-
-
-#include "ns3/test.h"
-
-namespace ns3 {
-
-class OlsrTest : public ns3::Test {
-private:
-public:
-  OlsrTest ();
-  virtual bool RunTests (void);
-
-
-};
-
-OlsrTest::OlsrTest ()
-  : ns3::Test ("Olsr")
-{}
-
-
-bool 
-OlsrTest::RunTests (void)
-{
-  bool result = true;
-
-
-  return result;
-}
-
-static OlsrTest gOlsrTest;
-
-}
-
-
-#endif /* RUN_SELF_TESTS */
--- a/src/routing/olsr/olsr-agent-impl.h	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/routing/olsr/olsr-agent-impl.h	Thu Nov 15 10:18:17 2007 +0100
@@ -48,8 +48,6 @@
 
 class AgentImpl : public Agent
 {
-  friend class OlsrTest;
-
 public:
   AgentImpl (Ptr<Node> node);
 
--- a/src/simulator/scheduler-list.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/simulator/scheduler-list.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -32,7 +32,7 @@
 public:
   SchedulerListFactory ()
   {
-    SchedulerFactory::AddDefault (this, "List");
+    SchedulerFactory::Add (this, "List");
   }
 private:
   virtual Scheduler *DoCreate (void) const
--- a/src/simulator/scheduler-map.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/simulator/scheduler-map.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -43,7 +43,7 @@
 public:
   SchedulerMapFactory ()
   {
-    SchedulerFactory::Add (this, "Map");
+    SchedulerFactory::AddDefault (this, "Map");
   }
 private:
   virtual Scheduler *DoCreate (void) const
--- a/src/simulator/time.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/src/simulator/time.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -360,62 +360,62 @@
 
 bool TimeTests::RunTests (void)
 {
-  bool ok = true;
+  bool result = true;
 
   Time t0, t1;
 
-  CheckOld(&ok);
+  CheckOld(&result);
 
   t0 = MilliSeconds ((uint64_t)10.0);
   t1 = MilliSeconds ((uint64_t)11.0);
 
-  CheckOperations(t0, t1, &ok);
+  CheckOperations(t0, t1, &result);
 
   //  t0 = Seconds ((uint64_t)10.0);
   //  t1 = Seconds ((uint64_t)11.0);
 
-  //  CheckOperations(t0, t1, &ok);
+  //  CheckOperations(t0, t1, &result);
 
-  CheckConversions((uint64_t)5, &ok);
-  CheckConversions((uint64_t)0, &ok);
-  CheckConversions((uint64_t)783, &ok);
-  CheckConversions((uint64_t)1132, &ok);
-  //  CheckConversions((uint64_t)3341039, &ok);
+  CheckConversions((uint64_t)5, &result);
+  CheckConversions((uint64_t)0, &result);
+  CheckConversions((uint64_t)783, &result);
+  CheckConversions((uint64_t)1132, &result);
+  //  CheckConversions((uint64_t)3341039, &result);
 
   // Now vary the precision and check the conversions
   if (TimeStepPrecision::Get () != TimeStepPrecision::NS) {
-    ok = false;
+    result = false;
   }
 
-  CheckPrecision(TimeStepPrecision::US, 7, &ok);
+  CheckPrecision(TimeStepPrecision::US, 7, &result);
 
-  CheckConversions((uint64_t)7, &ok);
-  CheckConversions((uint64_t)546, &ok);
-  CheckConversions((uint64_t)6231, &ok);
-  //  CheckConversions((uint64_t)1234639, &ok);
+  CheckConversions((uint64_t)7, &result);
+  CheckConversions((uint64_t)546, &result);
+  CheckConversions((uint64_t)6231, &result);
+  //  CheckConversions((uint64_t)1234639, &result);
 
-  CheckPrecision(TimeStepPrecision::MS, 3, &ok);
+  CheckPrecision(TimeStepPrecision::MS, 3, &result);
 
-  CheckConversions((uint64_t)3, &ok);
-  CheckConversions((uint64_t)134, &ok);
-  CheckConversions((uint64_t)2341, &ok);
-  //  CheckConversions((uint64_t)8956239, &ok);
+  CheckConversions((uint64_t)3, &result);
+  CheckConversions((uint64_t)134, &result);
+  CheckConversions((uint64_t)2341, &result);
+  //  CheckConversions((uint64_t)8956239, &result);
 
-  CheckPrecision(TimeStepPrecision::PS, 21, &ok);
+  CheckPrecision(TimeStepPrecision::PS, 21, &result);
 
-  CheckConversions((uint64_t)4, &ok);
-  CheckConversions((uint64_t)342, &ok);
-  CheckConversions((uint64_t)1327, &ok);
-  //  CheckConversions((uint64_t)5439627, &ok);
+  CheckConversions((uint64_t)4, &result);
+  CheckConversions((uint64_t)342, &result);
+  CheckConversions((uint64_t)1327, &result);
+  //  CheckConversions((uint64_t)5439627, &result);
 
-  CheckPrecision(TimeStepPrecision::NS, 12, &ok);
-  CheckConversions((uint64_t)12, &ok);
+  CheckPrecision(TimeStepPrecision::NS, 12, &result);
+  CheckConversions((uint64_t)12, &result);
 
-  CheckPrecision(TimeStepPrecision::S, 7, &ok);
-  CheckConversions((uint64_t)7, &ok);
+  CheckPrecision(TimeStepPrecision::S, 7, &result);
+  CheckConversions((uint64_t)7, &result);
 
-  CheckPrecision(TimeStepPrecision::FS, 5, &ok);
-  CheckConversions((uint64_t)5, &ok);
+  CheckPrecision(TimeStepPrecision::FS, 5, &result);
+  CheckConversions((uint64_t)5, &result);
 
   TimeStepPrecision::Set (TimeStepPrecision::NS);
 
@@ -426,7 +426,17 @@
   DefaultValue::Bind ("TimeStepPrecision", "PS");
   DefaultValue::Bind ("TimeStepPrecision", "FS");
 
-  return ok;
+
+  Time tooBig = TimeStep (0x8000000000000000LL);
+  NS_TEST_ASSERT (tooBig.IsNegative ());
+  tooBig = TimeStep (0xffffffffffffffffLL);
+  NS_TEST_ASSERT (tooBig.IsNegative ());
+  tooBig = TimeStep (0x7fffffffffffffffLL);
+  NS_TEST_ASSERT (tooBig.IsPositive ());
+  tooBig += TimeStep (1);
+  NS_TEST_ASSERT (tooBig.IsNegative ());
+
+  return result;
 }
 
 void TimeTests::CheckOld (bool *ok)
--- a/utils/bench-packets.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/utils/bench-packets.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -211,13 +211,19 @@
       argc--;
       argv++;
   }
+  if (n == 0)
+    {
+      std::cerr << "Error-- number of packets must be specified " <<
+        "by command-line argument --n=(number of packets)" << std::endl;
+      exit (1);
+    }
+  std::cout << "Running bench-packets with n=" << n << std::endl;
 
-
+  Packet::EnableMetadata ();
   runBench (&benchPtrA, n, "a");
   runBench (&benchPtrB, n, "b");
   runBench (&benchPtrC, n, "c");
 
-  Packet::EnableMetadata ();
   //runBench (&benchPrint, n, "print");
   PacketMetadata::SetOptOne (false);
   runBench (&benchPtrA, n, "meta-a");
--- a/utils/mobility-visualizer-model.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/utils/mobility-visualizer-model.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -48,15 +48,15 @@
     {
       Ptr<Node> node = *nodeIter;
       Ptr<MobilityModel> mobility = node->QueryInterface<MobilityModel> (MobilityModel::iid);
-      Position pos = mobility->Get ();
-      Speed vel = mobility->GetSpeed ();
+      Vector pos = mobility->GetPosition ();
+      Vector vel = mobility->GetVelocity ();
 
       NodeUpdate update;
       update.node = PeekPointer<Node> (node);
       update.x = pos.x;
       update.y = pos.y;
-      update.vx = vel.dx;
-      update.vy = vel.dy;
+      update.vx = vel.x;
+      update.vy = vel.y;
       data->updateList.push_back (update);
     }
   data->time = Simulator::Now ().GetSeconds ();
--- a/utils/run-tests.cc	Thu Nov 15 09:44:23 2007 +0100
+++ b/utils/run-tests.cc	Thu Nov 15 10:18:17 2007 +0100
@@ -21,11 +21,13 @@
 
 #include "ns3/test.h"
 #include "ns3/packet-metadata.h"
+#include "ns3/random-variable.h"
 
 
 int main (int argc, char *argv[])
 {
 #ifdef RUN_SELF_TESTS
+  ns3::RandomVariable::UseGlobalSeed(1,2,3,4,5,6);
   ns3::PacketMetadata::Enable ();
   ns3::TestManager::EnableVerbose ();
   bool success = ns3::TestManager::RunTests ();