updated for version 7.4.569
Problem:    Having CTRL-C interrupt or not does not check the mode of the
            mapping. (Ingo Karkat)
Solution:   Use a bitmask with the map mode. (Christian Brabandt)
diff --git a/src/getchar.c b/src/getchar.c
index 174cfa8..3ae5f40 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3708,8 +3708,13 @@
 	if (!did_it)
 	    retval = 2;			    /* no match */
 	else if (*keys == Ctrl_C)
+	{
 	    /* If CTRL-C has been unmapped, reuse it for Interrupting. */
-	    mapped_ctrl_c = FALSE;
+	    if (map_table == curbuf->b_maphash)
+		curbuf->b_mapped_ctrl_c &= ~mode;
+	    else
+		mapped_ctrl_c &= ~mode;
+	}
 	goto theend;
     }
 
@@ -3744,7 +3749,12 @@
 
     /* If CTRL-C has been mapped, don't always use it for Interrupting. */
     if (*keys == Ctrl_C)
-	mapped_ctrl_c = TRUE;
+    {
+	if (map_table == curbuf->b_maphash)
+	    curbuf->b_mapped_ctrl_c |= mode;
+	else
+	    mapped_ctrl_c |= mode;
+    }
 
     mp->m_keys = vim_strsave(keys);
     mp->m_str = vim_strsave(rhs);
diff --git a/src/globals.h b/src/globals.h
index d1fdc33..a26a8b5 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -958,7 +958,7 @@
 #ifdef USE_ON_FLY_SCROLL
 EXTERN int	dont_scroll INIT(= FALSE);/* don't use scrollbars when TRUE */
 #endif
-EXTERN int	mapped_ctrl_c INIT(= FALSE); /* CTRL-C is mapped */
+EXTERN int	mapped_ctrl_c INIT(= FALSE); /* modes where CTRL-C is mapped */
 EXTERN int	ctrl_c_interrupts INIT(= TRUE);	/* CTRL-C sets got_int */
 
 EXTERN cmdmod_T	cmdmod;			/* Ex command modifiers */
diff --git a/src/structs.h b/src/structs.h
index d241753..7e60a38 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1802,6 +1802,7 @@
     cryptstate_T *b_cryptstate;	/* Encryption state while reading or writing
 				 * the file. NULL when not using encryption. */
 #endif
+    int		b_mapped_ctrl_c; /* modes where CTRL-C is mapped */
 
 }; /* file_buffer */
 
diff --git a/src/testdir/test_mapping.in b/src/testdir/test_mapping.in
index 5f895a4..c957569 100644
--- a/src/testdir/test_mapping.in
+++ b/src/testdir/test_mapping.in
@@ -8,6 +8,15 @@
 :inoreab чкпр   vim
 GAчкпр 
 
+:" mapping of ctrl-c in insert mode
+:set cpo-=< cpo-=k
+:inoremap <c-c> <ctrl-c>
+:cnoremap <c-c> dummy
+:cunmap <c-c>
+GA
+TEST2: CTRL-C |A|
+
+:nunmap <c-c>
 
 : " langmap should not get remapped in insert mode
 :inoremap { FAIL_ilangmap
diff --git a/src/testdir/test_mapping.ok b/src/testdir/test_mapping.ok
index 8d94976..cd0e2e1 100644
--- a/src/testdir/test_mapping.ok
+++ b/src/testdir/test_mapping.ok
@@ -1,4 +1,6 @@
 test starts here:
 vim
+TEST2: CTRL-C |<ctrl-c>A|
+
 +
 +
diff --git a/src/ui.c b/src/ui.c
index b268cd7..6fc5bde 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -180,7 +180,7 @@
 
 	/* ... there is no need for CTRL-C to interrupt something, don't let
 	 * it set got_int when it was mapped. */
-	if (mapped_ctrl_c)
+	if ((mapped_ctrl_c | curbuf->b_mapped_ctrl_c) & State)
 	    ctrl_c_interrupts = FALSE;
     }
 
diff --git a/src/version.c b/src/version.c
index 4f9777f..a1b1494 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    569,
+/**/
     568,
 /**/
     567,