Index: epan/packet.c
===================================================================
--- epan/packet.c	(revision 52518)
+++ epan/packet.c	(working copy)
@@ -1789,7 +1789,7 @@
 {
 	gboolean           status;
 	const char        *saved_proto;
-	GSList            *entry;
+	GSList            *entry, *prev;
 	heur_dtbl_entry_t *hdtbl_entry;
 	guint16            saved_can_desegment;
 	gint               saved_layer_names_len = 0;
@@ -1813,7 +1813,7 @@
 	if (pinfo->layer_names != NULL)
 		saved_layer_names_len = (gint) pinfo->layer_names->len;
 
-	for (entry = sub_dissectors; entry != NULL; entry = g_slist_next(entry)) {
+	for (prev = NULL, entry = sub_dissectors; entry != NULL; prev = entry, entry = g_slist_next(entry)) {
 		/* XXX - why set this now and above? */
 		pinfo->can_desegment = saved_can_desegment-(saved_can_desegment>0);
 		hdtbl_entry = (heur_dtbl_entry_t *)entry->data;
@@ -1846,6 +1846,11 @@
 		if ((*hdtbl_entry->dissector)(tvb, pinfo, tree, data)) {
 			EP_CHECK_CANARY(("after heuristic dissector for protocol: %s has accepted and dissected packet",
 					 proto_get_protocol_filter_name(proto_get_id(hdtbl_entry->protocol))));
+			if (prev) {
+				prev->next = entry->next;
+				entry->next = sub_dissectors->next;
+				sub_dissectors->next = entry;
+			}
 			status = TRUE;
 			break;
 		} else {
