diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index f02e591..69d3328 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -702,9 +702,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 void Caches::initTempProperties() {
-    propertyDirtyViewport = false;
-    propertyEnable3d = false;
-    propertyCameraDistance = 1.0f;
     propertyAmbientShadowStrength = 25;
     propertySpotShadowStrength = 25;
 
@@ -715,17 +712,7 @@
 
 void Caches::setTempProperty(const char* name, const char* value) {
     ALOGD("setting property %s to %s", name, value);
-    if (!strcmp(name, "enable3d")) {
-        propertyEnable3d = !strcmp(value, "true");
-        propertyDirtyViewport = true;
-        ALOGD("enable3d = %d", propertyEnable3d);
-        return;
-    } else if (!strcmp(name, "cameraDistance")) {
-        propertyCameraDistance = fmin(fmax(atof(value), 0.001), 10);
-        propertyDirtyViewport = true;
-        ALOGD("camera dist multiplier = %.2f", propertyCameraDistance);
-        return;
-    } else if (!strcmp(name, "ambientShadowStrength")) {
+    if (!strcmp(name, "ambientShadowStrength")) {
         propertyAmbientShadowStrength = atoi(value);
         ALOGD("ambient shadow strength = 0x%x out of 0xff", propertyAmbientShadowStrength);
         return;
@@ -735,17 +722,14 @@
         return;
     } else if (!strcmp(name, "lightPosXScale")) {
         propertyLightPosXScale = fmin(fmax(atof(value), 0.0), 1.0);
-        propertyDirtyViewport = true;
         ALOGD("lightPos X Scale = %.2f", propertyLightPosXScale);
         return;
     }  else if (!strcmp(name, "lightPosYScale")) {
         propertyLightPosYScale = fmin(fmax(atof(value), 0.0), 1.0);
-        propertyDirtyViewport = true;
         ALOGD("lightPos Y Scale = %.2f", propertyLightPosXScale);
         return;
     }  else if (!strcmp(name, "lightPosZScale")) {
         propertyLightPosZScale = fmin(fmax(atof(value), 0.0), 1.0);
-        propertyDirtyViewport = true;
         ALOGD("lightPos Z Scale = %.2f", propertyLightPosXScale);
         return;
     }
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 8c0c508..6f3d8fb 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -356,9 +356,6 @@
     // TEMPORARY properties
     void initTempProperties();
     void setTempProperty(const char* name, const char* value);
-    bool propertyEnable3d;
-    bool propertyDirtyViewport; // flag set when dirtying the viewport
-    float propertyCameraDistance;
 
     // These scaling factors range from 0 to 1, to scale the light position
     // within the bound of (screenwidth, screenheight, max(screenwidth, screenheight));
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index 0c544b8..5c5a042 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -160,8 +160,8 @@
                     mPivotY = mPrevHeight / 2.0f;
                 }
             }
-            const bool perspectiveEnabled = Caches::getInstance().propertyEnable3d;
-            if (!perspectiveEnabled && (mMatrixFlags & ROTATION_3D) == 0) {
+
+            if ((mMatrixFlags & ROTATION_3D) == 0) {
                 mTransformMatrix->loadTranslate(
                         mPivotX + mTranslationX,
                         mPivotY + mTranslationY,
@@ -170,38 +170,25 @@
                 mTransformMatrix->scale(mScaleX, mScaleY, 1);
                 mTransformMatrix->translate(-mPivotX, -mPivotY);
             } else {
-                if (perspectiveEnabled) {
-                    mTransformMatrix->loadTranslate(
-                            mPivotX + mTranslationX,
-                            mPivotY + mTranslationY,
-                            mTranslationZ);
-                    mTransformMatrix->rotate(mRotationX, 1, 0, 0);
-                    mTransformMatrix->rotate(mRotationY, 0, 1, 0);
-                    mTransformMatrix->rotate(mRotation, 0, 0, 1);
-                    mTransformMatrix->scale(mScaleX, mScaleY, 1);
-                    mTransformMatrix->translate(-mPivotX, -mPivotY);
-                } else {
-                    /* TODO: support this old transform approach, based on API level */
-                    if (!mTransformCamera) {
-                        mTransformCamera = new Sk3DView();
-                        mTransformMatrix3D = new SkMatrix();
-                    }
-                    SkMatrix transformMatrix;
-                    transformMatrix.reset();
-                    mTransformCamera->save();
-                    transformMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY);
-                    mTransformCamera->rotateX(mRotationX);
-                    mTransformCamera->rotateY(mRotationY);
-                    mTransformCamera->rotateZ(-mRotation);
-                    mTransformCamera->getMatrix(mTransformMatrix3D);
-                    mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
-                    mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
-                            mPivotY + mTranslationY);
-                    transformMatrix.postConcat(*mTransformMatrix3D);
-                    mTransformCamera->restore();
-
-                    mTransformMatrix->load(transformMatrix);
+                if (!mTransformCamera) {
+                    mTransformCamera = new Sk3DView();
+                    mTransformMatrix3D = new SkMatrix();
                 }
+                SkMatrix transformMatrix;
+                transformMatrix.reset();
+                mTransformCamera->save();
+                transformMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY);
+                mTransformCamera->rotateX(mRotationX);
+                mTransformCamera->rotateY(mRotationY);
+                mTransformCamera->rotateZ(-mRotation);
+                mTransformCamera->getMatrix(mTransformMatrix3D);
+                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
+                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
+                        mPivotY + mTranslationY);
+                transformMatrix.postConcat(*mTransformMatrix3D);
+                mTransformCamera->restore();
+
+                mTransformMatrix->load(transformMatrix);
             }
         }
         mMatrixDirty = false;
@@ -278,8 +265,7 @@
     }
     if (mMatrixFlags != 0) {
         if (mMatrixFlags == TRANSLATION) {
-            renderer.translate(mTranslationX, mTranslationY,
-                    Caches::getInstance().propertyEnable3d ? mTranslationZ : 0.0f); // TODO: necessary?
+            renderer.translate(mTranslationX, mTranslationY);
         } else {
             renderer.concatMatrix(*mTransformMatrix);
         }
diff --git a/libs/hwui/Matrix.cpp b/libs/hwui/Matrix.cpp
index 4f5cd26..3d6188a 100644
--- a/libs/hwui/Matrix.cpp
+++ b/libs/hwui/Matrix.cpp
@@ -372,84 +372,6 @@
     mType = kTypeUnknown;
 }
 
-// translated from android.opengl.Matrix#frustumM()
-void Matrix4::loadFrustum(float left, float top, float right, float bottom, float near, float far) {
-    float r_width  = 1.0f / (right - left);
-    float r_height = 1.0f / (top - bottom);
-    float r_depth  = 1.0f / (near - far);
-    float x = 2.0f * (near * r_width);
-    float y = 2.0f * (near * r_height);
-    float A = (right + left) * r_width;
-    float B = (top + bottom) * r_height;
-    float C = (far + near) * r_depth;
-    float D = 2.0f * (far * near * r_depth);
-
-    memset(&data, 0, sizeof(data));
-    mType = kTypeUnknown;
-
-    data[kScaleX] = x;
-    data[kScaleY] = y;
-    data[8] = A;
-    data[9] = B;
-    data[kScaleZ] = C;
-    data[kTranslateZ] = D;
-    data[11] = -1.0f;
-}
-
-// translated from android.opengl.Matrix#setLookAtM()
-void Matrix4::loadLookAt(float eyeX, float eyeY, float eyeZ,
-        float centerX, float centerY, float centerZ,
-        float upX, float upY, float upZ) {
-    float fx = centerX - eyeX;
-    float fy = centerY - eyeY;
-    float fz = centerZ - eyeZ;
-
-    // Normalize f
-    float rlf = 1.0f / sqrt(fx*fx + fy*fy + fz*fz);
-    fx *= rlf;
-    fy *= rlf;
-    fz *= rlf;
-
-    // compute s = f x up (x means "cross product")
-    float sx = fy * upZ - fz * upY;
-    float sy = fz * upX - fx * upZ;
-    float sz = fx * upY - fy * upX;
-
-    // and normalize s
-    float rls = 1.0f / sqrt(sx*sx + sy*sy + sz*sz);
-    sx *= rls;
-    sy *= rls;
-    sz *= rls;
-
-    // compute u = s x f
-    float ux = sy * fz - sz * fy;
-    float uy = sz * fx - sx * fz;
-    float uz = sx * fy - sy * fx;
-
-    mType = kTypeUnknown;
-    data[0] = sx;
-    data[1] = ux;
-    data[2] = -fx;
-    data[3] = 0.0f;
-
-    data[4] = sy;
-    data[5] = uy;
-    data[6] = -fy;
-    data[7] = 0.0f;
-
-    data[8] = sz;
-    data[9] = uz;
-    data[10] = -fz;
-    data[11] = 0.0f;
-
-    data[12] = 0.0f;
-    data[13] = 0.0f;
-    data[14] = 0.0f;
-    data[15] = 1.0f;
-
-    translate(-eyeX, -eyeY, -eyeZ);
-}
-
 void Matrix4::loadOrtho(float left, float right, float bottom, float top, float near, float far) {
     loadIdentity();
 
diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h
index 5cd79b1..8b586f0 100644
--- a/libs/hwui/Matrix.h
+++ b/libs/hwui/Matrix.h
@@ -129,10 +129,6 @@
     void loadRotate(float angle);
     void loadRotate(float angle, float x, float y, float z);
     void loadMultiply(const Matrix4& u, const Matrix4& v);
-    void loadFrustum(float left, float top, float right, float bottom, float near, float far);
-    void loadLookAt(float eyeX, float eyeY, float eyeZ,
-            float centerX, float centerY, float centerZ,
-            float upX, float upY, float upZ);
 
     void loadOrtho(float left, float right, float bottom, float top, float near, float far);
 
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index b620b80..7002e26 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -170,21 +170,7 @@
 }
 
 void OpenGLRenderer::initViewport(int width, int height) {
-    if (mCaches.propertyEnable3d) {
-        // TODO: make view proj app configurable
-        float dist = std::max(width, height) * 1.5;
-        dist *= mCaches.propertyCameraDistance;
-        Matrix4 projection;
-        projection.loadFrustum(-width / 2, -height / 2, width / 2, height / 2, dist, 0);
-        Matrix4 view;
-        view.loadLookAt(0, 0, dist,
-                0, 0, 0,
-                0, 1, 0);
-        mViewProjMatrix.loadMultiply(projection, view);
-        mViewProjMatrix.translate(-width/2, -height/2);
-    } else {
-        mViewProjMatrix.loadOrtho(0, width, height, 0, -1, 1);
-    }
+    mViewProjMatrix.loadOrtho(0, width, height, 0, -1, 1);
 
     initializeViewport(width, height);
 }
@@ -1929,13 +1915,6 @@
 status_t OpenGLRenderer::drawDisplayList(DisplayList* displayList, Rect& dirty,
         int32_t replayFlags) {
     status_t status;
-
-    if (mCaches.propertyDirtyViewport) {
-        // force recalc of view/proj matrices
-        setViewport(getWidth(), getHeight());
-        mCaches.propertyDirtyViewport = false;
-    }
-
     // All the usual checks and setup operations (quickReject, setupDraw, etc.)
     // will be performed by the display list itself
     if (displayList && displayList->isRenderable()) {
