diff --git a/core/java/src/net/i2p/util/LookaheadInputStream.java b/core/java/src/net/i2p/util/LookaheadInputStream.java
index ed698eb3acaac234aa3fa64ea1b2d31071f80b0c..67d48e87ad81dad3f4427eba09776c7f2a61c31e 100644
--- a/core/java/src/net/i2p/util/LookaheadInputStream.java
+++ b/core/java/src/net/i2p/util/LookaheadInputStream.java
@@ -44,7 +44,7 @@ public class LookaheadInputStream extends FilterInputStream {
         Arrays.fill(_footerLookahead, (byte)0x00);
         int footerRead = 0;
         while (footerRead < _footerLookahead.length) {
-            int read = in.read(_footerLookahead);
+            int read = in.read(_footerLookahead, footerRead, _footerLookahead.length - footerRead);
             if (read == -1) throw new IOException("EOF reading the footer lookahead");
             footerRead += read;
         }
diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java
index 1368a1619821f88a9896fbbac4699e0a7c9c2bb1..2e58d61638dc6246f86ec81f38977dbc7fde0b35 100644
--- a/core/java/src/net/i2p/util/SSLEepGet.java
+++ b/core/java/src/net/i2p/util/SSLEepGet.java
@@ -90,6 +90,8 @@ public class SSLEepGet extends EepGet {
     /** may be null if init failed */
     private SavingTrustManager _stm;
 
+    private static final boolean _isAndroid = System.getProperty("java.vendor").contains("Android");
+
     /**
      *  A new SSLEepGet with a new SSLState
      */
@@ -192,12 +194,23 @@ public class SSLEepGet extends EepGet {
         String override = System.getProperty("javax.net.ssl.keyStore");
         if (override != null)
             success = loadCerts(new File(override), ks);
-        if (!success)
-            success = loadCerts(new File(System.getProperty("java.home"), "lib/security/jssecacerts"), ks);
-        if (!success)
-            success = loadCerts(new File(System.getProperty("java.home"), "lib/security/cacerts"), ks);
+        if (!success) {
+            if (_isAndroid) {
+                // thru API 13. As of API 14 (ICS), the file is gone, but
+                // ks.load(null, pw) will bring in the default certs?
+                success = loadCerts(new File(System.getProperty("java.home"), "etc/security/cacerts.bks"), ks);
+            } else {
+                success = loadCerts(new File(System.getProperty("java.home"), "lib/security/jssecacerts"), ks);
+                if (!success)
+                    success = loadCerts(new File(System.getProperty("java.home"), "lib/security/cacerts"), ks);
+            }
+        }
 
         if (!success) {
+            try {
+                // must be initted
+                ks.load(null, "changeit".toCharArray());
+            } catch (Exception e) {}
             _log.error("All key store loads failed, will only load local certificates");
         } else if (_log.shouldLog(Log.INFO)) {
             int count = 0;
diff --git a/history.txt b/history.txt
index aef9af3e6f79cc60d434a743887465aee74af82c..63cc8abfbe3912d539db9b8b312876b4fd96e40e 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,8 @@
+2012-07-24 zzz
+ * LookaheadInputStream: Fix bug causing gunzip fails, esp. on Android
+ * Router: Don't create router.ping file on Android
+ * SSLEepGet: Fix on Android (ticket #668)
+
 2012-07-21 zzz
  * i2psnark: Remove dark theme
  * Reseed: Add new cert for cowpuncher
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index d97c5737b14a9ae833ec5383d6d0bac4b7ed243f..399d9fb48216e874be87cd56f79043ddc0baad1c 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -255,7 +255,8 @@ public class Router implements RouterClock.ClockShiftListener {
         // *********  Start no threads before here ********* //
         //
         // NOW we can start the ping file thread.
-        beginMarkingLiveliness();
+        if (!System.getProperty("java.vendor").contains("Android"))
+            beginMarkingLiveliness();
 
         // Apps may use this as an easy way to determine if they are in the router JVM
         // But context.isRouterContext() is even easier...
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 33006bcb1fcf7b29de80bcff65c8bd526b224fb9..285b64c36d6c8c56d27bc442c464c5057a7ccb8e 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 27;
+    public final static long BUILD = 28;
 
     /** for example "-test" */
     public final static String EXTRA = "-rc";