diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,28 @@
 Brick changelog
 ---------------
 
+0.9
+---
+
+Package changes:
+ * Depend on text-zipper 0.7.1
+
+API changes:
+ * The editor widget state value is now polymorphic over the type of
+   "string" value that can be edited, so you can now create editors over
+   Text values as well as Strings. This is a breaking change but it only
+   requires the addition of the string type variable to any uses of
+   Editor. (thanks Jason Dagit and Getty Ritter)
+ * Added some missing Eq and Show instances (thanks Grégoire Charvet)
+
+New features:
+ * The editor now binds Control-U to delete to beginning of line (thanks
+   Hans-Peter Deifel)
+
+Bug fixes:
+ * List: avoid runtime exception by ensuring item height is always at
+   least 1
+
 0.8
 ---
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 brick
 -----
 
-[![Build Status](https://travis-ci.org/jtdaugherty/brick.png)](https://travis-ci.org/jtdaugherty/brick)
+[![Build Status](https://travis-ci.org/jtdaugherty/brick.svg?branch=master)](https://travis-ci.org/jtdaugherty/brick)
 
 `brick` is a terminal user interface programming
 library written in Haskell, in the style of
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.8
+version:             0.9
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
@@ -88,7 +88,7 @@
                        vector,
                        contravariant,
                        text,
-                       text-zipper >= 0.2.1,
+                       text-zipper >= 0.7.1,
                        template-haskell,
                        deepseq >= 1.3 && < 1.5
 
diff --git a/docs/guide.rst b/docs/guide.rst
--- a/docs/guide.rst
+++ b/docs/guide.rst
@@ -247,7 +247,7 @@
 .. code:: haskell
 
    data Name = Edit1
-   type MyState = Edit Name
+   type MyState = Editor String Name
 
    myEvent :: MyState -> e -> EventM Name (Next MyState)
    myEvent s e = continue =<< handleEditorEvent e s
@@ -262,7 +262,7 @@
 .. code:: haskell
 
    data Name = Edit1
-   data MyState = MyState { _theEdit :: Edit Name
+   data MyState = MyState { _theEdit :: Editor String Name
                           }
    makeLenses ''MyState
 
diff --git a/programs/EditDemo.hs b/programs/EditDemo.hs
--- a/programs/EditDemo.hs
+++ b/programs/EditDemo.hs
@@ -28,8 +28,8 @@
 
 data St =
     St { _focusRing :: F.FocusRing Name
-       , _edit1 :: E.Editor Name
-       , _edit2 :: E.Editor Name
+       , _edit1 :: E.Editor String Name
+       , _edit2 :: E.Editor String Name
        }
 
 makeLenses ''St
diff --git a/src/Brick/Types/Internal.hs b/src/Brick/Types/Internal.hs
--- a/src/Brick/Types/Internal.hs
+++ b/src/Brick/Types/Internal.hs
@@ -64,7 +64,7 @@
     VR { vrPosition :: Location
        , vrSize :: DisplayRegion
        }
-       deriving Show
+       deriving (Show, Eq)
 
 -- | Describes the state of a viewport as it appears as its most recent
 -- rendering.
@@ -86,7 +86,7 @@
                   -- ^ Viewports of this type are scrollable only horizontally.
                   | Both
                   -- ^ Viewports of this type are scrollable vertically and horizontally.
-                  deriving Show
+                  deriving (Show, Eq)
 
 type EventState n = [(n, ScrollRequest)]
 
@@ -101,12 +101,13 @@
                -- ^ Up/left
                | Down
                -- ^ Down/right
+               deriving (Show, Eq)
 
 -- | A terminal screen location.
 data Location = Location { loc :: (Int, Int)
                          -- ^ (Column, Row)
                          }
-                deriving Show
+                deriving (Show, Eq)
 
 suffixLenses ''Location
 
@@ -150,7 +151,7 @@
 
 -- | The rendering context. This tells widgets how to render: how much
 -- space they have in which to render, which attribute they should use
--- to render, which bordring style should be used, and the attribute map
+-- to render, which bordering style should be used, and the attribute map
 -- available for rendering.
 data Context =
     Context { ctxAttrName :: AttrName
@@ -159,6 +160,7 @@
             , ctxBorderStyle :: BorderStyle
             , ctxAttrMap :: AttrMap
             }
+            deriving Show
 
 suffixLenses ''RenderState
 suffixLenses ''VisibilityRequest
diff --git a/src/Brick/Widgets/Border/Style.hs b/src/Brick/Widgets/Border/Style.hs
--- a/src/Brick/Widgets/Border/Style.hs
+++ b/src/Brick/Widgets/Border/Style.hs
@@ -48,7 +48,7 @@
                 , bsVertical :: Char
                 -- ^ Vertical border character
                 }
-                deriving (Show, Read)
+                deriving (Show, Read, Eq)
 
 instance Default BorderStyle where
     def = unicode
diff --git a/src/Brick/Widgets/Edit.hs b/src/Brick/Widgets/Edit.hs
--- a/src/Brick/Widgets/Edit.hs
+++ b/src/Brick/Widgets/Edit.hs
@@ -15,6 +15,7 @@
   ( Editor(editContents, editorName, editDrawContents)
   -- * Constructing an editor
   , editor
+  , editorText
   -- * Reading editor contents
   , getEditContents
   -- * Handling events
@@ -36,12 +37,15 @@
 import Lens.Micro
 import Graphics.Vty (Event(..), Key(..), Modifier(..))
 
-import qualified Data.Text.Zipper as Z
+import qualified Data.Text as T
+import qualified Data.Text.Zipper as Z hiding ( textZipper )
+import qualified Data.Text.Zipper.Generic as Z
 
 import Brick.Types
 import Brick.Widgets.Core
 import Brick.AttrMap
 
+
 -- | Editor state.  Editors support the following events by default:
 --
 -- * Ctrl-a: go to beginning of line
@@ -49,12 +53,13 @@
 -- * Ctrl-d, Del: delete character at cursor position
 -- * Backspace: delete character prior to cursor position
 -- * Ctrl-k: delete all from cursor to end of line
+-- * Ctrl-u: delete all from cursor to beginning of line
 -- * Arrow keys: move cursor
 -- * Enter: break the current line at the cursor position
-data Editor n =
-    Editor { editContents :: Z.TextZipper String
+data Editor t n =
+    Editor { editContents :: Z.TextZipper t
            -- ^ The contents of the editor
-           , editDrawContents :: [String] -> Widget n
+           , editDrawContents :: [t] -> Widget n
            -- ^ The function the editor uses to draw its contents
            , editorName :: n
            -- ^ The name of the editor
@@ -62,16 +67,17 @@
 
 suffixLenses ''Editor
 
-instance Named (Editor n) n where
+instance Named (Editor t n) n where
     getName = editorName
 
-handleEditorEvent :: Event -> Editor n -> EventM n (Editor n)
+handleEditorEvent :: (Eq t, Monoid t) => Event -> Editor t n -> EventM n (Editor t n)
 handleEditorEvent e ed =
         let f = case e of
                   EvKey (KChar 'a') [MCtrl] -> Z.gotoBOL
                   EvKey (KChar 'e') [MCtrl] -> Z.gotoEOL
                   EvKey (KChar 'd') [MCtrl] -> Z.deleteChar
                   EvKey (KChar 'k') [MCtrl] -> Z.killToEOL
+                  EvKey (KChar 'u') [MCtrl] -> Z.killToBOL
                   EvKey KEnter [] -> Z.breakLine
                   EvKey KDel [] -> Z.deleteChar
                   EvKey (KChar c) [] | c /= '\t' -> Z.insertChar c
@@ -83,27 +89,41 @@
                   _ -> id
         in return $ applyEdit f ed
 
--- | Construct an editor.
-editor :: n
+-- | Construct an editor over 'Text' values
+editorText :: n
        -- ^ The editor's name (must be unique)
-       -> ([String] -> Widget n)
+       -> ([T.Text] -> Widget n)
        -- ^ The content rendering function
        -> Maybe Int
        -- ^ The limit on the number of lines in the editor ('Nothing'
        -- means no limit)
-       -> String
+       -> T.Text
        -- ^ The initial content
-       -> Editor n
-editor name draw limit s = Editor (Z.stringZipper (lines s) limit) draw name
+       -> Editor T.Text n
+editorText = editor
 
+-- | Construct an editor over 'String' values
+editor :: Z.GenericTextZipper a
+       => n
+       -- ^ The editor's name (must be unique)
+       -> ([a] -> Widget n)
+       -- ^ The content rendering function
+       -> Maybe Int
+       -- ^ The limit on the number of lines in the editor ('Nothing'
+       -- means no limit)
+       -> a
+       -- ^ The initial content
+       -> Editor a n
+editor name draw limit s = Editor (Z.textZipper (Z.lines s) limit) draw name
+
 -- | Apply an editing operation to the editor's contents. Bear in mind
 -- that you should only apply zipper operations that operate on the
 -- current line; the editor will only ever render the first line of
 -- text.
-applyEdit :: (Z.TextZipper String -> Z.TextZipper String)
+applyEdit :: (Z.TextZipper t -> Z.TextZipper t)
           -- ^ The 'Data.Text.Zipper' editing transformation to apply
-          -> Editor n
-          -> Editor n
+          -> Editor t n
+          -> Editor t n
 applyEdit f e = e & editContentsL %~ f
 
 -- | The attribute assigned to the editor when it does not have focus.
@@ -116,15 +136,15 @@
 editFocusedAttr = editAttr <> "focused"
 
 -- | Get the contents of the editor.
-getEditContents :: Editor n -> [String]
+getEditContents :: Monoid t => Editor t n -> [t]
 getEditContents e = Z.getText $ e^.editContentsL
 
 -- | Turn an editor state value into a widget
-renderEditor :: (Ord n, Show n)
+renderEditor :: (Ord n, Show n, Monoid t)
              => Bool
              -- ^ Whether the editor has focus. It will report a cursor
              -- position if and only if it has focus.
-             -> Editor n
+             -> Editor t n
              -- ^ The editor.
              -> Widget n
 renderEditor foc e =
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
@@ -127,7 +127,8 @@
      -> List n e
 list name es h =
     let selIndex = if V.null es then Nothing else Just 0
-    in List es selIndex name h
+        safeHeight = max 1 h
+    in List es selIndex name safeHeight
 
 -- | Turn a list state value into a widget given an item drawing
 -- function.
