diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,24 @@
 Brick changelog
 ---------------
 
+2.6
+---
+
+Behavior changes:
+ * `Brick.Widgets.Core.relativeTo` now draws nothing if the requested
+   extent is not found. Previously it would draw the specified widget in
+   the upper-left corner of the layer.
+
+Bug fixes:
+ * Fixed the conditional import in `BorderMap` (#519)
+ * `Brick.Widgets.Center.hCenterWith` now properly accounts for centered
+   image width when computing additional right padding (#520)
+ * The Brick renderer now properly resets some render-specific state
+   in between renderings that was previously kept around, avoiding
+   preservation of stale extents across renderings
+ * `brick-tail-demo` and `brick-custom-event-demo` now shut down Vty
+   properly
+
 2.5
 ---
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -89,6 +89,7 @@
 | [`summoner-tui`](https://github.com/kowainik/summoner/tree/master/summoner-tui) | An interactive frontend to the Summoner tool |
 | [`swarm`](https://github.com/byorgey/swarm/) | A 2D programming and resource gathering game |
 | [`tart`](https://github.com/jtdaugherty/tart) | A mouse-driven ASCII art drawing program |
+| [`tick-tock-tui`](https://github.com/sectore/tick-tock-tui) | A stylish TUI app to handle Bitcoin data provided by [Mempool REST API](https://mempool.space/docs/api/rest) incl. blocks, fees and price converter. |
 | [`tetris`](https://github.com/SamTay/tetris) | An implementation of the Tetris game |
 | [`thock`](https://github.com/rmehri01/thock) | A modern TUI typing game featuring online racing against friends |
 | [`timeloop`](https://github.com/cdupont/timeloop) | A time-travelling demonstrator |
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             2.5
+version:             2.6
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal user interfaces (TUIs) painlessly with 'brick'! You
diff --git a/programs/CustomEventDemo.hs b/programs/CustomEventDemo.hs
--- a/programs/CustomEventDemo.hs
+++ b/programs/CustomEventDemo.hs
@@ -82,4 +82,5 @@
         writeBChan chan Counter
         threadDelay 1000000
 
-    void $ customMainWithDefaultVty (Just chan) theApp initialState
+    (_, vty) <- customMainWithDefaultVty (Just chan) theApp initialState
+    V.shutdown vty
diff --git a/programs/LayerDemo.hs b/programs/LayerDemo.hs
--- a/programs/LayerDemo.hs
+++ b/programs/LayerDemo.hs
@@ -46,8 +46,8 @@
     [ C.centerLayer $
       B.border $ str "This layer is centered but other\nlayers are placed underneath it."
     , arrowLayer
-    , middleLayer st
-    , bottomLayer st
+    , middleLayer (st^.middleLayerLocation)
+    , bottomLayer (st^.bottomLayerLocation)
     ]
 
 arrowLayer :: Widget Name
@@ -59,15 +59,15 @@
        withDefAttr arrowAttr $
        str msg
 
-middleLayer :: St -> Widget Name
-middleLayer st =
-    translateBy (st^.middleLayerLocation) $
+middleLayer :: Location -> Widget Name
+middleLayer l =
+    translateBy l $
     reportExtent MiddleLayerElement $
     B.border $ str "Middle layer\n(Arrow keys move)"
 
-bottomLayer :: St -> Widget Name
-bottomLayer st =
-    translateBy (st^.bottomLayerLocation) $
+bottomLayer :: Location -> Widget Name
+bottomLayer l =
+    translateBy l $
     B.border $ str "Bottom layer\n(Ctrl-arrow keys move)"
 
 appEvent :: T.BrickEvent Name e -> T.EventM Name St ()
diff --git a/programs/TailDemo.hs b/programs/TailDemo.hs
--- a/programs/TailDemo.hs
+++ b/programs/TailDemo.hs
@@ -147,4 +147,5 @@
     -- Run thread to simulate incoming data
     void $ forkIO $ generateLines chan
 
-    void $ customMainWithDefaultVty (Just chan) app initialState
+    (_, vty) <- customMainWithDefaultVty (Just chan) app initialState
+    V.shutdown vty
diff --git a/src/Brick/BorderMap.hs b/src/Brick/BorderMap.hs
--- a/src/Brick/BorderMap.hs
+++ b/src/Brick/BorderMap.hs
@@ -17,7 +17,9 @@
     ) where
 
 import Brick.Types.Common (Edges(..), Location(..), eTopL, eBottomL, eRightL, eLeftL, origin)
+#if !(MIN_VERSION_base(4,18,0))
 import Control.Applicative (liftA2)
+#endif
 import Data.IMap (IMap, Run(Run))
 import GHC.Generics
 import Control.DeepSeq
diff --git a/src/Brick/Widgets/Center.hs b/src/Brick/Widgets/Center.hs
--- a/src/Brick/Widgets/Center.hs
+++ b/src/Brick/Widgets/Center.hs
@@ -60,7 +60,7 @@
            c <- getContext
            let rWidth = result^.imageL.to imageWidth
                rHeight = result^.imageL.to imageHeight
-               remainder = max 0 $ c^.availWidthL - (leftPaddingAmount * 2)
+               remainder = max 0 $ c^.availWidthL - (rWidth + (leftPaddingAmount * 2))
                leftPaddingAmount = max 0 $ (c^.availWidthL - rWidth) `div` 2
                rightPaddingAmount = max 0 $ leftPaddingAmount + remainder
                leftPadding = charFill (c^.attrL) ch leftPaddingAmount rHeight
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
@@ -1084,15 +1084,16 @@
 -- | Given a widget, translate it to position it relative to the
 -- upper-left coordinates of a reported extent with the specified
 -- positioning offset. If the specified name has no reported extent,
--- this just draws the specified widget with no special positioning.
+-- this draws nothing on the basis that it only makes sense to draw what
+-- was requested when the relative position can be known.
 --
 -- This is only useful for positioning something in a higher layer
 -- relative to a reported extent in a lower layer. Any other use is
--- likely to result in the specified widget being rendered as-is with
--- no translation. This is because this function relies on information
--- about lower layer renderings in order to work; using it with a
--- resource name that wasn't rendered in a lower layer will result in
--- this being equivalent to @id@.
+-- likely to result in the specified widget not being rendered. This
+-- is because this function relies on information about lower layer
+-- renderings in order to work; using it with a resource name that
+-- wasn't rendered in a lower layer will result in this being equivalent
+-- to @emptyWidget@.
 --
 -- For example, if you have two layers @topLayer@ and @bottomLayer@,
 -- then a widget drawn in @bottomLayer@ with @reportExtent Foo@ can be
@@ -1103,7 +1104,7 @@
     Widget (hSize w) (vSize w) $ do
         mExt <- lookupReportedExtent n
         case mExt of
-            Nothing -> render w
+            Nothing -> render emptyWidget
             Just ext -> render $ translateBy (extentUpperLeft ext <> off) w
 
 -- | Crop the specified widget on the left by the specified number of
@@ -1253,7 +1254,6 @@
         renderedClickables renderResult = do
             allClickables <- use clickableNamesL
             return [extentName e | e <- renderResult^.extentsL, extentName e `elem` allClickables]
-
 
 cacheLookup :: (Ord n) => n -> RenderM n (Maybe ([n], Result n))
 cacheLookup n = do
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
@@ -169,7 +169,7 @@
            -> Editor T.Text n
 editorText = editor
 
--- | Construct an editor over 'String' values
+-- | Construct an editor over generic text values
 editor :: Z.GenericTextZipper a
        => n
        -- ^ The editor's name (must be unique)
diff --git a/src/Brick/Widgets/Internal.hs b/src/Brick/Widgets/Internal.hs
--- a/src/Brick/Widgets/Internal.hs
+++ b/src/Brick/Widgets/Internal.hs
@@ -8,7 +8,7 @@
   )
 where
 
-import Lens.Micro ((^.), (&), (%~))
+import Lens.Micro ((^.), (&), (%~), (.~))
 import Lens.Micro.Mtl ((%=))
 import Control.Monad
 import Control.Monad.State.Strict
@@ -35,7 +35,14 @@
 renderFinal aMap layerRenders (w, h) chooseCursor rs =
     (newRS, picWithBg, theCursor, concat layerExtents)
     where
-        (layerResults, !newRS) = flip runState rs $ sequence $
+        -- Reset various fields from the last rendering state so they
+        -- don't accumulate or affect this rendering.
+        resetRs = rs & reportedExtentsL .~ mempty
+                     & observedNamesL .~ mempty
+                     & clickableNamesL .~ mempty
+                     & requestedVisibleNames_L .~ mempty
+
+        (layerResults, !newRS) = flip runState resetRs $ sequence $
             (\p -> runReaderT p ctx) <$>
             (\layerWidget -> do
                 result <- render $ cropToContext layerWidget
