diff --git a/src/com/android/bluetooth/btservice/AdapterProperties.java b/src/com/android/bluetooth/btservice/AdapterProperties.java
index abc349d..257eb1f 100644
--- a/src/com/android/bluetooth/btservice/AdapterProperties.java
+++ b/src/com/android/bluetooth/btservice/AdapterProperties.java
@@ -139,6 +139,9 @@
                 case BluetoothPbapClient.ACTION_CONNECTION_STATE_CHANGED:
                     sendConnectionStateChange(BluetoothProfile.PBAP_CLIENT, intent);
                     break;
+                case BluetoothPbap.ACTION_CONNECTION_STATE_CHANGED:
+                    sendConnectionStateChange(BluetoothProfile.PBAP, intent);
+                    break;
                 default:
                     Log.w(TAG, "Received unknown intent " + intent);
                     break;
diff --git a/src/com/android/bluetooth/hfp/AtPhonebook.java b/src/com/android/bluetooth/hfp/AtPhonebook.java
index 0387394..f272725 100755
--- a/src/com/android/bluetooth/hfp/AtPhonebook.java
+++ b/src/com/android/bluetooth/hfp/AtPhonebook.java
@@ -490,6 +490,7 @@
         // Check phonebook
         PhonebookResult pbr = getPhonebookResult(mCurrentPhonebook, true); //false);
         if (pbr == null) {
+            Log.e(TAG, "pbr is null");
             atCommandErrorCode = BluetoothCmeError.OPERATION_NOT_ALLOWED;
             return atCommandResult;
         }
@@ -499,11 +500,17 @@
         // When we send error, certain kits like BMW disconnect the
         // Handsfree connection.
         if (pbr.cursor.getCount() == 0 || mCpbrIndex1 <= 0 || mCpbrIndex2 < mCpbrIndex1  ||
-            mCpbrIndex2 > pbr.cursor.getCount() || mCpbrIndex1 > pbr.cursor.getCount()) {
+            mCpbrIndex1 > pbr.cursor.getCount()) {
             atCommandResult = HeadsetHalConstants.AT_RESPONSE_OK;
+            Log.e(TAG, "Invalid request or no results, returning");
             return atCommandResult;
         }
 
+        if (mCpbrIndex2 > pbr.cursor.getCount()) {
+            Log.w(TAG, "max index requested is greater than number of records"
+                        + " available, resetting it");
+            mCpbrIndex2 = pbr.cursor.getCount();
+        }
         // Process
         atCommandResult = HeadsetHalConstants.AT_RESPONSE_OK;
         int errorDetected = -1; // no error
diff --git a/src/com/android/bluetooth/pbap/BluetoothPbapService.java b/src/com/android/bluetooth/pbap/BluetoothPbapService.java
index af38eb3..cc2dd25 100644
--- a/src/com/android/bluetooth/pbap/BluetoothPbapService.java
+++ b/src/com/android/bluetooth/pbap/BluetoothPbapService.java
@@ -239,7 +239,7 @@
     private BluetoothPbapContentObserver mContactChangeObserver;
 
     public BluetoothPbapService() {
-        mState = BluetoothPbap.STATE_DISCONNECTED;
+        mState = BluetoothProfile.STATE_DISCONNECTED;
         mContext = this;
     }
 
@@ -481,7 +481,7 @@
         }
         BluetoothObexTransport transport = new BluetoothObexTransport(mConnSocket);
         mServerSession = new ServerSession(transport, mPbapServer, mAuth);
-        setState(BluetoothPbap.STATE_CONNECTED);
+        setState(BluetoothProfile.STATE_CONNECTED);
 
         mSessionStatusHandler.removeMessages(MSG_RELEASE_WAKE_LOCK);
         mSessionStatusHandler.sendMessageDelayed(mSessionStatusHandler
@@ -513,7 +513,7 @@
         if (mAdapter != null && mAdapter.isEnabled()) {
             startSocketListeners();
         }
-        setState(BluetoothPbap.STATE_DISCONNECTED);
+        setState(BluetoothProfile.STATE_DISCONNECTED);
     }
 
     private void notifyAuthKeyInput(final String key) {
@@ -733,7 +733,7 @@
                     + result);
             int prevState = mState;
             mState = state;
-            Intent intent = new Intent(BluetoothPbap.PBAP_STATE_CHANGED_ACTION);
+            Intent intent = new Intent(BluetoothPbap.ACTION_CONNECTION_STATE_CHANGED);
             intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState);
             intent.putExtra(BluetoothProfile.EXTRA_STATE, mState);
             intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mRemoteDevice);
@@ -859,13 +859,13 @@
             Log.w(TAG, "Unable to unregister pbap receiver", e);
         }
         mSessionStatusHandler.obtainMessage(SHUTDOWN).sendToTarget();
-        setState(BluetoothPbap.STATE_DISCONNECTED, BluetoothPbap.RESULT_CANCELED);
+        setState(BluetoothProfile.STATE_DISCONNECTED, BluetoothPbap.RESULT_CANCELED);
         return true;
     }
 
     protected void disconnect() {
         synchronized (this) {
-            if (mState == BluetoothPbap.STATE_CONNECTED) {
+            if (mState == BluetoothProfile.STATE_CONNECTED) {
                 if (mServerSession != null) {
                     mServerSession.close();
                     mServerSession = null;
@@ -873,7 +873,7 @@
 
                 closeConnectionSocket();
 
-                setState(BluetoothPbap.STATE_DISCONNECTED, BluetoothPbap.RESULT_CANCELED);
+                setState(BluetoothProfile.STATE_DISCONNECTED, BluetoothPbap.RESULT_CANCELED);
             }
         }
     }
@@ -907,7 +907,7 @@
         public int getState() {
             if (DEBUG) Log.d(TAG, "getState = " + mService.getState());
             BluetoothPbapService service = getService(BLUETOOTH_PERM);
-            if (service == null) return BluetoothPbap.STATE_DISCONNECTED;
+            if (service == null) return BluetoothProfile.STATE_DISCONNECTED;
 
             return service.getState();
         }
@@ -923,7 +923,7 @@
             if (DEBUG) Log.d(TAG, "isConnected " + device);
             BluetoothPbapService service = getService(BLUETOOTH_PERM);
             if (service == null) return false;
-            return service.getState() == BluetoothPbap.STATE_CONNECTED
+            return service.getState() == BluetoothProfile.STATE_CONNECTED
                     && service.getRemoteDevice().equals(device);
         }
 
diff --git a/tests/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandlerTest.java b/tests/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandlerTest.java
index a56f144..efa17ac 100644
--- a/tests/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandlerTest.java
+++ b/tests/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamHandlerTest.java
@@ -76,8 +76,7 @@
         when(mockContext.getSystemService(Context.AUDIO_SERVICE)).thenReturn(mockAudioManager);
         when(mockContext.getResources()).thenReturn(mockResources);
         when(mockResources.getInteger(anyInt())).thenReturn(DUCK_PERCENT);
-        when(mockAudioManager.requestAudioFocus(audioFocusChangeListenerArgumentCaptor.capture(),
-                     eq(AudioManager.STREAM_MUSIC), eq(AudioManager.AUDIOFOCUS_GAIN)))
+        when(mockAudioManager.requestAudioFocus(any()))
                 .thenReturn(AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
         when(mockAudioManager.abandonAudioFocus(any())).thenReturn(AudioManager.AUDIOFOCUS_GAIN);
         doNothing().when(mockA2dpSink).informAudioTrackGainNative(anyFloat());
@@ -93,7 +92,7 @@
         // Stream started without local play, expect no change in streaming.
         streamHandler.handleMessage(
                 streamHandler.obtainMessage(A2dpSinkStreamHandler.SRC_STR_START));
-        verify(mockAudioManager, times(0)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(0)).requestAudioFocus(any());
         verify(mockA2dpSink, times(0)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(0)).informAudioTrackGainNative(1.0f);
     }
@@ -103,7 +102,7 @@
         // Stream stopped without local play, expect no change in streaming.
         streamHandler.handleMessage(
                 streamHandler.obtainMessage(A2dpSinkStreamHandler.SRC_STR_STOP));
-        verify(mockAudioManager, times(0)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(0)).requestAudioFocus(any());
         verify(mockA2dpSink, times(0)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(0)).informAudioTrackGainNative(1.0f);
     }
@@ -112,7 +111,7 @@
     public void testSnkPlay() {
         // Play was pressed locally, expect streaming to start.
         streamHandler.handleMessage(streamHandler.obtainMessage(A2dpSinkStreamHandler.SNK_PLAY));
-        verify(mockAudioManager, times(1)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(1)).requestAudioFocus(any());
         verify(mockA2dpSink, times(1)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(1)).informAudioTrackGainNative(1.0f);
     }
@@ -121,7 +120,7 @@
     public void testSnkPause() {
         // Pause was pressed locally, expect streaming to stop.
         streamHandler.handleMessage(streamHandler.obtainMessage(A2dpSinkStreamHandler.SNK_PAUSE));
-        verify(mockAudioManager, times(0)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(0)).requestAudioFocus(any());
         verify(mockA2dpSink, times(0)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(0)).informAudioTrackGainNative(1.0f);
     }
@@ -139,7 +138,7 @@
     public void testSrcPlay() {
         // Play was pressed remotely, expect no streaming due to lack of audio focus.
         streamHandler.handleMessage(streamHandler.obtainMessage(A2dpSinkStreamHandler.SRC_PLAY));
-        verify(mockAudioManager, times(0)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(0)).requestAudioFocus(any());
         verify(mockA2dpSink, times(0)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(0)).informAudioTrackGainNative(1.0f);
     }
@@ -149,7 +148,7 @@
         // Play was pressed remotely for an iot device, expect streaming to start.
         when(mockPackageManager.hasSystemFeature(any())).thenReturn(true);
         streamHandler.handleMessage(streamHandler.obtainMessage(A2dpSinkStreamHandler.SRC_PLAY));
-        verify(mockAudioManager, times(1)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(1)).requestAudioFocus(any());
         verify(mockA2dpSink, times(1)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(1)).informAudioTrackGainNative(1.0f);
     }
@@ -158,7 +157,7 @@
     public void testSrcPause() {
         // Play was pressed locally, expect streaming to start.
         streamHandler.handleMessage(streamHandler.obtainMessage(A2dpSinkStreamHandler.SRC_PLAY));
-        verify(mockAudioManager, times(0)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(0)).requestAudioFocus(any());
         verify(mockA2dpSink, times(0)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(0)).informAudioTrackGainNative(1.0f);
     }
@@ -169,7 +168,7 @@
         testSnkPlay();
         streamHandler.handleMessage(streamHandler.obtainMessage(
                 A2dpSinkStreamHandler.AUDIO_FOCUS_CHANGE, AudioManager.AUDIOFOCUS_GAIN));
-        verify(mockAudioManager, times(1)).requestAudioFocus(any(), anyInt(), anyInt());
+        verify(mockAudioManager, times(1)).requestAudioFocus(any());
         verify(mockA2dpSink, times(2)).informAudioFocusStateNative(1);
         verify(mockA2dpSink, times(2)).informAudioTrackGainNative(1.0f);
     }
