diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index 018ac10..6d0b357 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -102,7 +102,7 @@
                 }
             };
             handler.postDelayed(runnable, BLOCK_QUERY_TIMEOUT_MS);
-            mFilteredQueryHandler.isBlocked(
+            if (mFilteredQueryHandler.startBlockedQuery(
                     new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
                         @Override
                         public void onCheckComplete(final Integer id) {
@@ -114,10 +114,18 @@
                                     onCallAddedInternal(call);
                                 }
                             } else {
+                                mFilteredQueryHandler.incrementFilteredCount(id);
                                 call.blockCall();
                             }
                         }
-                    }, null, call.getNumber(), countryIso);
+                    }, null, call.getNumber(), countryIso)) {
+                Log.d(this, "onCallAdded: invalid number "
+                        + call.getNumber() + ", skipping block checking");
+                if (!hasTimedOut.get()) {
+                    handler.removeCallbacks(runnable);
+                    onCallAddedInternal(call);
+                }
+            }
         } else {
             onCallAddedInternal(call);
         }
diff --git a/InCallUI/src/com/android/incallui/CallerInfo.java b/InCallUI/src/com/android/incallui/CallerInfo.java
index f15cb5d..06703b9 100644
--- a/InCallUI/src/com/android/incallui/CallerInfo.java
+++ b/InCallUI/src/com/android/incallui/CallerInfo.java
@@ -241,7 +241,7 @@
                 // in the database.
                 columnIndex = cursor.getColumnIndex(PhoneLookup.CUSTOM_RINGTONE);
                 if ((columnIndex != -1) && (cursor.getString(columnIndex) != null)) {
-                    if (cursor.getString(columnIndex).equals("")) {
+                    if (TextUtils.isEmpty(cursor.getString(columnIndex))) {
                         // make it consistent with frameworks/base/.../CallerInfo.java
                         info.contactRingtoneUri = Uri.EMPTY;
                     } else {
@@ -466,43 +466,7 @@
      */
     public void updateGeoDescription(Context context, String fallbackNumber) {
         String number = TextUtils.isEmpty(phoneNumber) ? fallbackNumber : phoneNumber;
-        geoDescription = getGeoDescription(context, number);
-    }
-
-    /**
-     * @return a geographical description string for the specified number.
-     * @see com.android.i18n.phonenumbers.PhoneNumberOfflineGeocoder
-     */
-    private static String getGeoDescription(Context context, String number) {
-        Log.v(TAG, "getGeoDescription('" + number + "')...");
-
-        if (TextUtils.isEmpty(number)) {
-            return null;
-        }
-
-        PhoneNumberUtil util = PhoneNumberUtil.getInstance();
-        PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
-
-        Locale locale = context.getResources().getConfiguration().locale;
-        String countryIso = TelephonyManagerUtils.getCurrentCountryIso(context, locale);
-        PhoneNumber pn = null;
-        try {
-            Log.v(TAG, "parsing '" + number
-                    + "' for countryIso '" + countryIso + "'...");
-            pn = util.parse(number, countryIso);
-            Log.v(TAG, "- parsed number: " + pn);
-        } catch (NumberParseException e) {
-            Log.v(TAG, "getGeoDescription: NumberParseException for incoming number '" +
-                    number + "'");
-        }
-
-        if (pn != null) {
-            String description = geocoder.getDescriptionForNumber(pn, locale);
-            Log.v(TAG, "- got description: '" + description + "'");
-            return description;
-        }
-
-        return null;
+        geoDescription = com.android.dialer.util.PhoneNumberUtil.getGeoDescription(context, number);
     }
 
     /**
