diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index 3439de0..fee8632 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -28,6 +28,7 @@
 import android.os.Vibrator;
 import android.os.SystemClock;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index ef21c61..7e42b8d 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -171,6 +171,7 @@
     private LayoutInflater mInflater;
 
     private DragLayer mDragLayer;
+    private WallpaperView mWallpaperView;
     private Workspace mWorkspace;
 
     private AppWidgetManager mAppWidgetManager;
@@ -539,6 +540,9 @@
         mDragLayer = (DragLayer) findViewById(R.id.drag_layer);
         final DragLayer dragLayer = mDragLayer;
 
+        mWallpaperView = (WallpaperView) dragLayer.findViewById(R.id.wallpaper);
+        final WallpaperView wallpaper = mWallpaperView;
+
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
         final Workspace workspace = mWorkspace;
 
@@ -553,7 +557,10 @@
         workspace.setOnLongClickListener(this);
         workspace.setDragger(dragLayer);
         workspace.setLauncher(this);
+        workspace.setWallpaper(wallpaper);
+
         loadWallpaper();
+        wallpaper.setScreenCount(workspace.getScreenCount());
 
         deleteZone.setLauncher(this);
         deleteZone.setDragController(dragLayer);
@@ -1645,7 +1652,7 @@
                 throw new IllegalStateException("The wallpaper must be a BitmapDrawable.");
             }
         }
-        mWorkspace.loadWallpaper(sWallpaper);
+        mWallpaperView.loadWallpaper(sWallpaper);
     }
 
     /**
@@ -1736,14 +1743,6 @@
         return /* TODO !mDrawer.isMoving() && */ !mAllAppsDialog.isOpen;
     }
 
-    boolean isDrawerUp() {
-        return mAllAppsDialog.isOpen; /* TODO && !mDrawer.isMoving();*/
-    }
-
-    boolean isDrawerMoving() {
-        return false; // TODO mDrawer.isMoving();
-    }
-
     Workspace getWorkspace() {
         return mWorkspace;
     }
diff --git a/src/com/android/launcher2/WallpaperView.java b/src/com/android/launcher2/WallpaperView.java
new file mode 100644
index 0000000..d9fb66a
--- /dev/null
+++ b/src/com/android/launcher2/WallpaperView.java
@@ -0,0 +1,136 @@
+/*
+ * 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.content.Context;
+import android.content.Intent;
+import android.content.ComponentName;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.Scroller;
+import android.widget.TextView;
+import android.os.Parcelable;
+import android.os.Parcel;
+
+import java.util.ArrayList;
+
+/**
+ * Wallpaper view shows the wallpaper bitmap, which is far layer in the parallax.
+ */
+public class WallpaperView extends View {
+
+    private int mScreenCount;
+
+    private Paint mPaint;
+    private Bitmap mWallpaper;
+
+    private int mWallpaperWidth;
+    private int mWallpaperHeight;
+    private float mWallpaperOffset;
+    private boolean mWallpaperLoaded;
+
+    /**
+     * Used to inflate the Workspace from XML.
+     *
+     * @param context The application's context.
+     * @param attrs The attribtues set containing the Workspace's customization values.
+     */
+    public WallpaperView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    /**
+     * Used to inflate the Workspace from XML.
+     *
+     * @param context The application's context.
+     * @param attrs The attribtues set containing the Workspace's customization values.
+     * @param defStyle Unused.
+     */
+    public WallpaperView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+        initWorkspace();
+    }
+
+    /**
+     * Initializes various states for this workspace.
+     */
+    private void initWorkspace() {
+        mPaint = new Paint();
+        mPaint.setDither(false);
+    }
+
+    /**
+     * Set the background's wallpaper.
+     */
+    void loadWallpaper(Bitmap bitmap) {
+        mWallpaper = bitmap;
+        mWallpaperLoaded = true;
+        requestLayout();
+        invalidate();
+    }
+
+    void setScreenCount(int count) {
+        mScreenCount = count;
+    }
+
+    @Override
+    public boolean isOpaque() {
+        return !mWallpaper.hasAlpha();
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        boolean restore = false;
+
+        float x = mScrollX * mWallpaperOffset;
+        if (x + mWallpaperWidth < mRight - mLeft) {
+            x = mRight - mLeft - mWallpaperWidth;
+        }
+
+        canvas.drawBitmap(mWallpaper, x, (mBottom - mTop - mWallpaperHeight) / 2, mPaint);
+    }
+
+    @Override
+    protected void onSizeChanged(int width, int height, int oldw, int oldh) {
+        
+        if (mWallpaperLoaded) {
+            mWallpaperLoaded = false;
+            mWallpaper = Utilities.centerToFit(mWallpaper, width, height, getContext());
+            mWallpaperWidth = mWallpaper.getWidth();
+            mWallpaperHeight = mWallpaper.getHeight();
+        }
+
+        final int wallpaperWidth = mWallpaperWidth;
+        mWallpaperOffset = wallpaperWidth > width ? (mScreenCount * width - wallpaperWidth) /
+                ((mScreenCount - 1) * (float) width) : 1.0f;
+    }
+}
+
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index df3f25b..cdb8411 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -28,6 +28,7 @@
 import android.graphics.Region;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
 import android.view.View;
@@ -55,14 +56,7 @@
     private static final int SNAP_VELOCITY = 1000;
 
     private int mDefaultScreen;
-
-    private Paint mPaint;
-    private Bitmap mWallpaper;
-
-    private int mWallpaperWidth;
-    private int mWallpaperHeight;
-    private float mWallpaperOffset;
-    private boolean mWallpaperLoaded;
+    private View mWallpaper;
 
     private boolean mFirstLayout = true;
 
@@ -148,22 +142,13 @@
         mCurrentScreen = mDefaultScreen;
         Launcher.setScreen(mCurrentScreen);
 
-        mPaint = new Paint();
-        mPaint.setDither(false);
-
         final ViewConfiguration configuration = ViewConfiguration.get(getContext());
         mTouchSlop = configuration.getScaledTouchSlop();
         mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
     }
 
-    /**
-     * Set the background's wallpaper.
-     */
-    void loadWallpaper(Bitmap bitmap) {
-        mWallpaper = bitmap;
-        mWallpaperLoaded = true;
-        requestLayout();
-        invalidate();
+    void setWallpaper(View wallpaper) {
+        mWallpaper = wallpaper;
     }
 
     @Override
@@ -256,6 +241,13 @@
     }
 
     /**
+     * Returns how many screens there are.
+     */
+    int getScreenCount() {
+        return getChildCount();
+    }
+
+    /**
      * Computes a bounding rectangle for a range of cells
      *
      * @param cellX X coordinate of upper left corner expressed as a cell position
@@ -460,6 +452,7 @@
         if (mScroller.computeScrollOffset()) {
             mScrollX = mScroller.getCurrX();
             mScrollY = mScroller.getCurrY();
+            mWallpaper.scrollTo(mScrollX, mScrollY);
             postInvalidate();
         } else if (mNextScreen != INVALID_SCREEN) {
             mCurrentScreen = Math.max(0, Math.min(mNextScreen, getChildCount() - 1));
@@ -470,42 +463,9 @@
     }
 
     @Override
-    public boolean isOpaque() {
-        return !mWallpaper.hasAlpha();
-    }
-
-    @Override
     protected void dispatchDraw(Canvas canvas) {
         boolean restore = false;
 
-        // If the all apps drawer is open and the drawing region for the workspace
-        // is contained within the drawer's bounds, we skip the drawing. This requires
-        // the drawer to be fully opaque.
-        if (mLauncher.isDrawerUp()) {
-            final Rect clipBounds = mClipBounds;
-            canvas.getClipBounds(clipBounds);
-            clipBounds.offset(-mScrollX, -mScrollY);
-            if (mDrawerBounds.contains(clipBounds)) {
-                return;
-            }
-        } else if (mLauncher.isDrawerMoving()) {
-            restore = true;
-            canvas.save(Canvas.CLIP_SAVE_FLAG);
-
-            final View view = mLauncher.getDrawerHandle();
-            final int top = view.getTop() + view.getHeight();
-
-            canvas.clipRect(mScrollX, top, mScrollX + mDrawerContentWidth,
-                    top + mDrawerContentHeight, Region.Op.DIFFERENCE);
-        }
-
-        float x = mScrollX * mWallpaperOffset;
-        if (x + mWallpaperWidth < mRight - mLeft) {
-            x = mRight - mLeft - mWallpaperWidth;
-        }
-
-        canvas.drawBitmap(mWallpaper, x, (mBottom - mTop - mWallpaperHeight) / 2, mPaint);
-
         // ViewGroup.dispatchDraw() supports many features we don't need:
         // clip to padding, layout animation, animation listener, disappearing
         // children, etc. The following implementation attempts to fast-track
@@ -557,18 +517,6 @@
             getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
         }
 
-        if (mWallpaperLoaded) {
-            mWallpaperLoaded = false;
-            mWallpaper = Utilities.centerToFit(mWallpaper, width,
-                    MeasureSpec.getSize(heightMeasureSpec), getContext());
-            mWallpaperWidth = mWallpaper.getWidth();
-            mWallpaperHeight = mWallpaper.getHeight();
-        }
-
-        final int wallpaperWidth = mWallpaperWidth;
-        mWallpaperOffset = wallpaperWidth > width ? (count * width - wallpaperWidth) /
-                ((count - 1) * (float) width) : 1.0f;
-
         if (mFirstLayout) {
             scrollTo(mCurrentScreen * width, 0);
             mFirstLayout = false;
@@ -769,6 +717,7 @@
 
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
+
         if (mLocked || !mLauncher.isDrawerDown()) {
             return true;
         }
@@ -803,12 +752,14 @@
                 if (deltaX < 0) {
                     if (mScrollX > 0) {
                         scrollBy(Math.max(-mScrollX, deltaX), 0);
+                        mWallpaper.scrollTo(mScrollX, mScrollY);
                     }
                 } else if (deltaX > 0) {
                     final int availableToScroll = getChildAt(getChildCount() - 1).getRight() -
                             mScrollX - getWidth();
                     if (availableToScroll > 0) {
                         scrollBy(Math.min(availableToScroll, deltaX), 0);
+                        mWallpaper.scrollTo(mScrollX, mScrollY);
                     }
                 }
             }
