diff --git a/drmplane.cpp b/drmplane.cpp
new file mode 100644
index 0000000..d6ac875
--- /dev/null
+++ b/drmplane.cpp
@@ -0,0 +1,177 @@
+/*
+ * 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-plane"
+
+#include "drmplane.h"
+#include "drmresources.h"
+
+#include <errno.h>
+#include <stdint.h>
+
+#include <cutils/log.h>
+#include <xf86drmMode.h>
+
+namespace android {
+
+DrmPlane::DrmPlane(DrmResources *drm, drmModePlanePtr p)
+    : drm_(drm), id_(p->plane_id), possible_crtc_mask_(p->possible_crtcs) {
+}
+
+DrmPlane::~DrmPlane() {
+}
+
+int DrmPlane::Init() {
+  DrmProperty p;
+
+  int ret = drm_->GetPlaneProperty(*this, "type", &p);
+  if (ret) {
+    ALOGE("Could not get plane type property");
+    return ret;
+  }
+
+  uint64_t type;
+  ret = p.value(&type);
+  if (ret) {
+    ALOGE("Failed to get plane type property value");
+    return ret;
+  }
+  switch (type) {
+    case DRM_PLANE_TYPE_OVERLAY:
+    case DRM_PLANE_TYPE_PRIMARY:
+    case DRM_PLANE_TYPE_CURSOR:
+      type_ = (uint32_t)type;
+      break;
+    default:
+      ALOGE("Invalid plane type %d", type);
+      return -EINVAL;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "CRTC_ID", &crtc_property_);
+  if (ret) {
+    ALOGE("Could not get CRTC_ID property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "FB_ID", &fb_property_);
+  if (ret) {
+    ALOGE("Could not get FB_ID property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "CRTC_X", &crtc_x_property_);
+  if (ret) {
+    ALOGE("Could not get CRTC_X property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "CRTC_Y", &crtc_y_property_);
+  if (ret) {
+    ALOGE("Could not get CRTC_Y property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "CRTC_W", &crtc_w_property_);
+  if (ret) {
+    ALOGE("Could not get CRTC_W property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "CRTC_H", &crtc_h_property_);
+  if (ret) {
+    ALOGE("Could not get CRTC_H property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "SRC_X", &src_x_property_);
+  if (ret) {
+    ALOGE("Could not get SRC_X property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "SRC_Y", &src_y_property_);
+  if (ret) {
+    ALOGE("Could not get SRC_Y property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "SRC_W", &src_w_property_);
+  if (ret) {
+    ALOGE("Could not get SRC_W property");
+    return ret;
+  }
+
+  ret = drm_->GetPlaneProperty(*this, "SRC_H", &src_h_property_);
+  if (ret) {
+    ALOGE("Could not get SRC_H property");
+    return ret;
+  }
+
+  return 0;
+}
+
+uint32_t DrmPlane::id() const {
+  return id_;
+}
+
+bool DrmPlane::GetCrtcSupported(const DrmCrtc &crtc) const {
+  return !!((1 << crtc.pipe()) & possible_crtc_mask_);
+}
+
+uint32_t DrmPlane::type() const {
+  return type_;
+}
+
+const DrmProperty &DrmPlane::crtc_property() const {
+  return crtc_property_;
+}
+
+const DrmProperty &DrmPlane::fb_property() const {
+  return fb_property_;
+}
+
+const DrmProperty &DrmPlane::crtc_x_property() const {
+  return crtc_x_property_;
+}
+
+const DrmProperty &DrmPlane::crtc_y_property() const {
+  return crtc_y_property_;
+}
+
+const DrmProperty &DrmPlane::crtc_w_property() const {
+  return crtc_w_property_;
+}
+
+const DrmProperty &DrmPlane::crtc_h_property() const {
+  return crtc_h_property_;
+}
+
+const DrmProperty &DrmPlane::src_x_property() const {
+  return src_x_property_;
+}
+
+const DrmProperty &DrmPlane::src_y_property() const {
+  return src_y_property_;
+}
+
+const DrmProperty &DrmPlane::src_w_property() const {
+  return src_w_property_;
+}
+
+const DrmProperty &DrmPlane::src_h_property() const {
+  return src_h_property_;
+}
+}
