diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
index 5dc619050fae14989019de8b7e7f780ee1428b8d..11dca9e581098c8f39254c55c75a95ed473174d0 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
@@ -34,10 +34,12 @@ import net.i2p.data.Base32;
 import net.i2p.data.Base64;
 import net.i2p.data.Certificate;
 import net.i2p.data.DataHelper;
+import net.i2p.data.Destination;
 
 public class AddressBean
 {
-	private final String name, destination;
+	private final String name;
+	private final byte[] dest;
 	private Properties props;
 	/** available as of Java 6 */
 	static final boolean haveIDN;
@@ -54,14 +56,32 @@ public class AddressBean
 	}
 
 	public AddressBean(String name, String destination)
+	{
+		this(name, Base64.decode(destination));
+	}
+
+	/**
+	 * @since 0.9.66
+	 */
+	public AddressBean(String name, Destination destination)
+	{
+		this(name, destination.toByteArray());
+	}
+
+	/**
+	 * @since 0.9.66
+	 */
+	public AddressBean(String name, byte[] destination)
 	{
 		this.name = name;
-		this.destination = destination;
+		dest = destination;
+		if (dest == null || dest.length < 387)
+			throw new IllegalArgumentException();
 	}
 
 	public String getDestination() 
 	{
-		return destination;
+		return Base64.encode(dest);
 	}
 
 	/**
@@ -164,9 +184,6 @@ public class AddressBean
 	/** @since 0.8.7 */
 	public String getB32() 
 	{
-		byte[] dest = Base64.decode(destination);
-		if (dest == null)
-			return "";
 		byte[] hash = I2PAppContext.getGlobalContext().sha().calculateHash(dest).getData();
 		return Base32.encode(hash) + ".b32.i2p";
 	}
@@ -174,9 +191,6 @@ public class AddressBean
 	/** @since 0.9 */
 	public String getB64() 
 	{
-		byte[] dest = Base64.decode(destination);
-		if (dest == null)
-			return "";
 		return I2PAppContext.getGlobalContext().sha().calculateHash(dest).toBase64();
 	}
 
@@ -218,16 +232,10 @@ public class AddressBean
 	 * @since 0.8.7
 	 */
 	public String getCert() {
-		// (4 / 3) * (pubkey length + signing key length)
-		String cert = destination.substring(512);
-                if (cert.equals("AAAA"))
-			return _t("None");
-		byte[] enc = Base64.decode(cert);
-		if (enc == null)
-			// shouldn't happen
-			return "invalid";
-		int type = enc[0] & 0xff;
+		int type = dest[384] & 0xff;
 		switch (type) {
+			case Certificate.CERTIFICATE_TYPE_NULL:
+				return _t("None");
 			case Certificate.CERTIFICATE_TYPE_HASHCASH:
 				return _t("Hashcash");
 			case Certificate.CERTIFICATE_TYPE_HIDDEN:
@@ -246,18 +254,10 @@ public class AddressBean
 	 * @since 0.9.12
 	 */
 	public String getSigType() {
-		// (4 / 3) * (pubkey length + signing key length)
-		String cert = destination.substring(512);
-		if (cert.equals("AAAA"))
-			return _t("DSA 1024 bit");
-		byte[] enc = Base64.decode(cert);
-		if (enc == null)
-			// shouldn't happen
-			return "invalid";
-		int type = enc[0] & 0xff;
+		int type = dest[384] & 0xff;
 		if (type != Certificate.CERTIFICATE_TYPE_KEY)
 			return _t("DSA 1024 bit");
-		int st = ((enc[3] & 0xff) << 8) | (enc[4] & 0xff);
+		int st = ((dest[387] & 0xff) << 8) | (dest[388] & 0xff);
 		if (st == 0)
 			return _t("DSA 1024 bit");
 		SigType stype = SigType.getByCode(st);
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java b/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java
index 91c73e4ed215a21fd8ef8fcd99a584bec0c8a7a1..34a43e310466be41a061ab1b8ebc356a2b0f464a 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java
@@ -204,20 +204,14 @@ public class NamingServiceBean extends AddressbookBean
 						continue;
 					}
 				}
-				String destination = entry.getValue().toBase64();
-				if (destination != null) {
-					AddressBean bean = new AddressBean(name, destination);
-					if (sortByDate) {
-						Properties p = new Properties();
-						Destination d = service.lookup(name, searchProps, p);
-						if (d != null && !p.isEmpty())
-							bean.setProperties(p);
-					}
-					list.addLast(bean);
-				} else {
-					// delete it too?
-					System.err.println("Bad entry " + name + " in database " + service.getName());
+				AddressBean bean = new AddressBean(name, entry.getValue());
+				if (sortByDate) {
+					Properties p = new Properties();
+					Destination d = service.lookup(name, searchProps, p);
+					if (d != null && !p.isEmpty())
+						bean.setProperties(p);
 				}
+				list.addLast(bean);
 			}
 			AddressBean array[] = list.toArray(new AddressBean[list.size()]);
 			if (sortByDate) {
@@ -501,7 +495,7 @@ public class NamingServiceBean extends AddressbookBean
 		Destination dest = getNamingService().lookup(this.detail, nsOptions, outProps);
 		if (dest == null)
 			return null;
-		AddressBean rv = new AddressBean(this.detail, dest.toBase64());
+		AddressBean rv = new AddressBean(this.detail, dest);
 		rv.setProperties(outProps);
 		return rv;
 	}
@@ -527,7 +521,7 @@ public class NamingServiceBean extends AddressbookBean
 			return null;
 		List<AddressBean> rv = new ArrayList<AddressBean>(dests.size());
 		for (int i = 0; i < dests.size(); i++) {
-			AddressBean ab = new AddressBean(this.detail, dests.get(i).toBase64());
+			AddressBean ab = new AddressBean(this.detail, dests.get(i));
 			ab.setProperties(propsList.get(i));
 			rv.add(ab);
 		}