diff --git a/src/normal.c b/src/normal.c
--- a/src/normal.c
+++ b/src/normal.c
@@ -960,8 +960,9 @@
 #ifdef FEAT_CMDL_INFO
 	    need_flushbuf |= add_to_showcmd(ca.nchar);
 #endif
-	    if (ca.nchar == 'r' || ca.nchar == '\'' || ca.nchar == '`'
-						      || ca.nchar == Ctrl_BSL)
+	    if (ca.nchar == 'r' || ca.nchar == '\'' || ca.nchar == '`' || ca.nchar == Ctrl_BSL
+		/* gn from redo, need to get one char to determine the operator */
+		|| (( ca.nchar == 'n' || ca.nchar == 'N') && !stuff_empty()))
 	    {
 		cp = &ca.extra_char;	/* need to get a third character */
 		if (ca.nchar != 'r')
@@ -1083,6 +1084,8 @@
 		ca.nchar = ca.extra_char;
 		idx = find_command(ca.cmdchar);
 	    }
+	    else if (ca.nchar == 'n' || ca.nchar == 'N')
+		ca.oap->op_type = get_op_type(*cp, NUL);
 	    else if (*cp == Ctrl_BSL)
 	    {
 		long towait = (p_ttm >= 0 ? p_ttm : p_tm);
@@ -8009,7 +8012,7 @@
 #ifdef FEAT_VISUAL
 	if (!current_search(cap->count1, cap->nchar == 'n'))
 #endif
-	    beep_flush();
+	    clearopbeep(oap);
 	break;
 
     /*
