Index: src/edu/ucsb/nceas/metacat/restservice/MNResourceHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/restservice/MNResourceHandler.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/restservice/MNResourceHandler.java	(revision 6367)
@@ -28,7 +28,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -73,6 +72,7 @@
 import org.dataone.service.types.v1.Permission;
 import org.dataone.service.types.v1.Subject;
 import org.dataone.service.types.v1.SystemMetadata;
+import org.dataone.service.util.TypeMarshaller;
 import org.jibx.runtime.JiBXException;
 
 import edu.ucsb.nceas.metacat.dataone.MNodeService;
@@ -307,14 +307,16 @@
      * @throws ServiceFailure
      * @throws NotAuthorized
      * @throws InvalidRequest
-     * @throws UnsupportedEncodingException
      * @throws JiBXException
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
+     * @throws IOException 
      */
-    private void syncError() throws NotImplemented, ServiceFailure, NotAuthorized, InvalidRequest, UnsupportedEncodingException, JiBXException {
+    private void syncError() throws NotImplemented, ServiceFailure, NotAuthorized, InvalidRequest, JiBXException, IOException, InstantiationException, IllegalAccessException {
     	SynchronizationFailed syncFailed = null;
     	if (params.containsKey("message")) {
             String message = params.get("message")[0];
-            syncFailed = (SynchronizationFailed) deserializeServiceType(SynchronizationFailed.class, new ByteArrayInputStream(message.getBytes("UTF-8")));
+            syncFailed = TypeMarshaller.unmarshalTypeFromStream(SynchronizationFailed.class, new ByteArrayInputStream(message.getBytes("UTF-8")));
         }
 		MNodeService.getInstance().synchronizationFailed(session, syncFailed);
     }
@@ -415,7 +417,7 @@
             response.setStatus(200);
             response.setContentType("text/xml");
             
-            serializeServiceType(MonitorList.class, monitorList, out);
+            TypeMarshaller.marshalTypeToOutputStream(monitorList, out);
             
             return true;
             
@@ -484,7 +486,7 @@
         logMetacat.debug("got checksum " + c.getValue());
         response.setStatus(200);
         logMetacat.debug("serializing response");
-        serializeServiceType(Checksum.class, c, response.getOutputStream());
+        TypeMarshaller.marshalTypeToOutputStream(c, response.getOutputStream());
         logMetacat.debug("done serializing response.");
         
     }
@@ -500,8 +502,10 @@
 	 * @throws InsufficientResources 
 	 * @throws NotAuthorized 
 	 * @throws NotImplemented 
+	 * @throws IllegalAccessException 
+	 * @throws InstantiationException 
      */
-    private void replicate() throws ServiceFailure, InvalidRequest, IOException, FileUploadException, JiBXException, NotImplemented, NotAuthorized, InsufficientResources, UnsupportedType {
+    private void replicate() throws ServiceFailure, InvalidRequest, IOException, FileUploadException, JiBXException, NotImplemented, NotAuthorized, InsufficientResources, UnsupportedType, InstantiationException, IllegalAccessException {
 
         logMetacat.debug("in POST replicate()");
         
@@ -510,7 +514,7 @@
         
         String sn = multipartparams.get("sourceNode").get(0);
         logMetacat.debug("sourceNode: " + sn);
-        NodeReference sourceNode = (NodeReference) deserializeServiceType(NodeReference.class, new ByteArrayInputStream(sn.getBytes("UTF-8")));
+        NodeReference sourceNode = TypeMarshaller.unmarshalTypeFromStream(NodeReference.class, new ByteArrayInputStream(sn.getBytes("UTF-8")));
         
         MNodeService.getInstance().replicate(session, sysmeta, sourceNode);
 
@@ -538,7 +542,7 @@
         
         response.setContentType("text/xml");
         response.setStatus(200);
-        serializeServiceType(NodeList.class, nl, response.getOutputStream());
+        TypeMarshaller.marshalTypeToOutputStream(nl, response.getOutputStream());
         
     }
     
@@ -565,7 +569,7 @@
         DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SZ");
         response.addHeader("pid", pid);
         response.addHeader("checksum", dr.getDataONE_Checksum().getValue());
-        response.addHeader("checksum_algorithm", dr.getDataONE_Checksum().getAlgorithm().name());
+        response.addHeader("checksum_algorithm", dr.getDataONE_Checksum().getAlgorithm().xmlValue());
         response.addHeader("content_length", dr.getContent_Length() + "");
         response.addHeader("last_modified", dateFormat.format(dr.getLast_Modified()));
         response.addHeader("format", dr.getDataONE_ObjectFormat().toString());
@@ -633,7 +637,7 @@
         response.setStatus(200);
         response.setContentType("text/xml");
         
-        serializeServiceType(Log.class, log, out);
+        TypeMarshaller.marshalTypeToOutputStream(log, out);
         
     }
     
@@ -771,7 +775,7 @@
             response.setStatus(200);
             response.setContentType("text/xml");
             // Serialize and write it to the output stream
-            serializeServiceType(ObjectList.class, ol, out);
+            TypeMarshaller.marshalTypeToOutputStream(ol, out);
             
         }
         
@@ -801,7 +805,7 @@
         OutputStream out = response.getOutputStream();
         
         // Serialize and write it to the output stream
-       serializeServiceType(SystemMetadata.class, sysmeta, out);
+        TypeMarshaller.marshalTypeToOutputStream(sysmeta, out);
    }
     
     
@@ -822,8 +826,10 @@
      * @throws InvalidToken 
      * @throws NotFound 
      * @throws IOException 
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
      */
-    protected void putObject(String pid, String action) throws ServiceFailure, InvalidRequest, JiBXException, InvalidToken, NotAuthorized, IdentifierNotUnique, UnsupportedType, InsufficientResources, InvalidSystemMetadata, NotImplemented, NotFound, IOException {
+    protected void putObject(String pid, String action) throws ServiceFailure, InvalidRequest, JiBXException, InvalidToken, NotAuthorized, IdentifierNotUnique, UnsupportedType, InsufficientResources, InvalidSystemMetadata, NotImplemented, NotFound, IOException, InstantiationException, IllegalAccessException {
         logMetacat.debug("putObject with pid " + pid);
         logMetacat.debug("Entering putObject: " + pid + "/" + action);
         
@@ -844,13 +850,13 @@
         if (action.equals(FUNCTION_NAME_INSERT)) { 
             // handle inserts
             logMetacat.debug("Commence creation...");
-            SystemMetadata smd = (SystemMetadata) deserializeServiceType(SystemMetadata.class, sysmeta);
+            SystemMetadata smd = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmeta);
 
             Identifier id = new Identifier();
             id.setValue(pid);
             logMetacat.debug("creating object with pid " + pid);
             Identifier rId = MNodeService.getInstance().create(session, id, object, smd);
-            serializeServiceType(Identifier.class, rId, out);
+            TypeMarshaller.marshalTypeToOutputStream(rId, out);
             
         } else if (action.equals(FUNCTION_NAME_UPDATE)) {
         	// handle updates
@@ -870,10 +876,10 @@
             logMetacat.debug("Commence update...");
             
             // get the systemmetadata object
-            SystemMetadata smd = (SystemMetadata) deserializeServiceType(SystemMetadata.class, sysmeta);
+            SystemMetadata smd = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmeta);
 
             Identifier rId = MNodeService.getInstance().update(session, newPid, object, obsoletedPid, smd);
-            serializeServiceType(Identifier.class, rId, out);
+            TypeMarshaller.marshalTypeToOutputStream(rId, out);
         } else {
             throw new InvalidRequest("1000", "Operation must be create or update.");
         }
@@ -905,7 +911,7 @@
 
         logMetacat.debug("Calling delete");
         MNodeService.getInstance().delete(session, id);
-        serializeServiceType(Identifier.class, id, out);
+        TypeMarshaller.marshalTypeToOutputStream(id, out);
         
     }    
     
@@ -912,7 +918,6 @@
     /**
      * set the access perms on a document
      * @throws JiBXException 
-     * @throws UnsupportedEncodingException 
      * @throws InvalidRequest 
      * @throws NotImplemented 
      * @throws NotAuthorized 
@@ -919,8 +924,11 @@
      * @throws NotFound 
      * @throws ServiceFailure 
      * @throws InvalidToken 
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
+     * @throws IOException 
      */
-    protected void setAccess() throws UnsupportedEncodingException, JiBXException, InvalidToken, ServiceFailure, NotFound, NotAuthorized, NotImplemented, InvalidRequest
+    protected void setAccess() throws JiBXException, InvalidToken, ServiceFailure, NotFound, NotAuthorized, NotImplemented, InvalidRequest, IOException, InstantiationException, IllegalAccessException
     {
     
         String pid = params.get("pid")[0];
@@ -927,7 +935,7 @@
         Identifier id = new Identifier();
         id.setValue(pid);
         String accesspolicy = params.get("accesspolicy")[0];
-        AccessPolicy accessPolicy = (AccessPolicy) deserializeServiceType(AccessPolicy.class, new ByteArrayInputStream(accesspolicy.getBytes("UTF-8")));
+        AccessPolicy accessPolicy = TypeMarshaller.unmarshalTypeFromStream(AccessPolicy.class, new ByteArrayInputStream(accesspolicy.getBytes("UTF-8")));
         MNodeService.getInstance().setAccessPolicy(session, id, accessPolicy);
         
         
Index: src/edu/ucsb/nceas/metacat/restservice/ResourceHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/restservice/ResourceHandler.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/restservice/ResourceHandler.java	(revision 6367)
@@ -50,7 +50,6 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.log4j.Logger;
-import org.apache.maven.artifact.ant.shaded.IOUtil;
 import org.dataone.client.MNode;
 import org.dataone.client.ObjectFormatCache;
 import org.dataone.client.auth.CertificateManager;
@@ -87,7 +86,7 @@
 import org.dataone.service.types.v1.Session;
 import org.dataone.service.types.v1.SystemMetadata;
 import org.dataone.service.types.v1.util.ChecksumUtil;
-import org.dataone.service.types.util.ServiceTypeUtil;
+import org.dataone.service.util.TypeMarshaller;
 import org.jibx.runtime.BindingDirectory;
 import org.jibx.runtime.IBindingFactory;
 import org.jibx.runtime.IUnmarshallingContext;
@@ -825,7 +824,7 @@
             DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SZ");
             response.addHeader("guid", guid);
             response.addHeader("checksum", dr.getDataONE_Checksum().getValue());
-            response.addHeader("checksum_algorithm", dr.getDataONE_Checksum().getAlgorithm().name());
+            response.addHeader("checksum_algorithm", dr.getDataONE_Checksum().getAlgorithm().xmlValue());
             response.addHeader("content_length", dr.getContent_Length() + "");
             response.addHeader("last_modified", dateFormat.format(dr.getLast_Modified()));
             response.addHeader("format", dr.getDataONE_ObjectFormat().toString());
@@ -1361,11 +1360,12 @@
      * @param object the object to serialize
      * @param out the stream to serialize it to
      * @throws JiBXException
+     * @throws IOException 
      */
     protected void serializeServiceType(Class type, Object object, OutputStream out)
-      throws JiBXException
+      throws JiBXException, IOException
     {
-        ServiceTypeUtil.serializeServiceType(type, object, out);
+    	TypeMarshaller.marshalTypeToOutputStream(object, out);
     }
     
     /**
@@ -1373,11 +1373,14 @@
      * @param type the class of the object to serialize (i.e. SystemMetadata.class)
      * @param is the stream to deserialize from
      * @throws JiBXException
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
+     * @throws IOException 
      */
     protected Object deserializeServiceType(Class type, InputStream is)
-      throws JiBXException
+      throws JiBXException, IOException, InstantiationException, IllegalAccessException
     {
-        return ServiceTypeUtil.deserializeServiceType(type, is);
+        return TypeMarshaller.unmarshalTypeFromStream(type, is);
     }
     
     /**
@@ -1546,9 +1549,9 @@
      * 
      * @param guid - ID of data object to be inserted or updated.  If action is update, the pid
      *               is the existing pid.  If insert, the pid is the new one
-     * @throws IOException
+     * @throws IOException 
      */
-    protected void putObject(String pid, String action) {
+    protected void putObject(String pid, String action) throws IOException {
         System.out.println("ResourceHandler: putObject with pid " + pid);
         logMetacat.debug("Entering putObject: " + pid + "/" + action);
         OutputStream out = null;
@@ -1952,12 +1955,12 @@
       	response.setStatus(200);
       	serializeException(e, out);
       
-      } catch (JiBXException jibxe) {
+      } catch (Exception e) {
       	response.setStatus(501);
-      	ServiceFailure e = 
+      	ServiceFailure se = 
       		new ServiceFailure("4841", "Unexpected exception from the service - " + 
-        	                   jibxe.getClass() + ": " + jibxe.getMessage());
-      	serializeException(e, out);
+        	                   e.getClass() + ": " + e.getMessage());
+      	serializeException(se, out);
       	
       }
       
@@ -2012,11 +2015,11 @@
       	response.setStatus(200);
       	serializeException(e, out);
       
-      } catch (JiBXException jibxe) {
-      	ServiceFailure e = 
+      } catch (Exception e) {
+      	ServiceFailure se = 
       		new ServiceFailure("4841", "Unexpected exception from the service - " + 
-        	                   jibxe.getClass() + ": " + jibxe.getMessage());
-      	serializeException(e, out);
+        	                   e.getClass() + ": " + e.getMessage());
+      	serializeException(se, out);
 
       }
 	    
@@ -2137,7 +2140,7 @@
 					+ guid.getValue());
 			boolean result = CNodeService.getInstance().registerSystemMetadata(
 					session, guid, systemMetadata);
-			serializeServiceType(Boolean.class, result, out);
+			TypeMarshaller.marshalTypeToOutputStream(result, out);
 
 		} catch (NotAuthorized e) {
 			response.setStatus(500);
@@ -2154,15 +2157,15 @@
 		} catch (InvalidRequest e) {
 			response.setStatus(500);
 			serializeException(e, out);
-		} catch (JiBXException e) {
+		} catch (InvalidSystemMetadata e) {
+			serializeException(e, out);
+		} catch (Exception e) {
 			response.setStatus(500);
 			e.printStackTrace(System.out);
 			InvalidSystemMetadata ism = new InvalidSystemMetadata("1080", e
 					.getMessage());
 			serializeException(ism, out);
-		} catch (InvalidSystemMetadata e) {
-			serializeException(e, out);
-    }
+		} 
 	}
 
 }
Index: src/edu/ucsb/nceas/metacat/restservice/CNResourceHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/restservice/CNResourceHandler.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/restservice/CNResourceHandler.java	(revision 6367)
@@ -28,7 +28,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.util.Map;
 
@@ -64,6 +63,7 @@
 import org.dataone.service.types.v1.QueryType;
 import org.dataone.service.types.v1.Subject;
 import org.dataone.service.types.v1.SystemMetadata;
+import org.dataone.service.util.TypeMarshaller;
 import org.jibx.runtime.JiBXException;
 
 import edu.ucsb.nceas.metacat.dataone.CNodeService;
@@ -316,7 +316,7 @@
         logMetacat.debug("got checksum " + c.getValue());
         response.setStatus(200);
         logMetacat.debug("serializing response");
-        serializeServiceType(Checksum.class, c, response.getOutputStream());
+        TypeMarshaller.marshalTypeToOutputStream(c, response.getOutputStream());
         logMetacat.debug("done serializing response.");
         
     }
@@ -383,7 +383,7 @@
         response.setStatus(200);
         response.setContentType("text/xml");
         
-        serializeServiceType(Log.class, log, out);
+        TypeMarshaller.marshalTypeToOutputStream(log, out);
   
     }
 
@@ -461,7 +461,7 @@
         OutputStream out = response.getOutputStream();
         
         // Serialize and write it to the output stream
-       serializeServiceType(SystemMetadata.class, sysmeta, out);
+        TypeMarshaller.marshalTypeToOutputStream(sysmeta, out);
    }
     
     /**
@@ -480,8 +480,10 @@
      * @throws NotAuthorized 
      * @throws InvalidToken 
      * @throws IOException 
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
      */
-    protected void putObject(String pid, String action) throws ServiceFailure, InvalidRequest, IdentifierNotUnique, JiBXException, InvalidToken, NotAuthorized, UnsupportedType, InsufficientResources, InvalidSystemMetadata, NotImplemented, IOException {
+    protected void putObject(String pid, String action) throws ServiceFailure, InvalidRequest, IdentifierNotUnique, JiBXException, InvalidToken, NotAuthorized, UnsupportedType, InsufficientResources, InvalidSystemMetadata, NotImplemented, IOException, InstantiationException, IllegalAccessException {
         logMetacat.debug("Entering putObject: " + pid + "/" + action);
         
         // Read the incoming data from its Mime Multipart encoding
@@ -497,7 +499,7 @@
         if (action.equals(FUNCTION_NAME_INSERT)) { //handle inserts
 
             logMetacat.debug("Commence creation...");
-            SystemMetadata smd = (SystemMetadata) deserializeServiceType(SystemMetadata.class, sysmeta);
+            SystemMetadata smd = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmeta);
 
             Identifier id = new Identifier();
             id.setValue(pid);
@@ -508,7 +510,7 @@
             response.setStatus(200);
             response.setContentType("text/xml");
             
-            serializeServiceType(Identifier.class, rId, out);
+            TypeMarshaller.marshalTypeToOutputStream(rId, out);
             
         } else {
             throw new InvalidRequest("1000", "Operation must be create.");
@@ -534,7 +536,7 @@
       response.setStatus(200);
       response.setContentType("text/xml");
       
-      serializeServiceType(ObjectFormatList.class, objectFormatList, out);
+      TypeMarshaller.marshalTypeToOutputStream(objectFormatList, out);
             
     }
 
@@ -563,7 +565,7 @@
       response.setStatus(200);
       response.setContentType("text/xml");
       
-      serializeServiceType(ObjectFormat.class, objectFormat, out);
+      TypeMarshaller.marshalTypeToOutputStream(objectFormat, out);
       
     }
     
@@ -605,7 +607,7 @@
 		OutputStream out = response.getOutputStream();
 		response.setStatus(200);
 		response.setContentType("text/xml");
-		serializeServiceType(Identifier.class, retPid, out);
+		TypeMarshaller.marshalTypeToOutputStream(retPid, out);
 		
     }
     
@@ -628,7 +630,7 @@
 	    OutputStream out = response.getOutputStream();
 		response.setStatus(200);
 		response.setContentType("text/xml");
-		serializeServiceType(ObjectLocationList.class, locationList, out);
+		TypeMarshaller.marshalTypeToOutputStream(locationList, out);
 		
     }
 
@@ -676,17 +678,19 @@
      * @throws NotImplemented
      * @throws InvalidRequest
      * @throws IOException
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
      */
-    private void owner(String id) throws JiBXException, InvalidToken, ServiceFailure, NotFound, NotAuthorized, NotImplemented, InvalidRequest, IOException {
+    private void owner(String id) throws JiBXException, InvalidToken, ServiceFailure, NotFound, NotAuthorized, NotImplemented, InvalidRequest, IOException, InstantiationException, IllegalAccessException {
 		Identifier pid = new Identifier();
 		pid.setValue(id);
 		String subjectStr = params.get("subject")[0];
-		Subject subject = (Subject) deserializeServiceType(Subject.class, new ByteArrayInputStream(subjectStr.getBytes("UTF-8")));
+		Subject subject = TypeMarshaller.unmarshalTypeFromStream(Subject.class, new ByteArrayInputStream(subjectStr.getBytes("UTF-8")));
 		Identifier retPid = CNodeService.getInstance().setOwner(session, pid, subject);
 		OutputStream out = response.getOutputStream();
 		response.setStatus(200);
 		response.setContentType("text/xml");
-		serializeServiceType(Identifier.class, retPid, out);		
+		TypeMarshaller.marshalTypeToOutputStream(retPid, out);		
     }
     
     /**
@@ -721,8 +725,10 @@
      * @throws InvalidSystemMetadata 
      * @throws NotAuthorized 
      * @throws NotImplemented 
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
      */
-    protected boolean registerSystemMetadata(String pid) throws ServiceFailure, InvalidRequest, IOException, FileUploadException, JiBXException, NotImplemented, NotAuthorized, InvalidSystemMetadata {
+    protected boolean registerSystemMetadata(String pid) throws ServiceFailure, InvalidRequest, IOException, FileUploadException, JiBXException, NotImplemented, NotAuthorized, InvalidSystemMetadata, InstantiationException, IllegalAccessException {
 		logMetacat.debug("Entering registerSystemMetadata: " + pid);
 
 		// get the system metadata from the request
@@ -742,7 +748,6 @@
     /**
      * set the access perms on a document
      * @throws JiBXException 
-     * @throws UnsupportedEncodingException 
      * @throws InvalidRequest 
      * @throws NotImplemented 
      * @throws NotAuthorized 
@@ -749,14 +754,17 @@
      * @throws NotFound 
      * @throws ServiceFailure 
      * @throws InvalidToken 
+     * @throws IllegalAccessException 
+     * @throws InstantiationException 
+     * @throws IOException 
      */
-    protected void setAccess() throws UnsupportedEncodingException, JiBXException, InvalidToken, ServiceFailure, NotFound, NotAuthorized, NotImplemented, InvalidRequest {
+    protected void setAccess() throws JiBXException, InvalidToken, ServiceFailure, NotFound, NotAuthorized, NotImplemented, InvalidRequest, IOException, InstantiationException, IllegalAccessException {
 
         String guid = params.get("guid")[0];
         Identifier id = new Identifier();
         id.setValue(guid);
         String accesspolicy = params.get("accesspolicy")[0];
-        AccessPolicy accessPolicy = (AccessPolicy) deserializeServiceType(AccessPolicy.class, new ByteArrayInputStream(accesspolicy.getBytes("UTF-8")));
+        AccessPolicy accessPolicy = TypeMarshaller.unmarshalTypeFromStream(AccessPolicy.class, new ByteArrayInputStream(accesspolicy.getBytes("UTF-8")));
         CNodeService.getInstance().setAccessPolicy(session, id, accessPolicy);
 
     }
Index: src/edu/ucsb/nceas/metacat/restservice/D1ResourceHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/restservice/D1ResourceHandler.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/restservice/D1ResourceHandler.java	(revision 6367)
@@ -56,7 +56,7 @@
 import org.dataone.service.exceptions.ServiceFailure;
 import org.dataone.service.types.v1.Session;
 import org.dataone.service.types.v1.SystemMetadata;
-import org.dataone.service.types.util.ServiceTypeUtil;
+import org.dataone.service.util.TypeMarshaller;
 import org.jibx.runtime.JiBXException;
 
 import edu.ucsb.nceas.metacat.MetacatHandler;
@@ -150,7 +150,7 @@
         }
     }
     
-    protected SystemMetadata collectSystemMetadata() throws IOException, FileUploadException, ServiceFailure, InvalidRequest, JiBXException  {
+    protected SystemMetadata collectSystemMetadata() throws IOException, FileUploadException, ServiceFailure, InvalidRequest, JiBXException, InstantiationException, IllegalAccessException  {
 		
 		// Read the incoming data from its Mime Multipart encoding
 		logMetacat.debug("Disassembling MIME multipart form");
@@ -221,7 +221,7 @@
 		sysmeta = new FileInputStream(smFile);
 	
 		logMetacat.debug("Commence creation...");
-		SystemMetadata systemMetadata = (SystemMetadata) deserializeServiceType(SystemMetadata.class, sysmeta);
+		SystemMetadata systemMetadata = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class, sysmeta);
 		return systemMetadata;
 	}
     
@@ -335,28 +335,6 @@
         }    
     }
 
-    /**
-     * serialize an object of type to out
-     * @param type the class of the object to serialize (i.e. SystemMetadata.class)
-     * @param object the object to serialize
-     * @param out the stream to serialize it to
-     * @throws JiBXException
-     */
-    protected void serializeServiceType(Class type, Object object, OutputStream out)
-      throws JiBXException {
-        ServiceTypeUtil.serializeServiceType(type, object, out);
-    }
-    
-    /**
-     * deserialize an object of type from is
-     * @param type the class of the object to serialize (i.e. SystemMetadata.class)
-     * @param is the stream to deserialize from
-     * @throws JiBXException
-     */
-    protected Object deserializeServiceType(Class type, InputStream is)
-      throws JiBXException {
-        return ServiceTypeUtil.deserializeServiceType(type, is);
-    }
         
     /**
      * locate the boundary marker for an MMP
Index: src/edu/ucsb/nceas/metacat/MetacatHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/MetacatHandler.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/MetacatHandler.java	(revision 6367)
@@ -84,11 +84,9 @@
 import org.dataone.service.types.v1.Subject;
 import org.dataone.service.types.v1.SystemMetadata;
 import org.dataone.service.types.v1.util.ChecksumUtil;
-import org.dataone.service.types.util.ServiceTypeUtil;
 import org.ecoinformatics.datamanager.DataManager;
 import org.ecoinformatics.datamanager.database.DatabaseConnectionPoolInterface;
 import org.ecoinformatics.datamanager.parser.DataPackage;
-import org.ecoinformatics.datamanager.parser.TextComplexDataFormat;
 import org.ecoinformatics.eml.EMLParser;
 import org.jibx.runtime.JiBXException;
 import org.xml.sax.SAXException;
Index: src/edu/ucsb/nceas/metacat/dataone/MNodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/MNodeService.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/dataone/MNodeService.java	(revision 6367)
@@ -81,7 +81,6 @@
 import org.dataone.service.types.v1.Synchronization;
 import org.dataone.service.types.v1.SystemMetadata;
 import org.dataone.service.types.v1.util.ChecksumUtil;
-import org.dataone.service.types.util.ServiceTypeUtil;
 
 import edu.ucsb.nceas.metacat.DocumentImpl;
 import edu.ucsb.nceas.metacat.EventLog;
Index: src/edu/ucsb/nceas/metacat/replication/ReplicationHandler.java
===================================================================
--- src/edu/ucsb/nceas/metacat/replication/ReplicationHandler.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/replication/ReplicationHandler.java	(revision 6367)
@@ -55,7 +55,7 @@
 
 import org.apache.log4j.Logger;
 import org.dataone.service.types.v1.SystemMetadata;
-import org.dataone.service.types.util.ServiceTypeUtil;
+import org.dataone.service.util.TypeMarshaller;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.ErrorHandler;
 import org.xml.sax.InputSource;
@@ -442,7 +442,7 @@
       // process system metadata
       if (systemMetadataXML != null) {
     	  SystemMetadata sysMeta = 
-    		  (SystemMetadata) ServiceTypeUtil.deserializeServiceType(
+    		  TypeMarshaller.unmarshalTypeFromStream(
     				  SystemMetadata.class, 
     				  new ByteArrayInputStream(systemMetadataXML.getBytes("UTF-8")));
     	  String guid = sysMeta.getIdentifier().getValue();
@@ -601,7 +601,7 @@
      // process system metadata
         if (systemMetadataXML != null) {
       	  SystemMetadata sysMeta = 
-      		  (SystemMetadata) ServiceTypeUtil.deserializeServiceType(
+      		TypeMarshaller.unmarshalTypeFromStream(
       				  SystemMetadata.class, 
       				  new ByteArrayInputStream(systemMetadataXML.getBytes("UTF-8")));
       	  String guid = sysMeta.getIdentifier().getValue();
@@ -837,8 +837,7 @@
 
 			// process system metadata
 			if (systemMetadataXML != null) {
-				SystemMetadata sysMeta = (SystemMetadata) ServiceTypeUtil
-						.deserializeServiceType(SystemMetadata.class,
+				SystemMetadata sysMeta = TypeMarshaller.unmarshalTypeFromStream(SystemMetadata.class,
 								new ByteArrayInputStream(systemMetadataXML
 										.getBytes("UTF-8")));
 				// String guid = sysMeta.getIdentifier().getValue();
Index: src/edu/ucsb/nceas/metacat/replication/ReplicationService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/replication/ReplicationService.java	(revision 6366)
+++ src/edu/ucsb/nceas/metacat/replication/ReplicationService.java	(revision 6367)
@@ -58,7 +58,7 @@
 
 import org.apache.log4j.Logger;
 import org.dataone.service.types.v1.SystemMetadata;
-import org.dataone.service.types.util.ServiceTypeUtil;
+import org.dataone.service.util.TypeMarshaller;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
@@ -586,7 +586,7 @@
 			// process system metadata
 			if (systemMetadataXML != null) {
 				SystemMetadata sysMeta = 
-					(SystemMetadata) ServiceTypeUtil.deserializeServiceType(
+					TypeMarshaller.unmarshalTypeFromStream(
 							SystemMetadata.class,
 							new ByteArrayInputStream(systemMetadataXML.getBytes("UTF-8")));
 				String guid = sysMeta.getIdentifier().getValue();
@@ -867,7 +867,7 @@
 		        // process system metadata
 		        if (systemMetadataXML != null) {
 		      	  SystemMetadata sysMeta = 
-		      		  (SystemMetadata) ServiceTypeUtil.deserializeServiceType(
+		      		TypeMarshaller.unmarshalTypeFromStream(
 		      				  SystemMetadata.class, 
 		      				  new ByteArrayInputStream(systemMetadataXML.getBytes("UTF-8")));
 		      	  String guid = sysMeta.getIdentifier().getValue();
@@ -977,7 +977,7 @@
 				String guid = IdentifierManager.getInstance().getGUID(doc.getDocID(), doc.getRev());
 				SystemMetadata systemMetadata = IdentifierManager.getInstance().getSystemMetadata(guid);
 				ByteArrayOutputStream baos = new ByteArrayOutputStream();
-				ServiceTypeUtil.serializeServiceType(SystemMetadata.class, systemMetadata, baos);
+				TypeMarshaller.marshalTypeToOutputStream(systemMetadata, baos);
 				String systemMetadataXML = baos.toString("UTF-8");
 				sb.append("<systemMetadata>");
 				sb.append(systemMetadataXML);
@@ -1038,7 +1038,7 @@
 			// serialize the System Metadata as XML 
 			SystemMetadata systemMetadata = IdentifierManager.getInstance().getSystemMetadata(guid);
 			ByteArrayOutputStream baos = new ByteArrayOutputStream();
-			ServiceTypeUtil.serializeServiceType(SystemMetadata.class, systemMetadata, baos);
+			TypeMarshaller.marshalTypeToOutputStream(systemMetadata, baos);
 			systemMetadataXML = baos.toString("UTF-8");
 				
 			// get a writer for sending back to response
@@ -1078,7 +1078,7 @@
 			// process system metadata
 			if (systemMetadataXML != null) {
 				SystemMetadata sysMeta = 
-					(SystemMetadata) ServiceTypeUtil.deserializeServiceType(
+					TypeMarshaller.unmarshalTypeFromStream(
 							SystemMetadata.class,
 							new ByteArrayInputStream(systemMetadataXML.getBytes("UTF-8")));
 				if (!IdentifierManager.getInstance().identifierExists(guid)) {
