diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
index 646f7985d459d8264ef315b7b36d910f4d4df791..980f3e813dee0c85c3cef6b1238655095fc18dd3 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
@@ -95,7 +95,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         // for ISJ
         _context.statManager().createRateStat("netDb.RILookupDirect", "Was an iterative RI lookup sent directly?", "NetworkDatabase", rate);
         // No need to start the FloodfillMonitorJob for client subDb.
-        if (!isMainDb())
+        if (isClientDb())
             _ffMonitor = null;
         else
             _ffMonitor = new FloodfillMonitorJob(_context, this);
@@ -107,7 +107,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         super.startup();
         if (_ffMonitor != null)
             _context.jobQueue().addJob(_ffMonitor);
-        if (!isMainDb()) {
+        if (isClientDb()) {
             isFF = false;
         } else {
             isFF = _context.getBooleanProperty(FloodfillMonitorJob.PROP_FLOODFILL_PARTICIPANT);
@@ -116,7 +116,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         }
 
         long down = _context.router().getEstimatedDowntime();
-        if (!_context.commSystem().isDummy() && isMainDb() &&
+        if (!_context.commSystem().isDummy() && !isClientDb() &&
             (down == 0 || (!isFF && down > 30*60*1000) || (isFF && down > 24*60*60*1000))) {
             // refresh old routers
             Job rrj = new RefreshRoutersJob(_context, this);
@@ -128,7 +128,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
     @Override
     protected void createHandlers() {
        // Only initialize the handlers for the flooodfill netDb.
-       if (isMainDb()) {
+       if (!isClientDb()) {
             if (_log.shouldInfo())
                 _log.info("[dbid: " + super._dbid +  "] Initializing the message handlers");
             _context.inNetMessagePool().registerHandlerJobBuilder(DatabaseLookupMessage.MESSAGE_TYPE, new FloodfillDatabaseLookupMessageHandler(_context, this));
@@ -440,13 +440,6 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         }
     }
 
-    @Override
-    protected PeerSelector createPeerSelector() { 
-        if (_peerSelector != null)
-            return _peerSelector;
-        return new FloodfillPeerSelector(_context);
-    }
-    
     /**
      *  Public, called from console. This wakes up the floodfill monitor,
      *  which will rebuild the RI and log in the event log,
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
index 44df85d41941464aef74da233a888c8dbc570299..5570d877869adec87764e88a834bacdc9b514c4f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
@@ -148,11 +148,11 @@ class FloodfillVerifyStoreJob extends JobImpl {
         }
         
         // garlic encrypt to hide contents from the OBEP
-        RouterInfo peer = _facade.lookupRouterInfoLocally(_target);
+        RouterInfo peer = ctx.netDb().lookupRouterInfoLocally(_target);
         if (peer == null) {
              if (_log.shouldLog(Log.WARN))
                  _log.warn("(JobId: " + getJobId()
-                           + "; dbid: " + _facade._dbid
+                           + "; db: " + _facade
                            + ") Fail looking up RI locally for target " + _target);
             _facade.verifyFinished(_key);
             return;
@@ -245,7 +245,7 @@ class FloodfillVerifyStoreJob extends JobImpl {
         }
 
         if (_log.shouldLog(Log.INFO))
-            _log.info("[JobId: " + getJobId() + "; dbid: " + _facade._dbid
+            _log.info("[JobId: " + getJobId() + "; db: " + _facade
                       + "]: Starting verify (stored " + _key + " to " + _sentTo + "), asking " + _target);
         _sendTime = ctx.clock().now();
         _expiration = _sendTime + VERIFY_TIMEOUT;
@@ -277,7 +277,7 @@ class FloodfillVerifyStoreJob extends JobImpl {
                 if (peers.isEmpty())
                     break;
                 Hash peer = peers.get(0);
-                RouterInfo ri = _facade.lookupRouterInfoLocally(peer);
+                RouterInfo ri = getContext().netDb().lookupRouterInfoLocally(peer);
                 //if (ri != null && StoreJob.supportsCert(ri, keyCert)) {
                 if (ri != null && StoreJob.shouldStoreTo(ri) &&
                     //(!_isLS2 || (StoreJob.shouldStoreLS2To(ri) &&
@@ -334,18 +334,7 @@ class FloodfillVerifyStoreJob extends JobImpl {
                 return _key.equals(dsm.getKey());
             } else if (type == DatabaseSearchReplyMessage.MESSAGE_TYPE) {
                 DatabaseSearchReplyMessage dsrm = (DatabaseSearchReplyMessage)message;
-                boolean rv = _key.equals(dsrm.getSearchKey());
-                if (rv) {
-                    if (_log.shouldInfo())
-                        _log.info("[JobId: " + getJobId() + "; dbid: " + _facade._dbid
-                                  + "DSRM key match successful.");
-                } else {
-                    if (_log.shouldWarn())
-                        _log.warn("[JobId: " + getJobId() + "; dbid: " + _facade._dbid
-                                  + "]: DSRM key mismatch for key " + _key
-                                  + " with DSRM: " + message);
-                }
-                return rv;
+                return _key.equals(dsrm.getSearchKey());
             }
             return false;
         }
@@ -413,21 +402,16 @@ class FloodfillVerifyStoreJob extends JobImpl {
                 // assume 0 old, all new, 0 invalid, 0 dup
                 pm.dbLookupReply(_target,  0,
                                 dsrm.getNumReplies(), 0, 0, delay);
-                // ToDo: Clarify the following log message.
-                // This message is phrased in a manner that draws attention, and indicates
-                // the possibility of a problem that may need follow-up. But examination
-                // of the code did not provide insight as to what is being verified,
-                // and what is failing. This message will be displayed unconditionally
-                // every time a DSRM is handled here.
+                // The peer we asked did not have the key, so _sentTo failed to flood it
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn(getJobId() + ": DSRM verify failed (dbid: "
-                              + _facade._dbid + ") for " + _key);
+                    _log.warn(getJobId() + ": DSRM verify failed (db: "
+                              + _facade + ") for " + _key);
                 // only for RI... LS too dangerous?
                 if (_isRouterInfo) {
                     if (_facade.isClientDb())
                         if (_log.shouldLog(Log.WARN))
-                            _log.warn("[Jobid: " + getJobId() + "; dbid: " + _facade._dbid
-                                      + "Warning! Client is starting a SingleLookupJob (DIRECT?) for RouterInfo");
+                            _log.warn("[Jobid: " + getJobId() + "; db: " + _facade
+                                      + "] Warning! Client is starting a SingleLookupJob (DIRECT?) for RouterInfo");
                     ctx.jobQueue().addJob(new SingleLookupJob(ctx, dsrm));
                 }
             }
@@ -458,12 +442,7 @@ class FloodfillVerifyStoreJob extends JobImpl {
      *  So at least we'll try THREE ffs round-robin if things continue to fail...
      */
     private void resend() {
-        // It's safe to check the default netDb first, but if the lookup is for
-        // a client, nearly all RI is expected to be found in the FF netDb.
         DatabaseEntry ds = _facade.lookupLocally(_key);
-        if ((ds == null) && _facade.isClientDb() && _isRouterInfo)
-            // It's safe to check the floodfill netDb for RI
-            ds = getContext().netDb().lookupLocally(_key);
         if (ds != null) {
             // By the time we get here, a minute or more after the store started, 
             // we may have already started a new store
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index d9e6cdc872776d08a56de7a8f48426fda9532b88..cb23c2cbb45d62c742af1e9a192ea77f82ee330c 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -178,22 +178,24 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         _dbid = dbid;
         _log = _context.logManager().getLog(getClass());
         _networkID = context.router().getNetworkID();
-        _peerSelector = createPeerSelector();
         _publishingLeaseSets = new HashMap<Hash, RepublishLeaseSetJob>(8);
         _activeRequests = new HashMap<Hash, SearchJob>(8);
-        if (!isMainDb()) {
+        if (isClientDb()) {
             _reseedChecker = null;
             _blindCache = null;
             _exploreKeys = null;
+            _erj = null;
+            _peerSelector = ((KademliaNetworkDatabaseFacade) context.netDb()).getPeerSelector();
         } else {
             _reseedChecker = new ReseedChecker(context);
             _blindCache = new BlindCache(context);
             _exploreKeys = new ConcurrentHashSet<Hash>(64);
+            // We don't have a comm system here to check for ctx.commSystem().isDummy()
+            // we'll check before starting in startup()
+            _erj = new ExpireRoutersJob(_context, this);
+            _peerSelector = createPeerSelector();
         }
         _elj = new ExpireLeasesJob(_context, this);
-        // We don't have a comm system here to check for ctx.commSystem().isDummy()
-        // we'll check before starting in startup()
-        _erj = new ExpireRoutersJob(_context, this);
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Created KademliaNetworkDatabaseFacade for id: " + dbid);
         context.statManager().createRateStat("netDb.lookupDeferred", "how many lookups are deferred?", "NetworkDatabase", new long[] { 60*60*1000 });
@@ -219,13 +221,24 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         return _initialized && _ds != null && _ds.isInitialized();
     }
 
-    protected abstract PeerSelector createPeerSelector();
+    /**
+     *  Only for main DB
+     */
+    protected PeerSelector createPeerSelector() {
+       if (isClientDb())
+           throw new IllegalStateException();
+       return new FloodfillPeerSelector(_context);
+    }
+
+    /**
+     *  @return the main DB's peer selector. Client DBs do not have their own.
+     */
     public PeerSelector getPeerSelector() { return _peerSelector; }
     
     /** @since 0.9 */
     @Override
     public ReseedChecker reseedChecker() {
-        if (!isMainDb())
+        if (isClientDb())
             return null;
         return _reseedChecker;
     }
@@ -239,11 +252,14 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      * @return
      */
     protected BlindCache blindCache() {
-        if (isMainDb())
+        if (!isClientDb())
             return _blindCache;
         return _context.netDb().blindCache();
     }
 
+    /**
+     *  @return the main DB's KBucketSet. Client DBs do not have their own.
+     */
     KBucketSet<Hash> getKBuckets() { return _kb; }
     DataStore getDataStore() { return _ds; }
     
@@ -256,20 +272,20 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
     
     /** @return unmodifiable set */
     public Set<Hash> getExploreKeys() {
-        if (!_initialized || !isMainDb())
+        if (!_initialized || isClientDb())
             return Collections.emptySet();
         return Collections.unmodifiableSet(_exploreKeys);
     }
     
     public void removeFromExploreKeys(Collection<Hash> toRemove) {
-        if (!_initialized || !isMainDb())
+        if (!_initialized || isClientDb())
             return;
         _exploreKeys.removeAll(toRemove);
         _context.statManager().addRateData("netDb.exploreKeySet", _exploreKeys.size());
     }
 
     public void queueForExploration(Collection<Hash> keys) {
-        if (!_initialized || !isMainDb())
+        if (!_initialized || isClientDb())
             return;
         for (Iterator<Hash> iter = keys.iterator(); iter.hasNext() && _exploreKeys.size() < MAX_EXPLORE_QUEUE; ) {
             _exploreKeys.add(iter.next());
@@ -281,16 +297,19 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      *  Cannot be restarted.
      */
     public synchronized void shutdown() {
+        if (_log.shouldWarn())
+            _log.warn("DB shutdown " + this);
         _initialized = false;
-        if (!_context.commSystem().isDummy() && isMainDb() &&
+        if (!_context.commSystem().isDummy() && !isClientDb() &&
             _context.router().getUptime() > ROUTER_INFO_EXPIRATION_FLOODFILL + 10*60*1000 + 60*1000) {
             // expire inline before saving RIs in _ds.stop()
             Job erj = new ExpireRoutersJob(_context, this);
             erj.runJob();
         }
         _context.jobQueue().removeJob(_elj);
-        _context.jobQueue().removeJob(_erj);
-        if (_kb != null)
+        if (_erj != null)
+            _context.jobQueue().removeJob(_erj);
+        if (_kb != null && !isClientDb())
             _kb.clear();
         if (_ds != null)
             _ds.stop();
@@ -298,7 +317,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
             _exploreKeys.clear();
         if (_negativeCache != null)
             _negativeCache.stop();
-        if (isMainDb())
+        if (!isClientDb())
             blindCache().shutdown();
     }
     
@@ -341,29 +360,18 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         return true;
     }
 
-    /**
-     * Check if the database is the main netDb. This is the one we're normally using
-     * if you're acting as a floodfill.
-     * 
-     * @return true if _dbid == FNDS.MAIN_DBID
-     * @since 0.9.60
-     */
-    protected boolean isMainDb() {
-        // This is a null check in disguise, don't use equals() here.
-        // FNDS.MAIN_DBID is always null.
-        if (_dbid == FloodfillNetworkDatabaseSegmentor.MAIN_DBID)
-            return true;
-        return false;
-    }
-
     public synchronized void startup() {
-        _log.info("Starting up the kademlia network database");
+        if (_log.shouldInfo())
+            _log.info("Starting up the " + this);
         RouterInfo ri = _context.router().getRouterInfo();
         String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR);
-        _kb = new KBucketSet<Hash>(_context, ri.getIdentity().getHash(),
+        if (isClientDb())
+            _kb = _context.netDb().getKBuckets();
+        else
+            _kb = new KBucketSet<Hash>(_context, ri.getIdentity().getHash(),
                                    BUCKET_SIZE, KAD_B, new RejectTrimmer<Hash>());
         try {
-            if (isMainDb()) {
+            if (!isClientDb()) {
                 _ds = new PersistentDataStore(_context, dbDir, this);
             } else {
                 _ds = new TransientDataStore(_context);
@@ -373,7 +381,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         }
         _dbDir = dbDir;
         _negativeCache = new NegativeLookupCache(_context);
-        if (isMainDb())
+        if (!isClientDb())
             blindCache().startup();
         
         createHandlers();
@@ -388,7 +396,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         
         //// expire some routers
         // Don't run until after RefreshRoutersJob has run, and after validate() will return invalid for old routers.
-        if (!_context.commSystem().isDummy()) {
+        if (!isClientDb() && !_context.commSystem().isDummy()) {
             boolean isFF = _context.getBooleanProperty(FloodfillMonitorJob.PROP_FLOODFILL_PARTICIPANT);
             long down = _context.router().getEstimatedDowntime();
             long delay = (down == 0 || (!isFF && down > 30*60*1000) || (isFF && down > 24*60*60*1000)) ?
@@ -399,7 +407,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         }
         
         if (!QUIET) {
-            if (isMainDb()) {
+            if (!isClientDb()) {
                 // fill the search queue with random keys in buckets that are too small
                 // Disabled since KBucketImpl.generateRandomKey() is b0rked,
                 // and anyway, we want to search for a completely random key,
@@ -421,7 +429,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
             _log.warn("Operating in quiet mode - not exploring or pushing data proactively, simply reactively");
             _log.warn("This should NOT be used in production");
         }
-        if (isMainDb()) {
+        if (!isClientDb()) {
             // periodically update and resign the router's 'published date', which basically
             // serves as a version
             Job plrij = new PublishLocalRouterInfoJob(_context);
@@ -452,6 +460,10 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      * @param peersToIgnore can be null
      */
     public Set<Hash> findNearestRouters(Hash key, int maxNumRouters, Set<Hash> peersToIgnore) {
+        if (isClientDb()) {
+            _log.warn("Subdb", new Exception("I did it"));
+            return Collections.emptySet();
+        }
         if (!_initialized) return Collections.emptySet();
         return new HashSet<Hash>(_peerSelector.selectNearest(key, maxNumRouters, peersToIgnore, _kb));
     }
@@ -476,8 +488,16 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
     }
 *****/
     
-    /** get the hashes for all known routers */
+    /**
+     *  Get the hashes for all known routers
+     *
+     *  @return empty set if this is a client DB
+     */
     public Set<Hash> getAllRouters() {
+        if (isClientDb()) {
+            _log.warn("Subdb", new Exception("I did it"));
+            return Collections.emptySet();
+        }
         if (!_initialized) return Collections.emptySet();
         Set<Map.Entry<Hash, DatabaseEntry>> entries = _ds.getMapEntries();
         Set<Hash> rv = new HashSet<Hash>(entries.size());
@@ -494,6 +514,8 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      *  both the kbuckets AND the data store, which was fine when the kbuckets held everything.
      *  But now that is probably not what you want.
      *  Just return the count in the data store.
+     *
+     *  @return 0 if this is a client DB
      */
     @Override
     public int getKnownRouters() { 
@@ -503,6 +525,10 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         _kb.getAll(count);
         return count.size();
 ****/
+        if (isClientDb()) {
+            _log.warn("Subdb", new Exception("I did it"));
+            return 0;
+        }
         if (_ds == null) return 0;
         int rv = 0;
         for (DatabaseEntry ds : _ds.getEntries()) {
@@ -816,12 +842,16 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      * However, this may still fire off a lookup if the RI is present but expired (and will return null).
      * This may result in deadlocks.
      * For true local only, use lookupLocallyWithoutValidation()
+     *
+     * @return null always for client dbs
      */
     public RouterInfo lookupRouterInfoLocally(Hash key) {
         if (!_initialized) return null;
         // Client netDb shouldn't have RI, search for RI in the floodfill netDb.
-        if (isClientDb())
-            return _context.netDb().lookupRouterInfoLocally(key);
+        if (isClientDb()) {
+            _log.warn("Subdb", new Exception("I did it"));
+            return null;
+        }
         DatabaseEntry ds = _ds.get(key);
         if (ds != null) {
             if (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) {
@@ -905,8 +935,11 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      * Stores to local db only.
      * Overridden in FNDF to actually send to the floodfills.
      * @throws IllegalArgumentException if the local router info is invalid
+     *         or if this is a client DB
      */
     public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException {
+        if (isClientDb())
+            throw new IllegalArgumentException("RI publish to client DB");
         if (!_initialized) return;
         if (_context.router().gracefulShutdownInProgress())
             return;
@@ -1342,6 +1375,8 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      */
     RouterInfo store(Hash key, RouterInfo routerInfo, boolean persist) throws IllegalArgumentException {
         if (!_initialized) return null;
+        if (isClientDb())
+            throw new IllegalArgumentException("RI store to client DB");
         
         RouterInfo rv;
         try {
@@ -1443,7 +1478,8 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         DatabaseEntry o = _ds.get(dbEntry);
         if (o == null) {
             // if we dont know the key, lets make sure it isn't a now-dead peer
-            _kb.remove(dbEntry);
+            if (_kb != null)
+                _kb.remove(dbEntry);
             _context.peerManager().removeCapabilities(dbEntry);
             return;
         }
@@ -1459,7 +1495,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         // are any updates
         if (_log.shouldLog(Log.INFO))
             _log.info("Dropping a lease: " + dbEntry);
-        if (isMainDb()) {
+        if (!isClientDb()) {
             _ds.remove(dbEntry, false);
         } else {
             // if this happens it's because we're a TransientDataStore instead,
@@ -1479,6 +1515,10 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      *  Do NOT use for leasesets.
      */
     void dropAfterLookupFailed(Hash peer) {
+        if (isClientDb()) {
+            _log.warn("Subdb", new Exception("I did it"));
+            return;
+        }
         _context.peerManager().removeCapabilities(peer);
         _negativeCache.cache(peer);
         _kb.remove(peer);
@@ -1566,9 +1606,17 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
         return leases;
     }
 
-    /** public for NetDbRenderer in routerconsole */
+    /**
+     *  Public for NetDbRenderer in routerconsole
+     *
+     *  @return empty set if this is a client DB
+     */
     @Override
     public Set<RouterInfo> getRouters() {
+        if (isClientDb()) {
+            _log.warn("Subdb", new Exception("I did it"));
+            return Collections.emptySet();
+        }
         if (!_initialized) return null;
         Set<RouterInfo> routers = new HashSet<RouterInfo>();
         for (DatabaseEntry o : getDataStore().getEntries()) {
@@ -1662,6 +1710,8 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      */
     @Override
     public void renderStatusHTML(Writer out) throws IOException {
+        if (_kb == null)
+            return;
         out.write(_kb.toString().replace("\n", "<br>\n"));
     }
 
@@ -1670,7 +1720,7 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad
      */
     @Override
     public String toString() {
-        if (isMainDb())
+        if (!isClientDb())
             return "Main NetDB";
         return "Client NetDB " + _dbid.toBase64();
     }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
index 2c5a56acfadd2c3947d04b055cc94fa056e5e0ff..686c88aad0fd657a3f845b45ef2e86fc818dadf0 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
@@ -390,10 +390,7 @@ class SearchJob extends JobImpl {
         Hash rkey = getContext().routingKeyGenerator().getRoutingKey(key);
         if (_log.shouldLog(Log.DEBUG))
             _log.debug(getJobId() + ": Current routing key for " + key + ": " + rkey);
-        if (_facade.isClientDb())
-            return getContext().netDb().getPeerSelector().selectNearestExplicit(rkey, numClosest, alreadyChecked, _facade.getKBuckets());
-        else
-            return _peerSelector.selectNearestExplicit(rkey, numClosest, alreadyChecked, _facade.getKBuckets());
+        return _peerSelector.selectNearestExplicit(rkey, numClosest, alreadyChecked, _facade.getKBuckets());
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
index 3e537fc4c9a8e31203d2159abf24f2737d7f69e8..c78ccf5597ee4824d2f06b264f4f4c57c6b8c5eb 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
@@ -89,7 +89,7 @@ abstract class StoreJob extends JobImpl {
         _onFailure = onFailure;
         _timeoutMs = timeoutMs;
         _expiration = context.clock().now() + timeoutMs;
-        _peerSelector = facade.createPeerSelector();
+        _peerSelector = facade.getPeerSelector();
         if (data.isLeaseSet()) {
             _connectChecker = null;
             _connectMask = 0;
@@ -318,18 +318,10 @@ abstract class StoreJob extends JobImpl {
 *****/
 
     private List<Hash> getClosestFloodfillRouters(Hash key, int numClosest, Set<Hash> alreadyChecked) {
-        List<Hash> rv;
         Hash rkey = getContext().routingKeyGenerator().getRoutingKey(key);
         KBucketSet<Hash> ks = _facade.getKBuckets();
         if (ks == null) return new ArrayList<Hash>();
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug(getJobId() + "(dbid: " + _facade._dbid + "): Selecting Floodfill Participants");
-        if (_facade.isClientDb()) {
-            FloodfillPeerSelector ffNetDbPS = (FloodfillPeerSelector)getContext().netDb().getPeerSelector();
-            rv = ffNetDbPS.selectFloodfillParticipants(rkey, numClosest, alreadyChecked, ks);
-        } else {
-            rv = ((FloodfillPeerSelector)_peerSelector).selectFloodfillParticipants(rkey, numClosest, alreadyChecked, ks);
-        }
+        List<Hash> rv = ((FloodfillPeerSelector)_peerSelector).selectFloodfillParticipants(rkey, numClosest, alreadyChecked, ks);
         return rv;
     }
 
diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
index d17773c55b213129b9eb38cc7e74c33862f1a8f9..9b65edf2b83ce3c94eba14ce796ac553ffb22838 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
@@ -138,11 +138,7 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver {
                             return;
                         if (!ri.isValid())
                             return;
-                        RouterInfo oldri = null;
-                        if (_client != null)
-                            oldri = _context.clientNetDb(_client).lookupRouterInfoLocally(key);
-                        else
-                            oldri = _context.netDb().lookupRouterInfoLocally(key);
+                        RouterInfo oldri = _context.netDb().lookupRouterInfoLocally(key);
                         // only update if RI is newer and non-ff
                         if (oldri != null && oldri.getPublished() < ri.getPublished() &&
                             !FloodfillNetworkDatabaseFacade.isFloodfill(ri)) {