diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
index 8c3fe86347dc6d6424f49831cb60eb0242b82ace..010172c0f148da2db3b445c9c19d0204089901db 100644
--- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
+++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
@@ -4,6 +4,8 @@ import java.io.*;
 import java.text.*;
 import java.util.*;
 import net.i2p.I2PAppContext;
+import net.i2p.client.naming.PetName;
+import net.i2p.client.naming.PetNameDB;
 import net.i2p.data.*;
 import net.i2p.syndie.data.*;
 import net.i2p.syndie.sml.*;
diff --git a/apps/syndie/java/src/net/i2p/syndie/User.java b/apps/syndie/java/src/net/i2p/syndie/User.java
index badb40c332497719de6bdbdf8a5d5d55eee9d61f..d11856c62cdaccfbe13d132f655c960c7c5d1e49 100644
--- a/apps/syndie/java/src/net/i2p/syndie/User.java
+++ b/apps/syndie/java/src/net/i2p/syndie/User.java
@@ -4,6 +4,7 @@ import java.io.UnsupportedEncodingException;
 import java.io.IOException;
 import java.util.*;
 import net.i2p.I2PAppContext;
+import net.i2p.client.naming.PetNameDB;
 import net.i2p.data.*;
 
 /**
diff --git a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java
index ff26a507d6164d42f3d41cd607b4416d1e41771f..ada257d2bb271b9a5bbfbcd3c025235a7fa28f99 100644
--- a/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java
+++ b/apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java
@@ -4,6 +4,7 @@ import java.io.*;
 import java.text.*;
 import java.util.*;
 import net.i2p.I2PAppContext;
+import net.i2p.client.naming.PetName;
 import net.i2p.data.*;
 import net.i2p.syndie.*;
 import net.i2p.syndie.data.*;
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java b/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java
index 5df8d080688f25cfed09c82d838922e9590232f6..f5ce3394cb12b3365a985070cec8cc8e0956e255 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/ArchiveViewerBean.java
@@ -4,6 +4,8 @@ import java.io.*;
 import java.text.*;
 import java.util.*;
 import net.i2p.I2PAppContext;
+import net.i2p.client.naming.PetName;
+import net.i2p.client.naming.PetNameDB;
 import net.i2p.data.*;
 import net.i2p.syndie.*;
 import net.i2p.syndie.data.*;
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/PostBean.java b/apps/syndie/java/src/net/i2p/syndie/web/PostBean.java
index fbc3d03587d2cd27941f86d2f417003e9a384394..a058a26f49c0bdc19e84b3b3b90437a9e3a42517 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/PostBean.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/PostBean.java
@@ -3,6 +3,7 @@ package net.i2p.syndie.web;
 import java.io.*;
 import java.util.*;
 import net.i2p.I2PAppContext;
+import net.i2p.client.naming.PetName;
 import net.i2p.syndie.*;
 import net.i2p.syndie.data.BlogURI;
 import net.i2p.syndie.sml.HTMLPreviewRenderer;
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
index 427aa4d03334538e5d220264c79d4a0df897ad1b..619b7ec29bec0e96161a0873bd285ba4564f81a3 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
@@ -5,6 +5,7 @@ import java.text.*;
 import java.util.*;
 import java.util.zip.*;
 import net.i2p.I2PAppContext;
+import net.i2p.client.naming.PetNameDB;
 import net.i2p.data.*;
 import net.i2p.util.EepGet;
 import net.i2p.util.EepGetScheduler;
diff --git a/apps/syndie/jsp/_bodyindex.jsp b/apps/syndie/jsp/_bodyindex.jsp
index d9fc9c51a2999582e1e3ea7a30a422147072fefd..fe80cd836973cd386bdbb30adb06f5896b0b6be5 100644
--- a/apps/syndie/jsp/_bodyindex.jsp
+++ b/apps/syndie/jsp/_bodyindex.jsp
@@ -1,4 +1,4 @@
-<%@page contentType="text/html; charset=UTF-8" import="net.i2p.syndie.web.ArchiveViewerBean, net.i2p.syndie.*" %>
+<%@page contentType="text/html; charset=UTF-8" import="net.i2p.syndie.web.ArchiveViewerBean, net.i2p.syndie.*, net.i2p.client.naming.PetName" %>
 <% request.setCharacterEncoding("UTF-8"); %>
 <jsp:useBean scope="session" class="net.i2p.syndie.User" id="user" /><%
 if (user.getAuthenticated() && (null != request.getParameter("action")) ) {
diff --git a/apps/syndie/jsp/addresses.jsp b/apps/syndie/jsp/addresses.jsp
index cb51fd6b803d67028566426d5294fc7101802172..c152499064f0cb60218b41daaf27fba13243e20d 100644
--- a/apps/syndie/jsp/addresses.jsp
+++ b/apps/syndie/jsp/addresses.jsp
@@ -1,4 +1,4 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.data.Base64, net.i2p.syndie.web.*, net.i2p.syndie.sml.*, net.i2p.syndie.data.*, net.i2p.syndie.*, org.mortbay.servlet.MultiPartRequest, java.util.*, java.io.*" %><%
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.data.Base64, net.i2p.syndie.web.*, net.i2p.syndie.sml.*, net.i2p.syndie.data.*, net.i2p.syndie.*, net.i2p.client.naming.PetName, net.i2p.client.naming.PetNameDB, org.mortbay.servlet.MultiPartRequest, java.util.*, java.io.*" %><%
  request.setCharacterEncoding("UTF-8"); %><jsp:useBean scope="session" class="net.i2p.syndie.User" id="user" 
 /><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
 <html>
diff --git a/apps/syndie/jsp/post.jsp b/apps/syndie/jsp/post.jsp
index 0afc1cc315d83db8ad5572353b92baf81d835dd9..a22be401fe2690afb30b419051abc2cd2dd4b9cf 100644
--- a/apps/syndie/jsp/post.jsp
+++ b/apps/syndie/jsp/post.jsp
@@ -1,4 +1,4 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.data.Base64, net.i2p.syndie.web.*, net.i2p.syndie.sml.*, net.i2p.syndie.data.*, net.i2p.syndie.*, org.mortbay.servlet.MultiPartRequest, java.util.*" %><% 
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.data.Base64, net.i2p.client.naming.PetName, net.i2p.client.naming.PetNameDB, net.i2p.syndie.web.*, net.i2p.syndie.sml.*, net.i2p.syndie.data.*, net.i2p.syndie.*, org.mortbay.servlet.MultiPartRequest, java.util.*" %><% 
 request.setCharacterEncoding("UTF-8"); 
 %><jsp:useBean scope="session" class="net.i2p.syndie.User" id="user" 
 /><jsp:useBean scope="session" class="net.i2p.syndie.web.PostBean" id="post" 
diff --git a/apps/syndie/jsp/remote.jsp b/apps/syndie/jsp/remote.jsp
index bc47b1a8f3d21aa8cb16daed93685153e13a130b..0bdf684ccc3c433263bce1be14a0f6c1a4cb7337 100644
--- a/apps/syndie/jsp/remote.jsp
+++ b/apps/syndie/jsp/remote.jsp
@@ -1,4 +1,4 @@
-<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.syndie.web.*, net.i2p.syndie.*, net.i2p.syndie.sml.*, java.util.*" %><% 
+<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="net.i2p.client.naming.PetName, net.i2p.syndie.web.*, net.i2p.syndie.*, net.i2p.syndie.sml.*, java.util.*" %><% 
 request.setCharacterEncoding("UTF-8"); 
 %><jsp:useBean scope="session" class="net.i2p.syndie.web.RemoteArchiveBean" id="remote" 
 /><jsp:useBean scope="session" class="net.i2p.syndie.User" id="user" 
diff --git a/apps/syndie/java/src/net/i2p/syndie/PetName.java b/core/java/src/net/i2p/client/naming/PetName.java
similarity index 99%
rename from apps/syndie/java/src/net/i2p/syndie/PetName.java
rename to core/java/src/net/i2p/client/naming/PetName.java
index c63d1498791242b3c8752dcded7e63f766118704..73ee4edf54e241ac66ffcf3f4af198b58b0bedec 100644
--- a/apps/syndie/java/src/net/i2p/syndie/PetName.java
+++ b/core/java/src/net/i2p/client/naming/PetName.java
@@ -1,4 +1,4 @@
-package net.i2p.syndie;
+package net.i2p.client.naming;
 
 import java.util.*;
 import net.i2p.data.DataHelper;
diff --git a/apps/syndie/java/src/net/i2p/syndie/PetNameDB.java b/core/java/src/net/i2p/client/naming/PetNameDB.java
similarity index 98%
rename from apps/syndie/java/src/net/i2p/syndie/PetNameDB.java
rename to core/java/src/net/i2p/client/naming/PetNameDB.java
index 700464924c2e950e8ffbb098940ec8532599a935..730cc4e6b44a08d74efa76043277e8b62d89a5a1 100644
--- a/apps/syndie/java/src/net/i2p/syndie/PetNameDB.java
+++ b/core/java/src/net/i2p/client/naming/PetNameDB.java
@@ -1,8 +1,9 @@
-package net.i2p.syndie;
+package net.i2p.client.naming;
 
 import java.io.*;
 import java.util.*;
 
+
 /**
  *
  */
diff --git a/core/java/src/net/i2p/client/naming/PetNameNamingService.java b/core/java/src/net/i2p/client/naming/PetNameNamingService.java
new file mode 100644
index 0000000000000000000000000000000000000000..7c197cb63adeb727c2b807623156f7f5b342ef73
--- /dev/null
+++ b/core/java/src/net/i2p/client/naming/PetNameNamingService.java
@@ -0,0 +1,65 @@
+package net.i2p.client.naming;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Properties;
+
+import net.i2p.I2PAppContext;
+import net.i2p.data.DataHelper;
+import net.i2p.data.Destination;
+
+public class PetNameNamingService extends NamingService {
+
+    private PetNameDB _petnameDb;
+    public final static String PROP_PETNAME_FILE = "i2p.petnamefile";
+    public final static String DEFAULT_PETNAME_FILE = "petnames.txt";
+    
+    public PetNameNamingService(I2PAppContext context) {
+        super(context);
+        _petnameDb = new PetNameDB();
+        String file = _context.getProperty(PROP_PETNAME_FILE, DEFAULT_PETNAME_FILE);
+
+        //If the petnamedb file doesn't exist, create it, using the 
+        //contents of hosts.txt.
+        File nameFile = new File(file);
+        if (!nameFile.exists()) {
+            Properties hosts = new Properties();
+            File hostsFile = new File("hosts.txt");
+            if (hostsFile.exists() && hostsFile.canRead()) {
+                try {
+                    DataHelper.loadProps(hosts, hostsFile);
+                } catch (IOException ioe) {
+                }
+            }
+            Iterator iter = hosts.keySet().iterator();
+            while (iter.hasNext()) {
+                String hostname = (String)iter.next();
+                PetName pn = new PetName(hostname, "i2p", "http", hosts.getProperty(hostname));
+                _petnameDb.set(hostname, pn);
+            }
+            try {
+                _petnameDb.store(file);
+            } catch (IOException ioe) {
+            }
+        }
+        
+        try {
+            _petnameDb.load(file);
+        } catch (IOException ioe) {
+        }
+    }
+
+    public Destination lookup(String hostname) {
+        PetName name = _petnameDb.get(hostname);
+        if (name != null && name.getNetwork().equals("i2p")) {
+            return lookupBase64(name.getLocation());
+        } else {
+            return lookupBase64(hostname);
+        }
+    }
+
+    public String reverseLookup(Destination dest) {
+        return _petnameDb.getNameByLocation(dest.toBase64());
+    }
+}