diff --git a/t/GtkMenu.t b/t/GtkMenu.t
index 96c6f6d..29726f1 100644
--- a/t/GtkMenu.t
+++ b/t/GtkMenu.t
@@ -8,7 +8,7 @@
 # 	- rm
 #########################
 
-use Gtk2::TestHelper tests => 57;
+use Gtk2::TestHelper tests => 61;
 
 ok( my $menubar = Gtk2::MenuBar->new );
 
@@ -124,6 +124,30 @@ $menu->popup(undef, undef, $position_callback, "bla", 1, 0);
 $menu->popdown;
 ok(TRUE);
 
+# crib note: $position_callback sub must be a proper closure referring to a
+# variable outside itself to weaken away like this
+require Scalar::Util;
+Scalar::Util::weaken($position_callback);
+ok ($position_callback, 'popup() holds onto position_callback');
+
+my $next_position_callback_variable = 0;
+my $next_position_callback = sub { $next_position_callback_variable++;
+                                   return (50,50) };
+$menu->popup(undef, undef, $next_position_callback, undef, 1, 0);
+$menu->popdown;
+is ($position_callback, undef,
+    'next popup() drops previously held position_callback');
+
+# crib note: again $next_position_callback must refer to a variable outside
+# itself to weaken away like this
+require Scalar::Util;
+Scalar::Util::weaken($next_position_callback);
+ok ($next_position_callback, 'popup() holds onto next_position_callback');
+$menu->popup(undef, undef, undef, undef, 1, 0);
+$menu->popdown;
+is ($next_position_callback, undef,
+    'popup() with no position func drops held position_callback');
+
 # If we never entered the pos. callback, fake four tests
 unless ($i_know_you) {
 	foreach (0 .. 3) {
@@ -145,5 +169,5 @@ SKIP: {
 
 __END__
 
-Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the
+Copyright (C) 2003, 2010 by the gtk2-perl team (see the file AUTHORS for the
 full list).  See LICENSE for more information.
diff --git a/xs/GtkMenu.xs b/xs/GtkMenu.xs
index 70af96a..f11bfbe 100644
--- a/xs/GtkMenu.xs
+++ b/xs/GtkMenu.xs
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003-2005 by the gtk2-perl team (see the file AUTHORS)
+ * Copyright (c) 2003-2005, 2010 by the gtk2-perl team (see the file AUTHORS)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -125,6 +125,7 @@ gtk_menu_popup (menu, parent_menu_shell, parent_menu_item, menu_pos_func, data,
 	if (!gperl_sv_is_defined (menu_pos_func)) {
 		gtk_menu_popup (menu, parent_menu_shell, parent_menu_item,
 		                NULL, NULL, button, activate_time);
+		g_object_set_data (G_OBJECT(menu), "_menu_pos_callback", NULL);
 	} else {
 		GPerlCallback * callback;
 		/* we don't need to worry about the callback arg types since
