diff --git a/src/com/android/contacts/common/util/ContactDisplayUtils.java b/src/com/android/contacts/common/util/ContactDisplayUtils.java
new file mode 100644
index 0000000..7817d90
--- /dev/null
+++ b/src/com/android/contacts/common/util/ContactDisplayUtils.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2012 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.common.util;
+
+import static android.provider.ContactsContract.CommonDataKinds.Phone;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.android.contacts.common.R;
+import com.android.internal.util.Preconditions;
+
+/**
+ * Methods for handling various contact data labels.
+ */
+public class ContactDisplayUtils {
+
+    private static final String TAG = ContactDisplayUtils.class.getSimpleName();
+
+    public static final int INTERACTION_CALL = 1;
+    public static final int INTERACTION_SMS = 2;
+
+    /**
+     * Checks if the given data type is a custom type.
+     *
+     * @param type Phone data type.
+     * @return {@literal true} if the type is custom.  {@literal false} if not.
+     */
+    public static boolean isCustomPhoneType(Integer type) {
+        return type == Phone.TYPE_CUSTOM || type == Phone.TYPE_ASSISTANT;
+    }
+
+    /**
+     * Gets a display label for a given phone type.
+     *
+     * @param type The type of number.
+     * @param customLabel A custom label to use if the phone is determined to be of custom type
+     * determined by {@link #isCustomPhoneType(Integer))}
+     * @param interactionType whether this is a call or sms.  Either {@link #INTERACTION_CALL} or
+     * {@link #INTERACTION_SMS}.
+     * @param context The application context.
+     * @return An appropriate string label
+     */
+    public static CharSequence getLabelForCallOrSms(Integer type, CharSequence customLabel,
+            int interactionType, Context context) {
+        Preconditions.checkNotNull(context);
+
+        if (isCustomPhoneType(type)) {
+            return (customLabel == null) ? "" : customLabel;
+        } else {
+            int resId;
+            if (interactionType == INTERACTION_SMS) {
+                resId = getSmsLabelResourceId(type);
+            } else {
+                resId = getPhoneLabelResourceId(type);
+                if (interactionType != INTERACTION_CALL) {
+                    Log.e(TAG, "Un-recognized interaction type: " + interactionType +
+                            ". Defaulting to ContactDisplayUtils.INTERACTION_CALL.");
+                }
+            }
+
+            return context.getResources().getText(resId);
+        }
+    }
+
+    /**
+     * Find a label for calling.
+     *
+     * @param type The type of number.
+     * @return An appropriate string label.
+     */
+    public static int getPhoneLabelResourceId(Integer type) {
+        if (type == null) return R.string.call_other;
+        switch (type) {
+            case Phone.TYPE_HOME:
+                return R.string.call_home;
+            case Phone.TYPE_MOBILE:
+                return R.string.call_mobile;
+            case Phone.TYPE_WORK:
+                return R.string.call_work;
+            case Phone.TYPE_FAX_WORK:
+                return R.string.call_fax_work;
+            case Phone.TYPE_FAX_HOME:
+                return R.string.call_fax_home;
+            case Phone.TYPE_PAGER:
+                return R.string.call_pager;
+            case Phone.TYPE_OTHER:
+                return R.string.call_other;
+            case Phone.TYPE_CALLBACK:
+                return R.string.call_callback;
+            case Phone.TYPE_CAR:
+                return R.string.call_car;
+            case Phone.TYPE_COMPANY_MAIN:
+                return R.string.call_company_main;
+            case Phone.TYPE_ISDN:
+                return R.string.call_isdn;
+            case Phone.TYPE_MAIN:
+                return R.string.call_main;
+            case Phone.TYPE_OTHER_FAX:
+                return R.string.call_other_fax;
+            case Phone.TYPE_RADIO:
+                return R.string.call_radio;
+            case Phone.TYPE_TELEX:
+                return R.string.call_telex;
+            case Phone.TYPE_TTY_TDD:
+                return R.string.call_tty_tdd;
+            case Phone.TYPE_WORK_MOBILE:
+                return R.string.call_work_mobile;
+            case Phone.TYPE_WORK_PAGER:
+                return R.string.call_work_pager;
+            case Phone.TYPE_ASSISTANT:
+                return R.string.call_assistant;
+            case Phone.TYPE_MMS:
+                return R.string.call_mms;
+            default:
+                return R.string.call_custom;
+        }
+
+    }
+
+    /**
+     * Find a label for sending an sms.
+     *
+     * @param type The type of number.
+     * @return An appropriate string label.
+     */
+    public static int getSmsLabelResourceId(Integer type) {
+        if (type == null) return R.string.sms_other;
+        switch (type) {
+            case Phone.TYPE_HOME:
+                return R.string.sms_home;
+            case Phone.TYPE_MOBILE:
+                return R.string.sms_mobile;
+            case Phone.TYPE_WORK:
+                return R.string.sms_work;
+            case Phone.TYPE_FAX_WORK:
+                return R.string.sms_fax_work;
+            case Phone.TYPE_FAX_HOME:
+                return R.string.sms_fax_home;
+            case Phone.TYPE_PAGER:
+                return R.string.sms_pager;
+            case Phone.TYPE_OTHER:
+                return R.string.sms_other;
+            case Phone.TYPE_CALLBACK:
+                return R.string.sms_callback;
+            case Phone.TYPE_CAR:
+                return R.string.sms_car;
+            case Phone.TYPE_COMPANY_MAIN:
+                return R.string.sms_company_main;
+            case Phone.TYPE_ISDN:
+                return R.string.sms_isdn;
+            case Phone.TYPE_MAIN:
+                return R.string.sms_main;
+            case Phone.TYPE_OTHER_FAX:
+                return R.string.sms_other_fax;
+            case Phone.TYPE_RADIO:
+                return R.string.sms_radio;
+            case Phone.TYPE_TELEX:
+                return R.string.sms_telex;
+            case Phone.TYPE_TTY_TDD:
+                return R.string.sms_tty_tdd;
+            case Phone.TYPE_WORK_MOBILE:
+                return R.string.sms_work_mobile;
+            case Phone.TYPE_WORK_PAGER:
+                return R.string.sms_work_pager;
+            case Phone.TYPE_ASSISTANT:
+                return R.string.sms_assistant;
+            case Phone.TYPE_MMS:
+                return R.string.sms_mms;
+            default:
+                return R.string.sms_custom;
+        }
+    }
+
+}
diff --git a/src/com/android/contacts/common/util/StopWatch.java b/src/com/android/contacts/common/util/StopWatch.java
new file mode 100644
index 0000000..581d6ee
--- /dev/null
+++ b/src/com/android/contacts/common/util/StopWatch.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2012 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.common.util;
+
+import android.util.Log;
+
+import com.google.common.collect.Lists;
+
+import java.util.ArrayList;
+
+/**
+ * A {@link StopWatch} records start, laps and stop, and print them to logcat.
+ */
+public class StopWatch {
+
+    private final String mLabel;
+
+    private final ArrayList<Long> mTimes = Lists.newArrayList();
+    private final ArrayList<String> mLapLabels = Lists.newArrayList();
+
+    private StopWatch(String label) {
+        mLabel = label;
+        lap("");
+    }
+
+    /**
+     * Create a new instance and start it.
+     */
+    public static StopWatch start(String label) {
+        return new StopWatch(label);
+    }
+
+    /**
+     * Record a lap.
+     */
+    public void lap(String lapLabel) {
+        mTimes.add(System.currentTimeMillis());
+        mLapLabels.add(lapLabel);
+    }
+
+    /**
+     * Stop it and log the result, if the total time >= {@code timeThresholdToLog}.
+     */
+    public void stopAndLog(String TAG, int timeThresholdToLog) {
+
+        lap("");
+
+        final long start = mTimes.get(0);
+        final long stop = mTimes.get(mTimes.size() - 1);
+
+        final long total = stop - start;
+        if (total < timeThresholdToLog) return;
+
+        final StringBuilder sb = new StringBuilder();
+        sb.append(mLabel);
+        sb.append(",");
+        sb.append(total);
+        sb.append(": ");
+
+        long last = start;
+        for (int i = 1; i < mTimes.size(); i++) {
+            final long current = mTimes.get(i);
+            sb.append(mLapLabels.get(i));
+            sb.append(",");
+            sb.append((current - last));
+            sb.append(" ");
+            last = current;
+        }
+        Log.v(TAG, sb.toString());
+    }
+
+    /**
+     * Return a dummy instance that does no operations.
+     */
+    public static StopWatch getNullStopWatch() {
+        return NullStopWatch.INSTANCE;
+    }
+
+    private static class NullStopWatch extends StopWatch {
+        public static final NullStopWatch INSTANCE = new NullStopWatch();
+
+        public NullStopWatch() {
+            super(null);
+        }
+
+        @Override
+        public void lap(String lapLabel) {
+            // noop
+        }
+
+        @Override
+        public void stopAndLog(String TAG, int timeThresholdToLog) {
+            // noop
+        }
+    }
+}
diff --git a/tests/src/com/android/contacts/common/util/ContactDisplayUtilTests.java b/tests/src/com/android/contacts/common/util/ContactDisplayUtilTests.java
new file mode 100644
index 0000000..544abbb
--- /dev/null
+++ b/tests/src/com/android/contacts/common/util/ContactDisplayUtilTests.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012 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.common.util;
+
+import static android.provider.ContactsContract.CommonDataKinds.Phone;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.R;
+
+/**
+ * Unit tests for (@link ContactDisplayUtils}
+ */
+@SmallTest
+public class ContactDisplayUtilTests extends AndroidTestCase {
+
+    public void testIsCustomPhoneTypeReturnsTrue() {
+        assertTrue(ContactDisplayUtils.isCustomPhoneType(Phone.TYPE_CUSTOM));
+        assertTrue(ContactDisplayUtils.isCustomPhoneType(Phone.TYPE_ASSISTANT));
+    }
+
+    public void testIsCustomPhoneTypeReturnsFalse() {
+        assertFalse(ContactDisplayUtils.isCustomPhoneType(Phone.TYPE_HOME));
+        assertFalse(ContactDisplayUtils.isCustomPhoneType(Phone.TYPE_FAX_WORK));
+        assertFalse(ContactDisplayUtils.isCustomPhoneType(Phone.TYPE_MOBILE));
+        assertFalse(ContactDisplayUtils.isCustomPhoneType(Phone.TYPE_OTHER));
+    }
+
+    public void testGetLabelForCallOrSmsReturnsCustomLabel() {
+        final CharSequence smsResult = ContactDisplayUtils.getLabelForCallOrSms(Phone.TYPE_CUSTOM,
+                "expected sms label", ContactDisplayUtils.INTERACTION_SMS, getContext());
+        assertEquals("expected sms label", smsResult);
+
+        final CharSequence callResult = ContactDisplayUtils.getLabelForCallOrSms(Phone.TYPE_CUSTOM,
+                "expected call label", ContactDisplayUtils.INTERACTION_CALL, getContext());
+        assertEquals("expected call label", callResult);
+    }
+
+    public void testGetLabelForCallOrSmsReturnsCallLabels() {
+        CharSequence result = ContactDisplayUtils.getLabelForCallOrSms(Phone.TYPE_HOME, "",
+                ContactDisplayUtils.INTERACTION_CALL, getContext());
+        CharSequence expected = getContext().getResources().getText(R.string.call_home);
+        assertEquals(expected, result);
+
+        result = ContactDisplayUtils.getLabelForCallOrSms(Phone.TYPE_MOBILE, "",
+                ContactDisplayUtils.INTERACTION_CALL, getContext());
+        expected = getContext().getResources().getText(R.string.call_mobile);
+        assertEquals(expected, result);
+    }
+
+    public void testGetLabelForCallOrSmsReturnsSmsLabels() {
+        CharSequence result = ContactDisplayUtils.getLabelForCallOrSms(Phone.TYPE_HOME, "",
+                ContactDisplayUtils.INTERACTION_SMS, getContext());
+        CharSequence expected = getContext().getResources().getText(R.string.sms_home);
+        assertEquals(expected, result);
+
+        result = ContactDisplayUtils.getLabelForCallOrSms(Phone.TYPE_MOBILE, "",
+                ContactDisplayUtils.INTERACTION_SMS, getContext());
+        expected = getContext().getResources().getText(R.string.sms_mobile);
+        assertEquals(expected, result);
+    }
+
+    public void testGetPhoneLabelResourceIdReturnsOther() {
+        assertEquals(R.string.call_other, ContactDisplayUtils.getPhoneLabelResourceId(null));
+    }
+
+    public void testGetPhoneLabelResourceIdReturnsMatchHome() {
+        assertEquals(R.string.call_home, ContactDisplayUtils.getPhoneLabelResourceId(
+                Phone.TYPE_HOME));
+    }
+
+    public void testGetSmsLabelResourceIdReturnsOther() {
+        assertEquals(R.string.sms_other, ContactDisplayUtils.getSmsLabelResourceId(null));
+    }
+
+    public void testGetSmsLabelResourceIdReturnsMatchHome() {
+        assertEquals(R.string.sms_home, ContactDisplayUtils.getSmsLabelResourceId(Phone.TYPE_HOME));
+    }
+
+}
