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
@@ -1165,7 +1165,6 @@
                 moveToEol
                 lineMoveVisRelDown $ next - 1
 
-
 -- | Implements the same logic that emacs' `mark-word` does.
 -- Checks the mark point and moves it forth (or backward) for one word.
 markWord :: BufferM ()
diff --git a/src/library/Yi/Buffer/Misc.hs b/src/library/Yi/Buffer/Misc.hs
--- a/src/library/Yi/Buffer/Misc.hs
+++ b/src/library/Yi/Buffer/Misc.hs
@@ -192,6 +192,7 @@
   , indentSettingsB
   , fontsizeVariationA
   , encodingConverterNameA
+  , stickyEolA
   ) where
 
 import           Prelude                        hiding (foldr, mapM, notElem)
@@ -590,6 +591,7 @@
             , undos  = emptyU
             , preferCol = Nothing
             , preferVisCol = Nothing
+            , stickyEol = False
             , bufferDynamic = mempty
             , pendingUpdates = []
             , selectionStyle = SelectionStyle False False
diff --git a/src/library/Yi/Keymap/Vim/Common.hs b/src/library/Yi/Keymap/Vim/Common.hs
--- a/src/library/Yi/Keymap/Vim/Common.hs
+++ b/src/library/Yi/Keymap/Vim/Common.hs
@@ -128,7 +128,6 @@
     , vsActiveRegister        :: !RegisterName
     , vsRepeatableAction      :: !(Maybe RepeatableAction)
     , vsStringToEval          :: !EventString -- ^ see Yi.Keymap.Vim.vimEval comment
-    , vsStickyEol             :: !Bool -- ^ is set on $, allows j and k walk the right edge of lines
     , vsOngoingInsertEvents   :: !EventString
     , vsLastGotoCharCommand   :: !(Maybe GotoCharCommand)
     , vsBindingAccumulator    :: !EventString
@@ -156,7 +155,6 @@
             '\0' -- active register
             Nothing -- repeatable action
             mempty -- string to eval
-            False -- sticky eol
             mempty -- ongoing insert events
             Nothing -- last goto char command
             mempty -- binding accumulator
diff --git a/src/library/Yi/Keymap/Vim/NormalMap.hs b/src/library/Yi/Keymap/Vim/NormalMap.hs
--- a/src/library/Yi/Keymap/Vim/NormalMap.hs
+++ b/src/library/Yi/Keymap/Vim/NormalMap.hs
@@ -105,7 +105,7 @@
                   Nothing -> do
                       withCurrentBuffer moveToSol
                       resetCountE
-                      setStickyEolE False
+                      withCurrentBuffer $ stickyEolA .= False
                       return Drop
           f _ _ = NoMatch
 
diff --git a/src/library/Yi/Keymap/Vim/StateUtils.hs b/src/library/Yi/Keymap/Vim/StateUtils.hs
--- a/src/library/Yi/Keymap/Vim/StateUtils.hs
+++ b/src/library/Yi/Keymap/Vim/StateUtils.hs
@@ -27,7 +27,6 @@
     , setRegisterE
     , getRegisterE
     , normalizeCountE
-    , setStickyEolE
     , maybeMult
     , updateModeIndicatorE
     , saveInsertEventStringE
@@ -140,9 +139,6 @@
 maybeMult Nothing  Nothing = Nothing
 maybeMult a        Nothing = a
 maybeMult Nothing  b       = b
-
-setStickyEolE :: Bool -> EditorM ()
-setStickyEolE b = modifyStateE $ \s -> s { vsStickyEol = b }
 
 updateModeIndicatorE :: VimState -> EditorM ()
 updateModeIndicatorE prevState = do
diff --git a/src/library/Yi/Keymap/Vim/Utils.hs b/src/library/Yi/Keymap/Vim/Utils.hs
--- a/src/library/Yi/Keymap/Vim/Utils.hs
+++ b/src/library/Yi/Keymap/Vim/Utils.hs
@@ -28,7 +28,7 @@
   ) where
 
 import           Control.Applicative      ((<$), (<$>))
-import           Control.Lens             ((.=))
+import           Control.Lens             ((.=), use)
 import           Control.Monad            (forM_, void, when)
 import           Data.Char                (isSpace)
 import           Data.Foldable            (asum)
@@ -42,7 +42,7 @@
 import           Yi.Keymap.Vim.Common
 import           Yi.Keymap.Vim.EventUtils (eventToEventString, splitCountedCommand)
 import           Yi.Keymap.Vim.Motion     (Move (Move), stringToMove)
-import           Yi.Keymap.Vim.StateUtils (getMaybeCountE, modifyStateE, resetCountE, setStickyEolE)
+import           Yi.Keymap.Vim.StateUtils (getMaybeCountE, modifyStateE, resetCountE)
 import           Yi.Monad                 (whenM)
 import           Yi.Rope                  (YiString, countNewLines, last)
 import qualified Yi.Rope                  as R (replicateChar, snoc)
@@ -125,7 +125,6 @@
 
     go :: String -> Move -> EditorM RepeatToken
     go evs (Move _style isJump move) = do
-        state <- getEditorDyn
         count <- getMaybeCountE
         prevPoint <- withCurrentBuffer $ do
             p <- pointB
@@ -135,11 +134,13 @@
         when isJump $ addVimJumpAtE prevPoint
         resetCountE
 
+        sticky <- withCurrentBuffer $ use stickyEolA
+
         -- moving with j/k after $ sticks cursor to the right edge
-        when (evs == "$") $ setStickyEolE True
-        when (evs `elem` group "jk" && vsStickyEol state) $
+        when (evs == "$") . withCurrentBuffer $ stickyEolA .= True
+        when (evs `elem` group "jk" && sticky) $
             withCurrentBuffer $ moveToEol >> moveXorSol 1
-        when (evs `notElem` group "jk$") $ setStickyEolE False
+        when (evs `notElem` group "jk$") . withCurrentBuffer $ stickyEolA .= False
 
         let m = head evs
         when (m `elem` ('f' : "FtT")) $ do
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
@@ -80,7 +80,7 @@
                   Nothing -> do
                       withCurrentBuffer moveToSol
                       resetCountE
-                      setStickyEolE False
+                      withCurrentBuffer $ stickyEolA .= False
                       return Continue
           f _ _ = NoMatch
 
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
@@ -216,6 +216,8 @@
     -- ^ prefered column to arrive at when we do a lineDown / lineUp
     , preferVisCol :: !(Maybe Int)
     -- ^ prefered column to arrive at visually (ie, respecting wrap)
+    , stickyEol :: !Bool
+    -- ^ stick to the end of line (used by vim bindings mostly)
     , pendingUpdates :: ![UIUpdate]
     -- ^ updates that haven't been synched in the UI yet
     , selectionStyle :: !SelectionStyle
@@ -238,14 +240,14 @@
 
 
 instance Binary Yi.Types.Attributes where
-    put (Yi.Types.Attributes n b u bd pc pv pu selectionStyle_
+    put (Yi.Types.Attributes n b u bd pc pv se pu selectionStyle_
          _proc wm law lst ro ins _dc _pfw isTransacPresent transacAccum fv cn) = do
       let putTime (UTCTime x y) = B.put (fromEnum x) >> B.put (fromEnum y)
       B.put n >> B.put b >> B.put u >> B.put bd
-      B.put pc >> B.put pv >> B.put pu >> B.put selectionStyle_ >> B.put wm
+      B.put pc >> B.put pv >> B.put se >> B.put pu >> B.put selectionStyle_ >> B.put wm
       B.put law >> putTime lst >> B.put ro >> B.put ins >> B.put _dc
       B.put isTransacPresent >> B.put transacAccum >> B.put fv >> B.put cn
-    get = Yi.Types.Attributes <$> B.get <*> B.get <*> B.get <*>
+    get = Yi.Types.Attributes <$> B.get <*> B.get <*> B.get <*> B.get <*>
           B.get <*> B.get <*> B.get <*> B.get <*> B.get <*> pure I.End <*> B.get <*> B.get
           <*> getTime <*> B.get <*> B.get <*> B.get
           <*> pure (const False) <*> B.get <*> B.get <*> B.get <*> B.get
diff --git a/src/tests/vimtests/repeat/O1.test b/src/tests/vimtests/repeat/O1.test
deleted file mode 100644
--- a/src/tests/vimtests/repeat/O1.test
+++ /dev/null
@@ -1,17 +0,0 @@
--- Input
-(2,1)
-123
-456
-789
--- Output
-(7,3)
-123
-456
-abc
-abc
-abc
-abc
-abc
-789
--- Events
-2oabc<Esc>3.
diff --git a/yi.cabal b/yi.cabal
--- a/yi.cabal
+++ b/yi.cabal
@@ -1,5 +1,5 @@
 name:           yi
-version:        0.12.2
+version:        0.12.3
 category:       Development, Editor
 synopsis:       The Haskell-Scriptable Editor
 description:
@@ -333,9 +333,9 @@
       Yi.UI.Pango.Layouts
       Yi.UI.Pango.Utils
     build-depends:
-      gtk ==0.13.*,
-      glib ==0.13.*,
-      pango ==0.13.*
+      gtk   >= 0.13 && < 0.15,
+      glib  >= 0.13 && < 0.14,
+      pango >= 0.13 && < 0.14
     cpp-options: -DFRONTEND_PANGO
 
   if flag(vty)
