diff --git a/src/com/android/phone/CallHandlerServiceProxy.java b/src/com/android/phone/CallHandlerServiceProxy.java
index 7415f92..c4d1468 100644
--- a/src/com/android/phone/CallHandlerServiceProxy.java
+++ b/src/com/android/phone/CallHandlerServiceProxy.java
@@ -59,10 +59,10 @@
     }
 
     @Override
-    public void onNewCall(int callId) {
+    public void onNewCall(Call call) {
         if (mCallHandlerService != null) {
             try {
-                mCallHandlerService.onIncomingCall(new Call(callId));
+                mCallHandlerService.onIncomingCall(call);
             } catch (RemoteException e) {
                 Log.e(TAG, "Remote exception handling onIncomingCall", e);
             }
@@ -72,10 +72,10 @@
     }
 
     @Override
-    public void onDisconnect(int callId) {
+    public void onDisconnect(Call call) {
         if (mCallHandlerService != null) {
             try {
-                mCallHandlerService.onDisconnect(new Call(callId));
+                mCallHandlerService.onDisconnect(call);
             } catch (RemoteException e) {
                 Log.e(TAG, "Remote exception handling onDisconnect ", e);
             }
diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index 018c771..b6504eb 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -26,6 +26,7 @@
 import android.util.Log;
 
 import com.android.internal.telephony.Connection;
+import com.android.services.telephony.common.Call;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -65,10 +66,9 @@
     private static final String TAG = CallModeler.class.getSimpleName();
 
     private static final int CALL_ID_START_VALUE = 1;
-    private static final int INVALID_CALL_ID = -1;
 
     private CallStateMonitor mCallStateMonitor;
-    private HashMap<Connection, Integer> mCallIdMap = Maps.newHashMap();
+    private HashMap<Connection, Call> mCallMap = Maps.newHashMap();
     private List<Listener> mListeners = Lists.newArrayList();
     private AtomicInteger mNextCallId = new AtomicInteger(CALL_ID_START_VALUE);
 
@@ -86,6 +86,10 @@
                 break;
             case CallStateMonitor.PHONE_DISCONNECT:
                 onDisconnect((AsyncResult) msg.obj);
+                break;
+            case CallStateMonitor.PHONE_STATE_CHANGED:
+                onPhoneStateChanged((AsyncResult) msg.obj);
+                break;
             default:
                 break;
         }
@@ -99,38 +103,44 @@
 
     private void onNewRingingConnection(AsyncResult r) {
         final Connection conn = (Connection) r.result;
-        final int callId = getCallId(conn, true);
+        final Call call = getCallFromConnection(conn, true);
 
-        for (Listener l : mListeners) {
-            l.onNewCall(callId);
+        if (call != null) {
+            for (Listener l : mListeners) {
+                l.onNewCall(call);
+            }
         }
     }
 
     private void onDisconnect(AsyncResult r) {
         final Connection conn = (Connection) r.result;
-        final int callId = getCallId(conn, false);
+        final Call call = getCallFromConnection(conn, false);
 
-        if (INVALID_CALL_ID != callId) {
-            mCallIdMap.remove(conn);
+        if (call != null) {
+            mCallMap.remove(conn);
 
             for (Listener l : mListeners) {
-                l.onDisconnect(callId);
+                l.onDisconnect(call);
             }
         }
     }
 
+    private void onPhoneStateChanged(AsyncResult r) {
+    }
+
     /**
      * Gets an existing callId for a connection, or creates one
      * if none exists.
      */
-    private int getCallId(Connection conn, boolean createIfMissing) {
-        int callId = INVALID_CALL_ID;
+    private Call getCallFromConnection(Connection conn, boolean createIfMissing) {
+        Call call = null;
 
         // Find the call id or create if missing and requested.
         if (conn != null) {
-            if (mCallIdMap.containsKey(conn)) {
-                callId = mCallIdMap.get(conn).intValue();
+            if (mCallMap.containsKey(conn)) {
+                call = mCallMap.get(conn);
             } else if (createIfMissing) {
+                int callId;
                 int newNextCallId;
                 do {
                     callId = mNextCallId.get();
@@ -143,19 +153,20 @@
                     // The call to containsValue() is linear, however, most devices support a
                     // maximum of 7 connections so it's not expensive.
                 } while (!mNextCallId.compareAndSet(callId, newNextCallId) ||
-                        mCallIdMap.containsValue(callId));
+                        mCallMap.containsValue(callId));
 
-                mCallIdMap.put(conn, callId);
+                call = new Call(callId);
+                mCallMap.put(conn, call);
             }
         }
-        return callId;
+        return call;
     }
 
     /**
      * Listener interface for changes to Calls.
      */
     public interface Listener {
-        void onNewCall(int callId);
-        void onDisconnect(int callId);
+        void onNewCall(Call call);
+        void onDisconnect(Call call);
     }
 }
