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();
-}
-
