Index: /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/collection/OAICollection.java
===================================================================
--- /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/collection/OAICollection.java	(revision 31911)
+++ /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/collection/OAICollection.java	(revision 31912)
@@ -150,4 +150,17 @@
 	  // pass the xml node to the service for configuration
 	  if (this.oai_service_rack.configure(oai_service_xml, extra_info)) {
+
+	      // once we've configured the OAIPMH service, we can use the OAIPMH service to
+	      // retrieve the earliest timestamp of the collection from the oai-inf db and
+	      // overwrite Collection.earliestDatestamp with it.
+	      long earliestTimestamp = this.oai_service_rack.getEarliestTimestamp();
+	      if(earliestTimestamp == -1) {
+		  //this.earliestDatestamp = -1;
+		  logger.warn("No OAI timestamp for collection " + this.cluster_name
+			      + ". Falling back to using its earliestDatestamp from build config: " + this.earliestDatestamp);
+	      } else {
+		  this.earliestDatestamp = earliestTimestamp; // milliseconds
+	      }
+	      
 	    
 	    // find out the supported service types for this service module
Index: /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/OAIReceptionist.java
===================================================================
--- /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/OAIReceptionist.java	(revision 31911)
+++ /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/OAIReceptionist.java	(revision 31912)
@@ -239,5 +239,5 @@
     // send to MR
     msg_node = mr.process(message);
-    logger.info("*** " + XMLConverter.getPrettyString(msg_node));
+    //logger.info("*** " + XMLConverter.getPrettyString(msg_node));
     NodeList response_list =  ((Element)msg_node).getElementsByTagName(GSXML.RESPONSE_ELEM);
     for (int c=0; c<response_list.getLength(); c++) {
Index: /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/OAIPMH.java
===================================================================
--- /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/OAIPMH.java	(revision 31911)
+++ /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/OAIPMH.java	(revision 31912)
@@ -233,4 +233,25 @@
   }
 
+    /**
+     * @return the associated OAICollection's OAI_EARLIEST_TIMESTAMP_OID record's 
+     * OAI_INF_TIMESTAMP field from the collection's oai-inf.db IN MILLISECONDS
+     */
+    public long getEarliestTimestamp() {
+	long timestamp = -1;
+	
+	DBInfo oai_info = null;
+	if(oaiinf_db != null) {
+	    // get internal record containing the earliest timestamp of the collection
+	    oai_info = this.oaiinf_db.getInfo(OAIXML.OAI_EARLIEST_TIMESTAMP_OID);
+	    if (oai_info == null) {
+		logger.warn("Can't get collection " + this.cluster_name + "'s earliest timestamp from oai-inf db. No entry for 'OID' " + OAIXML.OAI_EARLIEST_TIMESTAMP_OID + " in the db.");		
+	    } else {
+		timestamp = Long.parseLong(oai_info.getInfo(OAIXML.OAI_INF_TIMESTAMP)) * 1000; // stored in seconds, so x1000 to  convert to milliseconds
+		//logger.info("@@@ found earliest OAI timestamp for collection " + this.coll_name + ": " + timestamp + " (ms)");
+	    }
+	}
+	return timestamp;
+    }
+    
   protected Element findNamedMetadataFormat(Element list_meta_formats, String prefix) {
     NodeList formats = list_meta_formats.getElementsByTagName(OAIXML.METADATA_FORMAT);
Index: /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/OAIResumptionToken.java
===================================================================
--- /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/OAIResumptionToken.java	(revision 31911)
+++ /main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/OAIResumptionToken.java	(revision 31912)
@@ -161,5 +161,5 @@
     if (token.indexOf(":") != -1) {
       token = token.substring(0, token.indexOf(":"));
-      logger.error("looking up "+token);
+      logger.info("looking up "+token);
     }
     if (stored_tokens.containsKey(token)) {
@@ -174,9 +174,9 @@
     if (token.indexOf(":") != -1) {
       base_name = token.substring(0, token.indexOf(":"));
-      logger.error("getting data for "+base_name);
+      logger.info("getting data for "+base_name);
     }
     HashMap<String, String> data = new HashMap<String, String>(stored_tokens.get(base_name));
     if (data == null) { 
-      logger.error("data was null!!");
+      logger.warn("data was null!!");
       return null;
     }
@@ -211,5 +211,5 @@
     Iterator<Map.Entry<String,Long>> i = token_set.iterator();
     int size = expiration_data.size();
-    logger.error("start tokens "+size);
+    logger.info("start tokens "+size);
     Long time_now = System.currentTimeMillis();
     while (i.hasNext()==true) {
@@ -218,5 +218,5 @@
       Long exp = entry.getValue();
       if (exp < time_now) {
-	logger.error("token "+key+" is expired, "+ OAIXML.getTime(exp));
+	logger.info("token "+key+" is expired, "+ OAIXML.getTime(exp));
 	i.remove();
 	// also remove the token from the stored tokens
@@ -225,5 +225,5 @@
     }
     size = expiration_data.size();
-    logger.error("end tokens "+size);
+    logger.info("end tokens "+size);
   }
 
@@ -242,5 +242,5 @@
       }
     } catch (Exception e) {
-      logger.error("couldn't find or ResumptionToken.xml "+e.getMessage());
+      logger.error("couldn't find or work with ResumptionToken.xml "+e.getMessage());
     }
     // if we have got here, have't managed to load file via class loader -
@@ -287,5 +287,5 @@
     clearExpiredTokens();
     if (resumption_token_file == null) {
-      logger.error("no available resumption token file, not storing tokens");
+      logger.warn("no available resumption token file, not storing tokens");
       return false;
     }
