diff --git a/src/com/android/phone/CallCommandService.java b/src/com/android/phone/CallCommandService.java
new file mode 100644
index 0000000..c0f8c67
--- /dev/null
+++ b/src/com/android/phone/CallCommandService.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (C) 2013 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.phone;
+
+import com.android.internal.telephony.CallManager;
+import com.android.services.telephony.common.ICallCommandService;
+
+/**
+ * Service interface used by in-call ui to control phone calls using commands
+ * exposed as methods.  Instances of this class are handed to in-call UI via
+ * CallMonitorService.
+ */
+class CallCommandService extends ICallCommandService.Stub {
+
+    private CallManager mCallManager;
+
+    public CallCommandService(CallManager callManager) {
+        mCallManager = callManager;
+    }
+
+    /**
+     * TODO(klp): Add a confirmation callback parameter.
+     */
+    @Override
+    public void answerCall(int callId) {
+        // TODO(klp): Change to using the callId and logic from InCallScreen::internalAnswerCall
+        PhoneUtils.answerCall(mCallManager.getFirstActiveRingingCall());
+    }
+
+    /**
+     * TODO(klp): Add a confirmation callback parameter.
+     */
+    @Override
+    public void rejectCall(int callId) {
+        // TODO(klp): Change to using the callId
+        PhoneUtils.hangupRingingCall(mCallManager.getFirstActiveRingingCall());
+    }
+
+    @Override
+    public void disconnectCall(int callId) {
+        // TODO(klp): Change to using the callId
+        PhoneUtils.hangup(mCallManager);
+    }
+}
diff --git a/src/com/android/phone/CallMonitorServiceProxy.java b/src/com/android/phone/CallMonitorServiceProxy.java
index 8865038..8339bba 100644
--- a/src/com/android/phone/CallMonitorServiceProxy.java
+++ b/src/com/android/phone/CallMonitorServiceProxy.java
@@ -29,6 +29,7 @@
 import android.util.Log;
 
 import com.android.services.telephony.common.ICallMonitorService;
+import com.android.services.telephony.common.ICallCommandService;
 
 /**
  * This class is responsible for passing through call state changes to the CallMonitorService.
@@ -44,10 +45,13 @@
     private CallStateMonitor mCallStateMonitor;
     private ServiceConnection mConnection;
     private ICallMonitorService mCallMonitorService;
+    private CallCommandService mCallCommandService;
 
-    public CallMonitorServiceProxy(Context context, CallStateMonitor callStateMonitor) {
+    public CallMonitorServiceProxy(Context context, CallStateMonitor callStateMonitor,
+            CallCommandService callCommandService) {
         mContext = context;
         mCallStateMonitor = callStateMonitor;
+        mCallCommandService = callCommandService;
 
         mCallStateMonitor.addListener(this);
         setupServiceConnection();
@@ -76,7 +80,7 @@
                 if (DBG) {
                     Log.d(TAG, "Service Connected");
                 }
-                mCallMonitorService = ICallMonitorService.Stub.asInterface(service);
+                onCallMonitorServiceConnected(ICallMonitorService.Stub.asInterface(service));
             }
 
             @Override
@@ -92,12 +96,25 @@
     }
 
     /**
+     * Called when the in-call UI service is connected.  Send command interface to in-call.
+     */
+    private void onCallMonitorServiceConnected(ICallMonitorService callMonitorService) {
+        mCallMonitorService = callMonitorService;
+
+        try {
+            mCallMonitorService.setCallCommandService(mCallCommandService);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Remote exception calling CallMonitorService::onConnected. " + e);
+        }
+    }
+
+    /**
      * Send notification of a new incoming call.
      */
     private void onNewRingingConnection(AsyncResult result) {
         if (mCallMonitorService != null) {
             try {
-                mCallMonitorService.onIncomingCall(42);
+                mCallMonitorService.onIncomingCall(0);
             } catch (RemoteException e) {
                 Log.e(TAG, "Remote exception handling onIncomingCall:" + e);
             }
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 865ad75..e4989dc 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -173,6 +173,7 @@
     CallManager mCM;
     CallStateMonitor callStateMonitor;
     CallMonitorServiceProxy callMonitorServiceProxy;
+    CallCommandService callCommandService;
     int mBluetoothHeadsetState = BluetoothProfile.STATE_DISCONNECTED;
     int mBluetoothHeadsetAudioState = BluetoothHeadset.STATE_AUDIO_DISCONNECTED;
     boolean mShowBluetoothIndication = false;
@@ -537,8 +538,12 @@
             // Monitors call activity from the telephony layer
             callStateMonitor = new CallStateMonitor(mCM);
 
+            // Service used by in-call UI to control calls
+            callCommandService = new CallCommandService(mCM);
+
             // Sends call state to the UI
-            callMonitorServiceProxy = new CallMonitorServiceProxy(this, callStateMonitor);
+            callMonitorServiceProxy = new CallMonitorServiceProxy(this, callStateMonitor,
+                    callCommandService);
 
             // Create the CallNotifer singleton, which handles
             // asynchronous events from the telephony layer (like
