diff --git a/src/com/android/launcher2/FirstFrameAnimatorHelper.java b/src/com/android/launcher2/FirstFrameAnimatorHelper.java
index 7180413..3815486 100644
--- a/src/com/android/launcher2/FirstFrameAnimatorHelper.java
+++ b/src/com/android/launcher2/FirstFrameAnimatorHelper.java
@@ -19,11 +19,10 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
-import android.animation.Animator.AnimatorListener;
 import android.util.Log;
-import android.view.ViewTreeObserver;
 import android.view.View;
 import android.view.ViewPropertyAnimator;
+import android.view.ViewTreeObserver;
 
 /*
  *  This is a helper class that listens to updates from the corresponding animation.
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index 6b32882..c58189c 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -106,7 +106,6 @@
 
     private static String sDefaultFolderName;
     private static String sHintText;
-    private ObjectAnimator mOpenCloseAnimator;
 
     private boolean mDestroyed;
 
@@ -421,7 +420,7 @@
         PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1);
         PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
         PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
-        final ObjectAnimator oa = mOpenCloseAnimator =
+        final ObjectAnimator oa =
             LauncherAnimUtils.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
 
         oa.addListener(new AnimatorListenerAdapter() {
@@ -441,9 +440,6 @@
                     cling.bringToFront();
                 }
                 setFocusOnFirstChild();
-                setAlpha(1);
-                setScaleX(1);
-                setScaleY(1);
             }
         });
         oa.setDuration(mExpandDuration);
@@ -474,7 +470,7 @@
         PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
         PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.9f);
         PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.9f);
-        final ObjectAnimator oa = mOpenCloseAnimator =
+        final ObjectAnimator oa =
                 LauncherAnimUtils.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
 
         oa.addListener(new AnimatorListenerAdapter() {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 7f90c81..7437eac 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -2242,14 +2242,6 @@
         ObjectAnimator oa = LauncherAnimUtils.ofPropertyValuesHolder(mFolderIconImageView, alpha,
                 scaleX, scaleY);
         oa.setDuration(getResources().getInteger(R.integer.config_folderAnimDuration));
-        oa.addListener(new AnimatorListenerAdapter() {
-                public void onAnimationEnd(Animator animation) {
-                    if (mFolderIconImageView != null) {
-                        mFolderIconImageView.setAlpha(0);
-                        mFolderIconImageView.setScalex(1.5f);
-                        mFolderIconImageView.setScalex(1.5f);
-                    }
-                }
         oa.start();
     }
 
diff --git a/src/com/android/launcher2/LauncherViewPropertyAnimator.java b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
index 83b745e..258b2f4 100644
--- a/src/com/android/launcher2/LauncherViewPropertyAnimator.java
+++ b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
@@ -19,9 +19,8 @@
 import android.animation.Animator;
 import android.animation.Animator.AnimatorListener;
 import android.animation.TimeInterpolator;
-import android.animation.ValueAnimator;
-import android.view.ViewPropertyAnimator;
 import android.view.View;
+import android.view.ViewPropertyAnimator;
 
 import java.util.ArrayList;
 import java.util.EnumSet;
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index 1336c7a..86ab128 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -128,7 +128,6 @@
         mIsAppWidget = false;
         mInfo = info;
         CharSequence label = info.loadLabel(pm);
-        final ImageView image = (ImageView) findViewById(R.id.widget_preview);
         final TextView name = (TextView) findViewById(R.id.widget_name);
         name.setText(label);
         final TextView dims = (TextView) findViewById(R.id.widget_dims);
diff --git a/src/com/android/launcher2/StrokedTextView.java b/src/com/android/launcher2/StrokedTextView.java
deleted file mode 100644
index 4e28d17..0000000
--- a/src/com/android/launcher2/StrokedTextView.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * 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.
- */
-
-package com.android.launcher2;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.android.launcher.R;
-
-/**
- * This class adds a stroke to the generic TextView allowing the text to stand out better against
- * the background (ie. in the AllApps button).
- */
-public class StrokedTextView extends TextView {
-    private final Canvas mCanvas = new Canvas();
-    private final Paint mPaint = new Paint();
-    private Bitmap mCache;
-    private boolean mUpdateCachedBitmap;
-    private int mStrokeColor;
-    private float mStrokeWidth;
-    private int mTextColor;
-
-    public StrokedTextView(Context context) {
-        super(context);
-        init(context, null, 0);
-    }
-
-    public StrokedTextView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init(context, attrs, 0);
-    }
-
-    public StrokedTextView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init(context, attrs, defStyle);
-    }
-
-    private void init(Context context, AttributeSet attrs, int defStyle) {
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StrokedTextView,
-                defStyle, 0);
-        mStrokeColor = a.getColor(R.styleable.StrokedTextView_strokeColor, 0xFF000000);
-        mStrokeWidth = a.getFloat(R.styleable.StrokedTextView_strokeWidth, 0.0f);
-        mTextColor = a.getColor(R.styleable.StrokedTextView_strokeTextColor, 0xFFFFFFFF);
-        a.recycle();
-        mUpdateCachedBitmap = true;
-
-        // Setup the text paint
-        mPaint.setAntiAlias(true);
-        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
-    }
-
-    protected void onTextChanged(CharSequence text, int start, int before, int after) {
-        super.onTextChanged(text, start, before, after);
-        mUpdateCachedBitmap = true;
-    }
-
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        if (w > 0 && h > 0) {
-            mUpdateCachedBitmap = true;
-            mCache = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
-        } else {
-            mCache = null;
-        }
-    }
-
-    protected void onDraw(Canvas canvas) {
-        if (mCache != null) {
-            if (mUpdateCachedBitmap) {
-                final int w = getMeasuredWidth();
-                final int h = getMeasuredHeight();
-                final String text = getText().toString();
-                final Rect textBounds = new Rect();
-                final Paint textPaint = getPaint();
-                final int textWidth = (int) textPaint.measureText(text);
-                textPaint.getTextBounds("x", 0, 1, textBounds);
-
-                // Clear the old cached image
-                mCanvas.setBitmap(mCache);
-                mCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
-
-                // Draw the drawable
-                final int drawableLeft = getPaddingLeft();
-                final int drawableTop = getPaddingTop();
-                final Drawable[] drawables = getCompoundDrawables();
-                for (int i = 0; i < drawables.length; ++i) {
-                    if (drawables[i] != null) {
-                        drawables[i].setBounds(drawableLeft, drawableTop,
-                                drawableLeft + drawables[i].getIntrinsicWidth(),
-                                drawableTop + drawables[i].getIntrinsicHeight());
-                        drawables[i].draw(mCanvas);
-                    }
-                }
-
-                final int left = w - getPaddingRight() - textWidth;
-                final int bottom = (h + textBounds.height()) / 2;
-
-                // Draw the outline of the text
-                mPaint.setStrokeWidth(mStrokeWidth);
-                mPaint.setColor(mStrokeColor);
-                mPaint.setTextSize(getTextSize());
-                mCanvas.drawText(text, left, bottom, mPaint);
-
-                // Draw the text itself
-                mPaint.setStrokeWidth(0);
-                mPaint.setColor(mTextColor);
-                mCanvas.drawText(text, left, bottom, mPaint);
-
-                mUpdateCachedBitmap = false;
-            }
-            canvas.drawBitmap(mCache, 0, 0, mPaint);
-        } else {
-            super.onDraw(canvas);
-        }
-    }
-}
diff --git a/src/com/android/launcher2/SymmetricalLinearTween.java b/src/com/android/launcher2/SymmetricalLinearTween.java
deleted file mode 100644
index da02242..0000000
--- a/src/com/android/launcher2/SymmetricalLinearTween.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * 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.
- */
-
-package com.android.launcher2;
-
-import android.os.Handler;
-import android.os.SystemClock;
-
-/**
- * Provides an animation between 0.0f and 1.0f over a given duration.
- */
-class SymmetricalLinearTween {
-
-    private static final int FPS = 30;
-    private static final int FRAME_TIME = 1000 / FPS;
-
-    Handler mHandler;
-    int mDuration;
-    TweenCallback mCallback;
-
-    boolean mRunning;
-    long mBase;
-    boolean mDirection;
-    float mValue;
-
-    /**
-     * @param duration milliseconds duration
-     * @param callback callbacks
-     */
-    public SymmetricalLinearTween(boolean initial, int duration, TweenCallback callback) {
-        mValue = initial ? 1.0f : 0.0f;
-        mDirection = initial;
-        mDuration = duration;
-        mCallback = callback;
-        mHandler = new Handler();
-    }
-
-    /**
-     * Starts the tweening.
-     *
-     * @param direction If direction is true, the value goes towards 1.0f.  If direction
-     *                  is false, the value goes towards 0.0f.
-     */
-    public void start(boolean direction) {
-        start(direction, SystemClock.uptimeMillis());
-    }
-
-    /**
-     * Starts the tweening.
-     *
-     * @param direction If direction is true, the value goes towards 1.0f.  If direction
-     *                  is false, the value goes towards 0.0f.
-     * @param baseTime  The time to use as zero for this animation, in the
-     *                  {@link SystemClock.uptimeMillis} time base.  This allows you to
-     *                  synchronize multiple animations.
-     */
-    public void start(boolean direction, long baseTime) {
-        if (direction != mDirection) {
-            if (!mRunning) {
-                mBase = baseTime;
-                mRunning = true;
-                mCallback.onTweenStarted();
-                long next = SystemClock.uptimeMillis() + FRAME_TIME;
-                mHandler.postAtTime(mTick, next);
-            } else {
-                // reverse direction
-                long now = SystemClock.uptimeMillis();
-                long diff = now - mBase;
-                mBase = now + diff - mDuration;
-            }
-            mDirection = direction;
-        }
-    }
-
-    Runnable mTick = new Runnable() {
-        public void run() {
-            long base = mBase;
-            long now = SystemClock.uptimeMillis();
-            long diff = now-base;
-            int duration = mDuration;
-            float val = diff/(float)duration;
-            if (!mDirection) {
-                val = 1.0f - val;
-            }
-            if (val > 1.0f) {
-                val = 1.0f;
-            } else if (val < 0.0f) {
-                val = 0.0f;
-            }
-            float old = mValue;
-            mValue = val;
-            mCallback.onTweenValueChanged(val, old);
-            int frame = (int)(diff / FRAME_TIME);
-            long next = base + ((frame+1)*FRAME_TIME);
-            if (diff < duration) {
-                mHandler.postAtTime(this, next);
-            }
-            if (diff >= duration) {
-                mCallback.onTweenFinished();
-                mRunning = false;
-            }
-        }
-    };
-}
-
diff --git a/src/com/android/launcher2/TweenCallback.java b/src/com/android/launcher2/TweenCallback.java
deleted file mode 100644
index 380a217..0000000
--- a/src/com/android/launcher2/TweenCallback.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * 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.
- */
-
-package com.android.launcher2;
-
-interface TweenCallback {
-    void onTweenValueChanged(float value, float oldValue);
-    void onTweenStarted();
-    void onTweenFinished();
-}
-
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index d4488db..ca9d759 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -94,7 +94,6 @@
     private Drawable mBackground;
     boolean mDrawBackground = true;
     private float mBackgroundAlpha = 0;
-    private float mOverScrollMaxBackgroundAlpha = 0.0f;
 
     private float mWallpaperScrollRatio = 1.0f;
     private int mOriginalPageSpacing;
@@ -786,7 +785,6 @@
                 hideScrollingIndicator(false);
             }
         }
-        mOverScrollMaxBackgroundAlpha = 0.0f;
 
         if (mDelayedResizeRunnable != null) {
             mDelayedResizeRunnable.run();
