diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 7a6c10d..1eac0df 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -80,6 +80,7 @@ struct _EEwsConnectionPrivate {
 	GThread *soup_thread;
 	GMainLoop *soup_loop;
 	GMainContext *soup_context;
+	EProxy *proxy;
 
 	CamelEwsSettings *settings;
 	GMutex password_lock;
@@ -1203,6 +1204,24 @@ create_folder_response_cb (ESoapResponse *response,
 }
 
 static void
+proxy_settings_changed (EProxy *proxy,
+                        gpointer user_data)
+{
+	SoupURI *proxy_uri = NULL;
+	EEwsConnection *cnc = (EEwsConnection *) user_data;
+
+	if (!cnc || !cnc->priv || !cnc->priv->uri || !cnc->priv->soup_session)
+		return;
+
+	/* use proxy if necessary */
+	if (e_proxy_require_proxy_for_uri (proxy, cnc->priv->uri)) {
+		proxy_uri = e_proxy_peek_uri_for (proxy, cnc->priv->uri);
+	}
+
+	g_object_set (cnc->priv->soup_session, SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
+}
+
+static void
 ews_connection_set_settings (EEwsConnection *connection,
                              CamelEwsSettings *settings)
 {
@@ -1296,6 +1315,11 @@ ews_connection_dispose (GObject *object)
 		priv->soup_context = NULL;
 	}
 
+	if (priv->proxy) {
+		g_object_unref (priv->proxy);
+		priv->proxy = NULL;
+	}
+
 	if (priv->settings != NULL) {
 		g_object_unref (priv->settings);
 		priv->settings = NULL;
@@ -1470,6 +1494,10 @@ e_ews_connection_init (EEwsConnection *cnc)
 		cnc->priv->soup_context,
 		NULL);
 
+	cnc->priv->proxy = e_proxy_new ();
+	e_proxy_setup_proxy (cnc->priv->proxy);
+	g_signal_connect (cnc->priv->proxy, "changed", G_CALLBACK (proxy_settings_changed), cnc);
+
 	if (g_getenv ("EWS_DEBUG") && (atoi (g_getenv ("EWS_DEBUG")) >= 2)) {
 		SoupLogger *logger;
 		logger = soup_logger_new (SOUP_LOGGER_LOG_BODY, -1);
@@ -1809,6 +1837,9 @@ e_ews_connection_new (const gchar *uri,
 		loaded_connections_permissions,
 		g_strdup (cnc->priv->hash_key), cnc);
 
+	/* update proxy with set 'uri' */
+	proxy_settings_changed (cnc->priv->proxy, cnc);
+
 	/* free memory */
 	g_mutex_unlock (&connecting);
 	return cnc;
