diff --git a/src/com/android/phone/CallCommandService.java b/src/com/android/phone/CallCommandService.java
index ff12063..f216a48 100644
--- a/src/com/android/phone/CallCommandService.java
+++ b/src/com/android/phone/CallCommandService.java
@@ -20,6 +20,8 @@
 import android.util.Log;
 
 import com.android.internal.telephony.CallManager;
+import com.android.phone.CallModeler.CallResult;
+import com.android.services.telephony.common.Call;
 import com.android.services.telephony.common.ICallCommandService;
 
 /**
@@ -30,12 +32,14 @@
 
     private static final String TAG = CallCommandService.class.getSimpleName();
 
-    private Context mContext;
-    private CallManager mCallManager;
+    private final Context mContext;
+    private final CallManager mCallManager;
+    private final CallModeler mCallModeler;
 
-    public CallCommandService(Context context, CallManager callManager) {
+    public CallCommandService(Context context, CallManager callManager, CallModeler callModeler) {
         mContext = context;
         mCallManager = callManager;
+        mCallModeler = callModeler;
     }
 
     /**
@@ -44,8 +48,10 @@
     @Override
     public void answerCall(int callId) {
         try {
-            // TODO(klp): Change to using the callId and logic from InCallScreen::internalAnswerCall
-            PhoneUtils.answerCall(mCallManager.getFirstActiveRingingCall());
+            CallResult result = mCallModeler.getCallWithId(callId);
+            if (result != null) {
+                PhoneUtils.answerCall(result.getConnection().getCall());
+            }
         } catch (Exception e) {
             Log.e(TAG, "Error during answerCall().", e);
         }
@@ -57,8 +63,10 @@
     @Override
     public void rejectCall(int callId) {
         try {
-            // TODO(klp): Change to using the callId
-            PhoneUtils.hangupRingingCall(mCallManager.getFirstActiveRingingCall());
+            CallResult result = mCallModeler.getCallWithId(callId);
+            if (result != null) {
+                PhoneUtils.hangupRingingCall(result.getConnection().getCall());
+            }
         } catch (Exception e) {
             Log.e(TAG, "Error during rejectCall().", e);
         }
@@ -67,8 +75,13 @@
     @Override
     public void disconnectCall(int callId) {
         try {
-            // TODO(klp): Change to using the callId
-            PhoneUtils.hangup(mCallManager);
+            CallResult result = mCallModeler.getCallWithId(callId);
+            if (result != null) {
+                int state = result.getCall().getState();
+                if (Call.State.ACTIVE == state || Call.State.ONHOLD == state) {
+                    result.getConnection().getCall().hangup();
+                }
+            }
         } catch (Exception e) {
             Log.e(TAG, "Error during disconnectCall().", e);
         }
@@ -77,8 +90,15 @@
     @Override
     public void hold(int callId, boolean hold) {
         try {
-            // TODO(klp): Change to use the callId/hold
-            PhoneUtils.switchHoldingAndActive(mCallManager.getFirstActiveBgCall());
+            CallResult result = mCallModeler.getCallWithId(callId);
+            if (result != null) {
+                int state = result.getCall().getState();
+                if (hold && Call.State.ACTIVE == state ) {
+                    PhoneUtils.switchHoldingAndActive(mCallManager.getFirstActiveBgCall());
+                } else if (!hold && Call.State.ONHOLD == state) {
+                    PhoneUtils.switchHoldingAndActive(result.getConnection().getCall());
+                }
+            }
         } catch (Exception e) {
             Log.e(TAG, "Error trying to place call on hold.", e);
         }
diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index ee96dbf..01f571f 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -34,6 +34,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -116,6 +117,16 @@
         return retval;
     }
 
+    public CallResult getCallWithId(int callId) {
+        // max 8 connections, so this should be fast even through we are traversing the entire map.
+        for (Entry<Connection, Call> entry : mCallMap.entrySet()) {
+            if (entry.getValue().getCallId() == callId) {
+                return new CallResult(entry.getValue(), entry.getKey());
+            }
+        }
+        return null;
+    }
+
     private void onNewRingingConnection(AsyncResult r) {
         final Connection conn = (Connection) r.result;
         final Call call = getCallFromConnection(conn, true);
@@ -249,4 +260,25 @@
         void onDisconnect(Call call);
         void onUpdate(List<Call> calls, boolean fullUpdate);
     }
+
+    /**
+     * Result class for accessing a call by connection.
+     */
+    public static class CallResult {
+        public Call mCall;
+        public Connection mConnection;
+
+        private CallResult(Call call, Connection connection) {
+            mCall = call;
+            mConnection = connection;
+        }
+
+        public Call getCall() {
+            return mCall;
+        }
+
+        public Connection getConnection() {
+            return mConnection;
+        }
+    }
 }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 36687ce..650e2eb 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -542,12 +542,12 @@
             // Monitors call activity from the telephony layer
             callStateMonitor = new CallStateMonitor(mCM);
 
-            // Service used by in-call UI to control calls
-            callCommandService = new CallCommandService(this, mCM);
-
             // Creates call models for use with CallHandlerService.
             callModeler = new CallModeler(callStateMonitor, mCM);
 
+            // Service used by in-call UI to control calls
+            callCommandService = new CallCommandService(this, mCM, callModeler);
+
             // Sends call state to the UI
             callHandlerServiceProxy = new CallHandlerServiceProxy(this, callModeler,
                     callCommandService);
