updated for version 7.3.1012
Problem:    \Z does not work properly with the new regexp engine.
Solution:   Make \Z work.  Add tests.
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 8a90248..02efe0a 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -1184,14 +1184,15 @@
 		    EMIT(NFA_CONCAT);
 		}
 		return OK;
-	    }		/* if exists closing ] */
-	    else if (reg_strict)
+	    } /* if exists closing ] */
+
+	    if (reg_strict)
 	    {
 		syntax_error = TRUE;
 		EMSG_RET_FAIL(_(e_missingbracket));
 	    }
+	    /* FALLTHROUGH */
 
-	/* FALLTHROUGH */
 	default:
 	    {
 #ifdef FEAT_MBYTE
@@ -1214,7 +1215,7 @@
 			EMIT(c);
 			if (i > 0)
 			    EMIT(NFA_CONCAT);
-			if (i += utf_char2len(c) >= plen)
+			if ((i += utf_char2len(c)) >= plen)
 			    break;
 			c = utf_ptr2char(old_regparse + i);
 		    }
@@ -2269,7 +2270,7 @@
 	    /* TODO */
 	    if (regflags & RF_ICOMBINE)
 	    {
-		goto normalchar;
+		/* use the base character only */
 	    }
 #endif
 	    /* FALLTHROUGH */
@@ -3145,23 +3146,31 @@
 		result = OK;
 		sta = t->state->out;
 		len = 0;
-		while (sta->c != NFA_END_COMPOSING && len < n)
+		if (ireg_icombine)
 		{
-		    if (len > 0)
-			mc = mb_ptr2char(reginput + len);
-		    if (mc != sta->c)
-			break;
-		    len += mb_char2len(mc);
-		    sta = sta->out;
+		    /* If \Z was present, then ignore composing characters. */
+		    /* TODO: How about negated? */
+		    if (sta->c != c)
+			result = FAIL;
+		    len = n;
+		    while (sta->c != NFA_END_COMPOSING)
+			sta = sta->out;
 		}
+		else
+		    while (sta->c != NFA_END_COMPOSING && len < n)
+		    {
+			if (len > 0)
+			    mc = mb_ptr2char(reginput + len);
+			if (mc != sta->c)
+			    break;
+			len += mb_char2len(mc);
+			sta = sta->out;
+		    }
 
 		/* if input char length doesn't match regexp char length */
 		if (len < n || sta->c != NFA_END_COMPOSING)
 		    result = FAIL;
 		end = t->state->out1;	    /* NFA_END_COMPOSING */
-		/* If \Z was present, then ignore composing characters */
-		if (ireg_icombine)
-		    result = 1 ^ sta->negated;
 		ADD_POS_NEG_STATE(end);
 		break;
 	    }
diff --git a/src/testdir/test95.in b/src/testdir/test95.in
index 3451cc5..5e48220 100644
--- a/src/testdir/test95.in
+++ b/src/testdir/test95.in
@@ -41,6 +41,15 @@
 
 :"""" Test \Z
 :call add(tl, ['ú\Z', 'x'])
+:call add(tl, ['יהוה\Z', 'יהוה', 'יהוה'])
+:call add(tl, ['יְהוָה\Z', 'יהוה', 'יהוה'])
+:call add(tl, ['יהוה\Z', 'יְהוָה', 'יְהוָה'])
+:call add(tl, ['יְהוָה\Z', 'יְהוָה', 'יְהוָה'])
+:call add(tl, ['יְ\Z', 'וְיַ', 'יַ'])
+:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
+:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200dxy", "ק\u200dx"])
+:call add(tl, ["ק\u200dx\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
+:call add(tl, ["ק\u200dx\\Z", "xק\u200dxy", "ק\u200dx"])
 
 :"""" Combining different tests and features
 :call add(tl, ['[^[=a=]]\+', 'ddaãâbcd', 'dd'])
diff --git a/src/testdir/test95.ok b/src/testdir/test95.ok
index 57c28d9..8297899 100644
--- a/src/testdir/test95.ok
+++ b/src/testdir/test95.ok
@@ -12,4 +12,13 @@
 OK - .ม
 OK - .ม่
 OK - ú\Z
+OK - יהוה\Z
+OK - יְהוָה\Z
+OK - יהוה\Z
+OK - יְהוָה\Z
+OK - יְ\Z
+OK - ק‍ֹx\Z
+OK - ק‍ֹx\Z
+OK - ק‍x\Z
+OK - ק‍x\Z
 OK - [^[=a=]]\+
diff --git a/src/version.c b/src/version.c
index 1a60933..c551670 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1012,
+/**/
     1011,
 /**/
     1010,