Index: fedd/federation/experiment_control.py
===================================================================
--- fedd/federation/experiment_control.py	(revision 829246e9ec0924722fa3133894904384d4031ac1)
+++ fedd/federation/experiment_control.py	(revision a3ad8bda151c4074b1e9fa5731eea8514bf0c1c2)
@@ -332,4 +332,5 @@
         # Dispatch tables
         self.soap_services = {\
+                'New': soap_handler('New', self.new_experiment),
                 'Create': soap_handler('Create', self.create_experiment),
                 'Vtopo': soap_handler('Vtopo', self.get_vtopo),
@@ -342,4 +343,5 @@
 
         self.xmlrpc_services = {\
+                'New': xmlrpc_handler('New', self.new_experiment),
                 'Create': xmlrpc_handler('Create', self.create_experiment),
                 'Vtopo': xmlrpc_handler('Vtopo', self.get_vtopo),
@@ -498,4 +500,5 @@
         for fid in self.accessdb.keys():
             self.auth.set_attribute(fid, 'create')
+            self.auth.set_attribute(fid, 'new')
 
     def read_mapdb(self, file):
@@ -868,5 +871,4 @@
 	    }
 
-        
     def release_access(self, tb, aid, uri=None):
         """
@@ -1214,5 +1216,6 @@
 
 
-    def create_experiment_state(self, fid, req, expid, expcert):
+    def create_experiment_state(self, fid, req, expid, expcert, 
+	    state='starting'):
 	"""
 	Create the initial entry in the experiment's state.  The expid and
@@ -1221,5 +1224,5 @@
 	includes a suggested local name that is used if possible.  If the local
 	name is already taken by an experiment owned by this user that has
-	failed, it is overwriutten.  Otherwise new letters are added until a
+	failed, it is overwritten.  Otherwise new letters are added until a
 	valid localname is found.  The generated local name is returned.
 	"""
@@ -1250,5 +1253,5 @@
                     'experimentID' : \
                             [ { 'localname' : eid }, {'fedid': expid } ],
-                    'experimentStatus': 'starting',
+                    'experimentStatus': state,
                     'experimentAccess': { 'X509' : expcert },
                     'owner': fid,
@@ -1271,5 +1274,5 @@
                     'experimentID' : \
                             [ { 'localname' : eid }, {'fedid': expid } ],
-                    'experimentStatus': 'starting',
+                    'experimentStatus': state,
                     'experimentAccess': { 'X509' : expcert },
                     'owner': fid,
@@ -1858,4 +1861,70 @@
 
 
+    def new_experiment(self, req, fid):
+        """
+	The external interface to empty initial 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, 'new'):
+            raise service_error(service_error.access, "New access denied")
+
+        try:
+            tmpdir = tempfile.mkdtemp(prefix="split-")
+        except IOError:
+            raise service_error(service_error.internal, "Cannot create tmp dir")
+
+        try:
+            access_user = self.accessdb[fid]
+        except KeyError:
+            raise service_error(service_error.internal,
+                    "Access map and authorizer out of sync in " + \
+                            "create_experiment for fedid %s"  % fid)
+
+        pid = "dummy"
+        gid = "dummy"
+
+        req = req.get('NewRequestBody', None)
+        if not req:
+            raise service_error(service_error.req,
+                    "Bad request format (no NewRequestBody)")
+
+        # Generate an ID for the experiment (slice) and a certificate that the
+        # allocator can use to prove they own it.  We'll ship it back through
+        # the encrypted connection.
+        (expid, expcert) = generate_fedid("test", dir=tmpdir, log=self.log)
+
+	#now we're done with the tmpdir, and it should be empty
+	if self.cleanup:
+	    self.log.debug("[new_experiment]: removing %s" % tmpdir)
+	    os.rmdir(tmpdir)
+	else:
+	    self.log.debug("[new_experiment]: not removing %s" % tmpdir)
+
+	eid = self.create_experiment_state(fid, req, expid, expcert, 
+		state='empty')
+
+        # Let users touch the state
+        self.auth.set_attribute(fid, expid)
+        self.auth.set_attribute(expid, expid)
+        # Override fedids can manipulate state as well
+        for o in self.overrides:
+            self.auth.set_attribute(o, expid)
+
+        rv = {
+                'experimentID': [
+                    {'localname' : eid }, { 'fedid': copy.copy(expid) }
+                ],
+                'experimentStatus': 'empty',
+                'experimentAccess': { 'X509' : expcert }
+            }
+
+        return rv
+
+
     def create_experiment(self, req, fid):
         """
