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 e8be3ef..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() {
@@ -471,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/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();
