diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java
index 45f58a4..e25ce5c 100644
--- a/src/com/android/launcher2/BubbleTextView.java
+++ b/src/com/android/launcher2/BubbleTextView.java
@@ -38,7 +38,7 @@
  * because we want to make the bubble taller than the text and TextView's clip is
  * too aggressive.
  */
-public class BubbleTextView extends TextView implements VisibilityChangedBroadcaster {
+public class BubbleTextView extends TextView {
     static final float CORNER_RADIUS = 4.0f;
     static final float SHADOW_LARGE_RADIUS = 4.0f;
     static final float SHADOW_SMALL_RADIUS = 1.75f;
@@ -67,8 +67,6 @@
 
     private boolean mStayPressed;
 
-    private VisibilityChangedListener mOnVisibilityChangedListener;
-
     public BubbleTextView(Context context) {
         super(context);
         init();
@@ -240,18 +238,6 @@
         return result;
     }
 
-    public void setVisibilityChangedListener(VisibilityChangedListener listener) {
-        mOnVisibilityChangedListener = listener;
-    }
-
-    @Override
-    protected void onVisibilityChanged(View changedView, int visibility) {
-        if (mOnVisibilityChangedListener != null) {
-            mOnVisibilityChangedListener.receiveVisibilityChangedMessage(this);
-        }
-        super.onVisibilityChanged(changedView, visibility);
-    }
-
     void setStayPressed(boolean stayPressed) {
         mStayPressed = stayPressed;
         if (!stayPressed) {
diff --git a/src/com/android/launcher2/CachedViewGroup.java b/src/com/android/launcher2/CachedViewGroup.java
deleted file mode 100644
index f314b32..0000000
--- a/src/com/android/launcher2/CachedViewGroup.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2008 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 com.android.launcher.R;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.Bitmap.Config;
-import android.graphics.PorterDuff.Mode;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-
-// This class caches the drawing of this View's children in a bitmap when the scale factor
-// falls below a certain size. Only used by CellLayout, but in a separate class to keep cache
-// logic separate from the other logic in CellLayout
-public class CachedViewGroup extends ViewGroup implements VisibilityChangedListener {
-    static final String TAG = "CachedViewGroup";
-
-    private Bitmap mCache;
-    private Canvas mCacheCanvas;
-    private Rect mCacheRect;
-    private Paint mCachePaint;
-
-    private boolean mIsCacheEnabled = true;
-    private boolean mDisableCacheUpdates = false;
-    private boolean mForceCacheUpdate = false;
-    private boolean isUpdatingCache = false;
-    private boolean mIsCacheDirty = true;
-    private float mBitmapCacheScale;
-    private float mMaxScaleForUsingBitmapCache;
-
-    private Rect mBackgroundRect;
-
-    public CachedViewGroup(Context context) {
-        super(context);
-        init();
-    }
-
-    public CachedViewGroup(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        init();
-    }
-
-    private void init() {
-        mBackgroundRect = new Rect();
-        mCacheRect = new Rect();
-        final Resources res = getResources();
-        mBitmapCacheScale =
-            res.getInteger(R.integer.config_workspaceScreenBitmapCacheScale) / 100.0f;
-        mMaxScaleForUsingBitmapCache =
-            res.getInteger(R.integer.config_maxScaleForUsingWorkspaceScreenBitmapCache) / 100.0f;
-        mCacheCanvas = new Canvas();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        // sub-classes (namely CellLayout) will need to implement this
-        prepareCacheBitmap();
-        invalidateCache();
-    }
-
-    private void invalidateIfNeeded() {
-        if (mIsCacheDirty) {
-            // Force a redraw to update the cache if it's dirty
-            invalidate();
-        }
-    }
-
-    public void enableCache() {
-        mIsCacheEnabled = true;
-        invalidateIfNeeded();
-    }
-
-    public void disableCache() {
-        mIsCacheEnabled = false;
-    }
-
-    public void disableCacheUpdates() {
-        mDisableCacheUpdates = true;
-        // Force just one update before we enter a period of no cache updates
-        mForceCacheUpdate = true;
-    }
-
-    public void enableCacheUpdates() {
-        mDisableCacheUpdates = false;
-        invalidateIfNeeded();
-    }
-
-    private void invalidateCache() {
-        mIsCacheDirty = true;
-        invalidate();
-    }
-
-    public void receiveVisibilityChangedMessage(View v) {
-        invalidateCache();
-    }
-
-    private void prepareCacheBitmap() {
-        if (mCache == null) {
-            mCache = Bitmap.createBitmap((int) (getWidth() * mBitmapCacheScale),
-                    (int) (getHeight() * mBitmapCacheScale), Config.ARGB_8888);
-
-            mCachePaint = new Paint();
-            mCachePaint.setFilterBitmap(true);
-            mCacheCanvas.setBitmap(mCache);
-            mCacheCanvas.scale(mBitmapCacheScale, mBitmapCacheScale);
-        }
-    }
-
-
-    public void updateCache() {
-        mCacheCanvas.drawColor(0, Mode.CLEAR);
-
-        float alpha = getAlpha();
-        setAlpha(1.0f);
-        isUpdatingCache = true;
-        drawChildren(mCacheCanvas);
-        isUpdatingCache = false;
-        setAlpha(alpha);
-
-        mIsCacheDirty = false;
-    }
-
-    public void drawChildren(Canvas canvas) {
-        super.dispatchDraw(canvas);
-    }
-
-    @Override
-    public void removeAllViews() {
-        super.removeAllViews();
-        invalidateCache();
-    }
-
-    @Override
-    public void removeAllViewsInLayout() {
-        super.removeAllViewsInLayout();
-        invalidateCache();
-    }
-
-    @Override
-    public void removeView(View view) {
-        super.removeView(view);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViewAt(int index) {
-        super.removeViewAt(index);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViewInLayout(View view) {
-        super.removeViewInLayout(view);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViews(int start, int count) {
-        super.removeViews(start, count);
-        invalidateCache();
-    }
-
-    @Override
-    public void removeViewsInLayout(int start, int count) {
-        super.removeViewsInLayout(start, count);
-        invalidateCache();
-    }
-
-    @Override
-    public void dispatchDraw(Canvas canvas) {
-        final int count = getChildCount();
-
-        boolean useBitmapCache = false;
-        if (!isUpdatingCache) {
-            if (!mIsCacheDirty) {
-                // Check if one of the children (an icon or widget) is dirty
-                for (int i = 0; i < count; i++) {
-                    final View child = getChildAt(i);
-                    if (child.isDirty()) {
-                        mIsCacheDirty = true;
-                        break;
-                    }
-                }
-            }
-
-            useBitmapCache = mIsCacheEnabled && getScaleX() < mMaxScaleForUsingBitmapCache;
-            if (mForceCacheUpdate ||
-                    (useBitmapCache && !mDisableCacheUpdates)) {
-                // Sometimes we force a cache update-- this is used to make sure the cache will look as
-                // up-to-date as possible right when we disable cache updates
-                if (mIsCacheDirty) {
-                    updateCache();
-                }
-                mForceCacheUpdate = false;
-            }
-        }
-
-        if (useBitmapCache) {
-            mCachePaint.setAlpha((int)(255*getAlpha()));
-            canvas.drawBitmap(mCache, mCacheRect, mBackgroundRect, mCachePaint);
-        } else {
-            super.dispatchDraw(canvas);
-        }
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        super.addView(child, index, params);
-
-        // invalidate the cache to have it reflect the new item
-        invalidateCache();
-
-        if (child instanceof VisibilityChangedBroadcaster) {
-            VisibilityChangedBroadcaster v = (VisibilityChangedBroadcaster) child;
-            v.setVisibilityChangedListener(this);
-        }
-    }
-
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        mBackgroundRect.set(0, 0, w, h);
-        mCacheRect.set(0, 0, (int) (mBitmapCacheScale * w), (int) (mBitmapCacheScale * h));
-        mCache = null;
-        prepareCacheBitmap();
-        invalidateCache();
-    }
-}
-
-
-//Custom interfaces used to listen to "visibility changed" events of *children* of Views. Avoided
-//using "onVisibilityChanged" in the names because there's a method of that name in framework
-//(which can only can be used to listen to ancestors' "visibility changed" events)
-interface VisibilityChangedBroadcaster {
-    public void setVisibilityChangedListener(VisibilityChangedListener listener);
-}
-
-interface VisibilityChangedListener {
-    public void receiveVisibilityChangedMessage(View v);
-}
\ No newline at end of file
diff --git a/src/com/android/launcher2/LauncherAppWidgetHostView.java b/src/com/android/launcher2/LauncherAppWidgetHostView.java
index 670c8b6..7c3b993 100644
--- a/src/com/android/launcher2/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher2/LauncherAppWidgetHostView.java
@@ -30,12 +30,10 @@
 /**
  * {@inheritDoc}
  */
-public class LauncherAppWidgetHostView extends AppWidgetHostView
-    implements VisibilityChangedBroadcaster {
+public class LauncherAppWidgetHostView extends AppWidgetHostView {
     private boolean mHasPerformedLongPress;
     private CheckForLongPress mPendingCheckForLongPress;
     private LayoutInflater mInflater;
-    private VisibilityChangedListener mOnVisibilityChangedListener;
 
     public LauncherAppWidgetHostView(Context context) {
         super(context);
@@ -120,18 +118,6 @@
         }
     }
 
-    public void setVisibilityChangedListener(VisibilityChangedListener listener) {
-        mOnVisibilityChangedListener = listener;
-    }
-
-    @Override
-    protected void onVisibilityChanged(View changedView, int visibility) {
-        if (mOnVisibilityChangedListener != null) {
-            mOnVisibilityChangedListener.receiveVisibilityChangedMessage(this);
-        }
-        super.onVisibilityChanged(changedView, visibility);
-    }
-
     @Override
     public int getDescendantFocusability() {
         return ViewGroup.FOCUS_BLOCK_DESCENDANTS;
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index e2fcfec..947c946 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -390,7 +390,9 @@
         return SmoothPagedView.X_LARGE_MODE;
     }
 
-    private void onAddView(View child) {
+    @Override
+    protected void onViewAdded(View child) {
+        super.onViewAdded(child);
         if (!(child instanceof CellLayout)) {
             throw new IllegalArgumentException("A Workspace can only have CellLayout children.");
         }
@@ -400,36 +402,6 @@
         cl.enableHardwareLayers();
     }
 
-    @Override
-    public void addView(View child, int index, LayoutParams params) {
-        onAddView(child);
-        super.addView(child, index, params);
-    }
-
-    @Override
-    public void addView(View child) {
-        onAddView(child);
-        super.addView(child);
-    }
-
-    @Override
-    public void addView(View child, int index) {
-        onAddView(child);
-        super.addView(child, index);
-    }
-
-    @Override
-    public void addView(View child, int width, int height) {
-        onAddView(child);
-        super.addView(child, width, height);
-    }
-
-    @Override
-    public void addView(View child, LayoutParams params) {
-        onAddView(child);
-        super.addView(child, params);
-    }
-
     /**
      * @return The open folder on the current screen, or null if there is none
      */
