diff --git a/config.def.h b/config.def.h
index 93a3d49..05d81de 100644
--- a/config.def.h
+++ b/config.def.h
@@ -65,6 +65,18 @@ static Bool allowgeolocation      = TRUE;
 	} \
 }
 
+#define ONLOAD(u) { \
+	.v = (char *[]){"/bin/sh", "-c", \
+		"~/.surf/omnibar addhist \"$0\"", u, NULL \
+	} \
+}
+
+#define GOTO { \
+	.v = (char *[]){"/bin/sh", "-c", \
+		"~/.surf/omnibar goto \"$0\" \"$1\"", winid, "_SURF_GO", NULL \
+	} \
+}
+
 /* styles */
 /*
  * The iteration will stop at the first match, beginning at the beginning of
@@ -112,7 +124,7 @@ static Key keys[] = {
 	{ MODKEY,               GDK_o,      source,     { 0 } },
 	{ MODKEY|GDK_SHIFT_MASK,GDK_o,      inspector,  { 0 } },
 
-	{ MODKEY,               GDK_g,      spawn,      SETPROP("_SURF_URI", "_SURF_GO") },
+        { MODKEY,               GDK_g,      spawn,      GOTO },
 	{ MODKEY,               GDK_f,      spawn,      SETPROP("_SURF_FIND", "_SURF_FIND") },
 	{ MODKEY,               GDK_slash,  spawn,      SETPROP("_SURF_FIND", "_SURF_FIND") },
 
diff --git a/surf.c b/surf.c
index f2170a4..c8fdab3 100644
--- a/surf.c
+++ b/surf.c
@@ -789,11 +789,11 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c)
 	WebKitWebDataSource *src;
 	WebKitNetworkRequest *request;
 	SoupMessage *msg;
-	char *uri;
+	char *uri = geturi(c);
+	Arg arg;
 
 	switch (webkit_web_view_get_load_status (c->view)) {
 	case WEBKIT_LOAD_COMMITTED:
-		uri = geturi(c);
 		if (strstr(uri, "https://") == uri) {
 			frame = webkit_web_view_get_main_frame(c->view);
 			src = webkit_web_frame_get_data_source(frame);
@@ -809,6 +809,8 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c)
 			setstyle(c, getstyle(uri));
 		break;
 	case WEBKIT_LOAD_FINISHED:
+		arg = (Arg)ONLOAD(uri);
+		spawn(NULL, &arg);
 		c->progress = 100;
 		updatetitle(c);
 		if (diskcache) {
