diff --git a/ChangeLog b/ChangeLog
index a146d10d6732ca649e46ba18a23a80f8c1718aa9..6f646e0b25aca05c09deb94bc8cb84a74a3d3106 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-03-22  Benno Schulenberg  <bensberg@justemail.net>
+	* src/chars.c (move_mbleft): Start looking for a multibyte char
+	not at the start of the string, but only as far back as such a
+	char can possibly be.  Change suggested by Mark Majeres.
+
 2015-03-21  Benno Schulenberg  <bensberg@justemail.net>
 	* src/text.c (do_alt_speller): Remove some leftovers.
 	* src/search.c: Place some comments better and unwrap some lines.
diff --git a/src/chars.c b/src/chars.c
index 414c47bd34964133d0d693a926eff4530c362060..ccd9f33a3b1b0f788780a9f9826941da1a93876a 100644
--- a/src/chars.c
+++ b/src/chars.c
@@ -484,12 +484,18 @@ int parse_mbchar(const char *buf, char *chr, size_t *col)
  * before the one at pos. */
 size_t move_mbleft(const char *buf, size_t pos)
 {
-    size_t before = 0, char_len = 0;
+    size_t before, char_len = 0;
 
     assert(buf != NULL && pos <= strlen(buf));
 
     /* There is no library function to move backward one multibyte
-     * character.  Here is the naive, O(pos) way to do it. */
+     * character.  So we just start groping for one at the farthest
+     * possible point. */
+    if (mb_cur_max() > pos)
+	before = 0;
+    else
+	before = pos - mb_cur_max();
+
     while (before < pos) {
 	char_len = parse_mbchar(buf + before, NULL, NULL);
 	before += char_len;