Index: uspace/lib/ddev/include/ddev_srv.h
===================================================================
--- uspace/lib/ddev/include/ddev_srv.h	(revision 87a7cdb3ff40f9795359f6da489d45a3fafee668)
+++ uspace/lib/ddev/include/ddev_srv.h	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
@@ -50,5 +50,5 @@
 
 struct ddev_ops {
-	errno_t (*get_gc)(void *, gfx_context_t **);
+	errno_t (*get_gc)(void *, sysarg_t *, sysarg_t *);
 };
 
Index: uspace/lib/ddev/src/ddev.c
===================================================================
--- uspace/lib/ddev/src/ddev.c	(revision 87a7cdb3ff40f9795359f6da489d45a3fafee668)
+++ uspace/lib/ddev/src/ddev.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
@@ -88,15 +88,16 @@
 	async_sess_t *sess;
 	async_exch_t *exch;
+	sysarg_t arg2;
+	sysarg_t arg3;
 	ipc_gc_t *gc;
 	errno_t rc;
 
 	exch = async_exchange_begin(ddev->sess);
-	sess = async_connect_me_to(exch, INTERFACE_GC, 0, 42);
-	if (sess == NULL) {
-		async_exchange_end(exch);
+	rc = async_req_0_2(exch, DDEV_GET_GC, &arg2, &arg3);
+	sess = async_connect_me_to(exch, INTERFACE_GC, arg2, arg3);
+	async_exchange_end(exch);
+
+	if (sess == NULL)
 		return EIO;
-	}
-
-	async_exchange_end(exch);
 
 	rc = ipc_gc_create(sess, &gc);
Index: uspace/lib/ddev/src/ddev_srv.c
===================================================================
--- uspace/lib/ddev/src/ddev_srv.c	(revision 87a7cdb3ff40f9795359f6da489d45a3fafee668)
+++ uspace/lib/ddev/src/ddev_srv.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
@@ -45,9 +45,34 @@
 #include <stdio.h>
 
+/** Connect to a GC.
+ *
+ * XXX As a workaround here we tell the client the values of arg2 and arg3
+ * needed to connect to the GC using async_connect_me_to(), these need
+ * to be provided by the ddev_ops_t.get_gc. Different values are needed
+ * for a DDF driver or a regular server. This would not be needed if we
+ * had a proper way of creating an endpoint and passing it to our client.
+ */
+static void ddev_get_gc_srv(ddev_srv_t *srv, ipc_call_t *icall)
+{
+	sysarg_t arg2;
+	sysarg_t arg3;
+	errno_t rc;
+
+	printf("ddev_get_gc_srv\n");
+
+	if (srv->ops->get_gc == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->get_gc(srv->arg, &arg2, &arg3);
+	async_answer_2(icall, rc, arg2, arg3);
+}
+
 void ddev_conn(ipc_call_t *icall, ddev_srv_t *srv)
 {
 	/* Accept the connection */
 	async_accept_0(icall);
-	printf("display_conn\n");
+	printf("ddev_conn\n");
 
 	while (true) {
@@ -66,4 +91,6 @@
 		switch (method) {
 		case DDEV_GET_GC:
+			ddev_get_gc_srv(srv, &call);
+			break;
 		default:
 			async_answer_0(&call, ENOTSUP);
Index: uspace/lib/ddev/test/ddev.c
===================================================================
--- uspace/lib/ddev/test/ddev.c	(revision 87a7cdb3ff40f9795359f6da489d45a3fafee668)
+++ uspace/lib/ddev/test/ddev.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
@@ -48,5 +48,5 @@
 static void test_ddev_conn(ipc_call_t *, void *);
 
-static errno_t test_get_gc(void *, gfx_context_t **);
+static errno_t test_get_gc(void *, sysarg_t *, sysarg_t *);
 static errno_t test_gc_set_color(void *, gfx_color_t *);
 
@@ -215,8 +215,9 @@
 }
 
-static errno_t test_get_gc(void *arg, gfx_context_t **rgc)
-{
-	*rgc = NULL;
-	return ENOTSUP;
+static errno_t test_get_gc(void *arg, sysarg_t *arg2, sysarg_t *arg3)
+{
+	*arg2 = 0;
+	*arg3 = 42;
+	return EOK;
 }
 
