Index: src/test/java/org/apache/jackrabbit/core/ConcurrentImportTest.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/ConcurrentImportTest.java	(revision 1179117)
+++ src/test/java/org/apache/jackrabbit/core/ConcurrentImportTest.java	(working copy)
@@ -27,7 +27,9 @@
 import javax.jcr.Session;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.core.persistence.ConsistencyChecker.Report;
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.test.NotExecutableException;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -51,9 +53,14 @@
      * performed by the threads.
      */
     private static final int NUM_NODES = 10;
-
+    
     public void testConcurrentImport() throws RepositoryException {
-        concurrentImport(new String[]{JcrConstants.MIX_REFERENCEABLE}, false);
+        try {
+            concurrentImport(new String[]{JcrConstants.MIX_REFERENCEABLE}, false);
+        }
+        finally {
+            checkConsistency();
+        }
     }
 
     public void testConcurrentImportSynced() throws RepositoryException {
@@ -206,4 +213,13 @@
 
     }
 
-}
\ No newline at end of file
+    private void checkConsistency() throws RepositoryException {
+        try {
+            Report rep = TestHelper.checkConsistency(testRootNode.getSession());
+            assertNotNull(rep);
+            assertEquals(0, rep.getItems().size());
+        } catch (NotExecutableException ex) {
+            // ignore
+        }
+    }
+}
Index: src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java	(revision 1179117)
+++ src/test/java/org/apache/jackrabbit/core/persistence/AutoFixCorruptNode.java	(working copy)
@@ -21,15 +21,20 @@
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.util.UUID;
+
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
+
 import junit.framework.TestCase;
+
 import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.core.TestHelper;
 import org.apache.jackrabbit.core.TransientRepository;
+import org.apache.jackrabbit.core.persistence.ConsistencyChecker.Report;
 
 /**
  * Tests that a corrupt node is automatically fixed.
@@ -46,6 +51,51 @@
         setUp();
     }
 
+    /**
+     * Unit test for <a
+     * href="https://issues.apache.org/jira/browse/JCR-3069">JCR-3069</a>
+     */
+    public void testAutoFixWithConsistencyCheck() throws Exception {
+
+        // new repository
+        TransientRepository rep = new TransientRepository(new File(TEST_DIR));
+        Session s = openSession(rep, false);
+        Node root = s.getRootNode();
+
+        // add nodes /test and /test/missing
+        Node test = root.addNode("test");
+        Node missing = test.addNode("missing");
+        missing.addMixin("mix:referenceable");
+        UUID id = UUID.fromString(missing.getIdentifier());
+        s.save();
+        s.logout();
+
+        // remove the bundle for /test/missing directly in the database
+        Connection conn = DriverManager.getConnection("jdbc:derby:" + TEST_DIR
+                + "/workspaces/default/db");
+        PreparedStatement prep = conn
+                .prepareStatement("delete from DEFAULT_BUNDLE  where NODE_ID_HI=? and NODE_ID_LO=?");
+        prep.setLong(1, id.getMostSignificantBits());
+        prep.setLong(2, id.getLeastSignificantBits());
+        prep.executeUpdate();
+        conn.close();
+
+        s = openSession(rep, false);
+        try {
+            Report r = TestHelper.checkConsistency(s);
+            assertNotNull(r);
+            assertNotNull(r.getItems());
+            assertEquals(1, r.getItems().size());
+            assertEquals(id.toString(), r.getItems().iterator().next()
+                    .getNodeId());
+        } finally {
+            s.logout();
+            rep.shutdown();
+            FileUtils.deleteDirectory(new File("repository"));
+        }
+
+    }
+
     public void testAutoFix() throws Exception {
 
         // new repository
@@ -62,10 +112,10 @@
         s.logout();
 
         // remove the bundle for /test/missing directly in the database
-        Connection conn = DriverManager.getConnection(
-                "jdbc:derby:"+TEST_DIR+"/workspaces/default/db");
-        PreparedStatement prep = conn.prepareStatement(
-                "delete from DEFAULT_BUNDLE  where NODE_ID_HI=? and NODE_ID_LO=?");
+        Connection conn = DriverManager.getConnection("jdbc:derby:" + TEST_DIR
+                + "/workspaces/default/db");
+        PreparedStatement prep = conn
+                .prepareStatement("delete from DEFAULT_BUNDLE  where NODE_ID_HI=? and NODE_ID_LO=?");
         prep.setLong(1, id.getMostSignificantBits());
         prep.setLong(2, id.getLeastSignificantBits());
         prep.executeUpdate();
@@ -108,10 +158,13 @@
 
     }
 
-    private Session openSession(Repository rep, boolean autoFix) throws RepositoryException {
-        SimpleCredentials cred = new SimpleCredentials("admin", "admin".toCharArray());
+    private Session openSession(Repository rep, boolean autoFix)
+            throws RepositoryException {
+        SimpleCredentials cred = new SimpleCredentials("admin",
+                "admin".toCharArray());
         if (autoFix) {
-            cred.setAttribute("org.apache.jackrabbit.autoFixCorruptions", "true");
+            cred.setAttribute("org.apache.jackrabbit.autoFixCorruptions",
+                    "true");
         }
         return rep.login(cred);
     }
Index: src/test/java/org/apache/jackrabbit/core/TestHelper.java
===================================================================
--- src/test/java/org/apache/jackrabbit/core/TestHelper.java	(revision 1179117)
+++ src/test/java/org/apache/jackrabbit/core/TestHelper.java	(working copy)
@@ -16,7 +16,14 @@
  */
 package org.apache.jackrabbit.core;
 
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.jackrabbit.core.persistence.ConsistencyChecker;
+import org.apache.jackrabbit.core.persistence.ConsistencyChecker.Report;
+import org.apache.jackrabbit.core.persistence.PersistenceManager;
+import org.apache.jackrabbit.test.NotExecutableException;
 
 /**
  * <code>TestHelper</code> provides test utility methods.
@@ -35,4 +42,39 @@
             throws RepositoryException {
         repo.getWorkspaceInfo(name).dispose();
     }
+
+    /**
+     * Runs a consistency check on the given workspace.
+     *
+     * @param name the name of the workspace to perform the consistency check.
+     * @param repo the repository instance.
+     * @throws RepositoryException if an error occurs while getting the
+     * workspace with the given name.
+     */
+    public static ConsistencyChecker.Report checkConsistency(String name,
+            RepositoryImpl repo) throws NotExecutableException,
+            RepositoryException {
+        RepositoryImpl.WorkspaceInfo wspInfo = repo.getWorkspaceInfo(name);
+        PersistenceManager pm = wspInfo.getPersistenceManager();
+        if (!(pm instanceof ConsistencyChecker)) {
+            throw new NotExecutableException();
+        } else {
+            return ((ConsistencyChecker) pm).check(null, true, false);
+        }
+    }
+    
+    public static Report checkConsistency(Session s)
+            throws NotExecutableException, RepositoryException {
+        Repository r = s.getRepository();
+        if (r instanceof RepositoryImpl) {
+            RepositoryImpl ri = (RepositoryImpl) r;
+            ConsistencyChecker.Report rep = TestHelper.checkConsistency(s
+                    .getWorkspace().getName(), ri);
+            System.err.println(rep.getNodes() + " nodes checked in "
+                    + rep.getElapsedTime() + "ms");
+            return rep;
+        }
+        // or throw new NotExecutableException();
+        return null;
+    }
 }
