diff --git a/src/line_buffer.rs b/src/line_buffer.rs
index 07e66243370dcc09f72be7d0ebe3c38f5f213bdd..c8b22a54a60ede97806488d4055981413d9c57a2 100644
--- a/src/line_buffer.rs
+++ b/src/line_buffer.rs
@@ -354,14 +354,15 @@ impl LineBuffer {
         if pos == self.buf.len() {
             return None;
         }
-        let mut wp = self.buf.len() - pos;
+        let mut wp = 0;
         let mut gis = self.buf[pos..].grapheme_indices(true);
+        let mut gi = None;
         if at == At::End {
             // TODO Validate
-            gis.next();
+            gi = gis.next();
         }
         'outer: for _ in 0..n {
-            let mut gi = gis.next();
+            gi = gis.next();
             'inner: loop {
                 match gi {
                     Some((i, x)) => {
@@ -392,7 +393,18 @@ impl LineBuffer {
                 }
             }
         }
-        Some(wp + pos)
+        if wp == 0 {
+            if word_def == Word::Emacs {
+                Some(self.buf.len())
+            } else {
+                match gi {
+                    Some((i, _)) if i != 0 => Some(i + pos),
+                    _ => None,
+                }
+            }
+        } else {
+            Some(wp + pos)
+        }
     }
 
     /// Moves the cursor to the end of next word.
@@ -950,7 +962,7 @@ mod test {
         assert_eq!(15, s.pos);
         let ok = s.move_to_next_word(At::End, Word::Vi, 1);
         assert!(ok);
-        assert_eq!(19, s.pos);
+        assert_eq!(18, s.pos);
         let ok = s.move_to_next_word(At::End, Word::Vi, 1);
         assert!(!ok);
     }
@@ -966,7 +978,7 @@ mod test {
         assert_eq!(15, s.pos);
         let ok = s.move_to_next_word(At::End, Word::Big, 1);
         assert!(ok);
-        assert_eq!(19, s.pos);
+        assert_eq!(18, s.pos);
         let ok = s.move_to_next_word(At::End, Word::Big, 1);
         assert!(!ok);
     }
@@ -1003,7 +1015,7 @@ mod test {
         assert_eq!(17, s.pos);
         let ok = s.move_to_next_word(At::Start, Word::Vi, 1);
         assert!(ok);
-        assert_eq!(19, s.pos);
+        assert_eq!(18, s.pos);
         let ok = s.move_to_next_word(At::Start, Word::Vi, 1);
         assert!(!ok);
     }
@@ -1019,7 +1031,7 @@ mod test {
         assert_eq!(17, s.pos);
         let ok = s.move_to_next_word(At::Start, Word::Big, 1);
         assert!(ok);
-        assert_eq!(19, s.pos);
+        assert_eq!(18, s.pos);
         let ok = s.move_to_next_word(At::Start, Word::Big, 1);
         assert!(!ok);
     }