diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a4c29ea..33c8e51 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -131,6 +131,10 @@
                 <action android:name="android.intent.action.MEDIA_MOUNTED" />
                 <data android:scheme="file" />
             </intent-filter>
+            <intent-filter>
+                <action android:name="android.intent.action.MEDIA_EJECT" />
+                <data android:scheme="file" />
+            </intent-filter>
 		</receiver>
 		<receiver android:name="PhotoAppWidgetProvider" android:label="@string/gadget_title">
             <intent-filter>
diff --git a/src/com/cooliris/cache/BootReceiver.java b/src/com/cooliris/cache/BootReceiver.java
index dae5355..e19aba6 100644
--- a/src/com/cooliris/cache/BootReceiver.java
+++ b/src/com/cooliris/cache/BootReceiver.java
@@ -1,6 +1,7 @@
 package com.cooliris.cache;
 
 import com.cooliris.media.LocalDataSource;
+import com.cooliris.media.PicasaDataSource;
 import com.cooliris.media.SingleDataSource;
 
 import android.content.BroadcastReceiver;
@@ -50,6 +51,12 @@
             ContentResolver cr = context.getContentResolver();
             cr.registerContentObserver(uriImages, false, localObserver);
             cr.registerContentObserver(uriVideos, false, localObserver);
+        } else if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
+        	LocalDataSource.sThumbnailCache.close();
+        	LocalDataSource.sThumbnailCacheVideo.close();
+        	PicasaDataSource.sThumbnailCache.close();
+        	CacheService.sAlbumCache.close();
+        	CacheService.sMetaAlbumCache.close();
         }
     }
 }
diff --git a/src/com/cooliris/cache/CacheService.java b/src/com/cooliris/cache/CacheService.java
index d54f9fa..bf20af2 100644
--- a/src/com/cooliris/cache/CacheService.java
+++ b/src/com/cooliris/cache/CacheService.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import android.app.IntentService;
+import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -56,7 +57,7 @@
 public final class CacheService extends IntentService {
 	public static final String ACTION_CACHE = "com.cooliris.cache.action.CACHE";
 	public static final DiskCache sAlbumCache = new DiskCache("local-album-cache");
-	public static final DiskCache sMetaAlbumCache = new DiskCache("local-meta-album-cache");
+	public static final DiskCache sMetaAlbumCache = new DiskCache("local-meta-cache");
 
 	private static final String TAG = "CacheService";
 	private static ImageList sList = null;
@@ -94,7 +95,7 @@
 	        Images.ImageColumns.DATA, Images.ImageColumns.ORIENTATION };
 
 	public static final String[] SENSE_PROJECTION = new String[] { Images.ImageColumns.BUCKET_ID,
-	        "MAX(" + Images.ImageColumns.DATE_ADDED + ")" };
+	        "MAX(" + Images.ImageColumns.DATE_ADDED + "), COUNT(*)" };
 
 	// Must preserve order between these indices and the order of the terms in
 	// INITIAL_PROJECTION_IMAGES and
@@ -204,10 +205,10 @@
 					if (ids != null && observer != null) {
 						observer.onChange(ids);
 					}
-					if (ids.length > 0) {
+					if (ids != null && ids.length > 0) {
 						sList = null;
+						Log.i(TAG, "Done computing dirty sets for num " + ids.length);
 					}
-					Log.i(TAG, "Done computing dirty sets for num " + ids.length);
 				}
 			});
 		} else {
@@ -556,12 +557,10 @@
 		}
 		byte[] bitmap = thumbnailCache.get(thumbId, timestamp);
 		if (bitmap == null) {
-			Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
 			final long time = SystemClock.uptimeMillis();
 			bitmap = buildThumbnailForId(context, thumbnailCache, thumbId, origId, isVideo, DEFAULT_THUMBNAIL_WIDTH,
 			        DEFAULT_THUMBNAIL_HEIGHT);
 			Log.i(TAG, "Built thumbnail and screennail for " + origId + " in " + (SystemClock.uptimeMillis() - time));
-			Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
 		}
 		return bitmap;
 	}
@@ -608,7 +607,6 @@
 					return null;
 				}
 			} else {
-				Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
 				new Thread() {
 					public void run() {
 						try {
@@ -883,13 +881,22 @@
 		lBuffer.put(0, l);
 		return bArray;
 	}
+	
+	private static final byte[] longArrayToByteArray(final long[] l) {
+		final byte[] bArray = new byte[8 * l.length];
+		final ByteBuffer bBuffer = ByteBuffer.wrap(bArray);
+		final LongBuffer lBuffer = bBuffer.asLongBuffer();
+		int numLongs = l.length;
+		for (int i = 0; i < numLongs; ++i) {
+			lBuffer.put(i, l[i]);
+		}
+		return bArray;
+	}
 
 	private final static void refresh(final Context context) {
 		// First we build the album cache.
 		// This is the meta-data about the albums / buckets on the SD card.
 		Log.i(TAG, "Refreshing cache.");
-		int priority = Process.getThreadPriority(Process.myTid());
-		Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
 		sAlbumCache.deleteAll();
 		putLocaleForAlbumCache(Locale.getDefault());
 
@@ -944,7 +951,6 @@
 		// Now we must cache the items contained in every album / bucket.
 		populateMediaItemsForSets(context, sets, acceleratedSets, false);
 		sAlbumCache.delete(ALBUM_CACHE_INCOMPLETE_INDEX);
-		Process.setThreadPriority(priority);
 
 		// Complete any queued dirty requests
 		processQueuedDirty(context);
@@ -973,36 +979,52 @@
 	}
 
 	private static final long[] computeDirtySets(final Context context) {
-		final Uri uriImages = Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("distinct", "true").build();
-		final Uri uriVideos = Video.Media.EXTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("distinct", "true").build();
+		final Uri uriImages = Images.Media.EXTERNAL_CONTENT_URI;
+		final Uri uriVideos = Video.Media.EXTERNAL_CONTENT_URI;
 		final ContentResolver cr = context.getContentResolver();
-
-		final Cursor cursorImages = cr.query(uriImages, SENSE_PROJECTION, null, null, null);
-		final Cursor cursorVideos = cr.query(uriVideos, SENSE_PROJECTION, null, null, null);
+		final String where = Images.ImageColumns.BUCKET_ID + "!=0) GROUP BY (" + Images.ImageColumns.BUCKET_ID + " ";
+		final Cursor cursorImages = cr.query(uriImages, SENSE_PROJECTION, where, null, null);
+		final Cursor cursorVideos = cr.query(uriVideos, SENSE_PROJECTION, where, null, null);
 		Cursor[] cursors = new Cursor[2];
 		cursors[0] = cursorImages;
 		cursors[1] = cursorVideos;
 		final MergeCursor cursor = new MergeCursor(cursors);
 		long[] retVal = null;
+		int ctr = 0;
 		try {
 			if (cursor.moveToFirst()) {
 				retVal = new long[cursor.getCount()];
-				int ctr = 0;
 				boolean allDirty = false;
 				do {
 					long setId = cursor.getLong(0);
-					retVal[ctr++] = setId;
-					byte[] data = sMetaAlbumCache.get(setId, 0);
-					if (data == null) {
-						// We need to refresh everything.
-						markDirty(context);
-						allDirty = true;
-					}
-					if (!allDirty) {
-						long maxAdded = cursor.getLong(1);
-						long oldMaxAdded = toLong(data);
-						if (maxAdded > oldMaxAdded) {
-							markDirty(context, setId);
+					if (allDirty) {
+						retVal[ctr++] = setId;
+					} else {
+						boolean contains = sAlbumCache.isDataAvailable(setId, 0);
+						if (!contains) {
+							// We need to refresh everything.
+							markDirty(context);
+							retVal[ctr++] = setId;
+							allDirty = true;
+						}
+						if (!allDirty) {
+							long maxAdded = cursor.getLong(1);
+							int count = cursor.getInt(2);
+							byte[] data = sMetaAlbumCache.get(setId, 0);
+							long[] dataLong = new long[2];
+							if (data != null) {
+								dataLong = toLongArray(data);
+							}
+							long oldMaxAdded = dataLong[0];
+							long oldCount = dataLong[1];
+							Log.i(TAG, "Bucket " + setId + " Old added " + oldMaxAdded + " count " + oldCount + " New added " + maxAdded + " count " + count);
+							if (maxAdded > oldMaxAdded || oldCount != count) {
+								markDirty(context, setId);
+								retVal[ctr++] = setId;
+								dataLong[0] = maxAdded;
+								dataLong[1] = count;
+								sMetaAlbumCache.put(setId, longArrayToByteArray(dataLong));
+							}
 						}
 					}
 				} while (cursor.moveToNext());
@@ -1010,8 +1032,13 @@
 		} finally {
 			cursor.close();
 		}
+		sMetaAlbumCache.flush();
 		processQueuedDirty(context);
-		return retVal;
+		long[] retValCompact = new long[ctr];
+		for (int i = 0; i < ctr; ++i) {
+			retValCompact[i] = retVal[i];
+		}
+		return retValCompact;
 	}
 
 	private static final void processQueuedDirty(final Context context) {
@@ -1074,7 +1101,6 @@
 				final int approximateCountPerSet = count / numSets;
 				for (int i = 0; i < numSets; ++i) {
 					final MediaSet set = sets.get(i);
-					set.getItems().clear();
 					set.setNumExpectedItems(approximateCountPerSet);
 				}
 				do {
@@ -1091,7 +1117,7 @@
 					final long setId = sortCursor.getLong(MEDIA_BUCKET_ID_INDEX);
 					final MediaSet set = findSet(setId, acceleratedSets);
 					if (set != null) {
-						set.getItems().add(item);
+						set.addItem(item);
 					}
 				} while (sortCursor.moveToNext());
 			}
@@ -1144,20 +1170,9 @@
 			}
 			writeItemsForASet(sets.get(i));
 		}
-		writeMetaAlbumCache(sets);
 		sAlbumCache.flush();
 	}
 
-	private static final void writeMetaAlbumCache(ArrayList<MediaSet> sets) {
-		final int numSets = sets.size();
-		for (int i = 0; i < numSets; ++i) {
-			final MediaSet set = sets.get(i);
-			byte[] data = longToByteArray(set.mMaxAddedTimestamp);
-			sMetaAlbumCache.put(set.mId, data);
-		}
-		sMetaAlbumCache.flush();
-	}
-
 	private static final void writeItemsForASet(final MediaSet set) {
 		final ByteArrayOutputStream bos = new ByteArrayOutputStream();
 		final DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(bos, 256));
diff --git a/src/com/cooliris/media/Gallery.java b/src/com/cooliris/media/Gallery.java
index 46fc3dd..dcadb4d 100644
--- a/src/com/cooliris/media/Gallery.java
+++ b/src/com/cooliris/media/Gallery.java
@@ -124,7 +124,7 @@
 			final ConcatenatedDataSource singleCombinedDataSource = new ConcatenatedDataSource(singleDataSource, picasaDataSource);
 			mGridLayer.setDataSource(singleCombinedDataSource);
 			mGridLayer.setViewIntent(true, Utils.getBucketNameFromUri(uri));
-			if (SingleDataSource.isSingleImageMode(uri.toString())) {
+			if (singleDataSource.isSingleImage()) {
 				mGridLayer.setSingleImage(false);
 			} else if (slideshow) {
 				mGridLayer.setSingleImage(true);
diff --git a/src/com/cooliris/media/GridLayer.java b/src/com/cooliris/media/GridLayer.java
index 8cd05c2..61bea47 100644
--- a/src/com/cooliris/media/GridLayer.java
+++ b/src/com/cooliris/media/GridLayer.java
@@ -7,7 +7,6 @@
 import android.opengl.GLU;
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
-import android.util.Log;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.content.Context;
@@ -29,7 +28,7 @@
 
 	private static final float SLIDESHOW_TRANSITION_TIME = 3.5f;
 
-	private static HudLayer sHud;
+	private HudLayer mHud;
 	private int mState;
 	private static final IndexRange sBufferedVisibleRange = new IndexRange();
 	private static final IndexRange sVisibleRange = new IndexRange();
@@ -133,33 +132,32 @@
 		sBucketList.clear();
 
 		sVisibleItems = new ArrayList<MediaItem>();
-		if (sHud == null) {
-			sHud = new HudLayer(context);
-		}
-		sHud.setContext(context);
-		sHud.setGridLayer(this);
-		sHud.getPathBar().clear();
-		sHud.setGridLayer(this);
-		sHud.getTimeBar().setListener(this);
-		sHud.getPathBar().pushLabel(R.drawable.icon_home_small, context.getResources().getString(R.string.app_name),
+		mHud = new HudLayer(context);
+		mHud.setContext(context);
+		mHud.setGridLayer(this);
+		mHud.getPathBar().clear();
+		mHud.setGridLayer(this);
+		mHud.getTimeBar().setListener(this);
+		mHud.getPathBar().pushLabel(R.drawable.icon_home_small, context.getResources().getString(R.string.app_name),
 		        new Runnable() {
 			        public void run() {
-				        if (sHud.getAlpha() == 1.0f) {
+				        if (mHud.getAlpha() == 1.0f) {
 					        if (!mFeedAboutToChange) {
 						        setState(STATE_MEDIA_SETS);
 					        }
 				        } else {
-					        sHud.setAlpha(1.0f);
+					        mHud.setAlpha(1.0f);
 				        }
 			        }
 		        });
 		mCameraManager = new GridCameraManager(mCamera);
 		mDrawManager = new GridDrawManager(context, mCamera, mDrawables, sDisplayList, sDisplayItems, sDisplaySlots);
 		mInputProcessor = new GridInputProcessor(context, mCamera, this, mView, sTempVec, sDisplayItems);
+		setState(STATE_MEDIA_SETS);
 	}
 
 	public HudLayer getHud() {
-		return sHud;
+		return mHud;
 	}
 
 	public void shutdown() {
@@ -185,13 +183,13 @@
 		mBackground.generate(view, lists);
 		lists.blendedList.add(this);
 		lists.hitTestList.add(this);
-		sHud.generate(view, lists);
+		mHud.generate(view, lists);
 	}
 
 	@Override
 	protected void onSizeChanged() {
-		sHud.setSize(mWidth, mHeight);
-		sHud.setAlpha(1.0f);
+		mHud.setSize(mWidth, mHeight);
+		mHud.setAlpha(1.0f);
 		mBackground.setSize(mWidth, mHeight);
 		mTimeElapsedSinceTransition = 0.0f;
 		if (mView != null) {
@@ -240,24 +238,24 @@
 				MediaSet set = feed.getCurrentSet();
 				int icon = mDrawables.getIconForSet(set, true);
 				if (set != null) {
-					sHud.getPathBar().pushLabel(icon, set.mNoCountTitleString, new Runnable() {
+					mHud.getPathBar().pushLabel(icon, set.mNoCountTitleString, new Runnable() {
 						public void run() {
 							if (mFeedAboutToChange) {
 								return;
 							}
-							if (sHud.getAlpha() == 1.0f) {
+							if (mHud.getAlpha() == 1.0f) {
 								disableLocationFiltering();
 								mInputProcessor.clearSelection();
 								setState(STATE_GRID_VIEW);
 							} else {
-								sHud.setAlpha(1.0f);
+								mHud.setAlpha(1.0f);
 							}
 						}
 					});
 				}
 			}
 			if (mState == STATE_FULL_SCREEN) {
-				sHud.getPathBar().popLabel();
+				mHud.getPathBar().popLabel();
 			}
 			break;
 		case STATE_TIMELINE:
@@ -276,12 +274,12 @@
 			layoutInterface.mSpacingX = (int) (40 * Gallery.PIXEL_DENSITY);
 			layoutInterface.mSpacingY = (int) (40 * Gallery.PIXEL_DENSITY);
 			if (mState != STATE_FULL_SCREEN) {
-				sHud.getPathBar().pushLabel(R.drawable.ic_fs_details, "", new Runnable() {
+				mHud.getPathBar().pushLabel(R.drawable.ic_fs_details, "", new Runnable() {
 					public void run() {
-						if (sHud.getAlpha() == 1.0f) {
-							sHud.swapFullscreenLabel();
+						if (mHud.getAlpha() == 1.0f) {
+							mHud.swapFullscreenLabel();
 						}
-						sHud.setAlpha(1.0f);
+						mHud.setAlpha(1.0f);
 					}
 				});
 			}
@@ -300,15 +298,15 @@
 			layoutInterface.mSpacingY = (int) (70 * Gallery.PIXEL_DENSITY * yStretch);
 			if (mInAlbum) {
 				if (mState == STATE_FULL_SCREEN) {
-					sHud.getPathBar().popLabel();
+					mHud.getPathBar().popLabel();
 				}
-				sHud.getPathBar().popLabel();
+				mHud.getPathBar().popLabel();
 				mInAlbum = false;
 			}
 			break;
 		}
 		mState = state;
-		sHud.onGridStateChanged();
+		mHud.onGridStateChanged();
 		if (performLayout && mFeedAboutToChange == false) {
 			onLayout(Shared.INVALID, Shared.INVALID, oldLayout);
 		}
@@ -321,9 +319,9 @@
 	protected void enableLocationFiltering(String label) {
 		if (mLocationFilter == false) {
 			mLocationFilter = true;
-			sHud.getPathBar().pushLabel(R.drawable.icon_location_small, label, new Runnable() {
+			mHud.getPathBar().pushLabel(R.drawable.icon_location_small, label, new Runnable() {
 				public void run() {
-					if (sHud.getAlpha() == 1.0f) {
+					if (mHud.getAlpha() == 1.0f) {
 						if (mState == STATE_FULL_SCREEN) {
 							mInputProcessor.clearSelection();
 							setState(STATE_GRID_VIEW);
@@ -331,7 +329,7 @@
 							disableLocationFiltering();
 						}
 					} else {
-						sHud.setAlpha(1.0f);
+						mHud.setAlpha(1.0f);
 					}
 				}
 			});
@@ -342,7 +340,7 @@
 		if (mLocationFilter) {
 			mLocationFilter = false;
 			mMediaFeed.removeFilter();
-			sHud.getPathBar().popLabel();
+			mHud.getPathBar().popLabel();
 		}
 	}
 
@@ -383,7 +381,7 @@
 			}
 			mWakeLock = null;
 		}
-		sHud.setAlpha(1.0f);
+		mHud.setAlpha(1.0f);
 	}
 
 	@Override
@@ -490,9 +488,9 @@
 				hud.setMode(HudLayer.MODE_NORMAL);
 		}
 		if (view.elapsedLoadingExpensiveTextures() > 150 || (mMediaFeed != null && mMediaFeed.getWaitingForMediaScanner())) {
-			sHud.getPathBar().setAnimatedIcons(GridDrawables.TEXTURE_SPINNER);
+			mHud.getPathBar().setAnimatedIcons(GridDrawables.TEXTURE_SPINNER);
 		} else {
-			sHud.getPathBar().setAnimatedIcons(null);
+			mHud.getPathBar().setAnimatedIcons(null);
 		}
 
 		// In that case, we need to commit the respective Display Items when the
@@ -500,17 +498,17 @@
 		GridCamera camera = mCamera;
 		camera.update(timeElapsed);
 		DisplayItem anchorDisplayItem = getAnchorDisplayItem(ANCHOR_CENTER);
-		if (anchorDisplayItem != null && !sHud.getTimeBar().isDragged()) {
-			sHud.getTimeBar().setItem(anchorDisplayItem.mItemRef);
+		if (anchorDisplayItem != null && !mHud.getTimeBar().isDragged()) {
+			mHud.getTimeBar().setItem(anchorDisplayItem.mItemRef);
 		}
 		sDisplayList.update(timeElapsed);
 		mInputProcessor.update(timeElapsed);
 		mSelectedAlpha = FloatUtils.animate(mSelectedAlpha, mTargetAlpha, timeElapsed * 0.5f);
 		if (mState == STATE_FULL_SCREEN) {
-			sHud.autoHide(true);
+			mHud.autoHide(true);
 		} else {
-			sHud.autoHide(false);
-			sHud.setAlpha(1.0f);
+			mHud.autoHide(false);
+			mHud.setAlpha(1.0f);
 		}
 		GridQuad[] fullscreenQuads = GridDrawables.sFullscreenGrid;
 		int numFullScreenQuads = fullscreenQuads.length;
@@ -670,8 +668,8 @@
 					if (mState == STATE_GRID_VIEW) {
 						MediaSet expandedSet = mMediaFeed.getExpandedMediaSet();
 						if (expandedSet != null) {
-							if (!sHud.getPathBar().getCurrentLabel().equals(expandedSet.mNoCountTitleString)) {
-								sHud.getPathBar().changeLabel(expandedSet.mNoCountTitleString);
+							if (!mHud.getPathBar().getCurrentLabel().equals(expandedSet.mNoCountTitleString)) {
+								mHud.getPathBar().changeLabel(expandedSet.mNoCountTitleString);
 							}
 						}
 					}
@@ -688,13 +686,13 @@
 									if (itemUri != null && mRequestFocusContentUri != null) {
 										if (itemUri.equals(mRequestFocusContentUri)) {
 											mInputProcessor.setCurrentSelectedSlot(i);
-											mRequestFocusContentUri = null;
 											break;
 										}
 									}
 								}
 							}
 						}
+						mRequestFocusContentUri = null;
 					}
 				}
 			} finally {
@@ -726,8 +724,8 @@
 	@Override
 	public void onSurfaceCreated(RenderView view, GL11 gl) {
 		sDisplayList.clear();
-		sHud.clear();
-		sHud.reset();
+		mHud.clear();
+		mHud.reset();
 		GridDrawables.sStringTextureTable.clear();
 		mDrawables.onSurfaceCreated(view, gl);
 		mBackground.clear();
@@ -780,8 +778,8 @@
 
 	public void renderBlended(RenderView view, GL11 gl) {
 		// We draw the placeholder for all visible slots.
-		if (sHud != null && mDrawManager != null) {
-			mDrawManager.drawBlendedComponents(view, gl, mSelectedAlpha, mState, sHud.getMode(), mTimeElapsedSinceStackViewReady,
+		if (mHud != null && mDrawManager != null) {
+			mDrawManager.drawBlendedComponents(view, gl, mSelectedAlpha, mState, mHud.getMode(), mTimeElapsedSinceStackViewReady,
 			        mTimeElapsedSinceGridViewReady, sBucketList, mMediaFeed.getWaitingForMediaScanner() || mFeedAboutToChange
 			                || mMediaFeed.isLoading());
 		}
@@ -857,7 +855,7 @@
 			mFeedChanged = true;
 			forceRecomputeVisibleRange();
 			if (mState == STATE_GRID_VIEW || mState == STATE_FULL_SCREEN)
-				sHud.setFeed(feed, mState, needsLayout);
+				mHud.setFeed(feed, mState, needsLayout);
 			return;
 		}
 
@@ -865,10 +863,10 @@
 			Thread.yield();
 		}
 		if (mState == STATE_GRID_VIEW) {
-			if (sHud != null) {
+			if (mHud != null) {
 				MediaSet set = feed.getCurrentSet();
 				if (set != null && !mLocationFilter)
-					sHud.getPathBar().changeLabel(set.mNoCountTitleString);
+					mHud.getPathBar().changeLabel(set.mNoCountTitleString);
 			}
 		}
 		DisplayItem[] displayItems = sDisplayItems;
@@ -953,7 +951,7 @@
 		mFeedChanged = true;
 		if (feed != null) {
 			if (mState == STATE_GRID_VIEW || mState == STATE_FULL_SCREEN)
-				sHud.setFeed(feed, mState, needsLayout);
+				mHud.setFeed(feed, mState, needsLayout);
 		}
 		if (mView != null) {
 			mView.requestRender();
@@ -1058,7 +1056,7 @@
 		boolean retVal = changeFocusToSlot(currentSelectedSlot + 1, convergence);
 		if (mInputProcessor.getCurrentSelectedSlot() == currentSelectedSlot) {
 			endSlideshow();
-			sHud.setAlpha(1.0f);
+			mHud.setAlpha(1.0f);
 		}
 		return retVal;
 	}
@@ -1070,7 +1068,7 @@
 			DisplayItem displayItem = sDisplayItems[index * MAX_ITEMS_PER_SLOT];
 			if (displayItem != null) {
 				MediaItem item = displayItem.mItemRef;
-				sHud.fullscreenSelectionChanged(item, slotId + 1, sCompleteRange.end + 1);
+				mHud.fullscreenSelectionChanged(item, slotId + 1, sCompleteRange.end + 1);
 				if (slotId != Shared.INVALID && slotId <= sCompleteRange.end) {
 					mInputProcessor.setCurrentFocusSlot(slotId);
 					centerCameraForSlot(slotId, convergence);
@@ -1106,7 +1104,7 @@
 
 	public void deselectOrCancelSelectMode() {
 		if (sBucketList.size() == 0) {
-			sHud.cancelSelection();
+			mHud.cancelSelection();
 		} else {
 			sBucketList.clear();
 			updateCountOfSelectedItems();
@@ -1114,7 +1112,7 @@
 	}
 
 	public void deselectAll() {
-		sHud.cancelSelection();
+		mHud.cancelSelection();
 		sBucketList.clear();
 		updateCountOfSelectedItems();
 	}
@@ -1141,11 +1139,11 @@
 					deselectAll();
 			}
 		}
-		sHud.computeBottomMenu();
+		mHud.computeBottomMenu();
 	}
 
 	private void updateCountOfSelectedItems() {
-		sHud.updateNumItemsSelected(sBucketList.size());
+		mHud.updateNumItemsSelected(sBucketList.size());
 	}
 
 	public int getMetadataSlotIndexForScreenPosition(int posX, int posY) {
@@ -1244,7 +1242,7 @@
 		mZoomValue = 1.0f;
 		centerCameraForSlot(mInputProcessor.getCurrentSelectedSlot(), 1.0f);
 		mTimeElapsedSinceView = SLIDESHOW_TRANSITION_TIME - 1.0f;
-		sHud.setAlpha(0);
+		mHud.setAlpha(0);
 		PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
 		mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "GridView.Slideshow");
 		mWakeLock.acquire();
@@ -1252,7 +1250,7 @@
 
 	public void enterSelectionMode() {
 		mSlideshowMode = false;
-		sHud.enterSelectionMode();
+		mHud.enterSelectionMode();
 		int currentSlot = mInputProcessor.getCurrentSelectedSlot();
 		if (currentSlot == Shared.INVALID) {
 			currentSlot = mInputProcessor.getCurrentFocusSlot();
@@ -1275,7 +1273,7 @@
 		if (mZoomValue > 6.0f) {
 			mZoomValue = 6.0f;
 		}
-		sHud.setAlpha(1.0f);
+		mHud.setAlpha(1.0f);
 		centerCameraForSlot(mInputProcessor.getCurrentSelectedSlot(), 1.0f);
 	}
 
@@ -1289,7 +1287,7 @@
 		if (mZoomValue < 1.0f) {
 			mZoomValue = 1.0f;
 		}
-		sHud.setAlpha(1.0f);
+		mHud.setAlpha(1.0f);
 		centerCameraForSlot(mInputProcessor.getCurrentSelectedSlot(), 1.0f);
 	}
 
@@ -1373,16 +1371,16 @@
 
 	public void setPickIntent(boolean b) {
 		mPickIntent = b;
-		sHud.getPathBar().popLabel();
-		sHud.getPathBar().pushLabel(R.drawable.icon_location_small, mContext.getResources().getString(R.string.pick),
+		mHud.getPathBar().popLabel();
+		mHud.getPathBar().pushLabel(R.drawable.icon_location_small, mContext.getResources().getString(R.string.pick),
 		        new Runnable() {
 			        public void run() {
-				        if (sHud.getAlpha() == 1.0f) {
+				        if (mHud.getAlpha() == 1.0f) {
 					        if (!mFeedAboutToChange) {
 						        setState(STATE_MEDIA_SETS);
 					        }
 				        } else {
-					        sHud.setAlpha(1.0f);
+					        mHud.setAlpha(1.0f);
 				        }
 			        }
 		        });
@@ -1398,19 +1396,19 @@
 			mMediaFeed.expandMediaSet(0);
 			setState(STATE_GRID_VIEW);
 			// We need to make sure we haven't pushed the same label twice
-			if (sHud.getPathBar().getNumLevels() == 1) {
-				sHud.getPathBar().pushLabel(R.drawable.icon_folder_small, setName, new Runnable() {
+			if (mHud.getPathBar().getNumLevels() == 1) {
+				mHud.getPathBar().pushLabel(R.drawable.icon_folder_small, setName, new Runnable() {
 					public void run() {
 						if (mFeedAboutToChange) {
 							return;
 						}
-						if (sHud.getAlpha() == 1.0f) {
+						if (mHud.getAlpha() == 1.0f) {
 							disableLocationFiltering();
 							if (mInputProcessor != null)
 								mInputProcessor.clearSelection();
 							setState(STATE_GRID_VIEW);
 						} else {
-							sHud.setAlpha(1.0f);
+							mHud.setAlpha(1.0f);
 						}
 					}
 				});
diff --git a/src/com/cooliris/media/HudLayer.java b/src/com/cooliris/media/HudLayer.java
index d7db544..433aaa0 100644
--- a/src/com/cooliris/media/HudLayer.java
+++ b/src/com/cooliris/media/HudLayer.java
@@ -29,8 +29,8 @@
     private final ImageButton mTopRightButton = new ImageButton();
     private final ImageButton mZoomInButton = new ImageButton();
     private final ImageButton mZoomOutButton = new ImageButton();
-    private static PathBarLayer sPathBar;
-    private static TimeBar sTimeBar;
+    private PathBarLayer mPathBar;
+    private TimeBar mTimeBar;
     private MenuBar.Menu[] mNormalBottomMenu = null;
     private MenuBar.Menu[] mSingleViewIntentBottomMenu = null;
     private final MenuBar mSelectionMenuBottom;
@@ -103,9 +103,9 @@
 
     HudLayer(Context context) {
         mAlpha = 1.0f;
-        if (sTimeBar == null) {
-            sTimeBar = new TimeBar(context);
-            sPathBar = new PathBarLayer();
+        if (mTimeBar == null) {
+            mTimeBar = new TimeBar(context);
+            mPathBar = new PathBarLayer();
         }
         mTopRightButton.setSize((int) (100 * Gallery.PIXEL_DENSITY), (int) (94 * Gallery.PIXEL_DENSITY));
 
@@ -191,7 +191,7 @@
     public void setContext(Context context) {
         if (mContext != context) {
             mContext = context;
-            sTimeBar.regenerateStringsForContext(context);
+            mTimeBar.regenerateStringsForContext(context);
         }
     }
 
@@ -416,8 +416,8 @@
         final float height = mHeight;
         closeSelectionMenu();
 
-        sTimeBar.setPosition(0f, height - TimeBar.HEIGHT * Gallery.PIXEL_DENSITY);
-        sTimeBar.setSize(width, TimeBar.HEIGHT * Gallery.PIXEL_DENSITY);
+        mTimeBar.setPosition(0f, height - TimeBar.HEIGHT * Gallery.PIXEL_DENSITY);
+        mTimeBar.setSize(width, TimeBar.HEIGHT * Gallery.PIXEL_DENSITY);
         mSelectionMenuTop.setPosition(0f, 0);
         mSelectionMenuTop.setSize(width, MenuBar.HEIGHT * Gallery.PIXEL_DENSITY);
         mSelectionMenuBottom.setPosition(0f, height - MenuBar.HEIGHT * Gallery.PIXEL_DENSITY);
@@ -426,7 +426,7 @@
         mFullscreenMenu.setPosition(0f, height - MenuBar.HEIGHT * Gallery.PIXEL_DENSITY);
         mFullscreenMenu.setSize(width, MenuBar.HEIGHT * Gallery.PIXEL_DENSITY);
 
-        sPathBar.setPosition(0f, -4f * Gallery.PIXEL_DENSITY);
+        mPathBar.setPosition(0f, -4f * Gallery.PIXEL_DENSITY);
         computeSizeForPathbar();
 
         mTopRightButton.setPosition(width - mTopRightButton.getWidth(), 0f);
@@ -438,12 +438,12 @@
         float pathBarWidth = mWidth
                 - ((mGridLayer.getState() == GridLayer.STATE_FULL_SCREEN) ? 32 * Gallery.PIXEL_DENSITY
                         : 120 * Gallery.PIXEL_DENSITY);
-        sPathBar.setSize(pathBarWidth, FloatMath.ceil(39 * Gallery.PIXEL_DENSITY));
-        sPathBar.recomputeComponents();
+        mPathBar.setSize(pathBarWidth, FloatMath.ceil(39 * Gallery.PIXEL_DENSITY));
+        mPathBar.recomputeComponents();
     }
 
     public void setFeed(MediaFeed feed, int state, boolean needsLayout) {
-        sTimeBar.setFeed(feed, state, needsLayout);
+        mTimeBar.setFeed(feed, state, needsLayout);
     }
 
     public void onGridStateChanged() {
@@ -465,11 +465,11 @@
         mZoomOutButton.setHidden(mFullscreenMenu.isHidden());
 
         // Show the time bar in stack and grid states, except in selection mode.
-        sTimeBar.setHidden(fullscreenMode || selectionMode || stackMode);
+        mTimeBar.setHidden(fullscreenMode || selectionMode || stackMode);
         // mTimeBar.setHidden(selectionMode || (state != GridLayer.STATE_TIMELINE && state != GridLayer.STATE_GRID_VIEW));
 
         // Hide the path bar and top-right button in selection mode.
-        sPathBar.setHidden(selectionMode);
+        mPathBar.setHidden(selectionMode);
         mTopRightButton.setHidden(selectionMode || fullscreenMode);
         computeSizeForPathbar();
 
@@ -505,11 +505,11 @@
     }
 
     public TimeBar getTimeBar() {
-        return sTimeBar;
+        return mTimeBar;
     }
 
     public PathBarLayer getPathBar() {
-        return sPathBar;
+        return mPathBar;
     }
 
     public GridLayer getGridLayer() {
@@ -576,11 +576,11 @@
         mTopRightButton.generate(view, lists);
         mZoomInButton.generate(view, lists);
         mZoomOutButton.generate(view, lists);
-        sTimeBar.generate(view, lists);
+        mTimeBar.generate(view, lists);
         mSelectionMenuTop.generate(view, lists);
         mSelectionMenuBottom.generate(view, lists);
         mFullscreenMenu.generate(view, lists);
-        sPathBar.generate(view, lists);
+        mPathBar.generate(view, lists);
         // mLoadingLayer.generate(view, lists);
         mView = view;
     }
@@ -619,7 +619,7 @@
 
     void reset() {
         mLoadingLayer.reset();
-        sTimeBar.regenerateStringsForContext(mContext);
+        mTimeBar.regenerateStringsForContext(mContext);
     }
 
     public void fullscreenSelectionChanged(MediaItem item, int index, int count) {
@@ -633,7 +633,7 @@
         mCachedCaption = item.mCaption;
         mCachedPosition = location;
         mCachedCurrentLabel = location;
-        sPathBar.changeLabel(location);
+        mPathBar.changeLabel(location);
     }
 
     private void updateShareMenu() {
@@ -745,7 +745,7 @@
 
     public void swapFullscreenLabel() {
         mCachedCurrentLabel = (mCachedCurrentLabel == mCachedCaption || mCachedCaption == null) ? mCachedPosition : mCachedCaption;
-        sPathBar.changeLabel(mCachedCurrentLabel);
+        mPathBar.changeLabel(mCachedCurrentLabel);
     }
 
     public void clear() {
diff --git a/src/com/cooliris/media/MediaFeed.java b/src/com/cooliris/media/MediaFeed.java
index b10187a..a72a9c6 100644
--- a/src/com/cooliris/media/MediaFeed.java
+++ b/src/com/cooliris/media/MediaFeed.java
@@ -242,7 +242,9 @@
     }
 
     public void removeMediaSet(MediaSet set) {
-        mMediaSets.remove(set);
+        synchronized (mMediaSets) {
+        	mMediaSets.remove(set);
+        }
         mMediaFeedNeedsToRun = true;
     }
 
@@ -434,7 +436,7 @@
                     }
                     if (expandedSetIndex == Shared.INVALID) {
                         // We purge the sets outside this visibleRange.
-                        int numSets = mMediaSets.size();
+                        int numSets = mediaSets.size();
                         IndexRange visibleRange = mVisibleRange;
                         IndexRange bufferedRange = mBufferedRange;
                         boolean scanMediaSets = true;
@@ -463,7 +465,7 @@
                                 }
                             }
                         }
-                        numSets = mMediaSets.size();
+                        numSets = mediaSets.size();
                         for (int i = 0; i < numSets; ++i) {
                             MediaSet set = mediaSets.get(i);
                             if (i >= bufferedRange.begin && i <= bufferedRange.end) {
diff --git a/src/com/cooliris/media/MediaSet.java b/src/com/cooliris/media/MediaSet.java
index 56c3893..b929d73 100644
--- a/src/com/cooliris/media/MediaSet.java
+++ b/src/com/cooliris/media/MediaSet.java
@@ -167,12 +167,12 @@
                 mMaxTimestamp = dateTaken;
             }
         } else if (item.isDateAddedValid()) {
-            long dateTaken = item.mDateAddedInSec * 1000;
-            if (dateTaken < mMinAddedTimestamp) {
-                mMinAddedTimestamp = dateTaken;
+            long dateAdded = item.mDateAddedInSec * 1000;
+            if (dateAdded < mMinAddedTimestamp) {
+                mMinAddedTimestamp = dateAdded;
             }
-            if (dateTaken > mMaxAddedTimestamp) {
-                mMaxAddedTimestamp = dateTaken;
+            if (dateAdded > mMaxAddedTimestamp) {
+                mMaxAddedTimestamp = dateAdded;
             }            
         }
 
diff --git a/src/com/cooliris/media/RenderView.java b/src/com/cooliris/media/RenderView.java
index d7f386e..dada58f 100644
--- a/src/com/cooliris/media/RenderView.java
+++ b/src/com/cooliris/media/RenderView.java
@@ -864,6 +864,8 @@
             return false;
         }
         // Wait for the render thread to process this event.
+        if (mTouchEventQueue.size() > 8 && event.getAction() == MotionEvent.ACTION_MOVE)
+        	return true;
         synchronized (mTouchEventQueue) {
             MotionEvent eventCopy = MotionEvent.obtain(event);
             mTouchEventQueue.addLast(eventCopy);
diff --git a/src/com/cooliris/media/SingleDataSource.java b/src/com/cooliris/media/SingleDataSource.java
index b0ae940..646f3f1 100644
--- a/src/com/cooliris/media/SingleDataSource.java
+++ b/src/com/cooliris/media/SingleDataSource.java
@@ -60,8 +60,12 @@
     public void shutdown() {
 
     }
+    
+    public boolean isSingleImage() {
+    	return mSingleUri;
+    }
 
-    public static boolean isSingleImageMode(String uriString) {
+    private static boolean isSingleImageMode(String uriString) {
         return !uriString.equals(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString())
                 && !uriString.equals(MediaStore.Images.Media.INTERNAL_CONTENT_URI.toString());
     }
