diff --git a/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java b/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java
new file mode 100644
index 0000000000000000000000000000000000000000..cf282f71928015d49364dc54c17accbba6b89944
--- /dev/null
+++ b/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java
@@ -0,0 +1,69 @@
+/*
+ * public domain 
+ * with no warranty of any kind, either expressed or implied.  
+ */
+package net.i2p.client.naming;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.Destination;
+
+/**
+ * Simple extension to EepGetNamingService to append what we find to hosts.txt,
+ * so we only have to do an EepGet query once.
+ *
+ * Note that there is little protection - there are a lot of validity checks in addressbook that are
+ * not included here.
+ *
+ * MUST be used from MetaNamingService, after HostsTxtNamingService.
+ * Cannot be used as the only NamingService! Be sure any naming service hosts
+ * are in hosts.txt. If this isn't after HostsTxtNamingService, you will
+ * clog up your hosts.txt with duplicate entries.
+ *
+ * Sample config to put in configadvanced.jsp (restart required):
+ *
+ * i2p.naming.impl=net.i2p.client.naming.MetaNamingService
+ * i2p.nameservicelist=net.i2p.client.naming.HostsTxtNamingService,net.i2p.client.naming.EepGetAndAddNamingService
+ * i2p.naming.eepget.list=http://stats.i2p/cgi-bin/hostquery.cgi?a=,http://i2host.i2p/cgi-bin/i2hostquery?
+ *
+ * @author zzz
+ */
+public class EepGetAndAddNamingService extends EepGetNamingService {
+
+    /** default hosts.txt filename */
+    private final static String DEFAULT_HOSTS_FILE = "hosts.txt";
+
+    public EepGetAndAddNamingService(I2PAppContext context) {
+        super(context);
+    }
+    
+    @Override
+    public Destination lookup(String hostname) {
+        Destination rv = super.lookup(hostname);
+        if (rv != null) {
+            hostname = hostname.toLowerCase();
+            // If it's long, assume it's a key.
+            if (hostname.length() < 516 && hostname.endsWith(".i2p") && ! hostname.endsWith(".b32.i2p")) {
+                File f = new File(_context.getRouterDir(), DEFAULT_HOSTS_FILE);
+                if ( (f.exists()) && (f.canWrite()) ) {
+                    synchronized(this) {
+                        FileOutputStream fos = null;
+                        try {
+                            fos = new FileOutputStream(f, true);
+                            String line = hostname + '=' + rv.toBase64() + System.getProperty("line.separator");
+                            fos.write(line.getBytes());
+                        } catch (IOException ioe) {
+                            System.err.println("Error appending: " + ioe);
+                        } finally {
+                            if (fos != null) try { fos.close(); } catch (IOException cioe) {}
+                        }
+                    }
+                }
+            }
+        }
+        return rv;
+    }
+}