Index: fedd/federation/emulab_access.py
===================================================================
--- fedd/federation/emulab_access.py	(revision 451fb964516e296f54945e31fb6b30b2b9e1d7e6)
+++ fedd/federation/emulab_access.py	(revision c16737805160ce0add895aa57419538856c8a7b5)
@@ -965,6 +965,5 @@
 
 	# Names longer than the emulab max are discarded
-	# Projects with a group require nonce experiment names as well
-	if ename and len(ename) <= self.max_name_len and '/' not in proj:
+	if ename and len(ename) <= self.max_name_len:
 	    # Clean up the experiment name so that emulab will accept it.
 	    ename = re.sub(vchars_re, '-', ename)
Index: fedd/federation/local_emulab_segment.py
===================================================================
--- fedd/federation/local_emulab_segment.py	(revision 451fb964516e296f54945e31fb6b30b2b9e1d7e6)
+++ fedd/federation/local_emulab_segment.py	(revision c16737805160ce0add895aa57419538856c8a7b5)
@@ -63,5 +63,7 @@
 	Start a sub-experiment on a federant.
 
-	Get the current state, modify or create as appropriate, ship data
+	Get the current state, and terminate the experiment if it exists. The
+	group membership of the experiment is difficult to determine or change,
+	so start with a clean slate.  Create a new one and ship data
 	and configs and start the experiment.  There are small ordering
 	differences based on the initial state of the sub-experiment.
@@ -70,7 +72,9 @@
 	state = self.get_state(pid, eid)
 
-	if state == 'none':
-	    if not self.make_null_experiment(pid, eid, tmpdir, gid):
-		return False
+	if state != 'none':
+	    self.terminate_exp(pid, eid)
+
+	if not self.make_null_experiment(pid, eid, tmpdir, gid):
+	    return False
 
 	if not self.set_up_experiment_filespace(pid, eid, tmpdir):
@@ -84,13 +88,12 @@
 	    return False
 	
-	# Stage the new configuration (active experiments will stay swapped
-	# in now)
+	# Stage the new configuration
 	if not self.modify_exp(pid, eid, tcl):
 	    self.log.error("modify failed")
 	    return False
-	# Active experiments are still swapped, this swaps the others in.
-	if state != 'active':
-	    if not self.swap_exp(pid, eid, 'in'):
-		return False
+
+	if not self.swap_exp(pid, eid, 'in'):
+	    self.log.error("swap in failed")
+	    return False
 	# Everything has gone OK.
 	self.get_mapping(pid,eid)
Index: fedd/federation/proxy_emulab_segment.py
===================================================================
--- fedd/federation/proxy_emulab_segment.py	(revision 451fb964516e296f54945e31fb6b30b2b9e1d7e6)
+++ fedd/federation/proxy_emulab_segment.py	(revision c16737805160ce0add895aa57419538856c8a7b5)
@@ -285,7 +285,8 @@
 	Start a sub-experiment on a federant.
 
-	Get the current state, modify or create as appropriate, ship data
+	Get the current state, and terminate the experiment if it exists. The
+	group membership of the experiment is difficult to determine or change,
+	so start with a clean slate.  Create a new one and ship data
 	and configs and start the experiment.  There are small ordering
-	differences based on the initial state of the sub-experiment.
 	"""
 	# ops node in the federant
@@ -296,9 +297,12 @@
 	    return False
 	
-	if state == 'none':
-	    # Put a dummy in place to capture logs, and establish an experiment
-	    # directory.
-	    if not self.make_null_experiment(user, host, pid, eid, tmpdir, gid):
-		return False
+	if state != 'none':
+	    self.ssh_cmd(user, host, 
+		    "/usr/testbed/bin/endexp -w %s %s" % (pid, eid))
+
+	# Put a dummy in place to capture logs, and establish an experiment
+	# directory.
+	if not self.make_null_experiment(user, host, pid, eid, tmpdir, gid):
+	    return False
 
 	if not self.set_up_experiment_filespace(user, host, pid, eid, tmpdir):
@@ -318,8 +322,8 @@
 	    # if it hangs, assume the worst.
 	    return False
-	# Active experiments are still swapped, this swaps the others in.
-	if state != 'active':
-	    if not self.swap_in(user, host, pid, eid):
-		return False
+
+	if not self.swap_in(user, host, pid, eid):
+	    self.log.error("swap in failed")
+	    return False
 	# Everything has gone OK.
 	self.get_mapping(user, host, pid,eid)
