diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,22 @@
 Brick changelog
 ---------------
 
+0.4.1
+-----
+
+Bug fixes:
+* Fixed a bug in the 'visible' combinator: If the size of the visibility
+  request was larger than the available space, then the rendering of a
+  viewport was toggling between two states, one with aligning on the
+  end of the visibility request, and another one aligning on the start.
+  This commit fixes it so that a visibility request is always aligned
+  on the start if not enough space is available. (thanks Thomas Strobel
+  <ts468@cam.ac.uk>)
+
+Behavior changes:
+* Honor multiple 'visible' markers in a single viewport with preference
+  on the innermost request (thanks Thomas Strobel <ts468@cam.ac.uk>)
+
 0.4
 ---
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.4
+version:             0.4.1
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
@@ -31,7 +31,7 @@
 license-file:        LICENSE
 author:              Jonathan Daugherty <cygnus@foobox.com>
 maintainer:          Jonathan Daugherty <cygnus@foobox.com>
-copyright:           (c) Jonathan Daugherty 2015
+copyright:           (c) Jonathan Daugherty 2015-2016
 category:            Graphics
 build-type:          Simple
 cabal-version:       >=1.10
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
@@ -522,8 +522,9 @@
 -- 'Brick.Main.EventM' monad provides primitives to scroll viewports
 -- created by this function if 'visible' is not what you want.
 --
--- If a viewport receives more than one visibility request, only the
--- first is honored. If a viewport receives more than one scrolling
+-- If a viewport receives more than one visibility request, then the
+-- visibility requests are merged with the inner visibility request
+-- taking preference. If a viewport receives more than one scrolling
 -- request from 'Brick.Main.EventM', all are honored in the order in
 -- which they are received.
 viewport :: Name
@@ -586,12 +587,12 @@
       -- state accordingly
       when (not $ null $ initialResult^.visibilityRequestsL) $ do
           Just vp <- lift $ gets $ (^.viewportMapL.to (M.lookup vpname))
-          let rq = head $ initialResult^.visibilityRequestsL
-              updatedVp = case typ of
-                  Both -> scrollToView Horizontal rq $ scrollToView Vertical rq vp
-                  Horizontal -> scrollToView typ rq vp
-                  Vertical -> scrollToView typ rq vp
-          lift $ modify (& viewportMapL %~ (M.insert vpname updatedVp))
+          let rqs = initialResult^.visibilityRequestsL
+              updateVp vp' rq = case typ of
+                  Both -> scrollToView Horizontal rq $ scrollToView Vertical rq vp'
+                  Horizontal -> scrollToView typ rq vp'
+                  Vertical -> scrollToView typ rq vp'
+          lift $ modify (& viewportMapL %~ (M.insert vpname $ foldl updateVp vp rqs))
 
       -- If the size of the rendering changes enough to make the
       -- viewport offsets invalid, reset them
@@ -675,11 +676,12 @@
 
         reqEnd = rq^.vrPositionL.rowL + rq^.vrSizeL._2
         newVStart :: Int
-        newVStart = if reqStart < curStart
+        newVStart = if reqStart < vStartEndVisible
                    then reqStart
-                   else if reqStart > curEnd || reqEnd > curEnd
-                        then reqEnd - vp^.vpSize._2
-                        else curStart
+                   else vStartEndVisible
+        vStartEndVisible = if reqEnd < curEnd
+                           then curStart
+                           else curStart + (reqEnd - curEnd)
 scrollToView Horizontal rq vp = vp & vpLeft .~ newHStart
     where
         curStart = vp^.vpLeft
@@ -688,11 +690,12 @@
 
         reqEnd = rq^.vrPositionL.columnL + rq^.vrSizeL._1
         newHStart :: Int
-        newHStart = if reqStart < curStart
+        newHStart = if reqStart < hStartEndVisible
                    then reqStart
-                   else if reqStart > curEnd || reqEnd > curEnd
-                        then reqEnd - vp^.vpSize._1
-                        else curStart
+                   else hStartEndVisible
+        hStartEndVisible = if reqEnd < curEnd
+                           then curStart
+                           else curStart + (reqEnd - curEnd)
 
 -- | Request that the specified widget be made visible when it is
 -- rendered inside a viewport. This permits widgets (whose sizes and
