diff --git a/apps/susidns/readme.txt b/apps/susidns/readme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe8de7107b7ea5cb3555540cdd1112c13562160e
--- /dev/null
+++ b/apps/susidns/readme.txt
@@ -0,0 +1,4 @@
+The src/ dir contains susidns 0.13 retrieved from http://susi.i2p/ on 2005/09/15
+The contents are released under GPL.  Please see http://susi.i2p/ for more info
+The paths in the src/build.xml were updated to reference jars in the i2p
+source tree.
diff --git a/apps/susidns/src/WEB-INF/lib/jstl.jar b/apps/susidns/src/WEB-INF/lib/jstl.jar
new file mode 100644
index 0000000000000000000000000000000000000000..893b4dd1dc99f6f23502f645b36fb5c9e6a39382
Binary files /dev/null and b/apps/susidns/src/WEB-INF/lib/jstl.jar differ
diff --git a/apps/susidns/src/WEB-INF/lib/standard.jar b/apps/susidns/src/WEB-INF/lib/standard.jar
new file mode 100644
index 0000000000000000000000000000000000000000..e84c1a23ca74575bca6e8ee5171c68727e906d06
Binary files /dev/null and b/apps/susidns/src/WEB-INF/lib/standard.jar differ
diff --git a/apps/susidns/src/WEB-INF/web-template.xml b/apps/susidns/src/WEB-INF/web-template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94ba90174afd16a7adb780f3a871a3acea34b177
--- /dev/null
+++ b/apps/susidns/src/WEB-INF/web-template.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app
+    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
+    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
+<web-app>
+  <display-name>susidns</display-name>
+    <!-- precompiled servlets -->
+    <session-config>
+        <session-timeout>
+            30
+        </session-timeout>
+    </session-config>
+    <welcome-file-list>
+        <welcome-file>index.html</welcome-file>
+        <welcome-file>index.jsp</welcome-file>
+    </welcome-file-list>
+</web-app>
\ No newline at end of file
diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d2df7cc08b27d464c8aa221004c5331057df8b31
--- /dev/null
+++ b/apps/susidns/src/build.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="susidns" default="all" basedir=".">
+	<property name="jetty" value="../../jetty/" />
+	<property name="project" value="susidns" />
+	<property name="src" value="java/src" />
+	<property name="bin" value="./WEB-INF/classes" />
+	<property name="lib" value="${jetty}/jettylib" />
+	<property name="tmp" value="./tmp" />
+	<property name="jsp" value="./jsp" />
+	<path id="cp">
+		<pathelement path="${classpath}" />
+		<pathelement location="${bin}" />
+		<pathelement location="${lib}/javax.servlet.jar"/>
+		<pathelement location="${lib}/org.mortbay.jetty.jar"/>
+        <pathelement location="WEB-INF/lib/jstl.jar" />
+        <pathelement location="WEB-INF/lib/standard.jar" />
+        <pathelement location="${lib}/jasper-compiler.jar" />
+        <pathelement location="${lib}/jasper-runtime.jar" />
+        <pathelement location="${lib}/javax.servlet.jar" />
+        <pathelement location="${lib}/commons-logging.jar" />
+        <pathelement location="${lib}/commons-el.jar" />
+        <pathelement location="${lib}/ant.jar" />
+        <pathelement location="../../../core/java/build/i2p.jar" />
+ 	</path>
+ 	<target name="compile">
+		<mkdir dir="${bin}" />
+		<javac debug="true" deprecation="on" source="1.3" target="1.3"
+ 			classpathref="cp" destdir="${bin}" srcdir="${src}" includes="**/*.java" />
+	</target>
+    <target name="precompilejsp">
+        <delete file="WEB-INF/web-fragment.xml" />
+        <delete file="WEB-INF/web-out.xml" />
+    	<mkdir dir="${tmp}" />
+        <java classname="org.apache.jasper.JspC" fork="true" classpathref="cp">
+            <arg value="-d" />
+            <arg value="WEB-INF/classes" />
+            <arg value="-v" />
+            <arg value="-p" />
+            <arg value="i2p.susi.dns.jsp" />
+            <arg value="-webinc" />
+            <arg value="WEB-INF/web-fragment.xml" />
+            <arg value="-webapp" />
+            <arg value="./jsp" />
+        </java>
+        <javac debug="true" deprecation="on" source="1.3" target="1.3" 
+               destdir="${bin}" srcdir="./WEB-INF/classes" includes="**/*.java" classpathref="cp">
+         </javac>
+        <copy file="WEB-INF/web-template.xml" tofile="WEB-INF/web-out.xml" />
+        <loadfile property="jspc.web.fragment" srcfile="WEB-INF/web-fragment.xml" />
+        <replace file="WEB-INF//web-out.xml">
+            <replacefilter token="&lt;!-- precompiled servlets --&gt;" value="${jspc.web.fragment}" />
+        </replace>
+    </target>
+    <target name="all" depends="compile,precompilejsp,war"/> 
+    <target name="war"> 
+        <war destfile="${project}.war" webxml="WEB-INF/web-out.xml">
+        	<fileset dir=".">
+        		<include name="WEB-INF/**/*.class"/>
+        		<include name="WEB-INF/lib/*.jar"/>
+        		<include name="${src}/**/*.java"/>
+        		<include name="jsp/*.jsp"/>
+        		<include name="images/*.png"/>
+        		<include name="css.css"/>
+        		<include name="index.html"/>
+        		<include name="build.xml"/>
+        		<include name="WEB-INF/web-template.xml"/>
+        		<include name="WEB-INF/web-out.xml"/>
+        		<include name="WEB-INF/classes/${project}.properties"/>
+        	</fileset>
+        </war>
+    </target>
+    <target name="clean">
+      <delete file="susidns.war" />
+      <delete>
+        <fileset dir="." includes="**/*.class" />
+        <fileset dir="." includes="tmp" />
+      </delete>
+    </target>
+    <target name="distclean" depends="clean" />
+</project>
diff --git a/apps/susidns/src/css.css b/apps/susidns/src/css.css
new file mode 100644
index 0000000000000000000000000000000000000000..74f0b6605273e48ae01bcc24370f251091bfd4b6
--- /dev/null
+++ b/apps/susidns/src/css.css
@@ -0,0 +1,94 @@
+p {
+	font-family:Verdana,Tahoma,Arial,Helvetica;
+	color:black;
+	line-height:12pt;
+	margin-left:5mm;
+	margin-right:5mm;
+	font-size:10pt;
+}
+
+span.addrhlpr {
+	font-size:7pt;
+}
+	
+h3 {
+	font-family:Verdana,Tahoma,Arial,Helvetica;
+	color:black;
+	font-size:12pt;
+	letter-spacing:2pt;
+	line-height:18pt;
+	font-weight:bold;
+}
+
+body {
+	background-color: white;
+	color:black;
+}
+
+a {
+	color:#327BBF;
+	text-decoration:none;
+}
+
+a:hover {
+	text-decoration:underline;
+}
+
+th {
+	font-family:Verdana,Tahoma,Arial,Helvetica;
+	color:black;
+	line-height:12pt;
+	margin-left:5mm;
+	margin-right:5mm;
+	font-size:10pt;
+}
+
+td {
+	font-family:Verdana,Tahoma,Arial,Helvetica;
+	color:black;
+	line-height:12pt;
+	margin-left:5mm;
+	margin-right:5mm;
+	font-size:10pt;
+	vertical-align:center;
+}
+
+li {
+	font-family:Verdana,Tahoma,Arial,Helvetica;
+	color:black;
+	line-height:12pt;
+	margin-left:5mm;
+	margin-right:5mm;
+	font-size:10pt;
+}
+
+tr.list1 {
+	background-color:#E0E0E0;
+}
+
+tr.list0 {
+	background-color:white;
+}
+
+p.messages {
+	background-color:#92CAFF;
+	color:#327BBF;
+	color:black;
+	border-style:dotted;
+	padding-top: 5mm;
+	padding-right: 5mm;
+	padding-bottom: 5mm;
+	padding-left: 5mm;
+}
+
+#help {
+	border-style:dotted;
+	padding-top: 5mm;
+	padding-right: 5mm;
+	padding-bottom: 5mm;
+	padding-left: 5mm;
+}
+
+p.footer {
+	font-size:7pt;
+}
\ No newline at end of file
diff --git a/apps/susidns/src/images/add.png b/apps/susidns/src/images/add.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ea13225a551f454a71f088df341f880bbacf2e4
Binary files /dev/null and b/apps/susidns/src/images/add.png differ
diff --git a/apps/susidns/src/images/delete.png b/apps/susidns/src/images/delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..736eaf24676b37173e09a874309258ff32194d33
Binary files /dev/null and b/apps/susidns/src/images/delete.png differ
diff --git a/apps/susidns/src/images/how.png b/apps/susidns/src/images/how.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d1e26192b6e0005b5e94c35a712faf98fc68084
Binary files /dev/null and b/apps/susidns/src/images/how.png differ
diff --git a/apps/susidns/src/images/logo.png b/apps/susidns/src/images/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cf9954786c84fe0d218c0e6a6361d7ea07673e9
Binary files /dev/null and b/apps/susidns/src/images/logo.png differ
diff --git a/apps/susidns/src/images/reload.png b/apps/susidns/src/images/reload.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0503ac5b3919a7c30f468d1d57f07de53314b2a
Binary files /dev/null and b/apps/susidns/src/images/reload.png differ
diff --git a/apps/susidns/src/images/save.png b/apps/susidns/src/images/save.png
new file mode 100644
index 0000000000000000000000000000000000000000..0743f3879efe9d0f876da3d7f505b06110c51d22
Binary files /dev/null and b/apps/susidns/src/images/save.png differ
diff --git a/apps/susidns/src/images/search.png b/apps/susidns/src/images/search.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce46f1d378e455b2ed5d0bc82afd12bcc3878425
Binary files /dev/null and b/apps/susidns/src/images/search.png differ
diff --git a/apps/susidns/src/index.html b/apps/susidns/src/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..288537ac920c423f55021739e6e6c390364b5907
--- /dev/null
+++ b/apps/susidns/src/index.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="refresh" content="0;url=index.jsp" />
+<title>susidns</title>
+</head>
+<body>
+<a href="index.jsp">Enter</a>
+</body>
+</html>
+  
\ No newline at end of file
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..5d91d469ccb4b44b88bb731bd0f13a6b2bd48fd8
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java
@@ -0,0 +1,61 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.1 $
+ */
+
+package i2p.susi.dns;
+
+public class AddressBean
+{
+	private String name, destination;
+
+	public AddressBean()
+	{
+		
+	}
+	
+	public AddressBean(String name, String destination)
+	{
+		this.name = name;
+		this.destination = destination;
+	}
+
+	public String getDestination() 
+	{
+		return destination;
+	}
+
+	public void setDestination(String destination)
+	{
+		this.destination = destination;
+	}
+
+	public String getName()
+	{
+		return name;
+	}
+
+	public void setName(String name)
+	{
+		this.name = name;
+	}
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c503a999965de268bb9a3fc85984fc196df5002
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java
@@ -0,0 +1,44 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.2 $
+ */
+
+package i2p.susi.dns;
+
+import java.util.Comparator;
+
+public 	class AddressByNameSorter implements Comparator
+{
+	public int compare(Object arg0, Object arg1)
+	{
+		AddressBean a = (AddressBean)arg0;
+		AddressBean b = (AddressBean)arg1;
+		
+		if( a == null )
+			return 1;
+		
+		if( b == null )
+			return -1;
+		
+		return a.getName().compareToIgnoreCase(b.getName());
+	}	
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..e287fcb4e893d2d2afea273671051f4f3d614252
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
@@ -0,0 +1,262 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.7 $
+ */
+
+package i2p.susi.dns;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Properties;
+
+public class AddressbookBean
+{
+	private String book, action, serial, lastSerial, filter, search, hostname, destination;
+	private Properties properties, addressbook;
+	private int trClass;
+	private LinkedList deletionMarks;
+	private static Comparator sorter;
+	
+	static {
+		sorter = new AddressByNameSorter();
+	}
+	public String getSearch() {
+		return search;
+	}
+	public void setSearch(String search) {
+		this.search = search;
+	}
+	public boolean isHasFilter()
+	{
+		return filter != null && filter.length() > 0;
+	}
+	public void setTrClass(int trClass) {
+		this.trClass = trClass;
+	}
+	public int getTrClass() {
+		trClass = 1 - trClass;
+		return trClass;
+	}
+	public boolean isIsEmpty()
+	{
+		return ! isNotEmpty();
+	}
+	public boolean isNotEmpty()
+	{
+		return addressbook != null && addressbook.size() > 0;
+	}
+	public AddressbookBean()
+	{
+		properties = new Properties();
+		deletionMarks = new LinkedList();
+	}
+	private long configLastLoaded = 0;
+	private void loadConfig()
+	{
+		long currentTime = System.currentTimeMillis();
+		
+		if( properties.size() > 0 &&  currentTime - configLastLoaded < 10000 )
+			return;
+		
+		try {
+			properties.clear();
+			properties.load( new FileInputStream( ConfigBean.configFileName ) );
+			configLastLoaded = currentTime;
+		}
+		catch (Exception e) {
+			Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
+		}	
+	}
+	public String getFileName()
+	{
+		loadConfig();
+		String filename = properties.getProperty( getBook() + "_addressbook" );
+		return ConfigBean.addressbookPrefix + filename;
+	}
+	private Object[] entries;
+	
+	public Object[] getEntries()
+	{
+		return entries;
+	}
+	public String getAction() {
+		return action;
+	}
+	public void setAction(String action) {
+		this.action = action;
+	}
+	public String getBook()
+	{
+		if( book == null || ( book.compareToIgnoreCase( "master" ) != 0 &&
+				book.compareToIgnoreCase( "router" ) != 0 ) &&
+				book.compareToIgnoreCase( "published" ) != 0 )
+			book = "master";
+		
+		return book;
+	}
+	public void setBook(String book) {
+		this.book = book;
+	}
+	public String getSerial() {
+		lastSerial = "" + Math.random();
+		action = null;
+		return lastSerial;
+	}
+	public void setSerial(String serial) {
+		this.serial = serial;
+	}
+	public String getMessages()
+	{
+		loadConfig();
+		
+		String message = "";
+		
+		if( action != null ) {
+			if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
+				boolean changed = false;
+				if( action.compareToIgnoreCase( "add") == 0 ) {
+					if( addressbook != null && hostname != null && destination != null ) {
+						addressbook.put( hostname, destination );
+						changed = true;
+						message += "Destination added.<br/>";
+					}
+				}
+				if( action.compareToIgnoreCase( "delete" ) == 0 ) {
+					Iterator it = deletionMarks.iterator();
+					int deleted = 0;
+					while( it.hasNext() ) {
+						String name = (String)it.next();
+						addressbook.remove( name );
+						changed = true;
+						deleted++;
+					}
+					if( changed ) {
+						message += "" + deleted + " destination(s) deleted.<br/>";
+					}
+				}
+				if( changed ) {
+					try {
+						save();
+						message += "Addressbook saved.<br/>";
+					} catch (Exception e) {
+						Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
+						message += "ERROR: Could not write addressbook file.<br/>";
+					}
+				}
+			}			
+			else {
+				message += "Invalid nonce. Are you being spoofed?";
+			}
+		}
+		
+		action = null;
+
+		addressbook = new Properties();
+		
+		try {
+			addressbook.load( new FileInputStream( getFileName() ) );
+			LinkedList list = new LinkedList();			
+			Enumeration e = addressbook.keys();
+			while( e.hasMoreElements() ) {
+				String name = (String)e.nextElement();
+				String destination = addressbook.getProperty( name );
+				if( filter != null && filter.length() > 0 ) {
+					if( filter.compareTo( "0-9" ) == 0 ) {
+						char first = name.charAt(0);
+						if( first < '0' || first > '9' )
+							continue;
+					}
+					else if( ! name.toLowerCase().startsWith( filter.toLowerCase() ) ) {
+						continue;
+					}
+				}
+				if( search != null && search.length() > 0 ) {
+					if( name.indexOf( search ) == -1 ) {
+						continue;
+					}
+				}
+				list.addLast( new AddressBean( name, destination ) );
+			}
+			
+			Object array[] = list.toArray();
+			Arrays.sort( array, sorter );
+			entries = array;
+		}
+		catch (Exception e) {
+			Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
+		}
+				
+		if( message.length() > 0 )
+			message = "<p class=\"messages\">" + message + "</p>";
+		return message;
+	}
+
+	private void save() throws IOException
+	{
+		String filename = properties.getProperty( getBook() + "_addressbook" );
+		
+		addressbook.store( new FileOutputStream( ConfigBean.addressbookPrefix + filename  ), null );
+	}
+	public String getFilter() {
+		return filter;
+	}
+
+	public boolean isMaster()
+	{
+		return getBook().compareToIgnoreCase( "master" ) == 0;
+	}
+	public boolean isRouter()
+	{
+		return getBook().compareToIgnoreCase( "router" ) == 0;
+	}
+	public void setFilter(String filter) {
+		if( filter != null && ( filter.length() == 0 || filter.compareToIgnoreCase( "none" ) == 0 ) ) {
+			filter = null;
+			search = null;
+		}
+		this.filter = filter;
+	}
+	public String getDestination() {
+		return destination;
+	}
+	public void setDestination(String destination) {
+		this.destination = destination;
+	}
+	public String getHostname() {
+		return hostname;
+	}
+	public void setResetDeletionMarks( String dummy ) {
+		deletionMarks.clear();
+	}
+	public void setMarkedForDeletion( String name ) {
+		deletionMarks.addLast( name );
+	}
+	public void setHostname(String hostname) {
+		this.hostname = hostname;
+	}
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..bfcac13ff5157b68e4f004ff9d43d3bbe8b875f9
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
@@ -0,0 +1,157 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.3 $
+ */
+
+package i2p.susi.dns;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Serializable;
+
+public class ConfigBean implements Serializable {
+	
+	/*
+	 * as this is not provided as constant in addressbook, we define it here
+	 */
+	public static String addressbookPrefix = "addressbook/";
+	public static String configFileName = addressbookPrefix + "config.txt";
+	
+	private String action, config;
+	private String serial, lastSerial;
+	private boolean saved;
+	
+	public static String getConfigFileName() {
+		return configFileName;
+	}
+
+	public String getfileName() {
+		return getConfigFileName();
+	}
+
+	public boolean isSaved() {
+		return saved;
+	}
+
+	public String getAction() {
+		return action;
+	}
+	
+	public void setAction(String action) {
+		this.action = action;
+	}
+	
+	public String getConfig()
+	{
+		if( config != null )
+			return config;
+		
+		reload();
+		
+		return config;
+	}
+	
+	private void reload()
+	{
+		File file = new File( configFileName );
+		if( file != null && file.isFile() ) {
+			StringBuffer buf = new StringBuffer();
+			try {
+				BufferedReader br = new BufferedReader( new FileReader( file ) );
+				String line;
+				while( ( line = br.readLine() ) != null ) {
+					buf.append( line );
+					buf.append( "\n" );
+				}
+				config = buf.toString();
+				saved = true;
+			} catch (FileNotFoundException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	private void save()
+	{
+		File file = new File( configFileName );
+		try {
+			PrintWriter out = new PrintWriter( new FileOutputStream( file ) );
+			out.print( config );
+			out.flush();
+			out.close();
+			saved = true;
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	public void setConfig(String config) {
+		this.config = config;
+		this.saved = false;
+		
+		/*
+		 * as this is a property file we need a newline at the end of the last line!
+		 */
+		if( ! this.config.endsWith( "\n" ) ) {
+			this.config += "\n";
+		}
+	}
+	public String getMessages() {
+		String message = "";
+		if( action != null ) {
+			if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
+				if( action.compareToIgnoreCase( "save") == 0 ) {
+					save();
+					message = "Configuration saved.";
+				}
+				else if( action.compareToIgnoreCase( "reload") == 0 ) {
+					reload();
+					message = "Configuration reloaded.";
+				}
+			}			
+			else {
+				message = "Invalid nonce. Are you being spoofed?";
+			}
+		}
+		if( message.length() > 0 )
+			message = "<p class=\"messages\">" + message + "</p>";
+		return message;
+	}
+	public String getSerial()
+	{
+		lastSerial = "" + Math.random();
+		action = null;
+		return lastSerial;
+	}
+	public void setSerial(String serial ) {
+		this.serial = serial;
+	}
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/Debug.java b/apps/susidns/src/java/src/i2p/susi/dns/Debug.java
new file mode 100644
index 0000000000000000000000000000000000000000..977f7caded0148a45b9a11783c3a009943ea8359
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/Debug.java
@@ -0,0 +1,56 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.1 $
+ */
+
+package i2p.susi.dns;
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.Log;
+
+public class Debug
+{
+    private static Log _log;
+    private static I2PAppContext _context;
+
+    static
+    {
+    	try {
+            _context = I2PAppContext.getGlobalContext(); // new I2PAppContext();
+            _log = _context.logManager().getLog(Debug.class);
+    	}
+    	catch( NoClassDefFoundError e ) {
+       		_context = null;
+    		_log = null;    		
+    	}
+    }
+
+    public static void debug( String msg )
+    {
+    	if( _log != null ) {
+    		_log.debug( msg );
+    	}
+    	else {
+    		System.err.println( "DEBUG: [susidns] " + msg );
+    	}
+    }
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..2fb04b00a3000ddcd61c67736ad8bd51c4f19221
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
@@ -0,0 +1,171 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.3 $
+ */
+
+package i2p.susi.dns;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Properties;
+
+public class SubscriptionsBean
+{
+	private String action, fileName, content, serial, lastSerial;
+	private boolean saved;
+	
+	Properties properties;
+	
+	public SubscriptionsBean()
+	{
+		properties = new Properties();
+	}
+	private long configLastLoaded = 0;
+	private void loadConfig()
+	{
+		long currentTime = System.currentTimeMillis();
+		
+		if( properties.size() > 0 &&  currentTime - configLastLoaded < 10000 )
+			return;
+		
+		try {
+			properties.clear();
+			properties.load( new FileInputStream( ConfigBean.configFileName ) );
+			configLastLoaded = currentTime;
+		}
+		catch (Exception e) {
+			Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
+		}	
+	}
+	public String getAction() {
+		return action;
+	}
+
+	public void setAction(String action) {
+		this.action = action;
+	}
+
+	public String getFileName()
+	{
+		loadConfig();
+		
+		fileName = ConfigBean.addressbookPrefix + properties.getProperty( "subscriptions", "subscriptions.txt" );
+		
+		return fileName;
+	}
+	private void reload()
+	{
+		File file = new File( getFileName() );
+		if( file != null && file.isFile() ) {
+			StringBuffer buf = new StringBuffer();
+			try {
+				BufferedReader br = new BufferedReader( new FileReader( file ) );
+				String line;
+				while( ( line = br.readLine() ) != null ) {
+					buf.append( line );
+					buf.append( "\n" );
+				}
+				content = buf.toString();
+				saved = true;
+			} catch (FileNotFoundException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	private void save()
+	{
+		File file = new File( getFileName() );
+		try {
+			PrintWriter out = new PrintWriter( new FileOutputStream( file ) );
+			out.print( content );
+			out.flush();
+			out.close();
+			saved = true;
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	public String getMessages() {
+		String message = "";
+		if( action != null ) {
+			if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
+				if( action.compareToIgnoreCase( "save") == 0 ) {
+					save();
+					message = "Subscriptions saved.";
+				}
+				else if( action.compareToIgnoreCase( "reload") == 0 ) {
+					reload();
+					message = "Subscriptions reloaded.";
+				}
+			}			
+			else {
+				message = "Invalid nonce. Are you being spoofed?";
+			}
+		}
+		if( message.length() > 0 )
+			message = "<p class=\"messages\">" + message + "</p>";
+		return message;
+	}
+	public String getSerial()
+	{
+		lastSerial = "" + Math.random();
+		action = null;
+		return lastSerial;
+	}
+	public void setSerial(String serial ) {
+		this.serial = serial;
+	}
+	public void setContent(String content) {
+		this.content = content;
+		this.saved = false;
+		
+		/*
+		 * as this is a property file we need a newline at the end of the last line!
+		 */
+		if( ! this.content.endsWith( "\n" ) ) {
+			this.content += "\n";
+		}
+	}
+	public String getContent()
+	{
+		if( content != null )
+			return content;
+		
+		reload();
+		
+		return content;
+	}
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/VersionBean.java b/apps/susidns/src/java/src/i2p/susi/dns/VersionBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e7a572e73e6f0add959ae6ee033275c0697e133
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/VersionBean.java
@@ -0,0 +1,39 @@
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.4 $
+ */
+
+package i2p.susi.dns;
+
+public class VersionBean {
+	
+	private static String version = "0.4";
+	private static String url = "http://susi.i2p/?i2paddresshelper=T2DU1KAz3meB0B53U8Y06-I7vHR7XmC0qXAJfLW6b-1L1FVKoySRZz4xazHAwyv2xtRpvKrv6ukLm1tThEW0zQWtZPtX8G6KkzMibD8t7IS~4yw-9VkBtUydyYfsX08AK3v~-egSW8HCXTdyIJVtrETJb337VDUHW-7D4L1JLbwSH4if2ooks6yFTrljK5aVMi-16dZOVvmoyJc3jBqSdK6kraO4gW5-vHTmbLwL498p9nug1KOg1DqgN2GeU5X1QlVrlpFb~IIfdP~O8NT7u-LAjW3jSJsMbLDHMSYTIhC7xmJIiBoi-qk8p6TLynAmvJ7HRvbx4N1EB-uJHyD16wsZkkHyEOfmXbj0ZqLyKEGb3thPwCz-M9v~c2Qt3WbwjXJAtHpjlHkdJ4Fg91cX2oak~JoapnPf6Syw8hko5syf6VVoCYLnrrYyM8oGl8mLclHkj~VCidQNqMSM74IhrHfK6HmRikqtZBexb5M6wfMTTqBvaHURdD21GOpFKYBUAAAA";
+	
+	public String getVersion() {
+		return version;
+	}
+	
+	public String getUrl() {
+		return url;
+	}
+}
diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..113e1e7d916cc4bcce4142f0aa9c42ad012505e6
--- /dev/null
+++ b/apps/susidns/src/jsp/addressbook.jsp
@@ -0,0 +1,168 @@
+<%
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.22 $
+ */
+%>
+<%@ page contentType="text/html"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
+<jsp:useBean id="book" class="i2p.susi.dns.AddressbookBean" scope="session" />
+<jsp:setProperty name="book" property="*" />
+<jsp:setProperty name="book" property="resetDeletionMarks" value="1"/>
+<c:forEach items="${paramValues.checked}" var="checked">
+<jsp:setProperty name="book" property="markedForDeletion" value="${checked}"/>
+</c:forEach>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>${book.book} addressbook - susidns v${version.version}</title>
+<link rel="stylesheet" type="text/css" href="css.css">
+</head>
+<body>
+
+<div id="logo">
+<img src="images/logo.png" alt="susidns logo" border="0"/>
+</div>
+
+<div id="navi">
+<p>addressbooks
+<a href="addressbook.jsp?book=master">master</a> |
+<a href="addressbook.jsp?book=router">router</a> |
+<a href="addressbook.jsp?book=published">published</a> *
+<a href="subscriptions.jsp">subscriptions</a> *
+<a href="config.jsp">configuration</a>
+</p>
+</div>
+
+<div id="headline">
+<h3>${book.book} addressbook at ${book.fileName}</h3>
+</div>
+
+<div id="messages">${book.messages}</div>
+
+<div id="filter">
+<p>Filter: <a href="addressbook.jsp?filter=a">a</a>
+<a href="addressbook.jsp?filter=b">b</a>
+<a href="addressbook.jsp?filter=c">c</a> 
+<a href="addressbook.jsp?filter=d">d</a>
+<a href="addressbook.jsp?filter=e">e</a>
+<a href="addressbook.jsp?filter=f">f</a>
+<a href="addressbook.jsp?filter=g">g</a>
+<a href="addressbook.jsp?filter=h">h</a>
+<a href="addressbook.jsp?filter=i">i</a>
+<a href="addressbook.jsp?filter=j">j</a>
+<a href="addressbook.jsp?filter=k">k</a>
+<a href="addressbook.jsp?filter=l">l</a>
+<a href="addressbook.jsp?filter=m">m</a>
+<a href="addressbook.jsp?filter=n">n</a>
+<a href="addressbook.jsp?filter=o">o</a>
+<a href="addressbook.jsp?filter=p">p</a>
+<a href="addressbook.jsp?filter=q">q</a>
+<a href="addressbook.jsp?filter=r">r</a>
+<a href="addressbook.jsp?filter=s">s</a>
+<a href="addressbook.jsp?filter=t">t</a>
+<a href="addressbook.jsp?filter=u">u</a>
+<a href="addressbook.jsp?filter=v">v</a>
+<a href="addressbook.jsp?filter=w">w</a>
+<a href="addressbook.jsp?filter=x">x</a>
+<a href="addressbook.jsp?filter=y">y</a>
+<a href="addressbook.jsp?filter=z">z</a>
+<a href="addressbook.jsp?filter=0-9">0-9</a>
+<a href="addressbook.jsp?filter=none">all</a></p>
+<c:if test="${book.hasFilter}">
+<p>Current filter: ${book.filter}</p>
+</c:if>
+</div>
+
+<form method="POST" action="addressbook.jsp">
+<div id="search">
+<table><tr>
+<td class="search">Search: <input type="text" name="search" value="${book.search}" size="20" /></td>
+<td class="search"><input type="image" src="images/search.png" name="submitsearch" value="search" alt="Search" /></td>
+</tr>
+</table>
+</div>
+
+</form>
+
+<form method="POST" action="addressbook.jsp">
+<input type="hidden" name="serial" value="${book.serial}"/>
+
+<c:if test="${book.notEmpty}">
+
+<div id="book">
+<jsp:setProperty name="book" property="trClass"	value="0" />
+<table class="book" cellspacing="0" cellpadding="5">
+<tr class="head">
+
+<c:if test="${book.master || book.router}">
+<th>&nbsp;</th>
+</c:if>
+
+<th>Name</th>
+<th>Destination</th>
+</tr>
+<c:forEach items="${book.entries}" var="addr">
+<tr class="list${book.trClass}">
+<c:if test="${book.master || book.router}">
+<td class="checkbox"><input type="checkbox" name="checked" value="${addr.name}" alt="Mark for deletion"></td>
+</c:if>
+<td class="names"><a href="http://${addr.name}/">${addr.name}</a> -
+<span class="addrhlpr"><a href="http://${addr.name}/?i2paddresshelper=${addr.destination}">(addrhlpr)</a></span>
+</td>
+<td class="destinations"><input type="text" name="dest_${addr.name}" value="${addr.destination}" size="20"></td>
+</tr>
+</c:forEach>
+</table>
+</div>
+
+<c:if test="${book.master}||${book.router}">
+<div id="buttons">
+<p class="buttons"><input type="image" name="action" value="delete" src="images/delete.png" alt="Delete checked" />
+</p>
+</div>
+</c:if>
+
+</c:if>
+
+<c:if test="${book.isEmpty}">
+<div id="book">
+<p class="book">The ${book.book} addressbook is empty.</p>
+</div>
+</c:if>
+
+<div id="add">
+<p class="add">
+<h3>Add new destination:</h3>
+Hostname: <input type="text" name="hostname" value="" size="20"> Destination: <input type="text" name="destination" value="" size="20"><br/>
+<input type="image" name="action" value="add" src="images/add.png" alt="Add destination" />
+</p>
+</div>
+
+</form>
+
+<div id="footer">
+<p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
+</div>
+</body>
+</html>
diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..938f600096b6fdf06d559198f4def0ea3e635b33
--- /dev/null
+++ b/apps/susidns/src/jsp/config.jsp
@@ -0,0 +1,96 @@
+<%
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.14 $
+ */
+%>
+<%@ page contentType="text/html" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application"/>
+<jsp:useBean id="cfg" class="i2p.susi.dns.ConfigBean" scope="session"/>
+<jsp:setProperty name="cfg" property="*" />
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>configuration - susidns v${version.version}</title>
+<link rel="stylesheet" type="text/css" href="css.css">
+</head>
+<body>
+<div id="logo">
+<img src="images/logo.png" alt="susidns logo" border="0"/>
+</div>
+<div id="navi">
+<p>
+addressbooks
+<a href="addressbook.jsp?book=master">master</a> |
+<a href="addressbook.jsp?book=router">router</a> |
+<a href="addressbook.jsp?book=published">published</a> *
+<a href="subscriptions.jsp">subscriptions</a> *
+<a href="config.jsp">configuration</a>
+</p>
+</div>
+<div id="headline">
+<h3>${cfg.fileName}</h3>
+</div>
+<div id="messages">${cfg.messages}</div>
+<form method="POST" action="config.jsp">
+<div id="config">
+<input type="hidden" name="serial" value="${cfg.serial}" />
+<textarea name="config" rows="10" cols="80">${cfg.config}</textarea>
+</div>
+<div id="buttons">
+<input type="image" src="images/save.png" name="action" value="save" alt="Save Config"/>
+<input type="image" src="images/reload.png" name="action" value="reload" alt="Reload Config"/>
+</div>
+</form>
+<div id="help">
+<h3>Hints</h3>
+<ol>
+<li>All file or directory paths here are relative to the addressbooks working directory, which normally
+is located at $I2P/addressbook/.</li>
+<li>If you want to manually add lines to an addressbook, add them to the master addressbook. The router
+addressbook and the published addressbook are overwritten by the addressbook application.</li>
+<li><b>Important:</b>When you publish your addressbook, <b>ALL</b> destinations appear there, even those
+from your master addressbook. Unfortunately the master addressbook points to your userhosts.txt, which was
+used for private destinations before. So if you want to keep the destinations in your userhosts.txt secret,
+please change the master addressbook to a different file before turning on addressbook publishing.</li>
+</ol>
+<h3>Options</h3>
+<ul>
+<li><b>subscriptions</b> - file containing the list of subscriptions URLs (no need to change)</li>
+<li><b>update_delay</b> - update interval in hours (no need to change)</li>
+<li><b>published_addressbook</b> - your public hosts.txt file (choose a path within your webserver document root)</li>
+<li><b>router_addressbook</b> - your hosts.txt (no need to change)</li>
+<li><b>master_addressbook</b> - your personal addressbook, it gets never overwritten by the addressbook</li>
+<li><b>proxy_port</b> - http port for your eepProxy (no need to change)</li>
+<li><b>proxy_host</b> - hostname for your eepProxy (no need to change)</li>
+<li><b>should_publish</b> - true/false whether to write the published addressbook</li>
+<li><b>etags</b> - file containing the etags header from the fetched subscription URLs (no need to change)</li>
+<li><b>last_modified</b> - file containing the modification timestamp for each fetched subscription URL (no need to change)</li>
+<li><b>log</b> - file to log activity to (change to /dev/null if you like)</li>
+</ul>
+</div>
+<div id="footer">
+<p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005 </p>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..1a29759b326a5837d3ee2858ca2527df4b35068b
--- /dev/null
+++ b/apps/susidns/src/jsp/index.jsp
@@ -0,0 +1,80 @@
+<%
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.1 $
+ */
+%>
+<%@ page contentType="text/html"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>introduction - susidns v${version.version}</title>
+<link rel="stylesheet" type="text/css" href="css.css">
+</head>
+<body>
+
+<div id="logo">
+<img src="images/logo.png" alt="susidns logo" border="0"/>
+</div>
+
+<div id="navi">
+<p>addressbooks
+<a href="addressbook.jsp?book=master">master</a> |
+<a href="addressbook.jsp?book=router">router</a> |
+<a href="addressbook.jsp?book=published">published</a> *
+<a href="subscriptions.jsp">subscriptions</a> *
+<a href="config.jsp">configuration</a>
+</p>
+</div>
+
+<div id="content">
+<h3>Huh? what addressbook?</h3>
+<p>
+The addressbook application is part of your i2p installation. It regularly updates your hosts.txt file
+from distributed sources. It keeps your hosts.txt up to date, so it automatically contains all new
+eepsites announced on <a href="http://orion.i2p">orion</a>
+or in the <a href="http://forum.i2p/viewforum.php?f=16">forum</a>.
+</p>
+<p>
+(To speak the truth: In its default configuration the addressbook does not poll
+orion, but dev.i2p only. Subscribing to <a href="http://orion.i2p">orion</a> is an easy task,
+just add <a href="http://orion.i2p/hosts.txt">http://orion.i2p/hosts.txt</a> to your <a href="subscriptions.jsp">subscriptions</a> file.)
+</p>
+<p>If you have questions about naming in i2p, there is an excellent <a href="http://forum.i2p.net/viewtopic.php?t=134">introduction</a>
+from duck in the forum.</p>
+<h3>How does the addressbook work?</h3>
+<p>The addressbook application regularly (normally once per hour) polls your subscriptions and merges their content
+into your so called router addressbook (normally your plain hosts.txt). Then it merges your so called master addressbook (normally
+your userhosts.txt) into the router addressbook as well. If configured the router addressbook is now written to the so published addressbook, 
+which is a publicly available copy of your hosts.txt somewhere in your eepsites document root. (Yes, this means that, with activated publication,
+your once private keys from userhosts.txt now are publicly available for everybody.)
+</p>
+<p><img src="images/how.png" border="0" alt="addressbook working scheme"/></p>
+</div>
+
+<div id="footer">
+<p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
+</div>
+</body>
+</html>
diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..9e78de8a1966d2cb5ce4a39e170c9ff01928d77e
--- /dev/null
+++ b/apps/susidns/src/jsp/subscriptions.jsp
@@ -0,0 +1,78 @@
+<%
+/*
+ * Created on Sep 02, 2005
+ * 
+ *  This file is part of susidns project, see http://susi.i2p/
+ *  
+ *  Copyright (C) 2005 <susi23@mail.i2p>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  
+ * $Revision: 1.7 $
+ */
+%>
+<%@ page contentType="text/html"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
+<jsp:useBean id="subs" class="i2p.susi.dns.SubscriptionsBean" scope="session" />
+<jsp:setProperty name="subs" property="*" />
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>subscriptions - susidns v${version.version}</title>
+<link rel="stylesheet" type="text/css" href="css.css">
+</head>
+<body>
+<div id="logo">
+<img src="images/logo.png" alt="susidns logo" border="0"/>
+</div>
+<div id="navi">
+<p>addressbooks
+<a href="addressbook.jsp?book=master">master</a> |
+<a href="addressbook.jsp?book=router">router</a> |
+<a href="addressbook.jsp?book=published">published</a> *
+<a href="subscriptions.jsp">subscriptions</a> *
+<a href="config.jsp">configuration</a>
+</p>
+</div>
+<div id="headline">
+<h3>${subs.fileName}</h3>
+</div>
+<div id="messages">${subs.messages}</div>
+<form method="POST" action="subscriptions.jsp">
+<div id="content">
+<input type="hidden" name="serial" value="${subs.serial}" />
+<textarea name="content" rows="10" cols="80">${subs.content}</textarea>
+</div>
+<div id="buttons">
+<input type="image" src="images/save.png" name="action" value="save" alt="Save Subscriptions" />
+<input type="image" src="images/reload.png" name="action" value="reload" alt="Reload Subscriptions" />
+</div>
+</form>
+<div id="help">
+<h3>Explanation</h3>
+<p class="help">
+The subscription file contains a list of (i2p) URLs. The addressbook application
+regularly (once per hour) checks this list for new eepsites. Those URLs simply contain the published hosts.txt
+file of other people. Default subscription is the hosts.txt from dev.i2p. The most
+popular collaboration site for eepsite is orion.i2p. So its a good idea to add http://orion.i2p/hosts.txt
+as a 2nd subscription.
+</p>
+</div>
+<div id="footer">
+<p class="footer">susidns v${version.version} &copy; <a href="${version.url}">susi</a> 2005</p>
+</div>
+</body>
+</html>