Index: axis/Ftopo.java
===================================================================
--- axis/Ftopo.java	(revision cfc4d68cb4e45963ff15d3552f527f4c420f6978)
+++ axis/Ftopo.java	(revision 6bedbdba95fa86da37dcd0fca8e04160480215bf)
@@ -20,11 +20,15 @@
 	    java.rmi.RemoteException {
 
+	String exptName = "test";
+	String urlString = "https://users.isi.deterlab.net:23235";
+
+	if (args.length > 0) exptName = args[0];
+	if (args.length > 1) urlString = args[1];
+
 	// Get the port and construct the (simple) request.
-	FeddPortType port = getPort("https://users.isi.deterlab.net:23235");
+	FeddPortType port = getPort(urlString);
 	InfoRequestType req = new InfoRequestType(
-		new IDType(null, null, null, args[0], null));
+		new IDType(null, null, null, exptName, null), true, true);
 	InfoResponseType resp = null;
-	Map<String, List<EmbeddingMapType> > tbNodes = 
-	    new TreeMap<String, List<EmbeddingMapType>>();
 	VtopoType vt = null;
 	TopologyType top = null;
@@ -45,33 +49,6 @@
 	}
 
-	// Put each embedding mapping (object containing embedding info) into a
-	// List keyed by testbed.
-	System.out.println("From embedding:");
-	for (EmbeddingMapType m: resp.getEmbedding()) {
-	    List<EmbeddingMapType> al = null;
 
-	    if (tbNodes.containsKey(m.getTestbed())) {
-		al = tbNodes.get(m.getTestbed());
-	    }
-	    else {
-		al = new ArrayList<EmbeddingMapType>();
-		tbNodes.put(m.getTestbed(), al);
-	    }
-	    al.add(m);
-	}
-
-	for (String tb: tbNodes.keySet()) {
-	    System.out.println("Testbed: " + tb);
-	    for ( EmbeddingMapType m : tbNodes.get(tb)) {
-		System.out.print("\t" + m.getToponame() + " ");
-		for ( String pn : m.getPhysname())
-		    System.out.print(pn + " " );
-		System.out.println();
-	    }
-	    System.out.println();
-	}
-	System.out.println();
-
-	// There's a topdl description in there, too
+	// Walk the topdl description
 	top = resp.getExperimentdescription().getTopdldescription();
 	if ( top == null ) { 
@@ -85,4 +62,6 @@
 	    if ( c != null) {
 		System.out.println("\t" + c.getName());
+		for (String name : c.getLocalname()) 
+		    System.out.println("\t\t" + name);
 		for (AttributeType a: c.getAttribute()) 
 		    System.out.println("\t\t" + a.getAttribute() + " " +
Index: axis/ParseTopdl.java
===================================================================
--- axis/ParseTopdl.java	(revision cfc4d68cb4e45963ff15d3552f527f4c420f6978)
+++ axis/ParseTopdl.java	(revision 6bedbdba95fa86da37dcd0fca8e04160480215bf)
@@ -23,5 +23,5 @@
      * parser at 3 places: when an XML element starts (&lt;element&gt;) when
      * one ends (&lt;element/&gt;) and whenever characters inside an element
-     * are encountered.  It mostly initializes fileds as elements are exited,
+     * are encountered.  It mostly initializes fields as elements are exited,
      * collecting other parsed fields into objects that are finally attached to
      * the topology itself.
@@ -48,4 +48,6 @@
 	/** the most recent name element parsed */
 	protected String name;
+	// Many statuses as well
+	protected StatusType status;
 
 	// CPU parameters
@@ -62,4 +64,10 @@
 	/** Current OS distro version */
 	protected String distributionversion;
+	/** Local names of this node */
+	protected Vector<String> localnames;
+
+	/** True if in a Computer testbed or substrate that has local names */
+	protected boolean collectLocalnames;
+
 
 	// Software parameters
@@ -68,4 +76,13 @@
 	/** Current software location */
 	protected String location;
+
+	// Service Parameters
+	protected Vector<String> importers;
+	protected Vector<ServiceParamType> serviceParams;
+	protected String description;
+
+	//ServiceParam parameters
+	protected String serviceParamName;
+	protected ServiceParamTypeType serviceParamType;
 
 	// Storage parameters
@@ -136,4 +153,8 @@
 	/** Interfaces seen so far */
 	protected Vector<InterfaceType> interfaces;
+	/** Services seen so far */
+	protected Vector<ServiceType> services;
+	/** Operations seen so far */
+	protected Vector<String> operations;
 
 	/**
@@ -157,4 +178,16 @@
 	 */
 	protected Stack<String> nameStack;
+	/**
+	 * Analogous to attrStack for status
+	 */
+	protected Stack<StatusType> statusStack;
+	/**
+	 * Analogous to attrElements for names.
+	 */
+	protected Set<String> statusElements;
+	/**
+	 * These elements collect localnames
+	 */
+	protected Set<String> localnameElements;
 	/**
 	 * The current buffer of characters collected.
@@ -183,4 +216,7 @@
 	    other = null;
 
+	    localnames = new Vector<String>();
+	    collectLocalnames = false;
+
 	    type = null;
 	    name = null;
@@ -188,4 +224,5 @@
 
 	    version = distribution = distributionversion = null;
+	    description = null;
 
 	    install = location = null;
@@ -212,4 +249,6 @@
 
 	    aname = aval = null;
+	    importers = new Vector<String>();;
+	    serviceParams = new Vector<ServiceParamType>();
 
 	    elements = new Vector<ElementType>();
@@ -220,5 +259,8 @@
 	    storage = new Vector<StorageType>();
 	    interfaces = new Vector<InterfaceType>();
+	    services = new Vector<ServiceType>();
+	    serviceParams = new Vector<ServiceParamType>();
 	    attrs = new Vector<AttributeType>();
+	    operations = new Vector<String>();
 
 	    attrElements = new TreeSet<String>();
@@ -232,7 +274,19 @@
 	    nameElements = new TreeSet<String>();
 	    for (String e : new String[] {
-		"computer", "os", "interface", "substrates" 
+		"computer", "os", "interface", "substrates", "service",
+		"param"
 	    }) nameElements.add(e);
 	    nameStack = new Stack<String>();
+
+	    statusElements = new TreeSet<String>();
+	    for (String e : new String[] {
+		"computer", "testbed", "substrates", "service",
+	    }) statusElements.add(e);
+	    statusStack = new Stack<StatusType>();
+
+	    localnameElements = new TreeSet<String>();
+	    for (String e : new String[] {
+		"computer", "testbed", "substrates",
+	    }) localnameElements.add(e);
 	    c = new char[0];
 	}
@@ -265,4 +319,11 @@
 		nameStack.push(name);
 		name = null;
+	    }
+	    if ( statusElements.contains(qn) ) {
+		statusStack.push(status);
+		status = null;
+	    }
+	    if ( localnameElements.contains(qn) ) {
+		collectLocalnames = true;
 	    }
 	    if (qn.equals("id")) inID = true;
@@ -321,5 +382,10 @@
 			interfaces.toArray(
 			    new InterfaceType[interfaces.size()]),
-			attrs.toArray(new AttributeType[attrs.size()]));
+			attrs.toArray(new AttributeType[attrs.size()]),
+			localnames.toArray(new String[localnames.size()]),
+			status,
+			services.toArray(new ServiceType[services.size()]),
+			operations.toArray(new String[operations.size()])
+			);
 		name = nameStack.pop();
 		cpus = new Vector<CpuType>();
@@ -329,4 +395,9 @@
 		interfaces = new Vector<InterfaceType>();
 		attrs = attrStack.pop();
+		localnames = new Vector<String>();
+		status = statusStack.pop();
+		services = new Vector<ServiceType>();
+		operations = new Vector<String>();
+		collectLocalnames = false;
 	    }
 	    else if (qn.equals("cpu")) {
@@ -414,8 +485,17 @@
 			interfaces.toArray(
 			    new InterfaceType[interfaces.size()]),
-			attrs.toArray(new AttributeType[attrs.size()]));
+			attrs.toArray(new AttributeType[attrs.size()]),
+			localnames.toArray(new String[localnames.size()]),
+			status,
+			services.toArray(new ServiceType[services.size()]),
+			operations.toArray(new String[operations.size()]));
 		uri = type = null;
 		interfaces = new Vector<InterfaceType>();
 		attrs = attrStack.pop();
+		localnames = new Vector<String>();
+		status = statusStack.pop();
+		services = new Vector<ServiceType>();
+		operations = new Vector<String>();
+		collectLocalnames = false;
 	    }
 	    else if (qn.equals("uri")) { 
@@ -450,8 +530,12 @@
 	    }
 	    else if (qn.equals("localname")) {
-		localname = new String(c).trim();
+		if (collectLocalnames) localnames.add(new String(c).trim());
+		else localname = new String(c).trim();
 	    }
 	    else if (qn.equals("kerberosUsername")) { 
 		kerberosUsername = new String(c).trim();
+	    }
+	    else if (qn.equals("description")) { 
+		description = new String(c).trim();
 	    }
 	    else if (qn.equals("other")) { 
@@ -465,9 +549,19 @@
 	    else if (qn.equals("substrates")) {
 		subs.add(new SubstrateType(name, cap, lat, 
-			attrs.toArray(new AttributeType[attrs.size()])));
+			attrs.toArray(new AttributeType[attrs.size()]),
+			localnames.toArray(new String[localnames.size()]),
+			status,
+			services.toArray(new ServiceType[services.size()]),
+			operations.toArray(new String[operations.size()])
+			));
 		name = nameStack.pop();
 		cap = null;
 		lat = null;
 		attrs = attrStack.pop();
+		localnames = new Vector<String>();
+		status = statusStack.pop();
+		services = new Vector<ServiceType>();
+		operations = new Vector<String>();
+		collectLocalnames = false;
 	    }
 	    else if (qn.equals("attribute")) {
@@ -480,4 +574,22 @@
 	    else if ( qn.equals("value")) { aval = new String(c).trim(); }
 	    else if ( qn.equals("name")) { name = new String(c).trim(); }
+	    else if ( qn.equals("param") ) {
+		serviceParams.add(new ServiceParamType(name, 
+			    ServiceParamTypeType.fromString(type)));
+		name = nameStack.pop();
+		type = null;
+	    }
+	    else if (qn.equals("service")) {
+		services.add(new ServiceType(
+			name, importers.toArray(new String[importers.size()]),
+			serviceParams.toArray(
+			    new ServiceParamType[serviceParams.size()]),
+			description, status));
+		name = nameStack.pop();
+		importers = new Vector<String>();
+		serviceParams = new Vector<ServiceParamType>();
+		description = null;
+		status = statusStack.pop();
+	    }
 
 	    // Always clear any accumulated characters
