diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c
index 81a527f6d..da8b9793c 100644
--- a/gio/ginetsocketaddress.c
+++ b/gio/ginetsocketaddress.c
@@ -53,6 +53,7 @@ struct _GInetSocketAddressPrivate
   guint16       port;
   guint32       flowinfo;
   guint32       scope_id;
+  GProxyResolver *proxy_resolver;
 };
 
 static void   g_inet_socket_address_connectable_iface_init (GSocketConnectableIface *iface);
@@ -68,7 +69,8 @@ enum {
   PROP_ADDRESS,
   PROP_PORT,
   PROP_FLOWINFO,
-  PROP_SCOPE_ID
+  PROP_SCOPE_ID,
+  PROP_PROXY_RESOLVER
 };
 
 static void
@@ -77,6 +79,7 @@ g_inet_socket_address_dispose (GObject *object)
   GInetSocketAddress *address = G_INET_SOCKET_ADDRESS (object);
 
   g_clear_object (&(address->priv->address));
+  g_clear_object (&(address->priv->proxy_resolver));
 
   G_OBJECT_CLASS (g_inet_socket_address_parent_class)->dispose (object);
 }
@@ -109,6 +112,10 @@ g_inet_socket_address_get_property (GObject    *object,
         g_value_set_uint (value, address->priv->scope_id);
         break;
 
+      case PROP_PROXY_RESOLVER:
+        g_value_set_object (value, address->priv->proxy_resolver);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -143,6 +150,11 @@ g_inet_socket_address_set_property (GObject      *object,
         address->priv->scope_id = g_value_get_uint (value);
         break;
 
+      case PROP_PROXY_RESOLVER:
+        g_clear_object (&address->priv->proxy_resolver);
+        address->priv->proxy_resolver = g_value_dup_object (value);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -306,6 +318,8 @@ g_inet_socket_address_class_init (GInetSocketAddressClass *klass)
                                                       G_PARAM_CONSTRUCT_ONLY |
                                                       G_PARAM_READWRITE |
                                                       G_PARAM_STATIC_STRINGS));
+
+  g_object_class_override_property (gobject_class, PROP_PROXY_RESOLVER, "proxy-resolver");
 }
 
 static void
diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c
index 07f923a90..4142c4bf2 100644
--- a/gio/gnetworkaddress.c
+++ b/gio/gnetworkaddress.c
@@ -63,6 +63,7 @@ struct _GNetworkAddressPrivate {
   guint16 port;
   GList *sockaddrs;
   gchar *scheme;
+  GProxyResolver *proxy_resolver;
 
   gint64 resolver_serial;
 };
@@ -72,6 +73,7 @@ enum {
   PROP_HOSTNAME,
   PROP_PORT,
   PROP_SCHEME,
+  PROP_PROXY_RESOLVER,
 };
 
 static void g_network_address_set_property (GObject      *object,
@@ -101,6 +103,7 @@ g_network_address_finalize (GObject *object)
   g_free (addr->priv->hostname);
   g_free (addr->priv->scheme);
   g_list_free_full (addr->priv->sockaddrs, g_object_unref);
+  g_clear_object (&addr->priv->proxy_resolver);
 
   G_OBJECT_CLASS (g_network_address_parent_class)->finalize (object);
 }
@@ -139,6 +142,8 @@ g_network_address_class_init (GNetworkAddressClass *klass)
                                                         G_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT_ONLY |
                                                         G_PARAM_STATIC_STRINGS));
+
+  g_object_class_override_property (gobject_class, PROP_PROXY_RESOLVER, "proxy-resolver");
 }
 
 static void
@@ -174,6 +179,11 @@ g_network_address_set_property (GObject      *object,
       addr->priv->port = g_value_get_uint (value);
       break;
 
+    case PROP_PROXY_RESOLVER:
+      g_clear_object (&addr->priv->proxy_resolver);
+      addr->priv->proxy_resolver = g_value_dup_object (value);
+      break;
+
     case PROP_SCHEME:
       g_free (addr->priv->scheme);
       addr->priv->scheme = g_value_dup_string (value);
@@ -204,6 +214,10 @@ g_network_address_get_property (GObject    *object,
       g_value_set_uint (value, addr->priv->port);
       break;
 
+    case PROP_PROXY_RESOLVER:
+      g_value_set_object (value, addr->priv->proxy_resolver);
+      break;
+
     case PROP_SCHEME:
       g_value_set_string (value, addr->priv->scheme);
       break;
@@ -1107,6 +1121,7 @@ g_network_address_connectable_proxy_enumerate (GSocketConnectable *connectable)
 
   proxy_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
                              "connectable", connectable,
+                             "proxy-resolver", self->priv->proxy_resolver,
       	       	       	     "uri", uri,
       	       	       	     NULL);
 
diff --git a/gio/gnetworkservice.c b/gio/gnetworkservice.c
index a910a2d3c..34e79a6a4 100644
--- a/gio/gnetworkservice.c
+++ b/gio/gnetworkservice.c
@@ -67,6 +67,7 @@ struct _GNetworkServicePrivate
 {
   gchar *service, *protocol, *domain, *scheme;
   GList *targets;
+  GProxyResolver *proxy_resolver;
 };
 
 enum {
@@ -74,7 +75,8 @@ enum {
   PROP_SERVICE,
   PROP_PROTOCOL,
   PROP_DOMAIN,
-  PROP_SCHEME
+  PROP_SCHEME,
+  PROP_PROXY_RESOLVER
 };
 
 static void g_network_service_set_property (GObject      *object,
@@ -105,6 +107,7 @@ g_network_service_finalize (GObject *object)
   g_free (srv->priv->protocol);
   g_free (srv->priv->domain);
   g_free (srv->priv->scheme);
+  g_clear_object (&srv->priv->proxy_resolver);
 
   if (srv->priv->targets)
     g_resolver_free_targets (srv->priv->targets);
@@ -152,7 +155,7 @@ g_network_service_class_init (GNetworkServiceClass *klass)
                                                         NULL,
                                                         G_PARAM_READWRITE |
                                                         G_PARAM_STATIC_STRINGS));
-
+  g_object_class_override_property (gobject_class, PROP_PROXY_RESOLVER, "proxy-resolver");
 }
 
 static void
@@ -195,6 +198,11 @@ g_network_service_set_property (GObject      *object,
       g_network_service_set_scheme (srv, g_value_get_string (value));
       break;
 
+    case PROP_PROXY_RESOLVER:
+      g_clear_object (&srv->priv->proxy_resolver);
+      srv->priv->proxy_resolver = g_value_dup_object (value);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -227,6 +235,10 @@ g_network_service_get_property (GObject    *object,
       g_value_set_string (value, g_network_service_get_scheme (srv));
       break;
 
+    case PROP_PROXY_RESOLVER:
+      g_value_set_object (value, srv->priv->proxy_resolver);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c
index 848e37b0b..3686ed7f7 100644
--- a/gio/gsocketaddress.c
+++ b/gio/gsocketaddress.c
@@ -61,7 +61,15 @@
 enum
 {
   PROP_NONE,
-  PROP_FAMILY
+  PROP_FAMILY,
+  PROP_PROXY_RESOLVER
+};
+
+typedef struct _GSocketAddressPrivate GSocketAddressPrivate;
+
+struct _GSocketAddressPrivate
+{
+  GProxyResolver *proxy_resolver;
 };
 
 static void                      g_socket_address_connectable_iface_init       (GSocketConnectableIface *iface);
@@ -69,6 +77,7 @@ static GSocketAddressEnumerator *g_socket_address_connectable_enumerate	       (
 static GSocketAddressEnumerator *g_socket_address_connectable_proxy_enumerate  (GSocketConnectable      *connectable);
 
 G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GSocketAddress, g_socket_address, G_TYPE_OBJECT,
+				  G_ADD_PRIVATE (GSocketAddress)
 				  G_IMPLEMENT_INTERFACE (G_TYPE_SOCKET_CONNECTABLE,
 							 g_socket_address_connectable_iface_init))
 
@@ -95,6 +104,7 @@ g_socket_address_get_property (GObject *object, guint prop_id,
 			       GValue *value, GParamSpec *pspec)
 {
   GSocketAddress *address = G_SOCKET_ADDRESS (object);
+  GSocketAddressPrivate *priv = NULL;
 
   switch (prop_id)
     {
@@ -102,17 +112,57 @@ g_socket_address_get_property (GObject *object, guint prop_id,
       g_value_set_enum (value, g_socket_address_get_family (address));
       break;
 
+     case PROP_PROXY_RESOLVER:
+      priv = g_socket_address_get_instance_private (address);
+      g_value_set_object (value, priv->proxy_resolver);
+      break;
+
      default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
 }
 
+static void
+g_socket_address_set_property (GObject      *object,
+			       guint         prop_id,
+			       const GValue *value,
+			       GParamSpec   *pspec)
+{
+  GSocketAddress *address = G_SOCKET_ADDRESS (object);
+  GSocketAddressPrivate *priv = NULL;
+
+  switch (prop_id)
+   {
+    case PROP_PROXY_RESOLVER:
+      priv = g_socket_address_get_instance_private (address);
+      g_clear_object (&priv->proxy_resolver);
+      priv->proxy_resolver = g_value_dup_object (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+   }
+}
+
+static void
+g_socket_address_dispose (GObject *object)
+{
+  GSocketAddress *address = G_SOCKET_ADDRESS (object);
+  GSocketAddressPrivate *priv = g_socket_address_get_instance_private (address);
+
+  g_clear_object (&priv->proxy_resolver);
+
+  G_OBJECT_CLASS (g_socket_address_parent_class)->dispose (object);
+}
+
 static void
 g_socket_address_class_init (GSocketAddressClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
   gobject_class->get_property = g_socket_address_get_property;
+  gobject_class->set_property = g_socket_address_set_property;
+  gobject_class->dispose = g_socket_address_dispose;
 
   g_object_class_install_property (gobject_class, PROP_FAMILY,
                                    g_param_spec_enum ("family",
@@ -122,6 +172,7 @@ g_socket_address_class_init (GSocketAddressClass *klass)
 						      G_SOCKET_FAMILY_INVALID,
 						      G_PARAM_READABLE |
                                                       G_PARAM_STATIC_STRINGS));
+  g_object_class_override_property (gobject_class, PROP_PROXY_RESOLVER, "proxy-resolver");
 }
 
 static void
@@ -391,20 +442,23 @@ g_socket_address_connectable_proxy_enumerate (GSocketConnectable *connectable)
       !G_IS_PROXY_ADDRESS (connectable))
     {
       GInetAddress *addr;
+      GProxyResolver *proxy_resolver = NULL;
       guint port;
       gchar *uri;
       gchar *ip;
 
-      g_object_get (connectable, "address", &addr, "port", &port, NULL);
+      g_object_get (connectable, "address", &addr, "port", &port, "proxy-resolver", &proxy_resolver, NULL);
 
       ip = g_inet_address_to_string (addr);
       uri = _g_uri_from_authority ("none", ip, port, NULL);
 
       addr_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR,
       	       	       	       	"connectable", connectable,
+                                "proxy-resolver", proxy_resolver,
       	       	       	       	"uri", uri,
       	       	       	       	NULL);
 
+      g_clear_object (&proxy_resolver);
       g_object_unref (addr);
       g_free (ip);
       g_free (uri);
diff --git a/gio/gsocketconnectable.c b/gio/gsocketconnectable.c
index 76f349faf..2db77820d 100644
--- a/gio/gsocketconnectable.c
+++ b/gio/gsocketconnectable.c
@@ -18,6 +18,7 @@
 
 #include "config.h"
 #include "gsocketconnectable.h"
+#include "gproxyresolver.h"
 #include "glibintl.h"
 
 
@@ -92,6 +93,22 @@ G_DEFINE_INTERFACE (GSocketConnectable, g_socket_connectable, G_TYPE_OBJECT)
 static void
 g_socket_connectable_default_init (GSocketConnectableInterface *iface)
 {
+  /**
+   * GSocketConnectableInterface:proxy-resolver
+   *
+   * Provides a #GproxyResolver to be used when resolving
+   * this #GSocketConnectable.
+   *
+   * Since: 2.56
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_object (
+      "proxy-resolver",
+      "Proxy Resolver",
+      NULL,
+      G_TYPE_PROXY_RESOLVER,
+      G_PARAM_READWRITE |
+      G_PARAM_STATIC_STRINGS));
 }
 
 /**
@@ -177,3 +194,50 @@ g_socket_connectable_to_string (GSocketConnectable *connectable)
   else
     return g_strdup (G_OBJECT_TYPE_NAME (connectable));
 }
+
+/**
+ * g_socket_connectable_ref_proxy_resolver:
+ * @connectable: a #GSocketConnectable
+ *
+ * Returns referenced #GProxyResolver associated with the @connectable,
+ * or %NULL, when none is set. Unref non-NULL returned object with
+ * g_object_unref(), when no longer needed.
+ *
+ * Returns: (transfer full) (nullable): associated #GProxyResolver, or %NULL
+ *
+ * Since: 2.56
+ */
+GProxyResolver *
+g_socket_connectable_ref_proxy_resolver (GSocketConnectable *connectable)
+{
+  GProxyResolver *proxy_resolver = NULL;
+
+  g_return_val_if_fail (G_IS_SOCKET_CONNECTABLE (connectable), NULL);
+
+  g_object_get (G_OBJECT (connectable), "proxy-resolver", &proxy_resolver, NULL);
+
+  return proxy_resolver;
+}
+
+/**
+ * g_socket_connectable_set_proxy_resolver:
+ * @connectable: a #GSocketConnectable
+ * @proxy_resolver: (transfer full) (nullable): a #GProxyresolver, or %NULL
+ *
+ * Assigns @proxy_resolver to be used when resolving @connectable address.
+ * It can be %NULL, to unset the previous value.
+ *
+ * The @connectable adds its own reference on @proxy_resolver, if not %NULL.
+ *
+ * Since: 2.56
+ */
+void
+g_socket_connectable_set_proxy_resolver (GSocketConnectable *connectable,
+					 GProxyResolver *proxy_resolver)
+{
+  g_return_if_fail (G_IS_SOCKET_CONNECTABLE (connectable));
+  if (proxy_resolver)
+    g_return_if_fail (G_IS_PROXY_RESOLVER (proxy_resolver));
+
+  g_object_set (G_OBJECT (connectable), "proxy-resolver", proxy_resolver, NULL);
+}
diff --git a/gio/gsocketconnectable.h b/gio/gsocketconnectable.h
index 6528d4936..590f71705 100644
--- a/gio/gsocketconnectable.h
+++ b/gio/gsocketconnectable.h
@@ -75,6 +75,13 @@ GSocketAddressEnumerator *g_socket_connectable_proxy_enumerate (GSocketConnectab
 GLIB_AVAILABLE_IN_2_48
 gchar                    *g_socket_connectable_to_string (GSocketConnectable *connectable);
 
+GLIB_AVAILABLE_IN_2_56
+GProxyResolver *          g_socket_connectable_ref_proxy_resolver (GSocketConnectable *connectable);
+
+GLIB_AVAILABLE_IN_2_56
+void                      g_socket_connectable_set_proxy_resolver (GSocketConnectable *connectable,
+								   GProxyResolver *proxy_resolver);
+
 G_END_DECLS
 
 
diff --git a/gio/gunixsocketaddress.c b/gio/gunixsocketaddress.c
index b0d3c8fe4..886bd57e4 100644
--- a/gio/gunixsocketaddress.c
+++ b/gio/gunixsocketaddress.c
@@ -63,7 +63,8 @@ enum
   PROP_PATH,
   PROP_PATH_AS_ARRAY,
   PROP_ABSTRACT,
-  PROP_ADDRESS_TYPE
+  PROP_ADDRESS_TYPE,
+  PROP_PROXY_RESOLVER
 };
 
 #define UNIX_PATH_MAX sizeof (((struct sockaddr_un *) 0)->sun_path)
@@ -75,6 +76,7 @@ struct _GUnixSocketAddressPrivate
 			       pathnames in the get_path() API */
   gsize path_len; /* Not including any terminating zeros */
   GUnixSocketAddressType address_type;
+  GProxyResolver *proxy_resolver;
 };
 
 static void   g_unix_socket_address_connectable_iface_init (GSocketConnectableIface *iface);
@@ -136,6 +138,11 @@ g_unix_socket_address_set_property (GObject      *object,
         address->priv->address_type = g_value_get_enum (value);
       break;
 
+    case PROP_PROXY_RESOLVER:
+      g_clear_object (&address->priv->proxy_resolver);
+      address->priv->proxy_resolver = g_value_dup_object (value);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -172,11 +179,25 @@ g_unix_socket_address_get_property (GObject    *object,
 	g_value_set_enum (value, address->priv->address_type);
 	break;
 
+      case PROP_PROXY_RESOLVER:
+        g_value_set_object (value, address->priv->proxy_resolver);
+        break;
+
       default:
 	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
 }
 
+static void
+g_unix_socket_address_dispose (GObject *object)
+{
+  GUnixSocketAddress *address = G_UNIX_SOCKET_ADDRESS (object);
+
+  g_clear_object (&address->priv->proxy_resolver);
+
+  G_OBJECT_CLASS (g_unix_socket_address_parent_class)->dispose (object);
+}
+
 static GSocketFamily
 g_unix_socket_address_get_family (GSocketAddress *address)
 {
@@ -258,6 +279,7 @@ g_unix_socket_address_class_init (GUnixSocketAddressClass *klass)
 
   gobject_class->set_property = g_unix_socket_address_set_property;
   gobject_class->get_property = g_unix_socket_address_get_property;
+  gobject_class->dispose = g_unix_socket_address_dispose;
 
   gsocketaddress_class->get_family = g_unix_socket_address_get_family;
   gsocketaddress_class->to_native = g_unix_socket_address_to_native;
@@ -306,6 +328,7 @@ g_unix_socket_address_class_init (GUnixSocketAddressClass *klass)
 						      G_PARAM_READWRITE |
 						      G_PARAM_CONSTRUCT_ONLY |
 						      G_PARAM_STATIC_STRINGS));
+  g_object_class_override_property (gobject_class, PROP_PROXY_RESOLVER, "proxy-resolver");
 }
 
 static void
