diff --git a/src/com/android/launcher3/CropView.java b/src/com/android/launcher3/CropView.java
index 5b49282..f904643 100644
--- a/src/com/android/launcher3/CropView.java
+++ b/src/com/android/launcher3/CropView.java
@@ -17,12 +17,13 @@
 package com.android.launcher3;
 
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 
 import com.android.photos.views.TiledImageRenderer.TileSource;
 import com.android.photos.views.TiledImageView;
@@ -32,6 +33,8 @@
     private ScaleGestureDetector mScaleGestureDetector;
     private float mLastX, mLastY;
     private float mMinScale;
+    private boolean mTouchEnabled = true;
+    private RectF mTempEdges = new RectF();
 
     public CropView(Context context) {
         this(context, null);
@@ -42,7 +45,7 @@
         mScaleGestureDetector = new ScaleGestureDetector(context, this);
     }
 
-    public RectF getCrop() {
+    private void getEdgesHelper(RectF edgesOut) {
         final float width = getWidth();
         final float height = getHeight();
         final float imageWidth = mRenderer.source.getImageWidth();
@@ -53,13 +56,25 @@
         float centerY = (height / 2f - mRenderer.centerY + (imageHeight - height) / 2f)
                 * scale + height / 2f;
         float leftEdge = centerX - imageWidth / 2f * scale;
+        float rightEdge = centerX + imageWidth / 2f * scale;
         float topEdge = centerY - imageHeight / 2f * scale;
+        float bottomEdge = centerY + imageHeight / 2f * scale;
 
-        float cropLeft = -leftEdge / scale;
-        float cropTop = -topEdge / scale;
-        float cropRight = cropLeft + width / scale;
-        float cropBottom = cropTop + height / scale;
-        RectF cropRect = new RectF(cropLeft, cropTop, cropRight, cropBottom);
+        edgesOut.left = leftEdge;
+        edgesOut.right = rightEdge;
+        edgesOut.top = topEdge;
+        edgesOut.bottom = bottomEdge;
+    }
+
+    public RectF getCrop() {
+        final RectF edges = mTempEdges;
+        getEdgesHelper(edges);
+        final float scale = mRenderer.scale;
+
+        float cropLeft = -edges.left / scale;
+        float cropTop = -edges.top / scale;
+        float cropRight = cropLeft + getWidth() / scale;
+        float cropBottom = cropTop + getHeight() / scale;
 
         return new RectF(cropLeft, cropTop, cropRight, cropBottom);
     }
@@ -102,8 +117,32 @@
     public void onScaleEnd(ScaleGestureDetector detector) {
     }
 
+    public void moveToUpperLeft() {
+        if (getWidth() == 0 || getHeight() == 0) {
+            final ViewTreeObserver observer = getViewTreeObserver();
+            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+                    public void onGlobalLayout() {
+                        moveToUpperLeft();
+                        getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                    }
+                });
+        }
+        final RectF edges = mTempEdges;
+        getEdgesHelper(edges);
+        final float scale = mRenderer.scale;
+        mRenderer.centerX += Math.ceil(edges.left / scale);
+        mRenderer.centerY += Math.ceil(edges.top / scale);
+    }
+
+    public void setTouchEnabled(boolean enabled) {
+        mTouchEnabled = enabled;
+    }
+
     @Override
     public boolean onTouchEvent(MotionEvent event) {
+        if (!mTouchEnabled) {
+            return true;
+        }
         int action = event.getActionMasked();
         final boolean pointerUp = action == MotionEvent.ACTION_POINTER_UP;
         final int skipIndex = pointerUp ? event.getActionIndex() : -1;
@@ -133,30 +172,20 @@
             if (mRenderer.source != null) {
                 // Adjust position so that the wallpaper covers the entire area
                 // of the screen
-                final float width = getWidth();
-                final float height = getHeight();
-                final float imageWidth = mRenderer.source.getImageWidth();
-                final float imageHeight = mRenderer.source.getImageHeight();
+                final RectF edges = mTempEdges;
+                getEdgesHelper(edges);
                 final float scale = mRenderer.scale;
-                float centerX = (width / 2f - mRenderer.centerX + (imageWidth - width) / 2f)
-                        * scale + width / 2f;
-                float centerY = (height / 2f - mRenderer.centerY + (imageHeight - height) / 2f)
-                        * scale + height / 2f;
-                float leftEdge = centerX - imageWidth / 2f * scale;
-                float rightEdge = centerX + imageWidth / 2f * scale;
-                float topEdge = centerY - imageHeight / 2f * scale;
-                float bottomEdge = centerY + imageHeight / 2f * scale;
-                if (leftEdge > 0) {
-                    mRenderer.centerX += Math.ceil(leftEdge / scale);
+                if (edges.left > 0) {
+                    mRenderer.centerX += Math.ceil(edges.left / scale);
                 }
-                if (rightEdge < getWidth()) {
-                    mRenderer.centerX += (rightEdge - getWidth()) / scale;
+                if (edges.right < getWidth()) {
+                    mRenderer.centerX += (edges.right - getWidth()) / scale;
                 }
-                if (topEdge > 0) {
-                    mRenderer.centerY += Math.ceil(topEdge / scale);
+                if (edges.top > 0) {
+                    mRenderer.centerY += Math.ceil(edges.top / scale);
                 }
-                if (bottomEdge < getHeight()) {
-                    mRenderer.centerY += (bottomEdge - getHeight()) / scale;
+                if (edges.bottom < getHeight()) {
+                    mRenderer.centerY += (edges.bottom - getHeight()) / scale;
                 }
             }
         }
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index e8103f5..d80c2ac 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -784,8 +784,8 @@
                 ItemInfo item = new ItemInfo();
                 item.cellX = c.getInt(cellXIndex);
                 item.cellY = c.getInt(cellYIndex);
-                item.spanX = c.getInt(spanXIndex);
-                item.spanY = c.getInt(spanYIndex);
+                item.spanX = Math.max(1, c.getInt(spanXIndex));
+                item.spanY = Math.max(1, c.getInt(spanYIndex));
                 item.container = c.getInt(containerIndex);
                 item.itemType = c.getInt(itemTypeIndex);
                 item.screenId = c.getInt(screenIndex);
diff --git a/src/com/android/launcher3/WallpaperPickerActivity.java b/src/com/android/launcher3/WallpaperPickerActivity.java
index dfc3ef9..bad8460 100644
--- a/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -97,9 +97,12 @@
             } else if (meta.mGalleryImageUri != null) {
                 mCropView.setTileSource(new BitmapRegionTileSource(WallpaperPickerActivity.this,
                         meta.mGalleryImageUri, 1024, 0), null);
+                mCropView.setTouchEnabled(true);
             } else {
                 mCropView.setTileSource(new BitmapRegionTileSource(WallpaperPickerActivity.this,
                         meta.mWallpaperResId, 1024, 0), null);
+                mCropView.setTouchEnabled(false);
+                mCropView.moveToUpperLeft();
             }
         }
     };
