Index: fedd/federation/emulab_access.py
===================================================================
--- fedd/federation/emulab_access.py	(revision ea0e8cbcded733a87750860eb9a493652d40e07b)
+++ fedd/federation/emulab_access.py	(revision 26821ac3e5fea6b1b1cb87f7adc7faca8aaf518a)
@@ -104,4 +104,5 @@
 	self.info_segment = emulab_segment.info_segment
 	self.operation_segment = emulab_segment.operation_segment
+	self.exports_segment = emulab_segment.exports_segment
 
         self.restricted = [ ]
@@ -563,44 +564,33 @@
     def export_store_info(self, cf, proj, ename, connInfo):
 	"""
-	For the export requests in the connection info, install the peer names
-	at the experiment controller via SetValue calls.
+	For the export requests in the connection info, send out teh SetValue
+	calls for parameters initialized by the segment's export_segment
+	object. Values are all in the connInfo parameter's value fields.
 	"""
 
 	for c in connInfo:
-	    for p in [ p for p in c.get('parameter', []) \
-		    if p.get('type', '') == 'output']:
-
-		if p.get('name', '') == 'peer':
-		    k = p.get('key', None)
-		    surl = p.get('store', None)
-		    if surl :
-			if self.nat_portal:
-			    value = self.nat_portal
-			elif k and k.index('/') != -1:
-			    value = "%s.%s.%s%s" % \
-				(k[k.index('/')+1:], ename, proj, self.domain)
-			else: 
-			    self.log.error("Bad export request: %s" % p)
-			    continue
-			self.log.debug("Setting %s to %s on %s" % \
-				(k, value, surl))
-			req = { 'name': k, 'value': value }
-			self.call_SetValue(surl, req, cf)
-		    else:
-			self.log.error("Bad export request: %s" % p)
-		elif p.get('name', '') == 'ssh_port':
-		    k = p.get('key', None)
-		    surl = p.get('store', None)
-		    if surl and k:
-			req = { 'name': k, 'value': self.ssh_port }
-			self.log.debug("Setting %s to %s on %s" % \
-				(k, self.ssh_port, surl))
-			self.call_SetValue(surl, req, cf)
-		    else:
-			self.log.error("Bad export request: %s" % p)
-		else:
-		    self.log.error("Unknown export parameter: %s" % \
+	    for p in c.get('parameter', []):
+		# Ignore non-output parameters
+		if p.get('type', '') != 'output':
+		    continue
+		# Sanity check store, key and value
+		surl = p.get('store', None)
+		key = p.get('key', None)
+		value = p.get('value', None)
+		if surl is None:
+		    self.log.error("Export parameter without store: %s" % \
 			    p.get('name'))
 		    continue
+		if key is None:
+		    self.log.error("Export parameter without key: %s" % \
+			    p.get('name'))
+		    continue
+		if value is None:
+		    self.log.error("Unknown (unset) export parameter: %s" % \
+			    p.get('name'))
+		    continue
+		# Set the store value
+		req = { 'name': key, 'value': value }
+		self.call_SetValue(surl, req, cf)
 
     def add_seer_node(self, topo, name, startup):
@@ -984,4 +974,8 @@
 	    self.configure_seer_services(services, topo, softdir)
 	    # Get and send synch store variables
+	    exporter = self.exports_segment(keyfile=self.ssh_privkey_file,
+		    debug=self.create_debug, log=alloc_log, boss=self.boss,
+		    ops=self.ops, cert=xmlrpc_cert)
+	    exporter(self, ename, proj, user, connInfo, tmpdir, gid)
 	    self.export_store_info(certfile, proj, ename, connInfo)
 	    self.import_store_info(certfile, connInfo)
Index: fedd/federation/emulab_segment.py
===================================================================
--- fedd/federation/emulab_segment.py	(revision ea0e8cbcded733a87750860eb9a493652d40e07b)
+++ fedd/federation/emulab_segment.py	(revision 26821ac3e5fea6b1b1cb87f7adc7faca8aaf518a)
@@ -181,2 +181,51 @@
 	    self.do_operation(op, l, p, param, top)
 	return True
+
+class exports_segment(ssh_emulab_segment, xmlrpc_emulab_segment):
+    '''
+    Class to export parameters from this segment.  For a standard segment these
+    are calculated, so there is no testbed interaction.  For shared-NAT DETER
+    installations, this is more involved.  This class is a hook for that more
+    involved setup.
+    '''
+    def __init__(self, log=None, keyfile=None, debug=False, boss=None,
+	    ops=None, cert=None):
+	ssh_emulab_segment.__init__(self, log=log, keyfile=keyfile, debug=debug)
+	xmlrpc_emulab_segment.__init__(self, boss=boss, ops=ops, cert=cert)
+
+    def __call__(self, parent, eid, pid, user, connInfo, tmpdir, timeout=0,
+	    gid=None):
+	'''
+	Install the parameter values into each output parameter in each
+	connInfo entry.  This class understands peer and ssh_port output
+	variables.
+	'''
+
+	for c in connInfo:
+	    for p in c.get('parameter', []):
+		# Only set output parameters
+		if  p.get('type', '') != 'output':
+		    continue
+		name = p.get('name', '')
+		# Debugging output
+		k = p.get('key', None)
+		if name == 'peer':
+		    if parent.nat_portal:
+			value = parent.nat_portal
+		    elif k and k.index('/') != -1:
+			value = "%s.%s.%s%s" % \
+			    (k[k.index('/')+1:], eid, pid, parent.domain)
+		    else:
+			self.log.error("Bad export request: %s" % p)
+			continue
+		    p['value'] = value
+		    self.log.debug("Assigning %s to %s" % (k, value))
+		elif name == 'ssh_port':
+		    value = parent.ssh_port
+		    p['value'] = value
+		    self.log.debug("Assigning %s to %s" % (k, value))
+		else:
+		    self.log.error("Unknown export parameter: %s" % \
+			    p.get('name'))
+		    continue
+	return True
