diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,9 +2,22 @@
 
 `gridtables` uses [PVP Versioning][].
 
+## gridtables-0.1.1.0
+
+Released 2025-09-22.
+
+-   Fixed length calculation for combined characters (Tuong Nguyen
+    Manh).
+
+-   Updated upper bound on text.
+
+-   Minor code and docs improvements.
+
+-   Added version bounds to all build dependencies.
+
 ## gridtables-0.1.0.0
 
-Release pending.
+Released 2022-09-30.
 
 -   Added support for table foots.
 
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright © 2022 RStudio, PBC
+Copyright © 2022-2023 Posit Software, PBC
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/gridtables.cabal b/gridtables.cabal
--- a/gridtables.cabal
+++ b/gridtables.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                gridtables
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            Parser for reStructuredText-style grid tables.
 description:         Provides a parser for plain-text representations of
                      tables. This package supports table headers, cells
@@ -12,7 +12,7 @@
 license-file:        LICENSE
 author:              Albert Krewinkel
 maintainer:          Albert Krewinkel <albert@zeitkraut.de>
-copyright:           © 2022 RStudio, PBC
+copyright:           © 2022-2023 Posit Software, PBC
 category:            Text
 extra-doc-files:     README.md
                    , CHANGELOG.md
@@ -28,9 +28,9 @@
 
 common common-options
   build-depends:       base             >= 4.12     && < 5
-                     , array
+                     , array            >= 0.5      && < 0.6
                      , parsec           >= 3.1      && < 3.2
-                     , text             >= 1.1.1.0  && < 1.3 || >= 2.0 && < 2.1
+                     , text             >= 1.1.1.0  && < 1.3 || >= 2.0 && < 2.2
   default-language:    Haskell2010
   default-extensions:  OverloadedStrings
   other-extensions:    FlexibleContexts
@@ -56,8 +56,8 @@
 library
   import:              common-options
   hs-source-dirs:      src
-  build-depends:       containers
-                     , doclayout
+  build-depends:       containers            >= 0.6      && < 0.8
+                     , doclayout             >= 0.4      && < 0.6
   exposed-modules:     Text.GridTable
                      , Text.GridTable.ArrayTable
                      , Text.GridTable.Parse
diff --git a/src/Text/GridTable.hs b/src/Text/GridTable.hs
--- a/src/Text/GridTable.hs
+++ b/src/Text/GridTable.hs
@@ -4,7 +4,7 @@
 {-# LANGUAGE RankNTypes                 #-}
 {- |
 Module      : Text.GridTable
-Copyright   : © 2022 Albert Krewinkel
+Copyright   : © 2022-2023 Posit Software, PBC
 License     : MIT
 Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
 
diff --git a/src/Text/GridTable/ArrayTable.hs b/src/Text/GridTable/ArrayTable.hs
--- a/src/Text/GridTable/ArrayTable.hs
+++ b/src/Text/GridTable/ArrayTable.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE LambdaCase                 #-}
 {- |
 Module      : Text.GridTable.ArrayTable
-Copyright   : © 2022 RStudio, PBC
+Copyright   : © 2022-2023 Posit Software, PBC
 License     : MIT
 Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
 
diff --git a/src/Text/GridTable/Parse.hs b/src/Text/GridTable/Parse.hs
--- a/src/Text/GridTable/Parse.hs
+++ b/src/Text/GridTable/Parse.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE FlexibleContexts   #-}
 {- |
 Module      : Text.GridTable
-Copyright   : © 2022 Albert Krewinkel
+Copyright   : © 2022-2023 Posit Software, PBC
 License     : MIT
 Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
 
diff --git a/src/Text/GridTable/Trace.hs b/src/Text/GridTable/Trace.hs
--- a/src/Text/GridTable/Trace.hs
+++ b/src/Text/GridTable/Trace.hs
@@ -4,7 +4,7 @@
 {-# LANGUAGE RankNTypes                 #-}
 {- |
 Module      : Text.GridTable.Trace
-Copyright   : © 2022 Albert Krewinkel
+Copyright   : © 2022-2023 Posit Software, PBC
 License     : MIT
 Maintainer  : Albert Krewinkel <albert@zeitkraut.de>
 
@@ -30,7 +30,7 @@
 import Data.Maybe (fromMaybe)
 import Data.Set (Set)
 import Data.Text (Text)
-import Text.DocLayout (charWidth)
+import Text.DocLayout (charWidth, realLength)
 import Text.GridTable.ArrayTable
 import qualified Data.Map.Strict as Map
 import qualified Data.Set as Set
@@ -99,7 +99,7 @@
 -- | Converts a list of lines into a char array.
 toCharGrid :: [Text] -> CharGrid
 toCharGrid lines =
-  let chars = foldr (\t m -> max m (T.length t)) 0 lines -- potential overcount
+  let chars = foldr (\t m -> max m (realLength t)) 0 lines -- potential overcount
       gbounds = ( (CharRow 1, CharCol 1)
                 , (CharRow (length lines), CharCol chars)
                 )
@@ -344,6 +344,7 @@
 lastRow :: CharGrid -> CharRow
 lastRow = fst . snd . bounds
 
+-- | Forgiving version of scanRight, allowing misaligned line ends
 scanRightRestOfLine :: CharGrid -> CharIndex -> CharRow -> Maybe ColSeps
 scanRightRestOfLine charGrid (_top, left) bottom =
   let  go :: CharCol -> Maybe ColSeps -> Maybe ColSeps
diff --git a/test/test-gridtables.hs b/test/test-gridtables.hs
--- a/test/test-gridtables.hs
+++ b/test/test-gridtables.hs
@@ -1,7 +1,8 @@
 {-# LANGUAGE FlexibleContexts  #-}
+{-# LANGUAGE TupleSections     #-}
 {-|
 Module      : Main
-Copyright   : © 2022 Albert Krewinkel
+Copyright   : © 2022-2023 Posit Software, PBC
 License     : MIT
 Maintainer  : Albert Krewinkel <albert+hslua@zeitkraut.de>
 
@@ -27,17 +28,17 @@
     ]
 
 parse' :: ParsecT Text () Identity a -> Text -> Either ParseError a
-parse' p t = runParser p () "<test input>" t
+parse' p = runParser p () "<test input>"
 
 -- | Test parsing into lines
 linesTests :: TestTree
 linesTests = testGroup "lines"
   [ testCase "get lines" $
     parse' (many1 tableLine) "| one | two |\n| three |\n| four |\n"
-    @?= Right ([ "| one | two |"
-               , "| three |"
-               , "| four |"
-               ])
+    @?= Right [ "| one | two |"
+              , "| three |"
+              , "| four |"
+              ]
 
   , testCase "fail if not a table" $
     parse' (many tableLine) "nope\nnada\n" @?= Right []
@@ -372,6 +373,23 @@
                 , arrayTableColSpecs = defaultAlign [10, 1]
                 })
 
+    , testCase "combined characters" $
+      let gt = T.unlines
+               [ "+---+------+"
+               , "| a | back |"
+               , "+===+======+"
+               , "| ø̞ | o̞    |"
+               , "+---+------+"
+               ]
+      in parse' gridTable gt @?=
+         Right (ArrayTable 
+                { arrayTableCells = listArray ((1,1),(2,2))
+                  [ ContentCell 1 1 [" a "], ContentCell 1 1 [" back "], ContentCell 1 1 [" ø̞ "], ContentCell 1 1 [" o̞    "]]
+                , arrayTableHead = Just 1
+                , arrayTableFoot = Nothing
+                , arrayTableColSpecs = defaultAlign [3, 6]
+                })
+
     ]
 
   , testCase "unterminated row" $
@@ -514,4 +532,4 @@
 
 defaultAlign :: [Int] -> Array ColIndex (Alignment, Int)
 defaultAlign widths = listArray (1, ColIndex (length widths))
-                    $ map (\w -> (AlignDefault, w)) widths
+                    $ map (AlignDefault,) widths
