diff --git a/Makefile.in b/Makefile.in
index 638b9fb..e315f07 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -271,6 +271,7 @@ OBJ_CC = \
 	dsr/simplecache.o dsr/sr_forwarder.o \
 	aodv/aodv_logs.o aodv/aodv.o \
 	aodv/aodv_rtable.o aodv/aodv_rqueue.o \
+ 	olsr/OLSR.o olsr/OLSR_state.o olsr/OLSR_rtable.o olsr/OLSR_printer.o \
 	common/ns-process.o \
 	satellite/satgeometry.o satellite/sathandoff.o \
 	satellite/satlink.o satellite/satnode.o \
diff --git a/common/packet.h b/common/packet.h
index 281218c..cf335fd 100644
--- a/common/packet.h
+++ b/common/packet.h
@@ -179,8 +179,11 @@ static const packet_t PT_HDLC = 59;
         // Bell Labs Traffic Trace Type (PackMime OL)
 static const packet_t PT_BLTRACE = 60;
 
+		//  UM-OLSR packet
+static const packet_t PT_OLSR = 61;
+
         // insert new packet types here
-static packet_t       PT_NTYPE = 61; // This MUST be the LAST one
+static packet_t       PT_NTYPE = 62; // This MUST be the LAST one
 
 enum packetClass
 {
@@ -363,8 +366,8 @@ public:
 		name_[PT_LMS_SETUP]="LMS_SETUP";
 
 		name_[PT_SCTP]= "sctp";
- 		name_[PT_SCTP_APP1] = "sctp_app1";
-		
+		name_[PT_SCTP_APP1] = "sctp_app1";
+
 		// smac
 		name_[PT_SMAC]="smac";
 
@@ -376,7 +379,9 @@ public:
 
 		// Bell Labs (PackMime OL)
 		name_[PT_BLTRACE]="BellLabsTrace";
-		
+
+		name_[PT_OLSR] = "UM-OLSR";
+
 		name_[PT_NTYPE]= "undefined";
 	}
 	static int addPacket(char *name);
diff --git a/queue/priqueue.cc b/queue/priqueue.cc
index b7b24b9..ec8c533 100644
--- a/queue/priqueue.cc
+++ b/queue/priqueue.cc
@@ -89,7 +89,8 @@ PriQueue::recv(Packet *p, Handler *h)
 		case PT_DSR:
 		case PT_MESSAGE:
                 case PT_TORA:
-                case PT_AODV:
+				case PT_AODV:
+				case PT_OLSR:
                         recvHighPriority(p, h);
                         break;
 
diff --git a/tcl/lib/ns-agent.tcl b/tcl/lib/ns-agent.tcl
index 39f6261..0c08fe4 100644
--- a/tcl/lib/ns-agent.tcl
+++ b/tcl/lib/ns-agent.tcl
@@ -192,3 +192,6 @@ Agent/AODV instproc init args {
 Agent/AODV set sport_   0
 Agent/AODV set dport_   0
 
+Agent/OLSR set sport_	0
+Agent/OLSR set dport_	0
+
diff --git a/tcl/lib/ns-default.tcl b/tcl/lib/ns-default.tcl
index 470e2a8..ef15d18 100644
--- a/tcl/lib/ns-default.tcl
+++ b/tcl/lib/ns-default.tcl
@@ -1450,6 +1450,14 @@ Queue set util_records_ 5 ; 		# Changed from 0 to 5, 2/25/05.
 
 Delayer set debug_ false
 
+# Defaults defined for UM-OLSR
+Agent/OLSR set debug_       false
+Agent/OLSR set use_mac_     false
+Agent/OLSR set willingness_ 3
+Agent/OLSR set hello_ival_  2
+Agent/OLSR set tc_ival_     5
+Agent/OLSR set mid_ival_    5
+
 Agent/TCP/Linux set rtxcur_init_ 3
 Agent/TCP/Linux set maxrto_ 120
 Agent/TCP/Linux set minrto_ 0.2
diff --git a/tcl/lib/ns-lib.tcl b/tcl/lib/ns-lib.tcl
index 870440d..5e1706d 100644
--- a/tcl/lib/ns-lib.tcl
+++ b/tcl/lib/ns-lib.tcl
@@ -630,6 +630,9 @@ Simulator instproc create-wireless-node args {
 		    AODV {
 			    set ragent [$self create-aodv-agent $node]
 		    }
+ 		    OLSR {
+ 			    set ragent [$self create-olsr-agent $node]
+	 	    }
 		    TORA {
 			    Simulator set IMEPFlag_ ON
 			    set ragent [$self create-tora-agent $node]
@@ -828,6 +831,16 @@ Simulator instproc create-dumb-agent { node } {
 	return $ragent
 }
 
+
+Simulator instproc create-olsr-agent { node } {
+	#  Create UM-OLSR routing agent
+	set ragent [new Agent/OLSR [$node node-addr]]
+	$self at 0.0 "$ragent start"
+	$node set ragent_ $ragent
+	return $ragent
+}
+
+
 Simulator instproc create-manual-rtg-agent { node } {
 	
 	# create a simple wireless agent
diff --git a/tcl/lib/ns-packet.tcl b/tcl/lib/ns-packet.tcl
index 494c726..f2c6f30 100644
--- a/tcl/lib/ns-packet.tcl
+++ b/tcl/lib/ns-packet.tcl
@@ -167,6 +167,7 @@ foreach prot {
         MIP 	# Mobile IP, mobile/mip-reg.cc
 	Smac 	# Sensor-MAC
 	TORA 	# routing protocol for ad-hoc networks
+	OLSR  # routing protocol for ad-hoc networks
 # Other:
 	Encap 	# common/encap.cc
         IPinIP 	# IP encapsulation 
diff --git a/trace/cmu-trace.cc b/trace/cmu-trace.cc
index 58bf240..6a954a9 100644
--- a/trace/cmu-trace.cc
+++ b/trace/cmu-trace.cc
@@ -51,6 +51,7 @@
 #include <tora/tora_packet.h> //TORA
 #include <imep/imep_spec.h>         // IMEP
 #include <aodv/aodv_packet.h> //AODV
+#include <olsr/OLSR_pkt.h> // UM-OLSR
 #include <cmu-trace.h>
 #include <mobilenode.h>
 #include <simulator.h>
@@ -944,6 +945,81 @@ CMUTrace::format_aodv(Packet *p, int offset)
 }
 
 void
+CMUTrace::format_olsr(Packet *p, int offset)
+{
+	OLSR_pkt* op = PKT_OLSR(p);
+
+	if (pt_->tagged()) {
+		sprintf(pt_->buffer() + offset,
+			"-olsr:n %d -olsr:s %d ",
+			op->count,
+			op->pkt_seq_num());
+
+		int len = strlen(pt_->buffer());
+		for (int i = 0; i < op->count; i++) {
+			const char *s;
+			if (op->msg(i).msg_type() == OLSR_HELLO_MSG)
+				s = "-olsr:t HELLO -olsr:o %d -olsr:h %d -olsr:ms %d ";
+			else if (op->msg(i).msg_type() == OLSR_TC_MSG)
+				s = "-olsr:t TC -olsr:o %d -olsr:h %d -olsr:ms %d ";
+			else
+				s = "-olsr:t UNKNOWN -olsr:o %d -olsr:h %d -olsr:ms %d ";
+			sprintf(pt_->buffer() + len, s,
+				op->msg(i).orig_addr(),
+				op->msg(i).hop_count(),
+				op->msg(i).msg_seq_num());
+			len = strlen(pt_->buffer());
+		}
+	}
+	else if (newtrace_) {
+		sprintf(pt_->buffer() + offset,
+			"-P olsr -Pn %d -Ps %d ",
+			op->count,
+			op->pkt_seq_num());
+
+		int len = strlen(pt_->buffer());
+		for (int i = 0; i < op->count; i++) {
+			const char *s;
+			if (op->msg(i).msg_type() == OLSR_HELLO_MSG)
+				s = "[-Pt HELLO -Po %d -Ph %d -Pms %d] ";
+			else if (op->msg(i).msg_type() == OLSR_TC_MSG)
+				s = "[-Pt TC -Po %d -Ph %d -Pms %d] ";
+			else
+				s = "[-Pt UNKNOWN -Po %d -Ph %d -Pms %d] ";
+			sprintf(pt_->buffer() + len, s,
+				op->msg(i).orig_addr(),
+				op->msg(i).hop_count(),
+				op->msg(i).msg_seq_num());
+			len = strlen(pt_->buffer());
+		}
+	}
+	else {
+		sprintf(pt_->buffer() + offset,
+			"[%d %d ",
+			op->count,
+			op->pkt_seq_num());
+
+		int len = strlen(pt_->buffer());
+		for (int i = 0; i < op->count; i++) {
+			const char *s;
+			if (op->msg(i).msg_type() == OLSR_HELLO_MSG)
+				s = "[HELLO %d %d %d]";
+			else if (op->msg(i).msg_type() == OLSR_TC_MSG)
+				s = "[TC %d %d %d]";
+			else
+				s = "[UNKNOWN %d %d %d]";
+			sprintf(pt_->buffer() + len, s,
+				op->msg(i).orig_addr(),
+				op->msg(i).hop_count(),
+				op->msg(i).msg_seq_num());
+			len = strlen(pt_->buffer());
+		}
+
+		sprintf(pt_->buffer() + len, "]");
+	}
+}
+
+void
 CMUTrace::nam_format(Packet *p, int offset)
 {
 	Node* srcnode = 0 ;
@@ -1209,6 +1285,9 @@ void CMUTrace::format(Packet* p, const char *why)
 		case PT_AODV:
 			format_aodv(p, offset);
 			break;
+		case PT_OLSR:
+			format_olsr(p, offset);
+			break;
 		case PT_TORA:
                         format_tora(p, offset);
                         break;
diff --git a/trace/cmu-trace.h b/trace/cmu-trace.h
index 4fe718c..3fc1f86 100644
--- a/trace/cmu-trace.h
+++ b/trace/cmu-trace.h
@@ -159,6 +159,7 @@ private:
 	void	format_tora(Packet *p, int offset);
         void    format_imep(Packet *p, int offset);
         void    format_aodv(Packet *p, int offset);
+		void    format_olsr(Packet *p, int offset);
 
 	// This holds all the tracers added at run-time
 	static PacketTracer *pktTrc_;

