diff --git a/ChangeLog b/ChangeLog
index d8960d847..c08421148 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-06-05  Mike Kestner  <mkestner@novell.com>
+
+	* glib/ManagedValue.cs (ReleaseWrapper): new method.
+	* glib/Value.cs : release the ManagedValue wrapper to avoid leaks.
+	[Fixes #81799]
+
 2007-05-03  Wade Berrier  <wberrier@novell.com>
 
 	* generator/gapi2-codegen.in:
diff --git a/glib/ManagedValue.cs b/glib/ManagedValue.cs
index e61eed622..bea0ea740 100644
--- a/glib/ManagedValue.cs
+++ b/glib/ManagedValue.cs
@@ -93,6 +93,14 @@ namespace GLib {
 				return null;
 			return ((GCHandle)ptr).Target;
 		}
+
+		public static void ReleaseWrapper (IntPtr ptr)
+		{
+			if (ptr == IntPtr.Zero)
+				return;
+
+			((GCHandle)ptr).Free ();
+		}
 	}
 }
 
diff --git a/glib/Value.cs b/glib/Value.cs
index 026999487..57ad7a058 100755
--- a/glib/Value.cs
+++ b/glib/Value.cs
@@ -376,9 +376,11 @@ namespace GLib {
 					IntPtr buf = Marshal.AllocHGlobal (Marshal.SizeOf (value.GetType()));
 					Marshal.StructureToPtr (value, buf, false);
 					g_value_set_pointer (ref this, buf);
-				} else if (type == ManagedValue.GType.Val)
-					g_value_set_boxed (ref this, ManagedValue.WrapObject (value));
-				else if (g_type_is_a (type, GType.Object.Val))
+				} else if (type == ManagedValue.GType.Val) {
+					IntPtr wrapper = ManagedValue.WrapObject (value);
+					g_value_set_boxed (ref this, wrapper);
+					ManagedValue.ReleaseWrapper (wrapper);
+				} else if (g_type_is_a (type, GType.Object.Val))
 					g_value_set_object (ref this, ((GLib.Object) value).Handle);
 				else if (g_type_is_a (type, GType.Boxed.Val)) {
 					if (value is IWrapper) {