[go: nahoru, domu]

Split Camera2Config into Camera2ImlpConfig and Camera2Interop

 Moves Camera2Config into the impl package and renames it to
 Camera2ImplConfig. This will allow for the Camera2Config name to be
 used as a CameraXConfig implementation.

 Camera2 interop extensions are moved to a new 'interop' package in a
 class called 'Camera2Interop' which is marked experimental.

Bug: 144428928
Test: ./gradlew camera:camera-camera2:connectedCheck
Change-Id: I694af004a5328f8e0efb181f29c24c9844a1dd54
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/Camera2InteropTest.java
similarity index 77%
rename from camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
rename to camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/Camera2InteropTest.java
index a241631..a9d6519 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/Camera2InteropTest.java
@@ -26,7 +26,9 @@
 
 import androidx.annotation.experimental.UseExperimental;
 import androidx.camera.camera2.impl.Camera2CaptureCallbacks;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.camera2.impl.CameraEventCallbacks;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.CameraCaptureSessionStateCallbacks;
 import androidx.camera.core.CameraDeviceStateCallbacks;
 import androidx.camera.core.Config;
@@ -39,7 +41,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
-public final class Camera2ConfigTest {
+public final class Camera2InteropTest {
     private static final int INVALID_TEMPLATE_TYPE = -1;
     private static final int INVALID_COLOR_CORRECTION_MODE = -1;
     private static final CameraCaptureSession.CaptureCallback SESSION_CAPTURE_CALLBACK =
@@ -54,7 +56,7 @@
     @Test
     public void emptyConfigurationDoesNotContainTemplateType() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
         assertThat(config.getCaptureRequestTemplate(INVALID_TEMPLATE_TYPE))
                 .isEqualTo(INVALID_TEMPLATE_TYPE);
@@ -64,10 +66,10 @@
     public void canExtendWithTemplateType() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
-        new Camera2Config.Extender<>(builder)
+        new Camera2Interop.Extender<>(builder)
                 .setCaptureRequestTemplate(CameraDevice.TEMPLATE_PREVIEW);
 
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
         assertThat(config.getCaptureRequestTemplate(INVALID_TEMPLATE_TYPE))
                 .isEqualTo(CameraDevice.TEMPLATE_PREVIEW);
@@ -78,11 +80,10 @@
     public void canExtendWithSessionCaptureCallback() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
-        new Camera2Config.Extender<>(builder).setSessionCaptureCallback(SESSION_CAPTURE_CALLBACK);
+        new Camera2Interop.Extender<>(builder).setSessionCaptureCallback(SESSION_CAPTURE_CALLBACK);
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
-        Camera2Config config = new Camera2Config(builder.build());
-
-        assertThat(config.getSessionCaptureCallbackInternal(/*valueIfMissing=*/ null))
+        assertThat(config.getSessionCaptureCallback(/*valueIfMissing=*/ null))
                 .isSameInstanceAs(SESSION_CAPTURE_CALLBACK);
     }
 
@@ -90,11 +91,11 @@
     public void canExtendWithSessionStateCallback() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
-        new Camera2Config.Extender<>(builder).setSessionStateCallback(SESSION_STATE_CALLBACK);
+        new Camera2Interop.Extender<>(builder).setSessionStateCallback(SESSION_STATE_CALLBACK);
 
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
-        assertThat(config.getSessionStateCallbackInternal(/*valueIfMissing=*/ null))
+        assertThat(config.getSessionStateCallback(/*valueIfMissing=*/ null))
                 .isSameInstanceAs(SESSION_STATE_CALLBACK);
     }
 
@@ -103,11 +104,11 @@
     public void canExtendWithDeviceStateCallback() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(DEVICE_STATE_CALLBACK);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(DEVICE_STATE_CALLBACK);
 
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
-        assertThat(config.getDeviceStateCallbackInternal(/*valueIfMissing=*/ null))
+        assertThat(config.getDeviceStateCallback(/*valueIfMissing=*/ null))
                 .isSameInstanceAs(DEVICE_STATE_CALLBACK);
     }
 
@@ -115,9 +116,8 @@
     public void canExtendWithCameraEventCallback() {
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
-        new Camera2Config.Extender<>(builder).setCameraEventCallback(CAMERA_EVENT_CALLBACKS);
-
-        Camera2Config config = new Camera2Config(builder.build());
+        new Camera2ImplConfig.Extender<>(builder).setCameraEventCallback(CAMERA_EVENT_CALLBACKS);
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
         assertThat(config.getCameraEventCallback(/*valueIfMissing=*/ null))
                 .isSameInstanceAs(CAMERA_EVENT_CALLBACKS);
@@ -129,21 +129,21 @@
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
         Range<Integer> fakeRange = new Range<>(0, 30);
-        new Camera2Config.Extender<>(builder)
-                .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fakeRange)
+        new Camera2Interop.Extender<>(builder).setCaptureRequestOption(
+                CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fakeRange)
                 .setCaptureRequestOption(
                         CaptureRequest.COLOR_CORRECTION_MODE,
                         CameraMetadata.COLOR_CORRECTION_MODE_FAST);
 
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
         assertThat(
-                config.getCaptureRequestOptionInternal(
+                config.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
                         /*valueIfMissing=*/ null))
                 .isSameInstanceAs(fakeRange);
         assertThat(
-                config.getCaptureRequestOptionInternal(
+                config.getCaptureRequestOption(
                         CaptureRequest.COLOR_CORRECTION_MODE,
                         INVALID_COLOR_CORRECTION_MODE))
                 .isEqualTo(CameraMetadata.COLOR_CORRECTION_MODE_FAST);
@@ -155,7 +155,7 @@
         FakeConfig.Builder builder = new FakeConfig.Builder();
 
         Range<Integer> fakeRange = new Range<>(0, 30);
-        new Camera2Config.Extender<>(builder)
+        new Camera2Interop.Extender<>(builder)
                 .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fakeRange)
                 .setCaptureRequestOption(
                         CaptureRequest.COLOR_CORRECTION_MODE,
@@ -163,7 +163,7 @@
                 // Insert one non capture request option to ensure it gets filtered out
                 .setCaptureRequestTemplate(CameraDevice.TEMPLATE_PREVIEW);
 
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
         config.findOptions(
                 "camera2.captureRequest.option",
@@ -185,23 +185,23 @@
     @Test
     public void canSetAndRetrieveCaptureRequestKeys_byBuilder() {
         Range<Integer> fakeRange = new Range<>(0, 30);
-        Camera2Config.Builder builder =
-                new Camera2Config.Builder()
+        Camera2ImplConfig.Builder builder =
+                new Camera2ImplConfig.Builder()
                         .setCaptureRequestOption(
                                 CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fakeRange)
                         .setCaptureRequestOption(
                                 CaptureRequest.COLOR_CORRECTION_MODE,
                                 CameraMetadata.COLOR_CORRECTION_MODE_FAST);
 
-        Camera2Config config = new Camera2Config(builder.build());
+        Camera2ImplConfig config = new Camera2ImplConfig(builder.build());
 
         assertThat(
-                config.getCaptureRequestOptionInternal(
+                config.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
                         /*valueIfMissing=*/ null))
                 .isSameInstanceAs(fakeRange);
         assertThat(
-                config.getCaptureRequestOptionInternal(
+                config.getCaptureRequestOption(
                         CaptureRequest.COLOR_CORRECTION_MODE,
                         INVALID_COLOR_CORRECTION_MODE))
                 .isEqualTo(CameraMetadata.COLOR_CORRECTION_MODE_FAST);
@@ -210,18 +210,18 @@
     @Test
     public void canInsertAllOptions_byBuilder() {
         Range<Integer> fakeRange = new Range<>(0, 30);
-        Camera2Config.Builder builder =
-                new Camera2Config.Builder()
+        Camera2ImplConfig.Builder builder =
+                new Camera2ImplConfig.Builder()
                         .setCaptureRequestOption(
                                 CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fakeRange)
                         .setCaptureRequestOption(
                                 CaptureRequest.COLOR_CORRECTION_MODE,
                                 CameraMetadata.COLOR_CORRECTION_MODE_FAST);
 
-        Camera2Config config1 = new Camera2Config(builder.build());
+        Camera2ImplConfig config1 = new Camera2ImplConfig(builder.build());
 
-        Camera2Config.Builder builder2 =
-                new Camera2Config.Builder()
+        Camera2ImplConfig.Builder builder2 =
+                new Camera2ImplConfig.Builder()
                         .setCaptureRequestOption(
                                 CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON)
                         .setCaptureRequestOption(
@@ -229,23 +229,23 @@
                                 CaptureRequest.CONTROL_AWB_MODE_AUTO)
                         .insertAllOptions(config1);
 
-        Camera2Config config2 = new Camera2Config(builder2.build());
+        Camera2ImplConfig config2 = new Camera2ImplConfig(builder2.build());
 
         assertThat(
-                config2.getCaptureRequestOptionInternal(
+                config2.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
                         /*valueIfMissing=*/ null))
                 .isSameInstanceAs(fakeRange);
         assertThat(
-                config2.getCaptureRequestOptionInternal(
+                config2.getCaptureRequestOption(
                         CaptureRequest.COLOR_CORRECTION_MODE,
                         INVALID_COLOR_CORRECTION_MODE))
                 .isEqualTo(CameraMetadata.COLOR_CORRECTION_MODE_FAST);
         assertThat(
-                config2.getCaptureRequestOptionInternal(
+                config2.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_MODE, /*valueIfMissing=*/ 0))
                 .isEqualTo(CaptureRequest.CONTROL_AE_MODE_ON);
-        assertThat(config2.getCaptureRequestOptionInternal(
+        assertThat(config2.getCaptureRequestOption(
                 CaptureRequest.CONTROL_AWB_MODE, 0))
                 .isEqualTo(CaptureRequest.CONTROL_AWB_MODE_AUTO);
     }
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
index 012ef47..6ad7b84 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
@@ -47,6 +47,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.experimental.UseExperimental;
 import androidx.camera.camera2.impl.util.FakeRepeatingUseCase;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.AppConfig;
 import androidx.camera.core.CameraControlInternal;
 import androidx.camera.core.CameraFactory;
@@ -439,7 +440,7 @@
         ImageCapture.Builder builder = new ImageCapture.Builder();
         CameraCaptureSession.CaptureCallback captureCallback =
                 mock(CameraCaptureSession.CaptureCallback.class);
-        new Camera2Config.Extender<>(builder).setSessionCaptureCallback(captureCallback);
+        new Camera2Interop.Extender<>(builder).setSessionCaptureCallback(captureCallback);
         ImageCapture useCase = builder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java
index cf0ddfd..8095413 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java
@@ -51,7 +51,6 @@
 import android.os.HandlerThread;
 
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraControlInternal;
 import androidx.camera.core.CameraInfoUnavailableException;
@@ -146,22 +145,25 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config repeatingConfig = new Camera2Config(sessionConfig.getImplementationOptions());
-        assertThat(repeatingConfig.getCaptureRequestOptionInternal(
+        Camera2ImplConfig repeatingConfig = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
+        assertThat(repeatingConfig.getCaptureRequestOption(
                 CaptureRequest.SCALER_CROP_REGION, null))
                 .isEqualTo(rect);
 
-        Camera2Config singleConfig = new Camera2Config(mCamera2CameraControl.getSessionOptions());
-        assertThat(singleConfig.getCaptureRequestOptionInternal(
+        Camera2ImplConfig singleConfig = new Camera2ImplConfig(
+                mCamera2CameraControl.getSessionOptions());
+        assertThat(singleConfig.getCaptureRequestOption(
                 CaptureRequest.SCALER_CROP_REGION, null))
                 .isEqualTo(rect);
     }
 
     @Test
     public void defaultAFAWBMode_ShouldBeCAFWhenNotFocusLocked() {
-        Camera2Config singleConfig = new Camera2Config(mCamera2CameraControl.getSessionOptions());
+        Camera2ImplConfig singleConfig = new Camera2ImplConfig(
+                mCamera2CameraControl.getSessionOptions());
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF))
                 .isEqualTo(CaptureRequest.CONTROL_MODE_AUTO);
 
@@ -178,7 +180,8 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         assertAeMode(camera2Config, CONTROL_AE_MODE_ON_AUTO_FLASH);
         assertThat(mCamera2CameraControl.getFlashMode()).isEqualTo(FlashMode.AUTO);
@@ -193,7 +196,8 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         assertAeMode(camera2Config, CONTROL_AE_MODE_ON);
 
@@ -209,7 +213,8 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         assertAeMode(camera2Config, CONTROL_AE_MODE_ON_ALWAYS_FLASH);
 
@@ -225,12 +230,13 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         assertAeMode(camera2Config, CONTROL_AE_MODE_ON);
 
         assertThat(
-                camera2Config.getCaptureRequestOptionInternal(
+                camera2Config.getCaptureRequestOption(
                         CaptureRequest.FLASH_MODE, FLASH_MODE_OFF))
                 .isEqualTo(FLASH_MODE_TORCH);
         assertThat(mCamera2CameraControl.isTorchOn()).isTrue();
@@ -246,11 +252,12 @@
         verify(mControlUpdateCallback, times(2)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getAllValues().get(0);
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         assertAeMode(camera2Config, CONTROL_AE_MODE_ON_AUTO_FLASH);
 
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.FLASH_MODE, -1))
                 .isEqualTo(-1);
         assertThat(mCamera2CameraControl.isTorchOn()).isFalse();
@@ -258,8 +265,8 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlCaptureRequests(
                 mCaptureConfigArgumentCaptor.capture());
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
 
         assertAeMode(resultCaptureConfig, CONTROL_AE_MODE_ON);
 
@@ -274,10 +281,10 @@
         verify(mControlUpdateCallback).onCameraControlCaptureRequests(
                 mCaptureConfigArgumentCaptor.capture());
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
         assertThat(
-                resultCaptureConfig.getCaptureRequestOptionInternal(
+                resultCaptureConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_TRIGGER, null))
                 .isEqualTo(CaptureRequest.CONTROL_AF_TRIGGER_START);
     }
@@ -291,10 +298,10 @@
         verify(mControlUpdateCallback).onCameraControlCaptureRequests(
                 mCaptureConfigArgumentCaptor.capture());
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
         assertThat(
-                resultCaptureConfig.getCaptureRequestOptionInternal(
+                resultCaptureConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, null))
                 .isEqualTo(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
     }
@@ -308,16 +315,16 @@
         verify(mControlUpdateCallback).onCameraControlCaptureRequests(
                 mCaptureConfigArgumentCaptor.capture());
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
         assertThat(
-                resultCaptureConfig.getCaptureRequestOptionInternal(
+                resultCaptureConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_TRIGGER, null))
                 .isEqualTo(CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
 
         if (Build.VERSION.SDK_INT >= 23) {
             assertThat(
-                    resultCaptureConfig.getCaptureRequestOptionInternal(
+                    resultCaptureConfig.getCaptureRequestOption(
                             CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, null))
                     .isEqualTo(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
         }
@@ -332,14 +339,14 @@
         verify(mControlUpdateCallback).onCameraControlCaptureRequests(
                 mCaptureConfigArgumentCaptor.capture());
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
         assertThat(
-                resultCaptureConfig.getCaptureRequestOptionInternal(
+                resultCaptureConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_TRIGGER, null))
                 .isEqualTo(CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
         assertThat(
-                resultCaptureConfig.getCaptureRequestOptionInternal(
+                resultCaptureConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, null))
                 .isNull();
     }
@@ -353,17 +360,17 @@
         verify(mControlUpdateCallback).onCameraControlCaptureRequests(
                 mCaptureConfigArgumentCaptor.capture());
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
 
         assertThat(
-                resultCaptureConfig.getCaptureRequestOptionInternal(
+                resultCaptureConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_TRIGGER, null))
                 .isNull();
 
         if (Build.VERSION.SDK_INT >= 23) {
             assertThat(
-                    resultCaptureConfig.getCaptureRequestOptionInternal(
+                    resultCaptureConfig.getCaptureRequestOption(
                             CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, null))
                     .isEqualTo(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL);
         }
@@ -383,30 +390,32 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config repeatingConfig = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig repeatingConfig = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         // Here we verify only 3A region count is correct.  Values correctness are left to
         // FocusMeteringControlTest.
         assertThat(
-                repeatingConfig.getCaptureRequestOptionInternal(
+                repeatingConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_REGIONS, null)).hasLength(1);
         assertThat(
-                repeatingConfig.getCaptureRequestOptionInternal(
+                repeatingConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_REGIONS, null)).hasLength(1);
         assertThat(
-                repeatingConfig.getCaptureRequestOptionInternal(
+                repeatingConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AWB_REGIONS, null)).hasLength(1);
 
 
-        Camera2Config singleConfig = new Camera2Config(mCamera2CameraControl.getSessionOptions());
+        Camera2ImplConfig singleConfig = new Camera2ImplConfig(
+                mCamera2CameraControl.getSessionOptions());
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_REGIONS, null)).hasLength(1);
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_REGIONS, null)).hasLength(1);
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AWB_REGIONS, null)).hasLength(1);
     }
 
@@ -425,11 +434,11 @@
                 mCaptureConfigArgumentCaptor.capture());
 
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
 
         // Trigger AF
-        assertThat(resultCaptureConfig.getCaptureRequestOptionInternal(
+        assertThat(resultCaptureConfig.getCaptureRequestOption(
                 CaptureRequest.CONTROL_AF_TRIGGER, null))
                 .isEqualTo(CaptureRequest.CONTROL_AF_TRIGGER_START);
     }
@@ -465,28 +474,30 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config repeatingConfig = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig repeatingConfig = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         assertThat(
-                repeatingConfig.getCaptureRequestOptionInternal(
+                repeatingConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_REGIONS, null)).isNull();
         assertThat(
-                repeatingConfig.getCaptureRequestOptionInternal(
+                repeatingConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_REGIONS, null)).isNull();
         assertThat(
-                repeatingConfig.getCaptureRequestOptionInternal(
+                repeatingConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AWB_REGIONS, null)).isNull();
 
 
-        Camera2Config singleConfig = new Camera2Config(mCamera2CameraControl.getSessionOptions());
+        Camera2ImplConfig singleConfig = new Camera2ImplConfig(
+                mCamera2CameraControl.getSessionOptions());
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_REGIONS, null)).isNull();
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AE_REGIONS, null)).isNull();
         assertThat(
-                singleConfig.getCaptureRequestOptionInternal(
+                singleConfig.getCaptureRequestOption(
                         CaptureRequest.CONTROL_AWB_REGIONS, null)).isNull();
     }
 
@@ -508,11 +519,11 @@
                 mCaptureConfigArgumentCaptor.capture());
 
         CaptureConfig captureConfig = mCaptureConfigArgumentCaptor.getValue().get(0);
-        Camera2Config resultCaptureConfig =
-                new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig resultCaptureConfig =
+                new Camera2ImplConfig(captureConfig.getImplementationOptions());
 
         // Trigger AF
-        assertThat(resultCaptureConfig.getCaptureRequestOptionInternal(
+        assertThat(resultCaptureConfig.getCaptureRequestOption(
                 CaptureRequest.CONTROL_AF_TRIGGER, null))
                 .isEqualTo(CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
     }
@@ -521,7 +532,8 @@
         verify(mControlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config repeatingConfig = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig repeatingConfig = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
         assertAfMode(repeatingConfig, expectAfMode);
     }
 
@@ -552,13 +564,15 @@
         mCamera2CameraControl.startFocusAndMetering(action);
         HandlerUtil.waitForLooperToIdle(mHandler);
 
-        Camera2Config singleConfig = new Camera2Config(mCamera2CameraControl.getSessionOptions());
+        Camera2ImplConfig singleConfig = new Camera2ImplConfig(
+                mCamera2CameraControl.getSessionOptions());
         assertAfMode(singleConfig, CaptureRequest.CONTROL_AF_MODE_AUTO);
 
         mCamera2CameraControl.cancelFocusAndMetering();
         HandlerUtil.waitForLooperToIdle(mHandler);
 
-        Camera2Config singleConfig2 = new Camera2Config(mCamera2CameraControl.getSessionOptions());
+        Camera2ImplConfig singleConfig2 = new Camera2ImplConfig(
+                mCamera2CameraControl.getSessionOptions());
         assertAfMode(singleConfig2, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
     }
 
@@ -590,9 +604,9 @@
         return false;
     }
 
-    private void assertAfMode(Camera2Config config, int afMode) {
+    private void assertAfMode(Camera2ImplConfig config, int afMode) {
         if (isAfModeSupported(afMode)) {
-            assertThat(config.getCaptureRequestOptionInternal(
+            assertThat(config.getCaptureRequestOption(
                     CaptureRequest.CONTROL_AF_MODE, null)).isEqualTo(afMode);
         } else {
             int fallbackMode;
@@ -604,14 +618,14 @@
                 fallbackMode = CONTROL_AF_MODE_OFF;
             }
 
-            assertThat(config.getCaptureRequestOptionInternal(
+            assertThat(config.getCaptureRequestOption(
                     CaptureRequest.CONTROL_AF_MODE, null)).isEqualTo(fallbackMode);
         }
     }
 
-    private void assertAeMode(Camera2Config config, int aeMode) {
+    private void assertAeMode(Camera2ImplConfig config, int aeMode) {
         if (isAeModeSupported(aeMode)) {
-            assertThat(config.getCaptureRequestOptionInternal(
+            assertThat(config.getCaptureRequestOption(
                     CaptureRequest.CONTROL_AE_MODE, null)).isEqualTo(aeMode);
         } else {
             int fallbackMode;
@@ -621,14 +635,14 @@
                 fallbackMode = CONTROL_AE_MODE_OFF;
             }
 
-            assertThat(config.getCaptureRequestOptionInternal(
+            assertThat(config.getCaptureRequestOption(
                     CaptureRequest.CONTROL_AE_MODE, null)).isEqualTo(fallbackMode);
         }
     }
 
-    private void assertAwbMode(Camera2Config config, int awbMode) {
+    private void assertAwbMode(Camera2ImplConfig config, int awbMode) {
         if (isAwbModeSupported(awbMode)) {
-            assertThat(config.getCaptureRequestOptionInternal(
+            assertThat(config.getCaptureRequestOption(
                     CaptureRequest.CONTROL_AWB_MODE, null)).isEqualTo(awbMode);
         } else {
             int fallbackMode;
@@ -638,7 +652,7 @@
                 fallbackMode = CONTROL_AWB_MODE_OFF;
             }
 
-            assertThat(config.getCaptureRequestOptionInternal(
+            assertThat(config.getCaptureRequestOption(
                     CaptureRequest.CONTROL_AWB_MODE, null)).isEqualTo(fallbackMode);
         }
     }
@@ -680,10 +694,11 @@
         verify(controlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 mSessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = mSessionConfigArgumentCaptor.getValue();
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         reset(controlUpdateCallback);
-        return camera2Config.getCaptureRequestOptionInternal(
+        return camera2Config.getCaptureRequestOption(
                 CaptureRequest.SCALER_CROP_REGION, null);
     }
 
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraRepositoryTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraRepositoryTest.java
index d93756c..18878b0 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraRepositoryTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraRepositoryTest.java
@@ -26,10 +26,10 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.experimental.UseExperimental;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.ExperimentalCamera2Interop;
 import androidx.camera.camera2.impl.util.SemaphoreReleasingCamera2Callbacks.DeviceStateCallback;
 import androidx.camera.camera2.impl.util.SemaphoreReleasingCamera2Callbacks.SessionStateCallback;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.CameraFactory;
 import androidx.camera.core.CameraRepository;
 import androidx.camera.core.ImmediateSurface;
@@ -114,7 +114,7 @@
         mUseCaseGroup = new UseCaseGroup();
 
         FakeUseCaseConfig.Builder configBuilder = new FakeUseCaseConfig.Builder();
-        new Camera2Config.Extender<>(configBuilder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(configBuilder).setDeviceStateCallback(mDeviceStateCallback);
         mConfig = configBuilder.getUseCaseConfig();
         mCameraId = getCameraIdForLensFacingUnchecked(LensFacing.BACK);
         mUseCase = new CallbackAttachingFakeUseCase(mConfig, mCameraId);
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java
index a091144..e71d15e 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java
@@ -36,10 +36,10 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.experimental.UseExperimental;
 import androidx.camera.camera2.Camera2AppConfig;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.ExperimentalCamera2Interop;
 import androidx.camera.camera2.impl.util.SemaphoreReleasingCamera2Callbacks.DeviceStateCallback;
 import androidx.camera.camera2.impl.util.SemaphoreReleasingCamera2Callbacks.SessionCaptureCallback;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CameraInfo;
@@ -145,7 +145,7 @@
             @Override
             public void run() {
                 ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-                new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+                new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
                 ImageAnalysis useCase = builder.build();
 
                 CameraX.bindToLifecycle(mLifecycle, DEFAULT_SELECTOR, useCase);
@@ -178,7 +178,7 @@
             @Override
             public void run() {
                 ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-                new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+                new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
                 ImageAnalysis useCase = builder.build();
 
                 ImageAnalysis useCase2 = new ImageAnalysis.Builder().build();
@@ -211,7 +211,7 @@
             @Override
             public void run() {
                 ImageAnalysis.Builder configBuilder = new ImageAnalysis.Builder();
-                new Camera2Config.Extender<>(configBuilder)
+                new Camera2Interop.Extender<>(configBuilder)
                         .setDeviceStateCallback(deviceStateCallback)
                         .setSessionCaptureCallback(sessionCaptureCallback);
                 ImageAnalysis useCase = configBuilder.build();
@@ -250,7 +250,7 @@
     @Test
     public void bind_opensCamera() {
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase = builder.build();
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -268,7 +268,7 @@
     @Test
     public void bind_opensCamera_withOutAnalyzer() {
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase = builder.build();
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -288,7 +288,7 @@
                 CameraCaptureSession.StateCallback.class);
 
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback)
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback)
                 .setSessionStateCallback(mockSessionStateCallback);
 
         ImageAnalysis useCase = builder.build();
@@ -315,7 +315,7 @@
 
         for (int i = 0; i < 2; i++) {
             CameraDevice.StateCallback callback = mock(CameraDevice.StateCallback.class);
-            new Camera2Config.Extender<>(builder).setDeviceStateCallback(callback);
+            new Camera2Interop.Extender<>(builder).setDeviceStateCallback(callback);
             ImageAnalysis useCase = builder.build();
 
             mInstrumentation.runOnMainSync(new Runnable() {
@@ -345,7 +345,7 @@
 
         for (int i = 0; i < 2; i++) {
             CameraDevice.StateCallback callback = mock(CameraDevice.StateCallback.class);
-            new Camera2Config.Extender<>(builder).setDeviceStateCallback(callback);
+            new Camera2Interop.Extender<>(builder).setDeviceStateCallback(callback);
             ImageAnalysis useCase = builder.build();
 
             mInstrumentation.runOnMainSync(new Runnable() {
@@ -372,7 +372,7 @@
     @Test
     public void unbindAll_closesAllCameras() {
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase = builder.build();
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -398,7 +398,7 @@
     @Test
     public void unbindAllAssociatedUseCase_closesCamera() {
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase = builder.build();
 
         mInstrumentation.runOnMainSync(new Runnable() {
@@ -424,7 +424,7 @@
     @Test
     public void unbindPartialAssociatedUseCase_doesNotCloseCamera() throws InterruptedException {
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase0 = builder.build();
 
         ImageCapture useCase1 = new ImageCapture.Builder()
@@ -456,7 +456,7 @@
     @Test
     public void unbindAllAssociatedUseCaseInParts_ClosesCamera() {
         ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
-        new Camera2Config.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
+        new Camera2Interop.Extender<>(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase0 = builder.build();
 
         ImageCapture useCase1 = new ImageCapture.Builder()
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
index 692da7b..f185053 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
@@ -43,7 +43,6 @@
 import android.view.Surface;
 
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.CaptureSession.State;
 import androidx.camera.core.CameraCaptureCallback;
 import androidx.camera.core.CameraCaptureCallbacks;
@@ -611,8 +610,8 @@
     private static <T> CaptureConfig getCaptureConfig(CaptureRequest.Key<T> key, T effectValue,
             CameraCaptureCallback callback) {
         CaptureConfig.Builder captureConfigBuilder = new CaptureConfig.Builder();
-        Camera2Config.Builder camera2ConfigurationBuilder =
-                new Camera2Config.Builder();
+        Camera2ImplConfig.Builder camera2ConfigurationBuilder =
+                new Camera2ImplConfig.Builder();
         camera2ConfigurationBuilder.setCaptureRequestOption(key, effectValue);
         captureConfigBuilder.addImplementationOptions(camera2ConfigurationBuilder.build());
         captureConfigBuilder.addCameraCaptureCallback(callback);
@@ -703,12 +702,13 @@
             builder.addRepeatingCameraCaptureCallback(mSessionCameraCaptureCallback);
 
             MutableOptionsBundle testCallbackConfig = MutableOptionsBundle.create();
-            testCallbackConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+            testCallbackConfig.insertOption(Camera2ImplConfig.CAMERA_EVENT_CALLBACK_OPTION,
                     new CameraEventCallbacks(mTestCameraEventCallback));
             builder.addImplementationOptions(testCallbackConfig);
 
             MutableOptionsBundle mockCameraEventCallbackConfig = MutableOptionsBundle.create();
-            mockCameraEventCallbackConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+            mockCameraEventCallbackConfig.insertOption(
+                    Camera2ImplConfig.CAMERA_EVENT_CALLBACK_OPTION,
                     new CameraEventCallbacks(mMockCameraEventCallback));
             builder.addImplementationOptions(mockCameraEventCallbackConfig);
 
@@ -723,7 +723,7 @@
             // P3 | SessionConfig          | AF_MODE_AUTO  | FLASH_MODE_SINGLE  | AE_MODE_ON
             // ==================================================================================
 
-            Camera2Config.Builder camera2ConfigBuilder = new Camera2Config.Builder();
+            Camera2ImplConfig.Builder camera2ConfigBuilder = new Camera2ImplConfig.Builder();
 
             // Add capture request options for CameraEventCallbacks
             CameraEventCallback cameraEventCallback = new CameraEventCallback() {
@@ -731,7 +731,7 @@
                 public CaptureConfig onRepeating() {
                     CaptureConfig.Builder builder = new CaptureConfig.Builder();
                     builder.addImplementationOptions(
-                            new Camera2Config.Builder()
+                            new Camera2ImplConfig.Builder()
                                     .setCaptureRequestOption(
                                             CaptureRequest.CONTROL_AF_MODE,
                                             CaptureRequest.CONTROL_AF_MODE_MACRO)
@@ -742,7 +742,7 @@
                     return builder.build();
                 }
             };
-            new Camera2Config.Extender<>(camera2ConfigBuilder)
+            new Camera2ImplConfig.Extender<>(camera2ConfigBuilder)
                     .setCameraEventCallback(
                             new CameraEventCallbacks(cameraEventCallback));
 
@@ -765,7 +765,7 @@
             captureConfigBuilder.addCameraCaptureCallback(mComboCameraCaptureCallback);
 
             // Add capture request options for CaptureConfig
-            captureConfigBuilder.addImplementationOptions(new Camera2Config.Builder()
+            captureConfigBuilder.addImplementationOptions(new Camera2ImplConfig.Builder()
                     .setCaptureRequestOption(
                             CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
                     .build());
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/ZoomControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/ZoomControlDeviceTest.java
index 4a6e9bf..9ef7a28 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/ZoomControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/ZoomControlDeviceTest.java
@@ -37,7 +37,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.camera2.Camera2AppConfig;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.AppConfig;
 import androidx.camera.core.CameraControlInternal.ControlUpdateCallback;
 import androidx.camera.core.CameraInfoUnavailableException;
@@ -220,10 +219,11 @@
         verify(controlUpdateCallback, times(1)).onCameraControlUpdateSessionConfig(
                 sessionConfigArgumentCaptor.capture());
         SessionConfig sessionConfig = sessionConfigArgumentCaptor.getValue();
-        Camera2Config camera2Config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                sessionConfig.getImplementationOptions());
 
         reset(controlUpdateCallback);
-        return camera2Config.getCaptureRequestOptionInternal(
+        return camera2Config.getCaptureRequestOption(
                 CaptureRequest.SCALER_CROP_REGION, null);
     }
 
@@ -489,7 +489,7 @@
         mZoomControl.setActive(false);
 
         assertThat(mZoomControl.getZoomRatio().getValue()).isEqualTo(
-                mZoomControl.DEFAULT_ZOOM_RATIO);
+                ZoomControl.DEFAULT_ZOOM_RATIO);
         assertThat(mZoomControl.getLinearZoom().getValue()).isEqualTo(0);
     }
 }
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java
deleted file mode 100644
index e8d93c8d..0000000
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * Copyright (C) 2019 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 androidx.camera.camera2;
-
-import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
-import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraDevice.StateCallback;
-import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.CaptureResult;
-import android.view.Surface;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.RestrictTo;
-import androidx.annotation.RestrictTo.Scope;
-import androidx.camera.camera2.impl.CameraEventCallbacks;
-import androidx.camera.core.Config;
-import androidx.camera.core.ExtendableBuilder;
-import androidx.camera.core.MutableConfig;
-import androidx.camera.core.MutableOptionsBundle;
-import androidx.camera.core.OptionsBundle;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/** Configuration options related to the {@link android.hardware.camera2} APIs. */
-public final class Camera2Config implements Config {
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY)
-    public static final String CAPTURE_REQUEST_ID_STEM = "camera2.captureRequest.option.";
-
-    // Option Declarations:
-    // *********************************************************************************************
-
-    static final Option<Integer> TEMPLATE_TYPE_OPTION =
-            Option.create("camera2.captureRequest.templateType", int.class);
-    static final Option<StateCallback> DEVICE_STATE_CALLBACK_OPTION =
-            Option.create("camera2.cameraDevice.stateCallback", StateCallback.class);
-    static final Option<CameraCaptureSession.StateCallback> SESSION_STATE_CALLBACK_OPTION =
-            Option.create(
-                    "camera2.cameraCaptureSession.stateCallback",
-                    CameraCaptureSession.StateCallback.class);
-    static final Option<CaptureCallback> SESSION_CAPTURE_CALLBACK_OPTION =
-            Option.create("camera2.cameraCaptureSession.captureCallback", CaptureCallback.class);
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY)
-    public static final Option<CameraEventCallbacks> CAMERA_EVENT_CALLBACK_OPTION =
-            Option.create("camera2.cameraEvent.callback", CameraEventCallbacks.class);
-    // *********************************************************************************************
-
-    private final Config mConfig;
-
-    /**
-     * Creates a Camera2Config for reading Camera2 options from the given config.
-     *
-     * @param config The config that potentially contains Camera2 options.
-     */
-    public Camera2Config(@NonNull Config config) {
-        mConfig = config;
-    }
-
-    // Unfortunately, we can't get the Class<T> from the CaptureRequest.Key, so we're forced to
-    // erase the type. This shouldn't be a problem as long as we are only using these options
-    // within the Camera2Config and Camera2Config.Builder classes.
-    static Option<Object> createCaptureRequestOption(CaptureRequest.Key<?> key) {
-        return Option.create(CAPTURE_REQUEST_ID_STEM + key.getName(), Object.class, key);
-    }
-
-    /**
-     * Returns a value for the given {@link CaptureRequest.Key}.
-     *
-     * @param key            The key to retrieve.
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @param <ValueT>       The type of the value.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public <ValueT> ValueT getCaptureRequestOptionInternal(
-            @NonNull CaptureRequest.Key<ValueT> key, @Nullable ValueT valueIfMissing) {
-        @SuppressWarnings(
-                "unchecked") // Type should have been only set via Builder#setCaptureRequestOption()
-                Option<ValueT> opt = (Option<ValueT>) Camera2Config.createCaptureRequestOption(key);
-        return mConfig.retrieveOption(opt, valueIfMissing);
-    }
-
-    /**
-     * Returns a value for the given {@link CaptureRequest.Key}.
-     *
-     * @param key            The key to retrieve.
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @param <ValueT>       The type of the value.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     */
-    @ExperimentalCamera2Interop
-    @Nullable
-    public <ValueT> ValueT getCaptureRequestOption(
-            @NonNull CaptureRequest.Key<ValueT> key, @Nullable ValueT valueIfMissing) {
-        return getCaptureRequestOptionInternal(key, valueIfMissing);
-    }
-
-
-    /**
-     * Returns all capture request options contained in this configuration.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY)
-    @NonNull
-    public Set<Option<?>> getCaptureRequestOptions() {
-        final Set<Option<?>> optionSet = new HashSet<>();
-        findOptions(
-                Camera2Config.CAPTURE_REQUEST_ID_STEM,
-                new OptionMatcher() {
-                    @Override
-                    public boolean onOptionMatched(Option<?> option) {
-                        optionSet.add(option);
-                        return true;
-                    }
-                });
-        return optionSet;
-    }
-
-    /**
-     * Returns the CameraDevice template from the given configuration.
-     *
-     * <p>See {@link CameraDevice} for valid template types. For example, {@link
-     * CameraDevice#TEMPLATE_PREVIEW}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY)
-    public int getCaptureRequestTemplate(int valueIfMissing) {
-        return mConfig.retrieveOption(TEMPLATE_TYPE_OPTION, valueIfMissing);
-    }
-
-    /**
-     * Returns the stored {@link CameraDevice.StateCallback}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public CameraDevice.StateCallback getDeviceStateCallbackInternal(
-            @Nullable CameraDevice.StateCallback valueIfMissing) {
-        return mConfig.retrieveOption(DEVICE_STATE_CALLBACK_OPTION, valueIfMissing);
-    }
-
-    /**
-     * Returns the stored {@link CameraDevice.StateCallback}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     */
-    @ExperimentalCamera2Interop
-    @Nullable
-    public CameraDevice.StateCallback getDeviceStateCallback(
-            @Nullable CameraDevice.StateCallback valueIfMissing) {
-        return getDeviceStateCallbackInternal(valueIfMissing);
-    }
-
-
-    /**
-     * Returns the stored {@link CameraCaptureSession.StateCallback}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public CameraCaptureSession.StateCallback getSessionStateCallbackInternal(
-            @Nullable CameraCaptureSession.StateCallback valueIfMissing) {
-        return mConfig.retrieveOption(SESSION_STATE_CALLBACK_OPTION, valueIfMissing);
-    }
-
-    /**
-     * Returns the stored {@link CameraCaptureSession.StateCallback}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     */
-    @ExperimentalCamera2Interop
-    @Nullable
-    public CameraCaptureSession.StateCallback getSessionStateCallback(
-            @Nullable CameraCaptureSession.StateCallback valueIfMissing) {
-        return getSessionStateCallbackInternal(valueIfMissing);
-    }
-
-    /**
-     * Returns the stored {@link CameraCaptureSession.CaptureCallback}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public CameraCaptureSession.CaptureCallback getSessionCaptureCallbackInternal(
-            @Nullable CameraCaptureSession.CaptureCallback valueIfMissing) {
-        return mConfig.retrieveOption(SESSION_CAPTURE_CALLBACK_OPTION, valueIfMissing);
-    }
-
-    /**
-     * Returns the stored {@link CameraCaptureSession.CaptureCallback}.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     */
-    @ExperimentalCamera2Interop
-    @Nullable
-    public CameraCaptureSession.CaptureCallback getSessionCaptureCallback(
-            @Nullable CameraCaptureSession.CaptureCallback valueIfMissing) {
-        return getSessionCaptureCallbackInternal(valueIfMissing);
-    }
-
-    /**
-     * Returns the stored CameraEventCallbacks instance.
-     *
-     * @param valueIfMissing The value to return if this configuration option has not been set.
-     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
-     * configuration.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public CameraEventCallbacks getCameraEventCallback(
-            @Nullable CameraEventCallbacks valueIfMissing) {
-        return mConfig.retrieveOption(CAMERA_EVENT_CALLBACK_OPTION, valueIfMissing);
-    }
-
-    // Start of the default implementation of Config
-    // *********************************************************************************************
-
-    // Implementations of Config default methods
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Override
-    public boolean containsOption(@NonNull Option<?> id) {
-        return mConfig.containsOption(id);
-    }
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Override
-    @Nullable
-    public <ValueT> ValueT retrieveOption(@NonNull Option<ValueT> id) {
-        return mConfig.retrieveOption(id);
-    }
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Override
-    @Nullable
-    public <ValueT> ValueT retrieveOption(@NonNull Option<ValueT> id,
-            @Nullable ValueT valueIfMissing) {
-        return mConfig.retrieveOption(id, valueIfMissing);
-    }
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Override
-    public void findOptions(@NonNull String idStem, @NonNull OptionMatcher matcher) {
-        mConfig.findOptions(idStem, matcher);
-    }
-
-    /** @hide */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Override
-    @NonNull
-    public Set<Option<?>> listOptions() {
-        return mConfig.listOptions();
-    }
-
-    // End of the default implementation of Config
-    // *********************************************************************************************
-
-    /**
-     * Extends a {@link ExtendableBuilder} to add Camera2 options.
-     *
-     * @param <T> the type being built by the extendable builder.
-     */
-    public static final class Extender<T> {
-
-        ExtendableBuilder<T> mBaseBuilder;
-
-        /**
-         * Creates an Extender that can be used to add Camera2 options to another Builder.
-         *
-         * @param baseBuilder The builder being extended.
-         */
-        public Extender(@NonNull ExtendableBuilder<T> baseBuilder) {
-            mBaseBuilder = baseBuilder;
-        }
-
-        /**
-         * Sets a {@link CaptureRequest.Key} and Value on the configuration.
-         *
-         * @param key      The {@link CaptureRequest.Key} which will be set.
-         * @param value    The value for the key.
-         * @param <ValueT> The type of the value.
-         * @return The current Extender.
-         */
-        @NonNull
-        @ExperimentalCamera2Interop
-        public <ValueT> Extender<T> setCaptureRequestOption(
-                @NonNull CaptureRequest.Key<ValueT> key, @NonNull ValueT value) {
-            // Reify the type so we can obtain the class
-            Option<Object> opt = Camera2Config.createCaptureRequestOption(key);
-            mBaseBuilder.getMutableConfig().insertOption(opt, value);
-            return this;
-        }
-
-        /**
-         * Sets a CameraDevice template on the given configuration.
-         *
-         * <p>See {@link CameraDevice} for valid template types. For example, {@link
-         * CameraDevice#TEMPLATE_PREVIEW}.
-         *
-         * @param templateType The template type to set.
-         * @return The current Extender.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY)
-        @NonNull
-        public Extender<T> setCaptureRequestTemplate(int templateType) {
-            mBaseBuilder.getMutableConfig().insertOption(TEMPLATE_TYPE_OPTION, templateType);
-            return this;
-        }
-
-        /**
-         * Sets a {@link CameraDevice.StateCallback}.
-         *
-         * <p>The caller is expected to use the {@link CameraDevice} instance accessed through the
-         * callback methods responsibly. Generally safe usages include: (1) querying the device for
-         * its id, (2) using the callbacks to determine what state the device is currently in.
-         * Generally unsafe usages include: (1) creating a new {@link CameraCaptureSession}, (2)
-         * creating a new {@link CaptureRequest}, (3) closing the device. When the caller uses the
-         * device beyond the safe usage limits, the usage may still work in conjunction with
-         * CameraX, but any strong guarantees provided by CameraX about the validity of the camera
-         * state become void.
-         *
-         * @param stateCallback The {@link CameraDevice.StateCallback}.
-         * @return The current Extender.
-         */
-        @NonNull
-        @ExperimentalCamera2Interop
-        public Extender<T> setDeviceStateCallback(
-                @NonNull CameraDevice.StateCallback stateCallback) {
-            mBaseBuilder.getMutableConfig().insertOption(DEVICE_STATE_CALLBACK_OPTION,
-                    stateCallback);
-            return this;
-        }
-
-        /**
-         * Sets a {@link CameraCaptureSession.StateCallback}.
-         *
-         * <p>The caller is expected to use the {@link CameraCaptureSession} instance accessed
-         * through the callback methods responsibly. Generally safe usages include: (1) querying the
-         * session for its properties, (2) using the callbacks to determine what state the session
-         * is currently in. Generally unsafe usages include: (1) submitting a new {@link
-         * CaptureRequest}, (2) stopping an existing {@link CaptureRequest}, (3) closing the
-         * session, (4) attaching a new {@link Surface} to the session. When the caller uses the
-         * session beyond the safe usage limits, the usage may still work in conjunction with
-         * CameraX, but any strong gurantees provided by CameraX about the validity of the camera
-         * state become void.
-         *
-         * @param stateCallback The {@link CameraCaptureSession.StateCallback}.
-         * @return The current Extender.
-         */
-        @NonNull
-        @ExperimentalCamera2Interop
-        public Extender<T> setSessionStateCallback(
-                @NonNull CameraCaptureSession.StateCallback stateCallback) {
-            mBaseBuilder.getMutableConfig().insertOption(SESSION_STATE_CALLBACK_OPTION,
-                    stateCallback);
-            return this;
-        }
-
-        /**
-         * Sets a {@link CameraCaptureSession.CaptureCallback}.
-         *
-         * <p>The caller is expected to use the {@link CameraCaptureSession} instance accessed
-         * through the callback methods responsibly. Generally safe usages include: (1) querying the
-         * session for its properties. Generally unsafe usages include: (1) submitting a new {@link
-         * CaptureRequest}, (2) stopping an existing {@link CaptureRequest}, (3) closing the
-         * session, (4) attaching a new {@link Surface} to the session. When the caller uses the
-         * session beyond the safe usage limits, the usage may still work in conjunction with
-         * CameraX, but any strong gurantees provided by CameraX about the validity of the camera
-         * state become void.
-         *
-         * <p>The caller is generally free to use the {@link CaptureRequest} and {@link
-         * CaptureResult} instances accessed through the callback methods.
-         *
-         * @param captureCallback The {@link CameraCaptureSession.CaptureCallback}.
-         * @return The current Extender.
-         */
-        @NonNull
-        @ExperimentalCamera2Interop
-        public Extender<T> setSessionCaptureCallback(
-                @NonNull CameraCaptureSession.CaptureCallback captureCallback) {
-            mBaseBuilder.getMutableConfig().insertOption(SESSION_CAPTURE_CALLBACK_OPTION,
-                    captureCallback);
-            return this;
-        }
-
-        /**
-         * Sets a CameraEventCallbacks instance.
-         *
-         * @param cameraEventCallbacks The CameraEventCallbacks.
-         * @return The current Extender.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public Extender<T> setCameraEventCallback(
-                @NonNull CameraEventCallbacks cameraEventCallbacks) {
-            mBaseBuilder.getMutableConfig().insertOption(CAMERA_EVENT_CALLBACK_OPTION,
-                    cameraEventCallbacks);
-            return this;
-        }
-    }
-
-    /**
-     * Builder for creating {@link Camera2Config} instance.
-     *
-     * <p>Use {@link Builder} for creating {@link Config} which contains camera2 options
-     * only. And use {@link Extender} to add Camera2 options on existing other {@link
-     * ExtendableBuilder}.
-     *
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    public static final class Builder implements ExtendableBuilder<Camera2Config> {
-
-        private final MutableOptionsBundle mMutableOptionsBundle = MutableOptionsBundle.create();
-
-        @Override
-        @NonNull
-        public MutableConfig getMutableConfig() {
-            return mMutableOptionsBundle;
-        }
-
-        /**
-         * Inserts new capture request option with specific {@link CaptureRequest.Key} setting.
-         */
-        @NonNull
-        public <ValueT> Builder setCaptureRequestOption(
-                @NonNull CaptureRequest.Key<ValueT> key, @NonNull ValueT value) {
-            Option<Object> opt = Camera2Config.createCaptureRequestOption(key);
-            mMutableOptionsBundle.insertOption(opt, value);
-            return this;
-        }
-
-        /** Inserts options from other {@link Config} object. */
-        @NonNull
-        public Builder insertAllOptions(@NonNull Config config) {
-            for (Option<?> option : config.listOptions()) {
-                @SuppressWarnings("unchecked") // Options/values are being copied directly
-                        Option<Object> objectOpt = (Option<Object>) option;
-                mMutableOptionsBundle.insertOption(objectOpt, config.retrieveOption(objectOpt));
-            }
-            return this;
-        }
-
-        /**
-         * Builds an immutable {@link Camera2Config} from the current state.
-         *
-         * @return A {@link Camera2Config} populated with the current state.
-         */
-        @Override
-        @NonNull
-        public Camera2Config build() {
-            return new Camera2Config(OptionsBundle.from(mMutableOptionsBundle));
-        }
-    }
-}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/ExperimentalCamera2Interop.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/ExperimentalCamera2Interop.java
index e388357..d7ca31b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/ExperimentalCamera2Interop.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/ExperimentalCamera2Interop.java
@@ -25,7 +25,7 @@
  * Denotes that the annotated method uses the experimental methods which allow direct access to
  * camera2 classes.
  *
- * <p>The Camera2Config and Camera2Config.Extender exposes the underlying instances of camera2
+ * <p>The Camera2Interop and Camera2Interop.Extender exposes the underlying instances of camera2
  * classes such CameraDevice.StateCallback, CameraCaptureSession.StateCallback and
  * CameraCaptureSession.CaptureCallback. In addition the configs allow setting of camera2
  * CaptureRequest parameters. However, CameraX does not provide any guarantee on how it operates
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraControl.java
index b26e5fd..be4ad37 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraControl.java
@@ -30,7 +30,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.annotation.WorkerThread;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.annotation.CameraExecutor;
 import androidx.camera.core.CameraControlInternal;
 import androidx.camera.core.CaptureConfig;
@@ -295,7 +294,7 @@
             CaptureConfig.Builder singleRequestBuilder = new CaptureConfig.Builder();
             singleRequestBuilder.setTemplateType(getDefaultTemplate());
             singleRequestBuilder.setUseRepeatingSurface(true);
-            Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+            Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
             configBuilder.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE,
                     getSupportedAeMode(CaptureRequest.CONTROL_AE_MODE_ON));
             configBuilder.setCaptureRequestOption(CaptureRequest.FLASH_MODE,
@@ -321,7 +320,7 @@
     @VisibleForTesting
     @WorkerThread
     Config getSessionOptions() {
-        Camera2Config.Builder builder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder builder = new Camera2ImplConfig.Builder();
         builder.setCaptureRequestOption(
                 CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
 
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpacker.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpacker.java
index 3e618e0..4e74834 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpacker.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpacker.java
@@ -18,7 +18,6 @@
 
 import android.hardware.camera2.CaptureRequest;
 
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.Config;
 import androidx.camera.core.Config.Option;
@@ -52,7 +51,7 @@
         builder.setImplementationOptions(implOptions);
 
         // Get Camera2 extended options
-        final Camera2Config camera2Config = new Camera2Config(config);
+        final Camera2ImplConfig camera2Config = new Camera2ImplConfig(config);
 
         // Apply template type
         builder.setTemplateType(camera2Config.getCaptureRequestTemplate(templateType));
@@ -60,11 +59,11 @@
         // Add extension callbacks
         builder.addCameraCaptureCallback(
                 CaptureCallbackContainer.create(
-                        camera2Config.getSessionCaptureCallbackInternal(
+                        camera2Config.getSessionCaptureCallback(
                                 Camera2CaptureCallbacks.createNoOpCallback())));
 
         // Copy extension keys
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         for (Option<?> option : camera2Config.getCaptureRequestOptions()) {
             @SuppressWarnings("unchecked")
             // No way to get actual type info here, so treat as Object
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureRequestBuilder.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureRequestBuilder.java
index bd1aba1..5293e18 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureRequestBuilder.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CaptureRequestBuilder.java
@@ -24,7 +24,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.Config;
 import androidx.camera.core.DeferrableSurface;
@@ -69,10 +68,10 @@
 
     private static void applyImplementationOptionToCaptureBuilder(
             CaptureRequest.Builder builder, Config config) {
-        Camera2Config camera2Config = new Camera2Config(config);
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(config);
         for (Config.Option<?> option : camera2Config.getCaptureRequestOptions()) {
             /* Although type is erased below, it is safe to pass it to CaptureRequest.Builder
-            because these option are created via Camera2Config.Extender.setCaptureRequestOption
+            because these option are created via Camera2Interop.Extender.setCaptureRequestOption
             (CaptureRequest.Key<ValueT> key, ValueT value) and hence the type compatibility of key
             and value are ensured by the compiler. */
             @SuppressWarnings("unchecked")
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java
new file mode 100644
index 0000000..91d6eb1
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java
@@ -0,0 +1,360 @@
+/*
+ * Copyright 2019 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 androidx.camera.camera2.impl;
+
+import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.camera.core.Config;
+import androidx.camera.core.ExtendableBuilder;
+import androidx.camera.core.MutableConfig;
+import androidx.camera.core.MutableOptionsBundle;
+import androidx.camera.core.OptionsBundle;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Internal shared implementation details for camera 2 interop.
+ *
+ * @hide
+ */
+@RestrictTo(Scope.LIBRARY_GROUP)
+public final class Camera2ImplConfig implements Config {
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    public static final String CAPTURE_REQUEST_ID_STEM = "camera2.captureRequest.option.";
+
+    // Option Declarations:
+    // *********************************************************************************************
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    public static final Config.Option<Integer> TEMPLATE_TYPE_OPTION =
+            Option.create("camera2.captureRequest.templateType", int.class);
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    public static final Option<CameraDevice.StateCallback> DEVICE_STATE_CALLBACK_OPTION =
+            Option.create("camera2.cameraDevice.stateCallback", CameraDevice.StateCallback.class);
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    public static final Option<CameraCaptureSession.StateCallback> SESSION_STATE_CALLBACK_OPTION =
+            Option.create(
+                    "camera2.cameraCaptureSession.stateCallback",
+                    CameraCaptureSession.StateCallback.class);
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    public static final Option<CameraCaptureSession.CaptureCallback>
+            SESSION_CAPTURE_CALLBACK_OPTION =
+            Option.create("camera2.cameraCaptureSession.captureCallback",
+                    CameraCaptureSession.CaptureCallback.class);
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    public static final Option<CameraEventCallbacks> CAMERA_EVENT_CALLBACK_OPTION =
+            Option.create("camera2.cameraEvent.callback", CameraEventCallbacks.class);
+    // *********************************************************************************************
+
+    private final Config mConfig;
+
+    /**
+     * Creates a Camera2InteropInternal for reading Camera2 options from the given config.
+     *
+     * @param config The config that potentially contains Camera2 options.
+     */
+    public Camera2ImplConfig(@NonNull Config config) {
+        mConfig = config;
+    }
+
+    // Unfortunately, we can't get the Class<T> from the CaptureRequest.Key, so we're forced to
+    // erase the type. This shouldn't be a problem as long as we are only using these options
+    // within the Camera2InteropInternal and Camera2InteropInternal.Builder classes.
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY)
+    @NonNull
+    public static Option<Object> createCaptureRequestOption(@NonNull CaptureRequest.Key<?> key) {
+        return Option.create(CAPTURE_REQUEST_ID_STEM + key.getName(), Object.class, key);
+    }
+
+    /**
+     * Returns a value for the given {@link CaptureRequest.Key}.
+     *
+     * @param key            The key to retrieve.
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @param <ValueT>       The type of the value.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public <ValueT> ValueT getCaptureRequestOption(
+            @NonNull CaptureRequest.Key<ValueT> key, @Nullable ValueT valueIfMissing) {
+        @SuppressWarnings(
+                "unchecked") // Type should have been only set via Builder#setCaptureRequestOption()
+                Option<ValueT> opt = (Option<ValueT>) Camera2ImplConfig.createCaptureRequestOption(
+                key);
+        return mConfig.retrieveOption(opt, valueIfMissing);
+    }
+
+
+    /**
+     * Returns all capture request options contained in this configuration.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY)
+    @NonNull
+    public Set<Option<?>> getCaptureRequestOptions() {
+        final Set<Option<?>> optionSet = new HashSet<>();
+        findOptions(
+                Camera2ImplConfig.CAPTURE_REQUEST_ID_STEM,
+                new OptionMatcher() {
+                    @Override
+                    public boolean onOptionMatched(Option<?> option) {
+                        optionSet.add(option);
+                        return true;
+                    }
+                });
+        return optionSet;
+    }
+
+    /**
+     * Returns the CameraDevice template from the given configuration.
+     *
+     * <p>See {@link CameraDevice} for valid template types. For example, {@link
+     * CameraDevice#TEMPLATE_PREVIEW}.
+     *
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getCaptureRequestTemplate(int valueIfMissing) {
+        return mConfig.retrieveOption(TEMPLATE_TYPE_OPTION, valueIfMissing);
+    }
+
+    /**
+     * Returns the stored {@link CameraDevice.StateCallback}.
+     *
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public CameraDevice.StateCallback getDeviceStateCallback(
+            @Nullable CameraDevice.StateCallback valueIfMissing) {
+        return mConfig.retrieveOption(DEVICE_STATE_CALLBACK_OPTION, valueIfMissing);
+    }
+
+
+    /**
+     * Returns the stored {@link CameraCaptureSession.StateCallback}.
+     *
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public CameraCaptureSession.StateCallback getSessionStateCallback(
+            @Nullable CameraCaptureSession.StateCallback valueIfMissing) {
+        return mConfig.retrieveOption(SESSION_STATE_CALLBACK_OPTION, valueIfMissing);
+    }
+
+    /**
+     * Returns the stored {@link CameraCaptureSession.CaptureCallback}.
+     *
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public CameraCaptureSession.CaptureCallback getSessionCaptureCallback(
+            @Nullable CameraCaptureSession.CaptureCallback valueIfMissing) {
+        return mConfig.retrieveOption(SESSION_CAPTURE_CALLBACK_OPTION, valueIfMissing);
+    }
+
+    /**
+     * Returns the stored CameraEventCallbacks instance.
+     *
+     * @param valueIfMissing The value to return if this configuration option has not been set.
+     * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
+     * configuration.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Nullable
+    public CameraEventCallbacks getCameraEventCallback(
+            @Nullable CameraEventCallbacks valueIfMissing) {
+        return mConfig.retrieveOption(CAMERA_EVENT_CALLBACK_OPTION, valueIfMissing);
+    }
+
+    // Start of the default implementation of Config
+    // *********************************************************************************************
+
+    // Implementations of Config default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(@NonNull Option<?> id) {
+        return mConfig.containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(@NonNull Option<ValueT> id) {
+        return mConfig.retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(@NonNull Option<ValueT> id,
+            @Nullable ValueT valueIfMissing) {
+        return mConfig.retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(@NonNull String idStem, @NonNull OptionMatcher matcher) {
+        mConfig.findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @NonNull
+    public Set<Option<?>> listOptions() {
+        return mConfig.listOptions();
+    }
+
+    // End of the default implementation of Config
+    // *********************************************************************************************
+
+    /**
+     * Builder for creating {@link Camera2ImplConfig} instance.
+     *
+     * <p>Use {@link Camera2ImplConfig.Builder} for creating {@link Config} which contains
+     * camera2 options only. And use
+     * {@link androidx.camera.camera2.interop.Camera2Interop.Extender} to add Camera2 options on
+     * existing other {@link
+     * ExtendableBuilder}.
+     *
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public static final class Builder implements ExtendableBuilder<Camera2ImplConfig> {
+
+        private final MutableOptionsBundle mMutableOptionsBundle = MutableOptionsBundle.create();
+
+        @Override
+        @NonNull
+        public MutableConfig getMutableConfig() {
+            return mMutableOptionsBundle;
+        }
+
+        /**
+         * Inserts new capture request option with specific {@link CaptureRequest.Key} setting.
+         */
+        @NonNull
+        public <ValueT> Camera2ImplConfig.Builder setCaptureRequestOption(
+                @NonNull CaptureRequest.Key<ValueT> key, @NonNull ValueT value) {
+            Option<Object> opt = Camera2ImplConfig.createCaptureRequestOption(key);
+            mMutableOptionsBundle.insertOption(opt, value);
+            return this;
+        }
+
+        /** Inserts options from other {@link Config} object. */
+        @NonNull
+        public Camera2ImplConfig.Builder insertAllOptions(@NonNull Config config) {
+            for (Option<?> option : config.listOptions()) {
+                @SuppressWarnings("unchecked") // Options/values are being copied directly
+                        Option<Object> objectOpt = (Option<Object>) option;
+                mMutableOptionsBundle.insertOption(objectOpt, config.retrieveOption(objectOpt));
+            }
+            return this;
+        }
+
+        /**
+         * Builds an immutable {@link Camera2ImplConfig} from the current state.
+         *
+         * @return A {@link Camera2ImplConfig} populated with the current state.
+         */
+        @Override
+        @NonNull
+        public Camera2ImplConfig build() {
+            return new Camera2ImplConfig(OptionsBundle.from(mMutableOptionsBundle));
+        }
+    }
+
+    /**
+     * Extends a {@link ExtendableBuilder} to add Camera2 implementation options.
+     *
+     * @param <T> the type being built by the extendable builder.
+     * @hide
+     */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public static final class Extender<T> {
+
+        ExtendableBuilder<T> mBaseBuilder;
+
+        /**
+         * Creates an Extender that can be used to add Camera2 implementation options to another
+         * Builder.
+         *
+         * @param baseBuilder The builder being extended.
+         */
+        public Extender(@NonNull ExtendableBuilder<T> baseBuilder) {
+            mBaseBuilder = baseBuilder;
+        }
+
+        /**
+         * Sets a CameraEventCallbacks instance.
+         *
+         * @param cameraEventCallbacks The CameraEventCallbacks.
+         * @return The current Extender.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public Extender<T> setCameraEventCallback(
+                @NonNull CameraEventCallbacks cameraEventCallbacks) {
+            mBaseBuilder.getMutableConfig().insertOption(CAMERA_EVENT_CALLBACK_OPTION,
+                    cameraEventCallbacks);
+            return this;
+        }
+    }
+}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpacker.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpacker.java
index 015b213..6790cbf 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpacker.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpacker.java
@@ -19,7 +19,6 @@
 import android.hardware.camera2.CaptureRequest;
 
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CameraCaptureSessionStateCallbacks;
 import androidx.camera.core.CameraDeviceStateCallbacks;
 import androidx.camera.core.Config;
@@ -60,30 +59,30 @@
         builder.setImplementationOptions(implOptions);
 
         // Get Camera2 extended options
-        final Camera2Config camera2Config = new Camera2Config(config);
+        final Camera2ImplConfig camera2Config = new Camera2ImplConfig(config);
 
         // Apply template type
         builder.setTemplateType(camera2Config.getCaptureRequestTemplate(templateType));
 
         // Add extension callbacks
         builder.addDeviceStateCallback(
-                camera2Config.getDeviceStateCallbackInternal(
+                camera2Config.getDeviceStateCallback(
                         CameraDeviceStateCallbacks.createNoOpCallback()));
         builder.addSessionStateCallback(
-                camera2Config.getSessionStateCallbackInternal(
+                camera2Config.getSessionStateCallback(
                         CameraCaptureSessionStateCallbacks.createNoOpCallback()));
         builder.addCameraCaptureCallback(
                 CaptureCallbackContainer.create(
-                        camera2Config.getSessionCaptureCallbackInternal(
+                        camera2Config.getSessionCaptureCallback(
                                 Camera2CaptureCallbacks.createNoOpCallback())));
 
         MutableOptionsBundle cameraEventConfig = MutableOptionsBundle.create();
-        cameraEventConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+        cameraEventConfig.insertOption(Camera2ImplConfig.CAMERA_EVENT_CALLBACK_OPTION,
                 camera2Config.getCameraEventCallback(CameraEventCallbacks.createEmptyCallback()));
         builder.addImplementationOptions(cameraEventConfig);
 
         // Copy extension keys
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         for (Option<?> option : camera2Config.getCaptureRequestOptions()) {
             @SuppressWarnings("unchecked")
             // No way to get actual type info here, so treat as Object
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java
index 4f1453f..7ee8cde 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java
@@ -29,7 +29,6 @@
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.annotation.CameraExecutor;
 import androidx.camera.camera2.impl.compat.CameraCaptureSessionCompat;
 import androidx.camera.camera2.impl.compat.CameraDeviceCompat;
@@ -250,7 +249,7 @@
                             CameraCaptureSessionStateCallbacks.createComboCallback(callbacks);
 
                     // Start check preset CaptureStage information.
-                    CameraEventCallbacks eventCallbacks = new Camera2Config(
+                    CameraEventCallbacks eventCallbacks = new Camera2ImplConfig(
                             sessionConfig.getImplementationOptions()).getCameraEventCallback(
                             CameraEventCallbacks.createEmptyCallback());
                     List<CaptureConfig> presetList =
@@ -320,7 +319,7 @@
                 case OPENED:
                     // Only issue onDisableSession requests at OPENED state.
                     if (mSessionConfig != null) {
-                        CameraEventCallbacks eventCallbacks = new Camera2Config(
+                        CameraEventCallbacks eventCallbacks = new Camera2ImplConfig(
                                 mSessionConfig.getImplementationOptions()).getCameraEventCallback(
                                 CameraEventCallbacks.createEmptyCallback());
                         List<CaptureConfig> configList =
@@ -513,7 +512,7 @@
             // P2 SessionConfig options
             CaptureConfig.Builder captureConfigBuilder = CaptureConfig.Builder.from(captureConfig);
 
-            CameraEventCallbacks eventCallbacks = new Camera2Config(
+            CameraEventCallbacks eventCallbacks = new Camera2ImplConfig(
                     mSessionConfig.getImplementationOptions()).getCameraEventCallback(
                     CameraEventCallbacks.createEmptyCallback());
 
@@ -750,7 +749,7 @@
                         // Issue capture request of enableSession if exists.
                         if (mSessionConfig != null) {
                             Config implOptions = mSessionConfig.getImplementationOptions();
-                            CameraEventCallbacks eventCallbacks = new Camera2Config(
+                            CameraEventCallbacks eventCallbacks = new Camera2ImplConfig(
                                     implOptions).getCameraEventCallback(
                                     CameraEventCallbacks.createEmptyCallback());
                             List<CaptureConfig> list =
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/FocusMeteringControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/FocusMeteringControl.java
index 8072995..fa840c5 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/FocusMeteringControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/FocusMeteringControl.java
@@ -28,7 +28,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.annotation.CameraExecutor;
 import androidx.camera.core.CameraControl;
 import androidx.camera.core.CaptureConfig;
@@ -132,7 +131,7 @@
      * applies to all repeating requests and single requests.
      */
     @WorkerThread
-    void addFocusMeteringOptions(@NonNull Camera2Config.Builder configBuilder) {
+    void addFocusMeteringOptions(@NonNull Camera2ImplConfig.Builder configBuilder) {
         int afMode = mIsInAfAutoMode
                 ? CaptureRequest.CONTROL_AF_MODE_AUTO
                 : CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
@@ -304,7 +303,7 @@
         CaptureConfig.Builder builder = new CaptureConfig.Builder();
         builder.setTemplateType(getDefaultTemplate());
         builder.setUseRepeatingSurface(true);
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         configBuilder.setCaptureRequestOption(CaptureRequest.CONTROL_AF_TRIGGER,
                 CaptureRequest.CONTROL_AF_TRIGGER_START);
         builder.addImplementationOptions(configBuilder.build());
@@ -320,7 +319,7 @@
         CaptureConfig.Builder builder = new CaptureConfig.Builder();
         builder.setTemplateType(getDefaultTemplate());
         builder.setUseRepeatingSurface(true);
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         configBuilder.setCaptureRequestOption(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
                 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
         builder.addImplementationOptions(configBuilder.build());
@@ -338,7 +337,7 @@
         builder.setUseRepeatingSurface(true);
         builder.setTemplateType(getDefaultTemplate());
 
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         if (cancelAfTrigger) {
             configBuilder.setCaptureRequestOption(CaptureRequest.CONTROL_AF_TRIGGER,
                     CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpacker.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpacker.java
index 3197135..64993c6 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpacker.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpacker.java
@@ -20,7 +20,6 @@
 import android.hardware.camera2.CaptureRequest;
 import android.os.Build;
 
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.DeviceProperties;
 import androidx.camera.core.ImageCapture.CaptureMode;
@@ -46,7 +45,7 @@
         }
         ImageCaptureConfig imageCaptureConfig = (ImageCaptureConfig) config;
 
-        Camera2Config.Builder camera2ConfigBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder camera2ConfigBuilder = new Camera2ImplConfig.Builder();
 
         if (imageCaptureConfig.hasCaptureMode()) {
             applyPixelHdrPlusChangeForCaptureMode(imageCaptureConfig.getCaptureMode(),
@@ -64,7 +63,7 @@
     // module.
     @SuppressLint("NewApi")
     private void applyPixelHdrPlusChangeForCaptureMode(@CaptureMode int captureMode,
-            Camera2Config.Builder builder) {
+            Camera2ImplConfig.Builder builder) {
         if ("Google".equals(mDeviceProperties.manufacturer())
                 && ("Pixel 2".equals(mDeviceProperties.model())
                 || "Pixel 3".equals(mDeviceProperties.model()))) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java
new file mode 100644
index 0000000..89db3a8
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright 2019 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 androidx.camera.camera2.interop;
+
+import static androidx.camera.camera2.impl.Camera2ImplConfig.DEVICE_STATE_CALLBACK_OPTION;
+import static androidx.camera.camera2.impl.Camera2ImplConfig.SESSION_CAPTURE_CALLBACK_OPTION;
+import static androidx.camera.camera2.impl.Camera2ImplConfig.SESSION_STATE_CALLBACK_OPTION;
+import static androidx.camera.camera2.impl.Camera2ImplConfig.TEMPLATE_TYPE_OPTION;
+
+import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.RestrictTo.Scope;
+import androidx.camera.camera2.ExperimentalCamera2Interop;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
+import androidx.camera.core.Config;
+import androidx.camera.core.ExtendableBuilder;
+
+/** Utilities related to interoperability with the {@link android.hardware.camera2} APIs. */
+@ExperimentalCamera2Interop
+public final class Camera2Interop {
+
+    /**
+     * Extends a {@link ExtendableBuilder} to add Camera2 options.
+     *
+     * @param <T> the type being built by the extendable builder.
+     */
+    public static final class Extender<T> {
+
+        ExtendableBuilder<T> mBaseBuilder;
+
+        /**
+         * Creates an Extender that can be used to add Camera2 options to another Builder.
+         *
+         * @param baseBuilder The builder being extended.
+         */
+        public Extender(@NonNull ExtendableBuilder<T> baseBuilder) {
+            mBaseBuilder = baseBuilder;
+        }
+
+        /**
+         * Sets a {@link CaptureRequest.Key} and Value on the configuration.
+         *
+         * @param key      The {@link CaptureRequest.Key} which will be set.
+         * @param value    The value for the key.
+         * @param <ValueT> The type of the value.
+         * @return The current Extender.
+         */
+        @NonNull
+        public <ValueT> Extender<T> setCaptureRequestOption(
+                @NonNull CaptureRequest.Key<ValueT> key, @NonNull ValueT value) {
+            // Reify the type so we can obtain the class
+            Config.Option<Object> opt = Camera2ImplConfig.createCaptureRequestOption(key);
+            mBaseBuilder.getMutableConfig().insertOption(opt, value);
+            return this;
+        }
+
+        /**
+         * Sets a CameraDevice template on the given configuration.
+         *
+         * <p>See {@link CameraDevice} for valid template types. For example, {@link
+         * CameraDevice#TEMPLATE_PREVIEW}.
+         *
+         * @param templateType The template type to set.
+         * @return The current Extender.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY)
+        @NonNull
+        public Extender<T> setCaptureRequestTemplate(int templateType) {
+            mBaseBuilder.getMutableConfig().insertOption(TEMPLATE_TYPE_OPTION, templateType);
+            return this;
+        }
+
+        /**
+         * Sets a {@link CameraDevice.StateCallback}.
+         *
+         * <p>The caller is expected to use the {@link CameraDevice} instance accessed through the
+         * callback methods responsibly. Generally safe usages include: (1) querying the device for
+         * its id, (2) using the callbacks to determine what state the device is currently in.
+         * Generally unsafe usages include: (1) creating a new {@link CameraCaptureSession}, (2)
+         * creating a new {@link CaptureRequest}, (3) closing the device. When the caller uses the
+         * device beyond the safe usage limits, the usage may still work in conjunction with
+         * CameraX, but any strong guarantees provided by CameraX about the validity of the camera
+         * state become void.
+         *
+         * @param stateCallback The {@link CameraDevice.StateCallback}.
+         * @return The current Extender.
+         */
+        @NonNull
+        public Extender<T> setDeviceStateCallback(
+                @NonNull CameraDevice.StateCallback stateCallback) {
+            mBaseBuilder.getMutableConfig().insertOption(DEVICE_STATE_CALLBACK_OPTION,
+                    stateCallback);
+            return this;
+        }
+
+        /**
+         * Sets a {@link CameraCaptureSession.StateCallback}.
+         *
+         * <p>The caller is expected to use the {@link CameraCaptureSession} instance accessed
+         * through the callback methods responsibly. Generally safe usages include: (1) querying the
+         * session for its properties, (2) using the callbacks to determine what state the session
+         * is currently in. Generally unsafe usages include: (1) submitting a new {@link
+         * CaptureRequest}, (2) stopping an existing {@link CaptureRequest}, (3) closing the
+         * session, (4) attaching a new {@link android.view.Surface} to the session. When the
+         * caller uses the session beyond the safe usage limits, the usage may still work in
+         * conjunction with CameraX, but any strong guarantees provided by CameraX about the
+         * validity of the camera state become void.
+         *
+         * @param stateCallback The {@link CameraCaptureSession.StateCallback}.
+         * @return The current Extender.
+         */
+        @NonNull
+        public Extender<T> setSessionStateCallback(
+                @NonNull CameraCaptureSession.StateCallback stateCallback) {
+            mBaseBuilder.getMutableConfig().insertOption(SESSION_STATE_CALLBACK_OPTION,
+                    stateCallback);
+            return this;
+        }
+
+        /**
+         * Sets a {@link CameraCaptureSession.CaptureCallback}.
+         *
+         * <p>The caller is expected to use the {@link CameraCaptureSession} instance accessed
+         * through the callback methods responsibly. Generally safe usages include: (1) querying the
+         * session for its properties. Generally unsafe usages include: (1) submitting a new {@link
+         * CaptureRequest}, (2) stopping an existing {@link CaptureRequest}, (3) closing the
+         * session, (4) attaching a new {@link android.view.Surface} to the session. When the
+         * caller uses the session beyond the safe usage limits, the usage may still work in
+         * conjunction with CameraX, but any strong guarantees provided by CameraX about the
+         * validity of the camera state become void.
+         *
+         * <p>The caller is generally free to use the {@link CaptureRequest} and {@link
+         * CaptureResult} instances accessed through the callback methods.
+         *
+         * @param captureCallback The {@link CameraCaptureSession.CaptureCallback}.
+         * @return The current Extender.
+         */
+        @NonNull
+        public Extender<T> setSessionCaptureCallback(
+                @NonNull CameraCaptureSession.CaptureCallback captureCallback) {
+            mBaseBuilder.getMutableConfig().insertOption(SESSION_CAPTURE_CALLBACK_OPTION,
+                    captureCallback);
+            return this;
+        }
+    }
+
+    // Ensure this class isn't instantiated
+    private Camera2Interop() {}
+}
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java
index 3bb172c..2501a41 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java
@@ -25,8 +25,8 @@
 import android.os.Build;
 
 import androidx.annotation.experimental.UseExperimental;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.ExperimentalCamera2Interop;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.CameraCaptureCallback;
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.ImageCapture;
@@ -58,7 +58,7 @@
         ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder();
         CaptureCallback captureCallback = mock(CaptureCallback.class);
 
-        new Camera2Config.Extender<>(imageCaptureBuilder)
+        new Camera2Interop.Extender<>(imageCaptureBuilder)
                 .setSessionCaptureCallback(captureCallback);
 
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
@@ -77,7 +77,7 @@
         ImageCapture.Builder imageCaptureConfigBuilder = new ImageCapture.Builder();
 
         // Add 2 options to ensure that multiple options can be unpacked.
-        new Camera2Config.Extender<>(imageCaptureConfigBuilder)
+        new Camera2Interop.Extender<>(imageCaptureConfigBuilder)
                 .setCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO)
                 .setCaptureRequestOption(
@@ -87,12 +87,12 @@
         mUnpacker.unpack(imageCaptureConfigBuilder.getUseCaseConfig(), captureBuilder);
         CaptureConfig captureConfig = captureBuilder.build();
 
-        Camera2Config config = new Camera2Config(captureConfig.getImplementationOptions());
+        Camera2ImplConfig config = new Camera2ImplConfig(captureConfig.getImplementationOptions());
 
-        assertThat(config.getCaptureRequestOptionInternal(
+        assertThat(config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF))
                 .isEqualTo(CaptureRequest.CONTROL_AF_MODE_AUTO);
-        assertThat(config.getCaptureRequestOptionInternal(
+        assertThat(config.getCaptureRequestOption(
                 CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF))
                 .isEqualTo(CaptureRequest.FLASH_MODE_TORCH);
     }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
index e776e93..3f907d9 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
@@ -28,8 +28,8 @@
 import android.os.Build;
 
 import androidx.annotation.experimental.UseExperimental;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.ExperimentalCamera2Interop;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.CameraCaptureCallback;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.SessionConfig;
@@ -66,10 +66,11 @@
         CameraEventCallbacks cameraEventCallbacks = mock(CameraEventCallbacks.class);
         when(cameraEventCallbacks.clone()).thenReturn(cameraEventCallbacks);
 
-        new Camera2Config.Extender<>(imageCaptureBuilder)
+        new Camera2Interop.Extender<>(imageCaptureBuilder)
                 .setSessionCaptureCallback(captureCallback)
                 .setDeviceStateCallback(deviceCallback)
-                .setSessionStateCallback(sessionStateCallback)
+                .setSessionStateCallback(sessionStateCallback);
+        new Camera2ImplConfig.Extender<>(imageCaptureBuilder)
                 .setCameraEventCallback(cameraEventCallbacks);
 
         SessionConfig.Builder sessionBuilder = new SessionConfig.Builder();
@@ -88,7 +89,8 @@
         assertThat(sessionConfig.getSessionStateCallbacks())
                 .containsExactly(sessionStateCallback);
         assertThat(
-                new Camera2Config(sessionConfig.getImplementationOptions()).getCameraEventCallback(
+                new Camera2ImplConfig(
+                        sessionConfig.getImplementationOptions()).getCameraEventCallback(
                         null)).isEqualTo(cameraEventCallbacks);
     }
 
@@ -98,7 +100,7 @@
         ImageCapture.Builder imageCaptureConfigBuilder = new ImageCapture.Builder();
 
         // Add 2 options to ensure that multiple options can be unpacked.
-        new Camera2Config.Extender<>(imageCaptureConfigBuilder)
+        new Camera2Interop.Extender<>(imageCaptureConfigBuilder)
                 .setCaptureRequestOption(
                         CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO)
                 .setCaptureRequestOption(
@@ -108,12 +110,12 @@
         mUnpacker.unpack(imageCaptureConfigBuilder.getUseCaseConfig(), sessionBuilder);
         SessionConfig sessionConfig = sessionBuilder.build();
 
-        Camera2Config config = new Camera2Config(sessionConfig.getImplementationOptions());
+        Camera2ImplConfig config = new Camera2ImplConfig(sessionConfig.getImplementationOptions());
 
-        assertThat(config.getCaptureRequestOptionInternal(
+        assertThat(config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF))
                 .isEqualTo(CaptureRequest.CONTROL_AF_MODE_AUTO);
-        assertThat(config.getCaptureRequestOptionInternal(
+        assertThat(config.getCaptureRequestOption(
                 CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF))
                 .isEqualTo(CaptureRequest.FLASH_MODE_TORCH);
     }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java
index 4b360d4..d122e9f 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java
@@ -40,7 +40,6 @@
 import android.util.Rational;
 import android.util.Size;
 
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.impl.Camera2CameraControl.CaptureResultListener;
 import androidx.camera.core.CameraControlInternal;
 import androidx.camera.core.FocusMeteringAction;
@@ -199,29 +198,29 @@
     }
 
     private MeteringRectangle[] getAfRects(FocusMeteringControl control) {
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         control.addFocusMeteringOptions(configBuilder);
-        Camera2Config config = configBuilder.build();
+        Camera2ImplConfig config = configBuilder.build();
 
-        return config.getCaptureRequestOptionInternal(CaptureRequest.CONTROL_AF_REGIONS,
+        return config.getCaptureRequestOption(CaptureRequest.CONTROL_AF_REGIONS,
                 new MeteringRectangle[]{});
     }
 
     private MeteringRectangle[] getAeRects(FocusMeteringControl control) {
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         control.addFocusMeteringOptions(configBuilder);
-        Camera2Config config = configBuilder.build();
+        Camera2ImplConfig config = configBuilder.build();
 
-        return config.getCaptureRequestOptionInternal(CaptureRequest.CONTROL_AE_REGIONS,
+        return config.getCaptureRequestOption(CaptureRequest.CONTROL_AE_REGIONS,
                 new MeteringRectangle[]{});
     }
 
     private MeteringRectangle[] getAwbRects(FocusMeteringControl control) {
-        Camera2Config.Builder configBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder configBuilder = new Camera2ImplConfig.Builder();
         control.addFocusMeteringOptions(configBuilder);
-        Camera2Config config = configBuilder.build();
+        Camera2ImplConfig config = configBuilder.build();
 
-        return config.getCaptureRequestOptionInternal(CaptureRequest.CONTROL_AWB_REGIONS,
+        return config.getCaptureRequestOption(CaptureRequest.CONTROL_AWB_REGIONS,
                 new MeteringRectangle[]{});
     }
 
@@ -748,9 +747,9 @@
     }
 
     private void verifyAfMode(int expectAfMode) {
-        Camera2Config.Builder builder1 = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder builder1 = new Camera2ImplConfig.Builder();
         mFocusMeteringControl.addFocusMeteringOptions(builder1);
-        assertThat(builder1.build().getCaptureRequestOptionInternal(
+        assertThat(builder1.build().getCaptureRequestOption(
                 CaptureRequest.CONTROL_AF_MODE, null))
                 .isEqualTo(expectAfMode);
     }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java
index a0793ef..d88c15c 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java
@@ -21,7 +21,6 @@
 import android.hardware.camera2.CaptureRequest;
 import android.os.Build;
 
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.DeviceProperties;
 import androidx.camera.core.ImageCapture;
@@ -98,8 +97,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
@@ -115,8 +115,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isEqualTo(false);
     }
@@ -132,8 +133,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isEqualTo(true);
     }
@@ -149,8 +151,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
@@ -166,8 +169,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
@@ -183,8 +187,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isEqualTo(false);
     }
@@ -200,8 +205,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isEqualTo(true);
     }
@@ -217,8 +223,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
@@ -234,8 +241,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
@@ -251,8 +259,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
@@ -268,8 +277,9 @@
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
 
         CaptureConfig captureConfig = captureBuilder.build();
-        Camera2Config camera2Config = new Camera2Config(captureConfig.getImplementationOptions());
-        assertThat(camera2Config.getCaptureRequestOptionInternal(
+        Camera2ImplConfig camera2Config = new Camera2ImplConfig(
+                captureConfig.getImplementationOptions());
+        assertThat(camera2Config.getCaptureRequestOption(
                 CaptureRequest.CONTROL_ENABLE_ZSL, null))
                 .isNull();
     }
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
index 9452508..b88c247 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
@@ -41,7 +41,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.camera2.Camera2AppConfig;
-import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.camera2.impl.CameraEventCallback;
 import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.core.AppConfig;
@@ -182,7 +182,8 @@
         PreviewConfig previewConfig = ExtensionsTestUtil.createPreviewConfigWithEffect(mEffectMode,
                 mLensFacing);
         assertNotNull(previewConfig.getUseCaseEventCallback());
-        CameraEventCallbacks callback1 = new Camera2Config(previewConfig).getCameraEventCallback(
+        CameraEventCallbacks callback1 = new Camera2ImplConfig(
+                previewConfig).getCameraEventCallback(
                 null);
         assertNotNull(callback1);
         assertEquals(callback1.getAllItems().size(), 1);
@@ -193,7 +194,7 @@
                 ExtensionsTestUtil.createImageCaptureConfigWithEffect(mEffectMode, mLensFacing);
         assertNotNull(imageCaptureConfig.getUseCaseEventCallback());
         assertNotNull(imageCaptureConfig.getCaptureBundle());
-        CameraEventCallbacks callback2 = new Camera2Config(
+        CameraEventCallbacks callback2 = new Camera2ImplConfig(
                 imageCaptureConfig).getCameraEventCallback(null);
         assertNotNull(callback2);
         assertEquals(callback2.getAllItems().size(), 1);
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
index 99e5937..8ad3272 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
@@ -39,7 +39,7 @@
 import android.util.Size;
 
 import androidx.camera.camera2.Camera2AppConfig;
-import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
@@ -171,7 +171,7 @@
                 imageCaptureAdapter).setUseCaseEventCallback(
                 imageCaptureAdapter).setCaptureProcessor(
                 mock(CaptureProcessor.class));
-        new Camera2Config.Extender<>(configBuilder).setCameraEventCallback(
+        new Camera2ImplConfig.Extender<>(configBuilder).setCameraEventCallback(
                 new CameraEventCallbacks(imageCaptureAdapter));
 
         ImageCapture useCase = configBuilder.build();
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AdaptingCaptureStage.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AdaptingCaptureStage.java
index f3c728a..5394398 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AdaptingCaptureStage.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AdaptingCaptureStage.java
@@ -19,7 +19,7 @@
 import android.hardware.camera2.CaptureRequest;
 import android.util.Pair;
 
-import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.CaptureStage;
 import androidx.camera.extensions.impl.CaptureStageImpl;
@@ -34,7 +34,7 @@
     AdaptingCaptureStage(CaptureStageImpl impl) {
         mId = impl.getId();
 
-        Camera2Config.Builder camera2ConfigurationBuilder = new Camera2Config.Builder();
+        Camera2ImplConfig.Builder camera2ConfigurationBuilder = new Camera2ImplConfig.Builder();
 
         for (Pair<CaptureRequest.Key, Object> captureParameter : impl.getParameters()) {
             camera2ConfigurationBuilder.setCaptureRequestOption(captureParameter.first,
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
index 2caf750..1ffabb5 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
@@ -25,7 +25,7 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.camera2.impl.CameraEventCallback;
 import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.core.CameraIdFilter;
@@ -139,7 +139,7 @@
         }
 
         ImageCaptureAdapter imageCaptureAdapter = new ImageCaptureAdapter(mImpl, mEffectMode);
-        new Camera2Config.Extender<>(mBuilder).setCameraEventCallback(
+        new Camera2ImplConfig.Extender<>(mBuilder).setCameraEventCallback(
                 new CameraEventCallbacks(imageCaptureAdapter));
         mBuilder.setUseCaseEventCallback(imageCaptureAdapter);
         mBuilder.setCaptureBundle(imageCaptureAdapter);
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
index 525a842..939e6f5 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/PreviewExtender.java
@@ -25,7 +25,7 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
-import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.camera2.impl.CameraEventCallback;
 import androidx.camera.camera2.impl.CameraEventCallbacks;
 import androidx.camera.core.CameraIdFilter;
@@ -145,7 +145,7 @@
                 previewExtenderAdapter = new PreviewExtenderAdapter(mImpl, mEffectMode, null);
         }
 
-        new Camera2Config.Extender<>(mBuilder).setCameraEventCallback(
+        new Camera2ImplConfig.Extender<>(mBuilder).setCameraEventCallback(
                 new CameraEventCallbacks(previewExtenderAdapter));
         mBuilder.setUseCaseEventCallback(previewExtenderAdapter);
         mBuilder.getMutableConfig().insertOption(OPTION_PREVIEW_EXTENDER_MODE, mEffectMode);
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java
index 76621b41..3de30fe 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java
@@ -35,8 +35,8 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.experimental.UseExperimental;
-import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.ExperimentalCamera2Interop;
+import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.CaptureProcessor;
@@ -212,7 +212,7 @@
 
         mSurfaceTextureLatch = new CountDownLatch(1);
 
-        new Camera2Config.Extender<>(mImageCaptureBuilder).setDeviceStateCallback(
+        new Camera2Interop.Extender<>(mImageCaptureBuilder).setDeviceStateCallback(
                 mCameraStatusCallback);
     }
 
diff --git a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt
index 6eae75a..9f61472 100644
--- a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt
+++ b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt
@@ -23,7 +23,7 @@
 import android.view.Surface
 import android.view.ViewGroup
 import androidx.annotation.experimental.UseExperimental
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.interop.Camera2Interop
 import androidx.camera.camera2.ExperimentalCamera2Interop
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.ImageCapture
@@ -312,7 +312,7 @@
 ): Preview.Builder {
 
     val configBuilder = Preview.Builder()
-    Camera2Config.Extender(configBuilder)
+    Camera2Interop.Extender(configBuilder)
         .setDeviceStateCallback(deviceStateCallback)
         .setSessionStateCallback(sessionCaptureStateCallback)
     // TODO(b/142915154): Enables focusMode when CameraX support direct AF mode setting.
@@ -335,7 +335,7 @@
 
     val configBuilder = ImageCapture.Builder()
         .setCaptureMode(ImageCapture.CaptureMode.MAXIMIZE_QUALITY)
-    Camera2Config.Extender(configBuilder)
+    Camera2Interop.Extender(configBuilder)
         .setDeviceStateCallback(deviceStateCallback)
         .setSessionCaptureCallback(sessionCaptureCallback)
     // TODO(b/142915154): Enables focusMode when CameraX support direct AF mode setting.