diff --git a/src/com/android/services/telephony/PstnConnectionService.java b/src/com/android/services/telephony/PstnConnectionService.java
index a654c69..00ed255 100644
--- a/src/com/android/services/telephony/PstnConnectionService.java
+++ b/src/com/android/services/telephony/PstnConnectionService.java
@@ -54,7 +54,7 @@
     @Override
     public void onCreateConnections(
             final ConnectionRequest request,
-            final Response<ConnectionRequest, Connection> response) {
+            final OutgoingCallResponse<Connection> response) {
 
         if (!canCall(request.getHandle())) {
             Log.d(this, "Cannot place the call with %s", this.getClass().getSimpleName());
diff --git a/src/com/android/services/telephony/SipConnectionService.java b/src/com/android/services/telephony/SipConnectionService.java
index 3faf787..465dba1 100644
--- a/src/com/android/services/telephony/SipConnectionService.java
+++ b/src/com/android/services/telephony/SipConnectionService.java
@@ -48,7 +48,7 @@
     @Override
     public void onCreateConnections(
             ConnectionRequest request,
-            Response<ConnectionRequest, Connection> callback) {
+            OutgoingCallResponse callback) {
         new GetSipProfileTask(this, request, callback).execute();
         super.onCreateConnections(request, callback);
     }
@@ -114,14 +114,14 @@
      */
     private class GetSipProfileTask extends AsyncTask<Void, Void, SipProfile> {
         private final ConnectionRequest mRequest;
-        private final Response<ConnectionRequest, Connection> mResponse;
+        private final OutgoingCallResponse mResponse;
         private final SipProfileDb mSipProfileDb;
         private final SipSharedPreferences mSipSharedPreferences;
 
         GetSipProfileTask(
                 Context context,
                 ConnectionRequest request,
-                Response<ConnectionRequest, Connection> response) {
+                OutgoingCallResponse response) {
             mRequest = request;
             mResponse = response;
             mSipProfileDb = new SipProfileDb(context);
@@ -149,7 +149,7 @@
     private void onSipProfileChosen(
             SipProfile profile,
             ConnectionRequest request,
-            Response<ConnectionRequest, Connection> response) {
+            OutgoingCallResponse response) {
         SipPhone phone = null;
         if (profile != null) {
             String sipUri = profile.getUriString();
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index db4720b..a009bc8 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -51,7 +51,7 @@
     protected void startCallWithPhone(
             Phone phone,
             ConnectionRequest request,
-            Response<ConnectionRequest, Connection> response) {
+            OutgoingCallResponse<Connection> response) {
         Log.d(this, "startCallWithPhone: %s.", request);
 
         if (phone == null) {
@@ -135,7 +135,7 @@
     private boolean checkServiceStateForOutgoingCall(
             Phone phone,
             ConnectionRequest request,
-            Response<ConnectionRequest, Connection> response) {
+            OutgoingCallResponse<Connection> response) {
         int state = phone.getServiceState().getState();
         switch (state) {
             case ServiceState.STATE_IN_SERVICE:
@@ -184,19 +184,28 @@
     }
 
     protected void respondWithResult(
-            Uri request,
-            Response<Uri, Subscription> response,
-            Subscription result) {
+            ConnectionRequest request,
+            Response<ConnectionRequest, Connection> response,
+            Connection result) {
         Log.d(this, "respondWithResult %s -> %s", request, result);
         response.onResult(request, result);
     }
 
     protected void respondWithResult(
             ConnectionRequest request,
-            Response<ConnectionRequest, Connection> response,
+            OutgoingCallResponse<Connection> response,
             Connection result) {
         Log.d(this, "respondWithResult %s -> %s", request, result);
-        response.onResult(request, result);
+        response.onSuccess(request, result);
+    }
+
+    protected void respondWithError(
+            ConnectionRequest request,
+            OutgoingCallResponse<Connection> response,
+            int errorCode,
+            String errorMsg) {
+        Log.d(this, "respondWithError %s: %d %s", request, errorCode, errorMsg);
+        response.onFailure(request, errorCode, errorMsg);
     }
 
     protected final TelephonyConnection createTelephonyConnection(
