diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b1014ad..68e66ba 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -239,11 +239,12 @@
             />
         </activity>
 
+        <!-- Used to select display and sync groups -->
         <activity android:name=".ui.DisplayGroupsActivity" android:label="@string/displayGroups" />
 
         <activity
-            android:name="ShowOrCreateActivity"
-            android:theme="@style/ShowOrCreateTheme">
+            android:name=".ui.ShowOrCreateActivity"
+            android:theme="@style/FullyTranslucent">
 
             <intent-filter>
                 <action android:name="com.android.contacts.action.SHOW_OR_CREATE_CONTACT" />
@@ -251,11 +252,17 @@
                 <data android:scheme="mailto" />
                 <data android:scheme="tel" />
             </intent-filter>
+        </activity>
+
+        <!-- Used to show FastTrack window over a translucent activity, which is a
+             temporary hack until we add better framework support. -->
+        <activity
+            android:name=".ui.FastTrackActivity"
+            android:theme="@style/FullyTranslucent">
 
             <intent-filter>
-                <action android:name="com.android.contacts.action.SHOW_OR_CREATE_CONTACT" />
+                <action android:name="com.android.contacts.action.FAST_TRACK" />
                 <category android:name="android.intent.category.DEFAULT" />
-                <data android:mimeType="vnd.android.cursor.item/person" android:host="contacts" />
                 <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" />
             </intent-filter>
         </activity>
@@ -413,6 +420,3 @@
 
     </application>
 </manifest>
-
-
-
diff --git a/res/layout-finger/contacts_list_item_photo.xml b/res/layout-finger/contacts_list_item_photo.xml
index 6b17ef6..0330534 100644
--- a/res/layout-finger/contacts_list_item_photo.xml
+++ b/res/layout-finger/contacts_list_item_photo.xml
@@ -55,7 +55,7 @@
             android:layout_alignParentLeft="true"
             android:layout_centerVertical="true"
             android:layout_marginRight="8dip"
-            style="@*android:style/Widget.FasttrackBadgeWidget.WindowLarge" />
+            style="@*android:style/Widget.FasttrackBadgeWidget.WindowMedium" />
         />
 
         <TextView android:id="@+id/label"
diff --git a/res/values/styles.xml b/res/values/styles.xml
index cedd2b7..b656160 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -44,7 +44,7 @@
         <item name="android:windowIsFloating">true</item>
     </style>
 
-    <style name="ShowOrCreateTheme" parent="android:Theme.Translucent.NoTitleBar">
+    <style name="FullyTranslucent" parent="android:Theme.Translucent.NoTitleBar">
         <item name="android:windowContentOverlay">@null</item>
     </style>
 
diff --git a/src/com/android/contacts/ui/FastTrackActivity.java b/src/com/android/contacts/ui/FastTrackActivity.java
new file mode 100644
index 0000000..8fdc40d
--- /dev/null
+++ b/src/com/android/contacts/ui/FastTrackActivity.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.ui;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.FastTrack;
+
+/**
+ * Stub translucent activity that just shows {@link FastTrackWindow} floating
+ * above the caller. This temporary hack should eventually be replaced with
+ * direct framework support.
+ */
+public final class FastTrackActivity extends Activity implements FastTrackWindow.OnDismissListener {
+    private FastTrackWindow mFastTrack;
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        // Use our local window token for now
+        final Intent intent = getIntent();
+        final Uri lookupUri = intent.getData();
+        final Bundle extras = intent.getExtras();
+
+        // Read requested parameters for displaying
+        final Rect target = (Rect)extras.getParcelable(FastTrack.EXTRA_TARGET_RECT);
+        final int mode = extras.getInt(FastTrack.EXTRA_MODE, FastTrack.MODE_MEDIUM);
+        final String[] excludeMimes = extras.getStringArray(FastTrack.EXTRA_EXCLUDE_MIMES);
+
+        mFastTrack = new FastTrackWindow(this, this);
+        mFastTrack.show(lookupUri, target, mode, excludeMimes);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        mFastTrack.dismiss();
+    }
+
+    /** {@inheritDoc} */
+    public void onDismiss(FastTrackWindow dialog) {
+        // When dismissed, finish this activity
+        finish();
+    }
+}
diff --git a/src/com/android/contacts/ui/FastTrackWindow.java b/src/com/android/contacts/ui/FastTrackWindow.java
index fd5036d..ba0d912 100644
--- a/src/com/android/contacts/ui/FastTrackWindow.java
+++ b/src/com/android/contacts/ui/FastTrackWindow.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2009 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,10 +36,9 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.provider.ContactsContract;
-import android.provider.SocialContract;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.FastTrack;
 import android.provider.ContactsContract.Intents;
 import android.provider.ContactsContract.Presence;
 import android.provider.ContactsContract.RawContacts;
@@ -212,13 +212,13 @@
     private View getHeaderView(int mode) {
         View header = null;
         switch (mode) {
-            case Intents.MODE_SMALL:
+            case FastTrack.MODE_SMALL:
                 header = mWindow.findViewById(R.id.header_small);
                 break;
-            case Intents.MODE_MEDIUM:
+            case FastTrack.MODE_MEDIUM:
                 header = mWindow.findViewById(R.id.header_medium);
                 break;
-            case Intents.MODE_LARGE:
+            case FastTrack.MODE_LARGE:
                 header = mWindow.findViewById(R.id.header_large);
                 break;
         }
@@ -390,10 +390,10 @@
      */
     private synchronized void considerShowing() {
         if (mHasSummary && mHasSocial && mHasActions && !mShowing) {
-            if (mMode == Intents.MODE_MEDIUM && !mHasValidSocial) {
+            if (mMode == FastTrack.MODE_MEDIUM && !mHasValidSocial) {
                 // Missing valid social, swap medium for small header
                 mHeader.setVisibility(View.GONE);
-                mHeader = getHeaderView(Intents.MODE_SMALL);
+                mHeader = getHeaderView(FastTrack.MODE_SMALL);
             }
 
             // All queries have returned, pull curtain
diff --git a/src/com/android/contacts/ShowOrCreateActivity.java b/src/com/android/contacts/ui/ShowOrCreateActivity.java
similarity index 78%
rename from src/com/android/contacts/ShowOrCreateActivity.java
rename to src/com/android/contacts/ui/ShowOrCreateActivity.java
index ed8568a..8d3ed01 100755
--- a/src/com/android/contacts/ShowOrCreateActivity.java
+++ b/src/com/android/contacts/ui/ShowOrCreateActivity.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.contacts;
+package com.android.contacts.ui;
 
-import com.android.contacts.ui.FastTrackWindow;
+import com.android.contacts.ContactsListActivity;
+import com.android.contacts.R;
 import com.android.contacts.util.Constants;
 import com.android.contacts.util.NotifyingAsyncQueryHandler;
 
@@ -28,7 +29,6 @@
 import android.content.EntityIterator;
 import android.content.Intent;
 import android.database.Cursor;
-import android.graphics.Rect;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
@@ -47,14 +47,14 @@
  * <li>If no matching contacts found, will prompt user with dialog to add to a
  * contact, then will use {@link Intent#ACTION_INSERT_OR_EDIT} to let create new
  * contact or edit new data into an existing one.
- * <li>If one matching contact found, show the {@link FastTrackWindow}
- * associated with the found contact. Will show translucent over the caller.
+ * <li>If one matching contact found, directly show {@link Intent#ACTION_VIEW}
+ * that specific contact.
  * <li>If more than one matching found, show list of matching contacts using
  * {@link Intent#ACTION_SEARCH}.
  * </ul>
  */
 public final class ShowOrCreateActivity extends Activity implements
-        NotifyingAsyncQueryHandler.AsyncQueryListener, FastTrackWindow.OnDismissListener {
+        NotifyingAsyncQueryHandler.AsyncQueryListener {
     static final String TAG = "ShowOrCreateActivity";
     static final boolean LOGD = false;
 
@@ -66,7 +66,7 @@
         RawContacts.CONTACT_ID,
     };
 
-    static final int AGGREGATE_ID_INDEX = 0;
+    static final int CONTACT_ID_INDEX = 0;
 
     static final int QUERY_TOKEN = 42;
 
@@ -76,8 +76,6 @@
     private String mCreateDescrip;
     private boolean mCreateForce;
 
-    private FastTrackWindow mFastTrack;
-
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -120,7 +118,7 @@
         if (Constants.SCHEME_MAILTO.equals(scheme)) {
             mCreateExtras.putString(Intents.Insert.EMAIL, ssp);
 
-            Uri uri = Uri.withAppendedPath(Email.CONTENT_FILTER_EMAIL_URI, Uri.encode(ssp));
+            Uri uri = Uri.withAppendedPath(Email.CONTENT_FILTER_URI, Uri.encode(ssp));
             mQueryHandler.startQuery(QUERY_TOKEN, null, uri, CONTACTS_PROJECTION, null, null, null);
 
         } else if (Constants.SCHEME_TEL.equals(scheme)) {
@@ -130,9 +128,8 @@
             mQueryHandler.startQuery(QUERY_TOKEN, null, uri, PHONES_PROJECTION, null, null, null);
 
         } else {
-            // Otherwise assume incoming aggregate Uri
-            showFastTrack(data);
-
+            Log.w(TAG, "Invalid intent:" + getIntent());
+            finish();
         }
     }
 
@@ -142,40 +139,6 @@
         if (mQueryHandler != null) {
             mQueryHandler.cancelOperation(QUERY_TOKEN);
         }
-        if (mFastTrack != null) {
-            mFastTrack.dismiss();
-        }
-    }
-
-    /**
-     * Show a {@link FastTrackWindow} for the given aggregate at the requested
-     * screen location.
-     */
-    private void showFastTrack(Uri aggUri) {
-        // Use our local window token for now
-        final Bundle extras = getIntent().getExtras();
-
-        Rect targetRect;
-        if (extras.containsKey(Intents.EXTRA_TARGET_RECT)) {
-            targetRect = (Rect)extras.getParcelable(Intents.EXTRA_TARGET_RECT);
-        } else {
-            // TODO: this default rect matches gmail messages, and should move over there
-            Log.w(TAG, "Using default TARGET_RECT");
-            targetRect = new Rect(15, 110, 15+18, 110+18);
-        }
-
-        // Use requested display mode, defaulting to medium
-        final int mode = extras.getInt(Intents.EXTRA_MODE, Intents.MODE_MEDIUM);
-        final String[] excludeMimes = extras.getStringArray(Intents.EXTRA_EXCLUDE_MIMES);
-
-        mFastTrack = new FastTrackWindow(this, this);
-        mFastTrack.show(aggUri, targetRect, mode, excludeMimes);
-    }
-
-    /** {@inheritDoc} */
-    public void onDismiss(FastTrackWindow dialog) {
-        // When dismissed, finish this activity
-        finish();
     }
 
     /** {@inheritDoc} */
@@ -188,21 +151,23 @@
 
         // Count contacts found by query
         int count = 0;
-        long aggId = -1;
+        long contactId = -1;
         try {
             count = cursor.getCount();
             if (count == 1 && cursor.moveToFirst()) {
                 // Try reading ID if only one contact returned
-                aggId = cursor.getLong(AGGREGATE_ID_INDEX);
+                contactId = cursor.getLong(CONTACT_ID_INDEX);
             }
         } finally {
             cursor.close();
         }
 
-        if (count == 1 && aggId != -1) {
-            // If we only found one item, show fast-track
-            final Uri aggUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, aggId);
-            showFastTrack(aggUri);
+        if (count == 1 && contactId != -1) {
+            // If we only found one item, jump right to viewing it
+            final Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
+            final Intent viewIntent = new Intent(Intent.ACTION_VIEW, contactUri);
+            startActivity(viewIntent);
+            finish();
 
         } else if (count > 1) {
             // If more than one, show pick list
