diff --git a/ChangeLog b/ChangeLog
index 31f62a7b46a1719672816fb1b72f9b2b3a5962a6..2a0f0adb927d5e5f33df47206ce5cfcad7d228df 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 2016-02-23  Benno Schulenberg  <bensberg@justemail.net>
 	* src/prompt.c (do_statusbar_output, do_statusbar_delete):
 	Rename a variable, for contrast and correctness.
+	* src/cut.c (do_copy_text): Don't move the cursor when copying a
+	backwardly marked region.  This fixes Savannah bug #46980.
 
 2016-02-22  Chris Allegretta <chrisa@asty.org>
 	* Add ability to kill the trailing spaces when justifying
diff --git a/src/cut.c b/src/cut.c
index fffd7bfbeabee5a78ef269d3789e4222be5a221f..4a6b7b9911e59478aa395dfc29613feeb7d408f6 100644
--- a/src/cut.c
+++ b/src/cut.c
@@ -237,6 +237,11 @@ void do_copy_text(void)
     static struct filestruct *next_contiguous_line = NULL;
     bool mark_set = openfile->mark_set;
 
+    /* Remember the current view port and cursor position. */
+    ssize_t is_edittop_lineno = openfile->edittop->lineno;
+    ssize_t is_current_lineno = openfile->current->lineno;
+    size_t is_current_x = openfile->current_x;
+
     if (mark_set || openfile->current != next_contiguous_line)
 	cutbuffer_reset();
 
@@ -244,6 +249,13 @@ void do_copy_text(void)
 
     /* If the mark was set, blow away the cutbuffer on the next copy. */
     next_contiguous_line = (mark_set ? NULL : openfile->current);
+
+    if (mark_set) {
+	/* Restore the view port and cursor position. */
+	openfile->edittop = fsfromline(is_edittop_lineno);
+	openfile->current = fsfromline(is_current_lineno);
+	openfile->current_x = is_current_x;
+    }
 }
 
 /* Cut from the current cursor position to the end of the file. */