Index: test/edu/ucsb/nceas/metacattest/IdentifierManagerTest.java
===================================================================
--- test/edu/ucsb/nceas/metacattest/IdentifierManagerTest.java	(revision 5886)
+++ test/edu/ucsb/nceas/metacattest/IdentifierManagerTest.java	(revision 5887)
@@ -62,6 +62,7 @@
      */
     public void testGetGUID()
     {
+        ph("testGetGUID");
         try
         {
             IdentifierManager im = IdentifierManager.getInstance();
@@ -86,12 +87,13 @@
      */
     public void testGetAllLocalIds()
     {
+        ph("testGetAllLocalIds");
         try
         {
             List l = IdentifierManager.getInstance().getAllLocalIds();
             for(int i=0; i<l.size(); i++)
             {
-                //System.out.println(l.get(i));
+                System.out.println(l.get(i));
             }
             assertTrue(l.size() > 0);
         }
@@ -103,6 +105,7 @@
 
     /** Test that IM instances can be created. */
     public void testGetInstance() {
+        ph("testGetInstance");
         IdentifierManager im = IdentifierManager.getInstance();
         assertNotNull(im);
     }
@@ -109,6 +112,7 @@
 
     /** Test that known LocalId's can be looked up from GUIDs. */
     public void testGetLocalId() {
+        ph("testGetLocalId");
         IdentifierManager im = IdentifierManager.getInstance();
         String docid = insertTestDocument();
         String goodGuid = "test:" + docid;
@@ -124,6 +128,7 @@
     
     /** Test that unknown LocalId's return the proper exception. */
     public void testGetLocalIdNotFound() {
+        ph("testGetLocalIdNotFound");
         IdentifierManager im = IdentifierManager.getInstance();
         String idReturned;
         try {
@@ -140,6 +145,7 @@
      *  be, and that it is not present when it shouldn't be. 
      */
     public void testIdentifierExists() {
+        ph("testIdentifierExists");
         IdentifierManager im = IdentifierManager.getInstance();
         String docid = insertTestDocument();
         im.createMapping("test:"+docid, docid);
@@ -154,6 +160,7 @@
      * getLocalId() and getGUID()
      */
     public void testCreateMapping() {
+       ph("testCreateMapping");
        try
        {
             IdentifierManager im = IdentifierManager.getInstance();
@@ -177,6 +184,7 @@
      */
     public void testCreateSystemMetadataMapping()
     {
+        ph("testCreateSystemMetadataMapping");
         try
         {
             IdentifierManager im = IdentifierManager.getInstance();
@@ -211,6 +219,7 @@
                 null, "http://fake.example.com/somedata", null,
                 accessBlock, null, null,
                 null, null);
+        System.out.println("inserting doc: " + emldoc);
         String docid = generateDocumentId() + ".1";
         try {
             m.login(username, password);
@@ -222,4 +231,9 @@
         }
         return docid;
     }
+    
+    private void ph(String s)
+    {
+        System.out.println("*********************** " + s + " ****************************");
+    }
 }
Index: src/xmltables-oracle.sql
===================================================================
--- src/xmltables-oracle.sql	(revision 5886)
+++ src/xmltables-oracle.sql	(revision 5887)
@@ -402,7 +402,15 @@
 CREATE TABLE systemMetadata (
    guid   VARCHAR2(2000),    -- the globally unique string identifier
    docid  VARCHAR(250), 	 -- the local document id #
-   rev    NUMBER(8)          -- the revision part of the local identifier
+   rev    NUMBER(8),          -- the revision part of the local identifier
+   date_uploaded DATE, -- the date/time the document was first submitted
+   rights_holder VARCHAR2(250), --the user who has rights to the document, usually the first persons to upload it
+   checksum VARCHAR2(512), --the checksum of the doc using the given algorithm (see below)
+   checksum_algorithm VARCHAR2(250), --the algorithm used to calculate the checksum
+   origin_member_node VARCHAR2(250), --the member node where the document was first uploaded
+   authoritive_member_node VARCHAR2(250), --the member node that currently controls the document
+   date_modified DATE, -- the last date/time that the file was changed
+   submitter VARCHAR2(256) -- the user who originally submitted the doc
 )
 
 /*
Index: src/upgrade-db-to-1.10.0-postgres.sql
===================================================================
--- src/upgrade-db-to-1.10.0-postgres.sql	(revision 5886)
+++ src/upgrade-db-to-1.10.0-postgres.sql	(revision 5887)
@@ -4,6 +4,14 @@
    guid   text,          -- the globally unique string identifier
    docid  VARCHAR(250),	 -- the local document id #
    rev    INT8,          -- the revision part of the local identifier
+   date_uploaded TIMESTAMP, -- the date/time the document was first submitted
+   rights_holder VARCHAR(250), --the user who has rights to the document, usually the first persons to upload it
+   checksum VARCHAR(512), --the checksum of the doc using the given algorithm (see below)
+   checksum_algorithm VARCHAR(250), --the algorithm used to calculate the checksum
+   origin_member_node VARCHAR(250), --the member node where the document was first uploaded
+   authoritive_member_node VARCHAR(250), --the member node that currently controls the document
+   date_modified TIMESTAMP, -- the last date/time that the file was changed
+   submitter VARCHAR(256), -- the user who originally submitted the doc
    CONSTRAINT systemMetadata_pk PRIMARY KEY (guid)
 );
 
Index: src/xmltables-postgres.sql
===================================================================
--- src/xmltables-postgres.sql	(revision 5886)
+++ src/xmltables-postgres.sql	(revision 5887)
@@ -289,9 +289,17 @@
  * data first or the systemMetadata first.
  */
 CREATE TABLE systemMetadata (
-   guid   text,          -- the globally unique string identifier
+   guid   text,          -- the globally unique string identifier of the object that the system metadata describes
    docid  VARCHAR(250),	 -- the local document id #
    rev    INT8,          -- the revision part of the local identifier
+   date_uploaded TIMESTAMP, -- the date/time the document was first submitted
+   rights_holder VARCHAR(250), --the user who has rights to the document, usually the first persons to upload it
+   checksum VARCHAR(512), --the checksum of the doc using the given algorithm (see below)
+   checksum_algorithm VARCHAR(250), --the algorithm used to calculate the checksum
+   origin_member_node VARCHAR(250), --the member node where the document was first uploaded
+   authoritive_member_node VARCHAR(250), --the member node that currently controls the document
+   date_modified TIMESTAMP, -- the last date/time that the file was changed
+   submitter VARCHAR(256), -- the user who originally submitted the doc
    CONSTRAINT systemMetadata_pk PRIMARY KEY (guid)
 );
 
Index: src/upgrade-db-to-1.10.0-oracle.sql
===================================================================
--- src/upgrade-db-to-1.10.0-oracle.sql	(revision 5886)
+++ src/upgrade-db-to-1.10.0-oracle.sql	(revision 5887)
@@ -4,7 +4,15 @@
 CREATE TABLE systemMetadata (
    guid   VARCHAR2(2000),    -- the globally unique string identifier
    docid  VARCHAR(250), 	 -- the local document id #
-   rev    NUMBER(8)          -- the revision part of the local identifier
+   rev    NUMBER(8),          -- the revision part of the local identifier
+   date_uploaded DATE, -- the date/time the document was first submitted
+   rights_holder VARCHAR2(250), --the user who has rights to the document, usually the first persons to upload it
+   checksum VARCHAR2(512), --the checksum of the doc using the given algorithm (see below)
+   checksum_algorithm VARCHAR2(250), --the algorithm used to calculate the checksum
+   origin_member_node VARCHAR2(250), --the member node where the document was first uploaded
+   authoritive_member_node VARCHAR2(250), --the member node that currently controls the document
+   date_modified DATE, -- the last date/time that the file was changed
+   submitter VARCHAR2(256) -- the user who originally submitted the doc
 )
 
 CREATE TABLE identifier (
Index: src/edu/ucsb/nceas/metacat/dataone/CrudService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/CrudService.java	(revision 5886)
+++ src/edu/ucsb/nceas/metacat/dataone/CrudService.java	(revision 5887)
@@ -1557,7 +1557,7 @@
         //insert the system metadata doc id into the systemmetadata table to 
         //link it to the data or metadata document
         IdentifierManager.getInstance().createSystemMetadataMapping(
-                sysmeta.getIdentifier().getValue(), sysMetaGuid.getValue());
+                sysmeta, sysMetaGuid.getValue());
         return localId;
     }
     
Index: src/edu/ucsb/nceas/metacat/IdentifierManager.java
===================================================================
--- src/edu/ucsb/nceas/metacat/IdentifierManager.java	(revision 5886)
+++ src/edu/ucsb/nceas/metacat/IdentifierManager.java	(revision 5887)
@@ -31,9 +31,11 @@
 import java.sql.SQLException;
 
 import org.apache.log4j.Logger;
+import org.dataone.service.types.SystemMetadata;
 
 import edu.ucsb.nceas.metacat.database.DBConnection;
 import edu.ucsb.nceas.metacat.database.DBConnectionPool;
+import edu.ucsb.nceas.metacat.properties.PropertyService;
 import edu.ucsb.nceas.metacat.util.DocumentUtil;
 
 /**
@@ -49,7 +51,7 @@
     
     public static final String TYPE_SYSTEM_METADATA = "systemmetadata";
     public static final String TYPE_IDENTIFIER = "identifier";
-    public static final String DATAONE_SM_DOCTYPE = "http://dataone.org/service/types/SystemMetadata/0.1";
+    public static String DATAONE_SM_DOCTYPE;
   
     /**
      * The single instance of the manager that is always returned.
@@ -63,6 +65,16 @@
      */
     private IdentifierManager()
     {
+        try
+        {
+            DATAONE_SM_DOCTYPE = PropertyService.getProperty("crudService.listObjects.ReturnDoctype");
+        }
+        catch(Exception e)
+        {
+            throw new RuntimeException("Error getting System Metadata doctype from " + 
+                    "the properties file.  Please make sure crudService.listObjects.ReturnDoctype " +
+                    "exists in metacat.properties.");
+        }
     }
 
     /**
@@ -491,7 +503,9 @@
     }
     
     /**
-     * insert a system metadata id for a local id
+     * creates a mapping for a system metadata document, but DOES NOT add any
+     * of the extra system metadata information to the table.  You must call 
+     * insertAdditionalSystemMetadataFields to complete the entry
      * 
      * @param guid the id to insert
      * @param localId the systemMetadata object to get the local id for
@@ -502,6 +516,19 @@
     }
     
     /**
+     * creates a system metadata mapping and adds additional fields from sysmeta
+     * to the table for quick searching.
+     * 
+     * @param guid the id to insert
+     * @param localId the systemMetadata object to get the local id for
+     */
+    public void createSystemMetadataMapping(SystemMetadata sysmeta, String localId)
+    {
+        createGenericMapping(sysmeta.getIdentifier().getValue(), localId, TYPE_SYSTEM_METADATA);
+        insertAdditionalSystemMetadataFields(sysmeta);
+    }
+    
+    /**
      * update a mapping
      * @param guid
      * @param localId
@@ -561,7 +588,74 @@
       return this.getLocalId(guid, TYPE_SYSTEM_METADATA);
     }
     
+    public void insertAdditionalSystemMetadataFields(long dateUploaded, String rightsHolder,
+            String checksum, String checksumAlgorithm, String originMemberNode,
+            String authoritativeMemberNode, long modifiedDate, String submitter, String guid)
+    {
+        DBConnection dbConn = null;
+        int serialNumber = -1;
+        try {
+            // Get a database connection from the pool
+            dbConn = 
+                DBConnectionPool.getDBConnection("IdentifierManager.createMapping");
+            serialNumber = dbConn.getCheckOutSerialNumber();
+
+            // Execute the insert statement
+            String query = "update " + TYPE_SYSTEM_METADATA + 
+                " set (date_uploaded, rights_holder, checksum, checksum_algorithm, " +
+                "origin_member_node, authoritive_member_node, date_modified, submitter) " +
+                "= (?, ?, ?, ?, ?, ?, ?, ?) where guid = ?";
+            PreparedStatement stmt = dbConn.prepareStatement(query);
+            
+            //data values
+            stmt.setTimestamp(1, new java.sql.Timestamp(dateUploaded));
+            stmt.setString(2, rightsHolder);
+            stmt.setString(3, checksum);
+            stmt.setString(4, checksumAlgorithm);
+            stmt.setString(5, originMemberNode);
+            stmt.setString(6, authoritativeMemberNode);
+            stmt.setTimestamp(7, new java.sql.Timestamp(modifiedDate));
+            stmt.setString(8, submitter);
+            //where clause
+            stmt.setString(9, guid);
+            System.out.println("stmt: " + stmt.toString());
+            //execute
+            int rows = stmt.executeUpdate();
+
+            stmt.close();
+        } catch (SQLException e) {
+            e.printStackTrace();
+            logMetacat.error("SQL error while creating a mapping to the system metadata identifier: " 
+                    + e.getMessage());
+        } catch (NumberFormatException e) {
+            e.printStackTrace();
+            logMetacat.error("NumberFormat error while creating a mapping to the system metadata identifier: " 
+                    + e.getMessage());
+        } finally {
+            // Return database connection to the pool
+            DBConnectionPool.returnDBConnection(dbConn, serialNumber);
+        }
+    }
+    
     /**
+     * Insert the system metadata fields into the db
+     * @param sm
+     */
+    public void insertAdditionalSystemMetadataFields(SystemMetadata sm)
+    {
+        insertAdditionalSystemMetadataFields(
+                sm.getDateUploaded().getTime(),
+                sm.getRightsHolder().getValue(), 
+                sm.getChecksum().getValue(), 
+                sm.getChecksum().getAlgorithm().name(), 
+                sm.getOriginMemberNode().getValue(),
+                sm.getAuthoritativeMemberNode().getValue(), 
+                sm.getDateSysMetadataModified().getTime(),
+                sm.getSubmitter().getValue(), 
+                sm.getIdentifier().getValue());
+    }
+    
+    /**
      * return a localId based on a guid.  The type can either be 'identifier' 
      * to get an id from the identifier table or 'systemmetadata' to get
      * the identifier from the systemidentifier table
@@ -653,12 +747,13 @@
             stmt.setString(1, guid);
             stmt.setString(2, docid);
             stmt.setInt(3, rev);
+            System.out.println("generic mapping query: " + stmt.toString());
             int rows = stmt.executeUpdate();
 
             stmt.close();
         } catch (SQLException e) {
             e.printStackTrace();
-            logMetacat.error("SQL error while creating a mapping to the system metadata identifier: " 
+            logMetacat.warn("SQL error while creating a mapping to the system metadata identifier: " 
                     + e.getMessage());
         } catch (NumberFormatException e) {
             e.printStackTrace();
