diff --git a/AndroidManifest.xml.in b/AndroidManifest.xml.in
index 5a61453c60641cd164784455455a01b1eabc9cab..a4919d21c6c99e8bc36a36ea25aa12355b99e8ea 100644
--- a/AndroidManifest.xml.in
+++ b/AndroidManifest.xml.in
@@ -19,7 +19,7 @@
                   android:icon="@drawable/ic_launcher_itoopie" />
         <provider android:name=".provider.CacheProvider"
                   android:authorities="net.i2p.android.router" />
-        <activity android:name=".activity.MainActivity"
+        <activity android:name=".MainActivity"
                   android:label="@string/app_name"
                   android:icon="@drawable/ic_launcher_itoopie"
                   android:launchMode="singleTop" >
@@ -28,19 +28,19 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".activity.NewsActivity"
+        <activity android:name=".NewsActivity"
                   android:label="I2P News"
                   android:configChanges="orientation|keyboardHidden" >
         </activity>
-        <activity android:name=".activity.HelpActivity"
+        <activity android:name=".HelpActivity"
                   android:label="Help"
-                  android:parentActivityName=".activity.MainActivity" >
+                  android:parentActivityName=".MainActivity" >
         </activity>
-        <activity android:name=".activity.LicenseActivity"
+        <activity android:name=".LicenseActivity"
                   android:label="I2P License Information"
-                  android:parentActivityName=".activity.HelpActivity" >
+                  android:parentActivityName=".HelpActivity" >
         </activity>
-        <activity android:name=".activity.WebActivity"
+        <activity android:name=".web.WebActivity"
                   android:label="I2P Web Browser"
                   android:configChanges="orientation|keyboardHidden" >
             <intent-filter>
@@ -50,16 +50,16 @@
                 <data android:host="*.i2p" android:scheme="http" />
             </intent-filter>
         </activity>
-        <activity android:name=".activity.SettingsActivity"
+        <activity android:name=".SettingsActivity"
                   android:label="I2P Settings"
-                  android:parentActivityName=".activity.MainActivity" >
+                  android:parentActivityName=".MainActivity" >
         </activity>
-        <activity android:name=".activity.AddressbookSettingsActivity"
+        <activity android:name=".addressbook.AddressbookSettingsActivity"
                   android:label="I2P Addressbook Settings"
-                  android:parentActivityName=".activity.AddressbookActivity"
+                  android:parentActivityName=".addressbook.AddressbookActivity"
                   android:launchMode="singleTop" >
         </activity>
-        <activity android:name=".activity.AddressbookActivity"
+        <activity android:name=".addressbook.AddressbookActivity"
                   android:label="Addressbook"
                   android:launchMode="singleTop" >
             <intent-filter>
@@ -72,46 +72,46 @@
             <meta-data android:name="android.app.searchable"
                        android:resource="@xml/searchable_addressbook"/>
         </activity>
-        <activity android:name=".activity.AddressbookAddWizardActivity"
+        <activity android:name=".addressbook.AddressbookAddWizardActivity"
                   android:label="Add new Destination"
-                  android:parentActivityName=".activity.AddressbookActivity" >
+                  android:parentActivityName=".addressbook.AddressbookActivity" >
         </activity>
-        <activity android:name="net.i2p.android.i2ptunnel.activity.TunnelListActivity"
+        <activity android:name="net.i2p.android.i2ptunnel.TunnelListActivity"
                   android:label="I2PTunnel"
                   android:launchMode="singleTop" >
         </activity>
-        <activity android:name="net.i2p.android.i2ptunnel.activity.TunnelDetailActivity"
+        <activity android:name="net.i2p.android.i2ptunnel.TunnelDetailActivity"
                   android:label="I2PTunnel"
-                  android:parentActivityName="net.i2p.android.i2ptunnel.activity.TunnelListActivity" >
+                  android:parentActivityName="net.i2p.android.i2ptunnel.TunnelListActivity" >
         </activity>
-        <activity android:name="net.i2p.android.i2ptunnel.activity.TunnelWizardActivity"
+        <activity android:name="net.i2p.android.i2ptunnel.TunnelWizardActivity"
                   android:label="Tunnel Creation Wizard"
-                  android:parentActivityName="net.i2p.android.i2ptunnel.activity.TunnelListActivity" >
+                  android:parentActivityName="net.i2p.android.i2ptunnel.TunnelListActivity" >
         </activity>
-        <activity android:name=".activity.LogActivity"
+        <activity android:name=".log.LogActivity"
                   android:label="I2P Logs"
-                  android:parentActivityName=".activity.MainActivity" >
+                  android:parentActivityName=".MainActivity" >
         </activity>
-        <activity android:name=".activity.LogDetailActivity"
+        <activity android:name=".log.LogDetailActivity"
                   android:label="Log Entry"
-                  android:parentActivityName=".activity.LogActivity" >
+                  android:parentActivityName=".log.LogActivity" >
         </activity>
-        <activity android:name=".activity.RateGraphActivity"
+        <activity android:name=".stats.RateGraphActivity"
                   android:label="Rate Graph"
-                  android:parentActivityName=".activity.MainActivity" >
+                  android:parentActivityName=".MainActivity" >
         </activity>
-        <activity android:name=".activity.PeersActivity"
+        <activity android:name=".stats.PeersActivity"
                   android:label="I2P Peers and Transport Status"
                   android:configChanges="orientation|keyboardHidden"
                   android:launchMode="singleTop" >
         </activity>
-        <activity android:name=".activity.NetDbActivity"
+        <activity android:name=".netdb.NetDbActivity"
                   android:label="NetDB"
-                  android:parentActivityName=".activity.MainActivity" >
+                  android:parentActivityName=".MainActivity" >
         </activity>
-        <activity android:name=".activity.NetDbDetailActivity"
+        <activity android:name=".netdb.NetDbDetailActivity"
                   android:label="NetDB Detail"
-                  android:parentActivityName=".activity.NetDbActivity" >
+                  android:parentActivityName=".netdb.NetDbActivity" >
         </activity>
     </application>
 </manifest>
diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml
index 48268ff97e8220100fcde25ebf7c0fe47acd23f2..0c66f647b17fb250d95a095965c0a05fc17b4db6 100644
--- a/res/xml/settings_headers.xml
+++ b/res/xml/settings_headers.xml
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
     <header
-        android:fragment="net.i2p.android.router.activity.SettingsActivity$SettingsFragment"
+        android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
         android:title="@string/settings_label_bandwidth_net">
         <extra
             android:name="settings"
             android:value="net" />
     </header>
     <header
-        android:fragment="net.i2p.android.router.activity.SettingsActivity$SettingsFragment"
+        android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
         android:title="@string/label_graphs">
         <extra
             android:name="settings"
@@ -18,10 +18,10 @@
         android:title="@string/label_addressbook">
         <intent
             android:targetPackage="net.i2p.android.router"
-            android:targetClass="net.i2p.android.router.activity.AddressbookSettingsActivity" />
+            android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
     </header>
     <header
-        android:fragment="net.i2p.android.router.activity.SettingsActivity$SettingsFragment"
+        android:fragment="net.i2p.android.router.SettingsActivity$SettingsFragment"
         android:title="@string/settings_label_advanced">
         <extra
             android:name="settings"
diff --git a/res/xml/settings_headers_legacy.xml b/res/xml/settings_headers_legacy.xml
index 3f5ac1bd0c5eb72a66d134747531cb412ab07a08..1fe15755b2dc7b97e2b333f37dbf08ad6ed7bae1 100644
--- a/res/xml/settings_headers_legacy.xml
+++ b/res/xml/settings_headers_legacy.xml
@@ -3,24 +3,24 @@
     <Preference android:title="@string/settings_label_bandwidth_net">
         <intent
             android:targetPackage="net.i2p.android.router"
-            android:targetClass="net.i2p.android.router.activity.SettingsActivity"
+            android:targetClass="net.i2p.android.router.SettingsActivity"
             android:action="net.i2p.android.router.PREFS_NET" />
     </Preference>
     <Preference android:title="@string/label_graphs">
         <intent
             android:targetPackage="net.i2p.android.router"
-            android:targetClass="net.i2p.android.router.activity.SettingsActivity"
+            android:targetClass="net.i2p.android.router.SettingsActivity"
             android:action="net.i2p.android.router.PREFS_GRAPHS" />
     </Preference>
     <Preference android:title="@string/label_addressbook">
         <intent
             android:targetPackage="net.i2p.android.router"
-            android:targetClass="net.i2p.android.router.activity.AddressbookSettingsActivity" />
+            android:targetClass="net.i2p.android.router.addressbook.AddressbookSettingsActivity" />
     </Preference>
     <Preference android:title="@string/settings_label_advanced">
         <intent
             android:targetPackage="net.i2p.android.router"
-            android:targetClass="net.i2p.android.router.activity.SettingsActivity"
+            android:targetClass="net.i2p.android.router.SettingsActivity"
             android:action="net.i2p.android.router.PREFS_ADVANCED" />
     </Preference>
 </PreferenceScreen>
diff --git a/src/net/i2p/android/i2ptunnel/activity/TunnelDetailActivity.java b/src/net/i2p/android/i2ptunnel/TunnelDetailActivity.java
similarity index 83%
rename from src/net/i2p/android/i2ptunnel/activity/TunnelDetailActivity.java
rename to src/net/i2p/android/i2ptunnel/TunnelDetailActivity.java
index 8965506a19275e9af8781b1d8b91ee2647b26f96..66de0894e5ce1c4161c621f323ad6124e0b32410 100644
--- a/src/net/i2p/android/i2ptunnel/activity/TunnelDetailActivity.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelDetailActivity.java
@@ -1,8 +1,7 @@
-package net.i2p.android.i2ptunnel.activity;
+package net.i2p.android.i2ptunnel;
 
-import net.i2p.android.i2ptunnel.fragment.TunnelDetailFragment;
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.I2PActivityBase;
 import android.os.Bundle;
 
 public class TunnelDetailActivity extends I2PActivityBase implements
diff --git a/src/net/i2p/android/i2ptunnel/fragment/TunnelDetailFragment.java b/src/net/i2p/android/i2ptunnel/TunnelDetailFragment.java
similarity index 98%
rename from src/net/i2p/android/i2ptunnel/fragment/TunnelDetailFragment.java
rename to src/net/i2p/android/i2ptunnel/TunnelDetailFragment.java
index ac457fd654f5677ca5ae1099c358515083678e24..23238e3262aacf912e896596915e7439e4bd73bd 100644
--- a/src/net/i2p/android/i2ptunnel/fragment/TunnelDetailFragment.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelDetailFragment.java
@@ -1,8 +1,7 @@
-package net.i2p.android.i2ptunnel.fragment;
+package net.i2p.android.i2ptunnel;
 
 import java.util.List;
 
-import net.i2p.android.i2ptunnel.loader.TunnelEntry;
 import net.i2p.android.i2ptunnel.util.TunnelUtil;
 import net.i2p.android.router.R;
 import net.i2p.i2ptunnel.TunnelControllerGroup;
diff --git a/src/net/i2p/android/i2ptunnel/loader/TunnelEntry.java b/src/net/i2p/android/i2ptunnel/TunnelEntry.java
similarity index 99%
rename from src/net/i2p/android/i2ptunnel/loader/TunnelEntry.java
rename to src/net/i2p/android/i2ptunnel/TunnelEntry.java
index a0f2913fb380e690d0adf74017679bd9cb54ead8..ab00a64cf37cdce5a305b80605d217807b8da817 100644
--- a/src/net/i2p/android/i2ptunnel/loader/TunnelEntry.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelEntry.java
@@ -1,4 +1,4 @@
-package net.i2p.android.i2ptunnel.loader;
+package net.i2p.android.i2ptunnel;
 
 import java.util.List;
 
diff --git a/src/net/i2p/android/i2ptunnel/adapter/TunnelEntryAdapter.java b/src/net/i2p/android/i2ptunnel/TunnelEntryAdapter.java
similarity index 94%
rename from src/net/i2p/android/i2ptunnel/adapter/TunnelEntryAdapter.java
rename to src/net/i2p/android/i2ptunnel/TunnelEntryAdapter.java
index 87bb8df5236d725a09e57ac3a7658743bc39a1f4..fe8461723db38572dbf02a0527bbc6e1d62688fb 100644
--- a/src/net/i2p/android/i2ptunnel/adapter/TunnelEntryAdapter.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelEntryAdapter.java
@@ -1,8 +1,7 @@
-package net.i2p.android.i2ptunnel.adapter;
+package net.i2p.android.i2ptunnel;
 
 import java.util.List;
 
-import net.i2p.android.i2ptunnel.loader.TunnelEntry;
 import net.i2p.android.router.R;
 import android.content.Context;
 import android.view.LayoutInflater;
diff --git a/src/net/i2p/android/i2ptunnel/loader/TunnelEntryLoader.java b/src/net/i2p/android/i2ptunnel/TunnelEntryLoader.java
similarity index 99%
rename from src/net/i2p/android/i2ptunnel/loader/TunnelEntryLoader.java
rename to src/net/i2p/android/i2ptunnel/TunnelEntryLoader.java
index e9fe1ae1b789e9dba65710d89db804b5cc6e5f7a..226fa1231969857efe8a423c5ac695dd14eac9ed 100644
--- a/src/net/i2p/android/i2ptunnel/loader/TunnelEntryLoader.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelEntryLoader.java
@@ -1,4 +1,4 @@
-package net.i2p.android.i2ptunnel.loader;
+package net.i2p.android.i2ptunnel;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/net/i2p/android/i2ptunnel/activity/TunnelListActivity.java b/src/net/i2p/android/i2ptunnel/TunnelListActivity.java
similarity index 95%
rename from src/net/i2p/android/i2ptunnel/activity/TunnelListActivity.java
rename to src/net/i2p/android/i2ptunnel/TunnelListActivity.java
index 238bc2a35de54b08ce476e24c81a622e8c36a56a..abdef3121937c3780764fb44531949047d049737 100644
--- a/src/net/i2p/android/i2ptunnel/activity/TunnelListActivity.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelListActivity.java
@@ -1,9 +1,7 @@
-package net.i2p.android.i2ptunnel.activity;
+package net.i2p.android.i2ptunnel;
 
-import net.i2p.android.i2ptunnel.fragment.TunnelDetailFragment;
-import net.i2p.android.i2ptunnel.fragment.TunnelListFragment;
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.I2PActivityBase;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.app.ActionBar;
diff --git a/src/net/i2p/android/i2ptunnel/fragment/TunnelListFragment.java b/src/net/i2p/android/i2ptunnel/TunnelListFragment.java
similarity index 95%
rename from src/net/i2p/android/i2ptunnel/fragment/TunnelListFragment.java
rename to src/net/i2p/android/i2ptunnel/TunnelListFragment.java
index 8eda255e3e49fdd06b535db51c900b23de29d7ef..846dbf177afaf7dfe72cadb935dfaded26cf87b7 100644
--- a/src/net/i2p/android/i2ptunnel/fragment/TunnelListFragment.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelListFragment.java
@@ -1,16 +1,12 @@
-package net.i2p.android.i2ptunnel.fragment;
+package net.i2p.android.i2ptunnel;
 
 import java.util.List;
 
-import net.i2p.android.i2ptunnel.activity.TunnelWizardActivity;
-import net.i2p.android.i2ptunnel.adapter.TunnelEntryAdapter;
-import net.i2p.android.i2ptunnel.loader.TunnelEntry;
-import net.i2p.android.i2ptunnel.loader.TunnelEntryLoader;
 import net.i2p.android.i2ptunnel.util.TunnelConfig;
+import net.i2p.android.router.HelpActivity;
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.HelpActivity;
-import net.i2p.android.router.fragment.I2PFragmentBase;
-import net.i2p.android.router.fragment.I2PFragmentBase.RouterContextProvider;
+import net.i2p.android.router.I2PFragmentBase.RouterContextProvider;
 import net.i2p.i2ptunnel.TunnelControllerGroup;
 import net.i2p.router.RouterContext;
 import android.app.Activity;
diff --git a/src/net/i2p/android/i2ptunnel/activity/TunnelWizardActivity.java b/src/net/i2p/android/i2ptunnel/TunnelWizardActivity.java
similarity index 94%
rename from src/net/i2p/android/i2ptunnel/activity/TunnelWizardActivity.java
rename to src/net/i2p/android/i2ptunnel/TunnelWizardActivity.java
index bac7e1978607ba87fc166cd4466388ff89bb3f84..d895539c05ee706852566088d0740b2fbeb3ce93 100644
--- a/src/net/i2p/android/i2ptunnel/activity/TunnelWizardActivity.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelWizardActivity.java
@@ -1,6 +1,5 @@
-package net.i2p.android.i2ptunnel.activity;
+package net.i2p.android.i2ptunnel;
 
-import net.i2p.android.i2ptunnel.fragment.TunnelListFragment;
 import net.i2p.android.router.R;
 import net.i2p.android.wizard.model.AbstractWizardModel;
 import net.i2p.android.wizard.ui.AbstractWizardActivity;
diff --git a/src/net/i2p/android/i2ptunnel/activity/TunnelWizardModel.java b/src/net/i2p/android/i2ptunnel/TunnelWizardModel.java
similarity index 99%
rename from src/net/i2p/android/i2ptunnel/activity/TunnelWizardModel.java
rename to src/net/i2p/android/i2ptunnel/TunnelWizardModel.java
index 27abeaf4ac5d11146287845408126e5e20b45023..bd4ec9dfa8b6ac41db335288120283f48259dcb5 100644
--- a/src/net/i2p/android/i2ptunnel/activity/TunnelWizardModel.java
+++ b/src/net/i2p/android/i2ptunnel/TunnelWizardModel.java
@@ -1,4 +1,4 @@
-package net.i2p.android.i2ptunnel.activity;
+package net.i2p.android.i2ptunnel;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/src/net/i2p/android/router/activity/HelpActivity.java b/src/net/i2p/android/router/HelpActivity.java
similarity index 94%
rename from src/net/i2p/android/router/activity/HelpActivity.java
rename to src/net/i2p/android/router/HelpActivity.java
index 79c853d4695d2d7392e6838c71d76bbeadf95a91..ef1a65818548fccc60f32868f4c47748863f1cfc 100644
--- a/src/net/i2p/android/router/activity/HelpActivity.java
+++ b/src/net/i2p/android/router/HelpActivity.java
@@ -1,7 +1,6 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.TextResourceDialog;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
diff --git a/src/net/i2p/android/router/activity/I2PActivityBase.java b/src/net/i2p/android/router/I2PActivityBase.java
similarity index 96%
rename from src/net/i2p/android/router/activity/I2PActivityBase.java
rename to src/net/i2p/android/router/I2PActivityBase.java
index c0f20a49a87df2d06a1e9b8c3fc288136cd191f2..febeac64b3550ce44ebdbc81f1352e230cb7485a 100644
--- a/src/net/i2p/android/router/activity/I2PActivityBase.java
+++ b/src/net/i2p/android/router/I2PActivityBase.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router;
 
 import android.content.ComponentName;
 import android.content.Intent;
@@ -21,14 +21,18 @@ import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;
-import net.i2p.android.i2ptunnel.activity.TunnelListActivity;
+import net.i2p.android.i2ptunnel.TunnelListActivity;
 import net.i2p.android.router.R;
-import net.i2p.android.router.binder.RouterBinder;
-import net.i2p.android.router.fragment.I2PFragmentBase;
-import net.i2p.android.router.fragment.NewsFragment;
-import net.i2p.android.router.fragment.WebFragment;
+import net.i2p.android.router.addressbook.AddressbookActivity;
+import net.i2p.android.router.log.LogActivity;
+import net.i2p.android.router.netdb.NetDbActivity;
+import net.i2p.android.router.service.RouterBinder;
 import net.i2p.android.router.service.RouterService;
+import net.i2p.android.router.stats.PeersActivity;
+import net.i2p.android.router.stats.RateGraphActivity;
 import net.i2p.android.router.util.Util;
+import net.i2p.android.router.web.WebActivity;
+import net.i2p.android.router.web.WebFragment;
 import net.i2p.router.RouterContext;
 
 public abstract class I2PActivityBase extends ActionBarActivity implements
diff --git a/src/net/i2p/android/router/fragment/I2PFragmentBase.java b/src/net/i2p/android/router/I2PFragmentBase.java
similarity index 98%
rename from src/net/i2p/android/router/fragment/I2PFragmentBase.java
rename to src/net/i2p/android/router/I2PFragmentBase.java
index e9aea55d2b3cd5451d487b0b20b81ed00d909414..e2c4d673b7b3fdaea0c18f35846ceb2af1c91ce5 100644
--- a/src/net/i2p/android/router/fragment/I2PFragmentBase.java
+++ b/src/net/i2p/android/router/I2PFragmentBase.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router;
 
 import net.i2p.router.CommSystemFacade;
 import net.i2p.router.NetworkDatabaseFacade;
diff --git a/src/net/i2p/android/router/activity/InitActivities.java b/src/net/i2p/android/router/InitActivities.java
similarity index 99%
rename from src/net/i2p/android/router/activity/InitActivities.java
rename to src/net/i2p/android/router/InitActivities.java
index c7bdf0697344b39a5a068352cf0c3518fdf3b5bb..2347b0020ced7b22be385cb3a820be6593dbd367 100644
--- a/src/net/i2p/android/router/activity/InitActivities.java
+++ b/src/net/i2p/android/router/InitActivities.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/src/net/i2p/android/router/activity/LicenseActivity.java b/src/net/i2p/android/router/LicenseActivity.java
similarity index 86%
rename from src/net/i2p/android/router/activity/LicenseActivity.java
rename to src/net/i2p/android/router/LicenseActivity.java
index c65bcfda2d7ad9c4786ca6337ffedbcebff7bea1..30164f413581980ba49e204aee72747363ac2666 100644
--- a/src/net/i2p/android/router/activity/LicenseActivity.java
+++ b/src/net/i2p/android/router/LicenseActivity.java
@@ -1,7 +1,6 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.LicenseFragment;
 import android.os.Bundle;
 
 public class LicenseActivity extends I2PActivityBase {
diff --git a/src/net/i2p/android/router/fragment/LicenseFragment.java b/src/net/i2p/android/router/LicenseFragment.java
similarity index 97%
rename from src/net/i2p/android/router/fragment/LicenseFragment.java
rename to src/net/i2p/android/router/LicenseFragment.java
index 9e51d3010d26f587612a2eb3f00fb988a17e1a33..d88331e03b4744ae342c1b78e8ee8f98cd539b52 100644
--- a/src/net/i2p/android/router/fragment/LicenseFragment.java
+++ b/src/net/i2p/android/router/LicenseFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router;
 
 import android.os.Bundle;
 import android.support.v4.app.ListFragment;
diff --git a/src/net/i2p/android/router/activity/MainActivity.java b/src/net/i2p/android/router/MainActivity.java
similarity index 95%
rename from src/net/i2p/android/router/activity/MainActivity.java
rename to src/net/i2p/android/router/MainActivity.java
index 649ec231508b1dd3ba3730635bfa32da1385df1a..5b2745350f4d04755f8c7eebf902589ff73dd59b 100644
--- a/src/net/i2p/android/router/activity/MainActivity.java
+++ b/src/net/i2p/android/router/MainActivity.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router;
 
 import java.io.File;
 
@@ -8,8 +8,6 @@ import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.MainFragment;
-import net.i2p.android.router.fragment.VersionDialog;
 import net.i2p.android.router.service.RouterService;
 import net.i2p.android.router.util.Util;
 
diff --git a/src/net/i2p/android/router/fragment/MainFragment.java b/src/net/i2p/android/router/MainFragment.java
similarity index 99%
rename from src/net/i2p/android/router/fragment/MainFragment.java
rename to src/net/i2p/android/router/MainFragment.java
index 374776390229c906bde94c76f910487f15e569cb..dc16c68fae8b6cbe12a3b44d27f40c3adb681e49 100644
--- a/src/net/i2p/android/router/fragment/MainFragment.java
+++ b/src/net/i2p/android/router/MainFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router;
 
 import android.app.Activity;
 import android.graphics.drawable.AnimationDrawable;
@@ -11,8 +11,8 @@ import android.widget.ToggleButton;
 import android.widget.ImageView;
 import android.widget.TextView;
 import java.text.DecimalFormat;
+
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.I2PActivityBase;
 import net.i2p.android.router.util.Util;
 import net.i2p.data.DataHelper;
 import net.i2p.router.RouterContext;
diff --git a/src/net/i2p/android/router/fragment/NewsFragment.java b/src/net/i2p/android/router/NewsFragment.java
similarity index 97%
rename from src/net/i2p/android/router/fragment/NewsFragment.java
rename to src/net/i2p/android/router/NewsFragment.java
index 9b988d03cef63f6b594d2ae942b668258be87874..fe9a8102616be7891b703cf19dac5ffebb313344 100644
--- a/src/net/i2p/android/router/fragment/NewsFragment.java
+++ b/src/net/i2p/android/router/NewsFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router;
 
 import android.content.res.Resources;
 import android.os.Bundle;
@@ -15,6 +15,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import net.i2p.android.apps.NewsFetcher;
 import net.i2p.android.router.R;
+import net.i2p.android.router.web.I2PWebViewClient;
 
 public class NewsFragment extends I2PFragmentBase {
 
diff --git a/src/net/i2p/android/router/activity/SettingsActivity.java b/src/net/i2p/android/router/SettingsActivity.java
similarity index 99%
rename from src/net/i2p/android/router/activity/SettingsActivity.java
rename to src/net/i2p/android/router/SettingsActivity.java
index 387bf5f9e9a783f5168928905ab1e302004fc78d..7ba21e67b09282ffd9a85ae317f11d9904000775 100644
--- a/src/net/i2p/android/router/activity/SettingsActivity.java
+++ b/src/net/i2p/android/router/SettingsActivity.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router;
 
 import android.annotation.TargetApi;
 import android.content.Context;
diff --git a/src/net/i2p/android/router/fragment/TextResourceDialog.java b/src/net/i2p/android/router/TextResourceDialog.java
similarity index 98%
rename from src/net/i2p/android/router/fragment/TextResourceDialog.java
rename to src/net/i2p/android/router/TextResourceDialog.java
index e4556dd3987fa58e12224ade8e763c1c9bcacddc..362055c6b42653e8944f5e6d61becb4bd7be493d 100644
--- a/src/net/i2p/android/router/fragment/TextResourceDialog.java
+++ b/src/net/i2p/android/router/TextResourceDialog.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router;
 
 import android.content.res.Resources;
 import android.os.Bundle;
diff --git a/src/net/i2p/android/router/fragment/VersionDialog.java b/src/net/i2p/android/router/VersionDialog.java
similarity index 97%
rename from src/net/i2p/android/router/fragment/VersionDialog.java
rename to src/net/i2p/android/router/VersionDialog.java
index 21898029b16988f4e463e44cf08578e027572581..d5ecdb3be54db7ebb2d1077b4fa8a2d46e4f4fc3 100644
--- a/src/net/i2p/android/router/fragment/VersionDialog.java
+++ b/src/net/i2p/android/router/VersionDialog.java
@@ -1,8 +1,6 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.I2PActivityBase;
-import net.i2p.android.router.activity.LicenseActivity;
 import net.i2p.android.router.util.Util;
 import android.app.Activity;
 import android.app.AlertDialog;
diff --git a/src/net/i2p/android/router/loader/AddressEntry.java b/src/net/i2p/android/router/addressbook/AddressEntry.java
similarity index 90%
rename from src/net/i2p/android/router/loader/AddressEntry.java
rename to src/net/i2p/android/router/addressbook/AddressEntry.java
index a5fee8b9753e7b00a74e325540d493e85e6ed066..83a8c8b1cf68591d2b093efcc8ec6d6d06f14a41 100644
--- a/src/net/i2p/android/router/loader/AddressEntry.java
+++ b/src/net/i2p/android/router/addressbook/AddressEntry.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.loader;
+package net.i2p.android.router.addressbook;
 
 import net.i2p.data.Destination;
 
diff --git a/src/net/i2p/android/router/adapter/AddressEntryAdapter.java b/src/net/i2p/android/router/addressbook/AddressEntryAdapter.java
similarity index 92%
rename from src/net/i2p/android/router/adapter/AddressEntryAdapter.java
rename to src/net/i2p/android/router/addressbook/AddressEntryAdapter.java
index e383d98f30ac2b0d8bd744134f292af881b6c35c..deabd5b801e5a7125e5fe9c245ea4b6d07ddb647 100644
--- a/src/net/i2p/android/router/adapter/AddressEntryAdapter.java
+++ b/src/net/i2p/android/router/addressbook/AddressEntryAdapter.java
@@ -1,9 +1,8 @@
-package net.i2p.android.router.adapter;
+package net.i2p.android.router.addressbook;
 
 import java.util.List;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.loader.AddressEntry;
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
diff --git a/src/net/i2p/android/router/loader/AddressEntryLoader.java b/src/net/i2p/android/router/addressbook/AddressEntryLoader.java
similarity index 99%
rename from src/net/i2p/android/router/loader/AddressEntryLoader.java
rename to src/net/i2p/android/router/addressbook/AddressEntryLoader.java
index adce6b64acf30d3b4a277b6e960e9089fbda14eb..2e5f9050cd1bcf7274fa67889414a4eb97b87a80 100644
--- a/src/net/i2p/android/router/loader/AddressEntryLoader.java
+++ b/src/net/i2p/android/router/addressbook/AddressEntryLoader.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.loader;
+package net.i2p.android.router.addressbook;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/net/i2p/android/router/activity/AddressbookActivity.java b/src/net/i2p/android/router/addressbook/AddressbookActivity.java
similarity index 94%
rename from src/net/i2p/android/router/activity/AddressbookActivity.java
rename to src/net/i2p/android/router/addressbook/AddressbookActivity.java
index 9716c2638750e21fcbd6675a5c683f647dd63ec0..97108c7b8fac6c63cb060fc0c3d5e448fe7f122f 100644
--- a/src/net/i2p/android/router/activity/AddressbookActivity.java
+++ b/src/net/i2p/android/router/addressbook/AddressbookActivity.java
@@ -1,8 +1,10 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.addressbook;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.AddressbookFragment;
-import net.i2p.android.router.fragment.WebFragment;
+import net.i2p.android.router.I2PActivityBase.TabListener;
+import net.i2p.android.router.web.WebActivity;
+import net.i2p.android.router.web.WebFragment;
 import android.app.Activity;
 import android.app.SearchManager;
 import android.content.Context;
diff --git a/src/net/i2p/android/router/activity/AddressbookAddWizardActivity.java b/src/net/i2p/android/router/addressbook/AddressbookAddWizardActivity.java
similarity index 94%
rename from src/net/i2p/android/router/activity/AddressbookAddWizardActivity.java
rename to src/net/i2p/android/router/addressbook/AddressbookAddWizardActivity.java
index 13d60507756293ca1dc8f614e542268958dd330c..271baba93e7b66dc3e08675bb6a3c1c5b959da80 100644
--- a/src/net/i2p/android/router/activity/AddressbookAddWizardActivity.java
+++ b/src/net/i2p/android/router/addressbook/AddressbookAddWizardActivity.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.addressbook;
 
 import android.app.Activity;
 import android.app.AlertDialog;
@@ -7,7 +7,6 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.DialogFragment;
-import net.i2p.android.router.fragment.AddressbookFragment;
 import net.i2p.android.wizard.model.AbstractWizardModel;
 import net.i2p.android.wizard.ui.AbstractWizardActivity;
 
diff --git a/src/net/i2p/android/router/activity/AddressbookAddWizardModel.java b/src/net/i2p/android/router/addressbook/AddressbookAddWizardModel.java
similarity index 96%
rename from src/net/i2p/android/router/activity/AddressbookAddWizardModel.java
rename to src/net/i2p/android/router/addressbook/AddressbookAddWizardModel.java
index 14e462b174914f29f84b4cf6cf1f08ee5a0f2519..bee608b114f22cf3cd33ecdde832bbd61ac79533 100644
--- a/src/net/i2p/android/router/activity/AddressbookAddWizardModel.java
+++ b/src/net/i2p/android/router/addressbook/AddressbookAddWizardModel.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.addressbook;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/src/net/i2p/android/router/fragment/AddressbookFragment.java b/src/net/i2p/android/router/addressbook/AddressbookFragment.java
similarity index 94%
rename from src/net/i2p/android/router/fragment/AddressbookFragment.java
rename to src/net/i2p/android/router/addressbook/AddressbookFragment.java
index 2906c08260b2d553fb0799b0836fa0ea2ecd4a1f..39079160df475132cbf28d66076c3ad62ad0c2a4 100644
--- a/src/net/i2p/android/router/fragment/AddressbookFragment.java
+++ b/src/net/i2p/android/router/addressbook/AddressbookFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.addressbook;
 
 import android.app.Activity;
 import android.content.Intent;
@@ -14,14 +14,12 @@ import android.view.View;
 import android.widget.ListView;
 import android.widget.TextView;
 import java.util.List;
+
+import net.i2p.android.router.HelpActivity;
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.AddressbookAddWizardActivity;
-import net.i2p.android.router.activity.AddressbookSettingsActivity;
-import net.i2p.android.router.activity.HelpActivity;
-import net.i2p.android.router.adapter.AddressEntryAdapter;
-import net.i2p.android.router.fragment.I2PFragmentBase.RouterContextProvider;
-import net.i2p.android.router.loader.AddressEntry;
-import net.i2p.android.router.loader.AddressEntryLoader;
+import net.i2p.android.router.I2PFragmentBase.RouterContextProvider;
+import net.i2p.android.router.I2PFragmentBase.RouterContextUser;
 import net.i2p.android.router.util.NamingServiceUtil;
 import net.i2p.client.naming.NamingService;
 import net.i2p.router.RouterContext;
diff --git a/src/net/i2p/android/router/activity/AddressbookSettingsActivity.java b/src/net/i2p/android/router/addressbook/AddressbookSettingsActivity.java
similarity index 98%
rename from src/net/i2p/android/router/activity/AddressbookSettingsActivity.java
rename to src/net/i2p/android/router/addressbook/AddressbookSettingsActivity.java
index 832f21c3c450942427e7f03f683b86c4c5ba63cf..6c3f8fd0dce7aade089e68fa98a7064131770350 100644
--- a/src/net/i2p/android/router/activity/AddressbookSettingsActivity.java
+++ b/src/net/i2p/android/router/addressbook/AddressbookSettingsActivity.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.addressbook;
 
 import android.app.Activity;
 import android.content.Context;
diff --git a/src/net/i2p/android/router/activity/LogActivity.java b/src/net/i2p/android/router/log/LogActivity.java
similarity index 95%
rename from src/net/i2p/android/router/activity/LogActivity.java
rename to src/net/i2p/android/router/log/LogActivity.java
index ab8dfa9b08ade9849f872aab79237e23a31b7aa1..7b4d9a30b94acd36b3adecf27146acad67ee675f 100644
--- a/src/net/i2p/android/router/activity/LogActivity.java
+++ b/src/net/i2p/android/router/log/LogActivity.java
@@ -1,8 +1,7 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.log;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.LogDetailFragment;
-import net.i2p.android.router.fragment.LogFragment;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.app.ActionBar;
diff --git a/src/net/i2p/android/router/adapter/LogAdapter.java b/src/net/i2p/android/router/log/LogAdapter.java
similarity index 92%
rename from src/net/i2p/android/router/adapter/LogAdapter.java
rename to src/net/i2p/android/router/log/LogAdapter.java
index 65428b4ebcb731a6b974c9713894b8666b517f68..e8d11278023cc8d8b2ceecf7ce1421eef9650902 100644
--- a/src/net/i2p/android/router/adapter/LogAdapter.java
+++ b/src/net/i2p/android/router/log/LogAdapter.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.adapter;
+package net.i2p.android.router.log;
 
 import java.util.List;
 
diff --git a/src/net/i2p/android/router/activity/LogDetailActivity.java b/src/net/i2p/android/router/log/LogDetailActivity.java
similarity index 86%
rename from src/net/i2p/android/router/activity/LogDetailActivity.java
rename to src/net/i2p/android/router/log/LogDetailActivity.java
index 3673e096b66b2b6a26e02a0d845af206d3b74aa5..67d633ae0d76f35bfaa450e6f0db0f82ac71ac50 100644
--- a/src/net/i2p/android/router/activity/LogDetailActivity.java
+++ b/src/net/i2p/android/router/log/LogDetailActivity.java
@@ -1,8 +1,8 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.log;
 
 import android.os.Bundle;
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.LogDetailFragment;
 
 public class LogDetailActivity extends I2PActivityBase {
     LogDetailFragment mDetailFrag;
diff --git a/src/net/i2p/android/router/fragment/LogDetailFragment.java b/src/net/i2p/android/router/log/LogDetailFragment.java
similarity index 92%
rename from src/net/i2p/android/router/fragment/LogDetailFragment.java
rename to src/net/i2p/android/router/log/LogDetailFragment.java
index 87816878a8b42082bf2bd22e4cc9e0c80c1b1822..9bfa1c27cd6e2061aea93d1b0b2b099e065b2d6a 100644
--- a/src/net/i2p/android/router/fragment/LogDetailFragment.java
+++ b/src/net/i2p/android/router/log/LogDetailFragment.java
@@ -1,5 +1,6 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.log;
 
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
 import android.os.Bundle;
 import android.view.LayoutInflater;
diff --git a/src/net/i2p/android/router/fragment/LogFragment.java b/src/net/i2p/android/router/log/LogFragment.java
similarity index 97%
rename from src/net/i2p/android/router/fragment/LogFragment.java
rename to src/net/i2p/android/router/log/LogFragment.java
index 7e7749d559f33ab6c0131279b4a37c3e3e512423..9b7813211e71b172de9617956f97be508816e2ba 100644
--- a/src/net/i2p/android/router/fragment/LogFragment.java
+++ b/src/net/i2p/android/router/log/LogFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.log;
 
 import android.app.Activity;
 import android.os.Bundle;
@@ -11,8 +11,6 @@ import android.widget.TextView;
 import java.util.List;
 import net.i2p.I2PAppContext;
 import net.i2p.android.router.R;
-import net.i2p.android.router.adapter.LogAdapter;
-import net.i2p.android.router.loader.LogLoader;
 
 public class LogFragment extends ListFragment implements
         LoaderManager.LoaderCallbacks<List<String>> {
diff --git a/src/net/i2p/android/router/loader/LogLoader.java b/src/net/i2p/android/router/log/LogLoader.java
similarity index 99%
rename from src/net/i2p/android/router/loader/LogLoader.java
rename to src/net/i2p/android/router/log/LogLoader.java
index aaddbb69e9d08e6537b80fa3a2a3fd937cb89de6..f3750f194ba65bec3cf9c86ff19cb873b6e11e9f 100644
--- a/src/net/i2p/android/router/loader/LogLoader.java
+++ b/src/net/i2p/android/router/log/LogLoader.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.loader;
+package net.i2p.android.router.log;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/src/net/i2p/android/router/activity/NetDbActivity.java b/src/net/i2p/android/router/netdb/NetDbActivity.java
similarity index 95%
rename from src/net/i2p/android/router/activity/NetDbActivity.java
rename to src/net/i2p/android/router/netdb/NetDbActivity.java
index 6b9f12b70830c9ff5aaa3c522ac9a45b1d30d1c9..ebcebab135f5ca0a3e092708d53de243e26b7969 100644
--- a/src/net/i2p/android/router/activity/NetDbActivity.java
+++ b/src/net/i2p/android/router/netdb/NetDbActivity.java
@@ -1,9 +1,8 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.netdb;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.NetDbDetailFragment;
-import net.i2p.android.router.fragment.NetDbListFragment;
-import net.i2p.android.router.fragment.NetDbSummaryPagerFragment;
+import net.i2p.android.router.I2PActivityBase.TabListener;
 import net.i2p.data.Hash;
 import android.content.Intent;
 import android.os.Bundle;
diff --git a/src/net/i2p/android/router/activity/NetDbDetailActivity.java b/src/net/i2p/android/router/netdb/NetDbDetailActivity.java
similarity index 90%
rename from src/net/i2p/android/router/activity/NetDbDetailActivity.java
rename to src/net/i2p/android/router/netdb/NetDbDetailActivity.java
index c084d23b158632221589388818e3041d5d043602..60e99fc34a4455cf6fbcc8815ef60142e294a464 100644
--- a/src/net/i2p/android/router/activity/NetDbDetailActivity.java
+++ b/src/net/i2p/android/router/netdb/NetDbDetailActivity.java
@@ -1,8 +1,7 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.netdb;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.NetDbDetailFragment;
-import net.i2p.android.router.fragment.NetDbListFragment;
 import net.i2p.android.router.util.Util;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Hash;
diff --git a/src/net/i2p/android/router/fragment/NetDbDetailFragment.java b/src/net/i2p/android/router/netdb/NetDbDetailFragment.java
similarity index 98%
rename from src/net/i2p/android/router/fragment/NetDbDetailFragment.java
rename to src/net/i2p/android/router/netdb/NetDbDetailFragment.java
index 0b0920c0d5318e3638baf6d4a30fe1e85d32ac4f..291903b575eb6b8a1307c19aa6f43b3d221604ad 100644
--- a/src/net/i2p/android/router/fragment/NetDbDetailFragment.java
+++ b/src/net/i2p/android/router/netdb/NetDbDetailFragment.java
@@ -1,11 +1,11 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.netdb;
 
 import java.util.Map;
 import java.util.Set;
 
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.NetDbListFragment.OnEntrySelectedListener;
-import net.i2p.android.router.loader.NetDbEntry;
+import net.i2p.android.router.netdb.NetDbListFragment.OnEntrySelectedListener;
 import net.i2p.android.router.util.Util;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
diff --git a/src/net/i2p/android/router/loader/NetDbEntry.java b/src/net/i2p/android/router/netdb/NetDbEntry.java
similarity index 98%
rename from src/net/i2p/android/router/loader/NetDbEntry.java
rename to src/net/i2p/android/router/netdb/NetDbEntry.java
index 4508720fe4f9a3d8489024036df1632f1414df2f..6a889240f720a8c57b3823c076fb2ef228c27e48 100644
--- a/src/net/i2p/android/router/loader/NetDbEntry.java
+++ b/src/net/i2p/android/router/netdb/NetDbEntry.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.loader;
+package net.i2p.android.router.netdb;
 
 import java.lang.reflect.Field;
 
diff --git a/src/net/i2p/android/router/adapter/NetDbEntryAdapter.java b/src/net/i2p/android/router/netdb/NetDbEntryAdapter.java
similarity index 95%
rename from src/net/i2p/android/router/adapter/NetDbEntryAdapter.java
rename to src/net/i2p/android/router/netdb/NetDbEntryAdapter.java
index 8c9a6de117afd1813f883d2cfabbf6d2eeecef2c..4bd89e7b1e56e1635ea88ec71619436f6c55dd77 100644
--- a/src/net/i2p/android/router/adapter/NetDbEntryAdapter.java
+++ b/src/net/i2p/android/router/netdb/NetDbEntryAdapter.java
@@ -1,9 +1,8 @@
-package net.i2p.android.router.adapter;
+package net.i2p.android.router.netdb;
 
 import java.util.List;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.loader.NetDbEntry;
 import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
diff --git a/src/net/i2p/android/router/loader/NetDbEntryLoader.java b/src/net/i2p/android/router/netdb/NetDbEntryLoader.java
similarity index 99%
rename from src/net/i2p/android/router/loader/NetDbEntryLoader.java
rename to src/net/i2p/android/router/netdb/NetDbEntryLoader.java
index be9606cab6ddd87289e19777e897773a8a8b99c2..cbe2190aca7d91c73d8de0df1ce8ebe9c03898c7 100644
--- a/src/net/i2p/android/router/loader/NetDbEntryLoader.java
+++ b/src/net/i2p/android/router/netdb/NetDbEntryLoader.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.loader;
+package net.i2p.android.router.netdb;
 
 import java.util.ArrayList;
 import java.util.Comparator;
diff --git a/src/net/i2p/android/router/fragment/NetDbListFragment.java b/src/net/i2p/android/router/netdb/NetDbListFragment.java
similarity index 96%
rename from src/net/i2p/android/router/fragment/NetDbListFragment.java
rename to src/net/i2p/android/router/netdb/NetDbListFragment.java
index 293bd8be4b4c92817863aedea8fc3c261efc89c8..3caaf688348cd36797377f7ebbd8694851edec76 100644
--- a/src/net/i2p/android/router/fragment/NetDbListFragment.java
+++ b/src/net/i2p/android/router/netdb/NetDbListFragment.java
@@ -1,12 +1,11 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.netdb;
 
 import java.util.List;
 
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.adapter.NetDbEntryAdapter;
-import net.i2p.android.router.fragment.I2PFragmentBase.RouterContextProvider;
-import net.i2p.android.router.loader.NetDbEntry;
-import net.i2p.android.router.loader.NetDbEntryLoader;
+import net.i2p.android.router.I2PFragmentBase.RouterContextProvider;
+import net.i2p.android.router.I2PFragmentBase.RouterContextUser;
 import net.i2p.data.Hash;
 import net.i2p.router.RouterContext;
 
diff --git a/src/net/i2p/android/router/loader/NetDbStatsLoader.java b/src/net/i2p/android/router/netdb/NetDbStatsLoader.java
similarity index 99%
rename from src/net/i2p/android/router/loader/NetDbStatsLoader.java
rename to src/net/i2p/android/router/netdb/NetDbStatsLoader.java
index 2c2cdb169e124177a69a5b84ac67c05cd0106102..5b113985f6fdd764584e03c3ebb03964a126acf2 100644
--- a/src/net/i2p/android/router/loader/NetDbStatsLoader.java
+++ b/src/net/i2p/android/router/netdb/NetDbStatsLoader.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.loader;
+package net.i2p.android.router.netdb;
 
 import java.util.ArrayList;
 import java.util.Comparator;
diff --git a/src/net/i2p/android/router/fragment/NetDbSummaryPagerFragment.java b/src/net/i2p/android/router/netdb/NetDbSummaryPagerFragment.java
similarity index 97%
rename from src/net/i2p/android/router/fragment/NetDbSummaryPagerFragment.java
rename to src/net/i2p/android/router/netdb/NetDbSummaryPagerFragment.java
index 01c13e9922c733b70c093ccbfca7559dc6d20976..e494314ea84ed34e3dfc35cdc4d90e9f05934200 100644
--- a/src/net/i2p/android/router/fragment/NetDbSummaryPagerFragment.java
+++ b/src/net/i2p/android/router/netdb/NetDbSummaryPagerFragment.java
@@ -1,9 +1,9 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.netdb;
 
 import java.util.List;
 
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.loader.NetDbStatsLoader;
 import net.i2p.android.router.util.Util;
 import net.i2p.util.ObjectCounter;
 import android.os.Bundle;
diff --git a/src/net/i2p/android/router/fragment/NetDbSummaryTableFragment.java b/src/net/i2p/android/router/netdb/NetDbSummaryTableFragment.java
similarity index 98%
rename from src/net/i2p/android/router/fragment/NetDbSummaryTableFragment.java
rename to src/net/i2p/android/router/netdb/NetDbSummaryTableFragment.java
index 5f68ee4789de39c5b6f87c70af5a019410900fac..e6e4ffcc7b74a3ef29ccc803b602c566e97e0c08 100644
--- a/src/net/i2p/android/router/fragment/NetDbSummaryTableFragment.java
+++ b/src/net/i2p/android/router/netdb/NetDbSummaryTableFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.netdb;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/src/net/i2p/android/router/receiver/I2PReceiver.java b/src/net/i2p/android/router/receiver/I2PReceiver.java
index 14942a6cc3c217930f4ad2363261d0d421507318..0046a48b1e7d7a6ba12f65b3a125a1a64e799a96 100644
--- a/src/net/i2p/android/router/receiver/I2PReceiver.java
+++ b/src/net/i2p/android/router/receiver/I2PReceiver.java
@@ -9,7 +9,7 @@ import android.content.ServiceConnection;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.os.IBinder;
-import net.i2p.android.router.binder.RouterBinder;
+import net.i2p.android.router.service.RouterBinder;
 import net.i2p.android.router.service.RouterService;
 import net.i2p.android.router.util.Util;
 
diff --git a/src/net/i2p/android/router/binder/RouterBinder.java b/src/net/i2p/android/router/service/RouterBinder.java
similarity index 77%
rename from src/net/i2p/android/router/binder/RouterBinder.java
rename to src/net/i2p/android/router/service/RouterBinder.java
index 2fa03f97b0c1125846574fe588450eff8d6c4018..b8314af2ec68f0e5e500b0052ef130aa51fbc45d 100644
--- a/src/net/i2p/android/router/binder/RouterBinder.java
+++ b/src/net/i2p/android/router/service/RouterBinder.java
@@ -1,7 +1,6 @@
-package net.i2p.android.router.binder;
+package net.i2p.android.router.service;
 
 import android.os.Binder;
-import net.i2p.android.router.service.RouterService;
 
 public class RouterBinder extends Binder {
 
diff --git a/src/net/i2p/android/router/service/RouterService.java b/src/net/i2p/android/router/service/RouterService.java
index 4104d872d068de7d874b86c8004cd005965a82f2..43962de34a513ec0249b20d32b8e2bdc1dbfab9a 100644
--- a/src/net/i2p/android/router/service/RouterService.java
+++ b/src/net/i2p/android/router/service/RouterService.java
@@ -15,7 +15,6 @@ import java.util.Properties;
 import java.util.Random;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.binder.RouterBinder;
 import net.i2p.android.router.receiver.I2PReceiver;
 import net.i2p.android.router.util.Util;
 import net.i2p.data.DataHelper;
diff --git a/src/net/i2p/android/router/service/StatusBar.java b/src/net/i2p/android/router/service/StatusBar.java
index 14760a54ffefdb8069d4c9c5c70a1f6d64379aa7..c337bfde377da3ed4aa86abce588ccad232a301a 100644
--- a/src/net/i2p/android/router/service/StatusBar.java
+++ b/src/net/i2p/android/router/service/StatusBar.java
@@ -6,8 +6,8 @@ import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.support.v4.app.NotificationCompat;
+import net.i2p.android.router.MainActivity;
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.MainActivity;
 
 class StatusBar {
 
diff --git a/src/net/i2p/android/router/activity/PeersActivity.java b/src/net/i2p/android/router/stats/PeersActivity.java
similarity index 92%
rename from src/net/i2p/android/router/activity/PeersActivity.java
rename to src/net/i2p/android/router/stats/PeersActivity.java
index 0411224f60d91211f79e9be6d7294553c8ecf21f..c71acb087ebe3987927ec4ef8f9e28b3d04af73b 100644
--- a/src/net/i2p/android/router/activity/PeersActivity.java
+++ b/src/net/i2p/android/router/stats/PeersActivity.java
@@ -1,7 +1,7 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.stats;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.PeersFragment;
 import net.i2p.android.router.service.RouterService;
 import android.os.Bundle;
 
diff --git a/src/net/i2p/android/router/fragment/PeersFragment.java b/src/net/i2p/android/router/stats/PeersFragment.java
similarity index 96%
rename from src/net/i2p/android/router/fragment/PeersFragment.java
rename to src/net/i2p/android/router/stats/PeersFragment.java
index 77089bf58df501f7c9d1b0524440b0b9b490b021..0b5730fffbfc3f8d548ab56841c06b2a6995df3a 100644
--- a/src/net/i2p/android/router/fragment/PeersFragment.java
+++ b/src/net/i2p/android/router/stats/PeersFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.stats;
 
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -10,7 +10,10 @@ import android.view.ViewGroup;
 import android.webkit.WebView;
 import java.io.IOException;
 import java.io.StringWriter;
+
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
+import net.i2p.android.router.web.I2PWebViewClient;
 import net.i2p.router.CommSystemFacade;
 
 public class PeersFragment extends I2PFragmentBase {
diff --git a/src/net/i2p/android/router/activity/RateGraphActivity.java b/src/net/i2p/android/router/stats/RateGraphActivity.java
similarity index 97%
rename from src/net/i2p/android/router/activity/RateGraphActivity.java
rename to src/net/i2p/android/router/stats/RateGraphActivity.java
index e846d62f948b3bc5c16cea88a20955106beb0e43..b9378c5b1e8643ac464eeeafce34321f5e0463ed 100644
--- a/src/net/i2p/android/router/activity/RateGraphActivity.java
+++ b/src/net/i2p/android/router/stats/RateGraphActivity.java
@@ -1,11 +1,11 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.stats;
 
 import java.util.Comparator;
 import java.util.List;
 import java.util.TreeSet;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.RateGraphFragment;
 import net.i2p.android.router.service.StatSummarizer;
 import net.i2p.android.router.service.SummaryListener;
 import net.i2p.stat.Rate;
diff --git a/src/net/i2p/android/router/fragment/RateGraphFragment.java b/src/net/i2p/android/router/stats/RateGraphFragment.java
similarity index 98%
rename from src/net/i2p/android/router/fragment/RateGraphFragment.java
rename to src/net/i2p/android/router/stats/RateGraphFragment.java
index 09c5ef92b74c85f733e26ca2e608dabc9d9fc84f..7447b8446e8c845a0a7fef6c0c47dec5bd87a099 100644
--- a/src/net/i2p/android/router/fragment/RateGraphFragment.java
+++ b/src/net/i2p/android/router/stats/RateGraphFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.stats;
 
 import java.text.DecimalFormat;
 import java.text.FieldPosition;
@@ -13,6 +13,7 @@ import com.androidplot.xy.XYPlot;
 import com.androidplot.xy.XYSeries;
 import com.androidplot.xy.XYStepMode;
 
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
 import net.i2p.android.router.service.StatSummarizer;
 import net.i2p.android.router.service.SummaryListener;
diff --git a/src/net/i2p/android/router/fragment/I2PWebViewClient.java b/src/net/i2p/android/router/web/I2PWebViewClient.java
similarity index 99%
rename from src/net/i2p/android/router/fragment/I2PWebViewClient.java
rename to src/net/i2p/android/router/web/I2PWebViewClient.java
index 9b0ee06f64b08a2b695b8c54793873d3a2206b7a..b92fa2705ef887c60bf1f823203236ecc90496f4 100644
--- a/src/net/i2p/android/router/fragment/I2PWebViewClient.java
+++ b/src/net/i2p/android/router/web/I2PWebViewClient.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.web;
 
 import android.app.ProgressDialog;
 import android.content.DialogInterface;
@@ -24,7 +24,7 @@ import net.i2p.android.router.util.Util;
 import net.i2p.data.DataHelper;
 import net.i2p.util.EepGet;
 
-class I2PWebViewClient extends WebViewClient {
+public class I2PWebViewClient extends WebViewClient {
 
     private BGLoad _lastTask;
     /** save it here so we can dismiss it in onPageFinished() */
@@ -182,7 +182,7 @@ class I2PWebViewClient extends WebViewClient {
 
 ******/
 
-    void cancelAll() {
+    public void cancelAll() {
         BGLoad task = _lastTask;
         if (task != null) {
             Util.d("Cancelling fetches");
diff --git a/src/net/i2p/android/router/activity/WebActivity.java b/src/net/i2p/android/router/web/WebActivity.java
similarity index 89%
rename from src/net/i2p/android/router/activity/WebActivity.java
rename to src/net/i2p/android/router/web/WebActivity.java
index 0c8ef021d5099141dc565ad42d47e89cad1cd80a..21a2cbc49a95351cdcf03d7dab7fe628b32bf35b 100644
--- a/src/net/i2p/android/router/activity/WebActivity.java
+++ b/src/net/i2p/android/router/web/WebActivity.java
@@ -1,7 +1,7 @@
-package net.i2p.android.router.activity;
+package net.i2p.android.router.web;
 
+import net.i2p.android.router.I2PActivityBase;
 import net.i2p.android.router.R;
-import net.i2p.android.router.fragment.WebFragment;
 import android.os.Bundle;
 
 public class WebActivity extends I2PActivityBase {
diff --git a/src/net/i2p/android/router/fragment/WebFragment.java b/src/net/i2p/android/router/web/WebFragment.java
similarity index 98%
rename from src/net/i2p/android/router/fragment/WebFragment.java
rename to src/net/i2p/android/router/web/WebFragment.java
index 5aafe6f353386e2fd506495349896e3b04db8cd1..421ddbfd2f32c14f836502fae085b037ce379ec6 100644
--- a/src/net/i2p/android/router/fragment/WebFragment.java
+++ b/src/net/i2p/android/router/web/WebFragment.java
@@ -1,4 +1,4 @@
-package net.i2p.android.router.fragment;
+package net.i2p.android.router.web;
 
 import android.content.res.Resources;
 import android.net.Uri;
@@ -15,6 +15,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+
+import net.i2p.android.router.I2PFragmentBase;
 import net.i2p.android.router.R;
 
 public class WebFragment extends I2PFragmentBase {
diff --git a/src/net/i2p/android/wizard/model/ModelCallbacks.java b/src/net/i2p/android/wizard/model/ModelCallbacks.java
index baddecf9b15e8e4a795a9bd2d2b88e8eb07c4c58..b72e24055af801b379837c2ee35095703bada407 100644
--- a/src/net/i2p/android/wizard/model/ModelCallbacks.java
+++ b/src/net/i2p/android/wizard/model/ModelCallbacks.java
@@ -18,7 +18,7 @@ package net.i2p.android.wizard.model;
 
 /**
  * Callback interface connecting {@link Page}, {@link AbstractWizardModel}, and model container
- * objects (e.g. {@link net.i2p.android.i2ptunnel.activity.TunnelWizardActivity}.
+ * objects (e.g. {@link net.i2p.android.i2ptunnel.TunnelWizardActivity}.
  */
 public interface ModelCallbacks {
     void onPageDataChanged(Page page);
diff --git a/src/net/i2p/android/wizard/ui/I2PDestinationFragment.java b/src/net/i2p/android/wizard/ui/I2PDestinationFragment.java
index 271e15e9f4c0527c27a1ecd82c0087dd75ace154..074156af95ff07eaf5cfb572f9225bf1a1748e79 100644
--- a/src/net/i2p/android/wizard/ui/I2PDestinationFragment.java
+++ b/src/net/i2p/android/wizard/ui/I2PDestinationFragment.java
@@ -17,7 +17,7 @@
 package net.i2p.android.wizard.ui;
 
 import net.i2p.android.router.R;
-import net.i2p.android.router.activity.AddressbookActivity;
+import net.i2p.android.router.addressbook.AddressbookActivity;
 import net.i2p.android.wizard.model.Page;
 import net.i2p.android.wizard.model.SingleTextFieldPage;