Index: fedd/federation/emulab_access.py
===================================================================
--- fedd/federation/emulab_access.py	(revision b709861c37a497e1ae0e4e757f53e205aa0440ec)
+++ fedd/federation/emulab_access.py	(revision 1ae1aa2daa942cd15ff46b173451674c97b6ff28)
@@ -1037,7 +1037,10 @@
 		if not self.create_debug:
 		    if e.name in info.node:
-			add_new(("%s%s" % (info.node[e.name][0], self.domain),),
-				e.localname)
-			e.status = info.node[e.name][1]
+			add_new(("%s%s" % 
+			    (info.node[e.name].pname, self.domain),),
+			    e.localname)
+			e.status = info.node[e.name].status
+			os = info.node[e.name].getOS()
+			if os: e.os = [ os ]
 		else:
 		    # Simple debugging assignment
@@ -1270,4 +1273,10 @@
 	info(self, user, proj, ename)
 	self.decorate_topology(info, topo)
+	self.state_lock.acquire()
+	if aid in self.allocation:
+	    self.allocation[aid]['topo'] = topo
+	    self.write_state()
+	self.state_lock.release()
+
 	return { 
 		'allocID': req['allocID'], 
@@ -1330,5 +1339,5 @@
 		debug=self.create_debug, boss=self.boss, 
 		cert=self.xmlrpc_cert)
-	ops(self, op, ptargets, params)
+	ops(self, op, ptargets, params, topo)
 	
 	status.extend(ops.status)
Index: fedd/federation/emulab_segment.py
===================================================================
--- fedd/federation/emulab_segment.py	(revision b709861c37a497e1ae0e4e757f53e205aa0440ec)
+++ fedd/federation/emulab_segment.py	(revision 1ae1aa2daa942cd15ff46b173451674c97b6ff28)
@@ -3,4 +3,5 @@
 import logging 
 import util
+import topdl
 
 from M2Crypto import SSL
@@ -17,4 +18,22 @@
 
 class emulab_segment:
+    class node_info:
+	def __init__(self, name, pname, status=None, osname=None, 
+		osversion=None, image=None):
+	    self.name = name
+	    self.pname = pname
+	    self.status = status
+	    self.osname = osname
+	    self.osversion = osversion
+	    self.image = image
+	def getOS(self):
+	    rv = None
+	    if self.osname or self.osversion:
+		rv = topdl.OperatingSystem(name=self.osname, 
+			version=self.osversion)
+	    if self.image and rv:
+		rv.set_attribute('image', self.image)
+	    return rv
+
     def __init__(self, boss, cert):
 	self.ctxt = fedd_ssl_context(my_cert=cert)
@@ -34,4 +53,5 @@
 	self.node = { }
 	self.status = [ ]
+	self.node_info = emulab_segment.node_info
 
     def emulab_call(self, method, params):
@@ -207,4 +227,11 @@
 	    return code == 0
 
+    def get_osid_map(self):
+	oses = { }
+	code, osids = self.emulab_call('osid.getlist', {})
+	for key, val in osids.items():
+	    val['imageid'] = key
+	    oses[val['osid']] = val
+	return oses
 
     def get_mapping(self, pid, eid):
@@ -223,4 +250,6 @@
 	    if self.log:
 		self.log.info("[get_mapping] Generating mapping")
+
+	    osidmap = self.get_osid_map()
 
 	    params = {
@@ -235,8 +264,20 @@
 			st = v.get('status', 'up')
 			ev = v.get('eventstatus', 'ISUP')
+			os = v.get('osid', None)
 
 			if st == 'up' and ev in ev_ok: st = 'active'
 			else: st = 'failed'
-			self.node[k] = (v['pnode'], st)
+
+			if os and os in osidmap:
+			   osname = osidmap[os].get('OS', None)
+			   osversion = osidmap[os].get('version', None)
+			   osimage = "%s/%s" % \
+				   ( osidmap[os].get('pid', ''), 
+					   osidmap[os].get('imageid', ''))
+			else:
+			    osname = osversion = osimage = None
+
+			self.node[k] = self.node_info(k, v['pnode'], st,
+				osname, osversion, osimage)
 		if self.log:
 		    self.log.info("Mapping complete")
@@ -245,6 +286,14 @@
 		raise service_error(service_error.internal,
 			"Cannot get node mapping of segment:%s/%s" % (pid, eid))
-
-    def do_operation(self, op, lnode, pnode, params):
+    def get_image(self, node, top):
+	for e in top.elements:
+	    if isinstance(e, topdl.Computer):
+		if node == e.name:
+		    if e.os: 
+			return e.os[0].get_attribute('image')
+	return None
+
+
+    def do_operation(self, op, lnode, pnode, params, top):
 	"""
 	Carry out operation on node in the given experiment.
@@ -268,7 +317,24 @@
 		return False
 	    elif state == 'initial': 
-		self.status.append(operation_status(lnode,
-			operation_status.unsupp, 'Image load unsupported'))
-		return False
+		image = self.get_image(lnode, top)
+		if image:
+		    pid, iid = image.split('/')
+		    p = {'nodes': pnode, 'imagename': iid, 'imageproj': pid, 
+			    'wait': False}
+		    code, result = self.emulab_call('node.reload', p)
+		    if code == 0: 
+			self.status.append(operation_status(lnode,
+			    operation_status.success, 'reloading'))
+			return True
+		    else:
+			self.status.append(operation_status(lnode,
+				operation_status.federant, 
+				'Error code: %d' % code))
+			return False
+		else:
+		    self.status.append(operation_status(lnode,
+			    operation_status.federant, 
+			    'cannot find imageid??'))
+		    return False
 	    elif state == 'boot': 
 		p = {'nodes': pnode, 'wait': False}
Index: fedd/federation/experiment_control.py
===================================================================
--- fedd/federation/experiment_control.py	(revision b709861c37a497e1ae0e4e757f53e205aa0440ec)
+++ fedd/federation/experiment_control.py	(revision 1ae1aa2daa942cd15ff46b173451674c97b6ff28)
@@ -829,6 +829,5 @@
 	    for e in top.elements:
 		if isinstance(e, topdl.Computer):
-		    self.node[e.name] = \
-			    (e.localname, e.status, e.service, e.operation)
+		    self.node[e.name] = e
 
 	def __call__(self, uri, aid, topo, masters, attrs=None, connInfo=None):
@@ -990,8 +989,10 @@
 		    ann = s.node.get(e.name, None)
 		    if ann is not None:
-			add_new(ann[0], e.localname)
-			e.status = ann[1]
-			add_new(ann[2], e.service)
-			add_new(ann[3], e.operation)
+			add_new(ann.localname, e.localname)
+			e.status = ann.status
+			add_new(ann.service, e.service)
+			add_new(ann.operation, e.operation)
+			if ann.os:
+			    e.os = ann.os
 			break
 
Index: fedd/federation/local_emulab_segment.py
===================================================================
--- fedd/federation/local_emulab_segment.py	(revision b709861c37a497e1ae0e4e757f53e205aa0440ec)
+++ fedd/federation/local_emulab_segment.py	(revision 1ae1aa2daa942cd15ff46b173451674c97b6ff28)
@@ -139,7 +139,7 @@
 	emulab_segment.__init__(self, boss=boss, cert=cert)
 
-    def __call__(self, parent, op, targets, param):
+    def __call__(self, parent, op, targets, param, top):
 	for l, p in targets.items():
 	    self.log.info("[operation_segment]: Calling op on %s(%s)" % (l,p))
-	    self.do_operation(op, l, p, param)
+	    self.do_operation(op, l, p, param, top)
 	return True
