diff --git a/libs/gui/BufferQueue.cpp b/libs/gui/BufferQueue.cpp
index 2d7c89b..9b6bc38 100644
--- a/libs/gui/BufferQueue.cpp
+++ b/libs/gui/BufferQueue.cpp
@@ -495,9 +495,9 @@
         // synchronizing access to it.  It's too late at this point to abort the
         // dequeue operation.
         if (result == EGL_FALSE) {
-            ALOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError());
+            ST_LOGE("dequeueBuffer: error waiting for fence: %#x", eglGetError());
         } else if (result == EGL_TIMEOUT_EXPIRED_KHR) {
-            ALOGE("dequeueBuffer: timeout waiting for fence");
+            ST_LOGE("dequeueBuffer: timeout waiting for fence");
         }
         eglDestroySyncKHR(dpy, fence);
     }
diff --git a/libs/gui/SurfaceTextureClient.cpp b/libs/gui/SurfaceTextureClient.cpp
index 5d3bd1a..36a81a6 100644
--- a/libs/gui/SurfaceTextureClient.cpp
+++ b/libs/gui/SurfaceTextureClient.cpp
@@ -76,7 +76,6 @@
     mReqUsage = 0;
     mTimestamp = NATIVE_WINDOW_TIMESTAMP_AUTO;
     mCrop.clear();
-    mCropNeedsTransform = false;
     mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
     mTransform = 0;
     mDefaultWidth = 0;
@@ -238,25 +237,9 @@
         return i;
     }
 
-    Rect crop(mCrop);
-    if (mCropNeedsTransform) {
-        // The crop rect was specified in the post-transform coordinate space,
-        // so we need to transform that rect by the inverse of mTransform to
-        // put it into the buffer pixel space before queuing it.
-        uint32_t invTransform = mTransform;
-        int32_t width = buffer->width;
-        int32_t height = buffer->height;
-        if (mTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
-            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
-                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
-            width = buffer->height;
-            height = buffer->width;
-        }
-        crop = mCrop.transform(invTransform, width, height);
-    }
-
     // Make sure the crop rectangle is entirely inside the buffer.
-    crop.intersect(Rect(buffer->width, buffer->height), &crop);
+    Rect crop;
+    mCrop.intersect(Rect(buffer->width, buffer->height), &crop);
 
     ISurfaceTexture::QueueBufferOutput output;
     ISurfaceTexture::QueueBufferInput input(timestamp, crop, mScalingMode,
@@ -341,9 +324,6 @@
     case NATIVE_WINDOW_SET_CROP:
         res = dispatchSetCrop(args);
         break;
-    case NATIVE_WINDOW_SET_POST_TRANSFORM_CROP:
-        res = dispatchSetPostTransformCrop(args);
-        break;
     case NATIVE_WINDOW_SET_BUFFER_COUNT:
         res = dispatchSetBufferCount(args);
         break;
@@ -407,11 +387,6 @@
     return setCrop(reinterpret_cast<Rect const*>(rect));
 }
 
-int SurfaceTextureClient::dispatchSetPostTransformCrop(va_list args) {
-    android_native_rect_t const* rect = va_arg(args, android_native_rect_t*);
-    return setPostTransformCrop(reinterpret_cast<Rect const*>(rect));
-}
-
 int SurfaceTextureClient::dispatchSetBufferCount(va_list args) {
     size_t bufferCount = va_arg(args, size_t);
     return setBufferCount(bufferCount);
@@ -501,7 +476,6 @@
         mReqHeight = 0;
         mReqUsage = 0;
         mCrop.clear();
-        mCropNeedsTransform = false;
         mScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
         mTransform = 0;
         if (api == NATIVE_WINDOW_API_CPU) {
@@ -535,27 +509,6 @@
 
     Mutex::Autolock lock(mMutex);
     mCrop = realRect;
-    mCropNeedsTransform = false;
-    return NO_ERROR;
-}
-
-int SurfaceTextureClient::setPostTransformCrop(Rect const* rect)
-{
-    ATRACE_CALL();
-
-    Rect realRect;
-    if (rect == NULL || rect->isEmpty()) {
-        realRect.clear();
-    } else {
-        realRect = *rect;
-    }
-
-    ALOGV("SurfaceTextureClient::setPostTransformCrop rect=[%d %d %d %d]",
-            realRect.left, realRect.top, realRect.right, realRect.bottom);
-
-    Mutex::Autolock lock(mMutex);
-    mCrop = realRect;
-    mCropNeedsTransform = true;
     return NO_ERROR;
 }
 
diff --git a/libs/gui/tests/SurfaceTextureClient_test.cpp b/libs/gui/tests/SurfaceTextureClient_test.cpp
index 8546fb9..7d8dd33 100644
--- a/libs/gui/tests/SurfaceTextureClient_test.cpp
+++ b/libs/gui/tests/SurfaceTextureClient_test.cpp
@@ -442,50 +442,6 @@
     ASSERT_EQ(OK, mANW->cancelBuffer(mANW.get(), buf[2]));
 }
 
-TEST_F(SurfaceTextureClientTest, SetPostTransformCropUntransforms) {
-    android_native_rect_t rect = {1, 5, 4, 14};
-    native_window_set_post_transform_crop(mANW.get(), &rect);
-
-    uint32_t xforms[] = {
-        HAL_TRANSFORM_FLIP_H,
-        HAL_TRANSFORM_FLIP_V,
-        HAL_TRANSFORM_ROT_90,
-        HAL_TRANSFORM_ROT_180,
-        HAL_TRANSFORM_ROT_270,
-    };
-
-    Rect expectedRects[] = {
-        Rect(4, 5, 7, 14), // HAL_TRANSFORM_FLIP_H
-        Rect(1, 2, 4, 11), // HAL_TRANSFORM_FLIP_V
-        Rect(5, 4, 14, 7), // HAL_TRANSFORM_ROT_90
-        Rect(4, 2, 7, 11), // HAL_TRANSFORM_ROT_180
-        Rect(2, 1, 11, 4), // HAL_TRANSFORM_ROT_270
-    };
-
-    for (size_t i = 0; i < sizeof(xforms)/sizeof(xforms[0]); i++) {
-        SCOPED_TRACE(String8::format("xform=%#x", xforms[i]).string());
-
-        int w = 8, h = 16;
-        if (xforms[i] & HAL_TRANSFORM_ROT_90) {
-            w = 16;
-            h = 8;
-        }
-        ASSERT_EQ(OK, native_window_set_buffers_transform(mANW.get(), xforms[i]));
-        ASSERT_EQ(OK, native_window_set_buffers_dimensions(mANW.get(), w, h));
-
-        android_native_buffer_t* buf;
-        ASSERT_EQ(OK, mANW->dequeueBuffer(mANW.get(), &buf));
-        ASSERT_EQ(OK, mANW->queueBuffer(mANW.get(), buf));
-        ASSERT_EQ(OK, mST->updateTexImage());
-
-        Rect crop = mST->getCurrentCrop();
-        EXPECT_EQ(expectedRects[i].left, crop.left);
-        EXPECT_EQ(expectedRects[i].top, crop.top);
-        EXPECT_EQ(expectedRects[i].right, crop.right);
-        EXPECT_EQ(expectedRects[i].bottom, crop.bottom);
-    }
-}
-
 TEST_F(SurfaceTextureClientTest, SetCropCropsCrop) {
     android_native_rect_t rect = {-2, -13, 40, 18};
     native_window_set_crop(mANW.get(), &rect);
