diff --git a/dataframe-lazy.cabal b/dataframe-lazy.cabal
--- a/dataframe-lazy.cabal
+++ b/dataframe-lazy.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.4
 name:               dataframe-lazy
-version:            2.4.0.0
+version:            2.4.1.0
 synopsis:           Lazy query engine for the dataframe ecosystem.
 description:
     The lazy/streaming query engine: relational-algebra plans, optimizer,
@@ -45,11 +45,10 @@
                         attoparsec >= 0.12 && < 0.16,
                         bytestring >= 0.11 && < 0.14,
                         containers >= 0.6.7 && < 0.10,
-                        dataframe-core >= 2.4 && < 2.5,
-                        dataframe-core >= 2.4 && < 2.5,
+                        dataframe-core >= 2.5 && < 2.6,
                         dataframe-csv >= 2.3 && < 2.4,
                         dataframe-csv >= 2.3 && < 2.4,
-                        dataframe-operations >= 2.4 && < 2.5,
+                        dataframe-operations >= 2.5 && < 2.6,
                         dataframe-parquet >= 1.5 && < 1.6,
                         dataframe-parsing >= 2.2 && < 2.3,
                         directory >= 1.3.0.0 && < 2,
diff --git a/src/DataFrame/Lazy/IO/Binary.hs b/src/DataFrame/Lazy/IO/Binary.hs
--- a/src/DataFrame/Lazy/IO/Binary.hs
+++ b/src/DataFrame/Lazy/IO/Binary.hs
@@ -56,11 +56,10 @@
 import qualified DataFrame.Internal.Binary as Binary
 import DataFrame.Internal.Column (
     Column (..),
-    bitmapTestBit,
-    buildBitmapFromValid,
     materializeMerged,
     materializePacked,
  )
+import DataFrame.Internal.Column.Bitmap (bitmapTestBit, buildBitmapFromValid)
 import DataFrame.Internal.DataFrame (DataFrame (..))
 import Foreign (ForeignPtr, castForeignPtr, plusForeignPtr, sizeOf)
 import System.Directory (getTemporaryDirectory, removeFile)
diff --git a/src/DataFrame/Lazy/IO/CSV.hs b/src/DataFrame/Lazy/IO/CSV.hs
--- a/src/DataFrame/Lazy/IO/CSV.hs
+++ b/src/DataFrame/Lazy/IO/CSV.hs
@@ -103,6 +103,7 @@
             Nothing -> (0, totalRows')
             Just (start, len'') -> (start, min len'' (totalRows' - rowsRead opts))
     withFile path ReadMode $ \handle -> do
+        hSetEncoding handle utf8
         firstRow <- fmap T.strip . parseSep c <$> TIO.hGetLine handle
         let columnNames =
                 if hasHeader opts
@@ -256,6 +257,7 @@
 openCsvStream sep schema path = do
     handle <- openFile path ReadMode
     hSetBuffering handle (BlockBuffering (Just (8 * 1024 * 1024)))
+    hSetEncoding handle utf8
     headerLine <- TIO.hGetLine handle
     let headerCols = fmap (T.filter (/= '"') . T.strip) (parseSep sep headerLine)
     let schemaMap = elements schema
diff --git a/src/DataFrame/Lazy/Internal/Executor.hs b/src/DataFrame/Lazy/Internal/Executor.hs
--- a/src/DataFrame/Lazy/Internal/Executor.hs
+++ b/src/DataFrame/Lazy/Internal/Executor.hs
@@ -620,10 +620,6 @@
             Just i -> off + i + 1
             Nothing -> BS.length body
 
--- ---------------------------------------------------------------------------
--- Join helper
--- ---------------------------------------------------------------------------
-
 {- | Route a join to 'Operations.Join', renaming the right key when the names
 differ. 'Join.join' keeps its first argument, so LEFT/RIGHT must pass 'leftDf'
 first to retain the intended side; symmetric INNER/FULL_OUTER pass @rightDf@ first.
