diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 732bce3..4d340ca 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -92,10 +92,12 @@
     private VelocityTracker mVelocity;
     private int mTouchTracking;
     private int mLastMotionX;
+    private int mLastMotionY;
     private int mMotionDownRawX;
     private int mMotionDownRawY;
     private int mHomeButtonTop;
     private long mTouchTime;
+    private boolean mRotateMove = true;
 
     static class Defines {
         public static final int ALLOC_PARAMS = 0;
@@ -195,6 +197,8 @@
         return super.onKeyDown(keyCode, event);
     }
 
+    private int mRSMode = 0;
+
     @Override
     public boolean onTouchEvent(MotionEvent ev)
     {
@@ -211,10 +215,13 @@
         int x = (int)ev.getX();
         int y = (int)ev.getY();
 
-        int deltaX;
         int action = ev.getAction();
         switch (action) {
         case MotionEvent.ACTION_DOWN:
+            if (x < 60 && y > 700) {
+                mRotateMove = mRollo.setView((++mRSMode) & 3);
+            }
+
             if (y > mRollo.mTouchYBorders[mRollo.mTouchYBorders.length-1]) {
                 mTouchTracking = TRACKING_HOME;
             } else {
@@ -223,8 +230,13 @@
                 mMotionDownRawX = (int)ev.getRawX();
                 mMotionDownRawY = (int)ev.getRawY();
                 mLastMotionX = x;
+                mLastMotionY = y;
 
-                mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                if (mRotateMove) {
+                    mRollo.mState.newPositionX = ev.getRawY() / mDefines.SCREEN_WIDTH_PX;
+                } else {
+                    mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                }
                 mRollo.mState.newTouchDown = 1;
 
                 if (!mRollo.checkClickOK()) {
@@ -233,7 +245,7 @@
                     mRollo.selectIcon(x, y, mRollo.mMessageProc.mPosX);
                 }
                 mRollo.mState.save();
-                mRollo.mInvokeMove.execute();
+                mRollo.move();
                 mVelocity = VelocityTracker.obtain();
                 mVelocity.addMovement(ev);
                 mStartedScrolling = false;
@@ -244,21 +256,31 @@
             if (mTouchTracking == TRACKING_HOME) {
                 // TODO: highlight?
             } else {
-                int slopX = Math.abs(x - mLastMotionX);
+                int slopX;
+                if (mRotateMove) {
+                    slopX = Math.abs(y - mLastMotionY);
+                } else {
+                    slopX = Math.abs(x - mLastMotionX);
+                }
+
                 if (!mStartedScrolling && slopX < mSlopX) {
                     // don't update mLastMotionX so slopX is right and when we do start scrolling
                     // below, we get the right delta.
                 } else {
-                    mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                    if (mRotateMove) {
+                        mRollo.mState.newPositionX = ev.getRawY() / mDefines.SCREEN_WIDTH_PX;
+                    } else {
+                        mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                    }
                     mRollo.mState.newTouchDown = 1;
-                    mRollo.mInvokeMove.execute();
+                    mRollo.move();
 
                     mStartedScrolling = true;
                     mRollo.clearSelectedIcon();
-                    deltaX = x - mLastMotionX;
                     mVelocity.addMovement(ev);
                     mRollo.mState.save();
                     mLastMotionX = x;
+                    mLastMotionY = y;
                 }
             }
             break;
@@ -272,14 +294,23 @@
                 }
             } else {
                 mRollo.mState.newTouchDown = 0;
-                mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                if (mRotateMove) {
+                    mRollo.mState.newPositionX = ev.getRawY() / mDefines.SCREEN_WIDTH_PX;
+                } else {
+                    mRollo.mState.newPositionX = ev.getRawX() / mDefines.SCREEN_WIDTH_PX;
+                }
 
                 mVelocity.computeCurrentVelocity(1000 /* px/sec */, mMaxFlingVelocity);
-                mRollo.mState.flingVelocityX
-                        = mVelocity.getXVelocity() / mDefines.SCREEN_WIDTH_PX;
+                if (mRotateMove) {
+                    mRollo.mState.flingVelocityX
+                            = mVelocity.getYVelocity() / mDefines.SCREEN_WIDTH_PX;
+                } else {
+                    mRollo.mState.flingVelocityX
+                            = mVelocity.getXVelocity() / mDefines.SCREEN_WIDTH_PX;
+                }
                 mRollo.clearSelectedIcon();
                 mRollo.mState.save();
-                mRollo.mInvokeFling.execute();
+                mRollo.fling();
 
                 mLastMotionX = -10000;
                 if (mVelocity != null) {
@@ -466,16 +497,16 @@
     public class RolloRS {
 
         // Allocations ======
+        private int mViewMode = 0;
 
         private int mWidth;
         private int mHeight;
 
         private Resources mRes;
-        private Script mScript;
+        private Script[] mScript = new Script[4];
 
-        private Script.Invokable mInvokeMove;
-        private Script.Invokable mInvokeFling;
-        private Script.Invokable mInvokeTouchUp;
+        private Script.Invokable[] mInvokeMove = new Script.Invokable[4];
+        private Script.Invokable[] mInvokeFling = new Script.Invokable[4];
 
         private ProgramStore mPSIcons;
         private ProgramStore mPSText;
@@ -485,6 +516,7 @@
         private ProgramVertex mPV;
         private ProgramVertex mPVOrtho;
         private SimpleMesh mMesh;
+        private SimpleMesh mMesh2;
 
         private Allocation mHomeButton;
 
@@ -505,6 +537,7 @@
         private Bitmap mSelectionBitmap;
         private Canvas mSelectionCanvas;
 
+
         Params mParams;
         State mState;
 
@@ -582,6 +615,7 @@
             initProgramFragment();
             initProgramStore();
             initMesh();
+            initMesh2();
             initGl();
             initData();
             initTouchState();
@@ -642,6 +676,44 @@
         }
 
 
+        public void initMesh2() {
+            SimpleMesh.TriangleMeshBuilder tm = new SimpleMesh.TriangleMeshBuilder(mRS, 3,
+                SimpleMesh.TriangleMeshBuilder.TEXTURE_0 | SimpleMesh.TriangleMeshBuilder.COLOR);
+
+            float y = 0;
+            float z = 0;
+            for (int ct=0; ct < 200; ct++) {
+                float angle = 0;
+                float maxAngle = 3.14f * 0.16f;
+                float l = 1.f;
+
+                l = 1 - ((ct-5) * 0.10f);
+                if (ct > 7) {
+                    angle = maxAngle * (ct - 7) * 0.2f;
+                    angle = Math.min(angle, maxAngle);
+                }
+                l = Math.max(0.3f, l);
+                l = Math.min(1.0f, l);
+
+                y += 0.1f * Math.cos(angle);
+                z += 0.1f * Math.sin(angle);
+
+                float t = 0.1f * ct;
+                float ds = 0.08f;
+                tm.setColor(l, l, l, 0.99f);
+                tm.setTexture(ds, t);
+                tm.addVertex(-0.5f, y, z);
+                tm.setTexture(1 - ds, t);
+                tm.addVertex(0.5f, y, z);
+            }
+            for (int ct=0; ct < (200 * 2 - 2); ct+= 2) {
+                tm.addTriangle(ct, ct+1, ct+2);
+                tm.addTriangle(ct+1, ct+3, ct+2);
+            }
+            mMesh2 = tm.create();
+            mMesh2.setName("SMMesh2");
+        }
+
         private void initProgramVertex() {
             ProgramVertex.MatrixAllocation pva = new ProgramVertex.MatrixAllocation(mRS);
             pva.setupProjectionNormalized(mWidth, mHeight);
@@ -746,30 +818,35 @@
             setApps(null);
         }
 
-        private void initRs() {
+        private void initScript(int idx, int id) {
             ScriptC.Builder sb = new ScriptC.Builder(mRS);
-            sb.setScript(mRes, R.raw.rollo);
-            //sb.setScript(mRes, R.raw.rollo2);
+            sb.setScript(mRes, id);
             sb.setRoot(true);
             sb.addDefines(mDefines);
             sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
             sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
-            mInvokeMove = sb.addInvokable("move");
-            mInvokeFling = sb.addInvokable("fling");
-            mInvokeTouchUp = sb.addInvokable("touchUp");
-            mScript = sb.create();
-            mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            mInvokeMove[idx] = sb.addInvokable("move");
+            mInvokeFling[idx] = sb.addInvokable("fling");
+            mScript[idx] = sb.create();
+            mScript[idx].setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+            mScript[idx].bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
+            mScript[idx].bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
+            mScript[idx].bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+            mScript[idx].bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+            mScript[idx].bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS);
+            mScript[idx].bindAllocation(mAllocTouchYBorders, Defines.ALLOC_Y_BORDERS);
+        }
 
-            mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
-            mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
-            mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
-            mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
-            mScript.bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS);
-            mScript.bindAllocation(mAllocTouchYBorders, Defines.ALLOC_Y_BORDERS);
+        private void initRs() {
+            mViewMode = 0;
+            initScript(0, R.raw.rollo3);
+            initScript(1, R.raw.rollo2);
+            initScript(2, R.raw.rollo);
+            initScript(3, R.raw.rollo4);
 
             mMessageProc = new AAMessage();
             mRS.mMessageCallback = mMessageProc;
-            mRS.contextBindRootScript(mScript);
+            mRS.contextBindRootScript(mScript[mViewMode]);
         }
 
         private void setApps(ArrayList<ApplicationInfo> list) {
@@ -878,20 +955,22 @@
          */
         private void saveAppsList() {
             mRS.contextBindRootScript(null);
-            
+
             mAllocIconIds.data(mIconIds);
             mAllocLabelIds.data(mLabelIds);
 
-            if (mScript != null) { // this happens when we init it
-                mScript.bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
-                mScript.bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+            if (mScript[0] != null) { // this happens when we init it
+                for (int ct=0; ct < 4; ct++) {
+                    mScript[ct].bindAllocation(mAllocIconIds, Defines.ALLOC_ICON_IDS);
+                    mScript[ct].bindAllocation(mAllocLabelIds, Defines.ALLOC_LABEL_IDS);
+                }
             }
 
             mState.save();
 
             // Note: mScript may be null if we haven't initialized it yet.
             // In that case, this is a no-op.
-            mRS.contextBindRootScript(mScript);
+            mRS.contextBindRootScript(mScript[mViewMode]);
         }
 
         void initTouchState() {
@@ -953,6 +1032,20 @@
                     + (row * Defines.ROWS_PER_PAGE) + col;
         }
 
+        boolean setView(int v) {
+            mViewMode = v;
+            mRS.contextBindRootScript(mScript[mViewMode]);
+            return (v == 0);
+        }
+
+        void fling() {
+            mInvokeFling[mViewMode].execute();
+        }
+
+        void move() {
+            mInvokeMove[mViewMode].execute();
+        }
+
         /**
          * You need to call save() on mState on your own after calling this.
          */
