diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 458553e..d3a9b63 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -45,9 +45,11 @@
         android:hardwareAccelerated="true"
     >
 
-        <!-- A virtual 12 key dialer -->
-        <activity android:name="TwelveKeyDialer"
+        <!-- A virtual 12 key dialer. This definition is only used internally, so that we can use
+             the activity inside of a TabActivity -->
+        <activity android:name=".activities.DialpadActivity"
             android:launchMode="singleTop"
+            android:exported="false"
         >
             <intent-filter>
                 <action android:name="com.android.phone.action.TOUCH_DIALER" />
@@ -56,9 +58,11 @@
             </intent-filter>
         </activity>
 
-        <!-- A list of recent calls -->
-        <activity android:name="RecentCallsListActivity"
+        <!-- A list of recent calls. This definition is only used internally, so that we can use
+             the activity inside of a TabActivity -->
+        <activity android:name=".activities.CallLogActivity"
             android:label="@string/recentCallsIconLabel"
+            android:exported="false"
         >
             <intent-filter>
                 <action android:name="com.android.phone.action.RECENT_CALLS" />
@@ -119,7 +123,7 @@
         </activity>
 
         <!-- Tab container for all tabs -->
-        <activity android:name="DialtactsActivity"
+        <activity android:name=".activities.DialtactsActivity"
             android:label="@string/launcherDialer"
             android:theme="@style/DialtactsTheme"
             android:launchMode="singleTask"
diff --git a/res/layout-land/twelve_key_dialer.xml b/res/layout-land/dialpad_activity.xml
similarity index 100%
rename from res/layout-land/twelve_key_dialer.xml
rename to res/layout-land/dialpad_activity.xml
diff --git a/res/layout-long-land/twelve_key_dialer.xml b/res/layout-long-land/dialpad_activity.xml
similarity index 100%
rename from res/layout-long-land/twelve_key_dialer.xml
rename to res/layout-long-land/dialpad_activity.xml
diff --git a/res/layout-long/twelve_key_dialer.xml b/res/layout-long/dialpad_activity.xml
similarity index 100%
rename from res/layout-long/twelve_key_dialer.xml
rename to res/layout-long/dialpad_activity.xml
diff --git a/res/layout/recent_calls.xml b/res/layout/call_log_activity.xml
similarity index 100%
rename from res/layout/recent_calls.xml
rename to res/layout/call_log_activity.xml
diff --git a/res/layout/recent_calls_list_child_item.xml b/res/layout/call_log_list_child_item.xml
similarity index 95%
rename from res/layout/recent_calls_list_child_item.xml
rename to res/layout/call_log_list_child_item.xml
index 527e259..bb48fcf 100644
--- a/res/layout/recent_calls_list_child_item.xml
+++ b/res/layout/call_log_list_child_item.xml
@@ -33,6 +33,6 @@
         android:background="@drawable/call_background_secondary"
     />
 
-    <include layout="@layout/recent_calls_list_item_layout"/>
+    <include layout="@layout/call_log_list_item_layout"/>
 
 </RelativeLayout>
diff --git a/res/layout/recent_calls_list_group_item.xml b/res/layout/call_log_list_group_item.xml
similarity index 100%
rename from res/layout/recent_calls_list_group_item.xml
rename to res/layout/call_log_list_group_item.xml
diff --git a/res/layout/recent_calls_list_item.xml b/res/layout/call_log_list_item.xml
similarity index 95%
rename from res/layout/recent_calls_list_item.xml
rename to res/layout/call_log_list_item.xml
index 2c519d6..4ea0563 100644
--- a/res/layout/recent_calls_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -32,6 +32,6 @@
         android:background="@drawable/call_background"
     />
 
-    <include layout="@layout/recent_calls_list_item_layout"/>
+    <include layout="@layout/call_log_list_item_layout"/>
 
 </RelativeLayout>
diff --git a/res/layout/recent_calls_list_item_layout.xml b/res/layout/call_log_list_item_layout.xml
similarity index 100%
rename from res/layout/recent_calls_list_item_layout.xml
rename to res/layout/call_log_list_item_layout.xml
diff --git a/res/layout/twelve_key_dialer.xml b/res/layout/dialpad_activity.xml
similarity index 100%
rename from res/layout/twelve_key_dialer.xml
rename to res/layout/dialpad_activity.xml
diff --git a/res/layout/dialer_activity.xml b/res/layout/dialtacts_activity.xml
similarity index 100%
rename from res/layout/dialer_activity.xml
rename to res/layout/dialtacts_activity.xml
diff --git a/src/com/android/contacts/SpecialCharSequenceMgr.java b/src/com/android/contacts/SpecialCharSequenceMgr.java
index a047a68..9f9f40d 100644
--- a/src/com/android/contacts/SpecialCharSequenceMgr.java
+++ b/src/com/android/contacts/SpecialCharSequenceMgr.java
@@ -54,7 +54,7 @@
     private SpecialCharSequenceMgr() {
     }
 
-    static boolean handleChars(Context context, String input, EditText textField) {
+    public static boolean handleChars(Context context, String input, EditText textField) {
         return handleChars(context, input, false, textField);
     }
 
diff --git a/src/com/android/contacts/RecentCallsListActivity.java b/src/com/android/contacts/activities/CallLogActivity.java
similarity index 96%
rename from src/com/android/contacts/RecentCallsListActivity.java
rename to src/com/android/contacts/activities/CallLogActivity.java
index fb4ee10..5672af9 100644
--- a/src/com/android/contacts/RecentCallsListActivity.java
+++ b/src/com/android/contacts/activities/CallLogActivity.java
@@ -14,9 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.contacts;
+package com.android.contacts.activities;
 
 import com.android.common.widget.GroupingListAdapter;
+import com.android.contacts.CallDetailActivity;
+import com.android.contacts.ContactsSearchManager;
+import com.android.contacts.ContactsUtils;
+import com.android.contacts.R;
 import com.android.internal.telephony.CallerInfo;
 import com.android.internal.telephony.ITelephony;
 
@@ -84,9 +88,9 @@
 /**
  * Displays a list of call log entries.
  */
-public class RecentCallsListActivity extends ListActivity
+public class CallLogActivity extends ListActivity
         implements View.OnCreateContextMenuListener {
-    private static final String TAG = "RecentCallsList";
+    private static final String TAG = "CallLogActivity";
 
     /** The projection to use when querying the call log table */
     static final String[] CALL_LOG_PROJECTION = new String[] {
@@ -135,7 +139,7 @@
 
     private static final int DIALOG_CONFIRM_DELETE_ALL = 1;
 
-    RecentCallsAdapter mAdapter;
+    CallLogAdapter mAdapter;
     private QueryHandler mQueryHandler;
     String mVoiceMailNumber;
     private String mCurrentCountryIso;
@@ -154,7 +158,7 @@
         public static ContactInfo EMPTY = new ContactInfo();
     }
 
-    public static final class RecentCallsListItemViews {
+    public static final class CallLogListItemViews {
         TextView line1View;
         TextView labelView;
         TextView numberView;
@@ -174,7 +178,7 @@
     }
 
     /** Adapter class to fill in data for the Call Log */
-    final class RecentCallsAdapter extends GroupingListAdapter
+    final class CallLogAdapter extends GroupingListAdapter
             implements Runnable, ViewTreeObserver.OnPreDrawListener, View.OnClickListener {
         HashMap<String,ContactInfo> mContactInfo;
         private final LinkedList<CallerInfoQuery> mRequests;
@@ -236,8 +240,8 @@
             }
         };
 
-        public RecentCallsAdapter() {
-            super(RecentCallsListActivity.this);
+        public CallLogAdapter() {
+            super(CallLogActivity.this);
 
             mContactInfo = new HashMap<String,ContactInfo>();
             mRequests = new LinkedList<CallerInfoQuery>();
@@ -310,7 +314,7 @@
             values.put(Calls.CACHED_NUMBER_LABEL, ci.label);
 
             try {
-                RecentCallsListActivity.this.getContentResolver().update(Calls.CONTENT_URI, values,
+                CallLogActivity.this.getContentResolver().update(Calls.CONTENT_URI, values,
                         Calls.NUMBER + "='" + ciq.number + "'", null);
             } catch (SQLiteDiskIOException e) {
                 Log.w(TAG, "Exception while updating call info", e);
@@ -372,7 +376,7 @@
                     String[] selectionArgs = new String[] { ciq.number.toUpperCase() };
 
                     Cursor dataTableCursor =
-                            RecentCallsListActivity.this.getContentResolver().query(
+                            CallLogActivity.this.getContentResolver().query(
                                     contactRef,
                                     null,  // projection
                                     selection,  // selection
@@ -413,7 +417,7 @@
                     // "number" is a regular phone number, so use the
                     // PhoneLookup table:
                     Cursor phonesCursor =
-                            RecentCallsListActivity.this.getContentResolver().query(
+                            CallLogActivity.this.getContentResolver().query(
                                 Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                                         Uri.encode(ciq.number)),
                                 PHONES_PROJECTION, null, null, null);
@@ -545,7 +549,7 @@
         protected View newStandAloneView(Context context, ViewGroup parent) {
             LayoutInflater inflater =
                     (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            View view = inflater.inflate(R.layout.recent_calls_list_item, parent, false);
+            View view = inflater.inflate(R.layout.call_log_list_item, parent, false);
             findAndCacheViews(view);
             return view;
         }
@@ -559,7 +563,7 @@
         protected View newChildView(Context context, ViewGroup parent) {
             LayoutInflater inflater =
                     (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            View view = inflater.inflate(R.layout.recent_calls_list_child_item, parent, false);
+            View view = inflater.inflate(R.layout.call_log_list_child_item, parent, false);
             findAndCacheViews(view);
             return view;
         }
@@ -573,7 +577,7 @@
         protected View newGroupView(Context context, ViewGroup parent) {
             LayoutInflater inflater =
                     (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            View view = inflater.inflate(R.layout.recent_calls_list_group_item, parent, false);
+            View view = inflater.inflate(R.layout.call_log_list_group_item, parent, false);
             findAndCacheViews(view);
             return view;
         }
@@ -581,7 +585,7 @@
         @Override
         protected void bindGroupView(View view, Context context, Cursor cursor, int groupSize,
                 boolean expanded) {
-            final RecentCallsListItemViews views = (RecentCallsListItemViews) view.getTag();
+            final CallLogListItemViews views = (CallLogListItemViews) view.getTag();
             int groupIndicator = expanded
                     ? com.android.internal.R.drawable.expander_ic_maximized
                     : com.android.internal.R.drawable.expander_ic_minimized;
@@ -593,7 +597,7 @@
         private void findAndCacheViews(View view) {
 
             // Get the views to bind to
-            RecentCallsListItemViews views = new RecentCallsListItemViews();
+            CallLogListItemViews views = new CallLogListItemViews();
             views.line1View = (TextView) view.findViewById(R.id.line1);
             views.labelView = (TextView) view.findViewById(R.id.label);
             views.numberView = (TextView) view.findViewById(R.id.number);
@@ -607,7 +611,7 @@
         }
 
         public void bindView(Context context, View view, Cursor c) {
-            final RecentCallsListItemViews views = (RecentCallsListItemViews) view.getTag();
+            final CallLogListItemViews views = (CallLogListItemViews) view.getTag();
 
             String number = c.getString(NUMBER_COLUMN_INDEX);
             String formattedNumber = null;
@@ -767,7 +771,7 @@
     }
 
     private static final class QueryHandler extends AsyncQueryHandler {
-        private final WeakReference<RecentCallsListActivity> mActivity;
+        private final WeakReference<CallLogActivity> mActivity;
 
         /**
          * Simple handler that wraps background calls to catch
@@ -801,15 +805,15 @@
 
         public QueryHandler(Context context) {
             super(context.getContentResolver());
-            mActivity = new WeakReference<RecentCallsListActivity>(
-                    (RecentCallsListActivity) context);
+            mActivity = new WeakReference<CallLogActivity>(
+                    (CallLogActivity) context);
         }
 
         @Override
         protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-            final RecentCallsListActivity activity = mActivity.get();
+            final CallLogActivity activity = mActivity.get();
             if (activity != null && !activity.isFinishing()) {
-                final RecentCallsListActivity.RecentCallsAdapter callsAdapter = activity.mAdapter;
+                final CallLogActivity.CallLogAdapter callsAdapter = activity.mAdapter;
                 callsAdapter.setLoading(false);
                 callsAdapter.changeCursor(cursor);
                 if (activity.mScrollToTop) {
@@ -829,12 +833,12 @@
     protected void onCreate(Bundle state) {
         super.onCreate(state);
 
-        setContentView(R.layout.recent_calls);
+        setContentView(R.layout.call_log_activity);
 
         // Typing here goes to the dialer
         setDefaultKeyMode(DEFAULT_KEYS_DIALER);
 
-        mAdapter = new RecentCallsAdapter();
+        mAdapter = new CallLogAdapter();
         getListView().setOnCreateContextMenuListener(this);
         setListAdapter(mAdapter);
 
@@ -1048,7 +1052,7 @@
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         final ProgressDialog progressDialog = ProgressDialog.show(
-                                RecentCallsListActivity.this,
+                                CallLogActivity.this,
                                 getString(R.string.clearCallLogProgress_title),
                                 "", true, false);
                         final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
@@ -1197,7 +1201,7 @@
         } else {
             try {
                 Cursor phonesCursor =
-                    RecentCallsListActivity.this.getContentResolver().query(
+                    CallLogActivity.this.getContentResolver().query(
                             Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                                     number),
                     PHONES_PROJECTION, null, null, null);
diff --git a/src/com/android/contacts/activities/ContactsFrontDoor.java b/src/com/android/contacts/activities/ContactsFrontDoor.java
index 1f8a491..d34f2c4 100644
--- a/src/com/android/contacts/activities/ContactsFrontDoor.java
+++ b/src/com/android/contacts/activities/ContactsFrontDoor.java
@@ -17,7 +17,6 @@
 package com.android.contacts.activities;
 
 import com.android.contacts.ContactsActivity;
-import com.android.contacts.DialtactsActivity;
 import com.android.contacts.util.PhoneCapabilityTester;
 
 import android.content.Intent;
diff --git a/src/com/android/contacts/TwelveKeyDialer.java b/src/com/android/contacts/activities/DialpadActivity.java
similarity index 98%
rename from src/com/android/contacts/TwelveKeyDialer.java
rename to src/com/android/contacts/activities/DialpadActivity.java
index b93375c..cfbdff2 100644
--- a/src/com/android/contacts/TwelveKeyDialer.java
+++ b/src/com/android/contacts/activities/DialpadActivity.java
@@ -14,8 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.contacts;
+package com.android.contacts.activities;
 
+import com.android.contacts.ContactsSearchManager;
+import com.android.contacts.ContactsUtils;
+import com.android.contacts.R;
+import com.android.contacts.SpecialCharSequenceMgr;
 import com.android.internal.telephony.ITelephony;
 import com.android.phone.CallLogAsync;
 import com.android.phone.HapticFeedback;
@@ -71,11 +75,11 @@
  * Dialer activity that displays the typical twelve key interface.
  */
 @SuppressWarnings("deprecation")
-public class TwelveKeyDialer extends Activity implements View.OnClickListener,
+public class DialpadActivity extends Activity implements View.OnClickListener,
         View.OnLongClickListener, View.OnKeyListener,
         AdapterView.OnItemClickListener, TextWatcher {
     private static final String EMPTY_NUMBER = "";
-    private static final String TAG = "TwelveKeyDialer";
+    private static final String TAG = "DialpadActivity";
 
     /** The length of DTMF tones in milliseconds */
     private static final int TONE_LENGTH_MS = 150;
@@ -278,7 +282,7 @@
      * Overridden by subclasses to control the resource used by the content view.
      */
     protected int getContentViewResource() {
-        return R.layout.twelve_key_dialer;
+        return R.layout.dialpad_activity;
     }
 
     private boolean resolveIntent() {
diff --git a/src/com/android/contacts/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
similarity index 97%
rename from src/com/android/contacts/DialtactsActivity.java
rename to src/com/android/contacts/activities/DialtactsActivity.java
index 5ad57e4..5054309 100644
--- a/src/com/android/contacts/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -14,10 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.contacts;
+package com.android.contacts.activities;
 
+import com.android.contacts.R;
 import com.android.contacts.activities.ContactsFrontDoor;
 import com.android.contacts.activities.ContactBrowserActivity;
+import com.android.contacts.activities.DialpadActivity;
 import com.android.internal.telephony.ITelephony;
 
 import android.app.Activity;
@@ -42,7 +44,7 @@
  * The dialer tab's title is 'phone', a more common name (see strings.xml).
  */
 public class DialtactsActivity extends TabActivity implements TabHost.OnTabChangeListener {
-    private static final String TAG = "Dailtacts";
+    private static final String TAG = "DialtactsActivity";
 
     private static final int TAB_INDEX_DIALER = 0;
     private static final int TAB_INDEX_CALL_LOG = 1;
@@ -79,7 +81,7 @@
         fixIntent(intent);
 
         requestWindowFeature(Window.FEATURE_NO_TITLE);
-        setContentView(R.layout.dialer_activity);
+        setContentView(R.layout.dialtacts_activity);
 
         mTabHost = getTabHost();
         mTabHost.setOnTabChangedListener(this);
@@ -132,7 +134,7 @@
     private void setupCallLogTab() {
         // Force the class since overriding tab entries doesn't work
         Intent intent = new Intent("com.android.phone.action.RECENT_CALLS");
-        intent.setClass(this, RecentCallsListActivity.class);
+        intent.setClass(this, CallLogActivity.class);
 
         mTabHost.addTab(mTabHost.newTabSpec("call_log")
                 .setIndicator(getString(R.string.recentCallsIconLabel),
@@ -142,7 +144,7 @@
 
     private void setupDialerTab() {
         Intent intent = new Intent("com.android.phone.action.TOUCH_DIALER");
-        intent.setClass(this, TwelveKeyDialer.class);
+        intent.setClass(this, DialpadActivity.class);
 
         mTabHost.addTab(mTabHost.newTabSpec("dialer")
                 .setIndicator(getString(R.string.dialerIconLabel),
diff --git a/tests/src/com/android/contacts/DialerLaunchPerformance.java b/tests/src/com/android/contacts/DialerLaunchPerformance.java
index ae78082..0803c6b 100644
--- a/tests/src/com/android/contacts/DialerLaunchPerformance.java
+++ b/tests/src/com/android/contacts/DialerLaunchPerformance.java
@@ -32,7 +32,7 @@
         mIntent.setAction(Intent.ACTION_MAIN);
         mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
         mIntent.setComponent(new ComponentName("com.android.contacts",
-                "com.android.contacts.DialtactsActivity"));
+                "com.android.contacts.activities.DialtactsActivity"));
 
         start();
     }
diff --git a/tests/src/com/android/contacts/RecentCallsListActivityTests.java b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
similarity index 93%
rename from tests/src/com/android/contacts/RecentCallsListActivityTests.java
rename to tests/src/com/android/contacts/activities/CallLogActivityTests.java
index 3c2a9fe..c6b3ea5 100644
--- a/tests/src/com/android/contacts/RecentCallsListActivityTests.java
+++ b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
@@ -14,23 +14,20 @@
  * limitations under the License.
  */
 
-package com.android.contacts;
+package com.android.contacts.activities;
+
+import com.android.internal.telephony.CallerInfo;
 
 import android.content.res.Resources;
-import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
 import android.provider.CallLog.Calls;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
 import android.view.View;
 import android.widget.FrameLayout;
-import com.android.contacts.RecentCallsListActivity;
-import com.android.internal.telephony.CallerInfo;
+
 import java.util.Date;
 import java.util.Formatter;
 import java.util.HashMap;
@@ -47,9 +44,9 @@
  *     -w com.android.contacts.tests/android.test.InstrumentationTestRunner
  */
 
-public class RecentCallsListActivityTests
-        extends ActivityInstrumentationTestCase2<RecentCallsListActivity> {
-    static private final String TAG = "RecentCallsListActivityTests";
+public class CallLogActivityTests
+        extends ActivityInstrumentationTestCase2<CallLogActivity> {
+    static private final String TAG = "CallLogActivityTests";
     static private final String[] CALL_LOG_PROJECTION = new String[] {
             Calls._ID,
             Calls.NUMBER,
@@ -66,11 +63,11 @@
 
     // We get the call list activity and assign is a frame to build
     // its list.  mAdapter is an inner class of
-    // RecentCallsListActivity to build the rows (view) in the call
+    // CallLogActivity to build the rows (view) in the call
     // list. We reuse it with our own in-mem DB.
-    private RecentCallsListActivity mActivity;
+    private CallLogActivity mActivity;
     private FrameLayout mParentView;
-    private RecentCallsListActivity.RecentCallsAdapter mAdapter;
+    private CallLogActivity.CallLogAdapter mAdapter;
     private String mVoicemail;
 
     // In memory array to hold the rows corresponding to the 'calls' table.
@@ -85,13 +82,13 @@
     private HashMap<Integer, Bitmap> mCallTypeIcons;
 
     // An item in the call list. All the methods performing checks use it.
-    private RecentCallsListActivity.RecentCallsListItemViews mItem;
+    private CallLogActivity.CallLogListItemViews mItem;
     // The list of views representing the data in the DB. View are in
     // reverse order compare to the DB.
     private View[] mList;
 
-    public RecentCallsListActivityTests() {
-        super("com.android.contacts", RecentCallsListActivity.class);
+    public CallLogActivityTests() {
+        super("com.android.contacts", CallLogActivity.class);
         mIndex = 1;
         mRnd = new Random();
     }
@@ -170,7 +167,7 @@
             if (null == mList[i]) {
                 break;
             }
-            mItem = (RecentCallsListActivity.RecentCallsListItemViews) mList[i].getTag();
+            mItem = (CallLogActivity.CallLogListItemViews) mList[i].getTag();
 
             // callView tag is the phone number.
             String number = (String) mItem.callView.getTag();
