Index: fedd/fedd_client.py
===================================================================
--- fedd/fedd_client.py	(revision f8ae7aa21df9586925f7919bf3024089601c29fc)
+++ fedd/fedd_client.py	(revision 5f6929a58dfd8b77af1ca354af9c7a3c38df9c65)
@@ -1443,6 +1443,9 @@
         msg = {
                 'experimentdescription': { 'ns2description': exp_desc },
-                'master': opts.master,
-                'exportProject': { 'localname': opts.project },
+		'service': [ { 'name': 'project_export', 'fedAttr': [ 
+		    { 'attribute': 'testbed', 'value': opts.master },
+		    { 'attribute': 'project', 'value': opts.project },
+		    ],
+		    'visibility': 'export' }, ]
 	    }
 
Index: fedd/federation/deter_impl.py
===================================================================
--- fedd/federation/deter_impl.py	(revision f8ae7aa21df9586925f7919bf3024089601c29fc)
+++ fedd/federation/deter_impl.py	(revision 5f6929a58dfd8b77af1ca354af9c7a3c38df9c65)
@@ -5,5 +5,5 @@
 import protogeni_access
 from experiment_control import experiment_control_local
-from split import split_local
+from ns2topdl import ns2topdl_local
 from util import read_simple_accessdb
 from fedid import fedid
@@ -101,8 +101,8 @@
 		    self.get_handler = None
 
-	    if config.has_section("splitter"):
-		self.splitter = split_local(config, self.auth)
-		self.soap_services.update(self.splitter.soap_services) 
-		self.xmlrpc_services.update(self.splitter.xmlrpc_services) 
+	    if config.has_section("ns2topdl"):
+		self.ns2topdl = ns2topdl_local(config, self.auth)
+		self.soap_services.update(self.ns2topdl.soap_services) 
+		self.xmlrpc_services.update(self.ns2topdl.xmlrpc_services) 
 
 def new_feddservice(config):
Index: fedd/federation/experiment_control.py
===================================================================
--- fedd/federation/experiment_control.py	(revision f8ae7aa21df9586925f7919bf3024089601c29fc)
+++ fedd/federation/experiment_control.py	(revision 5f6929a58dfd8b77af1ca354af9c7a3c38df9c65)
@@ -184,5 +184,5 @@
     call_StartSegment = service_caller('StartSegment')
     call_TerminateSegment = service_caller('TerminateSegment')
-    call_Ns2Split = service_caller('Ns2Split')
+    call_Ns2Topdl = service_caller('Ns2Topdl')
 
     def __init__(self, config=None, auth=None):
@@ -243,5 +243,5 @@
                 "synch_store")
         self.store_url = config.get("experiment_control", "store_url")
-        self.splitter_url = config.get("experiment_control", "splitter_uri")
+        self.splitter_url = config.get("experiment_control", "ns2topdl_uri")
         self.fedkit = parse_tarfile_list(\
                 config.get("experiment_control", "fedkit"))
@@ -268,5 +268,5 @@
         self.state_lock = Lock()
         self.tclsh = "/usr/local/bin/otclsh"
-        self.tcl_splitter = config.get("splitter", "tcl_splitter") or \
+        self.tcl_splitter = config.get("ns2topdl", "tcl_splitter") or \
                 config.get("experiment_control", "tcl_splitter",
                         "/usr/testbed/lib/ns2ir/parse.tcl")
@@ -797,9 +797,9 @@
         # Tweak search order so that if there are entries in access_user that 
 	# have a project matching the export project, we try them first 
-	if export_project and export_project.has_key('localname'): 
-	    pn = export_project['localname'] 
-		
-	    access_sequence = [ (p, u) for p, u in access_user if p == pn] 
-	    access_sequence.extend([(p, u) for p, u in access_user if p != pn]) 
+	if export_project: 
+	    access_sequence = [ (p, u) for p, u in access_user \
+		    if p == export_project] 
+	    access_sequence.extend([(p, u) for p, u in access_user \
+		    if p != export_project]) 
 	else: 
 	    access_sequence = access_user 
@@ -825,8 +825,7 @@
                     }
 
+	    # If there is a master, and this is it, ask it to export services
+	    # XXX move this to export pseudo-service
             if tb == master:
-                # NB, the export_project parameter is a dict that includes
-                # the type
-                req['exportProject'] = export_project
 		req['service'] = [
 			{ 'name': 'userconfig', 'visibility': 'export'},
@@ -922,18 +921,15 @@
         # better error coding
 
-    def remote_splitter(self, uri, desc, master):
+    def remote_ns2topdl(self, uri, desc):
 
         req = {
                 'description' : { 'ns2description': desc },
-                'master': master,
-                'include_fedkit': bool(self.fedkit),
-                'include_gatewaykit': bool(self.gatewaykit)
             }
 
-        r = self.call_Ns2Split(uri, req, self.cert_file, self.cert_pwd, 
+        r = self.call_Ns2Topdl(uri, req, self.cert_file, self.cert_pwd, 
                 self.trusted_certs)
 
-        if r.has_key('Ns2SplitResponseBody'):
-            r = r['Ns2SplitResponseBody']
+        if r.has_key('Ns2TopdlResponseBody'):
+            r = r['Ns2TopdlResponseBody']
 	    ed = r.get('experimentdescription', None)
             if ed.has_key('topdldescription'):
@@ -2007,4 +2003,19 @@
         return rv
 
+    def get_master_project(self, req):
+	master= None
+	export_project = None
+	for e in [ s for s in req.get('service', []) \
+		if s.get('name') == 'project_export']:
+	    for a in e.get('fedAttr', []):
+		attr = a.get('attribute', None)
+		if attr == 'testbed':
+		    master = a.get('value', None)
+		elif attr == 'project':
+		    export_project = a.get('value', None)
+	
+	return (master, export_project)
+
+
 
     def create_experiment(self, req, fid):
@@ -2103,13 +2114,13 @@
                 raise service_error(service_error.server_config, 
                         "Bad key type (%s)" % self.ssh_type)
-
-            master = req.get('master', None)
+	    master, export_project = self.get_master_project(req)
+	    # XXX get these out when master and project are optional
             if not master:
                 raise service_error(service_error.req,
                         "No master testbed label")
-            export_project = req.get('exportProject', None)
             if not export_project:
                 raise service_error(service_error.req, "No export project")
-           
+	    # XXX
+
 	    # Translate to topdl
             if self.splitter_url:
@@ -2117,6 +2128,5 @@
                 self.log.debug("Calling remote splitter at %s" % \
                         self.splitter_url)
-                top = self.remote_splitter(self.splitter_url,
-                        file_content, master)
+                top = self.remote_ns2topdl(self.splitter_url, file_content)
             else:
                 tclcmd = [self.tclsh, self.tcl_splitter, '-t', '-x', 
Index: fedd/federation/ns2topdl.py
===================================================================
--- fedd/federation/ns2topdl.py	(revision 5f6929a58dfd8b77af1ca354af9c7a3c38df9c65)
+++ fedd/federation/ns2topdl.py	(revision 5f6929a58dfd8b77af1ca354af9c7a3c38df9c65)
@@ -0,0 +1,144 @@
+#!/usr/local/bin/python
+
+import os,sys
+import subprocess
+import tempfile
+import logging
+import topdl
+
+from util import *
+from fedid import fedid
+from remote_service import xmlrpc_handler, soap_handler
+from service_error import *
+from authorizer import authorizer
+
+
+class nullHandler(logging.Handler):
+    def emit(self, record): pass
+
+fl = logging.getLogger("fedd.splitter")
+fl.addHandler(nullHandler())
+
+class ns2topdl_local:
+    def __init__(self, config=None, auth=None):
+	"""
+	Intialize the various attributes, most from the config object
+	"""
+	self.debug = config.getboolean("ns2topdl", "debug")
+	self.muxmax = config.getint("ns2topdl", "muxmax", 3)
+	self.tclsh = config.get("ns2topdl", "tclsh", 
+		"/usr/local/bin/otclsh")
+	self.tcl_splitter = config.get("ns2topdl", "tcl_splitter",
+		"/usr/testbed/lib/ns2ir/parse.tcl")
+	access_db = config.get("ns2topdl", "accessdb", None)
+	allow_any = config.getboolean("ns2topdl", "allow_any", False)
+
+	self.log = logging.getLogger("fedd.ns2topdl")
+	set_log_level(config, "ns2topdl", self.log)
+	self.trace_file = sys.stderr
+
+	set_log_level(config, "ns2topdl", self.log)
+
+	if auth:
+	    self.auth= auth
+	else:
+	    self.auth = authorizer()
+	    self.log.warning("[ns2topdl] No authorizer passed in, " +\
+		    "using local one")
+
+	if access_db and allow_any: 
+	    raise service_error(service_error.internal, 
+		    "Cannot specify both an access database and allow_any " +\
+			    "for ns2topdl")
+	
+	if access_db:
+	    try:
+		read_simple_accessdb(access_db, self.auth, 'ns2topdl')
+	    except IOError, e:
+		raise service_error(service_error.internal,
+			"Error reading accessDB %s: %s" % (access_db, e))
+	    except ValueError:
+		raise service_error(service_error.internal, "%s" % e)
+	elif allow_any:
+	    auth.set_global_attribute("ns2topdl")
+
+
+	# Dispatch tables
+	self.soap_services = {\
+		'Ns2Topdl': soap_handler("Ns2Topdl", self.run_ns2topdl),
+	}
+
+	self.xmlrpc_services = {\
+		'Ns2Topdl': xmlrpc_handler('Ns2Topdl', self.run_ns2topdl),
+	}
+
+    def run_ns2topdl(self, req, fid):
+	"""
+	The external interface to tcl to topdl translation.
+
+	Creates a working directory, translates the incoming description using
+	the tcl script.
+	"""
+
+	if not self.auth.check_attribute(fid, 'ns2topdl'):
+	    raise service_error(service_error.access, "Access Denied")
+
+	try:
+	    tmpdir = tempfile.mkdtemp(prefix="ns2topdl-")
+	except IOError:
+	    raise service_error(service_error.internal, "Cannot create tmp dir")
+
+	tclfile = tmpdir + "/experiment.tcl"
+	pid = "dummy"
+	gid = "dummy"
+	eid = "dummy"
+	master = "dummy"
+
+	req = req.get('Ns2TopdlRequestBody', None)
+	if not req:
+	    raise service_error(service_error.req,
+		    "Bad request format (no Ns2TopdlRequestBody)")
+	# The tcl parser needs to read a file so put the content into that file
+	descr=req.get('description', None)
+	if descr:
+	    file_content=descr.get('ns2description', None)
+	    if file_content:
+		try:
+		    f = open(tclfile, 'w')
+		    f.write(file_content)
+		    f.close()
+		except IOError:
+		    raise service_error(service_error.internal,
+			    "Cannot write temp experiment description")
+	    else:
+		raise service_error(service_error.req, 
+			"Only ns2descriptions supported")
+	else:
+	    raise service_error(service_error.req, "No description")
+
+	
+	tclcmd = [self.tclsh, self.tcl_splitter, '-t', '-x', 
+	    str(self.muxmax), '-m', master]
+	tclcmd.extend([pid, gid, eid, tclfile])
+	self.log.debug("Calling splitter %s" % " ".join(tclcmd))
+	tclparser = subprocess.Popen(tclcmd, stdout=subprocess.PIPE)
+
+	top = topdl.topology_from_xml(file=tclparser.stdout, top="experiment")
+
+	# Walk up tmpdir, deleting as we go
+	for path, dirs, files in os.walk(tmpdir, topdown=False):
+	    for f in files:
+		os.remove(os.path.join(path, f))
+	    for d in dirs:
+		os.rmdir(os.path.join(path, d))
+	os.rmdir(tmpdir)
+
+	resp = { 
+		'experimentdescription':  { 
+		    'topdldescription': top.to_dict(),
+		    }
+		}
+
+	return resp
+
+
Index: fedd/federation/split.py
===================================================================
--- fedd/federation/split.py	(revision f8ae7aa21df9586925f7919bf3024089601c29fc)
+++ 	(revision )
@@ -1,156 +1,0 @@
-#!/usr/local/bin/python
-
-import os,sys
-import subprocess
-import tempfile
-import logging
-import topdl
-
-from util import *
-from fedid import fedid
-from remote_service import xmlrpc_handler, soap_handler
-from service_error import *
-from authorizer import authorizer
-
-
-class nullHandler(logging.Handler):
-    def emit(self, record): pass
-
-fl = logging.getLogger("fedd.splitter")
-fl.addHandler(nullHandler())
-
-class split_local:
-    def __init__(self, config=None, auth=None):
-	"""
-	Intialize the various attributes, most from the config object
-	"""
-	self.debug = config.getboolean("splitter", "debug")
-	self.muxmax = config.getint("splitter", "muxmax", 3)
-	self.tclsh = config.get("splitter", "tclsh", 
-		"/usr/local/bin/otclsh")
-	self.tcl_splitter = config.get("splitter", "tcl_splitter",
-		"/usr/testbed/lib/ns2ir/parse.tcl")
-	access_db = config.get("splitter", "accessdb", None)
-	allow_any = config.getboolean("splitter", "allow_any", False)
-
-	self.log = logging.getLogger("fedd.splitter")
-	set_log_level(config, "splitter", self.log)
-	self.trace_file = sys.stderr
-
-	set_log_level(config, "splitter", self.log)
-
-	if auth:
-	    self.auth= auth
-	else:
-	    self.auth = authorizer()
-	    self.log.warning("[splitter] No authorizer passed in, " +\
-		    "using local one")
-
-	if access_db and allow_any: 
-	    raise service_error(service_error.internal, 
-		    "Cannot specify both an access database and allow_any " +\
-			    "for splitter")
-	
-	if access_db:
-	    try:
-		read_simple_accessdb(access_db, self.auth, 'split')
-	    except IOError, e:
-		raise service_error(service_error.internal,
-			"Error reading accessDB %s: %s" % (access_db, e))
-	    except ValueError:
-		raise service_error(service_error.internal, "%s" % e)
-	elif allow_any:
-	    auth.set_global_attribute("split")
-
-
-	# Dispatch tables
-	self.soap_services = {\
-		'Ns2Split': soap_handler("Ns2Split", self.run_splitter),
-	}
-
-	self.xmlrpc_services = {\
-		'Ns2Split': xmlrpc_handler('Ns2Split', self.run_splitter),
-	}
-
-    def run_splitter(self, req, fid):
-	"""
-	The external interface to experiment creation called from the
-	dispatcher.
-
-	Creates a working directory, splits the incoming description using the
-	splitter script and parses out the avrious subsections using the
-	lcasses above.  Once each sub-experiment is created, use pooled threads
-	to instantiate them and start it all up.
-	"""
-
-	if not self.auth.check_attribute(fid, 'split'):
-	    raise service_error(service_error.access, "Access Denied")
-
-	try:
-	    tmpdir = tempfile.mkdtemp(prefix="split-")
-	except IOError:
-	    raise service_error(service_error.internal, "Cannot create tmp dir")
-
-	tclfile = tmpdir + "/experiment.tcl"
-	pid = "dummy"
-	gid = "dummy"
-	eid = "dummy"
-
-	req = req.get('Ns2SplitRequestBody', None)
-	if not req:
-	    raise service_error(service_error.req,
-		    "Bad request format (no Ns2SplitRequestBody)")
-	# The tcl parser needs to read a file so put the content into that file
-	descr=req.get('description', None)
-	if descr:
-	    file_content=descr.get('ns2description', None)
-	    if file_content:
-		try:
-		    f = open(tclfile, 'w')
-		    f.write(file_content)
-		    f.close()
-		except IOError:
-		    raise service_error(service_error.internal,
-			    "Cannot write temp experiment description")
-	    else:
-		raise service_error(service_error.req, 
-			"Only ns2descriptions supported")
-	else:
-	    raise service_error(service_error.req, "No description")
-
-	master = req.get('master', None)
-	if master == None:
-	    raise service_error(service_error.req, "No master testbed label")
-	
-	include_fedkit = req.get('include_fedkit', None)
-	if include_fedkit == None:
-	    raise service_error(service_error.req, 
-		    "No federation kit inclusion directive")
-	
-	
-	tclcmd = [self.tclsh, self.tcl_splitter, '-t', '-x', 
-	    str(self.muxmax), '-m', master]
-	if include_fedkit: tclcmd.append('-k')
-	tclcmd.extend([pid, gid, eid, tclfile])
-	self.log.debug("Calling splitter %s" % " ".join(tclcmd))
-	tclparser = subprocess.Popen(tclcmd, stdout=subprocess.PIPE)
-
-	top = topdl.topology_from_xml(file=tclparser.stdout, top="experiment")
-
-	# Walk up tmpdir, deleting as we go
-	for path, dirs, files in os.walk(tmpdir, topdown=False):
-	    for f in files:
-		os.remove(os.path.join(path, f))
-	    for d in dirs:
-		os.rmdir(os.path.join(path, d))
-	os.rmdir(tmpdir)
-
-	resp = { 
-		'experimentdescription':  { 
-		    'topdldescription': top.to_dict(),
-		    }
-		}
-
-	return resp
-
-
