diff --git a/defs-duerig-emulab b/defs-duerig-emulab
index d498e4df5f649d6ae68c6cfc9c5e8fd21e1451f1..b222f8d5bcc86d7fb48777c24cae5df5e9557e94 100644
--- a/defs-duerig-emulab
+++ b/defs-duerig-emulab
@@ -15,15 +15,15 @@ WWW=www.emulab.net/dev/duerig
 THISHOMEBASE=Duerig.Emulab.Net
 
 # Turn off a bunch of stuff that Jon isn't actually going to need
-WINSUPPORT=0
-WIKISUPPORT=0
-BUGDBSUPPORT=0
-MAILMANSUPPORT=0
-CVSSUPPORT=0
-CHATSUPPORT=0
-NFSTRACESUPPORT=0
-ARCHIVESUPPORT=0
-OPSDBSUPPORT=0
-SFSSUPPORT=0
-PELABSUPPORT=0
-PLABSUPPORT=0
+#WINSUPPORT=0
+#WIKISUPPORT=0
+#BUGDBSUPPORT=0
+#MAILMANSUPPORT=0
+#CVSSUPPORT=0
+#CHATSUPPORT=0
+#NFSTRACESUPPORT=0
+#ARCHIVESUPPORT=0
+#OPSDBSUPPORT=0
+#SFSSUPPORT=0
+#PELABSUPPORT=0
+#PLABSUPPORT=0
diff --git a/protogeni/rspec/protogeni-rspec-common.rnc b/protogeni/rspec/protogeni-rspec-common.rnc
index 3285a40e757702d8875e5fd01e50ad7e8e94b66a..185cc73db50c105db17ebc193da0f8d87e3adbfa 100644
--- a/protogeni/rspec/protogeni-rspec-common.rnc
+++ b/protogeni/rspec/protogeni-rspec-common.rnc
@@ -32,7 +32,7 @@ NodeContents =
     }*
 
   LinkContents =
-	# Each link has exactly one virtualization technology, which we simply
+    # Each link has exactly one virtualization technology, which we simply
     # enumerate here
     attribute virtualization_type { "raw" | "trellis-vserver" |
       "planetlab-vserver" | "emulab-vnode" }? &
diff --git a/tbsetup/ptopgen.in b/tbsetup/ptopgen.in
index c16e8898e31133dd9f823b43afe504b168927d8a..d0f180d3c92383aea967ae9fb23d202bbd1de888 100644
--- a/tbsetup/ptopgen.in
+++ b/tbsetup/ptopgen.in
@@ -13,6 +13,14 @@ use Math::BigInt;
 use lib "@prefix@/lib";
 use libdb qw(TBGetSiteVar);
 
+my $PGENISUPPORT = @PROTOGENI_SUPPORT@;
+
+if ($PGENISUPPORT) {
+  require GeniHRN;
+}
+
+use GeniHRN;
+
 sub usage()
 {
     print("Usage: ptopgen [-v] [-s switch] [-p pid [-e eid]] [-m factor] " .
@@ -47,7 +55,12 @@ my $do_xml    = 0;
 my $genimode  = 0;
 my $useshared = 0;
 
+my $OURDOMAIN = "@OURDOMAIN@";
 my $cmuuid = TBGetSiteVar('protogeni/cm_uuid');
+my $cmurn = "";
+if ($PGENISUPPORT) {
+    $cmurn = GeniHRN::Generate($OURDOMAIN, "authority", "cm");
+}
 
 my $delaycap_override;
 
@@ -161,7 +174,7 @@ if (defined($options{"e"})) {
 }
 if (defined($options{"x"})) {
     $genimode = 1
-	if (defined($options{"g"}));
+	if (defined($options{"g"}) && $PGENISUPPORT);
     $do_xml = 1;
 }
 usage()
@@ -173,7 +186,7 @@ my %nodetointerface;
 
 # Read interfaces
 my $result = DBQueryFatal("SELECT node_id,card,port,iface,interface_type" .
-		     " from interfaces");
+		     " from interfaces;");
 while (($node,$card,$port,$iface,$type) = $result->fetchrow_array) {
     push @{ $nodetointerface{"$node"} }, $iface;
     $interfacemap{"$node:$card:$port"} = $iface;
@@ -200,7 +213,10 @@ $result = DBQueryFatal("SELECT n.node_id, n.eventstate, n.role, n.uuid, " .
 		       "where nt.isvirtnode = 0 or nt.isvirtnode is null;");
 while (($node,$eventstate, $role, $uuid, $reserved, $isremotenode,
 	$wa_attrvalue, $sharing_mode) = $result->fetchrow_array) {
-    $nodetouuid{$node} = $uuid;
+    if (defined($uuid) && $uuid ne "")
+    {
+	$nodetouuid{$node} = $uuid;
+    }
     my $islocal = $role eq 'testnode'
 	&& ((! defined($isremotenode) || $isremotenode == 0)
 	    || (defined($wa_attrvalue) && $wa_attrvalue == 1));
@@ -484,7 +500,6 @@ while (($node,$type,$physnode,$class,$issubnode,$def_boot_osid,$reserved,
 	$subnode_of{$node} = $physnode;
     }
     $node_def_boot_osid{$node} = $def_boot_osid;
-    $node_uuids{$node} = $uuid;
 
     if ($reserved) {
 	$is_reserved{$node} = 1;
@@ -540,7 +555,7 @@ foreach $node (keys(%nodes)) {
     my $cpu_speed = $typemap{$type}->{'SPEED'};
     my $ram = $typemap{$type}->{'RAM'};
     my $trivspeed = $typemap{$type}->{'TRIVSPEED'};
-    my $uuid = $node_uuids{$node};
+    my $uuid = $nodetouuid{$node};
     
     my @types = ("$type:1");
     my @features;
@@ -1129,10 +1144,9 @@ foreach $interconnect (keys(%interconnects)) {
 #
 my @wireless_protos = ("80211", "80211a", "80211b", "80211g", "flex900");
 my $fake_switch = "airswitch";
-if (!$genimode) {
-    my @fake_switch_types = map("*$_:*", @wireless_protos);
-    print_node($fake_switch, \@fake_switch_types, [], [], undef, []);
-}
+
+my @fake_switch_types = map("*$_:*", @wireless_protos);
+print_node($fake_switch, \@fake_switch_types, [], [], undef, []);
 
 foreach my $interface (keys(%interfacetypes)) {
     my ($node,$card,$port) = split(":", $interface);
@@ -1290,23 +1304,19 @@ sub print_node
     } elsif ($genimode) {
 	# rspec format
 	print "<node ";
-	print "component_manager_uuid=\"${cmuuid}\" ";
+	print "component_manager_uuid=\"$cmurn\" ";
 	print "component_name=\"$name\" ";
-	if (defined($uuid)) {
-	    print " component_uuid=\"$uuid\" ";
-	}
+	my $urn = GeniHRN::Generate($OURDOMAIN, "node", $name);
+	print " component_uuid=\"$urn\" ";
 	print ">\n";
 	# TODO: Virtualization type
 	print_node_types(@$types);
-	if ($nodetoavailable{$name})
-	{
-	    print "  <available>true</available>";
-	}
-	else
-	{
-	    print "  <available>false</available>";
+	if ($nodetoavailable{$name}) {
+	    print "  <available>true</available>\n";
+	} else {
+	    print "  <available>false</available>\n";
 	}
-	print_node_interfaces(@$interfaces);
+	print_node_interfaces($name, @$interfaces);
 	print "</node>\n";
     } else {
 	# ptop format
@@ -1398,10 +1408,13 @@ sub print_node_flags
 
 sub print_node_interfaces
 {
+    my $nodeName = shift(@_);
+    my @interfaces = @_;
     my $i = 0;
-    for (; $i < scalar(@_); ++$i) {
-	my $name = $_[$i];
-	print "  <interface component_name=\"${name}\"/>\n";
+    for (; $i < scalar(@interfaces); ++$i) {
+	my $name = $interfaces[$i];
+	my $urn = GeniHRN::GenerateInterface($OURDOMAIN, $nodeName, $name);
+	print "  <interface component_name=\"$urn\"/>\n";
     }
 }
 
@@ -1440,22 +1453,23 @@ sub print_named_link_xml
     my $loss = shift(@_);
     my $proto_count = scalar(@_);
     if ($genimode) {
-	print "<link>\n";
-	print "  <component_link ";
+	print "<link ";
 	print "component_manager_uuid=\"${cmuuid}\" ";
 	print "component_name=\"$name\" ";
-# TODO: link uuid
-	print "component_uuid=\"00000\" ";
-	print "/>\n";
+	my $urn = GeniHRN::Generate($OURDOMAIN, "link", $name);
+	print "component_uuid=\"$urn\" ";
+	print ">\n";
+	print_interface($source, $source_if);
+	print_interface($dest, $dest_if);
     } else {
 	print "<link name=\"$name\">\n";
+	print "  <source_interface><interface>\n";
+	print_interface_contents($source, $source_if);
+	print "  </interface></source_interface>\n";
+	print "  <destination_interface><interface>\n";
+	print_interface_contents($dest, $dest_if);
+	print "  </interface></destination_interface>\n";
     }
-    print "  <source_interface><interface>\n";
-    print_interface_contents($source, $source_if);
-    print "  </interface></source_interface>\n";
-    print "  <destination_interface><interface>\n";
-    print_interface_contents($dest, $dest_if);
-    print "  </interface></destination_interface>\n";
     print "  <bandwidth>$bw</bandwidth>\n";
     print "  <latency>$delay</latency>\n";
     print "  <packet_loss>$loss</packet_loss>\n";
@@ -1467,25 +1481,26 @@ sub print_named_link_xml
     print "</link>\n\n";
 }
 
-sub print_interface_contents
+sub print_interface
 {
     my $node = shift(@_);
     my $interface = shift(@_);
-    if ($genimode) {
-	print "    <component_node_uuid>";
-	my $uuid = $nodetouuid{$node};
-	if (defined($uuid)) {
-	    print "$uuid";
-	} else {
-	    print "0000";
-	}
-	print "</component_node_uuid>\n";
-	print "    <component_interface_name>$interface</component_interface_name>\n";
-    } else {
-	print "    <node_name>$node</node_name>\n";
-	print "    <interface_name>$interface</interface_name>\n";
-    }
+    print "  <interface ";
+    print "component_node_uuid=\"";
+    my $nodeUrn = GeniHRN::Generate($OURDOMAIN, "node", $node);
+    print $nodeUrn;
+    my $interfaceUrn = GeniHRN::GenerateInterface($OURDOMAIN, $node,
+						  $interface);
+    print "\" component_interface_name=\"" . $interfaceUrn . "\"";
+    print "/>\n";
+}
 
+sub print_interface_contents
+{
+    my $node = shift(@_);
+    my $interface = shift(@_);
+    print "    <node_name>$node</node_name>\n";
+    print "    <interface_name>$interface</interface_name>\n";
 }
 
 # Print a link with a unique name not necessarily related to source,