diff --git a/src/jtag/core.c b/src/jtag/core.c
index 0d786e164bc5af520d8de56354699bb8afcc46d8..347196c0da9be47e747ec836f3a7476f09d4f830 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -243,24 +243,30 @@ int jtag_register_event_callback(jtag_event_handler_t callback, void *priv)
 	return ERROR_OK;
 }
 
-int jtag_unregister_event_callback(jtag_event_handler_t callback)
+int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
 {
-	jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
+	jtag_event_callback_t **callbacks_p;
+	jtag_event_callback_t **next;
 
 	if (callback == NULL)
 	{
 		return ERROR_INVALID_ARGUMENTS;
 	}
 
-	while (*callbacks_p)
+	for (callbacks_p = &jtag_event_callbacks;
+			*callbacks_p != NULL;
+			callbacks_p = next)
 	{
-		jtag_event_callback_t **next = &((*callbacks_p)->next);
+		next = &((*callbacks_p)->next);
+
+		if ((*callbacks_p)->priv != priv)
+			continue;
+
 		if ((*callbacks_p)->callback == callback)
 		{
 			free(*callbacks_p);
 			*callbacks_p = *next;
 		}
-		callbacks_p = next;
 	}
 
 	return ERROR_OK;
@@ -1092,6 +1098,8 @@ void jtag_tap_init(jtag_tap_t *tap)
 
 void jtag_tap_free(jtag_tap_t *tap)
 {
+	jtag_unregister_event_callback(&jtag_reset_callback, tap);
+
 	/// @todo is anything missing? no memory leaks please 
 	free((void *)tap->expected_ids);
 	free((void *)tap->chip);
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index 9b378a11e6333d3f0848b812725ac64af86ecf14..34a099b8ec593535304381bba24f1b3756eea098 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -230,7 +230,7 @@ struct jtag_tap_event_action_s
 typedef int (*jtag_event_handler_t)(enum jtag_event event, void* priv);
 
 extern int jtag_register_event_callback(jtag_event_handler_t f, void *x);
-extern int jtag_unregister_event_callback(jtag_event_handler_t f);
+extern int jtag_unregister_event_callback(jtag_event_handler_t f, void *x);
 
 extern int jtag_call_event_callbacks(enum jtag_event event);