diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 5e6f035..95b7215 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -1050,8 +1050,22 @@
     }
 
     public static Intent getAddNumberToContactIntent(CharSequence text) {
-        final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
-        intent.putExtra(Intents.Insert.PHONE, text);
+        return getAddToContactIntent(null /* name */, text /* phoneNumber */,
+                -1 /* phoneNumberType */);
+    }
+
+    public static Intent getAddToContactIntent(CharSequence name, CharSequence phoneNumber,
+            int phoneNumberType) {
+        Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+        intent.putExtra(Intents.Insert.PHONE, phoneNumber);
+        // Only include the name and phone type extras if they are specified (the method
+        // getAddNumberToContactIntent does not use them).
+        if (name != null) {
+            intent.putExtra(Intents.Insert.NAME, name);
+        }
+        if (phoneNumberType != -1) {
+            intent.putExtra(Intents.Insert.PHONE_TYPE, phoneNumberType);
+        }
         intent.setType(Contacts.CONTENT_ITEM_TYPE);
         return intent;
     }
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 9528e45..e799b00 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -19,13 +19,14 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
+import android.content.Loader;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
 import android.provider.CallLog.Calls;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.PhoneLookup;
 import android.telecom.PhoneAccountHandle;
 import android.text.TextUtils;
@@ -44,6 +45,8 @@
 import com.android.contacts.common.CallUtil;
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.model.Contact;
+import com.android.contacts.common.model.ContactLoader;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.PhoneCallDetails;
@@ -55,6 +58,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 
@@ -1062,7 +1066,7 @@
     }
 
     protected void bindBadge(
-            View view, ContactInfo info, final PhoneCallDetails details, int callType) {
+            View view, final ContactInfo info, final PhoneCallDetails details, int callType) {
         // Do not show badge in call log.
         if (!mIsCallLog) {
             final ViewStub stub = (ViewStub) view.findViewById(R.id.link_stub);
@@ -1082,10 +1086,18 @@
                     clickableArea.setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
-                            final Intent intent =
-                                    DialtactsActivity.getAddNumberToContactIntent(details.number);
-                            DialerUtils.startActivityWithErrorToast(mContext, intent,
-                                    R.string.add_contact_not_available);
+                            // If no lookup uri is provided, we need to rely on what information
+                            // we have available; namely the phone number and name.
+                            if (info.lookupUri == null) {
+                                final Intent intent =
+                                        DialtactsActivity.getAddToContactIntent(details.name,
+                                                details.number,
+                                                details.numberType);
+                                DialerUtils.startActivityWithErrorToast(mContext, intent,
+                                        R.string.add_contact_not_available);
+                            } else {
+                                addContactFromLookupUri(info.lookupUri);
+                            }
                         }
                     });
                 }
@@ -1434,4 +1446,53 @@
             }
         }
     }
+
+    /**
+     * Invokes the "add contact" activity given the expanded contact information stored in a
+     * lookup URI.  This can include, for example, address and website information.
+     *
+     * @param lookupUri The lookup URI.
+     */
+    private void addContactFromLookupUri(Uri lookupUri) {
+        Contact contactToSave = ContactLoader.parseEncodedContactEntity(lookupUri);
+        if (contactToSave == null) {
+            return;
+        }
+
+        // Note: This code mirrors code in Contacts/QuickContactsActivity.
+        final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+        intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+
+        ArrayList<ContentValues> values = contactToSave.getContentValues();
+        // Only pre-fill the name field if the provided display name is an nickname
+        // or better (e.g. structured name, nickname)
+        if (contactToSave.getDisplayNameSource()
+                >= ContactsContract.DisplayNameSources.NICKNAME) {
+            intent.putExtra(ContactsContract.Intents.Insert.NAME,
+                    contactToSave.getDisplayName());
+        } else if (contactToSave.getDisplayNameSource()
+                == ContactsContract.DisplayNameSources.ORGANIZATION) {
+            // This is probably an organization. Instead of copying the organization
+            // name into a name entry, copy it into the organization entry. This
+            // way we will still consider the contact an organization.
+            final ContentValues organization = new ContentValues();
+            organization.put(ContactsContract.CommonDataKinds.Organization.COMPANY,
+                    contactToSave.getDisplayName());
+            organization.put(ContactsContract.Data.MIMETYPE,
+                    ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
+            values.add(organization);
+        }
+
+        // Last time used and times used are aggregated values from the usage stat
+        // table. They need to be removed from data values so the SQL table can insert
+        // properly
+        for (ContentValues value : values) {
+            value.remove(ContactsContract.Data.LAST_TIME_USED);
+            value.remove(ContactsContract.Data.TIMES_USED);
+        }
+        intent.putExtra(ContactsContract.Intents.Insert.DATA, values);
+
+        DialerUtils.startActivityWithErrorToast(mContext, intent,
+                R.string.add_contact_not_available);
+    }
 }
