diff --git a/src/Graphics/Vty/Widgets/Core.hs b/src/Graphics/Vty/Widgets/Core.hs
--- a/src/Graphics/Vty/Widgets/Core.hs
+++ b/src/Graphics/Vty/Widgets/Core.hs
@@ -399,13 +399,28 @@
                                 , currentEntryNum = 0
                                 }
 
+  -- Now we need to be sure that we have the event handlers set
+  -- correctly on each widget.  The reason we don't just call
+  -- addToFocusGroup on each entry's widget is because the user may
+  -- have added event handlers to the FocusEntries themselves, and we
+  -- want to preserve those, so we extract the widget from the focus
+  -- entry to add the onGainFocus handler, but use the existing
+  -- FocusEntries when constructing the new focus group.
+  forM_ (zip [0..] aEntries) $ \(i, e) -> do
+    (FocusEntry w) <- state <~ e
+    w `onGainFocus` (const $ setCurrentFocus c i)
+
+  forM_ (zip [(length aEntries)..] bEntries) $ \(i, e) -> do
+    (FocusEntry w) <- state <~ e
+    w `onGainFocus` (const $ setCurrentFocus c i)
+
   return c
 
 resetFocusGroup :: (MonadIO m) => Widget FocusGroup -> m ()
 resetFocusGroup fg = do
   cur <- currentEntryNum <~~ fg
   es <- entries <~~ fg
-  forM_ (zip [1..] es) $ \(i, e) ->
+  forM_ (zip [0..] es) $ \(i, e) ->
       when (i /= cur) $ unfocus e
   when (cur >= 0) $
        focus =<< currentEntry fg
diff --git a/src/Graphics/Vty/Widgets/List.hs b/src/Graphics/Vty/Widgets/List.hs
--- a/src/Graphics/Vty/Widgets/List.hs
+++ b/src/Graphics/Vty/Widgets/List.hs
@@ -149,6 +149,7 @@
   st <- getState list
 
   let numItems = length $ listItems st
+      oldScr = scrollTopIndex st
 
   when (pos < 0 || pos >= numItems) $
        throw $ BadItemIndex pos
@@ -157,9 +158,15 @@
   let (label, w) = listItems st !! pos
       sel = selectedIndex st
 
+      newScrollTop = if pos <= oldScr
+                     then if oldScr == 0
+                          then oldScr
+                          else oldScr - 1
+                     else oldScr
+
       -- If that item is currently selected, select a different item.
       newSelectedIndex = if pos > sel
-                         then pos
+                         then sel
                          else if pos < sel
                               then if sel == 0
                                    then 0
@@ -175,6 +182,7 @@
   updateWidgetState list $ \s -> s { selectedIndex = newSelectedIndex
                                    , listItems = take pos (listItems st) ++
                                                  drop (pos + 1) (listItems st)
+                                   , scrollTopIndex = newScrollTop
                                    }
 
   -- Notify the removal handler.
@@ -262,7 +270,7 @@
 clearList :: (MonadIO m) => Widget (List a b) -> m ()
 clearList w = do
   updateWidgetState w $ \l ->
-      l { selectedIndex = 0
+      l { selectedIndex = (-1)
         , scrollTopIndex = 0
         , listItems = []
         }
diff --git a/vty-ui.cabal b/vty-ui.cabal
--- a/vty-ui.cabal
+++ b/vty-ui.cabal
@@ -1,5 +1,5 @@
 Name:                vty-ui
-Version:             1.0
+Version:             1.0.1
 Synopsis:            An interactive terminal user interface library
                      for Vty
 Description:         An extensible library of user interface widgets
