diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,23 @@
 Brick changelog
 ---------------
 
+0.4
+---
+
+API changes:
+* Added Brick.Widgets.Core.unsafeLookupViewport to make certain kinds
+  of custom widget implementations easier when viewport states are needed
+  (thanks Markus Hauck <markus1189@gmail.com>)
+* List: added listClear and listReverse functions (thanks Markus Hauck)
+* List: Derive instances for Functor, Foldable, Traversable (thanks
+  Markus Hauck)
+
+Documentation changes:
+* Hyperlink "Data.Text.Markup" inside Brick.Markup haddock (thanks
+  Markus Hauck)
+* Fix typo in 'Attribute Management' section of user guide (thanks
+  Markus Hauck)
+
 0.3.1
 -----
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.3.1
+version:             0.4
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
diff --git a/src/Brick/Markup.hs b/src/Brick/Markup.hs
--- a/src/Brick/Markup.hs
+++ b/src/Brick/Markup.hs
@@ -1,5 +1,5 @@
 -- | This module provides an API for turning "markup" values into
--- widgets. This module uses the Data.Text.Markup interface in this
+-- widgets. This module uses the "Data.Text.Markup" interface in this
 -- package to assign attributes to substrings in a text string; to
 -- manipulate markup using (for example) syntax highlighters, see that
 -- module.
diff --git a/src/Brick/Types.hs b/src/Brick/Types.hs
--- a/src/Brick/Types.hs
+++ b/src/Brick/Types.hs
@@ -72,6 +72,7 @@
 import Data.Monoid (Monoid(..))
 import Control.Monad.Trans.State.Lazy
 import Control.Monad.Trans.Reader
+import Control.Monad.Trans.Class (lift)
 import Graphics.Vty (Event, Image, emptyImage, Attr)
 import Data.Default (Default(..))
 import Data.Functor.Contravariant
diff --git a/src/Brick/Widgets/Core.hs b/src/Brick/Widgets/Core.hs
--- a/src/Brick/Widgets/Core.hs
+++ b/src/Brick/Widgets/Core.hs
@@ -30,7 +30,7 @@
   , hLimit
   , vLimit
 
-  -- * Attribute mangement
+  -- * Attribute management
   , withDefAttr
   , withAttr
   , forceAttr
@@ -55,6 +55,7 @@
   , viewport
   , visible
   , visibleRegion
+  , unsafeLookupViewport
 
   -- ** Adding offsets to cursor positions and visibility requests
   , addResultOffset
@@ -628,6 +629,18 @@
                       $ padBottom Max
                       $ padRight Max
                       $ Widget Fixed Fixed $ return $ translated & visibilityRequestsL .~ mempty
+
+-- | Given a name, obtain the viewport for that name by consulting the
+-- viewport map in the rendering monad. NOTE! Some care must be taken
+-- when calling this function, since it only returns useful values
+-- after the viewport in question has been rendered. If you call this
+-- function during rendering before a viewport has been rendered, you
+-- may get nothing or you may get a stale version of the viewport. This
+-- is because viewports are updated during rendering and the one you are
+-- interested in may not have been rendered yet. So if you want to use
+-- this, be sure you know what you are doing.
+unsafeLookupViewport :: Name -> RenderM (Maybe Viewport)
+unsafeLookupViewport name = lift $ gets (M.lookup name . (^.viewportMapL))
 
 scrollTo :: ViewportType -> ScrollRequest -> V.Image -> Viewport -> Viewport
 scrollTo Both _ _ _ = error "BUG: called scrollTo on viewport type 'Both'"
diff --git a/src/Brick/Widgets/List.hs b/src/Brick/Widgets/List.hs
--- a/src/Brick/Widgets/List.hs
+++ b/src/Brick/Widgets/List.hs
@@ -1,6 +1,9 @@
 {-# LANGUAGE TupleSections #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DeriveFunctor #-}
+{-# LANGUAGE DeriveFoldable#-}
+{-# LANGUAGE DeriveTraversable #-}
 -- | This module provides a scrollable list type and functions for
 -- manipulating and rendering it.
 module Brick.Widgets.List
@@ -27,6 +30,8 @@
   , listRemove
   , listReplace
   , listSelectedElement
+  , listClear
+  , listReverse
 
   -- * Attributes
   , listAttr
@@ -34,8 +39,10 @@
   )
 where
 
-import Control.Applicative ((<$>))
-import Control.Lens ((^.), (&), (.~), _2)
+import Control.Applicative ((<$>),(<*>),pure)
+import Control.Lens ((^.), (&), (.~), (%~), _2)
+import Data.Foldable (Foldable)
+import Data.Traversable (Traversable)
 import Data.Maybe (fromMaybe)
 import Data.Monoid ((<>))
 import Graphics.Vty (Event(..), Key(..))
@@ -60,7 +67,7 @@
          , listSelected :: !(Maybe Int)
          , listName :: Name
          , listItemHeight :: Int
-         }
+         } deriving (Functor, Foldable, Traversable)
 
 suffixLenses ''List
 
@@ -227,3 +234,14 @@
 listSelectedElement l = do
   sel <- l^.listSelectedL
   return (sel, (l^.listElementsL) V.! sel)
+
+-- | Remove all elements from the list and clear the selection.
+listClear :: List e -> List e
+listClear l = l & listElementsL .~ V.empty & listSelectedL .~ Nothing
+
+-- | Reverse the list.  The element selected before the reversal will
+-- again be the selected one.
+listReverse :: List e -> List e
+listReverse theList = theList & listElementsL %~ V.reverse & listSelectedL .~ newSel
+  where n = V.length (listElements theList)
+        newSel = (-) <$> pure (n-1) <*> listSelected theList
