diff --git a/res/layout/activity_addressbook.xml b/res/layout/fragment_listview.xml
similarity index 84%
rename from res/layout/activity_addressbook.xml
rename to res/layout/fragment_listview.xml
index 4c7dc6b684ba156f142e96862ecde1e1027c7e08..0f6d819789b8920228e22f3fe12edf4f22d20ed5 100644
--- a/res/layout/activity_addressbook.xml
+++ b/res/layout/fragment_listview.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/addressbook_list"
+    android:id="@+id/listview"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
     
diff --git a/src/net/i2p/android/router/activity/LicenseActivity.java b/src/net/i2p/android/router/activity/LicenseActivity.java
index 11ecae754eecf4adcf973f7dc7de2df8cc62842a..0a7ca334eafe5f87224e8cf1b429702373830a1e 100644
--- a/src/net/i2p/android/router/activity/LicenseActivity.java
+++ b/src/net/i2p/android/router/activity/LicenseActivity.java
@@ -1,46 +1,19 @@
 package net.i2p.android.router.activity;
 
-import android.app.ListActivity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.TextResourceFragment;
-
-public class LicenseActivity extends ListActivity {
-
-    private static final String[] names = {
-        "Android Application License", "Apache 2.0",
-        "Router License Overview", "Blockfile", "Crypto Filters", "ElGamal / DSA",
-        "GPLv2", "LGPLv2.1", "GPLv3", "LGPLv3", "FatCowIcons",
-        "Ministreaming",
-        "InstallCert", "SHA-256", "SNTP", "Addressbook"};
-
-    private static final int[] files = {
-        R.raw.license_app_txt, R.raw.license_apache20_txt,
-        R.raw.licenses_txt, R.raw.license_blockfile_txt, R.raw.license_bsd_txt, R.raw.license_elgamaldsa_txt,
-        R.raw.license_gplv2_txt, R.raw.license_lgplv2_1_txt, R.raw.license_gplv3_txt, R.raw.license_lgplv3_txt,
-        R.raw.license_fatcowicons_txt, R.raw.license_bsd_txt,
-        R.raw.license_installcert_txt, R.raw.license_sha256_txt, R.raw.license_sntp_txt, R.raw.license_addressbook_txt};
+import net.i2p.android.router.fragment.LicenseFragment;
+import android.os.Bundle;
 
+public class LicenseActivity extends I2PActivityBase {
     @Override
-    public void onCreate(Bundle savedInstanceState)
-    {
+    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
-        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names));
-        ListView lv = getListView();
-
-        // set the callback
-        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
-            public void onItemClick(AdapterView parent, View view, int pos, long id) {
-                Intent intent = new Intent(view.getContext(), TextResourceFragment.class);
-                intent.putExtra(TextResourceFragment.TEXT_RESOURCE_ID, files[pos]);
-                startActivity(intent);
-            }
-        });
+        // Start with the base view
+        if (savedInstanceState == null) {
+            LicenseFragment f = new LicenseFragment();
+            f.setArguments(getIntent().getExtras());
+            getSupportFragmentManager().beginTransaction()
+                    .add(R.id.main_content, f).commit();
+        }
     }
 }
diff --git a/src/net/i2p/android/router/fragment/AddressbookFragment.java b/src/net/i2p/android/router/fragment/AddressbookFragment.java
index 752ee97a02f85ccdeba658f29bdd99054f82c85d..4d08f108258722035763e1964813901e57276406 100644
--- a/src/net/i2p/android/router/fragment/AddressbookFragment.java
+++ b/src/net/i2p/android/router/fragment/AddressbookFragment.java
@@ -35,7 +35,7 @@ public class AddressbookFragment extends Fragment {
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
-        View v = inflater.inflate(R.layout.activity_addressbook, container, false);
+        View v = inflater.inflate(R.layout.fragment_listview, container, false);
 
         // Grab context if router has started, otherwise create new
         // FIXME dup contexts, locking, ...
@@ -62,7 +62,7 @@ public class AddressbookFragment extends Fragment {
             tv.setText("1 host in address book.");
         else
             tv.setText("No hosts in address book, or your router is not up.");
-        ListView lv = (ListView) v.findViewById(R.id.addressbook_list);
+        ListView lv = (ListView) v.findViewById(R.id.listview);
         lv.addHeaderView(tv, "", false);
 
         // set the list
diff --git a/src/net/i2p/android/router/fragment/LicenseFragment.java b/src/net/i2p/android/router/fragment/LicenseFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1e0374590fc46a7818183619f599dac6b655aaf
--- /dev/null
+++ b/src/net/i2p/android/router/fragment/LicenseFragment.java
@@ -0,0 +1,51 @@
+package net.i2p.android.router.fragment;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import net.i2p.android.router.R;
+
+public class LicenseFragment extends Fragment {
+
+    private static final String[] names = {
+        "Android Application License", "Apache 2.0",
+        "Router License Overview", "Blockfile", "Crypto Filters", "ElGamal / DSA",
+        "GPLv2", "LGPLv2.1", "GPLv3", "LGPLv3", "FatCowIcons",
+        "Ministreaming",
+        "InstallCert", "SHA-256", "SNTP", "Addressbook"};
+
+    private static final int[] files = {
+        R.raw.license_app_txt, R.raw.license_apache20_txt,
+        R.raw.licenses_txt, R.raw.license_blockfile_txt, R.raw.license_bsd_txt, R.raw.license_elgamaldsa_txt,
+        R.raw.license_gplv2_txt, R.raw.license_lgplv2_1_txt, R.raw.license_gplv3_txt, R.raw.license_lgplv3_txt,
+        R.raw.license_fatcowicons_txt, R.raw.license_bsd_txt,
+        R.raw.license_installcert_txt, R.raw.license_sha256_txt, R.raw.license_sntp_txt, R.raw.license_addressbook_txt};
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View v = inflater.inflate(R.layout.fragment_listview, container, false);
+
+        ListView lv = (ListView) v.findViewById(R.id.listview);
+        lv.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, names));
+
+        // set the callback
+        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            public void onItemClick(AdapterView parent, View view, int pos, long id) {
+                TextResourceDialog dialog = new TextResourceDialog();
+                Bundle args = new Bundle();
+                args.putString(TextResourceDialog.TEXT_DIALOG_TITLE, names[pos]);
+                args.putInt(TextResourceDialog.TEXT_RESOURCE_ID, files[pos]);
+                dialog.setArguments(args);
+                dialog.show(getActivity().getSupportFragmentManager(), "license");
+            }
+        });
+
+        return v;
+    }
+}
diff --git a/src/net/i2p/android/router/fragment/MainFragment.java b/src/net/i2p/android/router/fragment/MainFragment.java
index fd62c2f64c6b0c3b9ebae6b228148154c08189c5..1b55062f25891f319dfcb58e64427b4cac3ebd8a 100644
--- a/src/net/i2p/android/router/fragment/MainFragment.java
+++ b/src/net/i2p/android/router/fragment/MainFragment.java
@@ -74,9 +74,9 @@ public class MainFragment extends I2PFragmentBase {
         b.setOnClickListener(new View.OnClickListener() {
 
             public void onClick(View view) {
-                TextResourceFragment f = new TextResourceFragment();
+                TextResourceDialog f = new TextResourceDialog();
                 Bundle args = new Bundle();
-                args.putInt(TextResourceFragment.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
+                args.putInt(TextResourceDialog.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
                 f.setArguments(args);
                 getActivity().getSupportFragmentManager()
                              .beginTransaction()
diff --git a/src/net/i2p/android/router/fragment/TextResourceFragment.java b/src/net/i2p/android/router/fragment/TextResourceDialog.java
similarity index 88%
rename from src/net/i2p/android/router/fragment/TextResourceFragment.java
rename to src/net/i2p/android/router/fragment/TextResourceDialog.java
index 90e1f4bfe4921d5e64d8dfbb1245882e64b35abe..e4556dd3987fa58e12224ade8e763c1c9bcacddc 100644
--- a/src/net/i2p/android/router/fragment/TextResourceFragment.java
+++ b/src/net/i2p/android/router/fragment/TextResourceDialog.java
@@ -2,6 +2,7 @@ package net.i2p.android.router.fragment;
 
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
 import android.text.method.ScrollingMovementMethod;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -18,8 +19,9 @@ import net.i2p.android.router.util.Util;
  *  Display a raw text resource.
  *  The resource ID must be passed as an extra in the intent.
  */
-public class TextResourceFragment extends I2PFragmentBase {
+public class TextResourceDialog extends DialogFragment {
 
+    public static final String TEXT_DIALOG_TITLE = "text_title";
     public final static String TEXT_RESOURCE_ID = "text_resource_id";
 
     @Override
@@ -29,6 +31,9 @@ public class TextResourceFragment extends I2PFragmentBase {
         View v = inflater.inflate(R.layout.text_resource, container, false);
         TextView tv = (TextView) v.findViewById(R.id.text_resource_text);
         tv.setMovementMethod(ScrollingMovementMethod.getInstance());
+        String title = getArguments().getString(TEXT_DIALOG_TITLE);
+        if (title != null)
+            getDialog().setTitle(title);
         int id = getArguments().getInt(TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
         if (id == R.raw.releasenotes_txt)
             tv.setText("Release Notes for Release " + Util.getOurVersion(getActivity()) + "\n\n" +
diff --git a/src/net/i2p/android/router/fragment/VersionDialog.java b/src/net/i2p/android/router/fragment/VersionDialog.java
index 5c59c45c9ec8303464201331112a627bb1be983c..c9bb2d88fec175ec43e638abcbd0b4a51d3b771a 100644
--- a/src/net/i2p/android/router/fragment/VersionDialog.java
+++ b/src/net/i2p/android/router/fragment/VersionDialog.java
@@ -65,9 +65,9 @@ public class VersionDialog extends DialogFragment {
                                 .findFragmentById(R.id.main_content);
                         fb.setPref(MainFragment.PREF_INSTALLED_VERSION, currentVersion);
                         dialog.cancel();
-                        TextResourceFragment f = new TextResourceFragment();
+                        TextResourceDialog f = new TextResourceDialog();
                         Bundle args = new Bundle();
-                        args.putInt(TextResourceFragment.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
+                        args.putInt(TextResourceDialog.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
                         f.setArguments(args);
                         getActivity().getSupportFragmentManager()
                                      .beginTransaction()
@@ -116,9 +116,9 @@ public class VersionDialog extends DialogFragment {
                             dialog.dismiss();
                         } catch(Exception e) {
                         }
-                        TextResourceFragment f = new TextResourceFragment();
+                        TextResourceDialog f = new TextResourceDialog();
                         Bundle args = new Bundle();
-                        args.putInt(TextResourceFragment.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
+                        args.putInt(TextResourceDialog.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
                         f.setArguments(args);
                         getActivity().getSupportFragmentManager()
                                      .beginTransaction()