diff --git a/drmconnector.cpp b/drmconnector.cpp
new file mode 100644
index 0000000..44864b9
--- /dev/null
+++ b/drmconnector.cpp
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "hwc-drm-connector"
+
+#include "drmconnector.h"
+#include "drmresources.h"
+
+#include <errno.h>
+#include <stdint.h>
+
+#include <cutils/log.h>
+#include <xf86drmMode.h>
+
+namespace android {
+
+DrmConnector::DrmConnector(DrmResources *drm, drmModeConnectorPtr c,
+                           DrmEncoder *current_encoder,
+                           std::vector<DrmEncoder *> &possible_encoders)
+    : drm_(drm),
+      id_(c->connector_id),
+      encoder_(current_encoder),
+      display_(-1),
+      type_(c->connector_type),
+      state_(c->connection),
+      mm_width_(c->mmWidth),
+      mm_height_(c->mmHeight),
+      possible_encoders_(possible_encoders) {
+}
+
+DrmConnector::~DrmConnector() {
+}
+
+int DrmConnector::Init() {
+  int ret = drm_->GetConnectorProperty(*this, "DPMS", &dpms_property_);
+  if (ret) {
+    ALOGE("Could not get DPMS property\n");
+    return ret;
+  }
+  return 0;
+}
+
+uint32_t DrmConnector::id() const {
+  return id_;
+}
+
+int DrmConnector::display() const {
+  return display_;
+}
+
+void DrmConnector::set_display(int display) {
+  display_ = display;
+}
+
+bool DrmConnector::built_in() const {
+  return type_ == DRM_MODE_CONNECTOR_LVDS || type_ == DRM_MODE_CONNECTOR_eDP ||
+         type_ == DRM_MODE_CONNECTOR_DSI;
+}
+
+int DrmConnector::UpdateModes() {
+  int fd = drm_->fd();
+
+  drmModeConnectorPtr c = drmModeGetConnector(fd, id_);
+  if (!c) {
+    ALOGE("Failed to get connector %d", id_);
+    return -ENODEV;
+  }
+
+  std::vector<DrmMode> new_modes;
+  for (int i = 0; i < c->count_modes; ++i) {
+    bool exists = false;
+    for (std::vector<DrmMode>::iterator iter = modes_.begin();
+         iter != modes_.end(); ++iter) {
+      if (*iter == c->modes[i]) {
+        new_modes.push_back(*iter);
+        exists = true;
+        break;
+      }
+    }
+    if (exists)
+      continue;
+
+    DrmMode m(&c->modes[i]);
+    m.set_id(drm_->next_mode_id());
+    new_modes.push_back(m);
+  }
+  modes_.swap(new_modes);
+  return 0;
+}
+
+const DrmMode &DrmConnector::active_mode() const {
+  return active_mode_;
+}
+
+int DrmConnector::set_active_mode(uint32_t mode_id) {
+  for (std::vector<DrmMode>::const_iterator iter = modes_.begin();
+       iter != modes_.end(); ++iter) {
+    if (iter->id() == mode_id) {
+      active_mode_ = *iter;
+      return 0;
+    }
+  }
+  return -ENOENT;
+}
+
+const DrmProperty &DrmConnector::dpms_property() const {
+  return dpms_property_;
+}
+
+DrmConnector::ModeIter DrmConnector::begin_modes() const {
+  return modes_.begin();
+}
+
+DrmConnector::ModeIter DrmConnector::end_modes() const {
+  return modes_.end();
+}
+
+DrmEncoder *DrmConnector::encoder() const {
+  return encoder_;
+}
+
+void DrmConnector::set_encoder(DrmEncoder *encoder) {
+  encoder_ = encoder;
+}
+
+DrmConnector::EncoderIter DrmConnector::begin_possible_encoders() const {
+  return possible_encoders_.begin();
+}
+
+DrmConnector::EncoderIter DrmConnector::end_possible_encoders() const {
+  return possible_encoders_.end();
+}
+
+uint32_t DrmConnector::mm_width() const {
+  return mm_width_;
+}
+
+uint32_t DrmConnector::mm_height() const {
+  return mm_height_;
+}
+}
