diff --git a/cbits/gwinsz.c b/cbits/gwinsz.c
--- a/cbits/gwinsz.c
+++ b/cbits/gwinsz.c
@@ -1,6 +1,6 @@
 #include <sys/ioctl.h>
 
-unsigned long c_get_window_size(void) {
+unsigned long vty_c_get_window_size(void) {
 	struct winsize w;
 	if (ioctl (0, TIOCGWINSZ, &w) >= 0)
 		return (w.ws_row << 16) + w.ws_col;
diff --git a/cbits/gwinsz.h b/cbits/gwinsz.h
--- a/cbits/gwinsz.h
+++ b/cbits/gwinsz.h
@@ -1,1 +1,1 @@
-unsigned long c_get_window_size(void);
+unsigned long vty_c_get_window_size(void);
diff --git a/cbits/mk_wcwidth.c b/cbits/mk_wcwidth.c
--- a/cbits/mk_wcwidth.c
+++ b/cbits/mk_wcwidth.c
@@ -67,7 +67,7 @@
 };
 
 /* auxiliary function for binary search in interval table */
-static int bisearch(wchar_t ucs, const struct interval *table, int max) {
+static int vty_bisearch(wchar_t ucs, const struct interval *table, int max) {
   int min = 0;
   int mid;
 
@@ -119,7 +119,7 @@
  * in ISO 10646.
  */
 
-int mk_wcwidth(wchar_t ucs)
+int vty_mk_wcwidth(wchar_t ucs)
 {
   /* sorted list of non-overlapping intervals of non-spacing characters */
   /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */
@@ -181,7 +181,7 @@
     return -1;
 
   /* binary search in table of non-spacing characters */
-  if (bisearch(ucs, combining,
+  if (vty_bisearch(ucs, combining,
 	       sizeof(combining) / sizeof(struct interval) - 1))
     return 0;
 
@@ -204,12 +204,12 @@
 }
 
 
-int mk_wcswidth(const wchar_t *pwcs, size_t n)
+int vty_mk_wcswidth(const wchar_t *pwcs, size_t n)
 {
   int w, width = 0;
 
   for (;n-- > 0; pwcs++)
-    if ((w = mk_wcwidth(*pwcs)) < 0)
+    if ((w = vty_mk_wcwidth(*pwcs)) < 0)
       return -1;
     else
       width += w;
@@ -227,7 +227,7 @@
  * the traditional terminal character-width behaviour. It is not
  * otherwise recommended for general use.
  */
-int mk_wcwidth_cjk(wchar_t ucs)
+int vty_mk_wcwidth_cjk(wchar_t ucs)
 {
   /* sorted list of non-overlapping intervals of East Asian Ambiguous
    * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */
@@ -287,20 +287,20 @@
   };
 
   /* binary search in table of non-spacing characters */
-  if (bisearch(ucs, ambiguous,
+  if (vty_bisearch(ucs, ambiguous,
 	       sizeof(ambiguous) / sizeof(struct interval) - 1))
     return 2;
 
-  return mk_wcwidth(ucs);
+  return vty_mk_wcwidth(ucs);
 }
 
 
-int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n)
+int vty_mk_wcswidth_cjk(const wchar_t *pwcs, size_t n)
 {
   int w, width = 0;
 
   for (;n-- > 0; pwcs++)
-    if ((w = mk_wcwidth_cjk(*pwcs)) < 0)
+    if ((w = vty_mk_wcwidth_cjk(*pwcs)) < 0)
       return -1;
     else
       width += w;
diff --git a/cbits/set_term_timing.c b/cbits/set_term_timing.c
--- a/cbits/set_term_timing.c
+++ b/cbits/set_term_timing.c
@@ -3,7 +3,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 
-void set_term_timing(void)
+void vty_set_term_timing(void)
 {
     struct termios trm;
     tcgetattr(STDIN_FILENO, &trm);
diff --git a/src/Codec/Binary/UTF8/Width.hs b/src/Codec/Binary/UTF8/Width.hs
--- a/src/Codec/Binary/UTF8/Width.hs
+++ b/src/Codec/Binary/UTF8/Width.hs
@@ -25,7 +25,7 @@
     )
 {-# NOINLINE wcwidth #-}
 
-foreign import ccall unsafe "mk_wcwidth" wcwidth' :: CWchar -> CInt
+foreign import ccall unsafe "vty_mk_wcwidth" wcwidth' :: CWchar -> CInt
 
 wcswidth :: String -> Int
 wcswidth str = unsafePerformIO (withCWStringLen str $! \(ws, ws_len) -> do
@@ -36,4 +36,4 @@
     )
 {-# NOINLINE wcswidth #-}
 
-foreign import ccall unsafe "mk_wcswidth" wcswidth' :: Ptr CWchar -> CSize -> CInt
+foreign import ccall unsafe "vty_mk_wcswidth" wcswidth' :: Ptr CWchar -> CSize -> CInt
diff --git a/src/Graphics/Vty/LLInput.hs b/src/Graphics/Vty/LLInput.hs
--- a/src/Graphics/Vty/LLInput.hs
+++ b/src/Graphics/Vty/LLInput.hs
@@ -5,12 +5,12 @@
                             , Modifier(..)
                             , Button(..)
                             , Event(..)
-                            , initTermInput 
-                            ) 
+                            , initTermInput
+                            )
     where
 
 import Data.Char
-import Data.Maybe ( mapMaybe 
+import Data.Maybe ( mapMaybe
                   )
 import Data.List( inits )
 import Data.Word
@@ -36,22 +36,22 @@
 -- |Representations of non-modifier keys.
 data Key = KEsc | KFun Int | KBackTab | KPrtScr | KPause | KASCII Char | KBS | KIns
          | KHome | KPageUp | KDel | KEnd | KPageDown | KBegin |  KNP5 | KUp | KMenu
-         | KLeft | KDown | KRight | KEnter 
+         | KLeft | KDown | KRight | KEnter
     deriving (Eq,Show,Ord)
 
 -- |Modifier keys.  Key codes are interpreted such that users are more likely to
 -- have Meta than Alt; for instance on the PC Linux console, 'MMeta' will
 -- generally correspond to the physical Alt key.
-data Modifier = MShift | MCtrl | MMeta | MAlt 
+data Modifier = MShift | MCtrl | MMeta | MAlt
     deriving (Eq,Show,Ord)
 
 -- |Mouse buttons.  Not yet used.
-data Button = BLeft | BMiddle | BRight 
+data Button = BLeft | BMiddle | BRight
     deriving (Eq,Show,Ord)
 
 -- |Generic events.
 data Event = EvKey Key [Modifier] | EvMouse Int Int Button [Modifier]
-           | EvResize Int Int 
+           | EvResize Int Int
     deriving (Eq,Show,Ord)
 
 data KClass = Valid Key [Modifier] | Invalid | Prefix | MisPfx Key [Modifier] [Char]
@@ -70,7 +70,7 @@
   setTerminalAttributes stdInput nattr Immediately
   set_term_timing
   let inputToEventThread :: IO ()
-      inputToEventThread = loop [] 
+      inputToEventThread = loop []
           where loop kb = case (classify kb) of
                               Prefix       -> do c <- readChan inputChannel
                                                  loop (kb ++ [c])
@@ -82,7 +82,7 @@
 
       inputThread :: IO ()
       inputThread = loop
-          where 
+          where
               loop = do
                   setFdOption stdInput NonBlockingRead False
                   threadWaitRead stdInput
@@ -97,7 +97,7 @@
                       writeChan inputChannel (head bytes)
                   readAll
       -- | If there is no input for some time, this thread puts '\xFFFE' in the
-      -- inputChannel. 
+      -- inputChannel.
       noInputThread :: IO ()
       noInputThread = when (escDelay > 0) loop
             where loop = do
@@ -107,8 +107,8 @@
                     when hadNoInput $ do
                         finishAtomicInput
                     loop
-      
 
+
       compile :: [[([Char],(Key,[Modifier]))]] -> [Char] -> KClass
       compile lst = cl' where
           lst' = concat lst
@@ -120,25 +120,25 @@
                                  Just (k,m) -> Valid k m
                                  Nothing -> case head $ mapMaybe (\s -> (,) s `fmap` M.lookup s mlst) $ init $ inits str of
                                               (s,(k,m)) -> MisPfx k m (drop (length s) str)
-      
+
       -- ANSI specific bits
 
 
       classify, classifyTab :: [Char] -> KClass
-      
+
       -- As soon as
       classify "\xFFFE" = Invalid
-      classify s@(c:_) | ord c >= 0xC2 = 
+      classify s@(c:_) | ord c >= 0xC2 =
           if utf8Length (ord c) > length s then Prefix else classifyUtf8 s -- beginning of an utf8 sequence
       classify other = classifyTab other
 
       classifyUtf8 s = case decode ((map (fromIntegral . ord) s) :: [Word8]) of
           Just (unicodeChar, _) -> Valid (KASCII unicodeChar) []
           _ -> Invalid -- something bad happened; just ignore and continue.
-         
+
       classifyTab = compile (caps_classify_table : ansi_classify_table)
-   
-      caps_tabls = [("khome", (KHome, [])), 
+
+      caps_tabls = [("khome", (KHome, [])),
                     ("kend",  (KEnd,  [])),
                     ("cbt",   (KBackTab, [])),
                     ("kcud1", (KDown,  [])),
@@ -149,9 +149,9 @@
                     ("kLFT", (KLeft, [MShift])),
                     ("kRIT", (KRight, [MShift]))
                    ]
-   
+
       caps_classify_table = [(x,y) | (Just x,y) <- map (first (getCapability terminal . tiGetStr)) $ caps_tabls]
-      
+
       ansi_classify_table :: [[([Char], (Key, [Modifier]))]]
       ansi_classify_table =
          [ let k c s = ("\ESC["++c,(s,[])) in [ k "G" KNP5
@@ -159,23 +159,28 @@
                                               , k "A" KUp
                                               , k "B" KDown
                                               , k "C" KRight
-                                              , k "D" KLeft 
+                                              , k "D" KLeft
                                               , k "H" KHome
                                               , k "F" KEnd
                                               , k "E" KBegin
                                               ],
 
-           -- Support for arrows
-           [("\ESC[" ++ charCnt ++ show mc++c,(s,m)) 
+           -- Support for arrows and KHome/KEnd
+           [("\ESC[" ++ charCnt ++ show mc++c,(s,m))
             | charCnt <- ["1;", ""], -- we can have a count or not
-            (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3), 
+            (m,mc) <- [([MShift],2::Int), ([MCtrl],5), ([MMeta],3),
                        ([MShift, MCtrl],6), ([MShift, MMeta],4)], -- modifiers and their codes
-            (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft)] -- directions and their codes
+            (c,s) <- [("A", KUp), ("B", KDown), ("C", KRight), ("D", KLeft), ("H", KHome), ("F", KEnd)] -- directions and their codes
            ],
-           
-           let k n s = ("\ESC["++show n++"~",(s,[])) in zipWith k [2::Int,3,5,6,1,4] 
-                                                                  [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
 
+           let k n s = ("\ESC["++show n++"~",(s,[]))
+           in zipWith k [2::Int,3,5,6,1,4]
+                        [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
+
+           let k n s = ("\ESC["++show n++";5~",(s,[MCtrl]))
+           in zipWith k [2::Int,3,5,6,1,4]
+                        [KIns,KDel,KPageUp,KPageDown,KHome,KEnd],
+
            -- Support for simple characters.
            [ (x:[],(KASCII x,[])) | x <- map toEnum [0..255] ],
 
@@ -186,25 +191,25 @@
            [ ('\ESC':[x],(KASCII x,[MMeta])) | x <- '\ESC':'\t':[' ' .. '\DEL'] ],
 
            -- Ctrl+Char
-           [ ([toEnum x],(KASCII y,[MCtrl])) 
+           [ ([toEnum x],(KASCII y,[MCtrl]))
               | (x,y) <- zip ([0..31]) ('@':['a'..'z']++['['..'_']),
                 y /= 'i' -- Resolve issue #3 where CTRL-i hides TAB.
            ],
-           
+
            -- Ctrl+Meta+Char
            [ ('\ESC':[toEnum x],(KASCII y,[MMeta,MCtrl])) | (x,y) <- zip [0..31] ('@':['a'..'z']++['['..'_']) ],
 
            -- Special support
-           [ -- special support for ESC 
-             ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])), 
+           [ -- special support for ESC
+             ("\ESC",(KEsc,[])) , ("\ESC\ESC",(KEsc,[MMeta])),
 
              -- Special support for backspace
              ("\DEL",(KBS,[])), ("\ESC\DEL",(KBS,[MMeta])),
-             
+
              -- Special support for Enter
-             ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ] 
+             ("\ESC\^J",(KEnter,[MMeta])), ("\^J",(KEnter,[])) ]
          ]
-   
+
   eventThreadId <- forkIO $ inputToEventThread
   inputThreadId <- forkIO $ inputThread
   noInputThreadId <- forkIO $ noInputThread
@@ -225,11 +230,10 @@
 first f (x,y) = (f x, y)
 
 utf8Length :: (Num t, Ord a, Num a) => a -> t
-utf8Length c 
+utf8Length c
     | c < 0x80 = 1
     | c < 0xE0 = 2
     | c < 0xF0 = 3
     | otherwise = 4
 
-foreign import ccall "set_term_timing" set_term_timing :: IO ()
-
+foreign import ccall "vty_set_term_timing" set_term_timing :: IO ()
diff --git a/src/Graphics/Vty/Terminal/TerminfoBased.hs b/src/Graphics/Vty/Terminal/TerminfoBased.hs
--- a/src/Graphics/Vty/Terminal/TerminfoBased.hs
+++ b/src/Graphics/Vty/Terminal/TerminfoBased.hs
@@ -181,7 +181,7 @@
 
     output_handle t = return (term_handle t)
 
-foreign import ccall "gwinsz.h c_get_window_size" c_get_window_size 
+foreign import ccall "gwinsz.h vty_c_get_window_size" c_get_window_size 
     :: IO CLong
 
 get_window_size :: IO (Int,Int)
diff --git a/test/Makefile b/test/Makefile
--- a/test/Makefile
+++ b/test/Makefile
@@ -28,10 +28,10 @@
 # TODO: Tests should also be buildable referencing the currently installed vty
 GHC_ARGS=--make -i../src \
 		 -package parallel \
-		 -package deepseq-1.1.0.2 \
+		 -package deepseq-1.3.0.0 \
 		 -hide-package transformers \
 		 -hide-package monads-tf \
-		 -package QuickCheck-2.4 \
+		 -package QuickCheck \
 		 -ignore-package vty \
 		 ../cbits/gwinsz.c ../cbits/set_term_timing.c  ../cbits/mk_wcwidth.c \
 		 -O -funbox-strict-fields -Wall -threaded -fno-full-laziness -fspec-constr -fspec-constr-count=10 \
diff --git a/vty.cabal b/vty.cabal
--- a/vty.cabal
+++ b/vty.cabal
@@ -1,5 +1,5 @@
 Name:                vty
-Version:             4.7.0.10
+Version:             4.7.0.12
 License:             BSD3
 License-file:        LICENSE
 Author:              Stefan O'Rear, Corey O'Connor
