diff --git a/app/Types.hs b/app/Types.hs
new file mode 100644
--- /dev/null
+++ b/app/Types.hs
@@ -0,0 +1,11 @@
+module Types
+( AppException(..)
+) where
+
+
+import ClassyPrelude
+
+import Control.Exception.Safe (Exception(..))
+
+data AppException = MPDException | UnknownException deriving (Show, Typeable)
+instance Exception AppException
diff --git a/app/UI.hs b/app/UI.hs
--- a/app/UI.hs
+++ b/app/UI.hs
@@ -6,8 +6,6 @@
 import Library
 import UI.Types
 
-import Control.Concurrent.Async (async)
-
 import Lens.Micro.Platform ((^.), (&), (.~), (%~))
 
 import qualified UI.Utils as Utils
diff --git a/app/UI/Views/Main.hs b/app/UI/Views/Main.hs
--- a/app/UI/Views/Main.hs
+++ b/app/UI/Views/Main.hs
@@ -14,7 +14,6 @@
 
 import qualified UI.Widgets.Status as Status
 import qualified UI.Widgets.Help as Help
-import qualified UI.Widgets.Command as Command
 import qualified UI.Widgets.Notification as Notification
 import UI.Widgets.Playlist (playingSongL)
 
@@ -34,6 +33,5 @@
                   , hCenter widget
                   , view
                   , Notification.mkWidget (state^.notificationState)
-                  -- , Command.mkWidget
                   ]
 
diff --git a/app/UI/Widgets/Command.hs b/app/UI/Widgets/Command.hs
deleted file mode 100644
--- a/app/UI/Widgets/Command.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module UI.Widgets.Command
-( mkWidget
-) where
-
-import ClassyPrelude
-
-import Brick.Types (Widget)
-import Brick.Widgets.Core (str)
-import Brick.Widgets.Center (hCenter)
-
-import UI.Types (UIName)
-
-mkWidget :: Widget UIName
-mkWidget = hCenter $ str "Command"
diff --git a/app/UI/Widgets/Filter.hs b/app/UI/Widgets/Filter.hs
new file mode 100644
--- /dev/null
+++ b/app/UI/Widgets/Filter.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE TemplateHaskell #-}
+module UI.Widgets.Filter
+( FilterState
+, mkState
+, mkWidget
+, handleEvent
+, attrs
+, isActiveL
+, isFocusedL
+, focus
+, blur
+, reset
+, getValue
+) where
+
+import ClassyPrelude
+import TH (makeSuffixLenses)
+
+import Lens.Micro.Platform ((^.), (%~), (&), (.~))
+
+import Data.Text.Zipper (textZipper)
+
+import Brick.Types (Widget, BrickEvent, EventM, Next, Padding(..))
+import Brick.AttrMap (AttrName)
+import Brick.Widgets.Core (str, withAttr, padLeft, (<+>))
+import Brick.Util (fg)
+import Brick.Widgets.Edit
+  ( Editor
+  , editorText
+  , applyEdit
+  , renderEditor
+  , handleEditorEvent
+  , getEditContents
+  , editAttr
+  )
+
+import qualified Graphics.Vty as Vty
+
+data FilterState n = FilterState
+  { _editor :: Editor Text n
+  , _isFocused :: Bool
+  , _isActive :: Bool
+  }
+
+makeSuffixLenses ''FilterState
+
+mkState :: n -> FilterState n
+mkState name = FilterState
+  { _editor = editorText name (str . (concatMap unpack)) (Just 1) ""
+  , _isFocused = False
+  , _isActive = False
+  }
+
+mkWidget :: (Show n, Ord n) => FilterState n -> Widget n
+mkWidget state = str "Filter: " <+> (withAttr filterAttrName (renderEditor (state^.isFocusedL) (state^.editorL))) <+> (padLeft Max (str "Enter: apply | Esc: disable "))
+
+handleEvent :: Vty.Event -> FilterState n -> EventM n (FilterState n)
+handleEvent event state = do
+  newEditorState <- handleEditorEvent event (state^.editorL)
+  return $ state & editorL .~ newEditorState
+
+focus :: FilterState n -> FilterState n
+focus state = state & isActiveL .~ True
+                    & isFocusedL .~ True
+
+blur :: FilterState n -> FilterState n
+blur state = state & isFocusedL .~ False
+
+reset :: FilterState n -> FilterState n
+reset state = state & isActiveL .~ False
+                    & isFocusedL .~ False
+                    & editorL %~ clearEditor
+
+getValue :: FilterState n -> Text
+getValue state = concat $ getEditContents (state^.editorL)
+
+filterAttrName :: AttrName
+filterAttrName = editAttr
+
+clearEditor :: Editor Text n -> Editor Text n
+clearEditor editor = applyEdit (\_ -> textZipper [""] (Just 1)) editor
+
+attrs :: [(AttrName, Vty.Attr)]
+attrs = [ (filterAttrName, fg Vty.yellow)
+        ]
diff --git a/app/UI/Widgets/Notification.hs b/app/UI/Widgets/Notification.hs
new file mode 100644
--- /dev/null
+++ b/app/UI/Widgets/Notification.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE TemplateHaskell #-}
+module UI.Widgets.Notification
+( NotificationState
+, mkState
+, mkWidget
+, setNotification
+) where
+
+import ClassyPrelude
+import TH (makeSuffixLenses)
+
+import Lens.Micro.Platform ((^.), (&), (.~))
+
+import Brick.Types (Widget)
+import Brick.Widgets.Core (str)
+
+data NotificationState = NotificationState
+  { _notification :: Maybe Text
+  } deriving Show
+
+makeSuffixLenses ''NotificationState
+
+mkState :: NotificationState
+mkState = NotificationState Nothing
+
+mkWidget :: NotificationState -> Widget n
+mkWidget state = str . unpack $ fromMaybe "" (state^.notificationL)
+
+setNotification :: Text -> NotificationState -> NotificationState
+setNotification txt state = state & notificationL .~ (Just txt)
diff --git a/mushu.cabal b/mushu.cabal
--- a/mushu.cabal
+++ b/mushu.cabal
@@ -1,7 +1,7 @@
 name:                mushu
-version:             0.1.0
-synopsis:            Mushu is a minimalist MPD client with a TUI and an incremental fuzzy finder for your music library
-description:         Please see README.md
+version:             0.1.1
+synopsis:            Minimalist MPD client
+description:         Mushu is a minimalist MPD client with a TUI and an incremental fuzzy finder for your music library
 homepage:            https://github.com/elaye/mushu#README.md
 license:             BSD3
 license-file:        LICENSE
@@ -20,15 +20,15 @@
   other-modules:       Library
                       , MPD
                       , TH
+                      , Types
                       , UI, UI.Types, UI.Utils
                       , UI.Views.Help, UI.Views.Library, UI.Views.Main, UI.Views.Playlist
-                      , UI.Widgets.Command, UI.Widgets.Help, UI.Widgets.Library, UI.Widgets.Playlist, UI.Widgets.Status
+                      , UI.Widgets.Help, UI.Widgets.Library, UI.Widgets.Playlist, UI.Widgets.Status, UI.Widgets.Filter, UI.Widgets.Notification
   build-depends:       base >= 4 && < 5
                       ,classy-prelude
                       ,safe-exceptions
                       ,containers
                       ,network
-                      ,async
                       ,libmpd
                       ,text
                       ,fuzzy
@@ -62,21 +62,10 @@
   hs-source-dirs:      test, app
   main-is:             Spec.hs
   build-depends:       base
-                      ,attoparsec
-                      ,bytestring
                       ,classy-prelude
-                      ,microlens-platform >= 0.3.1.0
-                      ,unordered-containers
-                      ,text
-                      ,time
-                      ,QuickCheck
-                      ,quickcheck-text
-                      ,tasty
-                      ,tasty-quickcheck
-                      ,tasty-hunit
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   default-language:    Haskell2010
-  default-extensions:         NoImplicitPrelude
+  default-extensions:         NoImplicitPrelude, OverloadedStrings
 
 source-repository head
   type:     git
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -1,16 +1,4 @@
 import ClassyPrelude
 
-import Test.Tasty
-import qualified MIME.Parser.Test as MP
-import Test.Tasty.QuickCheck
-import Mail (Target)
-
-tests :: TestTree
-tests = testGroup "Tests"
-  [ MP.tests
-  ]
-
 main :: IO ()
-main = do
-  {-sample $ (MP.arbitrary :: Gen Target)-}
-  defaultMain tests
+main = putStrLn "Test suite not yet implemented"
