From c0f970a540f25c781c6a284a2b7fa0611a05540f Mon Sep 17 00:00:00 2001
From: Tambet Ingo <tambet@gmail.com>
Date: Tue, 13 Jan 2009 13:36:29 +0200
Subject: [PATCH] Use ModemManager.


diff --git a/configure.ac b/configure.ac
index bc92172..d3b3b55 100644
--- a/configure.ac
+++ b/configure.ac
@@ -227,6 +227,7 @@ src/gconf-helpers/Makefile
 src/wireless-security/Makefile
 src/polkit-helpers/Makefile
 src/connection-editor/Makefile
+src/modems/Makefile
 icons/Makefile
 icons/16/Makefile
 icons/22/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index 3486186..33d2c49 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = marshallers utils gconf-helpers wireless-security polkit-helpers connection-editor
+SUBDIRS = marshallers utils gconf-helpers wireless-security polkit-helpers connection-editor modems
 
 NULL=
 
@@ -49,6 +49,9 @@ nm_applet_SOURCES =			\
 	applet-device-gsm.c \
 	applet-device-cdma.h \
 	applet-device-cdma.c \
+	mm-types.h \
+	nma-gsm-modem.c \
+	nma-gsm-modem.h \
 	$(NULL)
 
 nm_applet_LDADD = \
diff --git a/src/applet-device-gsm.c b/src/applet-device-gsm.c
index a01d57c..e34dc47 100644
--- a/src/applet-device-gsm.c
+++ b/src/applet-device-gsm.c
@@ -25,6 +25,9 @@
 #include <config.h>
 #endif
 
+#include <sys/types.h>
+#include <unistd.h>
+
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 
@@ -38,6 +41,8 @@
 
 #include "applet.h"
 #include "applet-device-gsm.h"
+#include "nma-gsm-modem.h"
+#include "mm-types.h"
 #include "utils.h"
 
 typedef struct {
@@ -173,6 +178,50 @@ add_default_connection_item (NMDevice *device,
 }
 
 static void
+child_setup (gpointer user_data G_GNUC_UNUSED)
+{
+	/* We are in the child process at this point */
+	pid_t pid = getpid ();
+	setpgid (pid, pid);
+}
+
+static void
+gsm_properties_cb (GtkMenuItem *mi, gpointer user_data)
+{
+	NMDevice *device = NM_DEVICE (user_data);
+	char *argv[3];
+	GError *error = NULL;
+	gboolean success;
+
+	argv[0] = BINDIR "/nm-modem-properties";
+	argv[1] = (char *) nm_device_get_udi (device);
+	argv[2] = NULL;
+
+	success = g_spawn_async ("/", argv, NULL, 0, &child_setup, NULL, NULL, &error);
+	if (!success) {
+		g_warning ("Error launching modem properties dialog: %s", error->message);
+		g_error_free (error);
+	}
+}
+
+static void
+add_properties_item (NMDevice *device,
+                     GtkWidget *menu)
+{
+	GtkWidget *item;
+
+	if (nm_device_get_state (device) != NM_DEVICE_STATE_DISCONNECTED)
+		return;
+
+	item = gtk_menu_item_new_with_label (_("Properties"));
+	g_signal_connect (item, "activate",
+				   G_CALLBACK (gsm_properties_cb),
+				   device);
+
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+}
+
+static void
 gsm_menu_item_deactivate (GtkMenuItem *item, gpointer user_data)
 {
 	GSMMenuItemInfo *info = (GSMMenuItemInfo *) user_data;
@@ -271,41 +320,67 @@ gsm_add_menu_item (NMDevice *device,
 		add_connection_items (device, connections, active, menu, applet);
 	else
 		add_default_connection_item (device, menu, applet);
+
 	add_disconnect_item (device, menu, applet);
+	add_properties_item (device, menu);
 
 out:
 	g_slist_free (connections);
 }
 
 static void
+signal_quality_changed (NMAGsmModem *modem, guint32 quality, gpointer user_data)
+{
+	applet_schedule_update_icon (NM_APPLET (user_data));
+}
+
+static void
 gsm_device_state_changed (NMDevice *device,
                           NMDeviceState new_state,
                           NMDeviceState old_state,
                           NMDeviceStateReason reason,
                           NMApplet *applet)
 {
-	if (new_state == NM_DEVICE_STATE_ACTIVATED) {
-		NMConnection *connection;
-		NMSettingConnection *s_con = NULL;
-		char *str = NULL;
-
-		connection = applet_find_active_connection_for_device (device, applet, NULL);
-		if (connection) {
-			const char *id;
-
-			s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
-			id = s_con ? nm_setting_connection_get_id (s_con) : NULL;
-			if (id)
-				str = g_strdup_printf (_("You are now connected to '%s'."), id);
-		}
+	NMAGsmModem *modem;
+	char *oper_code;
+	char *oper_name;
+	char *msg;
+	guint32 reg_status;
+
+	if (new_state != NM_DEVICE_STATE_ACTIVATED)
+		return;
 
-		applet_do_notify_with_pref (applet,
-		                            _("Connection Established"),
-		                            str ? str : _("You are now connected to the GSM network."),
-		                            "nm-device-wwan",
-		                            PREF_DISABLE_CONNECTED_NOTIFICATIONS);
-		g_free (str);
+	modem = (NMAGsmModem *) g_object_get_data (G_OBJECT (device), "gsm-modem");
+	if (!modem) {
+			DBusGConnection *bus;
+
+			bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
+			if (!bus)
+				return;
+
+			modem = nma_gsm_modem_new (bus, nm_device_get_udi (device));
+			dbus_g_connection_unref (bus);
+
+			g_object_set_data_full (G_OBJECT (device), "gsm-modem", modem, g_object_unref);
+
+			g_signal_connect (modem, "signal-quality",
+						   G_CALLBACK (signal_quality_changed),
+						   applet);
 	}
+
+	oper_code = NULL;
+	oper_name = NULL;
+	reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name);
+	msg = g_strdup_printf (_("You are now connected to the %s GSM network '%s'."),
+					   reg_status == MM_GSM_MODEM_REG_STATUS_ROAMING ? _("roaming") : _("home"),
+					   oper_name);
+
+	applet_do_notify_with_pref (applet, _("Connection Established"), msg,
+						   "nm-device-wwan", PREF_DISABLE_CONNECTED_NOTIFICATIONS);
+
+	g_free (oper_code);
+	g_free (oper_name);
+	g_free (msg);
 }
 
 static GdkPixbuf *
@@ -316,6 +391,7 @@ gsm_get_icon (NMDevice *device,
               NMApplet *applet)
 {
 	NMSettingConnection *s_con;
+	NMAGsmModem *modem;
 	GdkPixbuf *pixbuf = NULL;
 	const char *id;
 
@@ -339,8 +415,40 @@ gsm_get_icon (NMDevice *device,
 		*tip = g_strdup_printf (_("Requesting a network address for '%s'..."), id);
 		break;
 	case NM_DEVICE_STATE_ACTIVATED:
-		pixbuf = applet->wwan_icon;
-		*tip = g_strdup_printf (_("Mobile broadband connection '%s' active"), id);
+		modem = (NMAGsmModem *) g_object_get_data (G_OBJECT (device), "gsm-modem");
+		if (modem) {
+			char *oper_code;
+			char *oper_name;
+			guint32 reg_status;
+			guint32 quality;
+
+			quality = nma_gsm_modem_get_signal_quality (modem);
+			quality = CLAMP (quality, 0, 100);
+
+			if (quality > 80)
+				pixbuf = applet->wireless_100_icon;
+			else if (quality > 55)
+				pixbuf = applet->wireless_75_icon;
+			else if (quality > 30)
+				pixbuf = applet->wireless_50_icon;
+			else if (quality > 5)
+				pixbuf = applet->wireless_25_icon;
+			else
+				pixbuf = applet->wireless_00_icon;
+
+			reg_status = nma_gsm_modem_get_registration_info (modem, &oper_code, &oper_name);
+			*tip = g_strdup_printf (_("%s GSM connection '%s' (%d%%)"),
+							    reg_status == MM_GSM_MODEM_REG_STATUS_ROAMING ? _("Roaming") : _("Home"),
+			                        oper_name, quality);
+
+			g_free (oper_name);
+			g_free (oper_code);
+
+		} else {
+			pixbuf = applet->wireless_00_icon;
+			*tip = g_strdup_printf (_("GSM connection"));
+		}
+
 		break;
 	default:
 		break;
@@ -512,6 +620,7 @@ ask_for_pin_puk (NMDevice *device,
 
 	w = gtk_entry_new ();
 	*out_secret_entry = GTK_ENTRY (w);
+	gtk_entry_set_visibility (GTK_ENTRY (w), FALSE);
 	gtk_entry_set_max_length (GTK_ENTRY (w), 4);
 	gtk_entry_set_width_chars (GTK_ENTRY (w), 4);
 	gtk_entry_set_activates_default (GTK_ENTRY (w), TRUE);
diff --git a/src/connection-editor/page-mobile.c b/src/connection-editor/page-mobile.c
index 9c599c7..70a3447 100644
--- a/src/connection-editor/page-mobile.c
+++ b/src/connection-editor/page-mobile.c
@@ -107,7 +107,6 @@ populate_gsm_ui (CEPageMobile *self, NMConnection *connection)
 	int type_idx;
 	GHashTable *secrets;
 	GValue *value;
-	GtkWidget *widget;
 	const char *s;
 
 	s = nm_setting_gsm_get_number (setting);
@@ -146,17 +145,6 @@ populate_gsm_ui (CEPageMobile *self, NMConnection *connection)
 	}
 	gtk_combo_box_set_active (priv->network_type, type_idx);
 
-	/* Hide network type widgets; not supported yet */
-	gtk_widget_hide (GTK_WIDGET (priv->network_type));
-	widget = glade_xml_get_widget (CE_PAGE (self)->xml, "type_label");
-	gtk_widget_hide (widget);
-
-	/* Hide Band widgets; not supported yet */
-	widget = glade_xml_get_widget (CE_PAGE (self)->xml, "mobile_band");
-	gtk_widget_hide (widget);
-	widget = glade_xml_get_widget (CE_PAGE (self)->xml, "band_label");
-	gtk_widget_hide (widget);
-
 	secrets = get_secrets (connection, nm_setting_get_name (priv->setting));
 
 	s = nm_setting_gsm_get_password (setting);
diff --git a/src/mm-types.h b/src/mm-types.h
new file mode 100644
index 0000000..a1f9979
--- /dev/null
+++ b/src/mm-types.h
@@ -0,0 +1,18 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
+#ifndef MM_TYPES_H
+#define MM_TYPES_H
+
+#define MM_DBUS_SERVICE "org.freedesktop.ModemManager"
+#define MM_DBUS_INTERFACE_MODEM_GSM "org.freedesktop.ModemManager.Modem.Gsm.Network"
+
+enum {
+  MM_GSM_MODEM_REG_STATUS_IDLE = 0,
+  MM_GSM_MODEM_REG_STATUS_HOME = 1,
+  MM_GSM_MODEM_REG_STATUS_SEARCHING = 2,
+  MM_GSM_MODEM_REG_STATUS_DENIED = 3,
+  MM_GSM_MODEM_REG_STATUS_UNKNOWN = 4,
+  MM_GSM_MODEM_REG_STATUS_ROAMING = 5
+};
+
+#endif /* MM_TYPES_H */
diff --git a/src/modems/Makefile.am b/src/modems/Makefile.am
new file mode 100644
index 0000000..206ee52
--- /dev/null
+++ b/src/modems/Makefile.am
@@ -0,0 +1,25 @@
+bin_PROGRAMS = nm-modem-properties
+
+nm_modem_properties_CPPFLAGS = \
+	$(NMA_CFLAGS)				\
+	-DICONDIR=\""$(datadir)/icons"\"	\
+	-DGLADEDIR=\""$(gladedir)"\"		\
+	-DBINDIR=\""$(bindir)"\"		\
+	-DSYSCONFDIR=\""$(sysconfdir)"\"	\
+	-DLIBDIR=\""$(libdir)"\"	\
+	-DNMALOCALEDIR=\"$(datadir)/locale\"	\
+	$(DBUS_CFLAGS)				\
+	-I${top_srcdir}/src/gconf-helpers
+
+nm_modem_properties_SOURCES = \
+	main.c
+
+nm_modem_properties_LDADD = \
+	$(top_builddir)/src/gconf-helpers/libgconf-helpers.la \
+	$(NMA_LIBS)
+
+gladedir = $(datadir)/nm-applet
+glade_DATA = nm-modem-properties.glade
+
+CLEANFILES = *.bak *.gladep
+EXTRA_DIST = $(glade_DATA)
diff --git a/src/modems/main.c b/src/modems/main.c
new file mode 100644
index 0000000..672d1cd
--- /dev/null
+++ b/src/modems/main.c
@@ -0,0 +1,559 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include <dbus/dbus-glib.h>
+#include <gconf/gconf-client.h>
+#include <nm-connection.h>
+#include <nm-setting-connection.h>
+#include <nm-setting-gsm.h>
+#include <nm-setting-serial.h>
+#include <nm-setting-ppp.h>
+#include <nm-utils.h>
+#include "gconf-helpers.h"
+
+#define MM_DBUS_SERVICE              "org.freedesktop.ModemManager"
+#define MM_DBUS_PATH                 "/org/freedesktop/ModemManager"
+#define MM_DBUS_INTERFACE            "org.freedesktop.ModemManager"
+#define MM_DBUS_INTERFACE_MODEM      "org.freedesktop.ModemManager.Modem"
+
+#define MM_DBUS_INTERFACE_MODEM_GSM_CARD    "org.freedesktop.ModemManager.Modem.Gsm.Card"
+#define MM_DBUS_INTERFACE_MODEM_GSM_NETWORK "org.freedesktop.ModemManager.Modem.Gsm.Network"
+
+#define MM_MODEM_TYPE_UNKNOWN  0
+#define MM_MODEM_TYPE_GSM      1
+#define MM_MODEM_TYPE_CDMA     2
+
+#define SCAN_COL_NAME    0
+#define SCAN_COL_STATUS  1
+#define SCAN_COL_OPER_ID 2
+
+typedef struct {
+	/* UI */
+	GladeXML *glade_xml;
+	GtkDialog *main_dialog;
+	GtkTreeView *network_list;
+	GtkListStore *network_store;
+	GtkWidget *scan_button;
+	GtkWidget *create_net_button;
+
+	GtkWidget *scan_dialog;
+	GtkProgressBar *scan_progress_bar;
+
+	GtkDialog *create_network_dialog;
+	GtkEntry *create_network_name;
+
+	/* DBus */
+	DBusGConnection *bus;
+	DBusGProxy *proxy;
+	DBusGProxy *gsm_net_proxy;
+
+	GMainLoop *main_loop;
+} AppData;
+
+static void
+get_str_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+{
+	char *result = NULL;
+	GError *error = NULL;
+
+	if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_STRING, &result, G_TYPE_INVALID)) {
+		g_warning ("%s", error->message);
+		g_error_free (error);
+	} else {
+		gtk_label_set_text (GTK_LABEL (user_data), result);
+		g_free (result);
+	}
+}
+
+static void
+get_card_info_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+{
+	GladeXML *glade_xml = GLADE_XML (user_data);
+	char *manufacturer = NULL;
+	char *model = NULL;
+	char *version = NULL;
+	GError *error = NULL;
+
+	if (!dbus_g_proxy_end_call (proxy, call_id, &error,
+								G_TYPE_STRING, &manufacturer,
+								G_TYPE_STRING, &model,
+								G_TYPE_STRING, &version,
+								G_TYPE_INVALID)) {
+		g_warning ("Couldn't get modem information: %s", error->message);
+		g_error_free (error);
+	} else {
+		gtk_label_set_text (GTK_LABEL (glade_xml_get_widget (glade_xml, "vendor_label")), manufacturer);
+		gtk_label_set_text (GTK_LABEL (glade_xml_get_widget (glade_xml, "model_label")), model);
+		gtk_label_set_text (GTK_LABEL (glade_xml_get_widget (glade_xml, "version_label")), version);
+
+		g_free (manufacturer);
+		g_free (model);
+		g_free (version);
+	}
+}
+
+static void
+get_property_done (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+{
+	GValue value = { 0, };
+	GError *error = NULL;
+
+	if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_VALUE, &value, G_TYPE_INVALID)) {
+		g_warning ("%s", error->message);
+		g_error_free (error);
+	} else {
+		gtk_label_set_text (GTK_LABEL (user_data), g_value_get_string (&value));
+		g_value_unset (&value);
+	}
+}
+
+static gboolean
+get_info (gpointer data)
+{
+	AppData *app_data = (AppData *) data;
+
+	dbus_g_proxy_set_interface (app_data->proxy, MM_DBUS_INTERFACE_MODEM_GSM_CARD);
+	dbus_g_proxy_begin_call (app_data->proxy, "GetImsi", get_str_done,
+							 glade_xml_get_widget (app_data->glade_xml, "imsi_label"), NULL,
+							 G_TYPE_INVALID);
+
+	dbus_g_proxy_begin_call (app_data->proxy, "GetImei", get_str_done,
+							 glade_xml_get_widget (app_data->glade_xml, "imei_label"), NULL,
+							 G_TYPE_INVALID);
+
+	dbus_g_proxy_begin_call (app_data->proxy, "GetInfo", get_card_info_done,
+							 app_data->glade_xml, NULL,
+							 G_TYPE_INVALID);
+
+	dbus_g_proxy_set_interface (app_data->proxy, "org.freedesktop.DBus.Properties");
+
+	dbus_g_proxy_begin_call (app_data->proxy, "Get", get_property_done,
+							 glade_xml_get_widget (app_data->glade_xml, "driver_label"), NULL,
+							 G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM,
+							 G_TYPE_STRING, "Driver",
+							 G_TYPE_INVALID);
+
+	dbus_g_proxy_begin_call (app_data->proxy, "Get", get_property_done,
+							 glade_xml_get_widget (app_data->glade_xml, "device_label"), NULL,
+							 G_TYPE_STRING, MM_DBUS_INTERFACE_MODEM,
+							 G_TYPE_STRING, "Device",
+							 G_TYPE_INVALID);
+
+	return FALSE;
+}
+
+static void
+got_signal_quality (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+{
+	guint32 quality = 0;
+	GError *error = NULL;
+
+	if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_UINT, &quality, G_TYPE_INVALID)) {
+		g_warning ("%s", error->message);
+		g_error_free (error);
+	} else {
+		char *tmp;
+
+		tmp = g_strdup_printf ("%d%%", quality);
+		gtk_label_set_text (GTK_LABEL (user_data), tmp);
+		g_free (tmp);
+	}
+}
+
+static void
+signal_quality_changed (DBusGProxy *proxy,
+						guint32 signal_quality,
+						gpointer user_data)
+{
+	char *tmp;
+
+	tmp = g_strdup_printf ("%d%%", signal_quality);
+	gtk_label_set_text (GTK_LABEL (user_data), tmp);
+	g_free (tmp);
+}
+
+static gboolean
+monitor_signal_quality (gpointer data)
+{
+	AppData *app_data = (AppData *) data;
+	GtkWidget *label;
+
+	label = glade_xml_get_widget (app_data->glade_xml, "signal_quality_label");
+
+	dbus_g_proxy_add_signal (app_data->gsm_net_proxy, "SignalQuality", G_TYPE_UINT, G_TYPE_INVALID);
+	dbus_g_proxy_connect_signal (app_data->gsm_net_proxy, "SignalQuality",
+								 G_CALLBACK (signal_quality_changed),
+								 label, NULL);
+
+	dbus_g_proxy_begin_call (app_data->gsm_net_proxy, "GetSignalQuality",
+							 got_signal_quality, label, NULL, G_TYPE_INVALID);
+
+	return FALSE;
+}
+
+static void
+got_scan_results (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+{
+	AppData *app_data = (AppData *) user_data;
+	GPtrArray *array = NULL;
+	GError *error = NULL;
+	GType type;
+
+	type = dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_STRING_STRING_HASHTABLE);
+
+	if (!dbus_g_proxy_end_call (proxy, call_id, &error, type, &array, G_TYPE_INVALID)) {
+		g_warning ("Couldn't scan: %s", error->message);
+		g_error_free (error);
+	} else {
+		GtkTreeIter iter;
+		int i;
+
+		for (i = 0; i < array->len; i++) {
+			GHashTable *hash = (GHashTable *) g_ptr_array_index (array, i);
+			char *status;
+			const char *status_str;
+
+			status = g_hash_table_lookup (hash, "status");
+			if (!strcmp (status, "1"))
+				status_str = "Available";
+			else if (!strcmp (status, "2"))
+				status_str = "Current";
+			else if (!strcmp (status, "3"))
+				status_str = "Forbidden";
+			else
+				status_str = "Unknown";
+
+			gtk_list_store_append (app_data->network_store, &iter);
+			gtk_list_store_set (app_data->network_store, &iter,
+								SCAN_COL_NAME, g_hash_table_lookup (hash, "operator-long"),
+								SCAN_COL_STATUS, status_str,
+								SCAN_COL_OPER_ID, g_hash_table_lookup (hash, "operator-num"),
+								-1);
+
+			g_hash_table_destroy (hash);
+		}
+
+		g_ptr_array_free (array, TRUE);
+	}
+
+	gtk_widget_hide (app_data->scan_dialog);
+	gtk_widget_set_sensitive (app_data->scan_button, TRUE);
+}
+
+static gboolean
+scan_pulse (gpointer data)
+{
+	GtkProgressBar *bar = GTK_PROGRESS_BAR (data);
+
+	gtk_progress_bar_pulse (bar);
+	return gdk_window_is_visible (gtk_widget_get_parent_window (GTK_WIDGET (bar)));
+}
+
+static void
+scan (GtkButton *button, gpointer user_data)
+{
+	AppData *app_data = (AppData *) user_data;
+
+	dbus_g_proxy_begin_call_with_timeout (app_data->gsm_net_proxy, "Scan", got_scan_results,
+										  app_data, NULL, 120000, G_TYPE_INVALID);
+
+	gtk_widget_set_sensitive (app_data->scan_button, FALSE);
+	gtk_list_store_clear (app_data->network_store);
+
+	g_timeout_add (200, scan_pulse, app_data->scan_progress_bar);
+	gtk_widget_show (app_data->scan_dialog);
+}
+
+static void
+modem_enabled (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
+{
+	AppData *app_data = (AppData *) user_data;
+	GError *error = NULL;
+
+	if (!dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)) {
+		g_warning ("Couldn't enable modem: %s", error->message);
+		g_error_free (error);
+		g_main_loop_quit (app_data->main_loop);
+		return;
+	}
+
+	g_idle_add (get_info, app_data);
+	g_idle_add (monitor_signal_quality, app_data);
+}
+
+static void
+modem_enable (AppData *app_data)
+{
+	dbus_g_proxy_begin_call (app_data->proxy, "Enable", modem_enabled,
+ 							 app_data, NULL,
+ 							 G_TYPE_BOOLEAN, TRUE, G_TYPE_INVALID);
+}
+
+static void
+create_network (const char *name, const char *oper_code)
+{
+	NMConnection *connection;
+	NMSettingGsm *s_gsm;
+	NMSettingSerial *s_serial;
+	NMSettingPPP *s_ppp;
+	NMSettingConnection *s_con;
+	GConfClient *gconf_client;
+	char *uuid;
+
+	connection = nm_connection_new ();
+
+	s_gsm = NM_SETTING_GSM (nm_setting_gsm_new ());
+	g_object_set (s_gsm,
+				  NM_SETTING_GSM_NUMBER, "*99#",
+				  NM_SETTING_GSM_NETWORK_ID, oper_code,
+				  NULL);
+
+	nm_connection_add_setting (connection, NM_SETTING (s_gsm));
+
+	/* Serial setting */
+	s_serial = (NMSettingSerial *) nm_setting_serial_new ();
+	g_object_set (s_serial,
+				  NM_SETTING_SERIAL_BAUD, 115200,
+				  NM_SETTING_SERIAL_BITS, 8,
+				  NM_SETTING_SERIAL_PARITY, 'n',
+				  NM_SETTING_SERIAL_STOPBITS, 1,
+				  NULL);
+
+	nm_connection_add_setting (connection, NM_SETTING (s_serial));
+
+	s_ppp = (NMSettingPPP *) nm_setting_ppp_new ();
+	nm_connection_add_setting (connection, NM_SETTING (s_ppp));
+
+	s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+	uuid = nm_utils_uuid_generate ();
+	g_object_set (s_con,
+				  NM_SETTING_CONNECTION_ID, name,
+				  NM_SETTING_CONNECTION_TYPE, nm_setting_get_name (NM_SETTING (s_gsm)),
+				  NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+				  NM_SETTING_CONNECTION_UUID, uuid,
+				  NULL);
+
+	g_free (uuid);
+	nm_connection_add_setting (connection, NM_SETTING (s_con));
+
+	gconf_client = gconf_client_get_default ();
+	if (gconf_client) {
+		char *dir = NULL;
+		int i;
+
+		/* Find free GConf directory */
+		for (i = 0; i < G_MAXUINT32; i++) {
+			char buf[255];
+
+			snprintf (&buf[0], 255, GCONF_PATH_CONNECTIONS"/%d", i);
+			if (!gconf_client_dir_exists (gconf_client, buf, NULL)) {
+				dir = g_strdup (buf);
+				break;
+			}
+		}
+
+		nm_gconf_write_connection (connection, gconf_client, dir);
+		gconf_client_notify (gconf_client, dir);
+		gconf_client_suggest_sync (gconf_client, NULL);
+		g_free (dir);
+		g_object_unref (gconf_client);
+	} else
+		g_warning ("Writing conneciton failed");
+
+	g_object_unref (connection);
+}
+
+static void
+create_network_clicked (GtkButton *button, gpointer user_data)
+{
+	AppData *app_data = (AppData *) user_data;
+	GtkTreeSelection *selection;
+	GList *selected_rows;
+	GtkTreeModel *model = NULL;
+	GtkTreeIter iter;
+
+	selection = gtk_tree_view_get_selection (app_data->network_list);
+	selected_rows = gtk_tree_selection_get_selected_rows (selection, &model);
+	if (!selected_rows)
+		return;
+
+	if (gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) selected_rows->data)) {
+		char *oper_name = NULL;
+		char *oper_id = NULL;
+		gint result;
+
+		gtk_tree_model_get (model, &iter, SCAN_COL_NAME, &oper_name, -1);
+		gtk_tree_model_get (model, &iter, SCAN_COL_OPER_ID, &oper_id, -1);
+
+		gtk_entry_set_text (app_data->create_network_name, oper_name);
+		gtk_editable_select_region (GTK_EDITABLE (app_data->create_network_name), 0, -1);
+		gtk_widget_grab_focus (GTK_WIDGET (app_data->create_network_name));
+
+		result = gtk_dialog_run (app_data->create_network_dialog);
+		gtk_widget_hide (GTK_WIDGET (app_data->create_network_dialog));
+
+		if (result == GTK_RESPONSE_OK)
+			create_network (gtk_entry_get_text (app_data->create_network_name), oper_id);
+
+		g_free (oper_name);
+		g_free (oper_id);
+	}
+
+	/* free memory */
+	g_list_foreach (selected_rows, (GFunc) gtk_tree_path_free, NULL);
+	g_list_free (selected_rows);
+}
+
+static void
+network_list_selection_changed (GtkTreeSelection *selection, gpointer user_data)
+{
+	AppData *app_data = (AppData *) user_data;
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+
+	if (gtk_tree_selection_get_selected (selection, &model, &iter))
+		gtk_widget_set_sensitive (app_data->create_net_button, TRUE);
+	else
+		gtk_widget_set_sensitive (app_data->create_net_button, FALSE);
+}
+
+
+static void
+app_data_destroy (AppData *app_data)
+{
+	if (app_data->bus)
+		dbus_g_connection_unref (app_data->bus);
+
+	if (app_data->proxy)
+		g_object_unref (app_data->proxy);
+
+	if (app_data->gsm_net_proxy)
+		g_object_unref (app_data->gsm_net_proxy);
+
+	if (app_data->glade_xml)
+		g_object_unref (app_data->glade_xml);
+
+	if (app_data->main_loop)
+		g_main_loop_unref (app_data->main_loop);
+
+	g_slice_free (AppData, app_data);
+}
+
+static void
+close_cb (GtkDialog *dialog,
+		  gint response_id,
+		  gpointer user_data)
+{
+	AppData *app_data = (AppData *) user_data;
+
+	dbus_g_proxy_set_interface (app_data->proxy, MM_DBUS_INTERFACE_MODEM);
+	dbus_g_proxy_call_no_reply (app_data->proxy, "Enable", G_TYPE_BOOLEAN, FALSE, G_TYPE_INVALID);
+
+	g_main_loop_quit (app_data->main_loop);
+	app_data_destroy (app_data);
+}
+
+
+static GtkListStore *
+prepare_network_list (GtkTreeView *treeview)
+{
+	GtkListStore *store;
+
+	store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+	gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (store));
+	g_object_unref (store);
+
+	gtk_tree_view_insert_column_with_attributes (treeview,
+	                                             -1, "Name", gtk_cell_renderer_text_new (),
+	                                             "text", SCAN_COL_NAME,
+	                                             NULL);
+
+	gtk_tree_view_insert_column_with_attributes (treeview,
+	                                             -1, "Status", gtk_cell_renderer_text_new (),
+	                                             "text", SCAN_COL_STATUS,
+	                                             NULL);
+
+	return store;
+}
+
+static AppData *
+app_data_create (const char *udi)
+{
+	AppData *app_data;
+	GtkTreeSelection *selection;
+	GError *error = NULL;
+
+	app_data = g_slice_new0 (AppData);
+
+	/* DBus */
+	app_data->bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+	if (!app_data->bus) {
+		g_error ("Couldn't connect to DBus: %s", error->message);
+		g_error_free (error);
+		g_slice_free (AppData, app_data);
+
+		return NULL;
+	}
+
+	app_data->proxy = dbus_g_proxy_new_for_name (app_data->bus, MM_DBUS_SERVICE, udi, MM_DBUS_INTERFACE_MODEM);
+	app_data->gsm_net_proxy = dbus_g_proxy_new_from_proxy (app_data->proxy, MM_DBUS_INTERFACE_MODEM_GSM_NETWORK, NULL);
+
+	/* UI */
+	app_data->glade_xml = glade_xml_new (GLADEDIR "/nm-modem-properties.glade", NULL, NULL);
+	if (!app_data->glade_xml) {
+		g_error ("Could not load Glade file");
+		g_slice_free (AppData, app_data);
+
+		return NULL;
+	}
+
+	app_data->main_dialog = GTK_DIALOG (glade_xml_get_widget (app_data->glade_xml, "main_dialog"));
+	g_signal_connect (app_data->main_dialog, "response", G_CALLBACK (close_cb), app_data);
+
+	app_data->network_list = GTK_TREE_VIEW (glade_xml_get_widget (app_data->glade_xml, "network_list"));
+	app_data->network_store = prepare_network_list (app_data->network_list);
+	app_data->scan_button = glade_xml_get_widget (app_data->glade_xml, "scan_button");
+	g_signal_connect (app_data->scan_button, "clicked", G_CALLBACK (scan), app_data);
+
+	app_data->scan_dialog = glade_xml_get_widget (app_data->glade_xml, "scan_dialog");
+	gtk_window_set_transient_for (GTK_WINDOW (app_data->scan_dialog), GTK_WINDOW (app_data->main_dialog));
+
+	app_data->scan_progress_bar = GTK_PROGRESS_BAR (glade_xml_get_widget (app_data->glade_xml, "scan_progress_bar"));
+
+	app_data->create_net_button = glade_xml_get_widget (app_data->glade_xml, "create_connection_button");
+	gtk_widget_set_sensitive (app_data->create_net_button, FALSE);
+	g_signal_connect (app_data->create_net_button, "clicked", G_CALLBACK (create_network_clicked), app_data);
+	selection = gtk_tree_view_get_selection (app_data->network_list);
+	g_signal_connect (selection, "changed", G_CALLBACK (network_list_selection_changed), app_data);
+
+	app_data->create_network_dialog = GTK_DIALOG (glade_xml_get_widget (app_data->glade_xml, "create_network_dialog"));
+	app_data->create_network_name = GTK_ENTRY (glade_xml_get_widget (app_data->glade_xml, "create_network_name"));
+
+	app_data->main_loop = g_main_loop_new (NULL, FALSE);
+
+	return app_data;
+}
+
+int
+main (int argc, char *argv[])
+{
+	//const char *udi = "/org/freedesktop/Hal/devices/usb_device_12d1_1003_noserial_if0_serial_usb_0";
+	AppData *app_data;
+
+	if (argc != 2) {
+		g_print ("Usage: %s <udi>\n", argv[0]);
+		return 1;
+	}
+
+	gtk_init (&argc, &argv);
+
+	app_data = app_data_create (argv[1]);
+	if (app_data) {
+		modem_enable (app_data);
+		g_main_loop_run (app_data->main_loop);
+	}
+
+	return 0;
+}
diff --git a/src/modems/nm-modem-properties.glade b/src/modems/nm-modem-properties.glade
new file mode 100644
index 0000000..5c1285c
--- /dev/null
+++ b/src/modems/nm-modem-properties.glade
@@ -0,0 +1,1083 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkDialog" id="main_dialog">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">GSM modem properties</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area1">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="closebutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-close</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-7</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox1">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox2">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkFrame" id="frame1">
+		  <property name="visible">True</property>
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment1">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">0</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkTable" id="info_table">
+			  <property name="visible">True</property>
+			  <property name="n_rows">8</property>
+			  <property name="n_columns">2</property>
+			  <property name="homogeneous">False</property>
+			  <property name="row_spacing">0</property>
+			  <property name="column_spacing">6</property>
+
+			  <child>
+			    <widget class="GtkLabel" id="label6">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Vendor</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">0</property>
+			      <property name="bottom_attach">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label7">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Model</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label8">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Version</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">2</property>
+			      <property name="bottom_attach">3</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label9">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Driver</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label10">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Data device</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">4</property>
+			      <property name="bottom_attach">5</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label11">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">IMSI</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label12">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">IMEI</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">6</property>
+			      <property name="bottom_attach">7</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label13">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">Signal quality</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">0</property>
+			      <property name="right_attach">1</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="vendor_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">0</property>
+			      <property name="bottom_attach">1</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="model_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">1</property>
+			      <property name="bottom_attach">2</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="version_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">2</property>
+			      <property name="bottom_attach">3</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="driver_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">3</property>
+			      <property name="bottom_attach">4</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="device_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">4</property>
+			      <property name="bottom_attach">5</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="imsi_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">5</property>
+			      <property name="bottom_attach">6</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="imei_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">6</property>
+			      <property name="bottom_attach">7</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="signal_quality_label">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes"></property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">False</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">False</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0</property>
+			      <property name="yalign">0</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+			      <property name="width_chars">-1</property>
+			      <property name="single_line_mode">False</property>
+			      <property name="angle">0</property>
+			    </widget>
+			    <packing>
+			      <property name="left_attach">1</property>
+			      <property name="right_attach">2</property>
+			      <property name="top_attach">7</property>
+			      <property name="bottom_attach">8</property>
+			      <property name="x_options">fill</property>
+			      <property name="y_options"></property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label1">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Information&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkFrame" id="frame3">
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment3">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">0</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label4">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;PIN operations&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkFrame" id="frame2">
+	      <property name="visible">True</property>
+	      <property name="label_xalign">0</property>
+	      <property name="label_yalign">0.5</property>
+	      <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+	      <child>
+		<widget class="GtkAlignment" id="alignment2">
+		  <property name="visible">True</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xscale">1</property>
+		  <property name="yscale">1</property>
+		  <property name="top_padding">0</property>
+		  <property name="bottom_padding">0</property>
+		  <property name="left_padding">12</property>
+		  <property name="right_padding">0</property>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox1">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkScrolledWindow" id="scrolledwindow1">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			  <property name="shadow_type">GTK_SHADOW_IN</property>
+			  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+			  <child>
+			    <widget class="GtkTreeView" id="network_list">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="headers_visible">False</property>
+			      <property name="rules_hint">False</property>
+			      <property name="reorderable">False</property>
+			      <property name="enable_search">True</property>
+			      <property name="fixed_height_mode">False</property>
+			      <property name="hover_selection">False</property>
+			      <property name="hover_expand">False</property>
+			    </widget>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">True</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkVButtonBox" id="vbuttonbox1">
+			  <property name="visible">True</property>
+			  <property name="layout_style">GTK_BUTTONBOX_START</property>
+			  <property name="spacing">0</property>
+
+			  <child>
+			    <widget class="GtkButton" id="scan_button">
+			      <property name="visible">True</property>
+			      <property name="can_default">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Scan</property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkButton" id="create_connection_button">
+			      <property name="visible">True</property>
+			      <property name="can_default">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="label" translatable="yes">Create connection</property>
+			      <property name="use_underline">True</property>
+			      <property name="relief">GTK_RELIEF_NORMAL</property>
+			      <property name="focus_on_click">True</property>
+			    </widget>
+			  </child>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">False</property>
+			</packing>
+		      </child>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+
+	      <child>
+		<widget class="GtkLabel" id="label2">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Networks&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="type">label_item</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="create_network_dialog">
+  <property name="title" translatable="yes">Create new connection</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox2">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area2">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancelbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox2">
+	  <property name="border_width">6</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label3">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Please choose a name for the connection</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="create_network_name">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">True</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">●</property>
+	      <property name="activates_default">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkWindow" id="scan_dialog">
+  <property name="title" translatable="yes"></property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+  <property name="modal">True</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">False</property>
+  <property name="skip_taskbar_hint">True</property>
+  <property name="skip_pager_hint">True</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_CENTER</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="vbox3">
+      <property name="border_width">6</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">6</property>
+
+      <child>
+	<widget class="GtkLabel" id="label5">
+	  <property name="visible">True</property>
+	  <property name="label" translatable="yes">Scanning... Please wait.</property>
+	  <property name="use_underline">False</property>
+	  <property name="use_markup">False</property>
+	  <property name="justify">GTK_JUSTIFY_LEFT</property>
+	  <property name="wrap">False</property>
+	  <property name="selectable">False</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	  <property name="width_chars">-1</property>
+	  <property name="single_line_mode">False</property>
+	  <property name="angle">0</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkProgressBar" id="scan_progress_bar">
+	  <property name="visible">True</property>
+	  <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
+	  <property name="fraction">0</property>
+	  <property name="pulse_step">0.10000000149</property>
+	  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="pin_dialog">
+  <property name="visible">False</property>
+  <property name="title" translatable="yes">PIN code required</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox3">
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area3">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancelbutton2">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton2">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox4">
+	  <property name="border_width">6</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="pin_dialog_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Please enter SIM PIN code</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+	      <property name="width_chars">-1</property>
+	      <property name="single_line_mode">False</property>
+	      <property name="angle">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkEntry" id="pin_dialog_entry">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">True</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">●</property>
+	      <property name="activates_default">False</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
diff --git a/src/nma-gsm-modem.c b/src/nma-gsm-modem.c
new file mode 100644
index 0000000..0dba9cd
--- /dev/null
+++ b/src/nma-gsm-modem.c
@@ -0,0 +1,198 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
+#include "nma-gsm-modem.h"
+#include "mm-types.h"
+
+G_DEFINE_TYPE (NMAGsmModem, nma_gsm_modem, G_TYPE_OBJECT)
+
+#define NMA_GSM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NMA_TYPE_GSM_MODEM, NMAGsmModemPrivate))
+
+typedef struct {
+	DBusGProxy *proxy;
+	int signal_quality;
+
+	gboolean disposed;
+} NMAGsmModemPrivate;
+
+enum {
+	SIGNAL_QUALITY,
+	NETWORK_MODE,
+
+	LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void
+signal_quality_proxy (DBusGProxy *proxy,
+				  guint32 signal_quality,
+				  gpointer user_data)
+{
+	NMAGsmModem *modem = NMA_GSM_MODEM (user_data);
+
+	NMA_GSM_MODEM_GET_PRIVATE (modem)->signal_quality = signal_quality;
+
+	g_signal_emit (modem, signals[SIGNAL_QUALITY], 0, signal_quality);
+}
+
+static void
+network_mode_proxy (DBusGProxy *proxy,
+				guint32 network_mode,
+				gpointer user_data)
+{
+	NMAGsmModem *modem = NMA_GSM_MODEM (user_data);
+
+	g_signal_emit (modem, signals[NETWORK_MODE], 0, network_mode);
+}
+
+NMAGsmModem *
+nma_gsm_modem_new (DBusGConnection *bus, const char *object_path)
+{
+	NMAGsmModem *modem;
+	NMAGsmModemPrivate *priv;
+
+	g_return_val_if_fail (bus != NULL, NULL);
+	g_return_val_if_fail (object_path != NULL, NULL);
+
+	modem = (NMAGsmModem *) g_object_new (NMA_TYPE_GSM_MODEM, NULL);
+	if (!modem)
+		return NULL;
+
+	priv = NMA_GSM_MODEM_GET_PRIVATE (modem);
+	priv->proxy = dbus_g_proxy_new_for_name (bus, MM_DBUS_SERVICE, object_path, MM_DBUS_INTERFACE_MODEM_GSM);
+
+	dbus_g_proxy_add_signal (priv->proxy, "SignalQuality", G_TYPE_UINT, G_TYPE_INVALID);
+	dbus_g_proxy_connect_signal (priv->proxy, "SignalQuality",
+						    G_CALLBACK (signal_quality_proxy),
+						    modem,
+						    NULL);
+
+	dbus_g_proxy_add_signal (priv->proxy, "NetworkMode", G_TYPE_UINT, G_TYPE_INVALID);
+	dbus_g_proxy_connect_signal (priv->proxy, "NetworkMode",
+						    G_CALLBACK (network_mode_proxy),
+						    modem,
+						    NULL);
+
+	return modem;
+}
+
+guint32
+nma_gsm_modem_get_signal_quality (NMAGsmModem *modem)
+{
+	NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem);
+	GError *err = NULL;
+
+	g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0);
+
+	if (priv->signal_quality == -1) {
+		if (!dbus_g_proxy_call (priv->proxy, "GetSignalQuality", &err,
+						    G_TYPE_INVALID,
+						    G_TYPE_UINT, &priv->signal_quality,
+						    G_TYPE_INVALID)) {
+			g_warning ("Error in getting signal quality: %s", err->message);
+			g_error_free (err);
+		}
+	}
+
+	return priv->signal_quality;
+}
+
+guint32
+nma_gsm_modem_get_registration_info (NMAGsmModem *modem,
+							  char **operator_code,
+							  char **operator_name)
+{
+	NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem);
+	GError *err = NULL;
+	guint32 status = MM_GSM_MODEM_REG_STATUS_UNKNOWN;
+
+	g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0);
+
+	if (!dbus_g_proxy_call (priv->proxy, "GetRegistrationInfo", &err,
+					    G_TYPE_INVALID,
+					    G_TYPE_UINT, &status,
+					    G_TYPE_STRING, operator_code,
+					    G_TYPE_STRING, operator_name,
+					    G_TYPE_INVALID)) {
+		g_warning ("Error in getting network mode: %s", err->message);
+		g_error_free (err);
+	}
+
+	return status;
+}
+
+guint32
+nma_gsm_modem_get_network_mode (NMAGsmModem *modem)
+{
+	NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem);
+	GError *err = NULL;
+	guint32 network_mode = 0;
+
+	g_return_val_if_fail (NMA_IS_GSM_MODEM (modem), 0);
+
+	if (!dbus_g_proxy_call (priv->proxy, "GetNetworkMode", &err,
+					    G_TYPE_INVALID,
+					    G_TYPE_UINT, &network_mode,
+					    G_TYPE_INVALID)) {
+		g_warning ("Error in getting network mode: %s", err->message);
+		g_error_free (err);
+	}
+
+	return network_mode;
+}
+
+static void
+nma_gsm_modem_init (NMAGsmModem *modem)
+{
+	NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (modem);
+
+	priv->signal_quality = -1;
+}
+
+static void
+dispose (GObject *object)
+{
+	NMAGsmModemPrivate *priv = NMA_GSM_MODEM_GET_PRIVATE (object);
+
+	if (priv->disposed)
+		return;
+
+	priv->disposed = TRUE;
+
+	if (priv->proxy)
+		g_object_unref (priv->proxy);
+
+	G_OBJECT_CLASS (nma_gsm_modem_parent_class)->dispose (object);
+}
+
+static void
+nma_gsm_modem_class_init (NMAGsmModemClass *modem_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (modem_class);
+
+	g_type_class_add_private (modem_class, sizeof (NMAGsmModemPrivate));
+
+	/* virtual methods */
+	object_class->dispose = dispose;
+
+	/* Signals */
+	signals[SIGNAL_QUALITY] = 
+		g_signal_new ("signal-quality",
+				    G_OBJECT_CLASS_TYPE (object_class),
+				    G_SIGNAL_RUN_FIRST,
+				    G_STRUCT_OFFSET (NMAGsmModemClass, signal_quality),
+				    NULL, NULL,
+				    g_cclosure_marshal_VOID__UINT,
+				    G_TYPE_NONE, 1,
+				    G_TYPE_UINT);
+
+	signals[NETWORK_MODE] = 
+		g_signal_new ("network-mode",
+				    G_OBJECT_CLASS_TYPE (object_class),
+				    G_SIGNAL_RUN_FIRST,
+				    G_STRUCT_OFFSET (NMAGsmModemClass, network_mode),
+				    NULL, NULL,
+				    g_cclosure_marshal_VOID__UINT,
+				    G_TYPE_NONE, 1,
+				    G_TYPE_UINT);
+}
diff --git a/src/nma-gsm-modem.h b/src/nma-gsm-modem.h
new file mode 100644
index 0000000..90e7ae0
--- /dev/null
+++ b/src/nma-gsm-modem.h
@@ -0,0 +1,45 @@
+/* -*- Mode: C; tab-width: 5; indent-tabs-mode: t; c-basic-offset: 5 -*- */
+
+#ifndef NMA_GSM_MODEM_H
+#define NMA_GSM_MODEM_H
+
+#include <glib/gtypes.h>
+#include <glib-object.h>
+#include <dbus/dbus-glib.h>
+
+G_BEGIN_DECLS
+
+#define NMA_TYPE_GSM_MODEM            (nma_gsm_modem_get_type ())
+#define NMA_GSM_MODEM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NMA_TYPE_GSM_MODEM, NMAGsmModem))
+#define NMA_GSM_MODEM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NMA_TYPE_GSM_MODEM, NMAGsmModemClass))
+#define NMA_IS_GSM_MODEM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NMA_TYPE_GSM_MODEM))
+#define NMA_IS_GSM_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NMA_TYPE_GSM_MODEM))
+#define NMA_GSM_MODEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), NMA_TYPE_GSM_MODEM, NMAGsmModemClass))
+
+typedef struct {
+	GObject parent;
+} NMAGsmModem;
+
+typedef struct {
+	GObjectClass parent;
+
+	/* Signals */
+	void (*signal_quality) (NMAGsmModem *modem, guint32 signal_quality);
+	void (*network_mode) (NMAGsmModem *modem, guint32 network_mode);
+} NMAGsmModemClass;
+
+GType        nma_gsm_modem_get_type (void);
+
+NMAGsmModem *nma_gsm_modem_new (DBusGConnection *bus,
+						  const char *object_path);
+
+guint32 nma_gsm_modem_get_signal_quality (NMAGsmModem *modem);
+guint32 nma_gsm_modem_get_registration_info (NMAGsmModem *modem,
+									char **operator_code,
+									char **operator_name);
+
+guint32 nma_gsm_modem_get_network_mode (NMAGsmModem *modem);
+
+G_END_DECLS
+
+#endif /* NMA_GSM_MODEM_H */
-- 
1.6.0.2

