diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ae64e2f..8892c24 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -68,8 +68,7 @@
         android:hardwareAccelerated="true"
         android:supportsRtl="true"
         android:backupAgent='com.android.dialer.DialerBackupAgent'
-        android:usesCleartextTraffic="false"
-        android:forceDeviceEncrypted="false">
+        android:usesCleartextTraffic="false">
 
         <meta-data android:name="com.google.android.backup.api_key"
             android:value="AEdPqrEAAAAIBXgtCEKQ6W0PXVnW-ZVia2KmlV2AxsTw3GjAeQ" />
@@ -85,8 +84,7 @@
             android:icon="@mipmap/ic_launcher_phone"
             android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
             android:resizeableActivity="true"
-            android:encryptionAware="true"
-            >
+            android:directBootAware="true">
             <intent-filter>
                 <action android:name="android.intent.action.DIAL" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -281,12 +279,12 @@
 
         <service
             android:name=".calllog.CallLogNotificationsService"
-            android:encryptionAware="true"
+            android:directBootAware="true"
             android:exported="false"
         />
 
         <receiver android:name=".calllog.MissedCallNotificationReceiver"
-            android:encryptionAware="true">
+            android:directBootAware="true">
             <intent-filter>
                 <action android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
             </intent-filter>
@@ -316,13 +314,13 @@
                   android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden"
                   android:exported="false"
                   android:screenOrientation="nosensor"
-                  android:encryptionAware="true"
+                  android:directBootAware="true"
                   android:resizeableActivity="true">
         </activity>
 
         <service android:name="com.android.incallui.InCallServiceImpl"
                  android:permission="android.permission.BIND_INCALL_SERVICE"
-                 android:encryptionAware="true" >
+                 android:directBootAware="true" >
             <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
             <meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
                 android:value="false"/>
@@ -333,7 +331,7 @@
 
         <!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
         <receiver android:name="com.android.incallui.NotificationBroadcastReceiver"
-            android:encryptionAware="true"
+            android:directBootAware="true"
             android:exported="false" />
 
         <provider
diff --git a/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
index 6dbbfc1..2839fbb 100644
--- a/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
+++ b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
@@ -352,12 +352,13 @@
                     @Override
                     public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
                         Log.d(LOG_TAG, "contactsProviderQueryCompleteListener done");
-                        if (ci != null && ci.contactExists) {
-                            if (listener != null) {
+                        // If there are no other directory queries, make sure that the listener is
+                        // notified of this result.  see b/27621628
+                        if ((ci != null && ci.contactExists) ||
+                            !startOtherDirectoriesQuery(token, context, info, listener, cookie)) {
+                            if (listener != null && ci != null) {
                                 listener.onQueryComplete(token, cookie, ci);
                             }
-                        } else {
-                            startOtherDirectoriesQuery(token, context, info, listener, cookie);
                         }
                     }
                 };
@@ -420,15 +421,13 @@
         return c;
     }
 
-    private static void startOtherDirectoriesQuery(int token, Context context, CallerInfo info,
+    // Return value indicates if listener was notified.
+    private static boolean startOtherDirectoriesQuery(int token, Context context, CallerInfo info,
             OnQueryCompleteListener listener, Object cookie) {
         long[] directoryIds = getDirectoryIds(context);
         int size = directoryIds.length;
         if (size == 0) {
-            if (listener != null) {
-                listener.onQueryComplete(token, cookie, info);
-            }
-            return;
+            return false;
         }
 
         DirectoryQueryCompleteListenerFactory listenerFactory =
@@ -448,6 +447,7 @@
                     listenerFactory.newListener(directoryId);
             startQueryInternal(token, context, info, intermediateListener, cookie, uri);
         }
+        return true;
     }
 
     /* Directory lookup related code - START */
diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
index aff3956..289b652 100644
--- a/InCallUI/src/com/android/incallui/CallerInfoUtils.java
+++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
@@ -9,13 +9,13 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
 import com.android.contacts.common.model.Contact;
 import com.android.contacts.common.model.ContactLoader;
 import com.android.dialer.R;
 import com.android.dialer.calllog.ContactInfo;
 import com.android.dialer.service.CachedNumberLookupService;
 import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+import com.android.dialer.util.TelecomUtil;
 
 import java.util.Arrays;
 
@@ -118,8 +118,7 @@
     }
 
     public static boolean isVoiceMailNumber(Context context, Call call) {
-         return TelecomManagerCompat.isVoiceMailNumber(
-                 (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE),
+         return TelecomUtil.isVoicemailNumber(context,
                  call.getTelecomCall().getDetails().getAccountHandle(),
                  call.getNumber());
     }
diff --git a/src/com/android/dialer/calllog/CallLogNotificationsHelper.java b/src/com/android/dialer/calllog/CallLogNotificationsHelper.java
index 1892631..9a50284 100644
--- a/src/com/android/dialer/calllog/CallLogNotificationsHelper.java
+++ b/src/com/android/dialer/calllog/CallLogNotificationsHelper.java
@@ -16,6 +16,8 @@
 
 package com.android.dialer.calllog;
 
+import com.google.common.base.Strings;
+
 import android.Manifest;
 import android.content.ContentResolver;
 import android.content.ContentUris;
@@ -112,12 +114,13 @@
      * Otherwise attempt to look it up in the cache.
      * If that fails, fall back to displaying the number.
      */
-    public @NonNull ContactInfo getContactInfo(@Nullable String number, int numberPresentation,
+    public ContactInfo getContactInfo(@Nullable String number, int numberPresentation,
                           @Nullable String countryIso) {
         if (countryIso == null) {
             countryIso = mCurrentCountryIso;
         }
 
+        number = Strings.nullToEmpty(number);
         ContactInfo contactInfo = new ContactInfo();
         contactInfo.number = number;
         contactInfo.formattedNumber = PhoneNumberUtils.formatNumber(number, countryIso);
diff --git a/src/com/android/dialer/calllog/PhoneAccountUtils.java b/src/com/android/dialer/calllog/PhoneAccountUtils.java
index 8c3985b..b3ce18b 100644
--- a/src/com/android/dialer/calllog/PhoneAccountUtils.java
+++ b/src/com/android/dialer/calllog/PhoneAccountUtils.java
@@ -59,6 +59,9 @@
             return null;
         }
         final ComponentName componentName = ComponentName.unflattenFromString(componentString);
+        if (componentName == null) {
+            return null;
+        }
         return new PhoneAccountHandle(componentName, accountId);
     }
 
diff --git a/tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java b/tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java
new file mode 100644
index 0000000..b5950d8
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2016 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.dialer.calllog;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.provider.CallLog;
+import android.test.AndroidTestCase;
+
+import com.android.dialer.R;
+
+/**
+ * Unit tests for {@link CallLogNotificationsHelper}.
+ */
+public class CallLogNotificationsHelperTest extends AndroidTestCase {
+    private static final String TEST_COUNTRY_ISO = "US";
+    private static final String TEST_VALID_NUMBER = "14125555555";
+    private static final String TEST_INVALID_NUMBER = "asdna128937123";
+    private static final String TEST_FORMATTED_NUMBER = "1 412-555-5555";
+    private static final String TEST_E164_NUMBER = "+14125555555";
+
+    private final ContactInfoHelper mContactInfoHelper = mock(ContactInfoHelper.class);
+
+    private CallLogNotificationsHelper mCallLogNotificationsHelper;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        mCallLogNotificationsHelper = new CallLogNotificationsHelper(getContext(),
+                null, null, mContactInfoHelper, TEST_COUNTRY_ISO);
+    }
+
+    public void testGetContactInfo_ValidNumberValidPresentationValidIso() {
+        ContactInfo contactInfo = getContactInfo(
+                TEST_VALID_NUMBER, CallLog.Calls.PRESENTATION_UNKNOWN, TEST_COUNTRY_ISO);
+        assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+        assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+        assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_ValidNumberInvalidPresentationValidIso() {
+        ContactInfo contactInfo = getContactInfo(TEST_VALID_NUMBER, -1, TEST_COUNTRY_ISO);
+        assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+        assertEquals(TEST_FORMATTED_NUMBER, contactInfo.name);
+        assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_ValidNumberValidPresentationNullIso() {
+        ContactInfo contactInfo = getContactInfo(
+                TEST_VALID_NUMBER, CallLog.Calls.PRESENTATION_UNKNOWN, null);
+        assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+        assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+        assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_ValidNumberInvalidPresentationNullIso() {
+        ContactInfo contactInfo = getContactInfo(
+                TEST_VALID_NUMBER, -1, null);
+        assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+        assertEquals(TEST_FORMATTED_NUMBER, contactInfo.name);
+        assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_NullNumberValidPresentationValidIso() {
+        ContactInfo contactInfo = getContactInfo(
+                null, CallLog.Calls.PRESENTATION_UNKNOWN, TEST_COUNTRY_ISO);
+        assertEquals("", contactInfo.number);
+        assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+        assertNull(contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_NullNumberInvalidPresentationValidIso() {
+        ContactInfo contactInfo = getContactInfo(null, -1, TEST_COUNTRY_ISO);
+        assertEquals("", contactInfo.number);
+        assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+        assertNull(contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_NullNumberValidPresentationNullIso() {
+        ContactInfo contactInfo = getContactInfo(null, CallLog.Calls.PRESENTATION_RESTRICTED, null);
+        assertEquals("", contactInfo.number);
+        assertEquals(mContext.getResources().getString(R.string.private_num), contactInfo.name);
+        assertNull(contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_NullNumberInValidPresentationNullIso() {
+        ContactInfo contactInfo = getContactInfo(null, -1, null);
+        assertEquals("", contactInfo.number);
+        assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+        assertNull(contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_InvalidNumberInValidPresentationNullIso() {
+        ContactInfo contactInfo = getContactInfo(TEST_INVALID_NUMBER, -1, null);
+        assertEquals(TEST_INVALID_NUMBER, contactInfo.name);
+        assertEquals(TEST_INVALID_NUMBER, contactInfo.formattedNumber);
+        assertEquals(null, contactInfo.normalizedNumber);
+    }
+
+    public void testGetContactInfo_NonNullCachedLookup() {
+        when(mContactInfoHelper.lookupNumber(anyString(), anyString())).thenReturn(null);
+        ContactInfo contactInfo = getContactInfo(TEST_VALID_NUMBER, -1, TEST_COUNTRY_ISO);
+        assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+        assertEquals(TEST_FORMATTED_NUMBER, contactInfo.formattedNumber);
+    }
+
+    public void testGetContactInfo_NullCachedLookup() {
+        ContactInfo cachedContactInfo = new ContactInfo();
+        cachedContactInfo.number = TEST_VALID_NUMBER;
+        cachedContactInfo.formattedNumber = TEST_FORMATTED_NUMBER;
+        when(mContactInfoHelper.lookupNumber(anyString(), anyString()))
+                .thenReturn(cachedContactInfo);
+        ContactInfo contactInfo = getContactInfo(TEST_VALID_NUMBER, -1, TEST_COUNTRY_ISO);
+        assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+        assertEquals(TEST_FORMATTED_NUMBER, contactInfo.name);
+    }
+
+    private ContactInfo getContactInfo(String number, int presentation, String countryIso) {
+        return mCallLogNotificationsHelper.getContactInfo(number, presentation, countryIso);
+    }
+}
diff --git a/tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java b/tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java
new file mode 100644
index 0000000..f2d0856
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2016 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.dialer.calllog;
+
+import android.content.ComponentName;
+import android.telecom.PhoneAccountHandle;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+public class PhoneAccountUtilsTest extends AndroidTestCase {
+
+    private static final String VALID_COMPONENT_NAME =
+            "com.android.dialer.calllog/com.android.dialer.calllog.PhoneAccountUtilsTest";
+    private static final String VALID_ACCOUNT_ID = "Account1";
+
+    @SmallTest
+    public void testGetAccount_CorrectParams() {
+        ComponentName correctComponentName =
+                ComponentName.unflattenFromString(VALID_COMPONENT_NAME);
+        PhoneAccountHandle correctPhoneAccountHandle = new PhoneAccountHandle(correctComponentName,
+                VALID_ACCOUNT_ID);
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, VALID_ACCOUNT_ID);
+
+        assertTrue(correctPhoneAccountHandle.equals(testPhoneAccountHandle));
+    }
+
+    @SmallTest
+    public void testGetAccount_ComponentStringNoClassName() {
+        final String malformedComponentName = "com.android.dialer.calllog/";
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(malformedComponentName, VALID_ACCOUNT_ID);
+
+        assertNull(testPhoneAccountHandle);
+    }
+
+    @SmallTest
+    public void testGetAccount_ComponentStringInvalid() {
+        final String malformedComponentName = "com.android.dialer.calllog";
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(malformedComponentName, VALID_ACCOUNT_ID);
+
+        assertNull(testPhoneAccountHandle);
+    }
+
+    @SmallTest
+    public void testGetAccount_NoComponentName() {
+        final String blankComponentName = "";
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(blankComponentName, VALID_ACCOUNT_ID);
+
+        assertNull(testPhoneAccountHandle);
+    }
+
+    @SmallTest
+    public void testGetAccount_NoAccountId() {
+        final String blankAccountId = "";
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, blankAccountId);
+
+        assertNull(testPhoneAccountHandle);
+    }
+
+    @SmallTest
+    public void testGetAccount_NoAccountIdOrComponentName() {
+        final String blankComponentName = "";
+        final String blankAccountId = "";
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, blankAccountId);
+
+        assertNull(testPhoneAccountHandle);
+    }
+
+    @SmallTest
+    public void testGetAccount_NullAccountIdAndComponentName() {
+        final String blankComponentName = null;
+        final String blankAccountId = null;
+
+        PhoneAccountHandle testPhoneAccountHandle =
+                PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, blankAccountId);
+
+        assertNull(testPhoneAccountHandle);
+    }
+}
