diff --git a/libtilerenderer/tilerenderer.cpp b/libtilerenderer/tilerenderer.cpp
new file mode 100644
index 0000000..6e8f847
--- /dev/null
+++ b/libtilerenderer/tilerenderer.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (c) 2011 Code Aurora Forum. All rights reserved.
+ *
+ * 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 <GLES2/gl2.h>
+#include <EGL/egl.h>
+#include <gl2ext.h>
+#include <OpenGLRenderer.h>
+#include "tilerenderer.h"
+
+namespace android {
+ANDROID_SINGLETON_STATIC_INSTANCE(uirenderer::TileRenderer) ;
+namespace uirenderer {
+
+TileRenderer::TileRenderer() {
+    mIsTiled = false;
+}
+
+TileRenderer::~TileRenderer() {
+}
+
+void TileRenderer::startTileRendering(OpenGLRenderer* renderer,
+                                      int left, int top,
+                                      int right, int bottom) {
+    int width = 0;
+    int height = 0;
+    GLenum status = GL_NO_ERROR;
+
+    if (renderer != NULL) {
+        renderer->getViewport(width, height);
+    }
+
+    if (!left && !right && !top && !bottom) {
+        left = 0;
+        top = 0;
+        right = width;
+        bottom = height;
+    }
+
+    if (!left && !right && !top && !bottom) {
+        //can't do tile rendering
+        LOGE("can't tile render; drity region, width, height not available");
+        return;
+    }
+
+    int l = left, t = (height - bottom), w = (right - left), h = (bottom - top), preserve = 0;
+
+    if (l < 0 || t < 0) {
+        l = (l < 0) ? 0 : l;
+        t = (t < 0) ? 0 : t;
+        preserve = 1;
+    }
+
+    if (w > width || h > height) {
+        w = (w > width) ? width : w;
+        h = (h > height) ? height : h;
+        preserve = 1;
+    }
+
+    //clear off all errors before tiling, if any
+    while ((status = glGetError()) != GL_NO_ERROR);
+
+    if (preserve)
+        glStartTilingQCOM(l, t, w, h, GL_COLOR_BUFFER_BIT0_QCOM);
+    else
+        glStartTilingQCOM(l, t, w, h, GL_NONE);
+
+    status = glGetError();
+    if (status == GL_NO_ERROR)
+        mIsTiled = true;
+}
+
+void TileRenderer::endTileRendering(OpenGLRenderer*) {
+    if (!mIsTiled) {
+        return;
+    }
+    glEndTilingQCOM(GL_COLOR_BUFFER_BIT0_QCOM);
+    mIsTiled = false;
+    GLenum status = GL_NO_ERROR;
+    while ((status = glGetError()) != GL_NO_ERROR);
+}
+
+}; // namespace uirenderer
+}; // namespace android
