diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseList.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseList.java
index 1f3f8ec..0eb922d 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseList.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseList.java
@@ -54,8 +54,8 @@
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.view.client.AsyncListViewAdapter;
 import com.google.gwt.view.client.ListView;
+import com.google.gwt.view.client.NoSelectionModel;
 import com.google.gwt.view.client.Range;
-import com.google.gwt.view.client.SingleSelectionModel;
 import com.google.gwt.view.client.SelectionModel.SelectionChangeEvent;
 import com.google.gwt.view.client.SelectionModel.SelectionChangeHandler;
 
@@ -465,12 +465,12 @@
     table.addColumnStyleName(5, common.spacerColumn());
 
     // Add a selection model.
-    final SingleSelectionModel<ReportRecord> selectionModel = new SingleSelectionModel<ReportRecord>();
+    final NoSelectionModel<ReportRecord> selectionModel = new NoSelectionModel<ReportRecord>();
     table.setSelectionModel(selectionModel);
     table.setSelectionEnabled(true);
     selectionModel.addSelectionChangeHandler(new SelectionChangeHandler() {
       public void onSelectionChange(SelectionChangeEvent event) {
-        Object selected = selectionModel.getSelectedObject();
+        Object selected = selectionModel.getLastSelectedObject();
         if (selected != null && listener != null) {
           listener.onReportSelected((ReportRecord) selected);
         }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseList.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseList.java
index 13083ea..e0c5c7b 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseList.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseList.java
@@ -27,8 +27,8 @@
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.view.client.AsyncListViewAdapter;
 import com.google.gwt.view.client.ListView;
+import com.google.gwt.view.client.NoSelectionModel;
 import com.google.gwt.view.client.SelectionModel;
-import com.google.gwt.view.client.SingleSelectionModel;
 import com.google.gwt.view.client.SelectionModel.SelectionChangeEvent;
 
 import java.util.ArrayList;
@@ -96,7 +96,7 @@
   private final ExpensesRequestFactory requestFactory;
   private final CellList<ExpenseRecord> expenseList;
   private final AsyncListViewAdapter<ExpenseRecord> expenseAdapter;
-  private final SingleSelectionModel<ExpenseRecord> expenseSelection;
+  private final NoSelectionModel<ExpenseRecord> expenseSelection;
 
   /**
    * The set of Expense keys that we already know are denied. When a new key is
@@ -136,11 +136,11 @@
 
     expenseList = new CellList<ExpenseRecord>(new ExpenseCell());
 
-    expenseSelection = new SingleSelectionModel<ExpenseRecord>();
+    expenseSelection = new NoSelectionModel<ExpenseRecord>();
     expenseList.setSelectionModel(expenseSelection);
     expenseSelection.addSelectionChangeHandler(new SelectionModel.SelectionChangeHandler() {
       public void onSelectionChange(SelectionChangeEvent event) {
-        listener.onExpenseSelected(expenseSelection.getSelectedObject());
+        listener.onExpenseSelected(expenseSelection.getLastSelectedObject());
       }
     });
 
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportList.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportList.java
index 75d3927..4ebae64 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportList.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportList.java
@@ -25,8 +25,8 @@
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.view.client.AsyncListViewAdapter;
 import com.google.gwt.view.client.ListView;
+import com.google.gwt.view.client.NoSelectionModel;
 import com.google.gwt.view.client.SelectionModel;
-import com.google.gwt.view.client.SingleSelectionModel;
 import com.google.gwt.view.client.SelectionModel.SelectionChangeEvent;
 
 import java.util.ArrayList;
@@ -56,7 +56,7 @@
   private final Listener listener;
   private final CellList<ReportRecord> reportList;
   private final AsyncListViewAdapter<ReportRecord> reportAdapter;
-  private final SingleSelectionModel<ReportRecord> reportSelection;
+  private final NoSelectionModel<ReportRecord> reportSelection;
   private final ExpensesRequestFactory requestFactory;
 
   public MobileReportList(final Listener listener,
@@ -79,11 +79,11 @@
       }
     });
 
-    reportSelection = new SingleSelectionModel<ReportRecord>();
+    reportSelection = new NoSelectionModel<ReportRecord>();
     reportSelection.setKeyProvider(Expenses.REPORT_RECORD_KEY_PROVIDER);
     reportSelection.addSelectionChangeHandler(new SelectionModel.SelectionChangeHandler() {
       public void onSelectionChange(SelectionChangeEvent event) {
-        listener.onReportSelected(reportSelection.getSelectedObject());
+        listener.onReportSelected(reportSelection.getLastSelectedObject());
       }
     });
 
diff --git a/user/src/com/google/gwt/view/client/NoSelectionModel.java b/user/src/com/google/gwt/view/client/NoSelectionModel.java
new file mode 100644
index 0000000..11fe1ac
--- /dev/null
+++ b/user/src/com/google/gwt/view/client/NoSelectionModel.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * 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.google.gwt.view.client;
+
+import com.google.gwt.view.client.SelectionModel.AbstractSelectionModel;
+
+/**
+ * A selection model that does not allow selection, but fires selection change
+ * events. Use this model if you want to know when a user selects an item, but
+ * do not want the view to update based on the selection.
+ * 
+ * <p>
+ * Note: This class is new and its interface subject to change.
+ * </p>
+ * 
+ * @param <T> the record data type
+ */
+public class NoSelectionModel<T> extends AbstractSelectionModel<T> {
+
+  private Object lastKey;
+  private T lastSelection;
+
+  /**
+   * Gets the object that was last selected.
+   * 
+   * @return the last selected object
+   */
+  public T getLastSelectedObject() {
+    return lastSelection;
+  }
+
+  public boolean isSelected(T object) {
+    return false;
+  }
+
+  public void setSelected(T object, boolean selected) {
+    Object key = getKey(object);
+    if (selected) {
+      lastSelection = object;
+      lastKey = key;
+    } else if (lastKey != null && lastKey.equals(key)) {
+      lastSelection = null;
+      lastKey = null;
+    }
+    scheduleSelectionChangeEvent();
+  }
+}
diff --git a/user/test/com/google/gwt/view/ViewSuite.java b/user/test/com/google/gwt/view/ViewSuite.java
index 688b460..25fef3b 100644
--- a/user/test/com/google/gwt/view/ViewSuite.java
+++ b/user/test/com/google/gwt/view/ViewSuite.java
@@ -23,6 +23,7 @@
 import com.google.gwt.view.client.DefaultSelectionModelTest;
 import com.google.gwt.view.client.ListViewAdapterTest;
 import com.google.gwt.view.client.MultiSelectionModelTest;
+import com.google.gwt.view.client.NoSelectionModelTest;
 import com.google.gwt.view.client.RangeTest;
 import com.google.gwt.view.client.SingleSelectionModelTest;
 
@@ -42,6 +43,7 @@
     suite.addTestSuite(DefaultSelectionModelTest.class);
     suite.addTestSuite(ListViewAdapterTest.class);
     suite.addTestSuite(MultiSelectionModelTest.class);
+    suite.addTestSuite(NoSelectionModelTest.class);
     suite.addTestSuite(RangeTest.class);
     suite.addTestSuite(SingleSelectionModelTest.class);
     return suite;
diff --git a/user/test/com/google/gwt/view/client/NoSelectionModelTest.java b/user/test/com/google/gwt/view/client/NoSelectionModelTest.java
new file mode 100644
index 0000000..615087f
--- /dev/null
+++ b/user/test/com/google/gwt/view/client/NoSelectionModelTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * 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.google.gwt.view.client;
+
+import com.google.gwt.view.client.SelectionModel.SelectionChangeEvent;
+import com.google.gwt.view.client.SelectionModel.SelectionChangeHandler;
+
+/**
+ * Tests for {@link NoSelectionModel}.
+ */
+public class NoSelectionModelTest extends AbstractSelectionModelTest {
+
+  public void testGetLastSelectedObject() {
+    NoSelectionModel<String> model = createSelectionModel();
+    assertNull(model.getLastSelectedObject());
+
+    model.setSelected("test", true);
+    assertEquals("test", model.getLastSelectedObject());
+
+    model.setSelected("test", false);
+    assertNull(model.getLastSelectedObject());
+  }
+
+  public void testSelectedChangeEvent() {
+    NoSelectionModel<String> model = createSelectionModel();
+    SelectionChangeHandler handler = new SelectionChangeHandler() {
+      public void onSelectionChange(SelectionChangeEvent event) {
+        finishTest();
+      }
+    };
+    model.addSelectionChangeHandler(handler);
+
+    delayTestFinish(2000);
+    model.setSelected("test", true);
+  }
+
+  public void testSetSelected() {
+    NoSelectionModel<String> model = createSelectionModel();
+    assertFalse(model.isSelected("test0"));
+
+    model.setSelected("test0", true);
+    assertFalse(model.isSelected("test0"));
+
+    model.setSelected("test1", true);
+    assertFalse(model.isSelected("test1"));
+  }
+
+  public void testSetSelectedWithKeyProvider() {
+    NoSelectionModel<String> model = createSelectionModel();
+    ProvidesKey<String> keyProvider = new ProvidesKey<String>() {
+      public Object getKey(String item) {
+        return item.toUpperCase();
+      }
+    };
+    model.setKeyProvider(keyProvider);
+    assertFalse(model.isSelected("test0"));
+
+    model.setSelected("test0", true);
+    assertEquals("test0", model.getLastSelectedObject());
+    assertFalse(model.isSelected("test0"));
+    assertFalse(model.isSelected("TEST0"));
+
+    model.setSelected("test1", true);
+    assertEquals("test1", model.getLastSelectedObject());
+    assertFalse(model.isSelected("test1"));
+    assertFalse(model.isSelected("TEST1"));
+    assertFalse(model.isSelected("test0"));
+  }
+
+  @Override
+  protected NoSelectionModel<String> createSelectionModel() {
+    return new NoSelectionModel<String>();
+  }
+}
