diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index 9a9e235..6057350 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -61,6 +61,8 @@
         void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall);
         void onAudioStateChanged(CallAudioState oldAudioState, CallAudioState newAudioState);
         void onRequestingRingback(Call call, boolean ringback);
+        void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable);
+        void onIsConferencedChanged(Call call);
     }
 
     private static final CallsManager INSTANCE = new CallsManager();
@@ -165,6 +167,13 @@
     }
 
     @Override
+    public void onIsConferenceCapableChanged(Call call, boolean isConferenceCapable) {
+        for (CallsManagerListener listener : mListeners) {
+            listener.onIsConferenceCapableChanged(call, isConferenceCapable);
+        }
+    }
+
+    @Override
     public void onRequestingRingback(Call call, boolean ringback) {
         for (CallsManagerListener listener : mListeners) {
             listener.onRequestingRingback(call, ringback);
@@ -176,6 +185,34 @@
         mInCallController.onPostDialWait(call, remaining);
     }
 
+    @Override
+    public void onExpiredConferenceCall(Call call) {
+        call.removeListener(this);
+    }
+
+    @Override
+    public void onConfirmedConferenceCall(Call call) {
+        addCall(call);
+        Log.v(this, "confirming Conf call %s", call);
+        for (CallsManagerListener listener : mListeners) {
+            listener.onIsConferencedChanged(call);
+        }
+    }
+
+    @Override
+    public void onParentChanged(Call call) {
+        for (CallsManagerListener listener : mListeners) {
+            listener.onIsConferencedChanged(call);
+        }
+    }
+
+    @Override
+    public void onChildrenChanged(Call call) {
+        for (CallsManagerListener listener : mListeners) {
+            listener.onIsConferencedChanged(call);
+        }
+    }
+
     ImmutableCollection<Call> getCalls() {
         return ImmutableList.copyOf(mCalls);
     }
@@ -218,7 +255,7 @@
         // Create a call with no handle. Eventually, switchboard will update the call with
         // additional information from the call service, but for now we just need one to pass
         // around.
-        Call call = new Call(true /* isIncoming */);
+        Call call = new Call(true /* isIncoming */, false /* isConference */);
         // TODO(santoscordon): Move this to be a part of addCall()
         call.addListener(this);
 
@@ -243,7 +280,8 @@
                     Log.pii(uriHandle), Log.pii(handle));
         }
 
-        Call call = new Call(uriHandle, gatewayInfo, false /* isIncoming */);
+        Call call = new Call(
+                uriHandle, gatewayInfo, false /* isIncoming */, false /* isConference */);
 
         // TODO(santoscordon): Move this to be a part of addCall()
         call.addListener(this);
@@ -253,6 +291,17 @@
     }
 
     /**
+     * Attempts to start a conference call for the specified call.
+     *
+     * @param call The call to conference with.
+     */
+    void conference(Call call) {
+        Call conferenceCall = new Call(false, true);
+        conferenceCall.addListener(this);
+        call.conferenceInto(conferenceCall);
+    }
+
+    /**
      * Instructs Telecomm to answer the specified call. Intended to be invoked by the in-call
      * app through {@link InCallAdapter} after Telecomm notifies it of an incoming call followed by
      * the user opting to answer said call.
@@ -410,8 +459,8 @@
         // original call will live on but its state will be updated to the new call's state. In
         // particular the original call's call service will be updated to the new call's call
         // service.
-        Call tempCall =
-                new Call(originalCall.getHandoffHandle(), originalCall.getGatewayInfo(), false);
+        Call tempCall = new Call(
+                originalCall.getHandoffHandle(), originalCall.getGatewayInfo(), false, false);
         tempCall.setOriginalCall(originalCall);
         tempCall.setExtras(originalCall.getExtras());
         tempCall.setCallServiceSelector(originalCall.getCallServiceSelector());
