diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+1.1.1
+-----
+* Add `/grep` filter command
+
 1.1.0.1
 -------
 * Fix setting default nick in configuration file
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -150,6 +150,11 @@
 * `/invite <nick>` - Invite the given user to the current channel
 * `/reconnect` - Reconnect to the current server
 
+Filters
+
+* `/filter` - Filter chat messages by nickname
+* `/grep` - Filter chat messages using a regular expression on the message
+
 Keyboard Shortcuts
 ==================
 
diff --git a/driver/Main.hs b/driver/Main.hs
--- a/driver/Main.hs
+++ b/driver/Main.hs
@@ -27,7 +27,7 @@
 import Graphics.Vty
 import Network.Connection
 import System.IO
-import System.IO.Error (isEOFError)
+import System.IO.Error (isEOFError, ioeGetErrorString)
 import qualified Config
 import qualified Config.Lens as C
 import qualified Data.ByteString as B
@@ -568,9 +568,14 @@
          recvChan = view clientRecvChan st
          hErr     = view clientErrors st
          config   = view clientConfig st
-     server0' <- startIrcConnection config recvChan settings hErr
-     let st' = set clientServer0 server0' st
-     return st'
+     res <- try (startIrcConnection config recvChan settings hErr)
+     case res of
+       Right server0' -> return (set clientServer0 server0' st)
+       Left e -> do
+         now <- getCurrentTime
+         let eUtf8 = Text.encodeUtf8 (Text.pack (ioeGetErrorString e))
+         atomically (writeTChan recvChan (now, Error eUtf8))
+         return st
 
 doNick ::
   ClientState ->
diff --git a/driver/Views/Channel.hs b/driver/Views/Channel.hs
--- a/driver/Views/Channel.hs
+++ b/driver/Views/Channel.hs
@@ -1,17 +1,21 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ViewPatterns #-}
 module Views.Channel (channelImage) where
 
 import Control.Lens
 import Data.Monoid
+import Data.Maybe (fromMaybe)
 import Data.Foldable (toList)
 import Data.List (stripPrefix, intersperse)
 import Data.Text (Text)
+import Data.Text.Encoding (decodeUtf8)
 import Data.Time (TimeZone, UTCTime, formatTime, utcToZonedTime)
 import Graphics.Vty.Image
 import qualified Data.ByteString.Char8 as BS8
 import qualified Data.Text as Text
+import Text.Regex.TDFA
 
 #if MIN_VERSION_time(1,5,0)
 import Data.Time (defaultTimeLocale)
@@ -88,13 +92,40 @@
 
 activeMessages :: ClientState -> [(IrcMessage,Image)]
 activeMessages st =
-  case stripPrefix "/filter " (clientInput st) of
-    Nothing -> toList msgs
-    Just nick -> filter (nickFilter (BS8.pack nick) . fst) (toList msgs)
+  case clientInputFilter st of
+    FilterNick nick -> filter (nickFilter (BS8.pack nick) . fst) (toList msgs)
+    FilterBody text -> filter (bodyFilter text . fst) (toList msgs)
+    NoFilter        -> toList msgs
   where
   msgs = view (clientMessages . ix (focusedName st) . mlMessages) st
   nickFilter nick msg
     = views mesgSender userNick msg == mkId nick
+  bodyFilter :: String -> IrcMessage -> Bool
+  bodyFilter re msg
+    = fromMaybe False (textOfMessage msg =~~ re)
+
+textOfMessage :: IrcMessage -> String
+textOfMessage mesg =
+    let f n = (BS8.unpack $ idBytes $ views mesgSender userNick mesg) <> ": " <> Text.unpack n
+    in f (case mesg ^. mesgType of
+             PrivMsgType   t -> t
+             NoticeMsgType t -> t
+             ActionMsgType t -> t
+             KickMsgType _ t -> t
+             PartMsgType   t -> t
+             QuitMsgType   t -> t
+             TopicMsgType  t -> t
+             ErrorMsgType  t -> t
+             _               -> "")
+
+data InputFilter = FilterNick String | FilterBody String | NoFilter
+
+clientInputFilter :: ClientState -> InputFilter
+clientInputFilter st = go (clientInput st)
+ where
+     go (splitAt 8 -> ("/filter ",nick)) = FilterNick nick
+     go (splitAt 6 -> ("/grep ",   txt)) = FilterBody txt
+     go  _                               = NoFilter
 
 compressedImageForState :: ClientState -> [Image]
 compressedImageForState !st = renderOne (activeMessages st)
diff --git a/irc-core.cabal b/irc-core.cabal
--- a/irc-core.cabal
+++ b/irc-core.cabal
@@ -1,5 +1,5 @@
 name:                irc-core
-version:             1.1.0.1
+version:             1.1.1
 homepage:            https://github.com/glguy/irc-core
 bug-reports:         https://github.com/glguy/irc-core/issues
 license:             BSD3
@@ -96,9 +96,10 @@
                        base64-bytestring>= 1.0.0.1  && < 1.1,
                        containers       >= 0.5      && < 0.6,
                        free             >= 4.11     && < 4.13,
-                       lens             >= 4.7      && < 4.11,
+                       lens             >= 4.7      && < 4.13,
                        text             >= 1.2.0.4  && < 1.3,
-                       transformers     >= 0.2      && < 0.5
+                       transformers     >= 0.2      && < 0.5,
+                       regex-tdfa       >= 1.2      && < 1.3
 
   if flag(time15)
     build-depends:     time             >= 1.5      && < 1.6
@@ -129,12 +130,12 @@
   build-depends: irc-core,
 
                  connection       >= 0.2.4    && < 0.3,
-                 tls              >= 1.2.16   && < 1.3,
+                 tls              >= 1.2.16   && < 1.4,
                  data-default-class >= 0.0.1  && < 0.1,
-                 x509             >= 1.5.0.1  && < 1.6,
-                 x509-system      >= 1.5.0    && < 1.6,
-                 x509-store       >= 1.5.0    && < 1.6,
-                 x509-validation  >= 1.5.1    && < 1.6,
+                 x509             >= 1.5.0.1  && < 1.7,
+                 x509-system      >= 1.5.0    && < 1.7,
+                 x509-store       >= 1.5.0    && < 1.7,
+                 x509-validation  >= 1.5.1    && < 1.7,
 
                  array            >= 0.5      && < 0.6,
                  base             >= 4.7      && < 4.9,
@@ -144,16 +145,17 @@
                  deepseq          >= 1.3.0.2  && < 1.5,
                  directory        >= 1.2.1.0  && < 1.3,
                  filepath         >= 1.3.0.2  && < 1.5,
-                 lens             >= 4.7      && < 4.11,
+                 lens             >= 4.7      && < 4.13,
                  network          >= 2.6.0.2  && < 2.7,
                  old-locale       >= 1.0.0.6  && < 1.1,
                  split            >= 0.2.2    && < 0.3,
                  stm              >= 2.4.4    && < 2.5,
                  text             >= 1.2.0.4  && < 1.3,
                  time             >= 1.4.2    && < 1.6,
-                 vty              >= 5.2.7    && < 5.3,
+                 vty              >= 5.2.7    && < 5.5,
                  haskell-lexer    >= 1.0      && < 1.1,
-                 transformers     >= 0.2      && < 0.5
+                 transformers     >= 0.2      && < 0.5,
+                 regex-tdfa       >= 1.2      && < 1.3
   default-language:    Haskell2010
 
 source-repository head
