diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,16 @@
 Brick changelog
 ---------------
 
+0.25
+----
+
+API changes:
+ * List: added page movement functions `listMoveByPages`,
+   `listMovePageUp`, and `listMovePageDown` (thanks Richard Alex Hofer)
+
+Miscellaneous:
+ * Fixed a spelling mistake in the AttrMap haddock (thanks Edward Betts)
+
 0.24.2
 ------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -48,8 +48,8 @@
 Featured Projects
 -----------------
 
-To give you an idea of what some people have done with `brick`, take a
-look at these projects:
+To get an idea of what some people have done with `brick`, take a look
+at these projects:
 
  * `tetris`: https://github.com/SamTay/tetris
  * `gotta-go-fast`, a typing tutor: https://github.com/hot-leaf-juice/gotta-go-fast
@@ -58,6 +58,7 @@
  * `matterhorn`, a client for [Mattermost](https://about.mattermost.com/): https://github.com/matterhorn-chat/matterhorn
  * `viewprof`, a GHC profile viewer: https://github.com/maoe/viewprof
  * `tart`, a mouse-driven ASCII art drawing program: https://github.com/jtdaugherty/tart
+ * `silly-joy`, an interpreter for Joy in Haskell: https://github.com/rootmos/silly-joy
 
 Getting Started
 ---------------
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.24.2
+version:             0.25
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
diff --git a/src/Brick/AttrMap.hs b/src/Brick/AttrMap.hs
--- a/src/Brick/AttrMap.hs
+++ b/src/Brick/AttrMap.hs
@@ -53,7 +53,7 @@
 import Graphics.Vty (Attr(..), MaybeDefault(..))
 
 -- | An attribute name. Attribute names are hierarchical; use 'mappend'
--- ('<>') to assemble them. Hierachy in an attribute name is used to
+-- ('<>') to assemble them. Hierarchy in an attribute name is used to
 -- represent increasing levels of specificity in referring to the
 -- attribute you want to use for a visual element, with names to the
 -- left being general and names to the right being more specific. For
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
@@ -31,6 +31,9 @@
   , listMoveTo
   , listMoveUp
   , listMoveDown
+  , listMoveByPages
+  , listMovePageUp
+  , listMovePageDown
   , listInsert
   , listRemove
   , listReplace
@@ -91,16 +94,8 @@
         EvKey KDown [] -> return $ listMoveDown theList
         EvKey KHome [] -> return $ listMoveTo 0 theList
         EvKey KEnd [] -> return $ listMoveTo (V.length $ listElements theList) theList
-        EvKey KPageDown [] -> do
-            v <- lookupViewport (theList^.listNameL)
-            case v of
-                Nothing -> return theList
-                Just vp -> return $ listMoveBy (vp^.vpSize._2 `div` theList^.listItemHeightL) theList
-        EvKey KPageUp [] -> do
-            v <- lookupViewport (theList^.listNameL)
-            case v of
-                Nothing -> return theList
-                Just vp -> return $ listMoveBy (negate $ vp^.vpSize._2 `div` theList^.listItemHeightL) theList
+        EvKey KPageDown [] -> listMovePageDown theList
+        EvKey KPageUp [] -> listMovePageUp theList
         _ -> return theList
 
 -- | The top-level attribute used for the entire list.
@@ -244,10 +239,29 @@
 listMoveUp :: List n e -> List n e
 listMoveUp = listMoveBy (-1)
 
+-- | Move the list selected index up by one page.
+listMovePageUp :: (Ord n) => List n e -> EventM n (List n e)
+listMovePageUp theList = listMoveByPages (-1) theList
+
 -- | Move the list selected index down by one. (Moves the cursor down,
 -- adds one to the index.)
 listMoveDown :: List n e -> List n e
 listMoveDown = listMoveBy 1
+
+-- | Move the list selected index down by one page.
+listMovePageDown :: (Ord n) => List n e -> EventM n (List n e)
+listMovePageDown theList = listMoveByPages 1 theList
+
+-- | Move the list selected index by some (fractional) number of pages.
+listMoveByPages :: (Ord n, RealFrac m) => m -> List n e -> EventM n (List n e)
+listMoveByPages pages theList = do
+    v <- lookupViewport (theList^.listNameL)
+    case v of
+        Nothing -> return theList
+        Just vp -> let
+            nElems = round $ pages * (fromIntegral $ vp^.vpSize._2) / (fromIntegral $ theList^.listItemHeightL)
+          in
+            return $ listMoveBy nElems theList
 
 -- | Move the list selected index by the specified amount, subject to
 -- validation.
