diff --git a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java
index 8fa729d63763dae195aa1321c2895fa8595478ce..c2275a90d7197cb98bf4ea062749ce8c50fdf15f 100644
--- a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java
+++ b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java
@@ -21,11 +21,15 @@ import net.i2p.util.Log;
 
 /**
  * Publish the local router's RouterInfo periodically
- *
+ * NOTE - this also creates and signs the RI
  */
 public class PublishLocalRouterInfoJob extends JobImpl {
     private Log _log;
     final static long PUBLISH_DELAY = 20*60*1000;
+    /** this needs to be long enough to give us time to start up,
+        but less than 20m (when we start accepting tunnels and could be a IBGW) */
+    final static long FIRST_TIME_DELAY = 8*60*1000;
+    boolean _notFirstTime;
     
     public PublishLocalRouterInfoJob(RouterContext ctx) {
         super(ctx);
@@ -67,6 +71,11 @@ public class PublishLocalRouterInfoJob extends JobImpl {
         } catch (DataFormatException dfe) {
             _log.error("Error signing the updated local router info!", dfe);
         }
-        requeue((PUBLISH_DELAY/2) + getContext().random().nextInt((int)PUBLISH_DELAY));
+        if (_notFirstTime) {
+            requeue((PUBLISH_DELAY/2) + getContext().random().nextInt((int)PUBLISH_DELAY));
+        } else {
+            requeue(FIRST_TIME_DELAY);
+            _notFirstTime = true;
+        }
     }
 }
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 bb34f8dc6bb528813463deccae634a0052435064..767e9f7c9760a08965c3b02656099c94d79a6812 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
@@ -77,7 +77,8 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         if (localRouterInfo == null) throw new IllegalArgumentException("wtf, null localRouterInfo?");
         if (_context.router().isHidden()) return; // DE-nied!
         super.publish(localRouterInfo);
-        sendStore(localRouterInfo.getIdentity().calculateHash(), localRouterInfo, null, null, PUBLISH_TIMEOUT, null);
+        if (_context.router().getUptime() > PUBLISH_JOB_DELAY)
+            sendStore(localRouterInfo.getIdentity().calculateHash(), localRouterInfo, null, null, PUBLISH_TIMEOUT, null);
     }
     
     @Override
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 be55c3da6dcd10ba2705460f39a4c6cc24076a62..6c55e1f994faed9a3f9c6beac4f2f7f268415d7c 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -127,7 +127,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     private final static long ROUTER_INFO_EXPIRATION_FLOODFILL = 60*60*1000l;
     
     private final static long EXPLORE_JOB_DELAY = 10*60*1000l;
-    private final static long PUBLISH_JOB_DELAY = 5*60*1000l;
+    /** this needs to be long enough to give us time to start up,
+        but less than 20m (when we start accepting tunnels and could be a IBGW) */
+    protected final static long PUBLISH_JOB_DELAY = 5*60*1000l;
 
     public KademliaNetworkDatabaseFacade(RouterContext context) {
         _context = context;
@@ -283,15 +285,18 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         // periodically update and resign the router's 'published date', which basically
         // serves as a version
         Job plrij = new PublishLocalRouterInfoJob(_context);
-        plrij.getTiming().setStartAfter(_context.clock().now() + PUBLISH_JOB_DELAY);
+        // do not delay this, as this creates the RI too, and we need a good local routerinfo right away
+        //plrij.getTiming().setStartAfter(_context.clock().now() + PUBLISH_JOB_DELAY);
         _context.jobQueue().addJob(plrij);
-        try {
-            publish(ri);
-        } catch (IllegalArgumentException iae) {
-            _context.router().rebuildRouterInfo(true);
-            //_log.log(Log.CRIT, "Our local router info is b0rked, clearing from scratch", iae);
-            //_context.router().rebuildNewIdentity();
-        }
+
+        // plrij calls publish() for us
+        //try {
+        //    publish(ri);
+        //} catch (IllegalArgumentException iae) {
+        //    _context.router().rebuildRouterInfo(true);
+        //    //_log.log(Log.CRIT, "Our local router info is b0rked, clearing from scratch", iae);
+        //    //_context.router().rebuildNewIdentity();
+        //}
     }
     
     protected void createHandlers() {
@@ -520,6 +525,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     }
     
     /**
+     * Stores to local db only.
+     * Overridden in FNDF to actually send to the floodfills.
      * @throws IllegalArgumentException if the local router info is invalid
      */
     public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException {