diff --git a/SOURCES/pygobject-3.8.2-gvalue-memory-leak.patch b/SOURCES/pygobject-3.8.2-gvalue-memory-leak.patch
new file mode 100644
index 0000000..f9c20fe
--- /dev/null
+++ b/SOURCES/pygobject-3.8.2-gvalue-memory-leak.patch
@@ -0,0 +1,26 @@
+diff -up pygobject-3.8.2/gi/pygi-marshal-cleanup.c.gvalue-memory-leak pygobject-3.8.2/gi/pygi-marshal-cleanup.c
+--- pygobject-3.8.2/gi/pygi-marshal-cleanup.c.gvalue-memory-leak	2013-03-04 04:19:22.000000000 -0500
++++ pygobject-3.8.2/gi/pygi-marshal-cleanup.c	2014-09-26 09:04:12.780688672 -0400
+@@ -29,16 +29,17 @@ _cleanup_caller_allocates (PyGIInvokeSta
+ {
+     PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)cache;
+ 
+-    if (g_type_is_a (iface_cache->g_type, G_TYPE_BOXED)) {
++    /* check GValue first because GValue is also a boxed sub-type */
++    if (g_type_is_a (iface_cache->g_type, G_TYPE_VALUE)) {
++        if (was_processed)
++            g_value_unset (data);
++        g_slice_free (GValue, data);
++    } else if (g_type_is_a (iface_cache->g_type, G_TYPE_BOXED)) {
+         gsize size;
+         if (was_processed)
+             return; /* will be cleaned up at deallocation */
+         size = g_struct_info_get_size (iface_cache->interface_info);
+         g_slice_free1 (size, data);
+-    } else if (iface_cache->g_type == G_TYPE_VALUE) {
+-        if (was_processed)
+-            g_value_unset (data);
+-        g_slice_free (GValue, data);
+     } else if (iface_cache->is_foreign) {
+         if (was_processed)
+             return; /* will be cleaned up at deallocation */
diff --git a/SOURCES/pygobject-3.8.2-pass-gvalues-by-reference.patch b/SOURCES/pygobject-3.8.2-pass-gvalues-by-reference.patch
new file mode 100644
index 0000000..61a7be0
--- /dev/null
+++ b/SOURCES/pygobject-3.8.2-pass-gvalues-by-reference.patch
@@ -0,0 +1,87 @@
+diff -up pygobject-3.8.2/gi/pygi-argument.c.pass-gvalues-by-reference pygobject-3.8.2/gi/pygi-argument.c
+--- pygobject-3.8.2/gi/pygi-argument.c.pass-gvalues-by-reference	2013-05-13 11:24:49.000000000 -0400
++++ pygobject-3.8.2/gi/pygi-argument.c	2014-09-15 09:00:18.400422884 -0400
+@@ -1266,7 +1266,7 @@ array_success:
+                         pygi_marshal_from_py_gvalue (object,
+                                                      &arg,
+                                                      transfer,
+-                                                     FALSE /*is_allocated*/);
++                                                     FALSE /*copy_reference*/);
+ 
+                     } else if (g_type_is_a (type, G_TYPE_CLOSURE)) {
+                         pygi_marshal_from_py_gclosure (object, &arg);
+diff -up pygobject-3.8.2/gi/pygi-marshal-from-py.c.pass-gvalues-by-reference pygobject-3.8.2/gi/pygi-marshal-from-py.c
+--- pygobject-3.8.2/gi/pygi-marshal-from-py.c.pass-gvalues-by-reference	2013-05-13 11:24:49.000000000 -0400
++++ pygobject-3.8.2/gi/pygi-marshal-from-py.c	2014-09-15 09:00:18.401422919 -0400
+@@ -1650,7 +1650,7 @@ _pygi_marshal_from_py_interface_struct (
+     } else if (iface_cache->g_type == G_TYPE_VALUE) {
+         return pygi_marshal_from_py_gvalue(py_arg, arg,
+                                            arg_cache->transfer,
+-                                           arg_cache->is_caller_allocates);
++                                           TRUE /*copy_reference*/);
+     } else if (iface_cache->is_foreign) {
+         PyObject *success;
+         success = pygi_struct_foreign_convert_to_g_argument (py_arg,
+@@ -1898,13 +1898,14 @@ pygi_marshal_from_py_gobject (PyObject *
+  * py_arg: (in):
+  * arg: (out):
+  * transfer:
+- * is_allocated: TRUE if arg->v_pointer is an already allocated GValue
++ * copy_reference: TRUE if arg should use the pointer reference held by py_arg
++ *                 when it is already holding a GValue vs. copying the value.
+  */
+ gboolean
+ pygi_marshal_from_py_gvalue (PyObject *py_arg,
+                              GIArgument *arg,
+                              GITransfer transfer,
+-                             gboolean is_allocated) {
++                             gboolean copy_reference) {
+     GValue *value;
+     GType object_type;
+ 
+@@ -1914,24 +1915,21 @@ pygi_marshal_from_py_gvalue (PyObject *p
+         return FALSE;
+     }
+ 
+-    if (is_allocated)
+-        value = (GValue *)arg->v_pointer;
+-    else
+-        value = g_slice_new0 (GValue);
+-
+     /* if already a gvalue, use that, else marshal into gvalue */
+     if (object_type == G_TYPE_VALUE) {
+         GValue *source_value = pyg_boxed_get (py_arg, GValue);
+-        if (G_VALUE_TYPE (value) == G_TYPE_INVALID)
++        if (copy_reference) {
++            value = source_value;
++        } else {
++            value = g_slice_new0 (GValue);
+             g_value_init (value, G_VALUE_TYPE (source_value));
+-        g_value_copy (source_value, value);
++            g_value_copy (source_value, value);
++        }
+     } else {
+-        if (G_VALUE_TYPE (value) == G_TYPE_INVALID)
+-            g_value_init (value, object_type);
+-
++        value = g_slice_new0 (GValue);
++        g_value_init (value, object_type);
+         if (pyg_value_from_pyobject (value, py_arg) < 0) {
+-            if (!is_allocated)
+-                g_slice_free (GValue, value);
++            g_slice_free (GValue, value);
+             PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GValue failed");
+             return FALSE;
+         }
+diff -up pygobject-3.8.2/gi/pygi-marshal-from-py.h.pass-gvalues-by-reference pygobject-3.8.2/gi/pygi-marshal-from-py.h
+--- pygobject-3.8.2/gi/pygi-marshal-from-py.h.pass-gvalues-by-reference	2013-05-13 11:24:49.000000000 -0400
++++ pygobject-3.8.2/gi/pygi-marshal-from-py.h	2014-09-15 09:00:18.402422952 -0400
+@@ -193,7 +193,7 @@ gboolean pygi_marshal_from_py_gobject (P
+ gboolean pygi_marshal_from_py_gvalue (PyObject *py_arg, /*in*/
+                                       GIArgument *arg,  /*out*/
+                                       GITransfer transfer,
+-                                      gboolean is_allocated);
++                                      gboolean copy_reference);
+ 
+ gboolean pygi_marshal_from_py_gclosure(PyObject *py_arg, /*in*/
+                                        GIArgument *arg); /*out*/
diff --git a/SPECS/pygobject3.spec b/SPECS/pygobject3.spec
index 1e9de8e..cdbc83c 100644
--- a/SPECS/pygobject3.spec
+++ b/SPECS/pygobject3.spec
@@ -22,7 +22,7 @@
 
 Name: pygobject3
 Version: 3.8.2
-Release: 4%{?dist}
+Release: 6%{?dist}
 License: LGPLv2+ and MIT
 Group: Development/Languages
 Summary: Python 2 bindings for GObject Introspection
@@ -75,6 +75,14 @@ Patch3: test-list-marshalling.patch
 #  https://bugzilla.gnome.org/show_bug.cgi?id=697138
 Patch5: pygobject-3.8.0-known-failures.txt
 
+# Re-add support for passing GValue's by reference
+# https://bugzilla.gnome.org/show_bug.cgi?id=701058
+Patch6: pygobject-3.8.2-pass-gvalues-by-reference.patch
+
+# Fix memory leak for caller allocated GValue out arguments
+# https://bugzilla.gnome.org/show_bug.cgi?id=709397
+Patch7: pygobject-3.8.2-gvalue-memory-leak.patch
+
 ### Build Dependencies ###
 
 BuildRequires: chrpath
@@ -160,6 +168,8 @@ for use in Python 3 programs.
 %patch2 -p1 -b .known-failures
 %patch3 -p1 -b .test-list-marshalling
 %patch5 -p1
+%patch6 -p1 -b .pass-gvalues-by-reference
+%patch7 -p1 -b .gvalue-memory-leak
 
 %if 0%{?with_python3}
 rm -rf %{py3dir}
@@ -271,6 +281,14 @@ xvfb-run make DESTDIR=$RPM_BUILD_ROOT check %{verbosity}
 %endif # with_python3
 
 %changelog
+* Fri Sep 26 2014 Matthew Barnes <mbarnes@redhat.com> - 3.8.2-6
+- Fix memory leak for caller allocated GValue out arguments.
+- Resolves: rhbz#1015413
+
+* Mon Sep 15 2014 Matthew Barnes <mbarnes@redhat.com> - 3.8.2-5
+- Re-add support for passing GValue's by reference.
+- Resolves: rhbz#1138372
+
 * Fri Jan 24 2014 Daniel Mach <dmach@redhat.com> - 3.8.2-4
 - Mass rebuild 2014-01-24