diff --git a/src/com/android/contacts/ContactPhotoManager.java b/src/com/android/contacts/ContactPhotoManager.java
index b43af19..fdcc9b3 100644
--- a/src/com/android/contacts/ContactPhotoManager.java
+++ b/src/com/android/contacts/ContactPhotoManager.java
@@ -1425,8 +1425,10 @@
                 mPreloadStatus = PRELOAD_STATUS_DONE;
             }
 
-            Log.v(TAG, "Preloaded " + count + " photos.  Cached bytes: "
-                    + mBitmapHolderCache.size());
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Preloaded " + count + " photos.  Cached bytes: "
+                        + mBitmapHolderCache.size());
+            }
 
             requestPreloading();
         }
@@ -1609,11 +1611,15 @@
                                 uriRequest.getRequestedExtent());
                         mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED);
                     } else {
-                        Log.v(TAG, "Cannot load photo " + uri);
+                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                            Log.v(TAG, "Cannot load photo " + uri);
+                        }
                         cacheBitmap(originalUri, null, false, uriRequest.getRequestedExtent());
                     }
                 } catch (final Exception | OutOfMemoryError ex) {
-                    Log.v(TAG, "Cannot load photo " + uri, ex);
+                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                        Log.v(TAG, "Cannot load photo " + uri, ex);
+                    }
                     cacheBitmap(originalUri, null, false, uriRequest.getRequestedExtent());
                 }
             }
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index e05f7c6..4e2d178 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -304,7 +304,9 @@
     @Override
     protected void onHandleIntent(final Intent intent) {
         if (intent == null) {
-            Log.d(TAG, "onHandleIntent: could not handle null intent");
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "onHandleIntent: could not handle null intent");
+            }
             return;
         }
         if (!PermissionsUtil.hasPermission(this, WRITE_CONTACTS)) {
@@ -578,7 +580,7 @@
                                     rawContactId);
                     lookupUri = RawContacts.getContactLookupUri(resolver, rawContactUri);
                 }
-                if (lookupUri != null) {
+                if (lookupUri != null && Log.isLoggable(TAG, Log.VERBOSE)) {
                     Log.v(TAG, "Saved contact. New URI: " + lookupUri);
                 }
 
diff --git a/src/com/android/contacts/activities/AttachPhotoActivity.java b/src/com/android/contacts/activities/AttachPhotoActivity.java
index bde3dc1..b25c306 100644
--- a/src/com/android/contacts/activities/AttachPhotoActivity.java
+++ b/src/com/android/contacts/activities/AttachPhotoActivity.java
@@ -337,7 +337,9 @@
         values.setPhoto(compressed);
 
         // Finally, invoke the ContactSaveService.
-        Log.v(TAG, "all prerequisites met, about to save photo to contact");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "all prerequisites met, about to save photo to contact");
+        }
         Intent intent = ContactSaveService.createSaveContactIntent(
                 this,
                 deltaList,
diff --git a/src/com/android/contacts/compat/CompatUtils.java b/src/com/android/contacts/compat/CompatUtils.java
index 30ad9b8..10b627b 100644
--- a/src/com/android/contacts/compat/CompatUtils.java
+++ b/src/com/android/contacts/compat/CompatUtils.java
@@ -227,7 +227,9 @@
             Class.forName(className).getMethod(methodName, parameterTypes);
             return true;
         } catch (ClassNotFoundException | NoSuchMethodException e) {
-            Log.v(TAG, "Could not find method: " + className + "#" + methodName);
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Could not find method: " + className + "#" + methodName);
+            }
             return false;
         } catch (Throwable t) {
             Log.e(TAG, "Unexpected exception when checking if method: " + className + "#"
@@ -260,7 +262,9 @@
                     .invoke(instance, parameters);
         } catch (ClassNotFoundException | NoSuchMethodException | IllegalArgumentException
                 | IllegalAccessException | InvocationTargetException e) {
-            Log.v(TAG, "Could not invoke method: " + className + "#" + methodName);
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Could not invoke method: " + className + "#" + methodName);
+            }
             return null;
         } catch (Throwable t) {
             Log.e(TAG, "Unexpected exception when invoking method: " + className
diff --git a/src/com/android/contacts/detail/ContactDisplayUtils.java b/src/com/android/contacts/detail/ContactDisplayUtils.java
index 6803e9d..ef9124a 100644
--- a/src/com/android/contacts/detail/ContactDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDisplayUtils.java
@@ -255,11 +255,15 @@
             try {
                 uri = Uri.parse(source);
             } catch (Throwable e) {
-                Log.d(TAG, "Could not parse image source: " + source);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Could not parse image source: " + source);
+                }
                 return null;
             }
             if (!RES_SCHEME.equals(uri.getScheme())) {
-                Log.d(TAG, "Image source does not correspond to a resource: " + source);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Image source does not correspond to a resource: " + source);
+                }
                 return null;
             }
             // The URI authority represents the package name.
@@ -267,13 +271,17 @@
 
             Resources resources = getResourcesForResourceName(packageName);
             if (resources == null) {
-                Log.d(TAG, "Could not parse image source: " + source);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Could not parse image source: " + source);
+                }
                 return null;
             }
 
             List<String> pathSegments = uri.getPathSegments();
             if (pathSegments.size() != 1) {
-                Log.d(TAG, "Could not parse image source: " + source);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Could not parse image source: " + source);
+                }
                 return null;
             }
 
@@ -282,14 +290,18 @@
 
             if (resId == 0) {
                 // Use the default image icon in this case.
-                Log.d(TAG, "Cannot resolve resource identifier: " + source);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Cannot resolve resource identifier: " + source);
+                }
                 return null;
             }
 
             try {
                 return getResourceDrawable(resources, resId);
             } catch (NotFoundException e) {
-                Log.d(TAG, "Resource not found: " + source, e);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Resource not found: " + source, e);
+                }
                 return null;
             }
         }
@@ -307,7 +319,9 @@
             try {
                 return mPackageManager.getResourcesForApplication(packageName);
             } catch (NameNotFoundException e) {
-                Log.d(TAG, "Could not find package: " + packageName);
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, "Could not find package: " + packageName);
+                }
                 return null;
             }
         }
diff --git a/src/com/android/contacts/detail/PhotoSelectionHandler.java b/src/com/android/contacts/detail/PhotoSelectionHandler.java
index 3053714..053ee22 100644
--- a/src/com/android/contacts/detail/PhotoSelectionHandler.java
+++ b/src/com/android/contacts/detail/PhotoSelectionHandler.java
@@ -168,7 +168,9 @@
                                 return false;
                             }
                         } catch (SecurityException e) {
-                            Log.d(TAG, "Did not have read-access to uri : " + uri);
+                            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                                Log.d(TAG, "Did not have read-access to uri : " + uri);
+                            }
                             return false;
                         }
                     }
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index afe231e..da68ec6 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -389,7 +389,10 @@
                 @Override
                 public void onLoadFinished(Loader<Contact> loader, Contact contact) {
                     final long loaderCurrentTime = SystemClock.elapsedRealtime();
-                    Log.v(TAG, "Time needed for loading: " + (loaderCurrentTime-mLoaderStartTime));
+                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                        Log.v(TAG,
+                                "Time needed for loading: " + (loaderCurrentTime-mLoaderStartTime));
+                    }
                     if (!contact.isLoaded()) {
                         // Item has been deleted. Close activity without saving again.
                         Log.i(TAG, "No contact found. Closing activity");
@@ -403,8 +406,10 @@
                     final long setDataStartTime = SystemClock.elapsedRealtime();
                     setState(contact);
                     final long setDataEndTime = SystemClock.elapsedRealtime();
-
-                    Log.v(TAG, "Time needed for setting UI: " + (setDataEndTime - setDataStartTime));
+                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                        Log.v(TAG, "Time needed for setting UI: "
+                                + (setDataEndTime - setDataStartTime));
+                    }
                 }
 
                 @Override
@@ -1048,7 +1053,9 @@
     private void setState(Contact contact) {
         // If we have already loaded data, we do not want to change it here to not confuse the user
         if (!mState.isEmpty()) {
-            Log.v(TAG, "Ignoring background change. This will have to be rebased later");
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Ignoring background change. This will have to be rebased later");
+            }
             return;
         }
         mContact = contact;
@@ -1480,7 +1487,7 @@
                 mStatus = Status.CLOSING;
                 if (mListener != null) {
                     mListener.onContactSplit(contactLookupUri);
-                } else {
+                } else if (Log.isLoggable(TAG, Log.DEBUG)) {
                     Log.d(TAG, "No listener registered, can not call onSplitFinished");
                 }
                 break;
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 320a19a..7c61f64 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -452,7 +452,9 @@
             mPrimaryAccount = ContactEditorUtils.create(getContext())
                     .getOnlyOrDefaultAccount(AccountInfo.extractAccounts(mAccounts));
         }
-        vlog("state: primary " + mPrimaryAccount);
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "state: primary " + mPrimaryAccount);
+        }
 
         // Parse the given raw contact deltas
         if (rawContactDeltas == null || rawContactDeltas.isEmpty()) {
@@ -531,10 +533,14 @@
     }
 
     private void pickRawContactDelta() {
-        vlog("parse: " + mRawContactDeltas.size() + " rawContactDelta(s)");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "parse: " + mRawContactDeltas.size() + " rawContactDelta(s)");
+        }
         for (int j = 0; j < mRawContactDeltas.size(); j++) {
             final RawContactDelta rawContactDelta = mRawContactDeltas.get(j);
-            vlog("parse: " + j + " rawContactDelta" + rawContactDelta);
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "parse: " + j + " rawContactDelta" + rawContactDelta);
+            }
             if (rawContactDelta == null || !rawContactDelta.isVisible()) continue;
             final AccountType accountType = rawContactDelta.getAccountType(mAccountTypeManager);
             if (accountType == null) continue;
@@ -577,15 +583,19 @@
         final AccountType accountType = mCurrentRawContactDelta.getAccountType(mAccountTypeManager);
         final List<DataKind> dataKinds = accountType.getSortedDataKinds();
         final int dataKindSize = dataKinds == null ? 0 : dataKinds.size();
-        vlog("parse: " + dataKindSize + " dataKinds(s)");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "parse: " + dataKindSize + " dataKinds(s)");
+        }
 
         for (int i = 0; i < dataKindSize; i++) {
             final DataKind dataKind = dataKinds.get(i);
             // Skip null and un-editable fields.
             if (dataKind == null || !dataKind.editable) {
-                vlog("parse: " + i +
-                        (dataKind == null ? " dropped null data kind"
-                        : " dropped uneditable mimetype: " + dataKind.mimeType));
+                if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                    Log.v(TAG, "parse: " + i +
+                            (dataKind == null ? " dropped null data kind"
+                                    : " dropped uneditable mimetype: " + dataKind.mimeType));
+                }
                 continue;
             }
             final String mimeType = dataKind.mimeType;
@@ -593,14 +603,18 @@
             // Skip psuedo mime types
             if (DataKind.PSEUDO_MIME_TYPE_NAME.equals(mimeType) ||
                     DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(mimeType)) {
-                vlog("parse: " + i + " " + dataKind.mimeType + " dropped pseudo type");
+                if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                    Log.v(TAG, "parse: " + i + " " + dataKind.mimeType + " dropped pseudo type");
+                }
                 continue;
             }
 
             // Skip custom fields
             // TODO: Handle them when we implement editing custom fields.
             if (CustomDataItem.MIMETYPE_CUSTOM_FIELD.equals(mimeType)) {
-                vlog("parse: " + i + " " + dataKind.mimeType + " dropped custom field");
+                if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                    Log.v(TAG, "parse: " + i + " " + dataKind.mimeType + " dropped custom field");
+                }
                 continue;
             }
 
@@ -609,11 +623,13 @@
             mKindSectionDataMap.put(mimeType, kindSectionData);
             mSortedMimetypes.add(mimeType);
 
-            vlog("parse: " + i + " " + dataKind.mimeType + " " +
-                    kindSectionData.getValuesDeltas().size() + " value(s) " +
-                    kindSectionData.getNonEmptyValuesDeltas().size() + " non-empty value(s) " +
-                    kindSectionData.getVisibleValuesDeltas().size() +
-                    " visible value(s)");
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "parse: " + i + " " + dataKind.mimeType + " " +
+                        kindSectionData.getValuesDeltas().size() + " value(s) " +
+                        kindSectionData.getNonEmptyValuesDeltas().size() + " non-empty value(s) " +
+                        kindSectionData.getVisibleValuesDeltas().size() +
+                        " visible value(s)");
+            }
         }
     }
 
@@ -854,7 +870,9 @@
             i++;
             // Ignore mime types that we've already handled
             if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                vlog("kind: " + i + " " + mimeType + " dropped");
+                if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                    Log.v(TAG, "kind: " + i + " " + mimeType + " dropped");
+                }
                 continue;
             }
             final KindSectionView kindSectionView;
@@ -913,12 +931,6 @@
         return false;
     }
 
-    private static void vlog(String message) {
-        if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.v(TAG, message);
-        }
-    }
-
     private static void wlog(String message) {
         if (Log.isLoggable(TAG, Log.WARN)) {
             Log.w(TAG, message);
diff --git a/src/com/android/contacts/extensions/ExtensionsFactory.java b/src/com/android/contacts/extensions/ExtensionsFactory.java
index 33f9510..3b0ddb1 100644
--- a/src/com/android/contacts/extensions/ExtensionsFactory.java
+++ b/src/com/android/contacts/extensions/ExtensionsFactory.java
@@ -57,14 +57,20 @@
             if (className != null) {
                 mExtendedPhoneDirectoriesManager = createInstance(className);
             } else {
-                Log.d(TAG, EXTENDED_PHONE_DIRECTORIES_KEY + " not found in properties file.");
+                if (Log.isLoggable(TAG, Log.DEBUG)) {
+                    Log.d(TAG, EXTENDED_PHONE_DIRECTORIES_KEY + " not found in properties file.");
+                }
             }
 
         } catch (FileNotFoundException e) {
             // No custom extensions. Ignore.
-            Log.d(TAG, "No custom extensions.");
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "No custom extensions.");
+            }
         } catch (IOException e) {
-            Log.d(TAG, e.toString());
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, e.toString());
+            }
         }
     }
 
diff --git a/src/com/android/contacts/interactions/CalendarInteractionsLoader.java b/src/com/android/contacts/interactions/CalendarInteractionsLoader.java
index bc102e5..ec723a5 100644
--- a/src/com/android/contacts/interactions/CalendarInteractionsLoader.java
+++ b/src/com/android/contacts/interactions/CalendarInteractionsLoader.java
@@ -73,7 +73,9 @@
         allInteractions.addAll(interactions);
         allInteractions.addAll(interactions2);
 
-        Log.v(TAG, "# ContactInteraction Loaded: " + allInteractions.size());
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "# ContactInteraction Loaded: " + allInteractions.size());
+        }
         return allInteractions;
     }
 
diff --git a/src/com/android/contacts/interactions/SmsInteractionsLoader.java b/src/com/android/contacts/interactions/SmsInteractionsLoader.java
index 1de7ca3..31ab831 100644
--- a/src/com/android/contacts/interactions/SmsInteractionsLoader.java
+++ b/src/com/android/contacts/interactions/SmsInteractionsLoader.java
@@ -51,14 +51,18 @@
     public SmsInteractionsLoader(Context context, String[] phoneNums,
             int maxToRetrieve) {
         super(context);
-        Log.v(TAG, "SmsInteractionsLoader");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "SmsInteractionsLoader");
+        }
         mPhoneNums = phoneNums;
         mMaxToRetrieve = maxToRetrieve;
     }
 
     @Override
     public List<ContactInteraction> loadInBackground() {
-        Log.v(TAG, "loadInBackground");
+        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+            Log.v(TAG, "loadInBackground");
+        }
         // Confirm the device has Telephony and numbers were provided before proceeding
         if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)
                 || mPhoneNums == null || mPhoneNums.length == 0) {
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 8a6e081..dcef568 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -199,7 +199,7 @@
             return;
         }
 
-        Log.v(TAG, "New filter: " + filter);
+        if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "New filter: " + filter);
 
         setListType(filter.toListType());
         setLogListEvents(true);
diff --git a/src/com/android/contacts/model/RawContactDelta.java b/src/com/android/contacts/model/RawContactDelta.java
index b7d0665..6ee31ba 100644
--- a/src/com/android/contacts/model/RawContactDelta.java
+++ b/src/com/android/contacts/model/RawContactDelta.java
@@ -56,7 +56,7 @@
     // TODO: optimize by using contentvalues pool, since we allocate so many of them
 
     private static final String TAG = "EntityDelta";
-    private static final boolean LOGV = false;
+    private static final boolean DEBUG = false;
 
     /**
      * Direct values from {@link Entity#getEntityValues()}.
@@ -110,7 +110,7 @@
         // Create local version if none exists yet
         if (local == null) local = new RawContactDelta();
 
-        if (LOGV) {
+        if (DEBUG) {
             final Long localVersion = (local.mValues == null) ? null : local.mValues
                     .getAsLong(RawContacts.VERSION);
             final Long remoteVersion = remote.mValues.getAsLong(RawContacts.VERSION);
diff --git a/src/com/android/contacts/model/RawContactDeltaList.java b/src/com/android/contacts/model/RawContactDeltaList.java
index de007d2..2fe475a 100644
--- a/src/com/android/contacts/model/RawContactDeltaList.java
+++ b/src/com/android/contacts/model/RawContactDeltaList.java
@@ -120,99 +120,11 @@
     }
 
     /**
-     * Build a list of {@link ContentProviderOperation} that will transform all
+     * Build a list of {@link CPOWrapper} that will transform all
      * the "before" {@link Entity} states into the modified state which all
      * {@link RawContactDelta} objects represent. This method specifically creates
      * any {@link AggregationExceptions} rules needed to groups edits together.
      */
-    public ArrayList<ContentProviderOperation> buildDiff() {
-        if (VERBOSE_LOGGING) {
-            Log.v(TAG, "buildDiff: list=" + toString());
-        }
-        final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();
-
-        final long rawContactId = this.findRawContactId();
-        int firstInsertRow = -1;
-
-        // First pass enforces versions remain consistent
-        for (RawContactDelta delta : this) {
-            delta.buildAssert(diff);
-        }
-
-        final int assertMark = diff.size();
-        int backRefs[] = new int[size()];
-
-        int rawContactIndex = 0;
-
-        // Second pass builds actual operations
-        for (RawContactDelta delta : this) {
-            final int firstBatch = diff.size();
-            final boolean isInsert = delta.isContactInsert();
-            backRefs[rawContactIndex++] = isInsert ? firstBatch : -1;
-
-            delta.buildDiff(diff);
-
-            // If the user chose to join with some other existing raw contact(s) at save time,
-            // add aggregation exceptions for all those raw contacts.
-            if (mJoinWithRawContactIds != null) {
-                for (Long joinedRawContactId : mJoinWithRawContactIds) {
-                    final Builder builder = beginKeepTogether();
-                    builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, joinedRawContactId);
-                    if (rawContactId != -1) {
-                        builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, rawContactId);
-                    } else {
-                        builder.withValueBackReference(
-                                AggregationExceptions.RAW_CONTACT_ID2, firstBatch);
-                    }
-                    diff.add(builder.build());
-                }
-            }
-
-            // Only create rules for inserts
-            if (!isInsert) continue;
-
-            // If we are going to split all contacts, there is no point in first combining them
-            if (mSplitRawContacts) continue;
-
-            if (rawContactId != -1) {
-                // Has existing contact, so bind to it strongly
-                final Builder builder = beginKeepTogether();
-                builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, rawContactId);
-                builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, firstBatch);
-                diff.add(builder.build());
-
-            } else if (firstInsertRow == -1) {
-                // First insert case, so record row
-                firstInsertRow = firstBatch;
-
-            } else {
-                // Additional insert case, so point at first insert
-                final Builder builder = beginKeepTogether();
-                builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID1,
-                        firstInsertRow);
-                builder.withValueBackReference(AggregationExceptions.RAW_CONTACT_ID2, firstBatch);
-                diff.add(builder.build());
-            }
-        }
-
-        if (mSplitRawContacts) {
-            buildSplitContactDiff(diff, backRefs);
-        }
-
-        // No real changes if only left with asserts
-        if (diff.size() == assertMark) {
-            diff.clear();
-        }
-        if (VERBOSE_LOGGING) {
-            Log.v(TAG, "buildDiff: ops=" + diffToString(diff));
-        }
-        return diff;
-    }
-
-    /**
-     * For compatibility purpose, this method is copied from {@link #buildDiff} and returns an
-     * ArrayList of CPOWrapper.
-     */
     public ArrayList<CPOWrapper> buildDiffWrapper() {
         if (VERBOSE_LOGGING) {
             Log.v(TAG, "buildDiffWrapper: list=" + toString());
@@ -334,26 +246,6 @@
      * Builds {@link AggregationExceptions} to split all constituent raw contacts into
      * separate contacts.
      */
-    private void buildSplitContactDiff(final ArrayList<ContentProviderOperation> diff,
-            int[] backRefs) {
-        final int count = size();
-        for (int i = 0; i < count; i++) {
-            for (int j = 0; j < count; j++) {
-                if (i == j) {
-                    continue;
-                }
-                final Builder builder = buildSplitContactDiffHelper(i, j, backRefs);
-                if (builder != null) {
-                    diff.add(builder.build());
-                }
-            }
-        }
-    }
-
-    /**
-     * For compatibility purpose, this method is copied from {@link #buildSplitContactDiff} and
-     * takes an ArrayList of CPOWrapper as parameter.
-     */
     private void buildSplitContactDiffWrapper(final ArrayList<CPOWrapper> diff, int[] backRefs) {
         final int count = size();
         for (int i = 0; i < count; i++) {
diff --git a/src/com/android/contacts/model/account/AccountTypeProvider.java b/src/com/android/contacts/model/account/AccountTypeProvider.java
index ba2788a..38d8ca6 100644
--- a/src/com/android/contacts/model/account/AccountTypeProvider.java
+++ b/src/com/android/contacts/model/account/AccountTypeProvider.java
@@ -172,8 +172,10 @@
                 && isLocalAccountType(mLocalAccountTypeFactory, type)) {
             accountType = mLocalAccountTypeFactory.getAccountType(type);
         } else {
-            Log.d(TAG, "Registering external account type=" + type
-                    + ", packageName=" + auth.packageName);
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Registering external account type=" + type
+                        + ", packageName=" + auth.packageName);
+            }
             accountType = new ExternalAccountType(mContext, auth.packageName, false);
         }
         if (!accountType.isInitialized()) {
@@ -215,9 +217,11 @@
                         " doesn't match expected type " + type);
                 continue;
             }
-            Log.d(TAG, "Registering extension package account type="
-                    + accountType.accountType + ", dataSet=" + accountType.dataSet
-                    + ", packageName=" + extensionPackage);
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Registering extension package account type="
+                        + accountType.accountType + ", dataSet=" + accountType.dataSet
+                        + ", packageName=" + extensionPackage);
+            }
 
             result.add(extensionType);
         }
diff --git a/src/com/android/contacts/quickcontact/WebAddress.java b/src/com/android/contacts/quickcontact/WebAddress.java
index ab581c2..1b6ca19 100644
--- a/src/com/android/contacts/quickcontact/WebAddress.java
+++ b/src/com/android/contacts/quickcontact/WebAddress.java
@@ -67,8 +67,6 @@
             throw new NullPointerException();
         }
 
-        // android.util.Log.d(LOGTAG, "WebAddress: " + address);
-
         mScheme = "";
         mHost = "";
         mPort = -1;
diff --git a/src/com/android/contacts/util/ContactPhotoUtils.java b/src/com/android/contacts/util/ContactPhotoUtils.java
index b351bb8..943f5dd 100644
--- a/src/com/android/contacts/util/ContactPhotoUtils.java
+++ b/src/com/android/contacts/util/ContactPhotoUtils.java
@@ -162,7 +162,9 @@
                 outputStream.write(buffer, 0, length);
                 totalLength += length;
             }
-            Log.v(TAG, "Wrote " + totalLength + " bytes for photo " + inputUri.toString());
+            if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                Log.v(TAG, "Wrote " + totalLength + " bytes for photo " + inputUri.toString());
+            }
         } catch (IOException | NullPointerException e) {
             Log.e(TAG, "Failed to write photo: " + inputUri.toString() + " because: " + e);
             return false;
diff --git a/src/com/android/contacts/util/StopWatch.java b/src/com/android/contacts/util/StopWatch.java
index c53f346..4300eff 100644
--- a/src/com/android/contacts/util/StopWatch.java
+++ b/src/com/android/contacts/util/StopWatch.java
@@ -80,7 +80,7 @@
             sb.append(" ");
             last = current;
         }
-        Log.v(TAG, sb.toString());
+        if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, sb.toString());
     }
 
     /**
