diff --git a/liboverlay/pipes/overlayGenPipe.cpp b/liboverlay/pipes/overlayGenPipe.cpp
index f5d4475..3ab0d19 100644
--- a/liboverlay/pipes/overlayGenPipe.cpp
+++ b/liboverlay/pipes/overlayGenPipe.cpp
@@ -33,8 +33,8 @@
 
 namespace overlay {
 
-GenericPipe::GenericPipe(int dpy) : mFbNum(dpy), mRot(0), mRotUsed(false),
-        mRotDownscaleOpt(false), mPreRotated(false), pipeState(CLOSED) {
+GenericPipe::GenericPipe(int dpy) : mFbNum(dpy), mRotDownscaleOpt(false),
+    pipeState(CLOSED) {
     init();
 }
 
@@ -45,9 +45,7 @@
 bool GenericPipe::init()
 {
     ALOGE_IF(DEBUG_OVERLAY, "GenericPipe init");
-    mRotUsed = false;
     mRotDownscaleOpt = false;
-    mPreRotated = false;
     if(mFbNum)
         mFbNum = Overlay::getInstance()->getExtFbNum();
 
@@ -63,9 +61,6 @@
         return false;
     }
 
-    //get a new rotator object, take ownership
-    mRot = Rotator::getRotator();
-
     return true;
 }
 
@@ -81,21 +76,12 @@
         ret = false;
     }
 
-    delete mRot;
-    mRot = 0;
-
     setClosed();
     return ret;
 }
 
 void GenericPipe::setSource(const utils::PipeArgs& args) {
-    //Cache if user wants 0-rotation
-    mRotUsed = args.rotFlags & utils::ROT_0_ENABLED;
     mRotDownscaleOpt = args.rotFlags & utils::ROT_DOWNSCALE_ENABLED;
-    mPreRotated = args.rotFlags & utils::ROT_PREROTATED;
-    if(mPreRotated) mRotUsed = false;
-    mRot->setSource(args.whf);
-    mRot->setFlags(args.mdpFlags);
     mCtrlData.ctrl.setSource(args);
 }
 
@@ -104,10 +90,6 @@
 }
 
 void GenericPipe::setTransform(const utils::eTransform& orient) {
-    //Rotation could be enabled by user for zero-rot or the layer could have
-    //some transform. Mark rotation enabled in either case.
-    mRotUsed |= ((orient & utils::OVERLAY_TRANSFORM_ROT_90) && !mPreRotated);
-    mRot->setTransform(orient);
     mCtrlData.ctrl.setTransform(orient);
 }
 
@@ -129,39 +111,11 @@
         ovutils::Dim dst(mCtrlData.ctrl.getPosition());
         downscale_factor = ovutils::getDownscaleFactor(
                 src.w, src.h, dst.w, dst.h);
-        mRotUsed |= (downscale_factor && !mPreRotated);
-    }
-
-
-    if(mRotUsed) {
-        mRot->setDownscale(downscale_factor);
-        //If wanting to use rotator, start it.
-        if(!mRot->commit()) {
-            ALOGE("GenPipe Rotator commit failed");
-            //If rot commit fails, flush rotator session, memory, fd and create
-            //a hollow rotator object
-            delete mRot;
-            mRot = Rotator::getRotator();
-            pipeState = CLOSED;
-            return false;
-        }
-        /* Set the mdp src format to the output format of the rotator.
-         * The output format of the rotator might be different depending on
-         * whether fastyuv mode is enabled in the rotator.
-         */
-        mCtrlData.ctrl.updateSrcFormat(mRot->getDstFormat());
     }
 
     mCtrlData.ctrl.setDownscale(downscale_factor);
     ret = mCtrlData.ctrl.commit();
 
-    //If mdp commit fails, flush rotator session, memory, fd and create a hollow
-    //rotator object
-    if(ret == false) {
-        delete mRot;
-        mRot = Rotator::getRotator();
-    }
-
     pipeState = ret ? OPEN : CLOSED;
     return ret;
 }
@@ -174,26 +128,7 @@
     // set pipe id from ctrl to data
     mCtrlData.data.setPipeId(pipeId);
 
-    int finalFd = fd;
-    uint32_t finalOffset = offset;
-    //If rotator is to be used, queue to it, so it can ROTATE.
-    if(mRotUsed) {
-        if(!mRot->queueBuffer(fd, offset)) {
-            ALOGE("GenPipe Rotator play failed");
-            return false;
-        }
-        //Configure MDP's source buffer as the current output buffer of rotator
-        if(mRot->getDstMemId() != -1) {
-            finalFd = mRot->getDstMemId();
-            finalOffset = mRot->getDstOffset();
-        } else {
-            //Could be -1 for NullRotator, if queue above succeeds.
-            //Need an actual rotator. Modify overlay State Traits.
-            //Not fatal, keep queuing to MDP without rotation.
-            ALOGE("Null rotator in use, where an actual is required");
-        }
-    }
-    return mCtrlData.data.queueBuffer(finalFd, finalOffset);
+    return mCtrlData.data.queueBuffer(fd, offset);
 }
 
 int GenericPipe::getCtrlFd() const {
@@ -209,18 +144,15 @@
 {
     ALOGE("== Dump Generic pipe start ==");
     ALOGE("pipe state = %d", (int)pipeState);
-    OVASSERT(mRot, "GenericPipe should have a valid Rot");
     mCtrlData.ctrl.dump();
     mCtrlData.data.dump();
-    mRot->dump();
+
     ALOGE("== Dump Generic pipe end ==");
 }
 
 void GenericPipe::getDump(char *buf, size_t len) {
     mCtrlData.ctrl.getDump(buf, len);
     mCtrlData.data.getDump(buf, len);
-    if(mRotUsed && mRot)
-        mRot->getDump(buf, len);
 }
 
 bool GenericPipe::isClosed() const  {
diff --git a/liboverlay/pipes/overlayGenPipe.h b/liboverlay/pipes/overlayGenPipe.h
index 5463eb8..9a66632 100644
--- a/liboverlay/pipes/overlayGenPipe.h
+++ b/liboverlay/pipes/overlayGenPipe.h
@@ -31,7 +31,6 @@
 #define OVERLAY_GENERIC_PIPE_H
 
 #include "overlayUtils.h"
-#include "overlayRotator.h"
 #include "overlayCtrlData.h"
 
 namespace overlay {
@@ -86,14 +85,9 @@
     int mFbNum;
     /* Ctrl/Data aggregator */
     CtrlData mCtrlData;
-    Rotator* mRot;
-    //Whether rotator is used for 0-rot or otherwise
-    bool mRotUsed;
     //Whether we will do downscale opt. This is just a request. If the frame is
     //not a candidate, we might not do it.
     bool mRotDownscaleOpt;
-    //Whether the source is prerotated.
-    bool mPreRotated;
     /* Pipe open or closed */
     enum ePipeState {
         CLOSED,
