diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Changelog
 
+## Unreleased
+
+- Move header logic to a pure addPageHeaders function #21
+
+## v2.5.1 (2023-12-13)
+
+- Bump `servant`, `servant-server`, `text` versions (see [#24](https://github.com/chordify/haskell-servant-pagination/pull/24)).
+
 ## v2.5.0 (2022-03-09)
 - Allow text-2.0 and servant-0.19 #20
 - Expose PutRange so we can use this in integrations #18
@@ -49,21 +57,21 @@
 - Allow servant-0.14
 
 
-## v2.1.0 (2018-04-16) 
+## v2.1.0 (2018-04-16)
 
 - Add some tests (QuickCheck round-up & control some Ranges parsing)
 - Add `Show` and `Eq` instances for Ranges
-- Expose `putRange` function 
+- Expose `putRange` function
 - Review `getDefaultRange` signature (remove Maybe argument)
 
 
 ## v2.0.0 (2018-04-06)
 
 - Review internal implementation and public API (ditch Range combinator to favor type-level
-  list and more discrete footprint). 
+  list and more discrete footprint).
 
 - Remove 'Total-Count' header, can still be added on top of the range headers but isn't a Range
-  header so to speak. 
+  header so to speak.
 
 - Extend haddock documentation to be more user-friendly
 
diff --git a/servant-pagination.cabal b/servant-pagination.cabal
--- a/servant-pagination.cabal
+++ b/servant-pagination.cabal
@@ -10,7 +10,7 @@
     different fashions (pagination with offset / limit, endless scroll using
     last referenced resources, ascending and descending ordering, etc.)
 version:
-    2.5.0
+    2.5.1
 homepage:
     https://github.com/chordify/haskell-servant-pagination
 bug-reports:
@@ -83,9 +83,9 @@
 
   build-depends:
       base >= 4 && < 5
-    , text >= 1.2 && < 2.1
-    , servant >= 0.11 && < 0.20
-    , servant-server >= 0.11 && < 0.20
+    , text >= 1.2 && < 2.2
+    , servant >= 0.11 && < 0.21
+    , servant-server >= 0.11 && < 0.21
     , safe >= 0.3 && < 1
     , uri-encode >= 1.5 && < 1.6
 
diff --git a/src/Servant/Pagination.hs b/src/Servant/Pagination.hs
--- a/src/Servant/Pagination.hs
+++ b/src/Servant/Pagination.hs
@@ -113,6 +113,7 @@
   -- * Use Ranges
   , extractRange
   , putRange
+  , addPageHeaders
   , returnRange
   , applyRange
   ) where
@@ -414,10 +415,12 @@
       , rangeField  = Proxy @field
       }
 
--- | Lift an API response in a 'Monad', typically a 'Servant.Server.Handler'. 'Ranges' headers can be quite cumbersome to
--- declare and can be deduced from the resources returned and the previous 'Range'. This is exactly what this function
--- does.
+-- | Add headers representing a 'Range' to a list of resources.
 --
+-- 'Ranges' headers can be quite cumbersome to declare and can be deduced from a
+-- collection of resources together with the 'Range' used to retrieve it, so this function
+-- is a shortcut for that.
+--
 -- @
 -- myHandler
 --  :: 'Maybe' ('Ranges' '["created_at"] Resource)
@@ -426,11 +429,10 @@
 --  let range =
 --        'Data.Maybe.fromMaybe' ('getDefaultRange' ('Data.Proxy.Proxy' \@Resource)) (mrange >>= 'extractRange')
 --
---  'returnRange' range ('applyRange' range resources)
+--  'return' ('addPageHeaders' range ('applyRange' range resources))
 -- @
-returnRange
-  :: ( Monad m
-     , ToHttpApiData (AcceptRanges fields)
+addPageHeaders
+  :: ( ToHttpApiData (AcceptRanges fields)
      , KnownSymbol field
      , HasPagination resource field
      , IsRangeType (RangeType resource field)
@@ -438,15 +440,14 @@
      )
   => Range field (RangeType resource field)               -- ^ Actual 'Range' used to retrieve the results
   -> [resource]                                           -- ^ Resources to return, fetched from a db or a local store
-  -> m (Headers (PageHeaders fields resource) [resource]) -- ^ Resources embedded in a given 'Monad' (typically a 'Servant.Server.Handler', with pagination headers)
-returnRange Range{..} rs = do
+  -> Headers (PageHeaders fields resource) [resource]     -- ^ The same resources, but with pagination headers
+addPageHeaders Range{..} rs =
   let boundaries = (,)
         <$> fmap (getFieldValue rangeField) (Safe.headMay rs)
         <*> fmap (getFieldValue rangeField) (Safe.lastMay rs)
-
-  case boundaries of
+  in case boundaries of
     Nothing ->
-      return $ addHeader AcceptRanges $ noHeader $ noHeader rs
+      addHeader AcceptRanges $ noHeader $ noHeader rs
 
     Just (start, end) -> do
       let nextOffset | rangeValue == Just end = rangeOffset + length rs
@@ -469,7 +470,21 @@
       let addNextRange | length rs < rangeLimit = noHeader
                        | otherwise              = addHeader nextRange
 
-      return $ addHeader AcceptRanges $ addHeader contentRange $ addNextRange rs
+      addHeader AcceptRanges $ addHeader contentRange $ addNextRange rs
+
+-- | @'returnRange' range rs = 'return' ('addPageHeaders' range rs)@
+returnRange
+  :: ( Monad m
+     , ToHttpApiData (AcceptRanges fields)
+     , KnownSymbol field
+     , HasPagination resource field
+     , IsRangeType (RangeType resource field)
+     , PutRange fields field
+     )
+  => Range field (RangeType resource field)               -- ^ Actual 'Range' used to retrieve the results
+  -> [resource]                                           -- ^ Resources to return, fetched from a db or a local store
+  -> m (Headers (PageHeaders fields resource) [resource]) -- ^ Resources embedded in a given 'Monad' (typically a 'Servant.Server.Handler', with pagination headers)
+returnRange range rs = return (addPageHeaders range rs)
 
 -- | Default values to apply when parsing a 'Range'
 data RangeOptions  = RangeOptions
diff --git a/stack.yaml b/stack.yaml
--- a/stack.yaml
+++ b/stack.yaml
@@ -1,4 +1,4 @@
-resolver: lts-16.15
+resolver: lts-14.25
 
 # Generate files required by Weeder.
 # See https://github.com/ndmitchell/weeder/issues/53
