diff --git a/CHANGES b/CHANGES
new file mode 100644
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,7 @@
+* 0.1.2.2
+
+  - Fix typo in documentation (davidL)
+
+  - Lazier implementation of splitInternal from Jan Christiansen.
+    Performance on large lists with not very many split points is now
+    greatly improved.
diff --git a/Data/List/Split/Internals.hs b/Data/List/Split/Internals.hs
--- a/Data/List/Split/Internals.hs
+++ b/Data/List/Split/Internals.hs
@@ -138,14 +138,33 @@
 --   ('splitInternal' d l) == l@.
 splitInternal :: Delimiter a -> [a] -> SplitList a
 splitInternal _ [] = []
-splitInternal d xxs@(x:xs) = case matchDelim d xxs of
-                               -- special case for blank delimiter
-                               Just ([], (r:rs)) -> Delim [] : Text [r] : splitInternal d rs
-                               Just (match,rest) -> Delim match : splitInternal d rest
-                               _                 -> x `consText` splitInternal d xs
-  where consText z (Text c : ys) = Text (z:c) : ys
-        consText z ys             = Text [z] : ys
+splitInternal d xxs
+  | null xs   = toSplitList match
+  | otherwise = Text xs : toSplitList match
+ where
+  (xs,match) = breakDelim d xxs
 
+  toSplitList Nothing             = []
+  toSplitList (Just ([],r:rs))    = Delim [] : Text [r] : splitInternal d rs
+  toSplitList (Just (delim,rest)) = Delim delim : splitInternal d rest
+
+breakDelim :: Delimiter a -> [a] -> ([a],Maybe ([a],[a]))
+breakDelim d@(DelimEltPred p) (x:xs)
+  | p x       = ([],Just ([x],xs))
+  | otherwise = let (ys,match) = breakDelim d xs in (x:ys,match)
+breakDelim (DelimEltPred _) []  = ([],Nothing)
+breakDelim (DelimSublist []) xs = ([],Just ([],xs))
+breakDelim (DelimSublist _)  [] = ([],Nothing)
+breakDelim (DelimSublist ds) xxs@(x:xs) =
+  case matchSublist ds xxs of
+      Nothing   -> let (ys,match) = breakDelim (DelimSublist ds) xs in (x:ys,match)
+      Just rest -> ([],Just (ds,rest))
+
+matchSublist :: Eq a => [a] -> [a] -> Maybe [a]
+matchSublist [] xs = Just xs
+matchSublist _  [] = Nothing
+matchSublist (d:ds) (x:xs) = if d==x then matchSublist ds xs else Nothing
+
 -- | Given a split list in the internal tagged representation, produce
 --   a new internal tagged representation corresponding to the final
 --   output, according to the strategy defined by the given
@@ -329,7 +348,7 @@
 --   Equivalent to @'dropInitBlank' . 'keepDelimsL' . 'onSublist'@.
 --   For example:
 --
--- > split (startsWith "app") "applyappicativeapplaudapproachapple" == ["apply","appicative","applaud","approach","apple"]
+-- > split (startsWith "app") "applyapplicativeapplaudapproachapple" == ["apply","applicative","applaud","approach","apple"]
 startsWith :: Eq a => [a] -> Splitter a
 startsWith = dropInitBlank . keepDelimsL . onSublist
 
diff --git a/split.cabal b/split.cabal
--- a/split.cabal
+++ b/split.cabal
@@ -1,12 +1,12 @@
 Name:                split
-Version:             0.1.2.1
+Version:             0.1.2.2
 Stability:           experimental
 Description:         Combinator library and utility functions for splitting lists.
 Homepage:            http://code.haskell.org/~byorgey/code/split
 Synopsis:            Combinator library for splitting lists.
 License:             BSD3
 License-file:        LICENSE
-Extra-source-files:  README, Properties.hs
+Extra-source-files:  README, Properties.hs, CHANGES
 Author:              Brent Yorgey
 Maintainer:          byorgey@cis.upenn.edu
 Category:            List
