diff --git a/modules/camera/3_4/Android.mk b/modules/camera/3_4/Android.mk
index c851ad8..62624cc 100644
--- a/modules/camera/3_4/Android.mk
+++ b/modules/camera/3_4/Android.mk
@@ -44,11 +44,9 @@
 LOCAL_SRC_FILES := \
   Camera.cpp \
   Stream.cpp \
-  StreamFormat.cpp \
   V4L2Camera.cpp \
   V4L2CameraHAL.cpp \
   V4L2Gralloc.cpp \
-  V4L2Wrapper.cpp \
 
 LOCAL_CFLAGS += -Wall -Wextra -fvisibility=hidden
 
diff --git a/modules/camera/3_4/StreamFormat.cpp b/modules/camera/3_4/StreamFormat.cpp
deleted file mode 100644
index ec1c1cd..0000000
--- a/modules/camera/3_4/StreamFormat.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2016 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.
- */
-
-#include "StreamFormat.h"
-
-#include <linux/videodev2.h>
-
-#include "Common.h"
-#include "Stream.h"
-
-namespace v4l2_camera_hal {
-
-StreamFormat::StreamFormat(const default_camera_hal::Stream& stream)
-    // TODO(b/30000211): multiplanar support.
-    : type_(V4L2_BUF_TYPE_VIDEO_CAPTURE),
-      v4l2_pixel_format_(
-          StreamFormat::HalToV4L2PixelFormat(stream.getFormat())),
-      width_(stream.getWidth()),
-      height_(stream.getHeight()),
-      bytes_per_line_(0),
-      min_buffer_size_(0) {
-  HAL_LOG_ENTER();
-}
-
-StreamFormat::StreamFormat(const v4l2_format& format)
-    : type_(format.type),
-      // TODO(b/30000211): multiplanar support.
-      v4l2_pixel_format_(format.fmt.pix.pixelformat),
-      width_(format.fmt.pix.width),
-      height_(format.fmt.pix.height),
-      bytes_per_line_(format.fmt.pix.bytesperline),
-      min_buffer_size_(format.fmt.pix.sizeimage) {
-  HAL_LOG_ENTER();
-}
-
-void StreamFormat::FillFormatRequest(v4l2_format* format) const {
-  HAL_LOG_ENTER();
-
-  memset(format, 0, sizeof(*format));
-  format->type = type_;
-  format->fmt.pix.pixelformat = v4l2_pixel_format_;
-  format->fmt.pix.width = width_;
-  format->fmt.pix.height = height_;
-  // Bytes per line and min buffer size are outputs set by the driver,
-  // not part of the request.
-}
-
-FormatCategory StreamFormat::Category() const {
-  switch (v4l2_pixel_format_) {
-    case V4L2_PIX_FMT_JPEG:
-      return kFormatCategoryStalling;
-    case V4L2_PIX_FMT_YUV420:
-      return kFormatCategoryNonStalling;
-    default:
-      // Note: currently no supported RAW formats.
-      return kFormatCategoryUnknown;
-  }
-}
-
-bool StreamFormat::operator==(const StreamFormat& other) const {
-  // Used to check that a requested format was actually set, so
-  // don't compare bytes per line or min buffer size.
-  return (type_ == other.type_ &&
-          v4l2_pixel_format_ == other.v4l2_pixel_format_ &&
-          width_ == other.width_ && height_ == other.height_);
-}
-
-bool StreamFormat::operator!=(const StreamFormat& other) const {
-  return !(*this == other);
-}
-
-int StreamFormat::V4L2ToHalPixelFormat(uint32_t v4l2_pixel_format) {
-  // Translate V4L2 format to HAL format.
-  int hal_pixel_format = -1;
-  switch (v4l2_pixel_format) {
-    case V4L2_PIX_FMT_JPEG:
-      hal_pixel_format = HAL_PIXEL_FORMAT_BLOB;
-      break;
-    case V4L2_PIX_FMT_YUV420:
-      hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_888;
-      break;
-    default:
-      // Unrecognized format.
-      break;
-  }
-  return hal_pixel_format;
-}
-
-uint32_t StreamFormat::HalToV4L2PixelFormat(int hal_pixel_format) {
-  // Translate HAL format to V4L2 format.
-  uint32_t v4l2_pixel_format = 0;
-  switch (hal_pixel_format) {
-    case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:  // fall-through.
-    case HAL_PIXEL_FORMAT_YCbCr_420_888:
-      v4l2_pixel_format = V4L2_PIX_FMT_YUV420;
-      break;
-    case HAL_PIXEL_FORMAT_BLOB:
-      v4l2_pixel_format = V4L2_PIX_FMT_JPEG;
-      break;
-    default:
-      // Unrecognized format.
-      break;
-  }
-  return v4l2_pixel_format;
-}
-
-}  // namespace v4l2_camera_hal
diff --git a/modules/camera/3_4/StreamFormat.h b/modules/camera/3_4/StreamFormat.h
deleted file mode 100644
index 3686564..0000000
--- a/modules/camera/3_4/StreamFormat.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#ifndef V4L2_STREAM_FORMAT_H_
-#define V4L2_STREAM_FORMAT_H_
-
-#include <linux/videodev2.h>
-
-#include "Common.h"
-#include "Stream.h"
-
-namespace v4l2_camera_hal {
-
-enum FormatCategory {
-  kFormatCategoryRaw,
-  kFormatCategoryStalling,
-  kFormatCategoryNonStalling,
-  kFormatCategoryUnknown,
-};
-
-class StreamFormat {
- public:
-  StreamFormat(const default_camera_hal::Stream& stream);
-  StreamFormat(const v4l2_format& format);
-  virtual ~StreamFormat();
-  // Only uint32_t members, use default generated copy and assign.
-
-  void FillFormatRequest(v4l2_format* format) const;
-  FormatCategory Category() const;
-  inline uint32_t get_type() const { return type_; };
-
-  bool operator==(const StreamFormat& other) const;
-  bool operator!=(const StreamFormat& other) const;
-
-  // HAL <-> V4L2 conversions
-  // Returns 0 for unrecognized.
-  static uint32_t HalToV4L2PixelFormat(int hal_pixel_format);
-  // Returns -1 for unrecognized.
-  static int V4L2ToHalPixelFormat(uint32_t v4l2_pixel_format);
-
- private:
-  uint32_t type_;
-  uint32_t v4l2_pixel_format_;
-  uint32_t width_;
-  uint32_t height_;
-  uint32_t bytes_per_line_;
-  uint32_t min_buffer_size_;
-};
-
-}  // namespace v4l2_camera_hal
-
-#endif  // V4L2_STREAM_FORMAT_H_
diff --git a/modules/camera/3_4/V4L2Wrapper.cpp b/modules/camera/3_4/V4L2Wrapper.cpp
deleted file mode 100644
index fdcd179..0000000
--- a/modules/camera/3_4/V4L2Wrapper.cpp
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright 2016 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.
- */
-
-#include "V4L2Wrapper.h"
-
-#include <fcntl.h>
-#include <linux/videodev2.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <mutex>
-
-#include <nativehelper/ScopedFd.h>
-
-#include "Common.h"
-#include "Stream.h"
-#include "StreamFormat.h"
-
-namespace v4l2_camera_hal {
-
-V4L2Wrapper::V4L2Wrapper(const std::string device_path)
-    : device_path_(device_path), max_buffers_(0) {
-  HAL_LOG_ENTER();
-}
-
-V4L2Wrapper::~V4L2Wrapper() { HAL_LOG_ENTER(); }
-
-int V4L2Wrapper::Connect() {
-  HAL_LOG_ENTER();
-  std::lock_guard<std::mutex> lock(device_lock_);
-
-  if (connected()) {
-    HAL_LOGE("Camera device %s is already connected. Close it first",
-             device_path_.c_str());
-    return -EIO;
-  }
-
-  int fd = TEMP_FAILURE_RETRY(open(device_path_.c_str(), O_RDWR));
-  if (fd < 0) {
-    HAL_LOGE("failed to open %s (%s)", device_path_.c_str(), strerror(errno));
-    return -errno;
-  }
-  device_fd_.reset(fd);
-
-  // Check if this connection has the extended control query capability.
-  v4l2_query_ext_ctrl query;
-  query.id = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
-  // Already holding the lock, so don't call ioctlLocked.
-  int res = TEMP_FAILURE_RETRY(
-      ioctl(device_fd_.get(), VIDIOC_QUERY_EXT_CTRL, &query));
-  extended_query_supported_ = (res == 0);
-
-  // TODO(b/29185945): confirm this is a supported device.
-  // This is checked by the HAL, but the device at device_path_ may
-  // not be the same one that was there when the HAL was loaded.
-  // (Alternatively, better hotplugging support may make this unecessary
-  // by disabling cameras that get disconnected and checking newly connected
-  // cameras, so Connect() is never called on an unsupported camera)
-  return 0;
-}
-
-void V4L2Wrapper::Disconnect() {
-  HAL_LOG_ENTER();
-  std::lock_guard<std::mutex> lock(device_lock_);
-
-  device_fd_.reset();  // Includes close().
-  format_.reset();
-  max_buffers_ = 0;
-}
-
-// Helper function. Should be used instead of ioctl throughout this class.
-template <typename T>
-int V4L2Wrapper::IoctlLocked(int request, T data) {
-  HAL_LOG_ENTER();
-  std::lock_guard<std::mutex> lock(device_lock_);
-
-  if (!connected()) {
-    HAL_LOGE("Device %s not connected.", device_path_.c_str());
-    return -ENODEV;
-  }
-  return TEMP_FAILURE_RETRY(ioctl(device_fd_.get(), request, data));
-}
-
-int V4L2Wrapper::StreamOn() {
-  HAL_LOG_ENTER();
-
-  if (!format_) {
-    HAL_LOGE("Stream format must be set before turning on stream.");
-    return -EINVAL;
-  }
-
-  int32_t type = format_->get_type();
-  if (IoctlLocked(VIDIOC_STREAMON, &type) < 0) {
-    HAL_LOGE("STREAMON fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  return 0;
-}
-
-int V4L2Wrapper::StreamOff() {
-  HAL_LOG_ENTER();
-
-  int32_t type = format_->get_type();
-  if (IoctlLocked(VIDIOC_STREAMOFF, &type) < 0) {
-    HAL_LOGE("STREAMOFF fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  return 0;
-}
-
-int V4L2Wrapper::QueryControl(uint32_t control_id,
-                              v4l2_query_ext_ctrl* result) {
-  HAL_LOG_ENTER();
-  int res;
-
-  memset(result, 0, sizeof(*result));
-
-  if (extended_query_supported_) {
-    result->id = control_id;
-    res = IoctlLocked(VIDIOC_QUERY_EXT_CTRL, result);
-    // Assuming the operation was supported (not ENOTTY), no more to do.
-    if (errno != ENOTTY) {
-      if (res) {
-        HAL_LOGE("QUERY_EXT_CTRL fails: %s", strerror(errno));
-        return -ENODEV;
-      }
-      return 0;
-    }
-  }
-
-  // Extended control querying not supported, fall back to basic control query.
-  v4l2_queryctrl query;
-  query.id = control_id;
-  if (IoctlLocked(VIDIOC_QUERYCTRL, &query)) {
-    HAL_LOGE("QUERYCTRL fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  // Convert the basic result to the extended result.
-  result->id = query.id;
-  result->type = query.type;
-  memcpy(result->name, query.name, sizeof(query.name));
-  result->minimum = query.minimum;
-  if (query.type == V4L2_CTRL_TYPE_BITMASK) {
-    // According to the V4L2 documentation, when type is BITMASK,
-    // max and default should be interpreted as __u32. Practically,
-    // this means the conversion from 32 bit to 64 will pad with 0s not 1s.
-    result->maximum = static_cast<uint32_t>(query.maximum);
-    result->default_value = static_cast<uint32_t>(query.default_value);
-  } else {
-    result->maximum = query.maximum;
-    result->default_value = query.default_value;
-  }
-  result->step = static_cast<uint32_t>(query.step);
-  result->flags = query.flags;
-  result->elems = 1;
-  switch (result->type) {
-    case V4L2_CTRL_TYPE_INTEGER64:
-      result->elem_size = sizeof(int64_t);
-      break;
-    case V4L2_CTRL_TYPE_STRING:
-      result->elem_size = result->maximum + 1;
-      break;
-    default:
-      result->elem_size = sizeof(int32_t);
-      break;
-  }
-
-  return 0;
-}
-
-int V4L2Wrapper::GetControl(uint32_t control_id, int32_t* value) {
-  HAL_LOG_ENTER();
-
-  v4l2_control control;
-  control.id = control_id;
-  if (IoctlLocked(VIDIOC_G_CTRL, &control) < 0) {
-    HAL_LOGE("G_CTRL fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-  *value = control.value;
-  return 0;
-}
-
-int V4L2Wrapper::SetControl(uint32_t control_id, int32_t desired,
-                            int32_t* result) {
-  HAL_LOG_ENTER();
-
-  v4l2_control control{control_id, desired};
-  if (IoctlLocked(VIDIOC_S_CTRL, &control) < 0) {
-    HAL_LOGE("S_CTRL fails: %s", strerror(errno));
-    return -ENODEV;
-  }
-  *result = control.value;
-  return 0;
-}
-
-int V4L2Wrapper::SetFormat(const default_camera_hal::Stream& stream) {
-  HAL_LOG_ENTER();
-
-  // Should be checked earlier; sanity check.
-  if (stream.isInputType()) {
-    HAL_LOGE("Input streams not supported.");
-    return -EINVAL;
-  }
-
-  StreamFormat desired_format(stream);
-  if (desired_format == *format_) {
-    HAL_LOGV("Already in correct format, skipping format setting.");
-    return 0;
-  }
-
-  // Not in the correct format, set our format.
-  v4l2_format new_format;
-  desired_format.FillFormatRequest(&new_format);
-  // TODO(b/29334616): When async, this will need to check if the stream
-  // is on, and if so, lock it off while setting format.
-  if (IoctlLocked(VIDIOC_S_FMT, &new_format) < 0) {
-    HAL_LOGE("S_FMT failed: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  // Check that the driver actually set to the requested values.
-  if (desired_format != new_format) {
-    HAL_LOGE("Device doesn't support desired stream configuration.");
-    return -EINVAL;
-  }
-
-  // Keep track of our new format.
-  format_.reset(new StreamFormat(new_format));
-
-  // Format changed, setup new buffers.
-  SetupBuffers();
-  return 0;
-}
-
-int V4L2Wrapper::SetupBuffers() {
-  HAL_LOG_ENTER();
-
-  // "Request" a buffer (since we're using a userspace buffer, this just
-  // tells V4L2 to switch into userspace buffer mode).
-  v4l2_requestbuffers req_buffers;
-  memset(&req_buffers, 0, sizeof(req_buffers));
-  req_buffers.type = format_->get_type();
-  req_buffers.memory = V4L2_MEMORY_USERPTR;
-  req_buffers.count = 1;
-  if (IoctlLocked(VIDIOC_REQBUFS, &req_buffers) < 0) {
-    HAL_LOGE("REQBUFS failed: %s", strerror(errno));
-    return -ENODEV;
-  }
-
-  // V4L2 will set req_buffers.count to a number of buffers it can handle.
-  max_buffers_ = req_buffers.count;
-  return 0;
-}
-
-}  // namespace v4l2_camera_hal
diff --git a/modules/camera/3_4/V4L2Wrapper.h b/modules/camera/3_4/V4L2Wrapper.h
deleted file mode 100644
index 4126e90..0000000
--- a/modules/camera/3_4/V4L2Wrapper.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2016 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.
- */
-
-#ifndef V4L2_WRAPPER_H
-#define V4L2_WRAPPER_H
-
-#include <memory>
-#include <mutex>
-#include <string>
-
-#include <nativehelper/ScopedFd.h>
-
-#include "Common.h"
-#include "Stream.h"
-#include "StreamFormat.h"
-
-namespace v4l2_camera_hal {
-class V4L2Wrapper {
- public:
-  V4L2Wrapper(const std::string device_path);
-  virtual ~V4L2Wrapper();
-
-  // Connect or disconnect to the device.
-  int Connect();
-  void Disconnect();
-  // Turn the stream on or off.
-  int StreamOn();
-  int StreamOff();
-  // Manage controls.
-  int QueryControl(uint32_t control_id, v4l2_query_ext_ctrl* result);
-  int GetControl(uint32_t control_id, int32_t* value);
-  int SetControl(uint32_t control_id, int32_t desired, int32_t* result);
-  // Manage format.
-  int SetFormat(const default_camera_hal::Stream& stream);
-
-  inline bool connected() { return device_fd_.get() >= 0; }
-
- private:
-  // Perform an ioctl call in a thread-safe fashion.
-  template <typename T>
-  int IoctlLocked(int request, T data);
-  // Adjust buffers any time a device is connected/reformatted.
-  int SetupBuffers();
-
-  // The camera device path. For example, /dev/video0.
-  const std::string device_path_;
-  // The opened device fd.
-  ScopedFd device_fd_;
-  // Whether or not the device supports the extended control query.
-  bool extended_query_supported_;
-  // The format this device is set up for.
-  std::unique_ptr<StreamFormat> format_;
-  // The maximum number of buffers this device can handle in its current format.
-  uint32_t max_buffers_;
-  // Lock protecting use of the device.
-  std::mutex device_lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(V4L2Wrapper);
-};
-
-}  // namespace v4l2_camera_hal
-
-#endif  // V4L2_WRAPPER_H
