diff --git a/include/iface.h b/include/iface.h
index 3530f23..24f0a9a 100644
--- a/include/iface.h
+++ b/include/iface.h
@@ -161,7 +161,7 @@ extern void connman_iface_indicate_carrier_off(struct connman_iface *iface);
 extern void connman_iface_indicate_configured(struct connman_iface *iface);
 
 extern void connman_iface_indicate_station(struct connman_iface *iface,
-				const char *name, int strength, int security);
+				const char *bssid, const char *name, int strength, int security);
 
 extern int connman_iface_get_ipv4(struct connman_iface *iface,
 						struct connman_ipv4 *ipv4);
diff --git a/plugins/supplicant.c b/plugins/supplicant.c
index cba93cd..a8a46ed 100644
--- a/plugins/supplicant.c
+++ b/plugins/supplicant.c
@@ -66,7 +66,9 @@ static GSList *tasks = NULL;
 
 struct supplicant_ap {
 	gchar *identifier;
+	gchar *bssid;
 	GByteArray *ssid;
+	guint quality;
 	guint capabilities;
 	gboolean has_wep;
 	gboolean has_wpa;
@@ -618,6 +620,24 @@ static void extract_ssid(struct supplicant_ap *ap, DBusMessageIter *value)
 	ap->identifier = g_strdup((char *) ssid);
 }
 
+static void extract_bssid(struct supplicant_ap *ap, DBusMessageIter *value)
+{
+	DBusMessageIter array;
+	unsigned char *bssid;
+	int bssid_len;
+	char buf[20];
+
+	dbus_message_iter_recurse(value, &array);
+	dbus_message_iter_get_fixed_array(&array, &bssid, &bssid_len);
+	if (bssid_len >= 6) {
+		g_snprintf((char *)buf, sizeof(buf),
+			   "%02x:%02x:%02x:%02x:%02x:%02x",
+			   (int)bssid[0], (int)bssid[1], (int)bssid[2], 
+			   (int)bssid[3], (int)bssid[4], (int)bssid[5]);
+		ap->bssid = g_strdup((char *) buf);
+	}
+}
+
 static void extract_wpaie(struct supplicant_ap *ap, DBusMessageIter *value)
 {
 	DBusMessageIter array;
@@ -657,6 +677,16 @@ static void extract_capabilites(struct supplicant_ap *ap,
 		ap->has_wep = TRUE;
 }
 
+static void extract_quality(struct supplicant_ap *ap,
+						DBusMessageIter *value)
+{
+	guint quality;
+
+	dbus_message_iter_get_basic(value, &quality);
+
+	ap->quality = quality;
+}
+
 static int parse_network_properties(struct supplicant_task *task,
 							DBusMessage *message)
 {
@@ -688,12 +718,16 @@ static int parse_network_properties(struct supplicant_task *task,
 
 		if (g_str_equal(key, "ssid") == TRUE)
 			extract_ssid(ap, &value);
+		else if (g_str_equal(key, "bssid") == TRUE)
+			extract_bssid(ap, &value);
 		else if (g_str_equal(key, "wpaie") == TRUE)
 			extract_wpaie(ap, &value);
 		else if (g_str_equal(key, "rsnie") == TRUE)
 			extract_rsnie(ap, &value);
 		else if (g_str_equal(key, "capabilities") == TRUE)
 			extract_capabilites(ap, &value);
+		else if (g_str_equal(key, "quality") == TRUE)
+			extract_quality(ap, &value);
 
 		dbus_message_iter_next(&dict);
 	}
@@ -706,7 +740,8 @@ static int parse_network_properties(struct supplicant_task *task,
 		security |= 0x04;
 
 	connman_iface_indicate_station(task->iface,
-					ap->identifier, 25, security);
+				       ap->bssid, ap->identifier, ap->quality, 
+				       security);
 
 	g_free(ap);
 
diff --git a/src/iface-inet.c b/src/iface-inet.c
index 82a1e8c..f780452 100644
--- a/src/iface-inet.c
+++ b/src/iface-inet.c
@@ -275,6 +275,10 @@ int __connman_iface_connect(struct connman_iface *iface,
 
 	iface->flags |= CONNMAN_IFACE_FLAG_RUNNING;
 
+	/* This actually makes it do a dhcp request properly when connections
+	 * are estabished - it doesnt seem to otherwise */
+	iface->state = CONNMAN_IFACE_STATE_ENABLED;
+
 	return 0;
 }
 
diff --git a/src/iface.c b/src/iface.c
index b2fd6d1..c70b25c 100644
--- a/src/iface.c
+++ b/src/iface.c
@@ -332,11 +332,13 @@ void connman_iface_indicate_configured(struct connman_iface *iface)
 	}
 }
 
-static void append_station(DBusMessage *reply, const char *name,
+static void append_station(DBusMessage *reply, const char *bssid, const char *name,
 						int signal, int security)
 {
 	DBusMessageIter array, dict;
+	const char *wep = "WEP";
 	const char *wpa = "WPA";
+	const char *rsn = "RSN";
 
 	dbus_message_iter_init_append(reply, &array);
 
@@ -345,25 +347,36 @@ static void append_station(DBusMessage *reply, const char *name,
 			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
 			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
 
-	append_entry(&dict, "ESSID", DBUS_TYPE_STRING, &name);
+	if (bssid) append_entry(&dict, "BSSID", DBUS_TYPE_STRING, &bssid);
+	if (name) append_entry(&dict, "ESSID", DBUS_TYPE_STRING, &name);
 	append_entry(&dict, "Signal", DBUS_TYPE_UINT16, &signal);
 
-	if (security > 0)
-		append_entry(&dict, "Security", DBUS_TYPE_STRING, &wpa);
+	if (security > 0) {
+		const char *sec = NULL;
+	   
+		if (security & 0x4)
+			sec = rsn;
+		else if (security & 0x2)
+			sec = wpa;
+		else if (security & 0x1)
+			sec = wep;
+		if (sec)
+			append_entry(&dict, "Security", DBUS_TYPE_STRING, &sec);
+	}
 
 	dbus_message_iter_close_container(&array, &dict);
 }
 
 void connman_iface_indicate_station(struct connman_iface *iface,
-				const char *name, int strength, int security)
+				const char *bssid, const char *name, int strength, int security)
 {
 	DBusMessage *signal;
-	char *ssid, *passphrase;
+	char *ssid = NULL, *passphrase;
 	int len;
 
-	DBG("iface %p security %d name %s", iface, security, name);
+	DBG("iface %p security %d name %s bssid %s", iface, security, name, bssid);
 
-	if (name == NULL || strlen(name) == 0)
+	if (bssid == NULL || strlen(bssid) == 0)
 		return;
 
 	signal = dbus_message_new_signal(iface->path,
@@ -371,7 +384,7 @@ void connman_iface_indicate_station(struct connman_iface *iface,
 	if (signal == NULL)
 		return;
 
-	append_station(signal, name, strength, security);
+	append_station(signal, bssid, name, strength, security);
 
 	dbus_connection_send(connection, signal, NULL);
 	dbus_message_unref(signal);
@@ -386,17 +399,21 @@ void connman_iface_indicate_station(struct connman_iface *iface,
 	default:
 		break;
 	}
-
-	len = strlen(name);
-	ssid = strdup(name);
-	if (ssid == NULL)
+   
+	passphrase = __connman_iface_find_passphrase(iface, bssid);
+
+	if (!passphrase && name) {
+		len = strlen(name);
+		ssid = strdup(name);
+		/* The D-Link access points return a 0x05 at the end of the SSID */
+		if (len > 0 && ssid[len - 1] == '\05')
+			ssid[len - 1] = '\0';
+	}
+   
+	if (!passphrase && ssid == NULL)
 		return;
-
-	/* The D-Link access points return a 0x05 at the end of the SSID */
-	if (ssid[len - 1] == '\05')
-		ssid[len - 1] = '\0';
-
-	passphrase = __connman_iface_find_passphrase(iface, ssid);
+	if (!passphrase)
+		passphrase = __connman_iface_find_passphrase(iface, ssid);
 	if (passphrase != NULL) {
 		DBG("network %s passphrase %s", ssid, passphrase);
 
@@ -1154,7 +1171,7 @@ static GDBusMethodTable iface_methods[] = {
 	{ "GetNetwork",    "",      "a{sv}", get_network    },
 	{ "SetNetwork",    "a{sv}", "",      set_network    },
 	{ "ListNetworks",  "",      "ao",    list_networks  },
-	{ "CreateNetwork", "a{av}", "o",     create_network },
+	{ "CreateNetwork", "a{sv}", "o",     create_network },
 	{ "RemoveNetwork", "o",     "",      remove_network },
 	{ "SelectNetwork", "o",     "",      select_network },
 	{ "GetIPv4",       "",      "a{sv}", get_ipv4       },
@@ -1301,7 +1318,7 @@ static int probe_device(LibHalContext *ctx,
 
 	conn = libhal_ctx_get_dbus_connection(ctx);
 
-	g_dbus_register_object(conn, iface->path, iface, device_free);
+	g_dbus_register_object(conn, iface->path);
 
 	interfaces = g_slist_append(interfaces, iface);
 
@@ -1313,7 +1330,7 @@ static int probe_device(LibHalContext *ctx,
 
 	g_dbus_register_interface(conn, iface->path,
 					CONNMAN_IFACE_INTERFACE,
-					iface_methods, iface_signals, NULL);
+					iface_methods, iface_signals, NULL, iface, device_free);
 
 	DBG("iface %p identifier %s", iface, iface->identifier);
 
diff --git a/src/manager.c b/src/manager.c
index 9d14cd7..78b017f 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -218,18 +218,18 @@ int __connman_manager_init(DBusConnection *conn, gboolean compat)
 	if (connection == NULL)
 		return -1;
 
-	g_dbus_register_object(connection, CONNMAN_MANAGER_PATH, NULL, NULL);
+	g_dbus_register_object(connection, CONNMAN_MANAGER_PATH);
 
 	g_dbus_register_interface(connection, CONNMAN_MANAGER_PATH,
 						CONNMAN_MANAGER_INTERFACE,
 						manager_methods,
-						manager_signals, NULL);
+						manager_signals, NULL, NULL, NULL);
 
 	if (compat == TRUE) {
-		g_dbus_register_object(connection, NM_PATH, NULL, NULL);
+		g_dbus_register_object(connection, NM_PATH);
 
 		g_dbus_register_interface(connection, NM_PATH, NM_INTERFACE,
-						nm_methods, NULL, NULL);
+						nm_methods, NULL, NULL, NULL, NULL);
 
 		nm_compat = TRUE;
 	}
diff --git a/src/network.c b/src/network.c
index 9da8fea..a5ec2b9 100644
--- a/src/network.c
+++ b/src/network.c
@@ -157,10 +157,10 @@ const char *__connman_iface_add_network(struct connman_iface *iface,
 
 	networks = g_slist_append(networks, network);
 
-	g_dbus_register_object(connection, path, network, network_free);
+	g_dbus_register_object(connection, path);
 
 	g_dbus_register_interface(connection, path, CONNMAN_NETWORK_INTERFACE,
-						network_methods, NULL, NULL);
+						network_methods, NULL, NULL, network, network_free);
 
 	return path;
 }