updated for version 7.1-243
diff --git a/src/ops.c b/src/ops.c
index 1d5d3bf..2907d8a 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -2197,7 +2197,7 @@
 #ifdef FEAT_VISUAL
     struct block_def	bd;
 #endif
-    int			did_change;
+    int			did_change = FALSE;
 
     if (u_save((linenr_T)(oap->start.lnum - 1),
 				       (linenr_T)(oap->end.lnum + 1)) == FAIL)
@@ -2242,7 +2242,18 @@
 	else if (!oap->inclusive)
 	    dec(&(oap->end));
 
-	did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1);
+	if (pos.lnum == oap->end.lnum)
+	    did_change = swapchars(oap->op_type, &pos,
+						  oap->end.col - pos.col + 1);
+	else
+	    for (;;)
+	    {
+		did_change |= swapchars(oap->op_type, &pos,
+				pos.lnum == oap->end.lnum ? oap->end.col + 1:
+					   (int)STRLEN(ml_get_pos(&pos)));
+		if (ltoreq(oap->end, pos) || inc(&pos) == -1)
+		    break;
+	    }
 	if (did_change)
 	{
 	    changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1,
@@ -2314,17 +2325,11 @@
     for (todo = length; todo > 0; --todo)
     {
 # ifdef FEAT_MBYTE
-	int pos_col = pos->col;
-
 	if (has_mbyte)
 	    /* we're counting bytes, not characters */
 	    todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1;
 # endif
 	did_change |= swapchar(op_type, pos);
-# ifdef FEAT_MBYTE
-	/* Changing German sharp s to SS increases the column. */
-	todo += pos->col - pos_col;
-# endif
 	if (inc(pos) == -1)    /* at end of file */
 	    break;
     }
diff --git a/src/testdir/test39.in b/src/testdir/test39.in
index d7f294b..a16d4d9 100644
--- a/src/testdir/test39.in
+++ b/src/testdir/test39.in
@@ -1,8 +1,10 @@
 
 Test Visual block mode commands
+And test "U" in Visual mode, also on German sharp S.
 
 STARTTEST
 :so small.vim
+:so mbyte.vim
 /^abcde
 :" Test shift-right of a block
 jlllljj>wlljlll>
@@ -14,7 +16,22 @@
 Gllllkkklllrq
 :" Test block-change
 G$khhhhhkkcmno
-:$-4,$wq! test.out
+:$-4,$w! test.out
+:" gUe must uppercase a whole word, also when ß changes to SS
+Gothe youtußeuu endYpk0wgUe
+:" gUfx must uppercase until x, inclusive.
+O- youßtußexu -0fogUfx
+:" VU must uppercase a whole line
+YpkVU
+:" same, when it's the last line in the buffer
+YPGi111VUddP
+:" Uppercase two lines
+Oblah di
+doh dutVkUj
+:" Uppercase part of two lines
+ddppi333k0i222fyllvjfuUk
+:/^the/,$w >> test.out
+:qa!
 ENDTEST
 
 abcdefghijklm
diff --git a/src/testdir/test39.ok b/src/testdir/test39.ok
index 6fa2867..38a5bc3 100644
--- a/src/testdir/test39.ok
+++ b/src/testdir/test39.ok
@@ -3,3 +3,11 @@
 axyzqqqqef mno        ghijklm
 axyzqqqqefgmnoklm
 abcdqqqqijklm
+the YOUTUSSEUU end
+- yOUSSTUSSEXu -
+THE YOUTUSSEUU END
+111THE YOUTUSSEUU END
+BLAH DI
+DOH DUT
+222the yoUTUSSEUU END
+333THE YOUTUßeuu end
diff --git a/src/version.c b/src/version.c
index 7d70348..3059f3f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    243,
+/**/
     242,
 /**/
     241,