diff --git a/library/Text/Builder.hs b/library/Text/Builder.hs
--- a/library/Text/Builder.hs
+++ b/library/Text/Builder.hs
@@ -8,6 +8,7 @@
   char,
   text,
   string,
+  asciiByteString,
   unicodeCodePoint,
   utf16CodeUnits1,
   utf16CodeUnits2,
@@ -30,6 +31,7 @@
 import qualified Data.Text.Encoding as E
 import qualified Data.Text.Encoding.Error as E
 import qualified Text.Builder.UTF16 as D
+import qualified Data.ByteString as ByteString
 
 
 newtype Action =
@@ -106,6 +108,18 @@
 utf8CodeUnits4 :: Word8 -> Word8 -> Word8 -> Word8 -> Builder
 utf8CodeUnits4 unit1 unit2 unit3 unit4 =
   D.utf8CodeUnits4 unit1 unit2 unit3 unit4 utf16CodeUnits1 utf16CodeUnits2
+
+{-# INLINABLE asciiByteString #-}
+asciiByteString :: ByteString -> Builder
+asciiByteString byteString =
+  Builder action (ByteString.length byteString)
+  where
+    action =
+      Action $ \array -> let
+        step byte next index = do
+          B.unsafeWrite array index (fromIntegral byte)
+          next (succ index)
+        in ByteString.foldr step (const (return ())) byteString
 
 {-# INLINABLE text #-}
 text :: Text -> Builder
diff --git a/library/Text/Builder/Prelude.hs b/library/Text/Builder/Prelude.hs
--- a/library/Text/Builder/Prelude.hs
+++ b/library/Text/Builder/Prelude.hs
@@ -5,14 +5,72 @@
 )
 where
 
-
--- base-prelude
--------------------------
-import BasePrelude as Exports hiding (assert, left, right, isLeft, isRight, error, First(..), Last(..), (<>))
-
--- semigroup
+-- base
 -------------------------
-import Data.Semigroup as Exports
+import Control.Applicative as Exports
+import Control.Arrow as Exports
+import Control.Category as Exports
+import Control.Concurrent as Exports
+import Control.Exception as Exports
+import Control.Monad as Exports hiding (mapM_, sequence_, forM_, msum, mapM, sequence, forM)
+import Control.Monad.IO.Class as Exports
+import Control.Monad.Fix as Exports hiding (fix)
+import Control.Monad.ST as Exports
+import Control.Monad.ST.Unsafe as Exports
+import Data.Bits as Exports
+import Data.Bool as Exports
+import Data.Char as Exports
+import Data.Coerce as Exports
+import Data.Complex as Exports
+import Data.Data as Exports
+import Data.Dynamic as Exports
+import Data.Either as Exports
+import Data.Fixed as Exports
+import Data.Foldable as Exports
+import Data.Function as Exports hiding (id, (.))
+import Data.Functor as Exports
+import Data.Functor.Identity as Exports
+import Data.Int as Exports
+import Data.IORef as Exports
+import Data.Ix as Exports
+import Data.List as Exports hiding (sortOn, isSubsequenceOf, uncons, concat, foldr, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, find, maximumBy, minimumBy, mapAccumL, mapAccumR, foldl')
+import Data.Maybe as Exports
+import Data.Monoid as Exports hiding (Last(..), First(..))
+import Data.Ord as Exports
+import Data.Proxy as Exports
+import Data.Ratio as Exports
+import Data.STRef as Exports
+import Data.String as Exports
+import Data.Traversable as Exports
+import Data.Tuple as Exports
+import Data.Unique as Exports
+import Data.Version as Exports
+import Data.Word as Exports
+import Debug.Trace as Exports
+import Foreign.ForeignPtr.Unsafe as Exports
+import Foreign.ForeignPtr as Exports
+import Foreign.Ptr as Exports
+import Foreign.StablePtr as Exports
+import Foreign.Storable as Exports hiding (sizeOf, alignment)
+import GHC.Conc as Exports hiding (withMVar, threadWaitWriteSTM, threadWaitWrite, threadWaitReadSTM, threadWaitRead)
+import GHC.Exts as Exports (lazy, inline, sortWith, groupWith)
+import GHC.Generics as Exports (Generic)
+import GHC.IO.Exception as Exports
+import Numeric as Exports
+import Prelude as Exports hiding (concat, foldr, mapM_, sequence_, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, mapM, sequence, id, (.))
+import System.Environment as Exports
+import System.Exit as Exports
+import System.IO as Exports
+import System.IO.Error as Exports
+import System.IO.Unsafe as Exports
+import System.Mem as Exports
+import System.Mem.StableName as Exports
+import System.Timeout as Exports
+import Text.ParserCombinators.ReadP as Exports (ReadP, ReadS, readP_to_S, readS_to_P)
+import Text.ParserCombinators.ReadPrec as Exports (ReadPrec, readPrec_to_P, readP_to_Prec, readPrec_to_S, readS_to_Prec)
+import Text.Printf as Exports (printf, hPrintf)
+import Text.Read as Exports (Read(..), readMaybe, readEither)
+import Unsafe.Coerce as Exports
 
 -- bytestring
 -------------------------
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -1,18 +1,28 @@
 module Main where
 
-import Prelude
+import Prelude hiding (choose)
 import Test.QuickCheck.Instances
 import Test.Tasty
 import Test.Tasty.HUnit
 import Test.Tasty.QuickCheck
 import qualified Data.Text as A
 import qualified Text.Builder as B
+import qualified Data.ByteString as ByteString
+import qualified Data.Text.Encoding as Text
 
 
 main =
   defaultMain $
   testGroup "All tests" $
   [
+    testProperty "ASCII ByteString" $ let
+      gen = listOf $ do
+        list <- listOf (choose (0, 127))
+        return (ByteString.pack list)
+      in forAll gen $ \ chunks ->
+        mconcat chunks ===
+        Text.encodeUtf8 (B.run (foldMap B.asciiByteString chunks))
+    ,
     testProperty "Intercalation has the same effect as in Text" $
     \ separator texts ->
       A.intercalate separator texts ===
diff --git a/text-builder.cabal b/text-builder.cabal
--- a/text-builder.cabal
+++ b/text-builder.cabal
@@ -1,5 +1,5 @@
 name: text-builder
-version: 0.5.3.1
+version: 0.5.4
 category: Text
 synopsis: An efficient strict text builder
 homepage: https://github.com/nikita-volkov/text-builder
@@ -25,7 +25,6 @@
     base >=4.9 && <5,
     base-prelude <2,
     bytestring >=0.10 && <0.11,
-    semigroups >=0.18 && <0.19,
     text >=1 && <2
 
 test-suite test
