diff --git a/sip/src/com/android/services/telephony/sip/SipConnection.java b/sip/src/com/android/services/telephony/sip/SipConnection.java
index c6e1be6..5b065fd 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnection.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnection.java
@@ -174,6 +174,12 @@
     }
 
     @Override
+    protected void onSwapWithBackgroundCall() {
+        if (VERBOSE) log("onSwapWithBackgroundCall");
+        // TODO(sail): Implement swap.
+    }
+
+    @Override
     protected void onChildrenChanged(List<Connection> children) {
         if (VERBOSE) log("onChildrenChanged, children: " + children);
     }
@@ -260,6 +266,10 @@
         if (VERBOSE) log("onAddedToCallService");
         updateCallCapabilities();
         setAudioModeIsVoip(true);
+        if (mOriginalConnection != null) {
+            setCallerDisplayName(mOriginalConnection.getCnapName(),
+                    mOriginalConnection.getCnapNamePresentation());
+        }
     }
 
     private void close() {
diff --git a/sip/src/com/android/services/telephony/sip/SipConnectionService.java b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
index 1dc78e3..513fbfd 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnectionService.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
@@ -119,7 +119,7 @@
             if (VERBOSE) log("onCreateIncomingConnection, new connection: " + originalConnection);
             if (originalConnection != null) {
                 SipConnection connection = new SipConnection(originalConnection);
-                response.onResult(getConnectionRequestForIncomingCall(request, sipAudioCall),
+                response.onResult(getConnectionRequestForIncomingCall(request, originalConnection),
                         connection);
             } else {
                 if (VERBOSE) log("onCreateIncomingConnection, takingIncomingCall failed");
@@ -195,15 +195,10 @@
     }
 
     private ConnectionRequest getConnectionRequestForIncomingCall(ConnectionRequest request,
-            SipAudioCall audioCall) {
-        SipProfile callee = audioCall.getPeerProfile();
-        String domain = callee.getSipDomain();
-        if (domain.endsWith(":5060")) {
-            domain = domain.substring(0, domain.length() - 5);
-        }
-        Uri uri = Uri.fromParts(SipUtil.SCHEME_SIP, callee.getUserName() + "@" + domain, null);
+            com.android.internal.telephony.Connection connection) {
+        Uri uri = Uri.fromParts(SipUtil.SCHEME_SIP, connection.getAddress(), null);
         return new ConnectionRequest(request.getAccount(), request.getCallId(), uri,
-                request.getExtras(), 0);
+                connection.getNumberPresentation(), request.getExtras(), 0);
     }
 
     private static void log(String msg) {
diff --git a/src/com/android/services/telephony/GsmConferenceController.java b/src/com/android/services/telephony/GsmConferenceController.java
index 138aa8e..593c2dc 100644
--- a/src/com/android/services/telephony/GsmConferenceController.java
+++ b/src/com/android/services/telephony/GsmConferenceController.java
@@ -30,8 +30,7 @@
  */
 public class GsmConferenceController {
 
-    private final Connection.Listener mConnectionListener =
-            new Connection.ListenerBase() {
+    private final Connection.Listener mConnectionListener = new Connection.Listener() {
                 @Override
                 public void onStateChanged(Connection c, int state) {
                     // No need to recalculate for conference calls, just traditional calls.
@@ -42,13 +41,11 @@
 
                 /** ${inheritDoc} */
                 @Override
-                public void onDisconnected(
-                        Connection c, int cause, String message) {
+                public void onDisconnected(Connection c, int cause, String message) {
                     // When a connection disconnects, make sure to release its parent reference
                     // so that the parent can move to disconnected as well.
                     c.setParentConnection(null);
                 }
-
             };
 
     /** The known GSM connections. */
diff --git a/src/com/android/services/telephony/PstnConnectionService.java b/src/com/android/services/telephony/PstnConnectionService.java
index f60cd73..a38fc8d 100644
--- a/src/com/android/services/telephony/PstnConnectionService.java
+++ b/src/com/android/services/telephony/PstnConnectionService.java
@@ -145,7 +145,12 @@
                 }
 
                 respondWithResult(
-                        new ConnectionRequest(request.getCallId(), handle, request.getExtras(),
+                        new ConnectionRequest(
+                                request.getAccount(),
+                                request.getCallId(),
+                                handle,
+                                connection.getNumberPresentation(),
+                                request.getExtras(),
                                 request.getVideoState()),
                         response,
                         telephonyConnection);
@@ -160,6 +165,13 @@
         super.onCreateIncomingConnection(request, response);
     }
 
+    @Override
+    protected void onConnectionAdded(Connection connection) {
+        if (connection instanceof TelephonyConnection) {
+            ((TelephonyConnection) connection).onAddedToCallService();
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     protected boolean canCall(Uri handle) {
@@ -176,7 +188,7 @@
             case TelephonyManager.PHONE_TYPE_GSM: {
                 final GsmConnection gsmConn = new GsmConnection(phone, connection);
                 mGsmConferenceController.add(gsmConn);
-                gsmConn.addConnectionListener(new Connection.ListenerBase() {
+                gsmConn.addConnectionListener(new Connection.Listener() {
                     @Override
                     public void onDestroyed(Connection c) {
                         mGsmConferenceController.remove(gsmConn);
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 17ab1c9..551e018 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -144,6 +144,15 @@
         }
     }
 
+    final void onAddedToCallService() {
+        updateCallCapabilities();
+        if (mOriginalConnection != null) {
+            setCallerDisplayName(
+                    mOriginalConnection.getCnapName(),
+                    mOriginalConnection.getCnapNamePresentation());
+        }
+    }
+
     protected void hangup(int disconnectCause) {
         if (mOriginalConnection != null) {
             try {
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 0cefab6..9a0d5a4 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -111,7 +111,6 @@
             final TelephonyConnection telephonyConnection =
                     createTelephonyConnection(request, phone, connection);
             respondWithResult(request, response, telephonyConnection);
-            telephonyConnection.updateCallCapabilities();
 
             final com.android.internal.telephony.Connection connectionFinal = connection;
             PostDialListener postDialListener = new PostDialListener() {
@@ -215,7 +214,7 @@
         final TelephonyConnection telephonyConnection =
                 onCreateTelephonyConnection(request, phone, connection);
         sKnownConnections.add(connection);
-        telephonyConnection.addConnectionListener(new Connection.ListenerBase() {
+        telephonyConnection.addConnectionListener(new Connection.Listener() {
             @Override
             public void onDestroyed(Connection c) {
                 telephonyConnection.removeConnectionListener(this);
