diff --git a/core/java/src/net/i2p/data/DatabaseEntry.java b/core/java/src/net/i2p/data/DatabaseEntry.java
index 09fc6a50a3928205637b998a0aef0b160fa2971a..32f358879f00f9207fab800df5a3dc09911844b2 100644
--- a/core/java/src/net/i2p/data/DatabaseEntry.java
+++ b/core/java/src/net/i2p/data/DatabaseEntry.java
@@ -98,6 +98,9 @@ public abstract class DatabaseEntry extends DataStructureImpl {
 
     /**
      * Returns the raw payload data, excluding the signature, to be signed by sign().
+     *
+     * Most callers should use writeBytes() or toByteArray() instead.
+     *
      * FIXME RouterInfo throws DFE and LeaseSet returns null
      * @return null on error ???????????????????????
      */
@@ -122,13 +125,6 @@ public abstract class DatabaseEntry extends DataStructureImpl {
         return _currentRoutingKey;
     }
 
-    /**
-     * @deprecated unused
-     */
-    public void setRoutingKey(Hash key) {
-        _currentRoutingKey = key;
-    }
-
     /**
      * @throws IllegalStateException if not in RouterContext
      */
diff --git a/router/java/src/net/i2p/data/router/RouterInfo.java b/router/java/src/net/i2p/data/router/RouterInfo.java
index ef3fed9fdf3897114ce536e789c94361ee8db6b4..fdfd29136523397520f9b1b7cae8f83996b6173f 100644
--- a/router/java/src/net/i2p/data/router/RouterInfo.java
+++ b/router/java/src/net/i2p/data/router/RouterInfo.java
@@ -78,8 +78,11 @@ public class RouterInfo extends DatabaseEntry {
     private volatile boolean _hashCodeInitialized;
     /** should we cache the byte and string versions _byteified ? **/
     private boolean _shouldCache;
-    /** maybe we should check if we are floodfill? */
-    private static final boolean CACHE_ALL = SystemVersion.getMaxMemory() > 128*1024*1024l;
+    /**
+     * Maybe we should check if we are floodfill?
+     * If we do bring this back, don't do on ARM or Android
+     */
+    private static final boolean CACHE_ALL = false; // SystemVersion.getMaxMemory() > 128*1024*1024l;
 
     public static final String PROP_NETWORK_ID = "netId";
     public static final String PROP_CAPABILITIES = "caps";
@@ -308,11 +311,30 @@ public class RouterInfo extends DatabaseEntry {
      */
     protected byte[] getBytes() throws DataFormatException {
         if (_byteified != null) return _byteified;
-        if (_identity == null) throw new DataFormatException("Router identity isn't set?!");
-
-        //long before = Clock.getInstance().now();
         ByteArrayOutputStream out = new ByteArrayOutputStream(2*1024);
         try {
+            writeDataBytes(out);
+        } catch (IOException ioe) {
+            throw new DataFormatException("IO Error getting bytes", ioe);
+        }
+        byte data[] = out.toByteArray();
+        if (CACHE_ALL || _shouldCache)
+            _byteified = data;
+        return data;
+    }
+
+    /** 
+     * Write out the raw payload of the routerInfo, excluding the signature.  This
+     * caches the data in memory if possible.
+     *
+     * @throws DataFormatException if the data is somehow b0rked (missing props, etc)
+     * @throws IOException
+     * @since 0.9.24
+     */
+    private void writeDataBytes(OutputStream out) throws DataFormatException, IOException {
+        if (_identity == null) throw new DataFormatException("Missing identity");
+        if (_published < 0) throw new DataFormatException("Invalid published date: " + _published);
+
             _identity.writeBytes(out);
             // avoid thrashing objects
             //DataHelper.writeDate(out, new Date(_published));
@@ -320,9 +342,9 @@ public class RouterInfo extends DatabaseEntry {
             int sz = _addresses.size();
             if (sz <= 0 || isHidden()) {
                 // Do not send IP address to peers in hidden mode
-                DataHelper.writeLong(out, 1, 0);
+                out.write((byte) 0);
             } else {
-                DataHelper.writeLong(out, 1, sz);
+                out.write((byte) sz);
                 for (RouterAddress addr : _addresses) {
                     addr.writeBytes(out);
                 }
@@ -332,7 +354,7 @@ public class RouterInfo extends DatabaseEntry {
             //         method of trusted links, which isn't implemented in the router
             //         at the moment, and may not be later.
             int psz = _peers == null ? 0 : _peers.size();
-            DataHelper.writeLong(out, 1, psz);
+            out.write((byte) psz);
             if (psz > 0) {
                 Collection<Hash> peers = _peers;
                 if (psz > 1)
@@ -345,17 +367,6 @@ public class RouterInfo extends DatabaseEntry {
                 }
             }
             DataHelper.writeProperties(out, _options);
-        } catch (IOException ioe) {
-            throw new DataFormatException("IO Error getting bytes", ioe);
-        }
-        byte data[] = out.toByteArray();
-        //if (_log.shouldLog(Log.DEBUG)) {
-        //    long after = Clock.getInstance().now();
-        //    _log.debug("getBytes()  took " + (after - before) + "ms");
-        //}
-        if (CACHE_ALL || _shouldCache)
-            _byteified = data;
-        return data;
     }
 
     /**
@@ -487,10 +498,11 @@ public class RouterInfo extends DatabaseEntry {
 
         if (!_isValid) {
             Log log = I2PAppContext.getGlobalContext().logManager().getLog(RouterInfo.class);
-            // TODO change to warn
-            //if (log.shouldWarn()) {
-                log.error("Sig verify fail: " + toString(), new Exception("from"));
-            //}
+            if (log.shouldWarn()) {
+                log.warn("Sig verify fail: " + toString(), new Exception("from"));
+            } else {
+                log.error("RI Sig verify fail: " + _identity.getHash());
+            }
         }
     }
     
@@ -587,18 +599,9 @@ public class RouterInfo extends DatabaseEntry {
      *  This does NOT validate the signature
      */
     public void writeBytes(OutputStream out) throws DataFormatException, IOException {
-        if (_identity == null) throw new DataFormatException("Missing identity");
-        if (_published < 0) throw new DataFormatException("Invalid published date: " + _published);
         if (_signature == null) throw new DataFormatException("Signature is null");
-        //if (!isValid())
-        //    throw new DataFormatException("Data is not valid");
-        ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
-        baos.write(getBytes());
-        _signature.writeBytes(baos);
-
-        byte data[] = baos.toByteArray();
-        //_log.debug("Writing routerInfo [len=" + data.length + "]: " + toString());
-        out.write(data);
+        writeDataBytes(out);
+        _signature.writeBytes(out);
     }
     
     @Override