diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,16 @@
 Brick changelog
 ---------------
 
+0.31
+----
+
+Behavior changes:
+ * `viewport` now implicitly causes generation of mouse events for the
+   viewport when mouse mode is enabled. The mouse events are expressed
+   in the coordinate system of the contents of the viewport. The
+   consequence and intention of this change is to enable mouse event
+   reporting for editors when clicks occur outside the known text area.
+
 0.30
 ----
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -20,6 +20,13 @@
 [vty](http://hackage.haskell.org/package/vty), so some knowledge of Vty
 will be helpful in using this library.
 
+Release Announcements / News
+----------------------------
+
+Find out about `brick` releases and other news on Twitter:
+
+https://twitter.com/brick_haskell/
+
 Example
 -------
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.30
+version:             0.31
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
diff --git a/src/Brick/Main.hs b/src/Brick/Main.hs
--- a/src/Brick/Main.hs
+++ b/src/Brick/Main.hs
@@ -42,7 +42,7 @@
 where
 
 import Control.Exception (finally)
-import Lens.Micro ((^.), (&), (.~))
+import Lens.Micro ((^.), (&), (.~), (%~), _1, _2)
 import Control.Monad (forever)
 import Control.Monad.Trans.Class (lift)
 import Control.Monad.Trans.State
@@ -75,7 +75,6 @@
 import Brick.Types.Internal
 import Brick.Widgets.Internal
 import Brick.AttrMap
-import qualified Brick.Widgets.Core as C
 
 -- | The library application abstraction. Your application's operations
 -- are represented here and passed to one of the various main functions
@@ -264,7 +263,17 @@
                             let localCoords = Location (lc, lr)
                                 lc = c - ec + oC
                                 lr = r - er + oR
-                            return (MouseDown n button mods localCoords, firstRS, exts)
+
+                                -- If the clicked extent was a viewport,
+                                -- adjust the local coordinates by
+                                -- adding the viewport upper-left corner
+                                -- offset.
+                                newCoords = case M.lookup n (viewportMap firstRS) of
+                                  Nothing -> localCoords
+                                  Just vp -> localCoords & _1 %~ (+ (vp^.vpLeft))
+                                                         & _2 %~ (+ (vp^.vpTop))
+
+                            return (MouseDown n button mods newCoords, firstRS, exts)
                         False -> return (e, firstRS, exts)
                 _ -> return (e, firstRS, exts)
         VtyEvent (EvMouseUp c r button) -> do
diff --git a/src/Brick/Widgets/Core.hs b/src/Brick/Widgets/Core.hs
--- a/src/Brick/Widgets/Core.hs
+++ b/src/Brick/Widgets/Core.hs
@@ -756,7 +756,7 @@
          -- ^ The widget to be rendered in the scrollable viewport
          -> Widget n
 viewport vpname typ p =
-    Widget Greedy Greedy $ do
+    clickable vpname $ Widget Greedy Greedy $ do
       -- First, update the viewport size.
       c <- getContext
       let newVp = VP 0 0 newSize
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
@@ -170,7 +170,6 @@
     in withAttr (if foc then editFocusedAttr else editAttr) $
        limit $
        viewport (e^.editorNameL) Both $
-       clickable (e^.editorNameL) $
        (if foc then showCursor (e^.editorNameL) cursorLoc else id) $
        visibleRegion cursorLoc (atCharWidth, 1) $
        draw $
