Index: net/ipv4/netfilter/ip_conntrack_netlink.c
===================================================================
--- net/ipv4/netfilter/ip_conntrack_netlink.c
+++ net/ipv4/netfilter/ip_conntrack_netlink.c	2006-06-05 11:50:32.000000000 +0200
@@ -322,7 +322,8 @@
 		      IPCT_PROTOINFO |
 		      IPCT_HELPER |
 		      IPCT_HELPINFO |
-		      IPCT_NATINFO)) {
+		      IPCT_NATINFO |
+              IPCT_MARK)) {
 		type = IPCTNL_MSG_CT_NEW;
 		group = NFNLGRP_CONNTRACK_UPDATE;
 	} else 
@@ -368,6 +369,8 @@
 	if (events & IPCT_HELPINFO
 	    && ctnetlink_dump_helpinfo(skb, ct) < 0)
 		goto nfattr_failure;
+    if (ctnetlink_dump_mark(skb, ct) < 0)
+        goto nfattr_failure;
 
 	if (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 ||
 	    ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0)
Index: net/netfilter/nf_conntrack_netlink.c
===================================================================
--- net/netfilter/nf_conntrack_netlink.c
+++ net/netfilter/nf_conntrack_netlink.c	2006-06-05 11:54:02.000000000 +0200
@@ -332,7 +332,8 @@
 		      IPCT_PROTOINFO |
 		      IPCT_HELPER |
 		      IPCT_HELPINFO |
-		      IPCT_NATINFO)) {
+		      IPCT_NATINFO |
+              IPCT_MARK )) {
 		type = IPCTNL_MSG_CT_NEW;
 		group = NFNLGRP_CONNTRACK_UPDATE;
 	} else
@@ -378,6 +379,9 @@
 	if (events & IPCT_HELPINFO
 	    && ctnetlink_dump_helpinfo(skb, ct) < 0)
 		goto nfattr_failure;
+    if (events & IPCT_MARK
+        && ctnetlink_dump_mark(skb, ct) < 0)
+        goto nfattr_failure;
 
 	if (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 ||
 	    ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0)
Index: net/netfilter/xt_CONNMARK.c
===================================================================
--- net/netfilter/xt_CONNMARK.c
+++ net/netfilter/xt_CONNMARK.c	2006-06-05 11:55:58.000000000 +0200
@@ -51,13 +51,17 @@
 	    switch(markinfo->mode) {
 	    case XT_CONNMARK_SET:
 		newmark = (*ctmark & ~markinfo->mask) | markinfo->mark;
-		if (newmark != *ctmark)
+		if (newmark != *ctmark) {
 		    *ctmark = newmark;
+            ip_conntrack_event_cache(IPCT_MARK, *pskb);
+        }    
 		break;
 	    case XT_CONNMARK_SAVE:
 		newmark = (*ctmark & ~markinfo->mask) | ((*pskb)->nfmark & markinfo->mask);
-		if (*ctmark != newmark)
-		    *ctmark = newmark;
+		if (*ctmark != newmark) {
+            *ctmark = newmark;
+            ip_conntrack_event_cache(IPCT_MARK, *pskb);
+        }
 		break;
 	    case XT_CONNMARK_RESTORE:
 		nfmark = (*pskb)->nfmark;
Index: include/linux/netfilter/nf_conntrack_common.h
===================================================================
--- include/linux/netfilter/nf_conntrack_common.h
+++ include/linux/netfilter/nf_conntrack_common.h	2006-06-05 11:22:15.000000000 +0200
@@ -121,6 +121,10 @@
 	/* Counter highest bit has been set */
 	IPCT_COUNTER_FILLING_BIT = 11,
 	IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT),
+
+	/* Connection mark */
+	IPCT_MARK_BIT = 12,
+	IPCT_MARK = (1 << IPCT_MARK_BIT),
 };
 
 enum ip_conntrack_expect_events {
