diff --git a/src/library/Yi/Buffer/HighLevel.hs b/src/library/Yi/Buffer/HighLevel.hs
--- a/src/library/Yi/Buffer/HighLevel.hs
+++ b/src/library/Yi/Buffer/HighLevel.hs
@@ -923,11 +923,9 @@
     (l0, _) <- getLineAndColOfPoint $ regionStart reg
     (l1, _) <- getLineAndColOfPoint $ regionEnd reg
     moveTo $ 1 + regionEnd reg
-    fmap (reverse . catMaybes) $ forM [0 .. abs (l0 - l1)] $ \i -> savingPointB $ do
+    fmap reverse $ forM [0 .. abs (l0 - l1)] $ \i -> savingPointB $ do
         void $ lineMoveRel $ -i
-        p <- pointB
-        eol <- atEol
-        return (if not eol then Just p else Nothing)
+        pointB
 rightEdgesOfRegionB LineWise reg = savingPointB $ do
     lastEol <- do
         moveTo $ regionEnd reg
diff --git a/src/library/Yi/Dired.hs b/src/library/Yi/Dired.hs
--- a/src/library/Yi/Dired.hs
+++ b/src/library/Yi/Dired.hs
@@ -62,6 +62,7 @@
 import           Data.Maybe               (fromMaybe)
 import           Data.Monoid              (mempty, (<>))
 import qualified Data.Text                as T (Text, pack, unpack)
+import qualified Data.Text.ICU            as ICU (regex, find, unfold, group, MatchOption(..))
 import           Data.Time.Clock.POSIX    (posixSecondsToUTCTime)
 import           Data.Typeable            (Typeable)
 import           System.CanonicalizePath  (canonicalizePath)
@@ -103,7 +104,6 @@
 import           Yi.MiniBuffer            (noHint, spawnMinibufferE, withMinibuffer, withMinibufferFree)
 import           Yi.Misc                  (getFolder, promptFile)
 import           Yi.Monad                 (gets)
-import           Yi.Regex                 (AllTextSubmatches (..), (=~))
 import qualified Yi.Rope                  as R
 import           Yi.String                (showT)
 import           Yi.Style
@@ -258,10 +258,12 @@
       content <- withGivenBuffer b elemsB
 
       let header = R.take 1024 content
-          rx = "\\-\\*\\- *([^ ]*) *\\-\\*\\-" :: String
-          hmode = case R.toString header =~ rx of
-              AllTextSubmatches [_,m] -> T.pack m
-              _ -> ""
+          rx = ICU.regex [] "\\-\\*\\- *([^ ]*) *\\-\\*\\-"
+          hmode = case ICU.find rx (R.toText header) of
+              Nothing -> ""
+              Just m  -> case (ICU.group 1 m) of
+                           Just n  -> n
+                           Nothing -> ""
           Just mode = find (\(AnyMode m) -> modeName m == hmode) tbl <|>
                       find (\(AnyMode m) -> modeApplies m f header) tbl <|>
                       Just (AnyMode emptyMode)
diff --git a/src/library/Yi/Eval.hs b/src/library/Yi/Eval.hs
--- a/src/library/Yi/Eval.hs
+++ b/src/library/Yi/Eval.hs
@@ -4,6 +4,9 @@
 {-# LANGUAGE LambdaCase                 #-}
 {-# LANGUAGE OverloadedStrings          #-}
 {-# LANGUAGE TemplateHaskell            #-}
+#ifdef HINT
+{-# LANGUAGE FlexibleContexts #-}
+#endif
 {-# OPTIONS_HADDOCK show-extensions #-}
 
 -- |
@@ -159,8 +162,6 @@
 evaluator :: Field Evaluator
 evaluator = customVariable
 
-instance YiConfigVariable Evaluator
-
 -- * Evaluator based on GHCi
 -- | Cached variable for getAllNamesInScopeImpl
 newtype NamesCache = NamesCache [String] deriving (Typeable, Binary)
@@ -401,3 +402,5 @@
 #else
     def = publishedActionsEvaluator
 #endif
+
+instance YiConfigVariable Evaluator
diff --git a/src/library/Yi/Keymap/Vim/VisualMap.hs b/src/library/Yi/Keymap/Vim/VisualMap.hs
--- a/src/library/Yi/Keymap/Vim/VisualMap.hs
+++ b/src/library/Yi/Keymap/Vim/VisualMap.hs
@@ -142,6 +142,9 @@
 operatorBindings operators = fmap mkOperatorBinding $ operators ++ visualOperators
     where visualOperators = fmap synonymOp
                                   [ ("x", "d")
+                                  , ("s", "c")
+                                  , ("S", "c")
+                                  , ("C", "c")
                                   , ("~", "g~")
                                   , ("Y", "y")
                                   , ("u", "gu")
@@ -242,7 +245,8 @@
                       "I" -> leftEdgesOfRegionB style region
                       "A" -> rightEdgesOfRegionB style region
                       _ -> error "Just silencing ghc's false positive warning."
-                  withCurrentBuffer $ moveTo $ head cursors
+                  case cursors of
+                      (mainCursor : _) -> withCurrentBuffer (moveTo mainCursor)
                   modifyStateE $ \s -> s { vsSecondaryCursors = drop 1 cursors }
                   switchModeE $ Insert (head evs)
                   return Continue
diff --git a/src/library/Yi/Modes.hs b/src/library/Yi/Modes.hs
--- a/src/library/Yi/Modes.hs
+++ b/src/library/Yi/Modes.hs
@@ -21,13 +21,14 @@
                  gitCommitMode, rubyMode, styleMode
                 ) where
 
-import "regex-tdfa" Text.Regex.TDFA  ((=~))
-
 import           Control.Applicative ((<$>))
 import           Control.Lens        ((%~), (&), (.~), (^.))
 import           Data.List           (isPrefixOf)
-import           Data.Maybe          (fromMaybe)
+import           Data.Maybe          (fromMaybe, isJust)
 import           System.FilePath     (takeDirectory, takeExtension, takeFileName)
+import qualified Data.Text           as T (Text)
+import qualified Data.Text.ICU       as ICU (regex, find, MatchOption(..))
+
 import           Yi.Buffer
 import qualified Yi.IncrementalParse  as IncrParser (scanner)
 import           Yi.Keymap            (YiM)
@@ -50,7 +51,7 @@
 import qualified Yi.Lexer.SVNCommit   as SVNCommit (lexer)
 import qualified Yi.Lexer.Whitespace  as Whitespace (lexer)
 import           Yi.MiniBuffer        (anyModeByNameM)
-import qualified Yi.Rope              as R (YiString, toString)
+import qualified Yi.Rope              as R (YiString, toText)
 import           Yi.Search            (makeSimpleSearch)
 import           Yi.Style             (StyleName)
 import           Yi.Syntax            (ExtHL (ExtHL))
@@ -233,10 +234,12 @@
 
 -- | When applied to an extensions list and regular expression pattern, creates
 -- a 'Mode.modeApplies' function.
-extensionOrContentsMatch :: [String] -> String -> FilePath -> R.YiString -> Bool
+extensionOrContentsMatch :: [String] -> T.Text -> FilePath -> R.YiString -> Bool
 extensionOrContentsMatch extensions pattern fileName contents
-    = extensionMatches extensions fileName || contentsMatch
-    where contentsMatch = R.toString contents =~ pattern :: Bool
+    = extensionMatches extensions fileName || isJust m
+    where
+        r = ICU.regex [] pattern
+        m = ICU.find r $ R.toText contents
 
 -- | Adds a hook to all matching hooks in a list
 hookModes :: (AnyMode -> Bool) -> BufferM () -> [AnyMode] -> [AnyMode]
diff --git a/src/library/Yi/Rectangle.hs b/src/library/Yi/Rectangle.hs
--- a/src/library/Yi/Rectangle.hs
+++ b/src/library/Yi/Rectangle.hs
@@ -13,13 +13,12 @@
 
 module Yi.Rectangle where
 
-import "regex-tdfa" Text.Regex.TDFA ( (=~), AllTextSubmatches(..) )
-
 import           Control.Applicative ((<$>))
 import           Control.Monad       (forM_)
 import           Data.List           (sort, transpose)
 import           Data.Monoid         ((<>))
 import qualified Data.Text           as T (Text, concat, justifyLeft, length, pack, unpack)
+import qualified Data.Text.ICU       as ICU (regex, find, unfold, group)
 import           Yi.Buffer
 import           Yi.Editor           (EditorM, getRegE, setRegE, withCurrentBuffer)
 import qualified Yi.Rope             as R
@@ -30,17 +29,17 @@
   s <- getSelectRegionB >>= unitWiseRegion Line
   modifyRegionB (R.fromText . alignText str . R.toText) s
   where
-    regexSplit :: String -> String -> [T.Text]
-    regexSplit regex l = case l =~ regex of
-        AllTextSubmatches (_:matches) -> T.pack <$> matches
-        _ -> error "regexSplit: text does not match"
+    regexSplit :: T.Text -> T.Text -> [T.Text]
+    regexSplit pattern l = case ICU.find (ICU.regex [] pattern) l of
+        Nothing -> error "regexSplit: text does not match"
+        Just m  -> drop 1 $ ICU.unfold ICU.group m
 
     alignText :: T.Text -> T.Text -> T.Text
     alignText regex text = unlines' ls'
       where ls, ls' :: [T.Text]
             ls = lines' text
             columns :: [[T.Text]]
-            columns = regexSplit (T.unpack regex) <$> (T.unpack <$> ls)
+            columns = regexSplit regex <$> ls
 
             columnsWidth :: [Int]
             columnsWidth = fmap (maximum . fmap T.length) $ transpose columns
diff --git a/src/library/Yi/Types.hs b/src/library/Yi/Types.hs
--- a/src/library/Yi/Types.hs
+++ b/src/library/Yi/Types.hs
@@ -27,7 +27,7 @@
 module Yi.Types where
 
 #ifdef FRONTEND_VTY
-import qualified Graphics.Vty as Vty ()
+import qualified Graphics.Vty as Vty (Config)
 #endif
 
 import           Control.Applicative            (Applicative, pure, (<$>), (<*>))
@@ -53,7 +53,6 @@
 import           Data.Traversable               (Traversable)
 import           Data.Typeable                  (Typeable)
 import           Data.Word                      (Word8)
-import qualified Graphics.Vty                   as Vty (Config)
 import           Yi.Buffer.Basic                (BufferRef, WindowRef)
 import           Yi.Buffer.Implementation
 import           Yi.Buffer.Undo                 (URList)
diff --git a/src/library/Yi/UI/Pango.hs b/src/library/Yi/UI/Pango.hs
--- a/src/library/Yi/UI/Pango.hs
+++ b/src/library/Yi/UI/Pango.hs
@@ -23,7 +23,7 @@
 import           Control.Applicative
 import           Control.Concurrent
 import           Control.Exception (catch, SomeException)
-import           Control.Lens hiding (set, Action, from)
+import           Control.Lens hiding (set, from)
 import           Control.Monad hiding (forM_, mapM_, forM, mapM)
 import           Data.Foldable
 import           Data.IORef
diff --git a/src/tests/vimtests/repeat/O1.test b/src/tests/vimtests/repeat/O1.test
new file mode 100644
--- /dev/null
+++ b/src/tests/vimtests/repeat/O1.test
@@ -0,0 +1,17 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(7,3)
+123
+456
+abc
+abc
+abc
+abc
+abc
+789
+-- Events
+2oabc<Esc>3.
diff --git a/src/tests/vimtests/visual/A_3.test b/src/tests/vimtests/visual/A_3.test
new file mode 100644
--- /dev/null
+++ b/src/tests/vimtests/visual/A_3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+123
+-- Output
+(1,7)
+123text
+-- Events
+<C-v>$Atext<Esc>
diff --git a/src/tests/vimtests/visual/CSs.test b/src/tests/vimtests/visual/CSs.test
new file mode 100644
--- /dev/null
+++ b/src/tests/vimtests/visual/CSs.test
@@ -0,0 +1,30 @@
+-- Input
+(1,1)
+0; nil       20; binil     40; quadnil
+1; un        21; biun      41; quadun
+2; bi        22; bibi      42; quadbi
+3; tri       23; bitri     43; quadtri
+4; quad      24; biquad    44; quadquad
+5; pent      25; bipent    45; quadpent
+6; hex       26; bihex     46; quadhex
+7; sept      27; bisept    47; quadsept
+8; oct       28; bioct     48; quadoct
+9; enn       29; bienn     49; quadenn
+X; dec       2X; bidec     4X; quaddec
+E; lev       2E; bilev     4E; quadlev
+-- Output
+(11,7)
+0; nil       20; binil     40; quadnil
+1; un        21; biun      41; quadun
+2; two       22; bibi      42; quadbi
+3; tri       23; bitri     43; quadtri
+4; quad      24; biquad    44; quadquad
+5; pent      25; bipent    45; quadpent
+6; six       26; bihex     46; quadhex
+7; sept      27; bisept    47; quadsept
+8; oct       28; bioct     48; quadoct
+9; nine      29; bienn     49; quadenn
+X; ten       2X; bidec     4X; quaddec
+E; lev       2E; bilev     4E; quadlev
+-- Events
+2j3lv3lstwo <Esc>4j03lvelcsix <Esc>3j03lv4lCnine <Esc>j03lvelSten <Esc>
diff --git a/yi.cabal b/yi.cabal
--- a/yi.cabal
+++ b/yi.cabal
@@ -1,5 +1,5 @@
 name:           yi
-version:        0.12.0
+version:        0.12.1
 category:       Development, Editor
 synopsis:       The Haskell-Scriptable Editor
 description:
@@ -104,10 +104,7 @@
   Description: bake-in the self-checks
 
 flag hint
-  Default: False
-  -- TODO: figure out how to write this
-  -- if impl(ghc < 7.10.1)
-  --   Default: True
+  Default: True
   Description: Include hint (haskell interpreter) in yi
 
 library
@@ -276,7 +273,7 @@
     bytestring >= 0.9.1 && < 0.11,
     dynamic-state >= 0.1.0.5,
     data-default,
-    lens >= 4.4.0.1,
+    lens >= 4.7,
     dlist >=0.4.1,
     dyre >=0.8.11,
     filepath >= 1.1,
@@ -284,8 +281,7 @@
     mtl >= 0.1.0.1,
     parsec >= 3.0,
     pointedlist >= 0.5,
-    regex-base ==0.93.*,
-    regex-tdfa >= 1.1 && <1.3,
+    text-icu >= 0.7,
     safe >= 0.3.4 && < 0.4,
     split >= 0.1 && < 0.3,
     template-haskell >= 2.4,
@@ -348,7 +344,7 @@
       Yi.UI.Vty.Conversions
     build-depends:
       unix-compat >=0.1 && <0.5,
-      vty >= 5.2.4 && < 6
+      vty >= 5.2.4 && < 5.4
     cpp-options: -DFRONTEND_VTY
 
   other-modules:
@@ -394,7 +390,7 @@
     Vim.TestPureEditorManipulations
   build-depends:
     base,
-    lens >= 4.4.0.1,
+    lens >= 4.7,
     semigroups,
     tasty,
     tasty-hunit,
