diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a2f172f865a583c3840e9d100cc620e7fc1a8401..6481eee1ca8d61b6659062026673c26de35bf016 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -46,5 +46,9 @@
                   android.theme="@android:style/Theme.NoTitleBar"
                   android:launchMode="singleTop" >
         </activity>
+        <activity android:name=".activity.AddressbookActivity"
+                  android:label="Address Book"
+                  android.theme="@android:style/Theme.NoTitleBar" >
+        </activity>
     </application>
 </manifest> 
diff --git a/res/layout/addressbook_header.xml b/res/layout/addressbook_header.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b787646022e704c1362d390a295fc22142a9b684
--- /dev/null
+++ b/res/layout/addressbook_header.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content" 
+    android:padding="8dp"
+    android:textSize="18sp"
+    android:text="Address Book" >
+</TextView>
diff --git a/res/layout/addressbook_list_item.xml b/res/layout/addressbook_list_item.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e058a0f98a7685a630c0a3c905840c61d29cf1e
--- /dev/null
+++ b/res/layout/addressbook_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:padding="6dp"
+    android:textSize="16sp" >
+</TextView>
diff --git a/res/layout/main.xml b/res/layout/main.xml
index 63013875b0453c77ba7e6460a17be25ab3504fda..fd46fb27d45e3fadcbc600815bc9713f21174f67 100644
--- a/res/layout/main.xml
+++ b/res/layout/main.xml
@@ -58,6 +58,18 @@
     android:text="Licenses"
     />
 </LinearLayout>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="horizontal"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content" 
+    >
+ <Button 
+    android:id="@+id/addressbook_button"
+    android:layout_width="wrap_content" 
+    android:layout_height="wrap_content" 
+    android:text="Address Book"
+    />
+</LinearLayout>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
     android:layout_width="fill_parent"
diff --git a/src/net/i2p/android/router/activity/AddressbookActivity.java b/src/net/i2p/android/router/activity/AddressbookActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..6eee259bd21c9d676fea3e3a4c5d3b76a9a2e4fa
--- /dev/null
+++ b/src/net/i2p/android/router/activity/AddressbookActivity.java
@@ -0,0 +1,58 @@
+package net.i2p.android.router.activity;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import net.i2p.android.router.R;
+import net.i2p.I2PAppContext;
+import net.i2p.client.naming.NamingService;
+
+public class AddressbookActivity extends ListActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Fixme problems if started before router -
+        // wrong dir, dup contexts, locking, ...
+        I2PAppContext ctx = I2PAppContext.getGlobalContext();
+
+        // get the names
+        NamingService ns = ctx.namingService();
+        Set<String> names = ns.getNames();
+
+        // set the header
+        TextView tv = (TextView) getLayoutInflater().inflate(R.layout.addressbook_header, null);
+        tv.setText(names.size() + " hosts in address book. Start typing to filter");
+        ListView lv = getListView();
+        lv.addHeaderView(tv);
+        lv.setTextFilterEnabled(true);
+
+        // set the list
+        List<String> nameList = new ArrayList(names);
+        Collections.sort(nameList);
+        setListAdapter(new ArrayAdapter<String>(this, R.layout.addressbook_list_item, nameList));
+
+        // set the callback
+        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            public void onItemClick(AdapterView parent, View view, int pos, long id) {
+                CharSequence host = ((TextView) view).getText();
+                Intent intent = new Intent(view.getContext(), WebActivity.class);
+                intent.setData(Uri.parse("http://" + host + '/'));
+                startActivity(intent);
+            }
+        });
+    }
+}
diff --git a/src/net/i2p/android/router/activity/I2PWebViewClient.java b/src/net/i2p/android/router/activity/I2PWebViewClient.java
index c0ce67936c26eafabad6d02d9f32e5070c4893a6..dacfacc3cf3f4b871a54a542a59f494d6f3dcdef 100644
--- a/src/net/i2p/android/router/activity/I2PWebViewClient.java
+++ b/src/net/i2p/android/router/activity/I2PWebViewClient.java
@@ -32,6 +32,7 @@ class I2PWebViewClient extends WebViewClient {
             String s = uri.getScheme();
             if (s == null) {
                 Toast toast = Toast.makeText(view.getContext(), "Bad URL " + url, Toast.LENGTH_SHORT);
+                toast.show();
                 return true;
             }
             s = s.toLowerCase();
@@ -40,6 +41,7 @@ class I2PWebViewClient extends WebViewClient {
             String h = uri.getHost();
             if (h == null) {
                 Toast toast = Toast.makeText(view.getContext(), "Bad URL " + url, Toast.LENGTH_SHORT);
+                toast.show();
                 return true;
             }
 
@@ -47,6 +49,7 @@ class I2PWebViewClient extends WebViewClient {
             if (h.endsWith(".i2p")) {
                 if (!s.equals("http")) {
                     Toast toast = Toast.makeText(view.getContext(), "Bad URL " + url, Toast.LENGTH_SHORT);
+                    toast.show();
                     return true;
                 }
                 // strip trailing junk
diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java
index 25cb6fd9c8b5ff73cdb1670cc5d47ab00226cb7c..922d9668c8db8154d709098d2bcb81e561c13d02 100644
--- a/src/net/i2p/android/router/activity/MainActivity.java
+++ b/src/net/i2p/android/router/activity/MainActivity.java
@@ -92,6 +92,14 @@ public class MainActivity extends I2PActivityBase {
             }
         });
 
+        Button addressbook = (Button) findViewById(R.id.addressbook_button);
+        addressbook.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), AddressbookActivity.class);
+                startActivity(intent);
+            }
+        });
+
         Button start = (Button) findViewById(R.id.router_start_button);
         start.setOnClickListener(new View.OnClickListener() {
             public void onClick(View view) {
diff --git a/src/net/i2p/android/router/activity/WebActivity.java b/src/net/i2p/android/router/activity/WebActivity.java
index 8d263f373eedc322bc9ea7e9220619f28a6d13e6..bab2d202a03312ee132fba1660e239a8ba2dc9d9 100644
--- a/src/net/i2p/android/router/activity/WebActivity.java
+++ b/src/net/i2p/android/router/activity/WebActivity.java
@@ -41,8 +41,10 @@ public class WebActivity extends I2PActivityBase {
         Intent intent = getIntent();
         Uri uri = intent.getData();
         if (uri != null) {
-            wv.getSettings().setLoadsImagesAutomatically(true);
-            wv.loadUrl(uri.toString());
+            //wv.getSettings().setLoadsImagesAutomatically(true);
+            //wv.loadUrl(uri.toString());
+            // go thru the client so .i2p will work too
+            _wvClient.shouldOverrideUrlLoading(wv, uri.toString());
         } else {
             wv.getSettings().setLoadsImagesAutomatically(false);
             int id = intent.getIntExtra(HTML_RESOURCE_ID, R.raw.welcome_html);