diff --git a/keymap/vim.js b/keymap/vim.js
index 8bf1fe5664877fc92290c63199958017b823a0e7..3d990d1d58d16ab534120abf8ddeb040060d18b4 100644
--- a/keymap/vim.js
+++ b/keymap/vim.js
@@ -3979,6 +3979,15 @@
         var history = cm.doc.history.done;
         var event = history[history.length - 2];
         return event && event.ranges && event.ranges[0].head;
+      } else if (markName == '.') {
+        if (cm.doc.history.lastModTime == 0) {
+          return  // If no changes, bail out; don't bother to copy or reverse history array.
+        } else {
+          var changeHistory = cm.doc.history.done.filter(function(el){ if (el.changes !== undefined) { return el } });
+          changeHistory.reverse();
+          var lastEditPos = changeHistory[0].changes[0].to;
+        }
+        return lastEditPos;
       }
 
       var mark = vim.marks[markName];
diff --git a/test/vim_test.js b/test/vim_test.js
index 9c78685973fc338de369eac3812c695edddcd4e1..18268ee789139815c7fe84e2ca4926862cd2e59c 100644
--- a/test/vim_test.js
+++ b/test/vim_test.js
@@ -1675,6 +1675,16 @@ testVim('mark\'', function(cm, vim, helpers) {
   helpers.doKeys('\'', '\'');
   helpers.assertCursorAt(2, 3);
 });
+testVim('mark.', function(cm, vim, helpers) {
+  cm.setCursor(0, 0);
+  helpers.doKeys('O', 'testing', '<Esc>');
+  cm.setCursor(3, 3);
+  helpers.doKeys('\'', '.');
+  helpers.assertCursorAt(0, 0);
+  cm.setCursor(4, 4);
+  helpers.doKeys('`', '.');
+  helpers.assertCursorAt(0, 6);
+});
 testVim('jumpToMark_next', function(cm, vim, helpers) {
   cm.setCursor(2, 2);
   helpers.doKeys('m', 't');