diff --git a/res/drawable-hdpi/drawer_shadow.9.png b/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..224cc4ff43a29c546ae50c654c20c58c2f4cdb75
Binary files /dev/null and b/res/drawable-hdpi/drawer_shadow.9.png differ
diff --git a/res/drawable-hdpi/ic_drawer.png b/res/drawable-hdpi/ic_drawer.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff7b1def9ac3f86488a855f502b965ac75b633fb
Binary files /dev/null and b/res/drawable-hdpi/ic_drawer.png differ
diff --git a/res/drawable-mdpi/drawer_shadow.9.png b/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..3797f99c0ef9f657c2b0a1f84a4d0f16cc8ee5f4
Binary files /dev/null and b/res/drawable-mdpi/drawer_shadow.9.png differ
diff --git a/res/drawable-mdpi/ic_drawer.png b/res/drawable-mdpi/ic_drawer.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb681ba2639897cc4646d3784b97bbe16f5d4e91
Binary files /dev/null and b/res/drawable-mdpi/ic_drawer.png differ
diff --git a/res/drawable-xhdpi/drawer_shadow.9.png b/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa3d853e902401d850f09b1cc50a58cda9bd3bb5
Binary files /dev/null and b/res/drawable-xhdpi/drawer_shadow.9.png differ
diff --git a/res/drawable-xhdpi/ic_drawer.png b/res/drawable-xhdpi/ic_drawer.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9bc3d70f1d29fec2e4530e5d1809edc8e15ad35
Binary files /dev/null and b/res/drawable-xhdpi/ic_drawer.png differ
diff --git a/res/layout/activity_main.xml b/res/layout/activity_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6f2591c940efdd482921ad93d4f2c8e0015451ee
--- /dev/null
+++ b/res/layout/activity_main.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.DrawerLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/drawer_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity" >
+
+    <!-- The main content view -->
+    <FrameLayout
+        android:id="@+id/main_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+    <!-- The navigation drawer -->
+    <ListView
+        android:id="@+id/drawer"
+        android:layout_width="240dp"
+        android:layout_height="match_parent"
+        android:layout_gravity="start"
+        android:choiceMode="singleChoice"
+        android:divider="@android:color/transparent"
+        android:dividerHeight="0dp"
+        android:background="#111"/>
+
+</android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/res/layout/main.xml b/res/layout/fragment_main.xml
similarity index 100%
rename from res/layout/main.xml
rename to res/layout/fragment_main.xml
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index ed6cc84d1896bb97d1fed34932dbe99f2f09e29f..cb3ecd8c3108dfcf5ba08e1a81a7ab049410f448 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources>
+    <string-array name="main_fragments">
+        <item>net.i2p.android.router.activity.MainFragment</item>
+    </string-array>
+    <string-array name="main_fragment_titles">
+        <item>I2P</item>
+    </string-array>
     <string-array name="setting0to3">
         <item>0</item>
         <item>1</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 280690a2fb9acff8af07656df2533e794bc0a02a..484455be9c4482e499b1248f6d8d23bd6f3dde29 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -23,6 +23,8 @@
     <string name="label_website_nonanon">Web Site (non-anon)</string>
     <string name="label_faq_nonanon">FAQ (non-anon)</string>
 
+    <string name="drawer_open">Open nav</string>
+    <string name="drawer_close">Close nav</string>
     <string name="action_add">Add</string>
     <string name="action_router_start">Start Router</string>
     <string name="action_router_stop">Stop Router</string>
diff --git a/src/net/i2p/android/router/activity/AddressbookActivity.java b/src/net/i2p/android/router/activity/AddressbookActivity.java
index 6d3068acb50ec6188d3410b21193e68dcf78d2e8..6c533583f82b76001bb23b55a6ae02ceba9016ea 100644
--- a/src/net/i2p/android/router/activity/AddressbookActivity.java
+++ b/src/net/i2p/android/router/activity/AddressbookActivity.java
@@ -66,7 +66,7 @@ public class AddressbookActivity extends ActionBarActivity {
         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 intent = new Intent(view.getContext(), WebFragment.class);
                 intent.setData(Uri.parse("http://" + host + '/'));
                 startActivity(intent);
             }
diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/activity/I2PFragmentBase.java
similarity index 86%
rename from src/net/i2p/android/router/activity/I2PActivityBase.java
rename to src/net/i2p/android/router/activity/I2PFragmentBase.java
index 5b04f77bff27caa9c3e13189e7e638f4c11154ff..15d467beac0da677c50b484c571484271ef6763e 100644
--- a/src/net/i2p/android/router/activity/I2PActivityBase.java
+++ b/src/net/i2p/android/router/activity/I2PFragmentBase.java
@@ -6,6 +6,7 @@ import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.support.v4.app.Fragment;
 import android.support.v7.app.ActionBarActivity;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -23,7 +24,7 @@ import net.i2p.router.peermanager.ProfileOrganizer;
 import net.i2p.router.transport.FIFOBandwidthLimiter;
 import net.i2p.stat.StatManager;
 
-public abstract class I2PActivityBase extends ActionBarActivity {
+public abstract class I2PFragmentBase extends Fragment {
     protected String _myDir;
     protected boolean _isBound;
     protected boolean _triedBind;
@@ -43,14 +44,9 @@ public abstract class I2PActivityBase extends ActionBarActivity {
     {
         Util.i(this + " onCreate called");
         super.onCreate(savedInstanceState);
-        _myDir = getFilesDir().getAbsolutePath();
-    }
-
-    @Override
-    public void onRestart()
-    {
-        Util.i(this + " onRestart called");
-        super.onRestart();
+        _myDir = getActivity().getFilesDir().getAbsolutePath();
+        // Set this so onCreateOptionsMenu() is called
+        setHasOptionsMenu(true);
     }
 
     @Override
@@ -58,7 +54,7 @@ public abstract class I2PActivityBase extends ActionBarActivity {
     {
         Util.i(this + " onStart called");
         super.onStart();
-        _sharedPrefs = getSharedPreferences(SHARED_PREFS, 0);
+        _sharedPrefs = getActivity().getSharedPreferences(SHARED_PREFS, 0);
         if (_sharedPrefs.getBoolean(PREF_AUTO_START, DEFAULT_AUTO_START))
             startRouter();
         else
@@ -113,6 +109,14 @@ public abstract class I2PActivityBase extends ActionBarActivity {
         super.onStop();
     }
 
+    /**
+     * Called by MainActivity.onBackPressed()
+     * @return true if the fragment should stay, false otherwise.
+     */
+    public boolean onBackPressed() {
+        return false;
+    }
+
     @Override
     public void onDestroy()
     {
@@ -121,18 +125,16 @@ public abstract class I2PActivityBase extends ActionBarActivity {
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        MenuInflater inflater = getMenuInflater();
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.menu1, menu);
-        return true;
     }
 
     @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
+    public void onPrepareOptionsMenu(Menu menu) {
         // add/hide items here
         RouterService svc = _routerService;
         boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart()) &&
-                            Util.isConnected(this);
+                            Util.isConnected(getActivity());
         MenuItem start = menu.findItem(R.id.menu_start);
         start.setVisible(showStart);
         start.setEnabled(showStart);
@@ -142,39 +144,37 @@ public abstract class I2PActivityBase extends ActionBarActivity {
         stop.setVisible(showStop);
         stop.setEnabled(showStop);
 
-        boolean showHome = ! (this instanceof MainActivity);
+        boolean showHome = ! (this instanceof MainFragment);
         MenuItem home = menu.findItem(R.id.menu_home);
         home.setVisible(showHome);
         home.setEnabled(showHome);
 
-        boolean showAddressbook = (this instanceof WebActivity);
+        boolean showAddressbook = (this instanceof WebFragment);
         MenuItem addressbook = menu.findItem(R.id.menu_addressbook);
         addressbook.setVisible(showAddressbook);
         addressbook.setEnabled(showAddressbook);
 
-        boolean showReload = showAddressbook || (this instanceof PeersActivity);
+        boolean showReload = showAddressbook || (this instanceof PeersFragment);
         MenuItem reload = menu.findItem(R.id.menu_reload);
         reload.setVisible(showReload);
         reload.setEnabled(showReload);
-
-        return super.onPrepareOptionsMenu(menu);
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         case R.id.menu_settings:
-            Intent intent = new Intent(I2PActivityBase.this, SettingsActivity.class);
+            Intent intent = new Intent(getActivity(), SettingsActivity.class);
             startActivity(intent);
             return true;
 
         case R.id.menu_home:
-            Intent i2 = new Intent(I2PActivityBase.this, MainActivity.class);
+            Intent i2 = new Intent(getActivity(), MainActivity.class);
             startActivity(i2);
             return true;
 
         case R.id.menu_addressbook:
-            Intent i3 = new Intent(I2PActivityBase.this, AddressbookActivity.class);
+            Intent i3 = new Intent(getActivity(), AddressbookActivity.class);
             startActivity(i3);
             return true;
 
@@ -209,9 +209,9 @@ public abstract class I2PActivityBase extends ActionBarActivity {
      */
     protected boolean startRouter() {
         Intent intent = new Intent();
-        intent.setClassName(this, "net.i2p.android.router.service.RouterService");
+        intent.setClassName(getActivity(), "net.i2p.android.router.service.RouterService");
         Util.i(this + " calling startService");
-        ComponentName name = startService(intent);
+        ComponentName name = getActivity().startService(intent);
         if (name == null)
             Util.i(this + " XXXXXXXXXXXXXXXXXXXX got from startService: " + name);
         Util.i(this + " got from startService: " + name);
@@ -226,10 +226,10 @@ public abstract class I2PActivityBase extends ActionBarActivity {
      */
     protected boolean bindRouter(boolean autoCreate) {
         Intent intent = new Intent();
-        intent.setClassName(this, "net.i2p.android.router.service.RouterService");
+        intent.setClassName(getActivity(), "net.i2p.android.router.service.RouterService");
         Util.i(this + " calling bindService");
         _connection = new RouterConnection();
-        _triedBind = bindService(intent, _connection, autoCreate ? BIND_AUTO_CREATE : 0);
+        _triedBind = getActivity().bindService(intent, _connection, autoCreate ? getActivity().BIND_AUTO_CREATE : 0);
         Util.i(this + " bindService: auto create? " + autoCreate + " success? " + _triedBind);
         return _triedBind;
     }
@@ -237,7 +237,7 @@ public abstract class I2PActivityBase extends ActionBarActivity {
     protected void unbindRouter() {
         Util.i(this + " unbindRouter called with _isBound:" + _isBound + " _connection:" + _connection + " _triedBind:" + _triedBind);
         if (_triedBind && _connection != null)
-                unbindService(_connection);
+            getActivity().unbindService(_connection);
 
         _triedBind = false;
         _connection = null;
diff --git a/src/net/i2p/android/router/activity/I2PWebViewClient.java b/src/net/i2p/android/router/activity/I2PWebViewClient.java
index 375bb1478dd570a467dda1b5fae46535d272a816..f5be46f4fa5f83f086abbd1e10381f7eead85b80 100644
--- a/src/net/i2p/android/router/activity/I2PWebViewClient.java
+++ b/src/net/i2p/android/router/activity/I2PWebViewClient.java
@@ -38,10 +38,6 @@ class I2PWebViewClient extends WebViewClient {
     private static final String ERROR_URL = "<p>Unable to load URL: ";
     private static final String ERROR_ROUTER = "<p>Your router (or the HTTP proxy) does not appear to be running.</p>";
 
-    public I2PWebViewClient(Context ctx) {
-        super();
-    }
-
     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url) {
         Util.d("Should override? " + url);
diff --git a/src/net/i2p/android/router/activity/LicenseActivity.java b/src/net/i2p/android/router/activity/LicenseActivity.java
index c124559c09c102a25e889eaf5376de0e9d72f98a..a0e455cdc9110ed2f4ad37374b3730bc02dcbf38 100644
--- a/src/net/i2p/android/router/activity/LicenseActivity.java
+++ b/src/net/i2p/android/router/activity/LicenseActivity.java
@@ -36,8 +36,8 @@ public class LicenseActivity extends ListActivity {
         // 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(), TextResourceActivity.class);
-                intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, files[pos]);
+                Intent intent = new Intent(view.getContext(), TextResourceFragment.class);
+                intent.putExtra(TextResourceFragment.TEXT_RESOURCE_ID, files[pos]);
                 startActivity(intent);
             }
         });
diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/activity/MainActivity.java
index c0af403a93e92d711982da1eebc4bca4c64f6236..3e50320292ac3370947f2e18e177667921f0bb9f 100644
--- a/src/net/i2p/android/router/activity/MainActivity.java
+++ b/src/net/i2p/android/router/activity/MainActivity.java
@@ -1,508 +1,159 @@
 package net.i2p.android.router.activity;
 
+import net.i2p.android.router.R;
+import net.i2p.android.router.util.Util;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.net.Uri;
+import android.content.res.Configuration;
 import android.os.Bundle;
-import android.os.Handler;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarActivity;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
-import android.widget.Button;
-import android.widget.TextView;
-import java.io.File;
-import java.text.DecimalFormat;
-import net.i2p.android.router.R;
-import net.i2p.android.router.service.RouterService;
-import net.i2p.android.router.util.Util;
-import net.i2p.data.DataHelper;
-import net.i2p.router.RouterContext;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
 
-public class MainActivity extends I2PActivityBase {
+public class MainActivity extends ActionBarActivity {
+    private DrawerLayout mDrawerLayout;
+    private ListView mDrawerList;
+    private ActionBarDrawerToggle mDrawerToggle;
 
-    private Handler _handler;
-    private Runnable _updater;
-    private Runnable _oneShotUpdate;
-    private String _savedStatus;
-    private String _ourVersion;
-    private boolean _keep = true;
-    private boolean _startPressed = false;
-    protected static final String PROP_NEW_INSTALL = "i2p.newInstall";
-    protected static final String PROP_NEW_VERSION = "i2p.newVersion";
-    protected static final int DIALOG_NEW_INSTALL = 0;
-    protected static final int DIALOG_NEW_VERSION = 1;
-
-    @Override
-    public void onPostCreate(Bundle savedInstanceState) {
-        Util.i("Initializing...");
-        InitActivities init = new InitActivities(this);
-        init.debugStuff();
-        init.initialize();
-        super.onPostCreate(savedInstanceState);
-        _ourVersion = Util.getOurVersion(this);
-    }
+    private CharSequence mDrawerTitle;
+    private CharSequence mTitle;
+    private String[] mFragments;
+    private String[] mFragmentTitles;
 
-    /**
-     * Called when the activity is first created.
-     */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        // Init stuff here so settings work.
-        _myDir = getFilesDir().getAbsolutePath();
-        if(savedInstanceState != null) {
-            String saved = savedInstanceState.getString("status");
-            if(saved != null) {
-                _savedStatus = saved;
-            }
-        }
-
-        _keep = true;
-        setContentView(R.layout.main);
-
-        Button b = (Button) findViewById(R.id.news_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), NewsActivity.class);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.releasenotes_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), TextResourceActivity.class);
-                intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.licenses_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), LicenseActivity.class);
-                //Intent intent = new Intent(view.getContext(), TextResourceActivity.class);
-                //intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.licenses_txt);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.website_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), WebActivity.class);
-                //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/").build());
-                intent.setData(Uri.parse("http://www.i2p2.de/"));
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.faq_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), WebActivity.class);
-                //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/faq").build());
-                intent.setData(Uri.parse("http://www.i2p2.de/faq"));
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.welcome_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), WebActivity.class);
-                intent.putExtra(WebActivity.HTML_RESOURCE_ID, R.raw.welcome_html);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.addressbook_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), AddressbookActivity.class);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.logs_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), LogActivity.class);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.error_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), LogActivity.class);
-                intent.putExtra(LogActivity.ERRORS_ONLY, true);
-                startActivity(intent);
-            }
-        });
-
-        b = (Button) findViewById(R.id.peers_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                Intent intent = new Intent(view.getContext(), PeersActivity.class);
-                startActivity(intent);
-            }
-        });
-
-        /*
-         * hidden, unused b = (Button) findViewById(R.id.router_stop_button);
-         * b.setOnClickListener(new View.OnClickListener() { public void
-         * onClick(View view) { RouterService svc = _routerService; if (svc !=
-         * null && _isBound) { setPref(PREF_AUTO_START, false);
-         * svc.manualStop(); updateOneShot(); } } });
-         */
-
-        b = (Button) findViewById(R.id.router_start_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                _startPressed = true;
-                RouterService svc = _routerService;
-                if(svc != null && _isBound) {
-                    setPref(PREF_AUTO_START, true);
-                    svc.manualStart();
-                } else {
-                    (new File(_myDir, "wrapper.log")).delete();
-                    startRouter();
-                }
-                updateOneShot();
-            }
-        });
-
-        b = (Button) findViewById(R.id.router_quit_button);
-        b.setOnClickListener(new View.OnClickListener() {
-
-            public void onClick(View view) {
-                RouterService svc = _routerService;
-                if(svc != null && _isBound) {
-                    setPref(PREF_AUTO_START, false);
-                    svc.manualQuit();
-                    updateOneShot();
-                }
-            }
-        });
-
-        _handler = new Handler();
-        _updater = new Updater();
-        _oneShotUpdate = new OneShotUpdate();
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        _handler.removeCallbacks(_updater);
-        _handler.removeCallbacks(_oneShotUpdate);
-        if(_savedStatus != null) {
-            TextView tv = (TextView) findViewById(R.id.main_status_text);
-            tv.setText(_savedStatus);
+        setContentView(R.layout.activity_main);
+
+        mTitle = mDrawerTitle = getTitle();
+        mFragments = getResources().getStringArray(R.array.main_fragments);
+        mFragmentTitles = getResources().getStringArray(R.array.main_fragment_titles);
+        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+        mDrawerList = (ListView) findViewById(R.id.drawer);
+
+        // Set a custom shadow that overlays the main content when the drawer opens
+        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+        // Set the adapter for the list view
+        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
+                android.R.layout.simple_list_item_1, mFragments));
+        // Set the list's click listener
+        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
+
+        // Enable ActionBar app icon to behave as action to toggle nav drawer
+        //getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+        //getSupportActionBar().setHomeButtonEnabled(true);
+
+        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+                R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
+
+            /** Called when a drawer has settled in a completely closed state. */
+            public void onDrawerClosed(View view) {
+                getSupportActionBar().setTitle(mTitle);
+                supportInvalidateOptionsMenu();
+            }
+
+            /** Called when a drawer has settled in a completely open state. */
+            public void onDrawerOpened(View view) {
+                getSupportActionBar().setTitle(mDrawerTitle);
+                supportInvalidateOptionsMenu();
+            }
+        };
+
+        // Set the drawer toggle as the DrawerListener
+        mDrawerLayout.setDrawerListener(mDrawerToggle);
+
+        // Start with the home view
+        if (savedInstanceState == null) {
+            MainFragment mainFragment = new MainFragment();
+            mainFragment.setArguments(getIntent().getExtras());
+            getSupportFragmentManager().beginTransaction()
+                    .add(R.id.main_content, mainFragment).commit();
         }
-        checkDialog();
-        _handler.postDelayed(_updater, 100);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        _handler.removeCallbacks(_updater);
-        _handler.removeCallbacks(_oneShotUpdate);
     }
 
+    /* Called whenever we call invalidateOptionsMenu() */
     @Override
-    public void onResume() {
-        super.onResume();
-        updateOneShot();
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        // If the nav drawer is open, hide action items related to the content view
+        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
+        //menu.findItem(R.id.action_add_to_addressbook).setVisible(!drawerOpen);
+        return super.onPrepareOptionsMenu(menu);
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
-        if(_savedStatus != null) {
-            outState.putString("status", _savedStatus);
-        }
-        super.onSaveInstanceState(outState);
-    }
-
-    private void updateOneShot() {
-        _handler.postDelayed(_oneShotUpdate, 100);
-    }
-
-    private class OneShotUpdate implements Runnable {
-
-        public void run() {
-            updateVisibility();
-            updateStatus();
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // The action bar home/up action should open or close the drawer.
+        // ActionBarDrawerToggle will take care of this.
+        if(mDrawerToggle.onOptionsItemSelected(item)) {
+            return true;
         }
+        // Handle action buttons
+        return super.onOptionsItemSelected(item);
     }
 
-    private class Updater implements Runnable {
-
-        private int counter;
-        private final int delay = 1000;
-        private final int toloop = delay / 500;
-        public void run() {
-            updateVisibility();
-            if(counter++ % toloop == 0) {
-                updateStatus();
-            }
-            //_handler.postDelayed(this, 2500);
-            _handler.postDelayed(this, delay);
+    private class DrawerItemClickListener implements ListView.OnItemClickListener {
+        public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
+            selectItem(pos);
         }
     }
 
-    private void updateVisibility() {
-        RouterService svc = _routerService;
-        boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart())
-                && Util.isConnected(this);
-        Button start = (Button) findViewById(R.id.router_start_button);
-        start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE);
+    private void selectItem(int pos) {
+        Fragment fragment = Fragment.instantiate(MainActivity.this, mFragments[pos]);
 
-        boolean showStop = svc != null && _isBound && svc.canManualStop();
-        // Old stop but leave in memory. Always hide for now.
-        // Button stop = (Button) findViewById(R.id.router_stop_button);
-        // stop.setVisibility( /* showStop ? View.VISIBLE : */ View.INVISIBLE);
+        // Insert the fragment by replacing any existing fragment
+        FragmentManager fragmentManager = getSupportFragmentManager();
+        fragmentManager.beginTransaction()
+                       .replace(R.id.main_content, fragment)
+                       .commit();
 
-        Button quit = (Button) findViewById(R.id.router_quit_button);
-        quit.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE);
+        // Highlight the selected item, update the title, and close the drawer
+        mDrawerList.setItemChecked(pos, true);
+        setTitle(mFragmentTitles[pos]);
+        mDrawerLayout.closeDrawer(mDrawerList);
     }
 
     @Override
-    public void onBackPressed() {
-        RouterContext ctx = getRouterContext();
-        // RouterService svc = _routerService; Which is better to use?!
-        _keep = Util.isConnected(this) && (ctx != null || _startPressed);
-        Util.d("*********************************************************");
-        Util.d("Back pressed, Keep? " + _keep);
-        Util.d("*********************************************************");
-        super.onBackPressed();
+    public void setTitle(CharSequence title) {
+        mTitle = title;
+        getSupportActionBar().setTitle(mTitle);
     }
 
     @Override
-    public void onDestroy() {
-        super.onDestroy();
-        if(!_keep) {
-            Thread t = new Thread(new KillMe());
-            t.start();
-        }
-    }
-
-    private class KillMe implements Runnable {
-
-        public void run() {
-            Util.d("*********************************************************");
-            Util.d("KillMe started!");
-            Util.d("*********************************************************");
-            try {
-                Thread.sleep(500); // is 500ms long enough?
-            } catch(InterruptedException ex) {
-            }
-            System.exit(0);
-        }
-    }
-
-    private void updateStatus() {
-        RouterContext ctx = getRouterContext();
-        TextView tv = (TextView) findViewById(R.id.main_status_text);
-
-        if(!Util.isConnected(this)) {
-            tv.setText("Router version: " + _ourVersion + "\nNo Internet connection is available");
-            tv.setVisibility(View.VISIBLE);
-        } else if(ctx != null) {
-            if(_startPressed) {
-                _startPressed = false;
-            }
-            short reach = ctx.commSystem().getReachabilityStatus();
-            int active = ctx.commSystem().countActivePeers();
-            int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
-            int inEx = ctx.tunnelManager().getFreeTunnelCount();
-            int outEx = ctx.tunnelManager().getOutboundTunnelCount();
-            int inCl = ctx.tunnelManager().getInboundClientTunnelCount();
-            int outCl = ctx.tunnelManager().getOutboundClientTunnelCount();
-            int part = ctx.tunnelManager().getParticipatingCount();
-            double dLag = ctx.statManager().getRate("jobQueue.jobLag").getRate(60000).getAverageValue();
-            String jobLag = DataHelper.formatDuration((long) dLag);
-            String msgDelay = DataHelper.formatDuration(ctx.throttle().getMessageDelay());
-            String uptime = DataHelper.formatDuration(ctx.router().getUptime());
-
-            String netstatus = "Unknown";
-            if(reach == net.i2p.router.CommSystemFacade.STATUS_DIFFERENT) {
-                netstatus = "Different";
-            }
-            if(reach == net.i2p.router.CommSystemFacade.STATUS_HOSED) {
-                netstatus = "Hosed";
-            }
-            if(reach == net.i2p.router.CommSystemFacade.STATUS_OK) {
-                netstatus = "OK";
-            }
-            if(reach == net.i2p.router.CommSystemFacade.STATUS_REJECT_UNSOLICITED) {
-                netstatus = "Reject Unsolicited";
-            }
-            String tunnelStatus = ctx.throttle().getTunnelStatus();
-            //ctx.commSystem().getReachabilityStatus();
-            double inBW = ctx.bandwidthLimiter().getReceiveBps() / 1024;
-            double outBW = ctx.bandwidthLimiter().getSendBps() / 1024;
-
-            // control total width
-            DecimalFormat fmt;
-            if(inBW >= 1000 || outBW >= 1000) {
-                fmt = new DecimalFormat("#0");
-            } else if(inBW >= 100 || outBW >= 100) {
-                fmt = new DecimalFormat("#0.0");
-            } else {
-                fmt = new DecimalFormat("#0.00");
-            }
-
-            double kBytesIn = ctx.bandwidthLimiter().getTotalAllocatedInboundBytes() / 1024;
-            double kBytesOut = ctx.bandwidthLimiter().getTotalAllocatedOutboundBytes() / 1024;
-
-            // control total width
-            DecimalFormat kBfmt;
-            if(kBytesIn >= 1000 || kBytesOut >= 1000) {
-                kBfmt = new DecimalFormat("#0");
-            } else if(kBytesIn >= 100 || kBytesOut >= 100) {
-                kBfmt = new DecimalFormat("#0.0");
-            } else {
-                kBfmt = new DecimalFormat("#0.00");
-            }
-
-            String status =
-                    "ROUTER STATUS"
-                    + "\nNetwork: " + netstatus
-                    + "\nPeers active/known: " + active + " / " + known
-                    + "\nExploratory Tunnels in/out: " + inEx + " / " + outEx
-                    + "\nClient Tunnels in/out: " + inCl + " / " + outCl;
-
-
-            // Need to see if we have the participation option set to on.
-            // I thought there was a router method for that? I guess not! WHY NOT?
-            // It would be easier if we had a number to test status.
-            String participate = "\nParticipation: " + tunnelStatus +" (" + part + ")";
-
-            String details =
-                    "\nBandwidth in/out: " + fmt.format(inBW) + " / " + fmt.format(outBW) + " KBps"
-                    + "\nData usage in/out: " + kBfmt.format(kBytesIn) + " / " + kBfmt.format(kBytesOut) + " KB"
-                    + "\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())
-                    + "B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B'
-                    + "\nJob Lag: " + jobLag
-                    + "\nMsg Delay: " + msgDelay
-                    + "\nUptime: " + uptime;
-
-            _savedStatus = "Router version: " + _ourVersion + "\n" + status + participate + details;
-            tv.setText(_savedStatus);
-            tv.setVisibility(View.VISIBLE);
-        } else {
-            // network but no router context
-            tv.setText("Router version: " + _ourVersion + "\n");
-            //tv.setVisibility(View.INVISIBLE);
-            /**
-             * **
-             * RouterService svc = _routerService; String status = "connected? "
-             * + Util.isConnected(this) + "\nMemory: " +
-             * DataHelper.formatSize(Runtime.getRuntime().totalMemory() -
-             * Runtime.getRuntime().freeMemory()) + "B / " +
-             * DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' +
-             * "\nhave ctx? " + (ctx != null) + "\nhave svc? " + (svc != null) +
-             * "\nis bound? " + _isBound + "\nsvc state: " + (svc == null ?
-             * "null" : svc.getState()) + "\ncan start? " + (svc == null ?
-             * "null" : svc.canManualStart()) + "\ncan stop? " + (svc == null ?
-             * "null" : svc.canManualStop()); tv.setText(status);
-             * tv.setVisibility(View.VISIBLE);
-          ***
-             */
-        }
+    protected void onPostCreate(Bundle savedInstanceState) {
+        Util.i("Initializing...");
+        InitActivities init = new InitActivities(this);
+        init.debugStuff();
+        init.initialize();
+        super.onPostCreate(savedInstanceState);
+        // Sync the toggle state after onRestoreInstanceState has occurred.
+        mDrawerToggle.syncState();
     }
 
-    private void checkDialog() {
-        String oldVersion = getPref(PREF_INSTALLED_VERSION, "??");
-        if(oldVersion.equals("??")) {
-            showDialog(DIALOG_NEW_INSTALL);
-        } else {
-            String currentVersion = Util.getOurVersion(this);
-            if(!oldVersion.equals(currentVersion)) {
-                showDialog(DIALOG_NEW_VERSION);
-            }
-        }
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        // Pass any configuration change to the drawer toggle
+        mDrawerToggle.onConfigurationChanged(newConfig);
     }
 
     @Override
-    protected Dialog onCreateDialog(int id) {
-        final String currentVersion = Util.getOurVersion(this);
-        Dialog rv = null;
-        AlertDialog.Builder b = new AlertDialog.Builder(this);
-        switch(id) {
-            case DIALOG_NEW_INSTALL:
-                b.setMessage(getResources().getText(R.string.welcome_new_install)).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
-
-                    public void onClick(DialogInterface dialog, int id) {
-                        setPref(PREF_INSTALLED_VERSION, currentVersion);
-                        dialog.cancel();
-                        MainActivity.this.removeDialog(id);
-                    }
-                }).setNeutralButton("Release Notes", new DialogInterface.OnClickListener() {
-
-                    public void onClick(DialogInterface dialog, int id) {
-                        setPref(PREF_INSTALLED_VERSION, currentVersion);
-                        dialog.cancel();
-                        MainActivity.this.removeDialog(id);
-                        Intent intent = new Intent(MainActivity.this, TextResourceActivity.class);
-                        intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
-                        startActivity(intent);
-                    }
-                }).setNegativeButton("Licenses", new DialogInterface.OnClickListener() {
-
-                    public void onClick(DialogInterface dialog, int id) {
-                        setPref(PREF_INSTALLED_VERSION, currentVersion);
-                        dialog.cancel();
-                        MainActivity.this.removeDialog(id);
-                        Intent intent = new Intent(MainActivity.this, LicenseActivity.class);
-                        startActivity(intent);
-                    }
-                });
-                rv = b.create();
-                break;
-
-            case DIALOG_NEW_VERSION:
-                b.setMessage(getResources().getText(R.string.welcome_new_version) + " " + currentVersion).setCancelable(true).setPositiveButton("OK", new DialogInterface.OnClickListener() {
-
-                    public void onClick(DialogInterface dialog, int id) {
-                        setPref(PREF_INSTALLED_VERSION, currentVersion);
-                        try {
-                            dialog.dismiss();
-                        } catch(Exception e) {
-                        }
-                        MainActivity.this.removeDialog(id);
-                    }
-                }).setNegativeButton("Release Notes", new DialogInterface.OnClickListener() {
-
-                    public void onClick(DialogInterface dialog, int id) {
-                        setPref(PREF_INSTALLED_VERSION, currentVersion);
-                        try {
-                            dialog.dismiss();
-                        } catch(Exception e) {
-                        }
-                        MainActivity.this.removeDialog(id);
-                        Intent intent = new Intent(MainActivity.this, TextResourceActivity.class);
-                        intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
-                        startActivity(intent);
-                    }
-                });
-
-                rv = b.create();
-                break;
+    public void onBackPressed() {
+        I2PFragmentBase fragment = (I2PFragmentBase) getSupportFragmentManager().findFragmentById(R.id.main_content);
+        // If we shouldn't stay on this fragment, go back.
+        if (!fragment.onBackPressed()) {
+            super.onBackPressed();
         }
-        return rv;
     }
 }
diff --git a/src/net/i2p/android/router/activity/MainFragment.java b/src/net/i2p/android/router/activity/MainFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..40b1b979ec736c7121d5e7e7f8d14b449cb71940
--- /dev/null
+++ b/src/net/i2p/android/router/activity/MainFragment.java
@@ -0,0 +1,507 @@
+package net.i2p.android.router.activity;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+import java.io.File;
+import java.text.DecimalFormat;
+import net.i2p.android.router.R;
+import net.i2p.android.router.service.RouterService;
+import net.i2p.android.router.util.Util;
+import net.i2p.data.DataHelper;
+import net.i2p.router.RouterContext;
+
+public class MainFragment extends I2PFragmentBase {
+
+    private Handler _handler;
+    private Runnable _updater;
+    private Runnable _oneShotUpdate;
+    private String _savedStatus;
+    private String _ourVersion;
+    private boolean _keep = true;
+    private boolean _startPressed = false;
+    protected static final String PROP_NEW_INSTALL = "i2p.newInstall";
+    protected static final String PROP_NEW_VERSION = "i2p.newVersion";
+    protected static final int DIALOG_NEW_INSTALL = 0;
+    protected static final int DIALOG_NEW_VERSION = 1;
+
+    /**
+     * Called when the fragment is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // Init stuff here so settings work.
+        _myDir = getActivity().getFilesDir().getAbsolutePath();
+        if(savedInstanceState != null) {
+            String saved = savedInstanceState.getString("status");
+            if(saved != null) {
+                _savedStatus = saved;
+            }
+        }
+        _ourVersion = Util.getOurVersion(getActivity());
+
+        _keep = true;
+
+        _handler = new Handler();
+        _updater = new Updater();
+        _oneShotUpdate = new OneShotUpdate();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View v = inflater.inflate(R.layout.fragment_main, container, false);
+
+        Button b = (Button) v.findViewById(R.id.news_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), NewsFragment.class);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.releasenotes_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), TextResourceFragment.class);
+                intent.putExtra(TextResourceFragment.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.licenses_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), LicenseActivity.class);
+                //Intent intent = new Intent(view.getContext(), TextResourceActivity.class);
+                //intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.licenses_txt);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.website_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), WebFragment.class);
+                //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/").build());
+                intent.setData(Uri.parse("http://www.i2p2.de/"));
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.faq_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), WebFragment.class);
+                //intent.setData((new Uri.Builder()).scheme("http").authority("www.i2p2.de").path("/faq").build());
+                intent.setData(Uri.parse("http://www.i2p2.de/faq"));
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.welcome_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), WebFragment.class);
+                intent.putExtra(WebFragment.HTML_RESOURCE_ID, R.raw.welcome_html);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.addressbook_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), AddressbookActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.logs_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), LogActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.error_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), LogActivity.class);
+                intent.putExtra(LogActivity.ERRORS_ONLY, true);
+                startActivity(intent);
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.peers_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                Intent intent = new Intent(view.getContext(), PeersFragment.class);
+                startActivity(intent);
+            }
+        });
+
+        /*
+         * hidden, unused b = (Button) v.findViewById(R.id.router_stop_button);
+         * b.setOnClickListener(new View.OnClickListener() { public void
+         * onClick(View view) { RouterService svc = _routerService; if (svc !=
+         * null && _isBound) { setPref(PREF_AUTO_START, false);
+         * svc.manualStop(); updateOneShot(); } } });
+         */
+
+        b = (Button) v.findViewById(R.id.router_start_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                _startPressed = true;
+                RouterService svc = _routerService;
+                if(svc != null && _isBound) {
+                    setPref(PREF_AUTO_START, true);
+                    svc.manualStart();
+                } else {
+                    (new File(_myDir, "wrapper.log")).delete();
+                    startRouter();
+                }
+                updateOneShot();
+            }
+        });
+
+        b = (Button) v.findViewById(R.id.router_quit_button);
+        b.setOnClickListener(new View.OnClickListener() {
+
+            public void onClick(View view) {
+                RouterService svc = _routerService;
+                if(svc != null && _isBound) {
+                    setPref(PREF_AUTO_START, false);
+                    svc.manualQuit();
+                    updateOneShot();
+                }
+            }
+        });
+
+        return v;
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        _handler.removeCallbacks(_updater);
+        _handler.removeCallbacks(_oneShotUpdate);
+        if(_savedStatus != null) {
+            TextView tv = (TextView) getActivity().findViewById(R.id.main_status_text);
+            tv.setText(_savedStatus);
+        }
+        checkDialog();
+        _handler.postDelayed(_updater, 100);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        _handler.removeCallbacks(_updater);
+        _handler.removeCallbacks(_oneShotUpdate);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        updateOneShot();
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        if(_savedStatus != null) {
+            outState.putString("status", _savedStatus);
+        }
+        super.onSaveInstanceState(outState);
+    }
+
+    private void updateOneShot() {
+        _handler.postDelayed(_oneShotUpdate, 100);
+    }
+
+    private class OneShotUpdate implements Runnable {
+
+        public void run() {
+            updateVisibility();
+            updateStatus();
+        }
+    }
+
+    private class Updater implements Runnable {
+
+        private int counter;
+        private final int delay = 1000;
+        private final int toloop = delay / 500;
+        public void run() {
+            updateVisibility();
+            if(counter++ % toloop == 0) {
+                updateStatus();
+            }
+            //_handler.postDelayed(this, 2500);
+            _handler.postDelayed(this, delay);
+        }
+    }
+
+    private void updateVisibility() {
+        RouterService svc = _routerService;
+        boolean showStart = ((svc == null) || (!_isBound) || svc.canManualStart())
+                && Util.isConnected(getActivity());
+        Button start = (Button) getActivity().findViewById(R.id.router_start_button);
+        start.setVisibility(showStart ? View.VISIBLE : View.INVISIBLE);
+
+        boolean showStop = svc != null && _isBound && svc.canManualStop();
+        // Old stop but leave in memory. Always hide for now.
+        // Button stop = (Button) findViewById(R.id.router_stop_button);
+        // stop.setVisibility( /* showStop ? View.VISIBLE : */ View.INVISIBLE);
+
+        Button quit = (Button) getActivity().findViewById(R.id.router_quit_button);
+        quit.setVisibility(showStop ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    public boolean onBackPressed() {
+        RouterContext ctx = getRouterContext();
+        // RouterService svc = _routerService; Which is better to use?!
+        _keep = Util.isConnected(getActivity()) && (ctx != null || _startPressed);
+        Util.d("*********************************************************");
+        Util.d("Back pressed, Keep? " + _keep);
+        Util.d("*********************************************************");
+        return false;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if(!_keep) {
+            Thread t = new Thread(new KillMe());
+            t.start();
+        }
+    }
+
+    private class KillMe implements Runnable {
+
+        public void run() {
+            Util.d("*********************************************************");
+            Util.d("KillMe started!");
+            Util.d("*********************************************************");
+            try {
+                Thread.sleep(500); // is 500ms long enough?
+            } catch(InterruptedException ex) {
+            }
+            System.exit(0);
+        }
+    }
+
+    private void updateStatus() {
+        RouterContext ctx = getRouterContext();
+        TextView tv = (TextView) getActivity().findViewById(R.id.main_status_text);
+
+        if(!Util.isConnected(getActivity())) {
+            tv.setText("Router version: " + _ourVersion + "\nNo Internet connection is available");
+            tv.setVisibility(View.VISIBLE);
+        } else if(ctx != null) {
+            if(_startPressed) {
+                _startPressed = false;
+            }
+            short reach = ctx.commSystem().getReachabilityStatus();
+            int active = ctx.commSystem().countActivePeers();
+            int known = Math.max(ctx.netDb().getKnownRouters() - 1, 0);
+            int inEx = ctx.tunnelManager().getFreeTunnelCount();
+            int outEx = ctx.tunnelManager().getOutboundTunnelCount();
+            int inCl = ctx.tunnelManager().getInboundClientTunnelCount();
+            int outCl = ctx.tunnelManager().getOutboundClientTunnelCount();
+            int part = ctx.tunnelManager().getParticipatingCount();
+            double dLag = ctx.statManager().getRate("jobQueue.jobLag").getRate(60000).getAverageValue();
+            String jobLag = DataHelper.formatDuration((long) dLag);
+            String msgDelay = DataHelper.formatDuration(ctx.throttle().getMessageDelay());
+            String uptime = DataHelper.formatDuration(ctx.router().getUptime());
+
+            String netstatus = "Unknown";
+            if(reach == net.i2p.router.CommSystemFacade.STATUS_DIFFERENT) {
+                netstatus = "Different";
+            }
+            if(reach == net.i2p.router.CommSystemFacade.STATUS_HOSED) {
+                netstatus = "Hosed";
+            }
+            if(reach == net.i2p.router.CommSystemFacade.STATUS_OK) {
+                netstatus = "OK";
+            }
+            if(reach == net.i2p.router.CommSystemFacade.STATUS_REJECT_UNSOLICITED) {
+                netstatus = "Reject Unsolicited";
+            }
+            String tunnelStatus = ctx.throttle().getTunnelStatus();
+            //ctx.commSystem().getReachabilityStatus();
+            double inBW = ctx.bandwidthLimiter().getReceiveBps() / 1024;
+            double outBW = ctx.bandwidthLimiter().getSendBps() / 1024;
+
+            // control total width
+            DecimalFormat fmt;
+            if(inBW >= 1000 || outBW >= 1000) {
+                fmt = new DecimalFormat("#0");
+            } else if(inBW >= 100 || outBW >= 100) {
+                fmt = new DecimalFormat("#0.0");
+            } else {
+                fmt = new DecimalFormat("#0.00");
+            }
+
+            double kBytesIn = ctx.bandwidthLimiter().getTotalAllocatedInboundBytes() / 1024;
+            double kBytesOut = ctx.bandwidthLimiter().getTotalAllocatedOutboundBytes() / 1024;
+
+            // control total width
+            DecimalFormat kBfmt;
+            if(kBytesIn >= 1000 || kBytesOut >= 1000) {
+                kBfmt = new DecimalFormat("#0");
+            } else if(kBytesIn >= 100 || kBytesOut >= 100) {
+                kBfmt = new DecimalFormat("#0.0");
+            } else {
+                kBfmt = new DecimalFormat("#0.00");
+            }
+
+            String status =
+                    "ROUTER STATUS"
+                    + "\nNetwork: " + netstatus
+                    + "\nPeers active/known: " + active + " / " + known
+                    + "\nExploratory Tunnels in/out: " + inEx + " / " + outEx
+                    + "\nClient Tunnels in/out: " + inCl + " / " + outCl;
+
+
+            // Need to see if we have the participation option set to on.
+            // I thought there was a router method for that? I guess not! WHY NOT?
+            // It would be easier if we had a number to test status.
+            String participate = "\nParticipation: " + tunnelStatus +" (" + part + ")";
+
+            String details =
+                    "\nBandwidth in/out: " + fmt.format(inBW) + " / " + fmt.format(outBW) + " KBps"
+                    + "\nData usage in/out: " + kBfmt.format(kBytesIn) + " / " + kBfmt.format(kBytesOut) + " KB"
+                    + "\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())
+                    + "B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B'
+                    + "\nJob Lag: " + jobLag
+                    + "\nMsg Delay: " + msgDelay
+                    + "\nUptime: " + uptime;
+
+            _savedStatus = "Router version: " + _ourVersion + "\n" + status + participate + details;
+            tv.setText(_savedStatus);
+            tv.setVisibility(View.VISIBLE);
+        } else {
+            // network but no router context
+            tv.setText("Router version: " + _ourVersion + "\n");
+            //tv.setVisibility(View.INVISIBLE);
+            /**
+             * **
+             * RouterService svc = _routerService; String status = "connected? "
+             * + Util.isConnected(this) + "\nMemory: " +
+             * DataHelper.formatSize(Runtime.getRuntime().totalMemory() -
+             * Runtime.getRuntime().freeMemory()) + "B / " +
+             * DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' +
+             * "\nhave ctx? " + (ctx != null) + "\nhave svc? " + (svc != null) +
+             * "\nis bound? " + _isBound + "\nsvc state: " + (svc == null ?
+             * "null" : svc.getState()) + "\ncan start? " + (svc == null ?
+             * "null" : svc.canManualStart()) + "\ncan stop? " + (svc == null ?
+             * "null" : svc.canManualStop()); tv.setText(status);
+             * tv.setVisibility(View.VISIBLE);
+          ***
+             */
+        }
+    }
+
+    private void checkDialog() {
+        String oldVersion = getPref(PREF_INSTALLED_VERSION, "??");
+        /*if(oldVersion.equals("??")) {
+            getActivity().showDialog(DIALOG_NEW_INSTALL);
+        } else {
+            String currentVersion = Util.getOurVersion(getActivity());
+            if(!oldVersion.equals(currentVersion)) {
+                getActivity().showDialog(DIALOG_NEW_VERSION);
+            }
+        }*/
+    }
+
+    /*@Override
+    protected Dialog onCreateDialog(int id) {
+        final String currentVersion = Util.getOurVersion(this);
+        Dialog rv = null;
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        switch(id) {
+            case DIALOG_NEW_INSTALL:
+                b.setMessage(getResources().getText(R.string.welcome_new_install)).setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
+
+                    public void onClick(DialogInterface dialog, int id) {
+                        setPref(PREF_INSTALLED_VERSION, currentVersion);
+                        dialog.cancel();
+                        MainActivity.this.removeDialog(id);
+                    }
+                }).setNeutralButton("Release Notes", new DialogInterface.OnClickListener() {
+
+                    public void onClick(DialogInterface dialog, int id) {
+                        setPref(PREF_INSTALLED_VERSION, currentVersion);
+                        dialog.cancel();
+                        MainActivity.this.removeDialog(id);
+                        Intent intent = new Intent(MainActivity.this, TextResourceActivity.class);
+                        intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
+                        startActivity(intent);
+                    }
+                }).setNegativeButton("Licenses", new DialogInterface.OnClickListener() {
+
+                    public void onClick(DialogInterface dialog, int id) {
+                        setPref(PREF_INSTALLED_VERSION, currentVersion);
+                        dialog.cancel();
+                        MainActivity.this.removeDialog(id);
+                        Intent intent = new Intent(MainActivity.this, LicenseActivity.class);
+                        startActivity(intent);
+                    }
+                });
+                rv = b.create();
+                break;
+
+            case DIALOG_NEW_VERSION:
+                b.setMessage(getResources().getText(R.string.welcome_new_version) + " " + currentVersion).setCancelable(true).setPositiveButton("OK", new DialogInterface.OnClickListener() {
+
+                    public void onClick(DialogInterface dialog, int id) {
+                        setPref(PREF_INSTALLED_VERSION, currentVersion);
+                        try {
+                            dialog.dismiss();
+                        } catch(Exception e) {
+                        }
+                        MainActivity.this.removeDialog(id);
+                    }
+                }).setNegativeButton("Release Notes", new DialogInterface.OnClickListener() {
+
+                    public void onClick(DialogInterface dialog, int id) {
+                        setPref(PREF_INSTALLED_VERSION, currentVersion);
+                        try {
+                            dialog.dismiss();
+                        } catch(Exception e) {
+                        }
+                        MainActivity.this.removeDialog(id);
+                        Intent intent = new Intent(MainActivity.this, TextResourceActivity.class);
+                        intent.putExtra(TextResourceActivity.TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
+                        startActivity(intent);
+                    }
+                });
+
+                rv = b.create();
+                break;
+        }
+        return rv;
+    }*/
+}
diff --git a/src/net/i2p/android/router/activity/NewsActivity.java b/src/net/i2p/android/router/activity/NewsFragment.java
similarity index 76%
rename from src/net/i2p/android/router/activity/NewsActivity.java
rename to src/net/i2p/android/router/activity/NewsFragment.java
index efe1ffdd5f32d12cb1e94154055d0db26e273243..a744c350de72b8d370ba403445abdcebfa0a93a2 100644
--- a/src/net/i2p/android/router/activity/NewsActivity.java
+++ b/src/net/i2p/android/router/activity/NewsFragment.java
@@ -3,6 +3,9 @@ package net.i2p.android.router.activity;
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 import android.webkit.WebView;
 import android.widget.TextView;
 import java.io.ByteArrayOutputStream;
@@ -14,7 +17,7 @@ import java.io.UnsupportedEncodingException;
 import net.i2p.android.apps.NewsFetcher;
 import net.i2p.android.router.R;
 
-public class NewsActivity extends I2PActivityBase {
+public class NewsFragment extends I2PFragmentBase {
 
     private I2PWebViewClient _wvClient;
     private long _lastChanged;
@@ -29,17 +32,18 @@ public class NewsActivity extends I2PActivityBase {
     private static final String FOOTER = "</body></html>";
 
     @Override
-    public void onCreate(Bundle savedInstanceState)
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState)
     {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.news);
-        WebView wv = (WebView) findViewById(R.id.news_webview);
+        View v = inflater.inflate(R.layout.news, container, false);
+        WebView wv = (WebView) v.findViewById(R.id.news_webview);
         wv.getSettings().setLoadsImagesAutomatically(false);
         // http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855
         wv.getSettings().setUseWideViewPort(true);
-        _wvClient = new I2PWebViewClient(this);
+        _wvClient = new I2PWebViewClient();
         wv.setWebViewClient(_wvClient);
         wv.getSettings().setBuiltInZoomControls(true);
+        return v;
     }
 
     @Override
@@ -49,7 +53,7 @@ public class NewsActivity extends I2PActivityBase {
         NewsFetcher nf = NewsFetcher.getInstance();
         if (nf != null) {
             // always update the text
-            TextView tv = (TextView) findViewById(R.id.news_status);
+            TextView tv = (TextView) getActivity().findViewById(R.id.news_status);
             tv.setText(WARNING + nf.status().replace("&nbsp;", " "));
         }
 
@@ -60,7 +64,7 @@ public class NewsActivity extends I2PActivityBase {
             return;
         _lastChanged = System.currentTimeMillis();
 
-        WebView wv = (WebView) findViewById(R.id.news_webview);
+        WebView wv = (WebView) getActivity().findViewById(R.id.news_webview);
 
         InputStream in = null;
         ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
@@ -94,16 +98,14 @@ public class NewsActivity extends I2PActivityBase {
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        WebView wv = (WebView) findViewById(R.id.news_webview);
-        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
-            _wvClient.cancelAll();
-            wv.stopLoading();
-            if (wv.canGoBack()) {
-                wv.goBack();
-                return true;
-            }
+    public boolean onBackPressed() {
+        WebView wv = (WebView) getActivity().findViewById(R.id.news_webview);
+        _wvClient.cancelAll();
+        wv.stopLoading();
+        if (wv.canGoBack()) {
+            wv.goBack();
+            return true;
         }
-        return super.onKeyDown(keyCode, event);
+        return false;
     }
 }
diff --git a/src/net/i2p/android/router/activity/PeersActivity.java b/src/net/i2p/android/router/activity/PeersFragment.java
similarity index 71%
rename from src/net/i2p/android/router/activity/PeersActivity.java
rename to src/net/i2p/android/router/activity/PeersFragment.java
index 395ec02802a33f415eacc39fcd88f4eee74f5f48..83be6bbaad427a1b647dc21dbf77ed2607f66d9d 100644
--- a/src/net/i2p/android/router/activity/PeersActivity.java
+++ b/src/net/i2p/android/router/activity/PeersFragment.java
@@ -2,7 +2,10 @@ package net.i2p.android.router.activity;
 
 import android.os.Bundle;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
 import android.webkit.WebView;
 import java.io.IOException;
 import java.io.StringWriter;
@@ -11,7 +14,7 @@ import net.i2p.android.router.service.RouterService;
 import net.i2p.android.router.util.Util;
 import net.i2p.router.CommSystemFacade;
 
-public class PeersActivity extends I2PActivityBase {
+public class PeersFragment extends I2PFragmentBase {
 
     private I2PWebViewClient _wvClient;
 
@@ -20,17 +23,18 @@ public class PeersActivity extends I2PActivityBase {
     private static final String FOOTER = "</body></html>";
 
     @Override
-    public void onCreate(Bundle savedInstanceState)
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState)
     {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.peers);
-        WebView wv = (WebView) findViewById(R.id.peers_webview);
+        View v = inflater.inflate(R.layout.peers, container, false);
+        WebView wv = (WebView) v.findViewById(R.id.peers_webview);
         wv.getSettings().setLoadsImagesAutomatically(true); // was false
         // http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855
         wv.getSettings().setUseWideViewPort(true);
-        _wvClient = new I2PWebViewClient(this);
+        _wvClient = new I2PWebViewClient();
         wv.setWebViewClient(_wvClient);
         wv.getSettings().setBuiltInZoomControls(true);
+        return v;
     }
 
     @Override
@@ -49,7 +53,7 @@ public class PeersActivity extends I2PActivityBase {
     }
 
     private void update() {
-        WebView wv = (WebView) findViewById(R.id.peers_webview);
+        WebView wv = (WebView) getActivity().findViewById(R.id.peers_webview);
         wv.clearHistory(); // fixes having to hit back.
         CommSystemFacade comm = getCommSystem();
         String data;
@@ -77,25 +81,23 @@ public class PeersActivity extends I2PActivityBase {
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        WebView wv = (WebView) findViewById(R.id.peers_webview);
-        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
-            _wvClient.cancelAll();
-            wv.stopLoading();
+    public boolean onBackPressed() {
+        WebView wv = (WebView) getActivity().findViewById(R.id.peers_webview);
+        _wvClient.cancelAll();
+        wv.stopLoading();
 
-            // We do not want to go back, or keep history... Theere is no need to.
-            // What we DO want to do is exit!
-            //if (wv.canGoBack()) {
-            //    wv.goBack();
-            //    return true;
-            //}
-        }
-        return super.onKeyDown(keyCode, event);
+        // We do not want to go back, or keep history... There is no need to.
+        // What we DO want to do is exit!
+        //if (wv.canGoBack()) {
+        //    wv.goBack();
+        //    return true;
+        //}
+        return false;
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        WebView wv = (WebView) findViewById(R.id.peers_webview);
+        WebView wv = (WebView) getActivity().findViewById(R.id.peers_webview);
         switch (item.getItemId()) {
         case R.id.menu_reload:
             update();
diff --git a/src/net/i2p/android/router/activity/TextResourceActivity.java b/src/net/i2p/android/router/activity/TextResourceFragment.java
similarity index 77%
rename from src/net/i2p/android/router/activity/TextResourceActivity.java
rename to src/net/i2p/android/router/activity/TextResourceFragment.java
index b9c2ed33d1d7050ee6177c727b7e8edd6fcd08d4..6bd00c21768d1d463b3ff5ff891ba053639e4235 100644
--- a/src/net/i2p/android/router/activity/TextResourceActivity.java
+++ b/src/net/i2p/android/router/activity/TextResourceFragment.java
@@ -4,6 +4,9 @@ import android.content.Intent;
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.text.method.ScrollingMovementMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 import android.widget.TextView;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -16,24 +19,25 @@ 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 TextResourceActivity extends I2PActivityBase {
+public class TextResourceFragment extends I2PFragmentBase {
 
     final static String TEXT_RESOURCE_ID = "text_resource_id";
 
     @Override
-    public void onCreate(Bundle savedInstanceState)
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState)
     {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.text_resource);
-        TextView tv = (TextView) findViewById(R.id.text_resource_text);
+        View v = inflater.inflate(R.layout.text_resource, container, false);
+        TextView tv = (TextView) v.findViewById(R.id.text_resource_text);
         tv.setMovementMethod(ScrollingMovementMethod.getInstance());
-        Intent intent = getIntent();
+        Intent intent = getActivity().getIntent();
         int id = intent.getIntExtra(TEXT_RESOURCE_ID, R.raw.releasenotes_txt);
         if (id == R.raw.releasenotes_txt)
-            tv.setText("Release Notes for Release " + Util.getOurVersion(this) + "\n\n" +
+            tv.setText("Release Notes for Release " + Util.getOurVersion(getActivity()) + "\n\n" +
                        getResourceAsString(id));
         else
             tv.setText(getResourceAsString(id));
+        return v;
     }
 
     private String getResourceAsString(int id) {
diff --git a/src/net/i2p/android/router/activity/WebActivity.java b/src/net/i2p/android/router/activity/WebFragment.java
similarity index 75%
rename from src/net/i2p/android/router/activity/WebActivity.java
rename to src/net/i2p/android/router/activity/WebFragment.java
index b1953ff1ffffdfa6c176544faa3417fac58a10b1..0b6f04b2a8fecb462965245cfd4f1a409c75f28c 100644
--- a/src/net/i2p/android/router/activity/WebActivity.java
+++ b/src/net/i2p/android/router/activity/WebFragment.java
@@ -5,7 +5,10 @@ import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
 import android.webkit.WebView;
 import android.widget.TextView;
 import java.io.ByteArrayOutputStream;
@@ -14,7 +17,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import net.i2p.android.router.R;
 
-public class WebActivity extends I2PActivityBase {
+public class WebFragment extends I2PFragmentBase {
 
     private I2PWebViewClient _wvClient;
 
@@ -24,19 +27,19 @@ public class WebActivity extends I2PActivityBase {
                "not anonymous. I2P pages may not load images or CSS.";
 
     @Override
-    public void onCreate(Bundle savedInstanceState)
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState)
     {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.web);
-        TextView tv = (TextView) findViewById(R.id.browser_status);
+        View v = inflater.inflate(R.layout.web, container, false);
+        TextView tv = (TextView) v.findViewById(R.id.browser_status);
         tv.setText(WARNING);
-        WebView wv = (WebView) findViewById(R.id.browser_webview);
-        _wvClient = new I2PWebViewClient(this);
+        WebView wv = (WebView) v.findViewById(R.id.browser_webview);
+        _wvClient = new I2PWebViewClient();
         wv.setWebViewClient(_wvClient);
         wv.getSettings().setBuiltInZoomControls(true);
         // http://stackoverflow.com/questions/2369310/webview-double-tap-zoom-not-working-on-a-motorola-droid-a855
         wv.getSettings().setUseWideViewPort(true);
-        Intent intent = getIntent();
+        Intent intent = getActivity().getIntent();
         Uri uri = intent.getData();
         if (uri != null) {
             //wv.getSettings().setLoadsImagesAutomatically(true);
@@ -50,6 +53,7 @@ public class WebActivity extends I2PActivityBase {
             if (id != 0)
                 loadResource(wv, id);
         }
+        return v;
     }
 
     private void loadResource(WebView wv, int id) {
@@ -77,24 +81,22 @@ public class WebActivity extends I2PActivityBase {
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        WebView wv = (WebView) findViewById(R.id.browser_webview);
-        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
-            _wvClient.cancelAll();
-            wv.stopLoading();
-            if (wv.canGoBack()) {
-                // TODO go into history, get url and call shouldOverrideUrlLoading()
-                // so we have control ??? But then back won't work right
-                wv.goBack();
-                return true;
-            }
+    public boolean onBackPressed() {
+        WebView wv = (WebView) getActivity().findViewById(R.id.browser_webview);
+        _wvClient.cancelAll();
+        wv.stopLoading();
+        if (wv.canGoBack()) {
+            // TODO go into history, get url and call shouldOverrideUrlLoading()
+            // so we have control ??? But then back won't work right
+            wv.goBack();
+            return true;
         }
-        return super.onKeyDown(keyCode, event);
+        return false;
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        WebView wv = (WebView) findViewById(R.id.browser_webview);
+        WebView wv = (WebView) getActivity().findViewById(R.id.browser_webview);
         switch (item.getItemId()) {
         case R.id.menu_reload:
             _wvClient.cancelAll();