Index: src/edu/ucsb/nceas/metacat/dataone/v1/MNodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/v1/MNodeService.java	(revision 9031)
+++ src/edu/ucsb/nceas/metacat/dataone/v1/MNodeService.java	(revision 9032)
@@ -24,6 +24,7 @@
 package edu.ucsb.nceas.metacat.dataone.v1;
 
 import java.io.InputStream;
+import java.sql.SQLException;
 import java.util.Date;
 
 import javax.servlet.http.HttpServletRequest;
@@ -62,6 +63,8 @@
 import org.dataone.service.types.v1_1.QueryEngineList;
 import org.dataone.service.util.TypeMarshaller;
 
+import edu.ucsb.nceas.metacat.IdentifierManager;
+
 /**
  * Represents Metacat's implementation of the DataONE Member Node 
  * service API, v1. Methods typically pass through to the current 
@@ -270,6 +273,17 @@
 	@Override
 	public InputStream get(Identifier pid) throws InvalidToken, NotAuthorized,
 			NotImplemented, ServiceFailure, NotFound, InsufficientResources {
+	    boolean exists = false;
+	    try {
+	        exists = IdentifierManager.getInstance().systemMetadataPIDExists(pid);
+	    } catch (SQLException e) {
+	        throw new ServiceFailure("1030", "The object specified by "+ pid.getValue()+
+                    " couldn't be identified if it exists at this node since "+e.getMessage());
+	    }
+	    if(!exists) {
+	        //the v1 method only handles a pid.
+	        throw new NotFound("1020", "The object specified by "+pid.getValue()+" does not exist at this node");
+	    }
 		return impl.get(null, pid);
 	}
 
@@ -278,6 +292,17 @@
 	public InputStream get(Session session, Identifier pid) throws InvalidToken,
 			NotAuthorized, NotImplemented, ServiceFailure, NotFound,
 			InsufficientResources {
+	    boolean exists = false;
+        try {
+            exists = IdentifierManager.getInstance().systemMetadataPIDExists(pid);
+        } catch (SQLException e) {
+            throw new ServiceFailure("1030", "The object specified by "+ pid.getValue()+
+                    " couldn't be identified if it exists at this node since "+e.getMessage());
+        }
+        if(!exists) {
+            //the v1 method only handles a pid.
+            throw new NotFound("1020", "The object specified by "+pid.getValue()+" does not exist at this node");
+        }
 		return impl.get(session, pid);
 	}
 
Index: src/edu/ucsb/nceas/metacat/dataone/v1/CNodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/v1/CNodeService.java	(revision 9031)
+++ src/edu/ucsb/nceas/metacat/dataone/v1/CNodeService.java	(revision 9032)
@@ -24,6 +24,7 @@
 package edu.ucsb.nceas.metacat.dataone.v1;
 
 import java.io.InputStream;
+import java.sql.SQLException;
 import java.util.Date;
 
 import javax.servlet.http.HttpServletRequest;
@@ -70,6 +71,8 @@
 import org.dataone.service.types.v1_1.QueryEngineList;
 import org.dataone.service.util.TypeMarshaller;
 
+import edu.ucsb.nceas.metacat.IdentifierManager;
+
 /**
  * Represents Metacat's implementation of the DataONE Coordinating Node service
  * API. Methods implement the various CN* interfaces, and methods common to both
@@ -205,6 +208,17 @@
 	@Override
 	public InputStream get(Identifier pid) throws InvalidToken,
 			ServiceFailure, NotAuthorized, NotFound, NotImplemented {
+	    boolean exists = false;
+        try {
+            exists = IdentifierManager.getInstance().systemMetadataPIDExists(pid);
+        } catch (SQLException e) {
+            throw new ServiceFailure("1030", "The object specified by "+ pid.getValue()+
+                    " couldn't be identified if it exists at this node since "+e.getMessage());
+        }
+        if(!exists) {
+          //the v1 method only handles a pid.
+            throw new NotFound("1020", "The object specified by "+pid.getValue()+" does not exist at this node");
+        }
 		return impl.get(null, pid);
 	}
 
@@ -212,6 +226,17 @@
 	@Deprecated
 	public InputStream get(Session session, Identifier pid) throws InvalidToken,
 			ServiceFailure, NotAuthorized, NotFound, NotImplemented {
+	    boolean exists = false;
+        try {
+            exists = IdentifierManager.getInstance().systemMetadataPIDExists(pid);
+        } catch (SQLException e) {
+            throw new ServiceFailure("1030", "The object specified by "+ pid.getValue()+
+                    " couldn't be identified if it exists at this node since "+e.getMessage());
+        }
+        if(!exists) {
+          //the v1 method only handles a pid.
+            throw new NotFound("1020", "The object specified by "+pid.getValue()+" does not exist at this node");
+        }
 		return impl.get(session, pid);
 	}
 
Index: src/edu/ucsb/nceas/metacat/dataone/D1NodeService.java
===================================================================
--- src/edu/ucsb/nceas/metacat/dataone/D1NodeService.java	(revision 9031)
+++ src/edu/ucsb/nceas/metacat/dataone/D1NodeService.java	(revision 9032)
@@ -561,6 +561,23 @@
     throws InvalidToken, ServiceFailure, NotAuthorized, NotFound, 
     NotImplemented {
     
+    try {
+        //determine if the given pid is a sid or not.
+        if(IdentifierManager.getInstance().systemMetadataSIDExists(pid)) {
+            try {
+                //set the header pid for the sid if the identifier is a sid.
+                pid = IdentifierManager.getInstance().getHeadPID(pid);
+            } catch (SQLException sqle) {
+                throw new ServiceFailure("1030", "The current pid associated with the sid "+ pid.getValue()+
+                        " couldn't be identified at this node since "+sqle.getMessage());
+            }
+            
+        }
+    } catch (SQLException e) {
+        throw new ServiceFailure("1030", "The object specified by "+ pid.getValue()+
+                " couldn't be identified at this node since "+e.getMessage());
+    }
+    
     InputStream inputStream = null; // bytes to be returned
     handler = new MetacatHandler(new Timer());
     boolean allowed = false;
Index: src/edu/ucsb/nceas/metacat/IdentifierManager.java
===================================================================
--- src/edu/ucsb/nceas/metacat/IdentifierManager.java	(revision 9031)
+++ src/edu/ucsb/nceas/metacat/IdentifierManager.java	(revision 9032)
@@ -980,6 +980,20 @@
     }
     
     /**
+     * Check if the specified sid object exists on the serial id field on the system metadata table
+     * @param sid
+     * @return true if it exists; false otherwise.
+     * @throws SQLException
+     */
+    public boolean systemMetadataSIDExists(Identifier sid) throws SQLException {
+        if (sid != null && sid.getValue() != null && !sid.getValue().trim().equals("")) {
+            return systemMetadataSIDExists(sid.getValue());
+        } else {
+            return false;
+        }
+    }
+    
+    /**
      * Check if the specified sid exists on the serial id field on the system metadata table
      * @param id
      * @return true if it exists; false otherwise.
@@ -986,8 +1000,8 @@
      */
     public boolean systemMetadataSIDExists(String sid) throws SQLException {
         boolean exists = false;
+        logMetacat.debug("Check if the  sid: " + sid +" exists on the series_id field of the system metadata table.");
         if(sid != null && !sid.trim().equals("")) {
-            logMetacat.debug("Check if the  sid: " + sid +" exists on the series_id field of the system metadata table.");
             String sql = "select guid from systemMetadata where series_id = ?";
             DBConnection dbConn = null;
             int serialNumber = -1;
@@ -1016,35 +1030,50 @@
         return exists;
     }
     
+    /**
+     * Determine if the specified identifier object exists or not.
+     * @param pid - the specified identifier
+     * @return true if it is exists.
+     * @throws SQLException
+     * @throws NullPointerException
+     */
+    public boolean systemMetadataPIDExists(Identifier pid) throws SQLException {
+        if (pid != null && pid.getValue() != null && !pid.getValue().trim().equals("")) {
+            return systemMetadataPIDExists(pid.getValue());
+        } else {
+            return false;
+        }
+    }
+    
     public boolean systemMetadataPIDExists(String guid) throws SQLException {
 		logMetacat.debug("looking up system metadata for guid " + guid);
 		boolean exists = false;
 		String query = "select guid from systemmetadata where guid = ?";
-
 		DBConnection dbConn = null;
 		int serialNumber = -1;
-		try {
-			// Get a database connection from the pool
-			dbConn = DBConnectionPool.getDBConnection("IdentifierManager.systemMetadataExisits");
-			serialNumber = dbConn.getCheckOutSerialNumber();
+		if(guid != null && !guid.trim().equals("")) {
+		    try {
+	            // Get a database connection from the pool
+	            dbConn = DBConnectionPool.getDBConnection("IdentifierManager.systemMetadataExisits");
+	            serialNumber = dbConn.getCheckOutSerialNumber();
 
-			// Execute the insert statement
-			PreparedStatement stmt = dbConn.prepareStatement(query);
-			stmt.setString(1, guid);
-			ResultSet rs = stmt.executeQuery();
-			if (rs.next()) {
-				exists = true;
-			}
+	            // Execute the insert statement
+	            PreparedStatement stmt = dbConn.prepareStatement(query);
+	            stmt.setString(1, guid);
+	            ResultSet rs = stmt.executeQuery();
+	            if (rs.next()) {
+	                exists = true;
+	            }
 
-		} catch (SQLException e) {
-			logMetacat.error("Error while looking up the system metadata: "
-					+ e.getMessage());
-			throw e;
-		} finally {
-			// Return database connection to the pool
-			DBConnectionPool.returnDBConnection(dbConn, serialNumber);
+	        } catch (SQLException e) {
+	            logMetacat.error("Error while looking up the system metadata: "
+	                    + e.getMessage());
+	            throw e;
+	        } finally {
+	            // Return database connection to the pool
+	            DBConnectionPool.returnDBConnection(dbConn, serialNumber);
+	        }
 		}
-
 		return exists;
 	}
     
