diff --git a/Android.mk b/Android.mk
index bb65398..44ffc04 100644
--- a/Android.mk
+++ b/Android.mk
@@ -332,6 +332,7 @@
 	telecomm/java/com/android/internal/telecomm/ICallServiceLookupResponse.aidl \
 	telecomm/java/com/android/internal/telecomm/ICallServiceProvider.aidl \
 	telecomm/java/com/android/internal/telecomm/ICallVideoProvider.aidl \
+	telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl \
 	telecomm/java/com/android/internal/telecomm/IInCallAdapter.aidl \
 	telecomm/java/com/android/internal/telecomm/IInCallService.aidl \
 	telecomm/java/com/android/internal/telecomm/ITelecommService.aidl \
diff --git a/api/current.txt b/api/current.txt
index 117d5fe..4f45614 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -27560,6 +27560,15 @@
     field public final int supportedRouteMask;
   }
 
+  public final class CallCameraCapabilities implements android.os.Parcelable {
+    ctor public CallCameraCapabilities(boolean, float);
+    method public int describeContents();
+    method public float getMaxZoom();
+    method public boolean isZoomSupported();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator CREATOR;
+  }
+
   public final class CallCapabilities {
     method public static java.lang.String toString(int);
     field public static final int ADD_CALL = 16; // 0x10
@@ -27677,6 +27686,23 @@
     enum_constant public static final android.telecomm.CallState RINGING;
   }
 
+  public abstract class CallVideoClient {
+    ctor protected CallVideoClient();
+    method public abstract void onCallSessionEvent(int);
+    method public abstract void onCameraCapabilitiesChange(android.telecomm.CallCameraCapabilities);
+    method public abstract void onReceiveSessionModifyRequest(android.telecomm.VideoCallProfile);
+    method public abstract void onReceiveSessionModifyResponse(int, android.telecomm.VideoCallProfile, android.telecomm.VideoCallProfile);
+    method public abstract void onUpdateCallDataUsage(int);
+    method public abstract void onUpdatedPeerDimensions(int, int);
+    field public static final int SESSION_EVENT_RX_PAUSE = 1; // 0x1
+    field public static final int SESSION_EVENT_RX_RESUME = 2; // 0x2
+    field public static final int SESSION_EVENT_TX_START = 3; // 0x3
+    field public static final int SESSION_EVENT_TX_STOP = 4; // 0x4
+    field public static final int SESSION_MODIFY_REQUEST_FAIL = 2; // 0x2
+    field public static final int SESSION_MODIFY_REQUEST_INVALID = 3; // 0x3
+    field public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1; // 0x1
+  }
+
   public class CallVideoProviderWrapper implements android.os.IBinder.DeathRecipient {
     method public void binderDied();
     method public void setCamera(java.lang.String) throws android.os.RemoteException;
@@ -27926,6 +27952,24 @@
   public class TelecommManager {
   }
 
+  public class VideoCallProfile implements android.os.Parcelable {
+    ctor public VideoCallProfile(int, int);
+    method public int describeContents();
+    method public int getQuality();
+    method public int getVideoState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator CREATOR;
+    field public static final int QUALITY_DEFAULT = 4; // 0x4
+    field public static final int QUALITY_HIGH = 1; // 0x1
+    field public static final int QUALITY_LOW = 3; // 0x3
+    field public static final int QUALITY_MEDIUM = 2; // 0x2
+    field public static final int VIDEO_STATE_AUDIO_ONLY = 0; // 0x0
+    field public static final int VIDEO_STATE_BIDIRECTIONAL = 3; // 0x3
+    field public static final int VIDEO_STATE_PAUSED = 4; // 0x4
+    field public static final int VIDEO_STATE_RX_ENABLED = 2; // 0x2
+    field public static final int VIDEO_STATE_TX_ENABLED = 1; // 0x1
+  }
+
 }
 
 package android.telephony {
diff --git a/telecomm/java/android/telecomm/CallCameraCapabilities.aidl b/telecomm/java/android/telecomm/CallCameraCapabilities.aidl
new file mode 100644
index 0000000..25b6106
--- /dev/null
+++ b/telecomm/java/android/telecomm/CallCameraCapabilities.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2014 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 android.telecomm;
+
+parcelable CallCameraCapabilities;
diff --git a/telecomm/java/android/telecomm/CallCameraCapabilities.java b/telecomm/java/android/telecomm/CallCameraCapabilities.java
new file mode 100644
index 0000000..87a411a
--- /dev/null
+++ b/telecomm/java/android/telecomm/CallCameraCapabilities.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2014 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 android.telecomm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Represents the camera capabilities important to a Video Telephony provider.
+ * TODO: Add camera capabilities as required.
+ */
+public final class CallCameraCapabilities implements Parcelable {
+
+    /**
+     * Whether the camera supports zoom.
+     */
+    private final boolean mZoomSupported;
+
+    /**
+     * The maximum zoom supported by the camera.
+     */
+    private final float mMaxZoom;
+
+    /**
+     * Create a call camera capabilities instance.
+     *
+     * @param zoomSupported True when camera supports zoom.
+     * @param maxZoom Maximum zoom supported by camera.
+     */
+    public CallCameraCapabilities(boolean zoomSupported, float maxZoom) {
+        mZoomSupported = zoomSupported;
+        mMaxZoom = maxZoom;
+    }
+
+    /**
+     * Responsible for creating CallCameraCapabilities objects from deserialized Parcels.
+     **/
+    public static final Parcelable.Creator<CallCameraCapabilities> CREATOR =
+            new Parcelable.Creator<CallCameraCapabilities> () {
+                /**
+                 * Creates a CallCameraCapabilities instances from a parcel.
+                 *
+                 * @param source The parcel.
+                 * @return The CallCameraCapabilities.
+                 */
+                @Override
+                public CallCameraCapabilities createFromParcel(Parcel source) {
+                    boolean supportsZoom = source.readByte() != 0;
+                    float maxZoom = source.readFloat();
+
+                    return new CallCameraCapabilities(supportsZoom, maxZoom);
+                }
+
+                @Override
+                public CallCameraCapabilities[] newArray(int size) {
+                    return new CallCameraCapabilities[size];
+                }
+            };
+
+    /**
+     * Describe the kinds of special objects contained in this Parcelable's
+     * marshalled representation.
+     *
+     * @return a bitmask indicating the set of special object types marshalled
+     * by the Parcelable.
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /**
+     * Flatten this object in to a Parcel.
+     *
+     * @param dest  The Parcel in which the object should be written.
+     * @param flags Additional flags about how the object should be written.
+     *              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeByte((byte) (isZoomSupported() ? 1 : 0));
+        dest.writeFloat(getMaxZoom());
+
+    }
+
+    /**
+     * Whether the camera supports zoom.
+     */
+    public boolean isZoomSupported() {
+        return mZoomSupported;
+    }
+
+    /**
+     * The maximum zoom supported by the camera.
+     */
+    public float getMaxZoom() {
+        return mMaxZoom;
+    }
+}
diff --git a/telecomm/java/android/telecomm/CallVideoClient.java b/telecomm/java/android/telecomm/CallVideoClient.java
new file mode 100644
index 0000000..4b37136
--- /dev/null
+++ b/telecomm/java/android/telecomm/CallVideoClient.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2014 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 android.telecomm;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import com.android.internal.os.SomeArgs;
+import com.android.internal.telecomm.ICallVideoClient;
+
+/**
+ * Base implementation of a CallVideoClient which communicates changes to video properties of a call
+ * from the framework to the current InCall-UI.
+ */
+public abstract class CallVideoClient {
+
+    /**
+     * Video is not being received (no protocol pause was issued).
+     */
+    public static final int SESSION_EVENT_RX_PAUSE = 1;
+
+    /**
+     * Video reception has resumed after a SESSION_EVENT_RX_PAUSE.
+     */
+    public static final int SESSION_EVENT_RX_RESUME = 2;
+
+    /**
+     * Video transmission has begun. This occurs after a negotiated start of video transmission
+     * when the underlying protocol has actually begun transmitting video to the remote party.
+     */
+    public static final int SESSION_EVENT_TX_START = 3;
+
+    /**
+     * Video transmission has stopped. This occur after a negotiated stop of video transmission when
+     * the underlying protocol has actually stopped transmitting video to the remote party.
+     */
+    public static final int SESSION_EVENT_TX_STOP = 4;
+
+    /**
+     * Session modify request was successful.
+     */
+    public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1;
+
+    /**
+     * Session modify request failed.
+     */
+    public static final int SESSION_MODIFY_REQUEST_FAIL = 2;
+
+    /**
+     * Session modify request ignored due to invalid parameters.
+     */
+    public static final int SESSION_MODIFY_REQUEST_INVALID = 3;
+
+    private static final int MSG_ON_RECEIVE_SESSION_MODIFY_REQUEST = 1;
+    private static final int MSG_ON_RECEIVE_SESSION_MODIFY_RESPONSE = 2;
+    private static final int MSG_ON_CALL_SESSION_EVENT = 3;
+    private static final int MSG_ON_UPDATED_PEER_DIMENSIONS = 4;
+    private static final int MSG_ON_UPDATE_CALL_DATA_USAGE = 5;
+    private static final int MSG_ON_CAMERA_CAPABILITIES_CHANGE = 6;
+
+    /** Default Handler used to consolidate binder method calls onto a single thread. */
+    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_ON_RECEIVE_SESSION_MODIFY_REQUEST:
+                    onReceiveSessionModifyRequest((VideoCallProfile) msg.obj);
+                    break;
+                case MSG_ON_RECEIVE_SESSION_MODIFY_RESPONSE: {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        int status = (int) args.arg1;
+                        VideoCallProfile requestedProfile = (VideoCallProfile) args.arg2;
+                        VideoCallProfile responseProfile = (VideoCallProfile) args.arg3;
+
+                        onReceiveSessionModifyResponse(status, requestedProfile,
+                                responseProfile);
+                    } finally {
+                        args.recycle();
+                    }
+                    break;
+                }
+                case MSG_ON_CALL_SESSION_EVENT:
+                    onCallSessionEvent((int) msg.obj);
+                    break;
+                case MSG_ON_UPDATED_PEER_DIMENSIONS: {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        int width = (int) args.arg1;
+                        int height = (int) args.arg2;
+                        onUpdatedPeerDimensions(width, height);
+                    } finally {
+                        args.recycle();
+                    }
+                    break;
+                }
+                case MSG_ON_UPDATE_CALL_DATA_USAGE:
+                    onUpdateCallDataUsage(msg.arg1);
+                    break;
+                case MSG_ON_CAMERA_CAPABILITIES_CHANGE:
+                    onCameraCapabilitiesChange((CallCameraCapabilities) msg.obj);
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+
+    /**
+     * Default ICallVideoClient implementation.
+     */
+    private final class CallVideoClientBinder extends ICallVideoClient.Stub {
+        @Override
+        public void onReceiveSessionModifyRequest(VideoCallProfile videoCallProfile) {
+            mHandler.obtainMessage(MSG_ON_RECEIVE_SESSION_MODIFY_REQUEST,
+                    videoCallProfile).sendToTarget();
+        }
+
+        @Override
+        public void onReceiveSessionModifyResponse(int status,
+                VideoCallProfile requestedProfile, VideoCallProfile responseProfile) {
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = status;
+            args.arg2 = requestedProfile;
+            args.arg3 = responseProfile;
+            mHandler.obtainMessage(MSG_ON_RECEIVE_SESSION_MODIFY_RESPONSE, args).sendToTarget();
+        }
+
+        @Override
+        public void onCallSessionEvent(int event) {
+            mHandler.obtainMessage(MSG_ON_CALL_SESSION_EVENT, event).sendToTarget();
+        }
+
+        @Override
+        public void onUpdatedPeerDimensions(int width, int height) {
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = width;
+            args.arg2 = height;
+            mHandler.obtainMessage(MSG_ON_UPDATED_PEER_DIMENSIONS, args).sendToTarget();
+        }
+
+        @Override
+        public void onUpdateCallDataUsage(int dataUsage) {
+            mHandler.obtainMessage(MSG_ON_UPDATE_CALL_DATA_USAGE, dataUsage).sendToTarget();
+        }
+
+        @Override
+        public void onCameraCapabilitiesChange(CallCameraCapabilities cameraCapabilities) {
+            mHandler.obtainMessage(MSG_ON_CAMERA_CAPABILITIES_CHANGE,
+                    cameraCapabilities).sendToTarget();
+        }
+    }
+
+    private final CallVideoClientBinder mBinder;
+
+    protected CallVideoClient() {
+        mBinder = new CallVideoClientBinder();
+    }
+
+    /**
+     * Retrieves the binder.
+     *
+     * @return The binder.
+     * @hide
+     */
+    public final CallVideoClientBinder getBinder() {
+        return mBinder;
+    }
+
+    /**
+     * Called when an incoming request is received from a remote device to modify the current
+     * video call profile.  This could be, for example, a remote request to upgrade from an
+     * audio-only call to a video call.
+     *
+     * @param videoCallProfile The requested video call profile.
+     */
+    public abstract void onReceiveSessionModifyRequest(VideoCallProfile videoCallProfile);
+
+    /**
+     * Called when a response is received to a previously sent request to modify the video call
+     * profile.  For example, if a request was previously sent to the other party to upgrade from an
+     * audio-only call to a video call, the other party responds to indicate which profile
+     * changes were accepted.
+     *
+     * @param status Status of the session modify request.  Valid values are
+     *               {@link CallVideoClient#SESSION_MODIFY_REQUEST_SUCCESS},
+     *               {@link CallVideoClient#SESSION_MODIFY_REQUEST_FAIL},
+     *               {@link CallVideoClient#SESSION_MODIFY_REQUEST_INVALID}
+     * @param requestedProfile The original request which was sent to the remote device.
+     * @param responseProfile The actual profile changes made by the remote device.
+     */
+    public abstract void onReceiveSessionModifyResponse(int status,
+            VideoCallProfile requestedProfile, VideoCallProfile responseProfile);
+
+    /**
+     * Handles events related to the current session which the client may wish to handle.  These
+     * are separate from requested changes to the session due to the underlying protocol or
+     * connection.
+     * Valid values are: {@link CallVideoClient#SESSION_EVENT_RX_PAUSE},
+     * {@link CallVideoClient#SESSION_EVENT_RX_RESUME},
+     * {@link CallVideoClient#SESSION_EVENT_TX_START}, {@link CallVideoClient#SESSION_EVENT_TX_STOP}
+     *
+     * @param event The event.
+     */
+    public abstract void onCallSessionEvent(int event);
+
+    /**
+     * Handles a change to the video dimensions from the remote caller (peer).  This could happen
+     * if, for example, the peer changes orientation of their device.
+     *
+     * @param width  The updated peer video width.
+     * @param height The updated peer video height.
+     */
+    public abstract void onUpdatedPeerDimensions(int width, int height);
+
+    /**
+     * Handles an update to the total data used for the current session.
+     *
+     * @param dataUsage The updated data usage.
+     */
+    public abstract void onUpdateCallDataUsage(int dataUsage);
+
+    /**
+     * Handles a change in camera capabilities.
+     *
+     * @param callCameraCapabilities The changed camera capabilities.
+     */
+    public abstract void onCameraCapabilitiesChange(CallCameraCapabilities callCameraCapabilities);
+}
+
diff --git a/telecomm/java/android/telecomm/VideoCallProfile.aidl b/telecomm/java/android/telecomm/VideoCallProfile.aidl
new file mode 100644
index 0000000..adbf94d
--- /dev/null
+++ b/telecomm/java/android/telecomm/VideoCallProfile.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2014 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 android.telecomm;
+
+parcelable VideoCallProfile;
diff --git a/telecomm/java/android/telecomm/VideoCallProfile.java b/telecomm/java/android/telecomm/VideoCallProfile.java
new file mode 100644
index 0000000..fc7b2c3
--- /dev/null
+++ b/telecomm/java/android/telecomm/VideoCallProfile.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2014 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 android.telecomm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Represents attributes of video calls.
+ */
+public class VideoCallProfile implements Parcelable {
+    /**
+     * Call is currently in an audio-only mode with no video transmission or receipt.
+     */
+    public static final int VIDEO_STATE_AUDIO_ONLY = 0x0;
+
+    /**
+     * Video transmission is enabled.
+     */
+    public static final int VIDEO_STATE_TX_ENABLED = 0x1;
+
+    /**
+     * Video reception is enabled.
+     */
+    public static final int VIDEO_STATE_RX_ENABLED = 0x2;
+
+    /**
+     * Video signal is bi-directional.
+     */
+    public static final int VIDEO_STATE_BIDIRECTIONAL =
+            VIDEO_STATE_TX_ENABLED | VIDEO_STATE_RX_ENABLED;
+
+    /**
+     * Video is paused.
+     */
+    public static final int VIDEO_STATE_PAUSED = 0x4;
+
+    /**
+     * "High" video quality.
+     */
+    public static final int QUALITY_HIGH = 1;
+
+    /**
+     * "Medium" video quality.
+     */
+    public static final int QUALITY_MEDIUM = 2;
+
+    /**
+     * "Low" video quality.
+     */
+    public static final int QUALITY_LOW = 3;
+
+    /**
+     * Use default video quality.
+     */
+    public static final int QUALITY_DEFAULT = 4;
+
+    private final int mVideoState;
+
+    private final int mQuality;
+
+    /**
+     * Creates an instance of the VideoCallProfile
+     *
+     * @param videoState The video state.
+     * @param quality The video quality.
+     */
+    public VideoCallProfile(int videoState, int quality) {
+        mVideoState = videoState;
+        mQuality = quality;
+    }
+
+    /**
+     * The video state of the call.  Stored as a bit-field describing whether video transmission and
+     * receipt it enabled, as well as whether the video is currently muted.
+     * Valid values: {@link VideoCallProfile#VIDEO_STATE_AUDIO_ONLY},
+     * {@link VideoCallProfile#VIDEO_STATE_BIDIRECTIONAL},
+     * {@link VideoCallProfile#VIDEO_STATE_TX_ENABLED},
+     * {@link VideoCallProfile#VIDEO_STATE_RX_ENABLED},
+     * {@link VideoCallProfile#VIDEO_STATE_PAUSED}.
+     */
+    public int getVideoState() {
+        return mVideoState;
+    }
+
+    /**
+     * The desired video quality for the call.
+     * Valid values: {@link VideoCallProfile#QUALITY_HIGH}, {@link VideoCallProfile#QUALITY_MEDIUM},
+     * {@link VideoCallProfile#QUALITY_LOW}, {@link VideoCallProfile#QUALITY_DEFAULT}.
+     */
+    public int getQuality() {
+        return mQuality;
+    }
+
+    /**
+     * Responsible for creating VideoCallProfile objects from deserialized Parcels.
+     **/
+    public static final Parcelable.Creator<VideoCallProfile> CREATOR =
+            new Parcelable.Creator<VideoCallProfile> () {
+                /**
+                 * Creates a MediaProfile instances from a parcel.
+                 *
+                 * @param source The parcel.
+                 * @return The MediaProfile.
+                 */
+                @Override
+                public VideoCallProfile createFromParcel(Parcel source) {
+                    int state = source.readInt();
+                    int quality = source.readInt();
+
+                    ClassLoader classLoader = VideoCallProfile.class.getClassLoader();
+                    return new VideoCallProfile(state, quality);
+                }
+
+                @Override
+                public VideoCallProfile[] newArray(int size) {
+                    return new VideoCallProfile[size];
+                }
+            };
+
+    /**
+     * Describe the kinds of special objects contained in this Parcelable's
+     * marshalled representation.
+     *
+     * @return a bitmask indicating the set of special object types marshalled
+     * by the Parcelable.
+     */
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    /**
+     * Flatten this object in to a Parcel.
+     *
+     * @param dest  The Parcel in which the object should be written.
+     * @param flags Additional flags about how the object should be written.
+     *              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
+     */
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mVideoState);
+        dest.writeInt(mQuality);
+    }
+}
diff --git a/telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl b/telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl
new file mode 100644
index 0000000..0a854a1
--- /dev/null
+++ b/telecomm/java/com/android/internal/telecomm/ICallVideoClient.aidl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2014 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.internal.telecomm;
+
+import android.telecomm.CallCameraCapabilities;
+import android.telecomm.VideoCallProfile;
+
+ /**
+  * Internal definition of the CallVideoClient, used for an InCall-UI to respond to video telephony
+  * related changes.
+  *
+  * @see android.telecomm.CallVideoClient
+  *
+  * {@hide}
+  */
+ oneway interface ICallVideoClient {
+
+     void onReceiveSessionModifyRequest(in VideoCallProfile videoCallProfile);
+
+     void onReceiveSessionModifyResponse(int status, in VideoCallProfile requestedProfile,
+            in VideoCallProfile responseProfile);
+
+     void onCallSessionEvent(int event);
+
+     void onUpdatedPeerDimensions(int width, int height);
+
+     void onUpdateCallDataUsage(int dataUsage);
+
+     void onCameraCapabilitiesChange(in CallCameraCapabilities callCameraCapabilities);
+ }
