diff --git a/src/normal.c b/src/normal.c
--- a/src/normal.c
+++ b/src/normal.c
@@ -1451,7 +1451,7 @@
      * This could call do_pending_operator() recursively, but that's OK
      * because gui_yank will be TRUE for the nested call.
      */
-    if (clip_star.available
+    if ((clip_star.available || clip_plus.available)
 	    && oap->op_type != OP_NOP
 	    && !gui_yank
 # ifdef FEAT_VISUAL
diff --git a/src/ops.c b/src/ops.c
--- a/src/ops.c
+++ b/src/ops.c
@@ -957,7 +957,8 @@
 #ifdef FEAT_CLIPBOARD
     /* When Visual area changed, may have to update selection.  Obtain the
      * selection too. */
-    if (name == '*' && clip_star.available)
+    if ((name == '*' && clip_star.available) ||
+        (name == '+' && clip_plus.available))
     {
 	if (clip_isautosel())
 	    clip_update_selection();
diff --git a/src/screen.c b/src/screen.c
--- a/src/screen.c
+++ b/src/screen.c
@@ -2997,7 +2997,8 @@
 	    area_highlighting = TRUE;
 	    attr = hl_attr(HLF_V);
 #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
-	    if (clip_star.available && !clip_star.owned && clip_isautosel())
+	    if (((clip_star.available && !clip_star.owned)||
+	         (clip_plus.available && !clip_plus.owned)) && clip_isautosel())
 		attr = hl_attr(HLF_VNC);
 #endif
 	}
diff --git a/src/ui.c b/src/ui.c
--- a/src/ui.c
+++ b/src/ui.c
@@ -426,6 +426,8 @@
 clip_update_selection()
 {
     pos_T    start, end;
+    VimClipboard *clip;
+    int      i = 0;
 
     /* If visual mode is only due to a redo command ("."), then ignore it */
     if (!redo_VIsual_busy && VIsual_active && (State & NORMAL))
@@ -444,17 +446,25 @@
 	    start = curwin->w_cursor;
 	    end = VIsual;
 	}
-	if (!equalpos(clip_star.start, start)
-		|| !equalpos(clip_star.end, end)
-		|| clip_star.vmode != VIsual_mode)
+	for (i = 0; i < 2; i++)
 	{
-	    clip_clear_selection();
-	    clip_star.start = start;
-	    clip_star.end = end;
-	    clip_star.vmode = VIsual_mode;
-	    clip_free_selection(&clip_star);
-	    clip_own_selection(&clip_star);
-	    clip_gen_set_selection(&clip_star);
+	    if (i == 0)
+	      clip = &clip_star;
+	    else
+	      clip = &clip_plus;
+
+	    if (!equalpos(clip->start, start)
+		    || !equalpos(clip->end, end)
+		    || clip->vmode != VIsual_mode)
+	    {
+		clip_clear_selection();
+		clip->start = start;
+		clip->end = end;
+		clip->vmode = VIsual_mode;
+		clip_free_selection(clip);
+		clip_own_selection(clip);
+		clip_gen_set_selection(clip);
+	    }
 	}
     }
 }
@@ -475,7 +485,7 @@
 	int was_owned = cbd->owned;
 
 	cbd->owned = (clip_gen_own_selection(cbd) == OK);
-	if (!was_owned && cbd == &clip_star)
+	if (!was_owned && (cbd == &clip_star || cbd == &clip_plus))
 	{
 	    /* May have to show a different kind of highlighting for the
 	     * selected area.  There is no specific redraw command for this,
@@ -502,7 +512,10 @@
 #ifdef FEAT_X11
     int	    was_owned = cbd->owned;
 #endif
-    int     visual_selection = (cbd == &clip_star);
+    int     visual_selection = FALSE;
+
+    if (cbd == &clip_star || cbd == &clip_plus)
+	visual_selection = TRUE;
 
     clip_free_selection(cbd);
     cbd->owned = FALSE;
@@ -537,15 +550,26 @@
     void
 clip_copy_selection()
 {
-    if (VIsual_active && (State & NORMAL) && clip_star.available)
+    VimClipboard	*clip;
+    int			i;
+
+    for (i = 0; i < 2; i++)
     {
-	if (clip_isautosel())
-	    clip_update_selection();
-	clip_free_selection(&clip_star);
-	clip_own_selection(&clip_star);
-	if (clip_star.owned)
-	    clip_get_selection(&clip_star);
-	clip_gen_set_selection(&clip_star);
+	if (i == 0)
+	    clip = &clip_plus;
+	else
+	    clip = &clip_star;
+
+	if (VIsual_active && (State & NORMAL) && clip->available)
+	{
+	    if (clip_isautosel())
+		clip_update_selection();
+	    clip_free_selection(clip);
+	    clip_own_selection(clip);
+	    if (clip->owned)
+		clip_get_selection(clip);
+	    clip_gen_set_selection(clip);
+	}
     }
 }
 
