Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java
===================================================================
--- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java	(revision 718250)
+++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GarbageCollectorTest.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.core.RepositoryImpl;
-import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 import org.slf4j.Logger;
@@ -67,9 +67,10 @@
         session.save();
         Thread.sleep(1000);
 
-        GarbageCollector gc = ((SessionImpl)session).createDataStoreGarbageCollector();
-        gc.setScanEventListener(this);
-        gc.setTestDelay(1000);
+        GarbageCollector gc = (GarbageCollector) ((JackrabbitSession) session)
+                .createDataStoreGarbageCollector();
+        gc.setMarkEventListener(this);
+        ((GarbageCollector) gc).setTestDelay(1000);
 
         LOG.debug("scanning...");
         gc.scan();
@@ -86,8 +87,9 @@
     }
 
     private void runGC(Session session, boolean all) throws RepositoryException, IOException, ItemStateException {
-        GarbageCollector gc = ((SessionImpl)session).createDataStoreGarbageCollector();
-        gc.setScanEventListener(this);
+        GarbageCollector gc = (GarbageCollector) ((JackrabbitSession) session)
+            .createDataStoreGarbageCollector();
+        gc.setMarkEventListener(this);
         gc.setTestDelay(1000);
         gc.scan();
         gc.stopScan();
Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java
===================================================================
--- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java	(revision 718250)
+++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCThread.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.data;
 
-import org.apache.jackrabbit.core.SessionImpl;
+import org.apache.jackrabbit.api.JackrabbitSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +45,8 @@
     public void run() {
 
         try {
-            GarbageCollector gc = ((SessionImpl) session).createDataStoreGarbageCollector();
+            GarbageCollector gc = (GarbageCollector) ((JackrabbitSession) session)
+                    .createDataStoreGarbageCollector();
             gc.setScanEventListener(this);
             while (!stop) {
                 LOG.debug("Scanning...");
Index: jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java
===================================================================
--- jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java	(revision 718250)
+++ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/data/GCEventListenerTest.java	(working copy)
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.data.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.data.MarkEventListener;
 import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 import org.slf4j.Logger;
@@ -34,17 +36,17 @@
  *
  * @author Thomas Mueller
  */
-public class GCEventListenerTest extends AbstractJCRTest implements ScanEventListener {
+public class GCEventListenerTest extends AbstractJCRTest implements MarkEventListener {
 
     /** logger instance */
     private static final Logger LOG = LoggerFactory.getLogger(GCEventListenerTest.class);
 
+    private static final String TEST_NODE_NAME = "testGCEventListener";
+    
     private boolean gotNullNode;
     private boolean gotNode;
     private int count;
 
-    private static final String TEST_NODE_NAME = "testGCEventListener";
-
     public void testEventListener() throws Exception {
         doTestEventListener(true);
         doTestEventListener(false);
@@ -72,14 +74,15 @@
         }
         session.save();
         SessionImpl si = (SessionImpl) session;
-        GarbageCollector gc = si.createDataStoreGarbageCollector();
-        if (gc.getDataStore() != null) {
-            gc.getDataStore().clearInUse();
+        DataStoreGarbageCollector gc = si.createDataStoreGarbageCollector();
+        DataStore ds = ((GarbageCollector) gc).getDataStore();
+        if (ds != null) {
+            ds.clearInUse();
             boolean pmScan = gc.getPersistenceManagerScan();
             gc.setPersistenceManagerScan(allowPmScan);
             gotNullNode = false;
             gotNode = false;
-            gc.setScanEventListener(this);
+            gc.setMarkEventListener(this);
             gc.scan();
             gc.stopScan();
             if (pmScan && allowPmScan) {
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java	(revision 718250)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java	(working copy)
@@ -35,6 +35,7 @@
 import org.apache.jackrabbit.api.security.principal.PrincipalManager;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.data.DataStoreGarbageCollector;
 import org.apache.jackrabbit.api.jsr283.security.AccessControlManager;
 import org.apache.jackrabbit.api.jsr283.retention.RetentionManager;
 import org.apache.jackrabbit.core.security.authentication.AuthContext;
@@ -625,10 +637,9 @@
     /**
      * Create a data store garbage collector for this repository.
      *
-     * @throws ItemStateException
      * @throws RepositoryException
      */
-    public GarbageCollector createDataStoreGarbageCollector() throws RepositoryException, ItemStateException {
+    public DataStoreGarbageCollector createDataStoreGarbageCollector() throws RepositoryException {
         ArrayList pmList = new ArrayList();
         VersionManagerImpl vm = (VersionManagerImpl) rep.getVersionManager();
         PersistenceManager pm = vm.getPersistenceManager();
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java	(revision 718250)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/GarbageCollector.java	(working copy)
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core.data;
 
+import org.apache.jackrabbit.api.data.DataStoreGarbageCollector;
+import org.apache.jackrabbit.api.data.MarkEventListener;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
 import org.apache.jackrabbit.core.RepositoryImpl;
@@ -60,15 +62,15 @@
  * <p>
  * Example code to run the data store garbage collection:
  * <pre>
- * GarbageCollector gc = ((SessionImpl)session).createDataStoreGarbageCollector();
+ * DataStoreGarbageCollector gc = ((JackrabbitSessionImpl)session).createDataStoreGarbageCollector();
  * gc.scan();
  * gc.stopScan();
  * gc.deleteUnused();
  * </pre>
  */
-public class GarbageCollector {
+public class GarbageCollector implements DataStoreGarbageCollector {
 
-    private ScanEventListener callback;
+    private MarkEventListener callback;
 
     private int sleepBetweenNodes;
 
@@ -122,6 +124,17 @@
     public void setTestDelay(int testDelay) {
         this.testDelay = testDelay;
     }
+    
+    /**
+     * Set the event listener. If set, the event listener will be called
+     * for each item that is scanned. This mechanism can be used
+     * to display the progress.
+     *
+     * @param callback if set, this is called while scanning
+     */
+    public void setScanEventListener(ScanEventListener callback) {
+        setMarkEventListener(callback);
+    }    
 
     /**
      * Set the event listener. If set, the event listener will be called
@@ -130,7 +143,7 @@
      *
      * @param callback if set, this is called while scanning
      */
-    public void setScanEventListener(ScanEventListener callback) {
+    public void setMarkEventListener(MarkEventListener callback) {
         this.callback = callback;
     }
 
@@ -145,20 +158,24 @@
      * @throws IOException
      * @throws ItemStateException
      */
-    public void scan() throws RepositoryException,
-            IllegalStateException, IOException, ItemStateException {
+    public void scan() throws RepositoryException {
         long now = System.currentTimeMillis();
         if (startScanTimestamp == 0) {
             startScanTimestamp = now;
             store.updateModifiedDateOnAccess(startScanTimestamp);
         }
-
-        if (pmList == null || !persistenceManagerScan) {
-            for (int i = 0; i < sessionList.length; i++) {
-                scanNodes(sessionList[i]);
+        try {
+            if (pmList == null || !persistenceManagerScan) {
+                for (int i = 0; i < sessionList.length; i++) {
+                    scanNodes(sessionList[i]);
+                }
+            } else {
+                scanPersistenceManagers();
             }
-        } else {
-            scanPersistenceManagers();
+        } catch (IOException e) {
+            throw new DataStoreException("Garbage collection scan failed", e);
+        } catch (ItemStateException e) {
+            throw new DataStoreException("Garbage collection scan failed", e);
         }
     }
 
@@ -230,6 +247,9 @@
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public void stopScan() throws RepositoryException {
         checkScanStarted();
         for (int i = 0; i < listeners.size(); i++) {
@@ -243,6 +263,9 @@
         listeners.clear();
     }
 
+    /**
+     * {@inheritDoc}
+     */
     public int deleteUnused() throws RepositoryException {
         checkScanStarted();
         checkScanStopped();
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java	(revision 718632)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java	(working copy)
@@ -592,7 +592,7 @@
         } catch (IOException e) {
             String msg = "Configuration error: Could not read properties '" + databaseType + ".properties'";
             log.debug(msg);
-            throw new DataStoreException(msg);
+            throw new DataStoreException(msg, e);
         }
         if (driver == null) {
             driver = getProperty(prop, "driver", driver);
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java	(revision 718250)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/ScanEventListener.java	(working copy)
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.core.data;
 
-import java.util.EventListener;
+import org.apache.jackrabbit.api.data.MarkEventListener;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -24,7 +24,7 @@
 /**
  * The listener interface for receiving garbage collection scan events.
  */
-public interface ScanEventListener extends EventListener {
+public interface ScanEventListener extends MarkEventListener {
 
     /**
      * This method is called before a node is scanned.
