diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,3 +1,9 @@
+# 1.2.3
+
+  - Support for brick-0.20
+  - Restore compatibility with brick-0.17
+  - Support for hledger-lib-1.3
+
 # 1.2.2
 
   - Support for megaparsec-5.3.0
diff --git a/hledger-iadd.cabal b/hledger-iadd.cabal
--- a/hledger-iadd.cabal
+++ b/hledger-iadd.cabal
@@ -1,5 +1,5 @@
 name:                hledger-iadd
-version:             1.2.2
+version:             1.2.3
 synopsis:            A terminal UI as drop-in replacement for hledger add
 description:         This is a terminal UI as drop-in replacement for hledger add.
                      .
@@ -26,7 +26,7 @@
 license-file:        LICENSE
 author:              Hans-Peter Deifel <hpd@hpdeifel.de>
 maintainer:          Hans-Peter Deifel <hpd@hpdeifel.de>
-copyright:           2016 Hans-Peter Deifel
+copyright:           2017 Hans-Peter Deifel
 category:            Finance, Console
 build-type:          Simple
 cabal-version:       >=1.10
@@ -56,11 +56,12 @@
                      , Brick.Widgets.Edit.EmacsBindings
   default-language:    Haskell2010
   build-depends:       base >= 4.8 && < 5
-                     , hledger-lib >= 1.0 && < 1.3
-                     , brick >= 0.19 && < 0.20
+                     , hledger-lib >= 1.0 && < 1.4
+                     , brick >= 0.17 && < 0.21
                      , vty >= 5.4
                      , text
                      , microlens
+                     , microlens-th
                      , text-zipper >= 0.10
                      , transformers >= 0.3
                      , time >= 1.5
@@ -81,8 +82,8 @@
   default-language:    Haskell2010
   build-depends:       base >= 4.8 && < 5
                      , hledger-iadd
-                     , hledger-lib >= 1.0 && < 1.3
-                     , brick >= 0.19 && < 0.20
+                     , hledger-lib >= 1.0 && < 1.4
+                     , brick >= 0.17 && < 0.21
                      , vty >= 5.4
                      , text
                      , microlens
@@ -110,7 +111,7 @@
   default-language:   Haskell2010
   build-depends:      base >= 4.8 && < 5
                     , hledger-iadd
-                    , hledger-lib >= 1.0 && < 1.3
+                    , hledger-lib >= 1.0 && < 1.4
                     , text
                     , transformers >= 0.3
                     , time >= 1.5
diff --git a/src/Brick/Widgets/CommentDialog.hs b/src/Brick/Widgets/CommentDialog.hs
--- a/src/Brick/Widgets/CommentDialog.hs
+++ b/src/Brick/Widgets/CommentDialog.hs
@@ -12,7 +12,6 @@
 import           Data.Monoid
 
 import           Brick
-import           Brick.Widgets.Edit hiding (handleEditorEvent)
 import           Brick.Widgets.Dialog
 import           Brick.Widgets.Center
 import           Data.Text.Zipper
@@ -24,7 +23,7 @@
 
 data CommentWidget n = CommentWidget
   { origComment :: Text
-  , textArea :: Editor Text n
+  , textArea :: Editor n
   , dialogWidget :: Dialog ()
   , promptPrefix :: Text
   }
@@ -35,7 +34,7 @@
     title = "ESC: cancel, RET: accept, Alt-RET: New line"
     maxWidth = 80
     diag = dialog (Just title) Nothing maxWidth
-    edit = editorText name Nothing comment
+    edit = editorText name (txt . T.unlines) Nothing comment
   in
     CommentWidget
       { origComment = comment
@@ -62,9 +61,8 @@
 renderCommentWidget widget =
   let
     height = min (length (getEditContents (textArea widget)) + 4) 24
-    drawer = txt . T.unlines
     textArea' =  padTop (Pad 1) $
-      txt (promptPrefix widget <> ": ") <+> renderEditor drawer True (textArea widget)
+      txt (promptPrefix widget <> ": ") <+> renderEditor True (textArea widget)
   in
     vCenterLayer $ vLimit height $ renderDialog (dialogWidget widget) textArea'
 
diff --git a/src/Brick/Widgets/Edit/EmacsBindings.hs b/src/Brick/Widgets/Edit/EmacsBindings.hs
--- a/src/Brick/Widgets/Edit/EmacsBindings.hs
+++ b/src/Brick/Widgets/Edit/EmacsBindings.hs
@@ -1,21 +1,62 @@
+{-# LANGUAGE TemplateHaskell, CPP #-}
+
 -- | Widget like "Brick.Widgets.Edit", but with more emacs style keybindings.
 --
+-- This is also a complete wrapper around the "Brick.Widgets.Edit" API to retain
+-- compatability with older brick versions.
+--
 -- See 'handleEditorEvent' for a list of added keybindings.
 module Brick.Widgets.Edit.EmacsBindings
-  ( handleEditorEvent
-  , module Brick.Widgets.Edit
+  ( Editor
+  , editorText
+  , getEditContents
+  , applyEdit
+  , editContentsL
+  , handleEditorEvent
+  , renderEditor
   ) where
 
 import           Brick
 import           Graphics.Vty
 import qualified Brick.Widgets.Edit as E
-import           Brick.Widgets.Edit hiding (handleEditorEvent)
 import           Data.Text.Zipper
-import           Data.Text.Zipper.Generic (GenericTextZipper)
+import           Data.Text (Text)
+import           Lens.Micro.TH
+import           Lens.Micro
 
 import           Data.Text.Zipper.Generic.Words
 
--- | Same as 'E.handleEditorEvent', but with more emacs-style keybindings
+-- | Wrapper around 'E.Editor', but specialized to 'Text'
+data Editor n = Editor {
+  _origEditor :: E.Editor Text n,
+  _drawingFunction :: [Text] -> Widget n
+}
+
+makeLenses ''Editor
+
+-- | Wrapper for 'E.editorText' specialized to 'Text'
+editorText :: n -> ([Text] -> Widget n)-> Maybe Int -> Text -> Editor n
+editorText name draw linum content =
+#if MIN_VERSION_brick(0,19,0)
+  Editor (E.editorText name linum content) draw
+#else
+  Editor (E.editorText name draw linum content) draw
+#endif
+
+-- | Wrapper for 'E.getEditContents' specialized to 'Text'
+getEditContents :: Editor n -> [Text]
+getEditContents edit = edit ^. origEditor . to E.getEditContents
+
+-- | Wrapper for 'E.applyEdit' specialized to 'Text'
+applyEdit :: (TextZipper Text -> TextZipper Text) -> Editor n -> Editor n
+applyEdit f = over origEditor (E.applyEdit f)
+
+-- | Wrapper for 'E.editContentsL' specialized to 'Text'
+editContentsL :: Lens (Editor n) (Editor n) (TextZipper Text) (TextZipper Text)
+editContentsL = origEditor . E.editContentsL
+
+-- | Same as 'E.handleEditorEvent', but with more emacs-style keybindings and
+-- specialized to 'Text'
 --
 -- Specifically:
 --
@@ -26,7 +67,7 @@
 --  - Alt-Backspace: Delete the previous word
 --  - Ctrl-w: Delete the previous word
 --  - Alt-d: Delete the next word
-handleEditorEvent :: (Eq t, GenericTextZipper t) => Event -> Editor t n -> EventM n (Editor t n)
+handleEditorEvent :: Event -> Editor n -> EventM n (Editor n)
 handleEditorEvent event edit = case event of
   EvKey (KChar 'f') [MCtrl] -> return $ applyEdit moveRight edit
   EvKey (KChar 'b') [MCtrl] -> return $ applyEdit moveLeft edit
@@ -41,4 +82,16 @@
   EvKey KHome       []      -> return $ applyEdit gotoBOL edit
   EvKey KEnd        []      -> return $ applyEdit gotoEOL edit
 
-  _ -> E.handleEditorEvent event edit
+  _ -> do
+    newOrig <- E.handleEditorEvent event (edit^.origEditor)
+    return $ edit & origEditor .~ newOrig
+
+
+-- | Wrapper for 'E.renderEditor' specialized to 'Text'
+renderEditor :: (Ord n, Show n) => Bool -> Editor n -> Widget n
+renderEditor focus edit =
+#if MIN_VERSION_brick(0,19,0)
+  E.renderEditor (edit^.drawingFunction) focus (edit^.origEditor)
+#else
+  E.renderEditor focus (edit^.origEditor)
+#endif
diff --git a/src/Brick/Widgets/WrappedText.hs b/src/Brick/Widgets/WrappedText.hs
--- a/src/Brick/Widgets/WrappedText.hs
+++ b/src/Brick/Widgets/WrappedText.hs
@@ -1,3 +1,4 @@
+-- | TODO Use the built-in wrapping feature in brick-0.20
 module Brick.Widgets.WrappedText (wrappedText) where
 
 import           Brick
diff --git a/src/main/Main.hs b/src/main/Main.hs
--- a/src/main/Main.hs
+++ b/src/main/Main.hs
@@ -49,7 +49,7 @@
 import qualified Paths_hledger_iadd as Paths
 
 data AppState = AppState
-  { asEditor :: Editor Text Name
+  { asEditor :: Editor Name
   , asStep :: Step
   , asJournal :: HL.Journal
   , asContext :: List Name Text
@@ -118,7 +118,7 @@
           <=> (viewQuestion (asStep as)
                <+> viewSuggestion (asSuggestion as)
                <+> txt ": "
-               <+> renderEditor (txt . T.concat) True (asEditor as))
+               <+> renderEditor True (asEditor as))
           <=> hBorder
           <=> expand (viewContext (asContext as))
           <=> hBorder
@@ -314,10 +314,10 @@
   , (helpAttr <> "title", fg green)
   ]
 
-clearEdit :: Editor Text n -> Editor Text n
+clearEdit :: Editor n -> Editor n
 clearEdit = setEdit ""
 
-setEdit :: Text -> Editor Text n -> Editor Text n
+setEdit :: Text -> Editor n -> Editor n
 setEdit content edit = edit & editContentsL .~ zipper
   where zipper = gotoEOL (textZipper [content] (Just 1))
 
@@ -501,7 +501,7 @@
   runExceptT (HL.parseAndFinaliseJournal HL.journalp True path journalContents) >>= \case
     Left err -> hPutStrLn stderr err >> exitFailure
     Right journal -> do
-      let edit = editor EditorName (Just 1) ""
+      let edit = editorText EditorName (txt . T.concat) (Just 1) ""
 
       sugg <- suggest journal date (DateQuestion "")
 
diff --git a/tests/ModelSpec.hs b/tests/ModelSpec.hs
--- a/tests/ModelSpec.hs
+++ b/tests/ModelSpec.hs
@@ -148,18 +148,10 @@
   foldl (\j t -> HL.addTransaction (mkTransaction t) j) HL.nulljournal transactions
 
 mkTransaction :: (Date, Text, [(Text, Int)]) -> HL.Transaction
-mkTransaction ((year,month,day), desc, postings) = HL.Transaction
-  { HL.tindex = 0
-  , HL.tsourcepos = undefined
-  , HL.tdate = fromGregorian year month day
-  , HL.tdate2 = Nothing
-  , HL.tstatus = HL.Uncleared
-  , HL.tcode = ""
+mkTransaction ((year,month,day), desc, postings) = HL.nulltransaction
+  { HL.tdate = fromGregorian year month day
   , HL.tdescription = desc
-  , HL.tcomment = ""
-  , HL.ttags = []
   , HL.tpostings = map mkPosting postings
-  , HL.tpreceding_comment_lines = ""
   }
 
   where
