diff --git a/pom.xml b/pom.xml
index b47c74d0f59285966d03f780620e44010593ed66..0db35451cd192a910d2e84380438e6e7bf2c2780 100644
--- a/pom.xml
+++ b/pom.xml
@@ -168,39 +168,6 @@
                     </execution>
                 </executions>
             </plugin>
-			<plugin>
-				<groupId>org.jvnet.jaxb2.maven2</groupId>
-				<artifactId>maven-jaxb2-plugin</artifactId>
-				<version>0.7.4</version>
-				<executions>
-					<execution>
-						<goals>
-							<goal>generate</goal>
-						</goals>
-					</execution>
-				</executions>
-				<configuration>
-					<extension>true</extension>
-					<args>
-						<arg>-Xequals</arg>
-						<arg>-XhashCode</arg>
-						<arg>-Xannotate</arg>
-					</args>
-					<plugins>
-						<plugin>
-							<groupId>org.jvnet.jaxb2_commons</groupId>
-							<artifactId>jaxb2-basics</artifactId>
-							<version>0.6.0</version>
-						</plugin>
-
-						<plugin>
-							<groupId>org.jvnet.jaxb2_commons</groupId>
-							<artifactId>jaxb2-basics-annotate</artifactId>
-							<version>0.6.0</version>
-						</plugin>
-					</plugins>
-				</configuration>
-			</plugin>
 		</plugins>
 
 		<resources>
@@ -271,13 +238,7 @@
         <dependency>
 			<groupId>org.freehep</groupId>
 			<artifactId>freehep-java3d</artifactId>
-			<version>2.0-SNAPSHOT</version>
-		</dependency>
-
-		<dependency>
-			<groupId>org.jvnet.jaxb2_commons</groupId>
-			<artifactId>jaxb2-basics</artifactId>
-			<version>0.6.0</version>
+			<version>2.0</version>
 		</dependency>
 
 		<dependency>
@@ -285,9 +246,16 @@
 			<artifactId>vecmath</artifactId>
 			<version>1.3.1</version>
 		</dependency>
-            
 
-	</dependencies>
+        <dependency>
+            <groupId>xstream</groupId>
+            <artifactId>xstream</artifactId>
+            <version>1.2.2</version>
+        </dependency>
+
+
+
+    </dependencies>
 
 	<repositories>
 		<repository>
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index dd980847521af2b016073f51f6d85da99d91d6a3..e986955e3fbb5e80576b2bd5ca158d988bceed1d 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -27,13 +27,7 @@ import java.util.Map;
 import java.util.Set;
 import com.syncleus.dann.UnexpectedDannError;
 import com.syncleus.dann.graph.context.ContextGraphElement;
-import com.syncleus.dann.graph.xml.*;
-import com.syncleus.dann.xml.NameXml;
-import com.syncleus.dann.xml.NamedValueXml;
-import com.syncleus.dann.xml.Namer;
-import com.syncleus.dann.xml.XmlSerializable;
 import org.apache.log4j.Logger;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 /**
  * An AbstractAdjacencyGraph is a Graph implemented using adjacency lists.
@@ -42,7 +36,6 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  * @param <N> The node type
  * @param <E> The type of edge for the given node type
  */
-@XmlJavaTypeAdapter( com.syncleus.dann.xml.XmlSerializableAdapter.class )
 public abstract class AbstractAdjacencyGraph<N, E extends TraversableCloud<N>> implements Graph<N, E>
 {
 	private static final Logger LOGGER = Logger.getLogger(AbstractAdjacencyGraph.class);
@@ -373,96 +366,4 @@ public abstract class AbstractAdjacencyGraph<N, E extends TraversableCloud<N>> i
 		}
 	}
 
-	/**
-	 * Converts the current AbstractAdjacencyGraph to a GraphXML.
-	 * @return The GraphXML representation of this AbstractAdjacencyGraph
-	 */
-	@Override
-	public GraphXml toXml()
-	{
-		final GraphElementXml xml = new GraphElementXml();
-		final Namer<Object> namer = new Namer<Object>();
-
-		xml.setNodeInstances(new GraphElementXml.NodeInstances());
-		for(N node : this.adjacentEdges.keySet())
-		{
-			final String nodeName = namer.getNameOrCreate(node);
-
-			final Object nodeXml;
-			if(node instanceof XmlSerializable)
-				nodeXml = ((XmlSerializable)node).toXml(namer);
-			else
-				// if the object is not XmlSerializable lets try to just
-				// serialize it as a regular JAXB object
-				nodeXml = node;
-
-			final NamedValueXml encapsulation = new NamedValueXml();
-			encapsulation.setName(nodeName);
-			encapsulation.setValue(nodeXml);
-
-			xml.getNodeInstances().getNodes().add(encapsulation);
-		}
-
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	/**
-	 * Converts a given Namer to its GraphXML representation.
-	 * @param namer The namer to convert
-	 * @return The GraphXML representation of this namer
-	 */
-	@Override
-	public GraphXml toXml(final Namer<Object> namer)
-	{
-		if(namer == null)
-			throw new IllegalArgumentException("namer can not be null");
-
-		final GraphXml xml = new GraphXml();
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	/**
-	 * Adds a current Namer to the given GraphXML object.
-	 * @param jaxbObject The graph to add the object to
-	 * @param namer THe namer to add to the GraphXML
-	 */
-	@Override
-	public void toXml(final GraphXml jaxbObject, final Namer<Object> namer)
-	{
-		if(namer == null)
-			throw new IllegalArgumentException("nodeNames can not be null");
-		if(jaxbObject == null)
-			throw new IllegalArgumentException("jaxbObject can not be null");
-
-		for(N node : this.adjacentEdges.keySet())
-		{
-			final String nodeName = namer.getNameOrCreate(node);
-
-			final Object nodeXml;
-			if(node instanceof XmlSerializable)
-				nodeXml = ((XmlSerializable)node).toXml(namer);
-			else
-				// if the object is not XmlSerializable lets try to just
-				// serialize it as a regular JAXB object
-				nodeXml = node;
-
-			final NameXml encapsulation = new NameXml();
-			encapsulation.setName(nodeName);
-
-			if( jaxbObject.getNodes() == null )
-				jaxbObject.setNodes(new GraphXml.Nodes());
-			jaxbObject.getNodes().getNodes().add(encapsulation);
-		}
-
-		for(E edge : this.edges)
-		{
-			final EdgeXml edgeXml = edge.toXml(namer);
-
-			if( jaxbObject.getEdges() == null )
-				jaxbObject.setEdges(new GraphXml.Edges());
-			jaxbObject.getEdges().getEdges().add(edgeXml);
-		}
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java
index 220a49e047f20b138715fab6b0aa89492df36c44..5def1899db17587ab0fbbc729b9e6bec2346ef30 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractBidirectedEdge.java
@@ -18,12 +18,8 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import java.util.*;
-
-import com.syncleus.dann.graph.xml.*;
-import com.syncleus.dann.xml.NamedValueXml;
-import com.syncleus.dann.xml.Namer;
-import com.syncleus.dann.xml.XmlSerializable;
+import java.util.HashSet;
+import java.util.Set;
 
 public abstract class AbstractBidirectedEdge<E extends BidirectedEdge.Endpoint<?>> extends AbstractTraversableCloud<E> implements BidirectedEdge<E>
 {
@@ -182,70 +178,4 @@ public abstract class AbstractBidirectedEdge<E extends BidirectedEdge.Endpoint<?
 			return "";
 		}
 	}
-
-    @Override
-	public BidirectedEdgeXml toXml()
-	{
-		final Namer namer = new Namer();
-		final BidirectedEdgeElementXml xml = new BidirectedEdgeElementXml();
-
-		xml.setNodeInstances(new BidirectedEdgeElementXml.NodeInstances());
-		final Set<Object> writtenNodes = new HashSet<Object>();
-		for (E endpoint : this.getEndpoints())
-		{
-            final Object node = endpoint.getTarget();
-			if (writtenNodes.add(node))
-			{
-				final NamedValueXml named = new NamedValueXml();
-				named.setName(namer.getNameOrCreate(node));
-				if (node instanceof XmlSerializable)
-				{
-					named.setValue(((XmlSerializable) node).toXml(namer));
-				}
-				else
-				{
-					named.setValue(node);
-				}
-				xml.getNodeInstances().getNodes().add(named);
-			}
-		}
-
-		return xml;
-	}
-
-	@Override
-	public BidirectedEdgeXml toXml(final Namer<Object> nodeNames)
-	{
-		if (nodeNames == null)
-		{
-			throw new IllegalArgumentException("nodeNames can not be null");
-		}
-
-		final BidirectedEdgeXml xml = new BidirectedEdgeXml();
-		this.toXml(xml, nodeNames);
-		return xml;
-	}
-
-	@Override
-	public void toXml(final EdgeXml jaxbObject, final Namer<Object> nodeNames)
-	{
-		if (nodeNames == null)
-		{
-			throw new IllegalArgumentException("nodeNames can not be null");
-		}
-		if (jaxbObject == null)
-		{
-			throw new IllegalArgumentException("jaxbObject can not be null");
-		}
-
-		super.toXml(jaxbObject, nodeNames);
-
-		if (jaxbObject instanceof BidirectedEdgeXml)
-		{
-			((BidirectedEdgeXml) jaxbObject).setLeftNode(nodeNames.getNameOrCreate(this.getLeftEndpoint()));
-			((BidirectedEdgeXml) jaxbObject).setRightNode(nodeNames.getNameOrCreate(this.getRightEndpoint()));
-			((BidirectedEdgeXml) jaxbObject).setLeftDirection(this.leftEndState.toString().toLowerCase());
-			((BidirectedEdgeXml) jaxbObject).setRightDirection(this.rightEndState.toString().toLowerCase());
-		}
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractTraversableCloud.java b/src/main/java/com/syncleus/dann/graph/AbstractTraversableCloud.java
index c744f1c7e898d0969320e245ca6489321687594d..ae626c0a11e6da28d54d88201953c774252a58f0 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractTraversableCloud.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractTraversableCloud.java
@@ -23,12 +23,6 @@ import java.util.*;
 import com.syncleus.dann.UnexpectedDannError;
 import com.syncleus.dann.graph.context.AbstractContextGraphElement;
 import com.syncleus.dann.graph.context.ContextNode;
-import com.syncleus.dann.graph.xml.EdgeElementXml;
-import com.syncleus.dann.graph.xml.EdgeXml;
-import com.syncleus.dann.xml.NameXml;
-import com.syncleus.dann.xml.NamedValueXml;
-import com.syncleus.dann.xml.Namer;
-import com.syncleus.dann.xml.XmlSerializable;
 import org.apache.log4j.Logger;
 
 public abstract class AbstractTraversableCloud<E extends TraversableCloud.Endpoint<?>> extends AbstractContextGraphElement<Graph<?, ? extends E>> implements TraversableCloud<E>
@@ -195,70 +189,4 @@ public abstract class AbstractTraversableCloud<E extends TraversableCloud.Endpoi
 		return outString.toString();
 	}
 
-    @Override
-	public EdgeXml toXml()
-	{
-		final Namer namer = new Namer();
-		final EdgeElementXml xml = new EdgeElementXml();
-
-		xml.setNodeInstances(new EdgeElementXml.NodeInstances());
-		final Set<Object> writtenNodes = new HashSet<Object>();
-		for (E endpoint : this.getEndpoints())
-		{
-			if (writtenNodes.add(endpoint.getTarget()))
-			{
-				final NamedValueXml named = new NamedValueXml();
-				named.setName(namer.getNameOrCreate(endpoint.getTarget()));
-				if (endpoint.getTarget() instanceof XmlSerializable)
-				{
-					named.setValue(((XmlSerializable) endpoint.getTarget()).toXml(namer));
-				}
-				else
-				{
-					named.setValue(endpoint.getTarget());
-				}
-				xml.getNodeInstances().getNodes().add(named);
-			}
-		}
-		this.toXml(xml, namer);
-
-		return xml;
-	}
-
-	@Override
-	public EdgeXml toXml(final Namer<Object> nodeNames)
-	{
-		if (nodeNames == null)
-		{
-			throw new IllegalArgumentException("nodeNames can not be null");
-		}
-
-		final EdgeXml xml = new EdgeXml();
-		this.toXml(xml, nodeNames);
-		return xml;
-	}
-
-	@Override
-	public void toXml(final EdgeXml jaxbObject, final Namer<Object> nodeNames)
-	{
-		if (nodeNames == null)
-		{
-			throw new IllegalArgumentException("nodeNames can not be null");
-		}
-		if (jaxbObject == null)
-		{
-			throw new IllegalArgumentException("jaxbObject can not be null");
-		}
-
-		if (jaxbObject.getConnections() == null)
-		{
-			jaxbObject.setConnections(new EdgeXml.Connections());
-		}
-		for (E endpoint : this.getEndpoints())
-		{
-			final NameXml connection = new NameXml();
-			connection.setName(nodeNames.getNameOrCreate(endpoint.getTarget()));
-			jaxbObject.getConnections().getNodes().add(connection);
-		}
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graph/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java
index 3522e65e4f6a1e263830b4b2adeac536b3d4a736..b9e11f995950823f9dd4538a733a4d7e45db96a8 100644
--- a/src/main/java/com/syncleus/dann/graph/Graph.java
+++ b/src/main/java/com/syncleus/dann/graph/Graph.java
@@ -19,8 +19,6 @@
 package com.syncleus.dann.graph;
 
 import com.syncleus.dann.graph.context.ContextReporter;
-import com.syncleus.dann.graph.xml.GraphXml;
-import com.syncleus.dann.xml.XmlSerializable;
 import java.io.Serializable;
 import java.util.List;
 import java.util.Set;
diff --git a/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java
index f4e0a6a876fb2418f94a33facb5c1436a2f5f24c..a010ad85288b46f3dcdfa07cb63ef265c63fbd28 100644
--- a/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/ImmutableAdjacencyGraph.java
@@ -18,17 +18,8 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-import com.syncleus.dann.xml.Namer;
-import com.syncleus.dann.graph.xml.GraphXml;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Set;
 
 public class ImmutableAdjacencyGraph<N, E extends TraversableCloud<N>> extends AbstractAdjacencyGraph<N, E>
 {
@@ -72,16 +63,4 @@ public class ImmutableAdjacencyGraph<N, E extends TraversableCloud<N>> extends A
 			newAdjacentNodes.put(neighborNodeEntry.getKey(), new ArrayList<N>(neighborNodeEntry.getValue()));
 		return newAdjacentNodes;
 	}
-
-    @Override
-	public GraphXml toXml(final Namer<Object> namer)
-	{
-		throw new UnsupportedOperationException("XML serialization not yet supported"); //TODO Implement serialization
-	}
-
-	@Override
-	public void toXml(final GraphXml jaxbObject, final Namer<Object> namer)
-	{
-		throw new UnsupportedOperationException("XML serialization not yet supported"); //TODO Implement serialization
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/AbstractGraphicalModelAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graphicalmodel/AbstractGraphicalModelAdjacencyGraph.java
index 27fe260eca4e69165a72bbb31b960143260f7487..e246e2e42689cb2b147250ab01aefd3ffb31df14 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/AbstractGraphicalModelAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/AbstractGraphicalModelAdjacencyGraph.java
@@ -20,11 +20,6 @@ package com.syncleus.dann.graphicalmodel;
 
 import java.util.*;
 import com.syncleus.dann.graph.*;
-import com.syncleus.dann.graphicalmodel.xml.GraphicalModelElementXml;
-import com.syncleus.dann.graphicalmodel.xml.GraphicalModelXml;
-import com.syncleus.dann.xml.NamedValueXml;
-import com.syncleus.dann.xml.Namer;
-import com.syncleus.dann.xml.XmlSerializable;
 
 public abstract class AbstractGraphicalModelAdjacencyGraph<N extends GraphicalModelNode, E extends BidirectedEdge<N>> extends AbstractBidirectedAdjacencyGraph<N, E> implements GraphicalModel<N, E>
 {
@@ -139,78 +134,6 @@ public abstract class AbstractGraphicalModelAdjacencyGraph<N extends GraphicalMo
 		}
 	}
 
-    @Override
-	public GraphicalModelXml toXml()
-	{
-		final GraphicalModelElementXml networkXml = new GraphicalModelElementXml();
-		final Namer<Object> namer = new Namer<Object>();
-
-		networkXml.setNodeInstances(new GraphicalModelElementXml.NodeInstances());
-		networkXml.setStateInstances(new GraphicalModelElementXml.StateInstances());
-		final Set<Object> writtenStates = new HashSet<Object>();
-		for (N node : this.getNodes())
-		{
-			//add the node
-			final NamedValueXml nodeXml = new NamedValueXml();
-			nodeXml.setName(namer.getNameOrCreate(node));
-			nodeXml.setValue(node.toXml(namer));
-			networkXml.getNodeInstances().getNodes().add(nodeXml);
-
-			//add all the node's learned states
-			for (Object learnedState : node.getLearnedStates())
-			{
-				//only add the learnedState if it hasnt yet been added
-				if (writtenStates.add(learnedState))
-				{
-					final NamedValueXml stateXml = new NamedValueXml();
-					stateXml.setName(namer.getNameOrCreate(learnedState));
-					if (learnedState instanceof XmlSerializable)
-					{
-						stateXml.setValue(((XmlSerializable) learnedState).toXml(namer));
-					}
-					else
-					{
-						stateXml.setValue(learnedState);
-					}
-					networkXml.getStateInstances().getStates().add(stateXml);
-				}
-			}
-
-			//add the nodes current state if it wasnt already
-			final Object state = node.getState();
-			if (writtenStates.add(state))
-			{
-				final NamedValueXml stateXml = new NamedValueXml();
-				stateXml.setName(namer.getNameOrCreate(state));
-				if (state instanceof XmlSerializable)
-				{
-					stateXml.setValue(((XmlSerializable) state).toXml(namer));
-				}
-				else
-				{
-					stateXml.setValue(state);
-				}
-				networkXml.getStateInstances().getStates().add(stateXml);
-			}
-		}
-
-		this.toXml(networkXml, namer);
-		return networkXml;
-	}
-
-	@Override
-	public GraphicalModelXml toXml(final Namer<Object> namer)
-	{
-		if (namer == null)
-		{
-			throw new IllegalArgumentException("namer can not be null");
-		}
-
-		final GraphicalModelXml xml = new GraphicalModelXml();
-		this.toXml(xml, namer);
-		return xml;
-	}
-
 	protected static class NodeConnectivity<N extends GraphicalModelNode, E extends BidirectedEdge<N>> extends HashMap<N, Set<E>>
 	{
 		private static final long serialVersionUID = -3068604309573134643L;
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/EvidenceMap.java b/src/main/java/com/syncleus/dann/graphicalmodel/EvidenceMap.java
index 19d36e4401cfbdb595300c2a2e04c79553c50ad3..512aba47df75d6812ff5370ed1903653e6439aaa 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/EvidenceMap.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/EvidenceMap.java
@@ -18,12 +18,10 @@
  ******************************************************************************/
 package com.syncleus.dann.graphicalmodel;
 
+import java.io.Serializable;
 import java.util.*;
-import com.syncleus.dann.graphicalmodel.xml.EvidenceMapElementXml;
-import com.syncleus.dann.graphicalmodel.xml.EvidenceMapXml;
-import com.syncleus.dann.xml.*;
 
-public class EvidenceMap<S> extends HashMap<Map<GraphicalModelNode, Object>, StateEvidence<S>> implements XmlSerializable<EvidenceMapXml, Object>
+public class EvidenceMap<S> extends HashMap<Map<GraphicalModelNode, Object>, StateEvidence<S>> implements Serializable
 {
 	private static final long serialVersionUID = 5956089319330421885L;
 	private final Set<GraphicalModelNode> influencingNodes;
@@ -139,132 +137,4 @@ public class EvidenceMap<S> extends HashMap<Map<GraphicalModelNode, Object>, Sta
 			this.verifyInfluencingStates(inputStates);
 		super.putAll(map);
 	}
-
-	@Override
-	public EvidenceMapXml toXml()
-	{
-		final EvidenceMapElementXml xml = new EvidenceMapElementXml();
-		final Namer<Object> namer = new Namer<Object>();
-
-		final Set<GraphicalModelNode> seenNodes = new HashSet<GraphicalModelNode>();
-		final Set<Object> seenStates = new HashSet<Object>();
-
-		xml.setNodeInstances(new EvidenceMapElementXml.NodeInstances());
-		xml.setStateInstances(new EvidenceMapElementXml.StateInstances());
-		for (Map.Entry<Map<GraphicalModelNode, Object>, StateEvidence<S>> entry : this.entrySet())
-		{
-			final Map<GraphicalModelNode, Object> influences = entry.getKey();
-			final StateEvidence<S> evidence = entry.getValue();
-
-			//add instances for all the nodes and states from the influences
-			for (Map.Entry<GraphicalModelNode, Object> influenceEntry : influences.entrySet())
-			{
-				final GraphicalModelNode node = influenceEntry.getKey();
-				final Object state = influenceEntry.getValue();
-
-				if (seenStates.add(state))
-				{
-					final Object stateXml;
-					if (state instanceof XmlSerializable)
-					{
-						stateXml = ((XmlSerializable) state).toXml(namer);
-					}
-					else
-					{
-						stateXml = state;
-					}
-
-					final NamedValueXml encapsulation = new NamedValueXml();
-					encapsulation.setName(namer.getNameOrCreate(state));
-					encapsulation.setValue(stateXml);
-					xml.getStateInstances().getStates().add(encapsulation);
-				}
-
-				if (seenNodes.add(node))
-				{
-					final Object nodeXml = node.toXml(namer);
-
-					final NamedValueXml encapsulation = new NamedValueXml();
-					encapsulation.setName(namer.getNameOrCreate(node));
-					encapsulation.setValue(nodeXml);
-					xml.getNodeInstances().getNodes().add(encapsulation);
-				}
-			}
-
-			//add instances for all states from the evidence
-			for (S state : evidence.keySet())
-			{
-				if (seenStates.add(state))
-				{
-					final Object stateXml;
-					if (state instanceof XmlSerializable)
-					{
-						stateXml = ((XmlSerializable) state).toXml(namer);
-					}
-					else
-					{
-						stateXml = state;
-					}
-
-					final NamedValueXml encapsulation = new NamedValueXml();
-					encapsulation.setName(namer.getNameOrCreate(state));
-					encapsulation.setValue(stateXml);
-					xml.getStateInstances().getStates().add(encapsulation);
-				}
-			}
-		}
-
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	@Override
-	public EvidenceMapXml toXml(final Namer<Object> namer)
-	{
-		if (namer == null)
-		{
-			throw new IllegalArgumentException("namer can not be null");
-		}
-
-		final EvidenceMapXml xml = new EvidenceMapXml();
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	@Override
-	public void toXml(final EvidenceMapXml jaxbObject, final Namer<Object> namer)
-	{
-		if (namer == null)
-		{
-			throw new IllegalArgumentException("nodeNames can not be null");
-		}
-		if (jaxbObject == null)
-		{
-			throw new IllegalArgumentException("jaxbObject can not be null");
-		}
-
-		if (jaxbObject.getInfluencedEvidences() == null)
-		{
-			jaxbObject.setInfluencedEvidences(new EvidenceMapXml.InfluencedEvidences());
-		}
-		for (Map.Entry<Map<GraphicalModelNode, Object>, StateEvidence<S>> entry : this.entrySet())
-		{
-			final EvidenceMapXml.InfluencedEvidences.InfluencedEvidence influencedEvidence = new EvidenceMapXml.InfluencedEvidences.InfluencedEvidence();
-
-			//add the influences to the xml
-			influencedEvidence.setInfluences(new EvidenceMapXml.InfluencedEvidences.InfluencedEvidence.Influences());
-			for (Map.Entry<GraphicalModelNode, Object> influenceEntry : entry.getKey().entrySet())
-			{
-				final EvidenceMapXml.InfluencedEvidences.InfluencedEvidence.Influences.Influence influenceXml = new EvidenceMapXml.InfluencedEvidences.InfluencedEvidence.Influences.Influence();
-				influenceXml.setNode(namer.getNameOrCreate(influenceEntry.getKey()));
-				influenceXml.setState(namer.getNameOrCreate(influenceEntry.getValue()));
-				influencedEvidence.getInfluences().getInfluences().add(influenceXml);
-			}
-
-			//add the state evidence to the xml
-			influencedEvidence.setStateEvidence(entry.getValue().toXml(namer));
-
-			jaxbObject.getInfluencedEvidences().getInfluencedEvidences().add(influencedEvidence);
-		}
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/GraphicalModelNode.java b/src/main/java/com/syncleus/dann/graphicalmodel/GraphicalModelNode.java
index 075d9174937e141e3b113f1bb2526a09557dfe8b..ff9d2afa598ede421f4472bda7a578d7ff8d6e99 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/GraphicalModelNode.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/GraphicalModelNode.java
@@ -18,11 +18,10 @@
  ******************************************************************************/
 package com.syncleus.dann.graphicalmodel;
 
-import com.syncleus.dann.graphicalmodel.xml.GraphicalModelNodeXml;
-import com.syncleus.dann.xml.XmlSerializable;
+import java.io.Serializable;
 import java.util.Set;
 
-public interface GraphicalModelNode<S> extends XmlSerializable<GraphicalModelNodeXml, Object>
+public interface GraphicalModelNode<S> extends Serializable
 {
 	Set<S> getLearnedStates();
 	void setState(S currentState);
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/SimpleGraphicalModelNode.java b/src/main/java/com/syncleus/dann/graphicalmodel/SimpleGraphicalModelNode.java
index 5379811c7aeda05bb6c408a082db46b075c815a9..13235c6833add9030d93261a97b00f2f88a2241b 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/SimpleGraphicalModelNode.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/SimpleGraphicalModelNode.java
@@ -21,13 +21,6 @@ package com.syncleus.dann.graphicalmodel;
 import java.util.*;
 import com.syncleus.dann.graph.BidirectedEdge;
 import com.syncleus.dann.graph.context.AbstractContextNode;
-import com.syncleus.dann.graphicalmodel.xml.GraphicalModelNodeXml;
-import com.syncleus.dann.graphicalmodel.xml.SimpleGraphicalModelNodeElementXml;
-import com.syncleus.dann.graphicalmodel.xml.SimpleGraphicalModelNodeXml;
-import com.syncleus.dann.xml.NameXml;
-import com.syncleus.dann.xml.NamedValueXml;
-import com.syncleus.dann.xml.Namer;
-import com.syncleus.dann.xml.XmlSerializable;
 
 public class SimpleGraphicalModelNode<S> extends AbstractContextNode<GraphicalModelNode<S>, BidirectedEdge<GraphicalModelNode<S>>, GraphicalModel<GraphicalModelNode<S>, BidirectedEdge<GraphicalModelNode<S>>>> implements GraphicalModelNode<S>
 {
@@ -201,92 +194,4 @@ public class SimpleGraphicalModelNode<S> extends AbstractContextNode<GraphicalMo
 
 		return false;
 	}
-
-	@Override
-	public SimpleGraphicalModelNodeXml toXml()
-	{
-		final Namer<Object> namer = new Namer<Object>();
-		final SimpleGraphicalModelNodeElementXml xml = new SimpleGraphicalModelNodeElementXml();
-
-		xml.setStateInstances(new SimpleGraphicalModelNodeElementXml.StateInstances());
-		final Set<S> writtenStates = new HashSet<S>();
-		for (S learnedState : this.learnedStates)
-		{
-			if (writtenStates.add(learnedState))
-			{
-				final NamedValueXml named = new NamedValueXml();
-				named.setName(namer.getNameOrCreate(learnedState));
-				if (learnedState instanceof XmlSerializable)
-				{
-					named.setValue(((XmlSerializable) learnedState).toXml(namer));
-				}
-				else
-				{
-					named.setValue(learnedState);
-				}
-				xml.getStateInstances().getStates().add(named);
-			}
-		}
-
-		if (writtenStates.add(this.state))
-		{
-			final NamedValueXml named = new NamedValueXml();
-			named.setName(namer.getNameOrCreate(this.state));
-			if (this.state instanceof XmlSerializable)
-			{
-				named.setValue(((XmlSerializable) this.state).toXml(namer));
-			}
-			else
-			{
-				named.setValue(this.state);
-			}
-			xml.getStateInstances().getStates().add(named);
-		}
-
-		this.toXml(xml, namer);
-
-		return xml;
-	}
-
-	@Override
-	public SimpleGraphicalModelNodeXml toXml(final Namer<Object> namer)
-	{
-		if (namer == null)
-		{
-			throw new IllegalArgumentException("namer can not be null");
-		}
-
-		final SimpleGraphicalModelNodeXml xml = new SimpleGraphicalModelNodeXml();
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	@Override
-	public void toXml(final GraphicalModelNodeXml jaxbObject, final Namer<Object> namer)
-	{
-		//set learned states
-		if (jaxbObject.getLearnedStates() == null)
-		{
-			jaxbObject.setLearnedStates(new SimpleGraphicalModelNodeXml.LearnedStates());
-		}
-		for (S learnedState : learnedStates)
-		{
-			final NameXml stateXml = new NameXml();
-			stateXml.setName(namer.getNameOrCreate(learnedState));
-			jaxbObject.getLearnedStates().getStates().add(stateXml);
-		}
-
-		//set current state
-		if (jaxbObject.getState() == null)
-		{
-			jaxbObject.setState(new NameXml());
-		}
-		jaxbObject.getState().setName(namer.getNameOrCreate(this.state));
-
-		//set evidence map
-		if ((jaxbObject instanceof SimpleGraphicalModelNodeXml) && (this.evidence != null))
-		{
-			((SimpleGraphicalModelNodeXml) jaxbObject).setEvidence(this.evidence.toXml(namer));
-		}
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/graphicalmodel/StateEvidence.java b/src/main/java/com/syncleus/dann/graphicalmodel/StateEvidence.java
index e326b6e0c44365f69852a6e8134f77c02307dcef..cc156adeea810449b66886572f93cdc7a718e77c 100644
--- a/src/main/java/com/syncleus/dann/graphicalmodel/StateEvidence.java
+++ b/src/main/java/com/syncleus/dann/graphicalmodel/StateEvidence.java
@@ -18,13 +18,11 @@
  ******************************************************************************/
 package com.syncleus.dann.graphicalmodel;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
-import com.syncleus.dann.graphicalmodel.xml.StateEvidenceElementXml;
-import com.syncleus.dann.graphicalmodel.xml.StateEvidenceXml;
-import com.syncleus.dann.xml.*;
 
-public class StateEvidence<S> extends HashMap<S, Integer> implements XmlSerializable<StateEvidenceXml, Object>
+public class StateEvidence<S> extends HashMap<S, Integer> implements Serializable
 {
 	private static final long serialVersionUID = 4276706788994272957L;
 	private long totalEvidence;
@@ -67,75 +65,4 @@ public class StateEvidence<S> extends HashMap<S, Integer> implements XmlSerializ
 			this.totalEvidence = (this.totalEvidence - oldEvidence) + newEvidence;
 		}
 	}
-
-
-	@Override
-	public StateEvidenceXml toXml()
-	{
-		final StateEvidenceElementXml xml = new StateEvidenceElementXml();
-		final Namer<Object> namer = new Namer<Object>();
-
-		xml.setStates(new StateEvidenceXml.States());
-		for (S state : this.keySet())
-		{
-			final String name = namer.getNameOrCreate(state);
-
-			final Object stateXml;
-			if (state instanceof XmlSerializable)
-			{
-				stateXml = ((XmlSerializable) state).toXml(namer);
-			}
-			else
-			{
-				stateXml = state;
-			}
-
-			final NamedValueXml encapsulation = new NamedValueXml();
-			encapsulation.setName(name);
-			encapsulation.setValue(stateXml);
-
-			xml.getStateInstances().getStates().add(encapsulation);
-		}
-
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	@Override
-	public StateEvidenceXml toXml(final Namer<Object> namer)
-	{
-		if (namer == null)
-		{
-			throw new IllegalArgumentException("namer can not be null");
-		}
-
-		final StateEvidenceXml xml = new StateEvidenceXml();
-		this.toXml(xml, namer);
-		return xml;
-	}
-
-	@Override
-	public void toXml(final StateEvidenceXml jaxbObject, final Namer<Object> namer)
-	{
-		if (namer == null)
-		{
-			throw new IllegalArgumentException("nodeNames can not be null");
-		}
-		if (jaxbObject == null)
-		{
-			throw new IllegalArgumentException("jaxbObject can not be null");
-		}
-
-		if (jaxbObject.getStates() == null)
-		{
-			jaxbObject.setStates(new StateEvidenceXml.States());
-		}
-		for (Map.Entry<S, Integer> entry : this.entrySet())
-		{
-			final StateEvidenceXml.States.State stateXml = new StateEvidenceXml.States.State();
-			stateXml.setName(namer.getNameOrCreate(entry.getKey()));
-			stateXml.setCount(entry.getValue());
-			jaxbObject.getStates().getStates().add(stateXml);
-		}
-	}
 }
diff --git a/src/main/java/com/syncleus/dann/xml/Namer.java b/src/main/java/com/syncleus/dann/xml/Namer.java
deleted file mode 100644
index a819e42b8ca3ca4275ebd8f93b4c85fe8cd562d6..0000000000000000000000000000000000000000
--- a/src/main/java/com/syncleus/dann/xml/Namer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/******************************************************************************
- *                                                                             *
- *  Copyright: (c) Syncleus, Inc.                                              *
- *                                                                             *
- *  You may redistribute and modify this source code under the terms and       *
- *  conditions of the Open Source Community License - Type C version 1.0       *
- *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
- *  There should be a copy of the license included with this file. If a copy   *
- *  of the license is not included you are granted no right to distribute or   *
- *  otherwise use this file except through a legal and valid license. You      *
- *  should also contact Syncleus, Inc. at the information below if you cannot  *
- *  find a license:                                                            *
- *                                                                             *
- *  Syncleus, Inc.                                                             *
- *  2604 South 12th Street                                                     *
- *  Philadelphia, PA 19148                                                     *
- *                                                                             *
- ******************************************************************************/
-package com.syncleus.dann.xml;
-
-import java.util.WeakHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class Namer<K>
-{
-	private final AtomicLong currentNodeName = new AtomicLong(0);
-	private final WeakHashMap<K, Long> nodeNames = new WeakHashMap<K, Long>();
-
-	public String getNameOrCreate(final K node)
-	{
-		Long nodeName = nodeNames.get(node);
-
-		if (nodeName == null)
-		{
-			nodeName = currentNodeName.incrementAndGet();
-			nodeNames.put(node, nodeName);
-		}
-
-		return nodeName.toString();
-	}
-
-	public String getName(final K node)
-	{
-		return nodeNames.get(node).toString();
-	}
-
-	public boolean hasName(final K node)
-	{
-		return nodeNames.containsKey(node);
-	}
-
-	public void reset()
-	{
-		this.nodeNames.clear();
-		this.currentNodeName.set(0);
-	}
-}
diff --git a/src/main/java/com/syncleus/dann/xml/XmlSerializable.java b/src/main/java/com/syncleus/dann/xml/XmlSerializable.java
deleted file mode 100644
index bcb2274ebd2835286003c7be5a9bc734ef1f143a..0000000000000000000000000000000000000000
--- a/src/main/java/com/syncleus/dann/xml/XmlSerializable.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/******************************************************************************
- *                                                                             *
- *  Copyright: (c) Syncleus, Inc.                                              *
- *                                                                             *
- *  You may redistribute and modify this source code under the terms and       *
- *  conditions of the Open Source Community License - Type C version 1.0       *
- *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
- *  There should be a copy of the license included with this file. If a copy   *
- *  of the license is not included you are granted no right to distribute or   *
- *  otherwise use this file except through a legal and valid license. You      *
- *  should also contact Syncleus, Inc. at the information below if you cannot  *
- *  find a license:                                                            *
- *                                                                             *
- *  Syncleus, Inc.                                                             *
- *  2604 South 12th Street                                                     *
- *  Philadelphia, PA 19148                                                     *
- *                                                                             *
- ******************************************************************************/
-package com.syncleus.dann.xml;
-
-public interface XmlSerializable<T, N>
-{
-	/**
-	 * Write stand alone element, including all instances.
-	 */
-	T toXml();
-
-	/**
-	 * Write nested element assuming recurring instances of components are
-	 * already named.
-	 */
-	T toXml(Namer<N> namer);
-
-	/**
-	 * Write nested element assuming recurring instances of components are
-	 * already named, use preexisting XML objects.
-	 */
-	void toXml(T jaxbObject, Namer<N> namer);
-}
diff --git a/src/main/java/com/syncleus/dann/xml/XmlSerializableAdapter.java b/src/main/java/com/syncleus/dann/xml/XmlSerializableAdapter.java
deleted file mode 100644
index 461216f262c22b284e6d2963af867c1d38942893..0000000000000000000000000000000000000000
--- a/src/main/java/com/syncleus/dann/xml/XmlSerializableAdapter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/******************************************************************************
- *                                                                             *
- *  Copyright: (c) Syncleus, Inc.                                              *
- *                                                                             *
- *  You may redistribute and modify this source code under the terms and       *
- *  conditions of the Open Source Community License - Type C version 1.0       *
- *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
- *  There should be a copy of the license included with this file. If a copy   *
- *  of the license is not included you are granted no right to distribute or   *
- *  otherwise use this file except through a legal and valid license. You      *
- *  should also contact Syncleus, Inc. at the information below if you cannot  *
- *  find a license:                                                            *
- *                                                                             *
- *  Syncleus, Inc.                                                             *
- *  2604 South 12th Street                                                     *
- *  Philadelphia, PA 19148                                                     *
- *                                                                             *
- ******************************************************************************/
-package com.syncleus.dann.xml;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-
-public class XmlSerializableAdapter<X, V extends XmlSerializable<X, ?>> extends XmlAdapter<X, V>
-{
-	@Override
-	public final X marshal(final V graph)
-	{
-		return graph.toXml();
-	}
-
-	@Override
-	public V unmarshal(final X graphXml)
-	{
-		throw new IllegalStateException("You can not unmarshal XML through this adapter");
-	}
-}
diff --git a/src/test/java/com/syncleus/dann/graphicalmodel/bayesian/TestSicknessBayesianNetwork.java b/src/test/java/com/syncleus/dann/graphicalmodel/bayesian/TestSicknessBayesianNetwork.java
index 7dfa9a16df9e79267a3cfcbc3ca5bd95251ba1ec..dce39859980038a3d020a9bf37a3158e7a3fe98d 100644
--- a/src/test/java/com/syncleus/dann/graphicalmodel/bayesian/TestSicknessBayesianNetwork.java
+++ b/src/test/java/com/syncleus/dann/graphicalmodel/bayesian/TestSicknessBayesianNetwork.java
@@ -18,38 +18,31 @@
  ******************************************************************************/
 package com.syncleus.dann.graphicalmodel.bayesian;
 
-import java.io.StringReader;
-import java.io.StringWriter;
 import java.util.*;
 import com.syncleus.dann.graph.ImmutableDirectedEdge;
 import com.syncleus.dann.graphicalmodel.GraphicalModelNode;
 import com.syncleus.dann.graphicalmodel.SimpleGraphicalModelNode;
-import com.syncleus.dann.graphicalmodel.bayesian.xml.BayesianNetworkXml;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
 import org.junit.*;
-import javax.xml.bind.*;
-import javax.xml.bind.annotation.XmlRootElement;
 
 public class TestSicknessBayesianNetwork
 {
-	@XmlRootElement
 	private static enum BooleanState
 	{
 		TRUE, FALSE
 	}
 
-	@XmlRootElement
 	private static enum SeasonState
 	{
 		WINTER, SUMMER, SPRING, FALL
 	}
 
-	@XmlRootElement
 	private static enum AgeState
 	{
 		BABY, CHILD, TEENAGER, ADULT, SENIOR
 	}
 
-	@XmlRootElement
 	private static enum FeverState
 	{
 		LOW, NONE, WARM, HOT
@@ -65,26 +58,19 @@ public class TestSicknessBayesianNetwork
 	private GraphicalModelNode<BooleanState> tired = new SimpleGraphicalModelNode<BooleanState>(BooleanState.FALSE);
 	private GraphicalModelNode<BooleanState> sick = new SimpleGraphicalModelNode<BooleanState>(BooleanState.FALSE);
 
-	@Test
-	public void testXml() throws Exception
-	{
-		testOverall();
-
-		//mashall it
-		JAXBContext context = JAXBContext.newInstance(BayesianNetworkXml.class, TestSicknessBayesianNetwork.FeverState.class, TestSicknessBayesianNetwork.AgeState.class, TestSicknessBayesianNetwork.BooleanState.class, TestSicknessBayesianNetwork.SeasonState.class);
-		Marshaller marshal = context.createMarshaller();
-
-		StringWriter writer = new StringWriter();
-		marshal.marshal(network.toXml(), writer);
-
-		//unmarshall it
-		StringReader reader = new StringReader(writer.toString());
-		BayesianNetworkXml xml = JAXB.unmarshal(reader, BayesianNetworkXml.class);
-
-		Assert.assertTrue("could not unmarshal object!", xml != null);
-		Assert.assertTrue("Wrong number of edges after unmarshaling: " + xml.getEdges().getEdges().size(), xml.getEdges().getEdges().size() == 14);
-		Assert.assertTrue("Wrong number of nodes after unmarshaling: " + xml.getNodes().getNodes().size(), xml.getNodes().getNodes().size() == 6);
-	}
+    @Test
+    public void testXml() throws Exception
+    {
+        testOverall();
+
+        final XStream xstream = new XStream(new StaxDriver());
+        final String xml = xstream.toXML(network);
+        Assert.assertTrue("could not serialize network!", xml != null);
+        final Object networkObject = xstream.fromXML(xml);
+        Assert.assertTrue("deserialized object type doesnt match serialized object type", networkObject instanceof MutableBayesianAdjacencyNetwork);
+        Assert.assertTrue("deserialized network had the wrong number of edges", ((MutableBayesianAdjacencyNetwork)networkObject).getEdges().size() == network.getEdges().size());
+        Assert.assertTrue("deserialized network had the wrong number of nodes", ((MutableBayesianAdjacencyNetwork)networkObject).getNodes().size() == network.getNodes().size());
+    }
 
 	@Test
 	public void testOverallRepeated()
diff --git a/src/test/java/com/syncleus/dann/graphicalmodel/markovrandomfield/TestSicknessRandomMarkovField.java b/src/test/java/com/syncleus/dann/graphicalmodel/markovrandomfield/TestSicknessRandomMarkovField.java
index 81b377567bc04cfd9f0b9934e44ec1b0c65cf902..7002555dec65b23f8e14eea4fdd026e5264f5d8f 100644
--- a/src/test/java/com/syncleus/dann/graphicalmodel/markovrandomfield/TestSicknessRandomMarkovField.java
+++ b/src/test/java/com/syncleus/dann/graphicalmodel/markovrandomfield/TestSicknessRandomMarkovField.java
@@ -18,39 +18,32 @@
  ******************************************************************************/
 package com.syncleus.dann.graphicalmodel.markovrandomfield;
 
-import javax.xml.bind.*;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.StringReader;
-import java.io.StringWriter;
 import java.util.*;
 import com.syncleus.dann.graph.ImmutableUndirectedEdge;
 import com.syncleus.dann.graphicalmodel.GraphicalModelNode;
 import com.syncleus.dann.graphicalmodel.SimpleGraphicalModelNode;
-import com.syncleus.dann.graphicalmodel.xml.GraphicalModelXml;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.StaxDriver;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class TestSicknessRandomMarkovField
 {
-	@XmlRootElement
 	private static enum BooleanState
 	{
 		TRUE, FALSE
 	}
 
-	@XmlRootElement
 	private static enum SeasonState
 	{
 		WINTER, SUMMER, SPRING, FALL
 	}
 
-	@XmlRootElement
 	private static enum AgeState
 	{
 		BABY, CHILD, TEENAGER, ADULT, SENIOR
 	}
 
-	@XmlRootElement
 	private static enum FeverState
 	{
 		LOW, NONE, WARM, HOT
@@ -66,28 +59,21 @@ public class TestSicknessRandomMarkovField
 	private GraphicalModelNode<BooleanState> tired = new SimpleGraphicalModelNode<BooleanState>(BooleanState.FALSE);
 	private GraphicalModelNode<BooleanState> sick = new SimpleGraphicalModelNode<BooleanState>(BooleanState.FALSE);
 
-	@Test
-	public void testXml() throws Exception
-	{
-		testOverall();
-
-		//mashall it
-		JAXBContext context = JAXBContext.newInstance(GraphicalModelXml.class, TestSicknessRandomMarkovField.FeverState.class, TestSicknessRandomMarkovField.AgeState.class, TestSicknessRandomMarkovField.BooleanState.class, TestSicknessRandomMarkovField.SeasonState.class);
-		Marshaller marshal = context.createMarshaller();
-
-		StringWriter writer = new StringWriter();
-		marshal.marshal(network.toXml(), writer);
-
-		//unmarshall it
-		StringReader reader = new StringReader(writer.toString());
-		GraphicalModelXml xml = JAXB.unmarshal(reader, GraphicalModelXml.class);
-
-		Assert.assertTrue("could not unmarshal object!", xml != null);
-		Assert.assertTrue("Wrong number of edges after unmarshaling: " + xml.getEdges().getEdges().size(), xml.getEdges().getEdges().size() == 14);
-		Assert.assertTrue("Wrong number of nodes after unmarshaling: " + xml.getNodes().getNodes().size(), xml.getNodes().getNodes().size() == 6);
-	}
-
-	@Test
+    @Test
+    public void testXml() throws Exception
+    {
+        testOverall();
+
+        final XStream xstream = new XStream(new StaxDriver());
+        final String xml = xstream.toXML(network);
+        Assert.assertTrue("could not serialize network!", xml != null);
+        final Object networkObject = xstream.fromXML(xml);
+        Assert.assertTrue("deserialized object type doesnt match serialized object type", networkObject instanceof MutableMarkovRandomFieldAdjacencyGraph);
+        Assert.assertTrue("deserialized network had the wrong number of edges", ((MutableMarkovRandomFieldAdjacencyGraph)networkObject).getEdges().size() == network.getEdges().size());
+        Assert.assertTrue("deserialized network had the wrong number of nodes", ((MutableMarkovRandomFieldAdjacencyGraph)networkObject).getNodes().size() == network.getNodes().size());
+    }
+
+    @Test
 	public void testOverallRepeated()
 	{
 		for(int i = 0; i < 10; i++)