diff --git a/sip/src/com/android/services/telephony/sip/SipConnectionService.java b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
index 78c0440..ffaf64d 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnectionService.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
@@ -90,6 +90,7 @@
         final SipConnection connection = new SipConnection();
         connection.setHandle(request.getHandle(), PropertyPresentation.ALLOWED);
         connection.setInitializing();
+        connection.onAddedToCallService();
         boolean attemptCall = true;
 
         if (!SipUtil.isVoipSupported(this)) {
@@ -181,6 +182,7 @@
             if (originalConnection != null) {
                 SipConnection sipConnection = new SipConnection();
                 sipConnection.initialize(originalConnection);
+                sipConnection.onAddedToCallService();
                 return sipConnection;
             } else {
                 if (VERBOSE) log("onCreateIncomingConnection, takingIncomingCall failed");
@@ -190,19 +192,6 @@
         return Connection.createFailedConnection(DisconnectCause.ERROR_UNSPECIFIED, null);
     }
 
-    @Override
-    public void onConnectionAdded(Connection connection) {
-        if (VERBOSE) log("onConnectionAdded, connection: " + connection);
-        if (connection instanceof SipConnection) {
-            ((SipConnection) connection).onAddedToCallService();
-        }
-    }
-
-    @Override
-    public void onConnectionRemoved(Connection connection) {
-        if (VERBOSE) log("onConnectionRemoved, connection: " + connection);
-    }
-
     private com.android.internal.telephony.Connection createConnectionForProfile(
             SipProfile profile,
             ConnectionRequest request) {
diff --git a/src/com/android/services/telephony/GsmConferenceController.java b/src/com/android/services/telephony/GsmConferenceController.java
index 894e5bb..5cc27a7 100644
--- a/src/com/android/services/telephony/GsmConferenceController.java
+++ b/src/com/android/services/telephony/GsmConferenceController.java
@@ -33,17 +33,22 @@
  */
 final class GsmConferenceController {
     private final Connection.Listener mConnectionListener = new Connection.Listener() {
-                @Override
-                public void onStateChanged(Connection c, int state) {
-                    recalculate();
-                }
+        @Override
+        public void onStateChanged(Connection c, int state) {
+            recalculate();
+        }
 
-                /** ${inheritDoc} */
-                @Override
-                public void onDisconnected(Connection c, int cause, String message) {
-                    recalculate();
-                }
-            };
+        /** ${inheritDoc} */
+        @Override
+        public void onDisconnected(Connection c, int cause, String message) {
+            recalculate();
+        }
+
+        @Override
+        public void onDestroyed(Connection connection) {
+            remove((GsmConnection) connection);
+        }
+    };
 
     /** The known GSM connections. */
     private final List<GsmConnection> mGsmConnections = new ArrayList<>();
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 851269d..3d085ca 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -203,20 +203,6 @@
 
     }
 
-    @Override
-    public void onConnectionAdded(Connection connection) {
-        if (connection instanceof GsmConnection) {
-            mGsmConferenceController.add((GsmConnection) connection);
-        }
-    }
-
-    @Override
-    public void onConnectionRemoved(Connection connection) {
-        if (connection instanceof GsmConnection) {
-            mGsmConferenceController.remove((GsmConnection) connection);
-        }
-    }
-
     private void placeOutgoingConnection(
             TelephonyConnection connection, Phone phone, ConnectionRequest request) {
         String number = connection.getHandle().getSchemeSpecificPart();
@@ -253,7 +239,9 @@
             Phone phone, com.android.internal.telephony.Connection originalConnection) {
         int phoneType = phone.getPhoneType();
         if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {
-            return new GsmConnection(originalConnection);
+            GsmConnection connection = new GsmConnection(originalConnection);
+            mGsmConferenceController.add(connection);
+            return connection;
         } else if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) {
             boolean allowMute = allowMute(phone);
             return new CdmaConnection(originalConnection, allowMute);
