--- a/src/rcldb/rcldb.cpp
+++ b/src/rcldb/rcldb.cpp
@@ -1123,9 +1123,26 @@
 // Determining what index a doc result comes from is based on the
 // modulo of the docid against the db count. Ref:
 // http://trac.xapian.org/wiki/FAQ/MultiDatabaseDocumentID
-size_t Db::whatDbIdx(const Doc& doc)
-{
-    return m_ndb->whatDbIdx(doc.xdocid);
+bool Db::fromMainIndex(const Doc& doc)
+{
+    return m_ndb->whatDbIdx(doc.xdocid) == 0;
+}
+
+std::string Db::whatIndexForResultDoc(const Doc& doc)
+{
+    size_t idx = m_ndb->whatDbIdx(doc.xdocid);
+    if (idx == (size_t)-1) {
+        LOGERR("whatIndexForResultDoc: whatDbIdx returned -1 for " <<
+               doc.xdocid << endl);
+        return string();
+    }
+    // idx is [0..m_extraDbs.size()] 0 is for the main index, else
+    // idx-1 indexes into m_extraDbs
+    if (idx == 0) {
+        return m_basedir;
+    } else {
+        return m_extraDbs[idx-1];
+    }
 }
 
 size_t Db::Native::whatDbIdx(Xapian::docid id)
@@ -2352,18 +2369,44 @@
 //  existence should be tested by looking at doc.pc
 bool Db::getDoc(const string &udi, const Doc& idxdoc, Doc &doc)
 {
-    LOGDEB("Db:getDoc: [" << udi << "]\n");
-    if (m_ndb == 0)
-	return false;
-
+    LOGDEB1("Db:getDoc: [" << udi << "]\n");
+    int idxi = idxdoc.idxi;
+    return getDoc(udi, idxi, doc);
+}
+
+bool Db::getDoc(const string &udi, const std::string& dbdir, Doc &doc)
+{
+    LOGDEB1("Db::getDoc(udi, dbdir): (" << udi << ", " << dbdir << ")\n");
+    int idxi = -1;
+    if (dbdir.empty() || dbdir == m_basedir) {
+        idxi = 0;
+    } else {
+        for (unsigned int i = 0; i < m_extraDbs.size(); i++) {
+            if (dbdir == m_extraDbs[i]) {
+                idxi = int(i + 1);
+                break;
+            }
+        }
+    }
+    LOGDEB1("Db::getDoc(udi, dbdir): idxi: " << idxi << endl);
+    if (idxi < 0) {
+        LOGERR("Db::getDoc(udi, dbdir): dbdir not in current extra dbs\n");
+        return false;
+    }
+    return getDoc(udi, idxi, doc);
+}
+
+bool Db::getDoc(const string& udi, int idxi, Doc& doc)
+{
     // Initialize what we can in any case. If this is history, caller
     // will make partial display in case of error
+    if (m_ndb == 0)
+	return false;
     doc.meta[Rcl::Doc::keyrr] = "100%";
     doc.pc = 100;
     Xapian::Document xdoc;
     Xapian::docid docid;
-    int idxi = idxdoc.idxi;
-    if ((docid = m_ndb->getDoc(udi, idxi, xdoc))) {
+    if (idxi >= 0 && (docid = m_ndb->getDoc(udi, idxi, xdoc))) {
 	string data = xdoc.get_data();
 	doc.meta[Rcl::Doc::keyudi] = udi;
 	return m_ndb->dbDataToRclDoc(docid, data, doc);
@@ -2373,7 +2416,7 @@
 	// other ok docs further) but indicate the error with
 	// pc = -1
 	doc.pc = -1;
-	LOGINFO("Db:getDoc: no such doc in index: [" << udi << "]\n");
+	LOGINFO("Db:getDoc: no such doc in current index: [" << udi << "]\n");
 	return true;
     }
 }