diff --git a/po/POTFILES.in b/po/POTFILES.in
index a752399..0d220b3 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -6,6 +6,7 @@ nm-connection-editor.desktop.in
 src/applet-dbus-manager.c
 src/applet-device-cdma.c
 src/applet-device-gsm.c
+src/applet-device-modem.c
 src/applet-device-wired.c
 src/applet-device-wifi.c
 src/applet-dialogs.c
@@ -17,6 +18,7 @@ src/connection-editor/ce-page.c
 src/connection-editor/ce-page-dsl.glade
 src/connection-editor/ce-page-ip4.glade
 src/connection-editor/ce-page-mobile.glade
+src/connection-editor/ce-page-modem.glade
 src/connection-editor/ce-page-ppp.glade
 src/connection-editor/ce-page-wired.glade
 src/connection-editor/ce-page-wireless.glade
@@ -27,6 +29,7 @@ src/connection-editor/mobile-wizard.c
 src/connection-editor/page-dsl.c
 src/connection-editor/page-ip4.c
 src/connection-editor/page-mobile.c
+src/connection-editor/page-modem.c
 src/connection-editor/page-ppp.c
 src/connection-editor/page-vpn.c
 src/connection-editor/page-wired.c
diff --git a/src/Makefile.am b/src/Makefile.am
index ff13af9..1f839e1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -44,6 +44,8 @@ nm_applet_SOURCES =			\
 	applet-device-wired.c \
 	applet-device-wifi.h \
 	applet-device-wifi.c \
+	applet-device-modem.h \
+	applet-device-modem.c \
 	ap-menu-item.h \
 	ap-menu-item.c \
 	applet-device-gsm.h \
diff --git a/src/applet-device-modem.c b/src/applet-device-modem.c
new file mode 100644
index 0000000..aa95f73
--- /dev/null
+++ b/src/applet-device-modem.c
@@ -0,0 +1,611 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager Wireless Applet -- Display wireless access points and allow user control
+ *
+ * Dan Williams <dcbw@redhat.com>
+ * Hans Petter Jansson <hpj@novell.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2008 Red Hat, Inc.
+ * (C) Copyright 2010 Novell, Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include <nm-device.h>
+#include <nm-setting-connection.h>
+#include <nm-setting-analog-modem.h>
+#include <nm-setting-ip4-config.h>
+#include <nm-setting-serial.h>
+#include <nm-setting-ppp.h>
+#include <nm-device-analog-modem.h>
+#include <nm-utils.h>
+
+#ifdef NO_POLKIT_GNOME
+#include "polkit-gnome.h"
+#else
+#include <polkit-gnome/polkit-gnome.h>
+#endif
+
+#include "applet.h"
+#include "applet-device-modem.h"
+#include "utils.h"
+#include "applet-polkit-manager.h"
+#include "applet-menu-item.h"
+
+typedef struct {
+	NMApplet *applet;
+	NMDevice *device;
+	NMConnection *connection;
+	PolKitGnomeAction *pk_gnome_action;
+} ModemMenuItemInfo;
+
+static void
+modem_menu_item_info_destroy (gpointer data)
+{
+	ModemMenuItemInfo *info = (ModemMenuItemInfo *) data;
+	if (info->device) {
+	    g_object_unref (G_OBJECT (info->device));
+	    info->device = NULL;
+	}
+	if (info->connection) {
+	    g_object_unref (G_OBJECT (info->connection));
+	    info->connection = NULL;
+	}
+	if (info->pk_gnome_action) {
+	    g_object_unref (G_OBJECT (info->pk_gnome_action));
+	    info->pk_gnome_action = NULL;
+	}
+
+	g_slice_free (ModemMenuItemInfo, data);
+}
+
+#define DEFAULT_MODEM_NAME _("Auto Modem connection")
+
+static NMConnection *
+modem_new_auto_connection (NMDevice *device,
+                          NMApplet *applet,
+                          gpointer user_data)
+{
+	NMConnection *connection;
+	NMSettingAnalogModem *s_modem;
+	NMSettingSerial *s_serial;
+	NMSettingPPP *s_ppp;
+	NMSettingConnection *s_con;
+	char *uuid;
+
+	connection = nm_connection_new ();
+
+	s_modem = NM_SETTING_ANALOG_MODEM (nm_setting_analog_modem_new ());
+
+	nm_connection_add_setting (connection, NM_SETTING (s_modem));
+
+	/* 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, DEFAULT_MODEM_NAME,
+		      NM_SETTING_CONNECTION_TYPE, nm_setting_get_name (NM_SETTING (s_modem)),
+		      NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+		      NM_SETTING_CONNECTION_UUID, uuid,
+		      NULL);
+	g_free (uuid);
+	nm_connection_add_setting (connection, NM_SETTING (s_con));
+
+	return connection;
+}
+
+static void
+modem_menu_item_activate (GtkMenuItem *item, gpointer user_data)
+{
+	ModemMenuItemInfo *info = (ModemMenuItemInfo *) user_data;
+
+	applet_menu_item_activate_helper (info->device,
+	                                  info->connection,
+	                                  "/",
+	                                  info->applet,
+	                                  user_data);
+}
+
+static void
+add_connection_items (NMDevice *device,
+                      GSList *connections,
+                      NMConnection *active,
+                      GtkWidget *menu,
+                      NMApplet *applet)
+{
+	GSList *iter;
+	ModemMenuItemInfo *info;
+	AppletPolKitManager * pk_manager;
+	pk_manager = applet_polkit_manager_get ();
+
+	for (iter = connections; iter; iter = g_slist_next (iter)) {
+		NMConnection *connection = NM_CONNECTION (iter->data);
+		NMSettingConnection *s_con;
+		GtkWidget *item;
+		PolKitGnomeAction * pk_gnome_action;
+		const char * connection_type;
+
+		pk_gnome_action = NULL;
+
+		s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+		connection_type = s_con ? nm_setting_connection_get_connection_type (s_con) : NULL;
+		if (connection_type == NULL) {
+			g_warning ("connection_type is NULL");
+			continue;
+		}
+
+		item = applet_menu_item_new_with_label (nm_setting_connection_get_id (s_con));
+		gtk_check_menu_item_set_draw_as_radio (GTK_CHECK_MENU_ITEM (item), TRUE);
+
+		if (connection == active)
+			gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
+
+		if (!is_system_connection (connection)) {
+		    NMSettingIP4Config *s_ip4;
+		    AppletPolKitManagerActionDetails action_details;
+
+		    action_details = APPLET_POLKIT_MANAGER_ACTION_CONNECTION_TYPE;
+		    s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting (connection, NM_TYPE_SETTING_IP4_CONFIG));
+		    if (s_ip4) {
+			const char *ip4_method;
+			ip4_method = nm_setting_ip4_config_get_method (s_ip4);
+			if (!strcmp (ip4_method, "shared")) {
+			    action_details = APPLET_POLKIT_MANAGER_ACTION_CONNECTION_TYPE_WITH_SHARE;
+			}
+		    }
+		    pk_gnome_action = applet_polkit_manager_connect_menu_item_action (pk_manager, APPLET_MENU_ITEM (item), connection_type, action_details);
+		    if (pk_gnome_action == NULL) {
+			g_object_ref (item);
+			gtk_object_sink (GTK_OBJECT (item));
+			gtk_widget_destroy (GTK_WIDGET (item));
+			g_object_unref (item);
+			continue;
+		    }
+		    /* set the applet for item auth end callback in AppletPolKitManager */
+		    g_object_set_data (G_OBJECT (item), "applet", applet);
+		}
+
+		info = g_slice_new0 (ModemMenuItemInfo);
+		info->applet = applet;
+		info->device = g_object_ref (G_OBJECT (device));
+		info->connection = g_object_ref (connection);
+		info->pk_gnome_action = pk_gnome_action;
+
+		g_signal_connect_data (item, "activate",
+		                       G_CALLBACK (modem_menu_item_activate),
+		                       info,
+		                       (GClosureNotify) modem_menu_item_info_destroy, 0);
+
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+	}
+}
+
+static void
+modem_menu_item_deactivate (GtkMenuItem *item, gpointer user_data)
+{
+	ModemMenuItemInfo *info = (ModemMenuItemInfo *) user_data;
+	NMActiveConnection *active = NULL;
+
+	applet_find_active_connection_for_device (info->device, info->applet, &active);
+	if (active)
+		nm_client_deactivate_connection (info->applet->nm_client, active);
+	else
+		g_warning ("%s: couldn't find active connection to deactive", __func__);
+}
+
+static void
+add_disconnect_item (NMDevice *device,
+                     GtkWidget *menu,
+                     NMApplet *applet)
+{
+	NMDeviceState state;
+	GtkWidget *item;
+	ModemMenuItemInfo *info;
+
+	state = nm_device_get_state (device);
+	if (   state == NM_DEVICE_STATE_UNKNOWN
+	    || state == NM_DEVICE_STATE_UNMANAGED
+	    || state == NM_DEVICE_STATE_UNAVAILABLE
+	    || state == NM_DEVICE_STATE_DISCONNECTED
+	    || state == NM_DEVICE_STATE_FAILED)
+		return;
+
+	item = gtk_menu_item_new_with_label (_("Disconnect"));
+
+	info = g_slice_new0 (ModemMenuItemInfo);
+	info->applet = applet;
+	info->device = g_object_ref (G_OBJECT (device));
+
+	g_signal_connect_data (item, "activate",
+	                       G_CALLBACK (modem_menu_item_deactivate),
+	                       info,
+	                       (GClosureNotify) modem_menu_item_info_destroy, 0);
+
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+}
+
+static void
+modem_add_menu_item (NMDevice *device,
+                    guint32 n_devices,
+                    NMConnection *active,
+                    GtkWidget *menu,
+                    NMApplet *applet)
+{
+	char *text;
+	GtkWidget *item;
+	GSList *connections, *all;
+	GtkWidget *label;
+	char *bold_text;
+
+	all = applet_get_all_connections (applet);
+	connections = utils_filter_connections_for_device (device, all);
+	g_slist_free (all);
+
+	if (n_devices > 1) {
+		char *desc;
+
+		desc = (char *) utils_get_device_description (device);
+		if (!desc)
+			desc = (char *) nm_device_get_iface (device);
+		g_assert (desc);
+
+		text = g_strdup_printf (_("Dial-up Modem (%s)"), desc);
+	} else {
+		text = g_strdup (_("Dial-up Modem"));
+	}
+
+	item = gtk_menu_item_new_with_label (text);
+	g_free (text);
+
+	label = gtk_bin_get_child (GTK_BIN (item));
+	bold_text = g_markup_printf_escaped ("<span weight=\"bold\">%s</span>",
+	                                     gtk_label_get_text (GTK_LABEL (label)));
+	gtk_label_set_markup (GTK_LABEL (label), bold_text);
+	g_free (bold_text);
+
+	gtk_widget_set_sensitive (item, FALSE);
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+	gtk_widget_show (item);
+
+	/* Notify user of unmanaged or unavailable device */
+	item = nma_menu_device_check_unusable (device, NULL);
+	if (item) {
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+		gtk_widget_show (item);
+		goto out;
+	}
+
+	if (g_slist_length (connections))
+		add_connection_items (device, connections, active, menu, applet);
+	add_disconnect_item (device, menu, applet);
+
+out:
+	g_slist_free (connections);
+}
+
+static void
+modem_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);
+		}
+
+		applet_do_notify_with_pref (applet,
+		                            _("Connection Established"),
+		                            str ? str : _("You are now connected to the dial-up network."),
+		                            "nm-device-wwan",
+		                            PREF_DISABLE_CONNECTED_NOTIFICATIONS);
+		g_free (str);
+	}
+}
+
+static GdkPixbuf *
+modem_get_icon (NMDevice *device,
+               NMDeviceState state,
+               NMConnection *connection,
+               char **tip,
+               NMApplet *applet)
+{
+	NMSettingConnection *s_con;
+	GdkPixbuf *pixbuf = NULL;
+	const char *id;
+
+	id = nm_device_get_iface (NM_DEVICE (device));
+	if (connection) {
+		s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+		id = nm_setting_connection_get_id (s_con);
+	}
+
+	switch (state) {
+	case NM_DEVICE_STATE_PREPARE:
+		*tip = g_strdup_printf (_("Preparing dial-up modem connection '%s'..."), id);
+		break;
+	case NM_DEVICE_STATE_CONFIG:
+		*tip = g_strdup_printf (_("Configuring dial-up modem connection '%s'..."), id);
+		break;
+	case NM_DEVICE_STATE_NEED_AUTH:
+		*tip = g_strdup_printf (_("User authentication required for dial-up modem connection '%s'..."), id);
+		break;
+	case NM_DEVICE_STATE_IP_CONFIG:
+		*tip = g_strdup_printf (_("Requesting a network address for '%s'..."), id);
+		break;
+	case NM_DEVICE_STATE_ACTIVATED:
+		pixbuf = applet->modem_icon;
+		*tip = g_strdup_printf (_("Dial-up modem connection '%s' active"), id);
+		break;
+	default:
+		break;
+	}
+
+	return pixbuf;
+}
+
+typedef struct {
+	DBusGMethodInvocation *context;
+	NMApplet *applet;
+	NMConnection *connection;
+	NMActiveConnection *active_connection;
+	GtkWidget *dialog;
+	GtkEntry *secret_entry;
+	char *secret_name;
+} NMModemInfo;
+
+static void
+destroy_modem_dialog (gpointer user_data, GObject *finalized)
+{
+	NMModemInfo *info = user_data;
+
+	gtk_widget_hide (info->dialog);
+	gtk_widget_destroy (info->dialog);
+
+	g_object_unref (info->connection);
+	g_free (info->secret_name);
+	g_free (info);
+}
+
+static void
+get_modem_secrets_cb (GtkDialog *dialog,
+                     gint response,
+                     gpointer user_data)
+{
+	NMModemInfo *info = (NMModemInfo *) user_data;
+	NMAGConfConnection *gconf_connection;
+	NMSettingAnalogModem *setting;
+	GHashTable *settings_hash;
+	GHashTable *secrets;
+	GError *err = NULL;
+
+	/* Got a user response, clear the NMActiveConnection destroy handler for
+	 * this dialog since this function will now take over dialog destruction.
+	 */
+	g_object_weak_unref (G_OBJECT (info->active_connection), destroy_modem_dialog, info);
+
+	if (response != GTK_RESPONSE_OK) {
+		g_set_error (&err, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_SECRETS_REQUEST_CANCELED,
+		             "%s.%d (%s): canceled",
+		             __FILE__, __LINE__, __func__);
+		goto done;
+	}
+
+	setting = NM_SETTING_ANALOG_MODEM (nm_connection_get_setting (info->connection, NM_TYPE_SETTING_ANALOG_MODEM));
+
+	if (!strcmp (info->secret_name, NM_SETTING_ANALOG_MODEM_PASSWORD)) {
+		g_object_set (setting,
+			      NM_SETTING_ANALOG_MODEM_PASSWORD, gtk_entry_get_text (info->secret_entry),
+			      NULL);
+	}
+
+	secrets = nm_setting_to_hash (NM_SETTING (setting));
+	if (!secrets) {
+		g_set_error (&err, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INTERNAL_ERROR,
+				   "%s.%d (%s): failed to hash setting '%s'.",
+			     __FILE__, __LINE__, __func__, nm_setting_get_name (NM_SETTING (setting)));
+		goto done;
+	}
+
+	/* Returned secrets are a{sa{sv}}; this is the outer a{s...} hash that
+	 * will contain all the individual settings hashes.
+	 */
+	settings_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+								    g_free, (GDestroyNotify) g_hash_table_destroy);
+
+	g_hash_table_insert (settings_hash, g_strdup (nm_setting_get_name (NM_SETTING (setting))), secrets);
+	dbus_g_method_return (info->context, settings_hash);
+	g_hash_table_destroy (settings_hash);
+
+	/* Save the connection back to GConf _after_ hashing it, because
+	 * saving to GConf might trigger the GConf change notifiers, resulting
+	 * in the connection being read back in from GConf which clears secrets.
+	 */
+	gconf_connection = nma_gconf_settings_get_by_connection (info->applet->gconf_settings, info->connection);
+	if (gconf_connection)
+		nma_gconf_connection_save (gconf_connection);
+
+ done:
+	if (err) {
+		g_warning ("%s", err->message);
+		dbus_g_method_return_error (info->context, err);
+		g_error_free (err);
+	}
+
+	nm_connection_clear_secrets (info->connection);
+	destroy_modem_dialog (info, NULL);
+}
+
+static GtkWidget *
+ask_for_password (NMDevice *device,
+                  NMConnection *connection,
+                  GtkEntry **out_secret_entry)
+{
+	GtkDialog *dialog;
+	GtkWidget *w;
+	GtkBox *box;
+	char *dev_str;
+	NMSettingConnection *s_con;
+	char *tmp;
+	const char *id;
+
+	dialog = GTK_DIALOG (gtk_dialog_new ());
+	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+	gtk_window_set_title (GTK_WINDOW (dialog), _("Dial-up Modem password"));
+
+	w = gtk_dialog_add_button (dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
+	w = gtk_dialog_add_button (dialog, GTK_STOCK_OK, GTK_RESPONSE_OK);
+	gtk_window_set_default (GTK_WINDOW (dialog), w);
+
+	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	id = nm_setting_connection_get_id (s_con);
+	g_assert (id);
+	tmp = g_strdup_printf (_("A password is required to connect to '%s'."), id);
+	w = gtk_label_new (tmp);
+	g_free (tmp);
+	gtk_box_pack_start (GTK_BOX (dialog->vbox), w, TRUE, TRUE, 0);
+
+	dev_str = g_strdup_printf ("<b>%s</b>", utils_get_device_description (device));
+	w = gtk_label_new (NULL);
+	gtk_label_set_markup (GTK_LABEL (w), dev_str);
+	g_free (dev_str);
+	gtk_box_pack_start (GTK_BOX (dialog->vbox), w, TRUE, TRUE, 0);
+
+	w = gtk_alignment_new (0.5, 0.5, 0, 1.0);
+	gtk_box_pack_start (GTK_BOX (dialog->vbox), w, TRUE, TRUE, 0);
+
+	box = GTK_BOX (gtk_hbox_new (FALSE, 6));
+	gtk_container_set_border_width (GTK_CONTAINER (box), 6);
+	gtk_container_add (GTK_CONTAINER (w), GTK_WIDGET (box));
+
+	gtk_box_pack_start (box, gtk_label_new (_("Password:")), FALSE, FALSE, 0);
+
+	w = gtk_entry_new ();
+	*out_secret_entry = GTK_ENTRY (w);
+	gtk_entry_set_activates_default (GTK_ENTRY (w), TRUE);
+	gtk_box_pack_start (box, w, FALSE, FALSE, 0);
+
+	gtk_widget_show_all (dialog->vbox);
+	return GTK_WIDGET (dialog);
+}
+
+static gboolean
+modem_get_secrets (NMDevice *device,
+                 NMConnection *connection,
+                 NMActiveConnection *active_connection,
+                 const char *setting_name,
+                 const char **hints,
+                 DBusGMethodInvocation *context,
+                 NMApplet *applet,
+                 GError **error)
+{
+	NMModemInfo *info;
+	GtkWidget *widget;
+	GtkEntry *secret_entry = NULL;
+
+	if (!hints || !g_strv_length ((char **) hints)) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INTERNAL_ERROR,
+		             "%s.%d (%s): missing secrets hints.",
+		             __FILE__, __LINE__, __func__);
+		return FALSE;
+	}
+
+	if (!strcmp (hints[0], NM_SETTING_ANALOG_MODEM_PASSWORD))
+		widget = ask_for_password (device, connection, &secret_entry);
+	else {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INTERNAL_ERROR,
+		             "%s.%d (%s): unknown secrets hint '%s'.",
+		             __FILE__, __LINE__, __func__, hints[0]);
+		return FALSE;
+	}
+
+	if (!widget || !secret_entry) {
+		g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INTERNAL_ERROR,
+		             "%s.%d (%s): error asking for modem secrets.",
+		             __FILE__, __LINE__, __func__);
+		return FALSE;
+	}
+
+	info = g_new (NMModemInfo, 1);
+	info->context = context;
+	info->applet = applet;
+	info->active_connection = active_connection;
+	info->connection = g_object_ref (connection);
+	info->secret_name = g_strdup (hints[0]);
+	info->dialog = widget;
+	info->secret_entry = secret_entry;
+
+	g_signal_connect (widget, "response", G_CALLBACK (get_modem_secrets_cb), info);
+
+	/* Attach a destroy notifier to the NMActiveConnection so we can destroy
+	 * the dialog when the active connection goes away.
+	 */
+	g_object_weak_ref (G_OBJECT (active_connection), destroy_modem_dialog, info);
+
+	gtk_window_set_position (GTK_WINDOW (widget), GTK_WIN_POS_CENTER_ALWAYS);
+	gtk_widget_realize (GTK_WIDGET (widget));
+	gtk_window_present (GTK_WINDOW (widget));
+
+	return TRUE;
+}
+
+NMADeviceClass *
+applet_device_modem_get_class (NMApplet *applet)
+{
+	NMADeviceClass *dclass;
+
+	dclass = g_slice_new0 (NMADeviceClass);
+	if (!dclass)
+		return NULL;
+
+	dclass->new_auto_connection = modem_new_auto_connection;
+	dclass->add_menu_item = modem_add_menu_item;
+	dclass->device_state_changed = modem_device_state_changed;
+	dclass->get_icon = modem_get_icon;
+	dclass->get_secrets = modem_get_secrets;
+
+	return dclass;
+}
+
diff --git a/src/applet-device-modem.h b/src/applet-device-modem.h
new file mode 100644
index 0000000..6f654c8
--- /dev/null
+++ b/src/applet-device-modem.h
@@ -0,0 +1,31 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager Wireless Applet -- Display wireless access points and allow user control
+ *
+ * Dan Williams <dcbw@redhat.com>
+ * Hans Petter Jansson <hpj@novell.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2008 Red Hat, Inc.
+ */
+
+#ifndef __APPLET_DEVICE_MODEM_H__
+#define __APPLET_DEVICE_MODEM_H__
+
+#include "applet.h"
+
+NMADeviceClass *applet_device_modem_get_class (NMApplet *applet);
+
+#endif /* __APPLET_DEVICE_MODEM_H__ */
diff --git a/src/applet-dialogs.c b/src/applet-dialogs.c
index e1dc530..de55a7b 100644
--- a/src/applet-dialogs.c
+++ b/src/applet-dialogs.c
@@ -26,6 +26,7 @@
 
 #include <nm-device-ethernet.h>
 #include <nm-device-wifi.h>
+#include <nm-device-analog-modem.h>
 #include <nm-gsm-device.h>
 #include <nm-cdma-device.h>
 
@@ -262,6 +263,8 @@ info_dialog_add_page (GtkNotebook *notebook,
 		str = g_strdup_printf (_("GSM (%s)"), iface);
 	else if (NM_IS_CDMA_DEVICE (device))
 		str = g_strdup_printf (_("CDMA (%s)"), iface);
+	else if (NM_IS_DEVICE_ANALOG_MODEM (device))
+		str = g_strdup_printf (_("Modem (%s)"), iface);
 	else
 		str = g_strdup (iface);
 
diff --git a/src/applet-polkit-manager.c b/src/applet-polkit-manager.c
index 425d898..42e1282 100644
--- a/src/applet-polkit-manager.c
+++ b/src/applet-polkit-manager.c
@@ -17,6 +17,7 @@
 #include <nm-setting-ppp.h>
 #include <nm-setting-gsm.h>
 #include <nm-setting-cdma.h>
+#include <nm-setting-analog-modem.h>
 
 #include "applet.h"
 #include "applet-polkit-manager.h"
@@ -27,12 +28,14 @@
 #define NM_POLICY_ACTION_USER_MOBILE_APPLY "org.freedesktop.network-manager-settings.user.mobile.apply"
 #define NM_POLICY_ACTION_USER_VPN_APPLY "org.freedesktop.network-manager-settings.user.vpn.apply"
 #define NM_POLICY_ACTION_USER_DSL_APPLY "org.freedesktop.network-manager-settings.user.dsl.apply"
+#define NM_POLICY_ACTION_USER_MODEM_APPLY "org.freedesktop.network-manager-settings.user.modem.apply" // Analog modem
 
 #define NM_POLICY_ACTION_USER_WIRED_APPLY_WITH_SHARE "org.freedesktop.network-manager-settings.user.wired.apply-with-share"
 #define NM_POLICY_ACTION_USER_WIRELESS_APPLY_WITH_SHARE "org.freedesktop.network-manager-settings.user.wireless.apply-with-share"
 #define NM_POLICY_ACTION_USER_MOBILE_APPLY_WITH_SHARE "org.freedesktop.network-manager-settings.user.mobile.apply-with-share"
 #define NM_POLICY_ACTION_USER_VPN_APPLY_WITH_SHARE "org.freedesktop.network-manager-settings.user.vpn.apply-with-share"
 #define NM_POLICY_ACTION_USER_DSL_APPLY_WITH_SHARE "org.freedesktop.network-manager-settings.user.dsl.apply-with-share"
+#define NM_POLICY_ACTION_USER_MODEM_APPLY_WITH_SHARE "org.freedesktop.network-manager-settings.user.modem.apply-with-share" // Analog modem
 
 static AppletPolKitManager *singleton = NULL;
 
@@ -44,12 +47,14 @@ struct _AppletPolKitManagerPriv {
     PolKitAction *user_mobile_apply;
     PolKitAction *user_vpn_apply;
     PolKitAction *user_dsl_apply;
+    PolKitAction *user_modem_apply;
 
     PolKitAction *user_wired_apply_with_share;
     PolKitAction *user_wireless_apply_with_share;
     PolKitAction *user_mobile_apply_with_share;
     PolKitAction *user_vpn_apply_with_share;
     PolKitAction *user_dsl_apply_with_share;
+    PolKitAction *user_modem_apply_with_share;
 };
 
 #define APPLET_POLKIT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLET_TYPE_POLKIT_MANAGER, AppletPolKitManagerPriv))
@@ -161,6 +166,9 @@ applet_polkit_manager_create_action (AppletPolKitManager * manager, const char *
                     || !strcmp(action_id, NM_SETTING_GSM_SETTING_NAME)) {
                 action_name = "user_mobile_apply";
                 pk_action = priv->user_mobile_apply;
+			} else if (!strcmp(action_id, NM_SETTING_ANALOG_MODEM_SETTING_NAME)) {
+                action_name = "user_modem_apply";
+                pk_action = priv->user_modem_apply;
             } else {
                 g_warning ("Can not create the action(%s). Maybe there is a new policy to be add",
                                                action_id);
@@ -185,6 +193,9 @@ applet_polkit_manager_create_action (AppletPolKitManager * manager, const char *
                     || !strcmp(action_id, NM_SETTING_GSM_SETTING_NAME)) {
                 action_name = "user_mobile_apply_with_share";
                 pk_action = priv->user_mobile_apply_with_share;
+			} else if (!strcmp(action_id, NM_SETTING_ANALOG_MODEM_SETTING_NAME)) {
+                action_name = "user_modem_apply_with_share";
+                pk_action = priv->user_modem_apply_with_share;
             } else {
                 g_warning ("Can not create the action(%s). Maybe there is a new policy to be add",
                                                action_id);
@@ -254,6 +265,8 @@ applet_polkit_manager_init (AppletPolKitManager * manager)
     polkit_action_set_action_id (priv->user_vpn_apply, NM_POLICY_ACTION_USER_VPN_APPLY);
     priv->user_dsl_apply = polkit_action_new ();
     polkit_action_set_action_id (priv->user_dsl_apply, NM_POLICY_ACTION_USER_DSL_APPLY);
+    priv->user_modem_apply = polkit_action_new ();
+    polkit_action_set_action_id (priv->user_modem_apply, NM_POLICY_ACTION_USER_MODEM_APPLY);
 
     /* shared connection */
     priv->user_wired_apply_with_share = polkit_action_new ();
@@ -266,6 +279,8 @@ applet_polkit_manager_init (AppletPolKitManager * manager)
     polkit_action_set_action_id (priv->user_vpn_apply_with_share, NM_POLICY_ACTION_USER_VPN_APPLY_WITH_SHARE);
     priv->user_dsl_apply_with_share = polkit_action_new ();
     polkit_action_set_action_id (priv->user_dsl_apply_with_share, NM_POLICY_ACTION_USER_DSL_APPLY_WITH_SHARE);
+    priv->user_modem_apply_with_share = polkit_action_new ();
+    polkit_action_set_action_id (priv->user_modem_apply_with_share, NM_POLICY_ACTION_USER_MODEM_APPLY_WITH_SHARE);
 
 }
 
@@ -294,6 +309,9 @@ finalize (GObject *gobject)
     if (priv->user_dsl_apply) {
         polkit_action_unref (priv->user_dsl_apply);
     }
+    if (priv->user_modem_apply) {
+        polkit_action_unref (priv->user_modem_apply);
+    }
     /* shared connectin */
     if (priv->user_wired_apply_with_share) {
         polkit_action_unref (priv->user_wired_apply_with_share);
@@ -310,6 +328,9 @@ finalize (GObject *gobject)
     if (priv->user_dsl_apply_with_share) {
         polkit_action_unref (priv->user_dsl_apply_with_share);
     }
+    if (priv->user_modem_apply_with_share) {
+        polkit_action_unref (priv->user_modem_apply_with_share);
+    }
 
     G_OBJECT_CLASS (applet_polkit_manager_parent_class)->finalize (gobject);
 }
diff --git a/src/applet.c b/src/applet.c
index 88b59c5..5fa8737 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -43,6 +43,7 @@
 #include <NetworkManagerVPN.h>
 #include <nm-device-ethernet.h>
 #include <nm-device-wifi.h>
+#include <nm-device-analog-modem.h>
 #include <nm-gsm-device.h>
 #include <nm-cdma-device.h>
 #include <nm-utils.h>
@@ -65,6 +66,7 @@
 #include "applet-device-wifi.h"
 #include "applet-device-gsm.h"
 #include "applet-device-cdma.h"
+#include "applet-device-modem.h"
 #include "applet-dialogs.h"
 #include "vpn-password-dialog.h"
 #include "applet-dbus-manager.h"
@@ -278,6 +280,8 @@ get_device_class (NMDevice *device, NMApplet *applet)
 		return applet->gsm_class;
 	else if (NM_IS_CDMA_DEVICE (device))
 		return applet->cdma_class;
+	else if (NM_IS_DEVICE_ANALOG_MODEM (device))
+		return applet->modem_class;
 	else
 		g_message ("%s: Unknown device type '%s'", __func__, G_OBJECT_TYPE_NAME (device));
 	return NULL;
@@ -922,14 +926,23 @@ sort_devices (gconstpointer a, gconstpointer b)
 		return -1;
 	if (aa_type == NM_TYPE_DEVICE_ETHERNET && bb_type == NM_TYPE_CDMA_DEVICE)
 		return -1;
+	if (aa_type == NM_TYPE_DEVICE_ETHERNET && bb_type == NM_TYPE_DEVICE_ANALOG_MODEM)
+		return -1;
 
 	if (aa_type == NM_TYPE_GSM_DEVICE && bb_type == NM_TYPE_CDMA_DEVICE)
 		return -1;
 	if (aa_type == NM_TYPE_GSM_DEVICE && bb_type == NM_TYPE_DEVICE_WIFI)
 		return -1;
+	if (aa_type == NM_TYPE_GSM_DEVICE && bb_type == NM_TYPE_DEVICE_ANALOG_MODEM)
+		return -1;
 
 	if (aa_type == NM_TYPE_CDMA_DEVICE && bb_type == NM_TYPE_DEVICE_WIFI)
 		return -1;
+	if (aa_type == NM_TYPE_CDMA_DEVICE && bb_type == NM_TYPE_DEVICE_ANALOG_MODEM)
+		return -1;
+
+	if (aa_type == NM_TYPE_DEVICE_ANALOG_MODEM && bb_type == NM_TYPE_DEVICE_WIFI)
+		return -1;
 
 	return 1;
 }
@@ -1038,6 +1051,7 @@ nma_menu_add_devices (GtkWidget *menu, NMApplet *applet)
 	gint n_usable_wifi_devices = 0;
 	gint n_wired_devices = 0;
 	gint n_mb_devices = 0;
+	gint n_modem_devices = 0;
 	int i;
 
 	temp = nm_client_get_devices (applet->nm_client);
@@ -1062,6 +1076,8 @@ nma_menu_add_devices (GtkWidget *menu, NMApplet *applet)
 			n_wired_devices++;
 		else if (NM_IS_CDMA_DEVICE (device) || NM_IS_GSM_DEVICE (device))
 			n_mb_devices++;
+		else if (NM_IS_DEVICE_ANALOG_MODEM (device))
+			n_modem_devices++;
 	}
 
 	if (!n_wired_devices && !n_wifi_devices && !n_mb_devices) {
@@ -1086,6 +1102,8 @@ nma_menu_add_devices (GtkWidget *menu, NMApplet *applet)
 			n_devices = n_wired_devices;
 		else if (NM_IS_CDMA_DEVICE (device) || NM_IS_GSM_DEVICE (device))
 			n_devices = n_mb_devices;
+		else if (NM_IS_DEVICE_ANALOG_MODEM (device))
+			n_devices = n_modem_devices;
 
 		active = applet_find_active_connection_for_device (device, applet, NULL);
 
@@ -2293,6 +2311,7 @@ nma_icons_load (NMApplet *applet)
 	ICON_LOAD(applet->wired_icon, "nm-device-wired");
 	ICON_LOAD(applet->adhoc_icon, "nm-adhoc");
 	ICON_LOAD(applet->wwan_icon, "nm-device-wwan");
+	ICON_LOAD(applet->modem_icon, "stock_landline-phone");
 	ICON_LOAD(applet->vpn_lock_icon, "nm-vpn-active-lock");
 
 	ICON_LOAD(applet->wireless_00_icon, "nm-signal-00");
@@ -2581,6 +2600,9 @@ constructor (GType type,
 	applet->cdma_class = applet_device_cdma_get_class (applet);
 	g_assert (applet->cdma_class);
 
+	applet->modem_class = applet_device_modem_get_class (applet);
+	g_assert (applet->modem_class);
+
 	foo_client_setup (applet);
 
 	/* timeout to update connection timestamps every 5 minutes */
diff --git a/src/applet.h b/src/applet.h
index d75c781..e6a0569 100644
--- a/src/applet.h
+++ b/src/applet.h
@@ -96,6 +96,7 @@ typedef struct
 	NMADeviceClass *wifi_class;
 	NMADeviceClass *gsm_class;
 	NMADeviceClass *cdma_class;
+	NMADeviceClass *modem_class;
 
 	/* Data model elements */
 	guint			update_icon_id;
@@ -106,6 +107,7 @@ typedef struct
 	GdkPixbuf *		wired_icon;
 	GdkPixbuf *		adhoc_icon;
 	GdkPixbuf *		wwan_icon;
+	GdkPixbuf *		modem_icon;
 	GdkPixbuf *		wireless_00_icon;
 	GdkPixbuf *		wireless_25_icon;
 	GdkPixbuf *		wireless_50_icon;
diff --git a/src/connection-editor/Makefile.am b/src/connection-editor/Makefile.am
index 3d4edf9..390b220 100644
--- a/src/connection-editor/Makefile.am
+++ b/src/connection-editor/Makefile.am
@@ -46,6 +46,8 @@ nm_connection_editor_SOURCES = \
 	page-dsl.c \
 	page-mobile.h \
 	page-mobile.c \
+	page-modem.h \
+	page-modem.c \
 	mobile-wizard.h \
 	mobile-wizard.c \
 	page-ppp.h \
@@ -86,6 +88,7 @@ glade_DATA = \
 	ce-page-ip4.glade \
 	ce-page-dsl.glade \
 	ce-page-mobile.glade \
+	ce-page-modem.glade \
 	ce-mobile-wizard.glade \
 	ce-page-ppp.glade \
 	ce-vpn-wizard.glade
diff --git a/src/connection-editor/ce-page-modem.glade b/src/connection-editor/ce-page-modem.glade
new file mode 100644
index 0000000..9017fdf
--- /dev/null
+++ b/src/connection-editor/ce-page-modem.glade
@@ -0,0 +1,376 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="modem_page_widget">
+  <property name="title" translatable="yes">window1</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_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="ModemPage">
+      <property name="border_width">12</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">18</property>
+
+      <child>
+	<widget class="GtkVBox" id="modem_basic_vbox">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="modem_basic_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Basic&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</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="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="table1">
+		  <property name="visible">True</property>
+		  <property name="n_rows">6</property>
+		  <property name="n_columns">2</property>
+		  <property name="homogeneous">False</property>
+		  <property name="row_spacing">6</property>
+		  <property name="column_spacing">12</property>
+
+		  <child>
+		    <widget class="GtkEntry" id="modem_number">
+		      <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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="modem_username">
+		      <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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkEntry" id="modem_password">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">False</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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label28">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Nu_mber:</property>
+		      <property name="use_underline">True</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.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">modem_number</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="label25">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Password:</property>
+		      <property name="use_underline">True</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.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">modem_password</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="label24">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">_Username:</property>
+		      <property name="use_underline">True</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.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">modem_username</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="label29">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Dial p_refix:</property>
+		      <property name="use_underline">True</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.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="mnemonic_widget">modem_prefix</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="GtkEntry" id="modem_prefix">
+		      <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="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="modem_speaker">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">_Speaker on</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</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="GtkCheckButton" id="modem_dialtone">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Wa_it for dial tone</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">True</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</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>
+		</widget>
+	      </child>
+	    </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">False</property>
+	  <property name="fill">False</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkHBox" id="hbox1">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkCheckButton" id="modem_show_passwords">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Sho_w passwords</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="active">False</property>
+	      <property name="inconsistent">False</property>
+	      <property name="draw_indicator">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	      <property name="pack_type">GTK_PACK_END</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
diff --git a/src/connection-editor/nm-connection-editor.c b/src/connection-editor/nm-connection-editor.c
index f4513f1..e0e75cd 100644
--- a/src/connection-editor/nm-connection-editor.c
+++ b/src/connection-editor/nm-connection-editor.c
@@ -54,6 +54,7 @@
 #include <nm-setting-wireless-security.h>
 #include <nm-setting-vpn.h>
 #include <nm-setting-pppoe.h>
+#include <nm-setting-analog-modem.h>
 #include <nm-setting-ppp.h>
 #include <nm-setting-gsm.h>
 #include <nm-setting-cdma.h>
@@ -71,6 +72,7 @@
 #include "page-ip4.h"
 #include "page-dsl.h"
 #include "page-mobile.h"
+#include "page-modem.h"
 #include "page-ppp.h"
 #include "page-vpn.h"
 #include "polkit-helpers.h"
@@ -627,6 +629,15 @@ nm_connection_editor_set_connection (NMConnectionEditor *editor,
 		if (!add_page (editor, ce_page_ip4_new, connection, error))
 			goto out;
 		polkit_action_set_action_id(system_action, NM_SYSCONFIG_POLICY_ACTION_SYSTEM_MOBILE_MODIFY);
+	} else if (!strcmp (connection_type, NM_SETTING_ANALOG_MODEM_SETTING_NAME)) {
+		if (!add_page (editor, ce_page_modem_new, connection, error))
+			goto out;
+		if (!add_page (editor, ce_page_ppp_new, connection, error))
+			goto out;
+		if (!add_page (editor, ce_page_ip4_new, connection, error))
+			goto out;
+		/* Make a distinct modem policy */
+		polkit_action_set_action_id(system_action, NM_SYSCONFIG_POLICY_ACTION_SYSTEM_MODEM_MODIFY);
 	} else {
 		g_warning ("Unhandled setting type '%s'", connection_type);
 	}
diff --git a/src/connection-editor/nm-connection-editor.glade b/src/connection-editor/nm-connection-editor.glade
index 8729949..423d238 100644
--- a/src/connection-editor/nm-connection-editor.glade
+++ b/src/connection-editor/nm-connection-editor.glade
@@ -1,558 +1,934 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--*- mode: xml -*-->
+<?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="NMConnectionList">
-    <property name="border_width">4</property>
-    <property name="title" translatable="yes">Network Connections</property>
-    <property name="window_position">GTK_WIN_POS_CENTER</property>
-    <property name="default_width">400</property>
-    <property name="default_height">300</property>
-    <property name="icon_name">preferences-system-network</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <widget class="GtkVBox" id="dialog-vbox2">
-        <property name="visible">True</property>
-        <property name="spacing">4</property>
-        <child>
-          <widget class="GtkNotebook" id="list_notebook">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="border_width">6</property>
-            <child>
-              <widget class="GtkHBox" id="wired_child">
-                <property name="visible">True</property>
-                <property name="border_width">6</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scolledwindow1">
-                    <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>
-                    <child>
-                      <widget class="GtkTreeView" id="wired_list">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                        <property name="rules_hint">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-                <child>
-                  <widget class="GtkVButtonBox" id="wired_button_box">
-                    <property name="visible">True</property>
-                    <property name="spacing">6</property>
-                    <property name="layout_style">GTK_BUTTONBOX_START</property>
-                    <child>
-                      <widget class="GtkButton" id="wired_add">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="can_default">True</property>
-                        <property name="label">gtk-add</property>
-                        <property name="use_stock">True</property>
-                        <property name="response_id">0</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="wired_label">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Wired</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkHBox" id="wireless_child">
-                <property name="visible">True</property>
-                <property name="border_width">6</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scrolledwindow2">
-                    <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>
-                    <child>
-                      <widget class="GtkTreeView" id="wireless_list">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                        <property name="rules_hint">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-                <child>
-                  <widget class="GtkVButtonBox" id="wireless_button_box">
-                    <property name="visible">True</property>
-                    <property name="spacing">6</property>
-                    <property name="layout_style">GTK_BUTTONBOX_START</property>
-                    <child>
-                      <widget class="GtkButton" id="wireless_add">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="can_default">True</property>
-                        <property name="label">gtk-add</property>
-                        <property name="use_stock">True</property>
-                        <property name="response_id">0</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="wireless_label">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Wireless</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="position">1</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkHBox" id="wwan_child">
-                <property name="visible">True</property>
-                <property name="border_width">6</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scrolledwindow3">
-                    <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>
-                    <child>
-                      <widget class="GtkTreeView" id="wwan_list">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                        <property name="rules_hint">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-                <child>
-                  <widget class="GtkVButtonBox" id="wwan_button_box">
-                    <property name="visible">True</property>
-                    <property name="spacing">6</property>
-                    <property name="layout_style">GTK_BUTTONBOX_START</property>
-                    <child>
-                      <widget class="GtkButton" id="wwan_add">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="can_default">True</property>
-                        <property name="label">gtk-add</property>
-                        <property name="use_stock">True</property>
-                        <property name="response_id">0</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="wwan_label">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Mobile Broadband</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="position">2</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkHBox" id="vpn_child">
-                <property name="visible">True</property>
-                <property name="border_width">6</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scrolledwindow4">
-                    <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>
-                    <child>
-                      <widget class="GtkTreeView" id="vpn_list">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                        <property name="rules_hint">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-                <child>
-                  <widget class="GtkVBox" id="vbox1">
-                    <property name="visible">True</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <widget class="GtkVButtonBox" id="vpn_button_box">
-                        <property name="visible">True</property>
-                        <property name="spacing">6</property>
-                        <property name="layout_style">GTK_BUTTONBOX_START</property>
-                        <child>
-                          <widget class="GtkButton" id="vpn_add">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="can_default">True</property>
-                            <property name="label">gtk-add</property>
-                            <property name="use_stock">True</property>
-                            <property name="response_id">0</property>
-                          </widget>
-                        </child>
-                        <child>
-                          <placeholder/>
-                        </child>
-                        <child>
-                          <placeholder/>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="expand">False</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="GtkHSeparator" id="hseparator1">
-                        <property name="visible">True</property>
-                      </widget>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <widget class="GtkVButtonBox" id="vpn_ix_button_box">
-                        <property name="visible">True</property>
-                        <property name="spacing">6</property>
-                        <property name="layout_style">GTK_BUTTONBOX_START</property>
-                        <child>
-                          <widget class="GtkButton" id="vpn_import">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="label" translatable="yes">_Import</property>
-                            <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
-                          </widget>
-                        </child>
-                        <child>
-                          <widget class="GtkButton" id="vpn_export">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="label" translatable="yes">E_xport</property>
-                            <property name="use_underline">True</property>
-                            <property name="response_id">0</property>
-                          </widget>
-                          <packing>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="padding">6</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="position">3</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="vpn_label">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">VPN</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="position">3</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkHBox" id="dsl_child">
-                <property name="visible">True</property>
-                <property name="border_width">6</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkScrolledWindow" id="scrolledwindow5">
-                    <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>
-                    <child>
-                      <widget class="GtkTreeView" id="dsl_list">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="headers_visible">False</property>
-                        <property name="rules_hint">True</property>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-                <child>
-                  <widget class="GtkVButtonBox" id="dsl_button_box">
-                    <property name="visible">True</property>
-                    <property name="spacing">6</property>
-                    <property name="layout_style">GTK_BUTTONBOX_START</property>
-                    <child>
-                      <widget class="GtkButton" id="dsl_add">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="can_default">True</property>
-                        <property name="label">gtk-add</property>
-                        <property name="use_stock">True</property>
-                        <property name="response_id">0</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                    <child>
-                      <placeholder/>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="position">4</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="dsl_label">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">DSL</property>
-              </widget>
-              <packing>
-                <property name="type">tab</property>
-                <property name="position">4</property>
-                <property name="tab_fill">False</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <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="closebutton1">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="label">gtk-close</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-7</property>
-              </widget>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
-      </widget>
-    </child>
-  </widget>
-  <widget class="GtkWindow" id="nm-connection-editor">
-    <property name="window_position">GTK_WIN_POS_CENTER</property>
-    <property name="destroy_with_parent">True</property>
-    <property name="icon_name">preferences-system-network</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <child>
-      <widget class="GtkVBox" id="ce-vbox">
-        <property name="visible">True</property>
-        <property name="spacing">6</property>
-        <child>
-          <widget class="GtkVBox" id="vbox3">
-            <property name="visible">True</property>
-            <property name="border_width">5</property>
-            <property name="spacing">6</property>
-            <child>
-              <widget class="GtkHBox" id="hbox3">
-                <property name="visible">True</property>
-                <property name="spacing">12</property>
-                <child>
-                  <widget class="GtkLabel" id="connection_name_label">
-                    <property name="visible">True</property>
-                    <property name="label" translatable="yes">Connection _name:</property>
-                    <property name="use_underline">True</property>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkEntry" id="connection_name">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                  </widget>
-                  <packing>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkCheckButton" id="connection_autoconnect">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="label" translatable="yes">Connect _automatically</property>
-                <property name="use_underline">True</property>
-                <property name="response_id">0</property>
-                <property name="active">True</property>
-                <property name="draw_indicator">True</property>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkNotebook" id="notebook">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </widget>
-        </child>
-        <child>
-          <widget class="GtkHBox" id="hbox1">
-            <property name="visible">True</property>
-            <property name="spacing">6</property>
-            <child>
-              <widget class="GtkHButtonBox" id="system_hbox">
-                <property name="visible">True</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkCheckButton" id="system_checkbutton">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="label" translatable="yes">Available to all users</property>
-                    <property name="response_id">0</property>
-                    <property name="draw_indicator">True</property>
-                  </widget>
-                </child>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="padding">6</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkHButtonBox" id="action_area_hbox">
-                <property name="visible">True</property>
-                <property name="spacing">6</property>
-                <property name="layout_style">GTK_BUTTONBOX_END</property>
-                <child>
-                  <widget class="GtkButton" id="cancel_button">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <property name="label">gtk-cancel</property>
-                    <property name="use_stock">True</property>
-                    <property name="response_id">0</property>
-                  </widget>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-              </widget>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="padding">6</property>
-                <property name="pack_type">GTK_PACK_END</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="padding">6</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-      </widget>
-    </child>
-  </widget>
+
+<widget class="GtkDialog" id="NMConnectionList">
+  <property name="border_width">4</property>
+  <property name="title" translatable="yes">Network Connections</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_CENTER</property>
+  <property name="modal">False</property>
+  <property name="default_width">400</property>
+  <property name="default_height">300</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon_name">preferences-system-network</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">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox2">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">4</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="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="GtkNotebook" id="list_notebook">
+	  <property name="border_width">6</property>
+	  <property name="visible">True</property>
+	  <property name="can_focus">True</property>
+	  <property name="show_tabs">True</property>
+	  <property name="show_border">True</property>
+	  <property name="tab_pos">GTK_POS_TOP</property>
+	  <property name="scrollable">False</property>
+	  <property name="enable_popup">False</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="wired_child">
+	      <property name="border_width">6</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scolledwindow1">
+		  <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="wired_list">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="headers_visible">False</property>
+		      <property name="rules_hint">True</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="wired_button_box">
+		  <property name="visible">True</property>
+		  <property name="layout_style">GTK_BUTTONBOX_START</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkButton" id="wired_add">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-add</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="wired_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Wired</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="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="wireless_child">
+	      <property name="border_width">6</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolledwindow2">
+		  <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="wireless_list">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="headers_visible">False</property>
+		      <property name="rules_hint">True</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="wireless_button_box">
+		  <property name="visible">True</property>
+		  <property name="layout_style">GTK_BUTTONBOX_START</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkButton" id="wireless_add">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-add</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="wireless_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Wireless</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="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="wwan_child">
+	      <property name="border_width">6</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolledwindow3">
+		  <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="wwan_list">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="headers_visible">False</property>
+		      <property name="rules_hint">True</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="wwan_button_box">
+		  <property name="visible">True</property>
+		  <property name="layout_style">GTK_BUTTONBOX_START</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkButton" id="wwan_add">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-add</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="wwan_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Mobile Broadband</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="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="vpn_child">
+	      <property name="border_width">6</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolledwindow4">
+		  <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="vpn_list">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="headers_visible">False</property>
+		      <property name="rules_hint">True</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="GtkVBox" id="vbox1">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkVButtonBox" id="vpn_button_box">
+		      <property name="visible">True</property>
+		      <property name="layout_style">GTK_BUTTONBOX_START</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkButton" id="vpn_add">
+			  <property name="visible">True</property>
+			  <property name="can_default">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label">gtk-add</property>
+			  <property name="use_stock">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			</widget>
+		      </child>
+
+		      <child>
+			<placeholder/>
+		      </child>
+
+		      <child>
+			<placeholder/>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHSeparator" id="hseparator1">
+		      <property name="visible">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkVButtonBox" id="vpn_ix_button_box">
+		      <property name="visible">True</property>
+		      <property name="layout_style">GTK_BUTTONBOX_START</property>
+		      <property name="spacing">6</property>
+
+		      <child>
+			<widget class="GtkButton" id="vpn_import">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Import</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="vpn_export">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">E_xport</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">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">6</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="vpn_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">VPN</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="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="dsl_child">
+	      <property name="border_width">6</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolledwindow5">
+		  <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="dsl_list">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="headers_visible">False</property>
+		      <property name="rules_hint">True</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="dsl_button_box">
+		  <property name="visible">True</property>
+		  <property name="layout_style">GTK_BUTTONBOX_START</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkButton" id="dsl_add">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-add</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="dsl_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">DSL</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="type">tab</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="modem_child">
+	      <property name="border_width">6</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolledwindow6">
+		  <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="modem_list">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="headers_visible">False</property>
+		      <property name="rules_hint">True</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="modem_button_box">
+		  <property name="visible">True</property>
+		  <property name="layout_style">GTK_BUTTONBOX_START</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkButton" id="modem_add">
+		      <property name="visible">True</property>
+		      <property name="can_default">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label">gtk-add</property>
+		      <property name="use_stock">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="modem_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Modem</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="type">tab</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="nm-connection-editor">
+  <property name="title" translatable="yes"></property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_CENTER</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">True</property>
+  <property name="icon_name">preferences-system-network</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>
+
+  <child>
+    <widget class="GtkVBox" id="ce-vbox">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">6</property>
+
+      <child>
+	<widget class="GtkVBox" id="vbox3">
+	  <property name="border_width">5</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox3">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="connection_name_label">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Connection _name:</property>
+		  <property name="use_underline">True</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="mnemonic_widget">connection_name</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="connection_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">False</property>
+		</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">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkCheckButton" id="connection_autoconnect">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Connect _automatically</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="active">True</property>
+	      <property name="inconsistent">False</property>
+	      <property name="draw_indicator">True</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkNotebook" id="notebook">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="show_tabs">True</property>
+	      <property name="show_border">True</property>
+	      <property name="tab_pos">GTK_POS_TOP</property>
+	      <property name="scrollable">False</property>
+	      <property name="enable_popup">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>
+
+      <child>
+	<widget class="GtkHBox" id="hbox1">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">6</property>
+
+	  <child>
+	    <widget class="GtkHButtonBox" id="system_hbox">
+	      <property name="visible">True</property>
+	      <property name="layout_style">GTK_BUTTONBOX_DEFAULT_STYLE</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkCheckButton" id="system_checkbutton">
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="label" translatable="yes">Available to all users</property>
+		  <property name="use_underline">True</property>
+		  <property name="relief">GTK_RELIEF_NORMAL</property>
+		  <property name="focus_on_click">True</property>
+		  <property name="active">False</property>
+		  <property name="inconsistent">False</property>
+		  <property name="draw_indicator">True</property>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">6</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHButtonBox" id="action_area_hbox">
+	      <property name="visible">True</property>
+	      <property name="layout_style">GTK_BUTTONBOX_END</property>
+	      <property name="spacing">6</property>
+
+	      <child>
+		<widget class="GtkButton" id="cancel_button">
+		  <property name="visible">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>
+		</widget>
+	      </child>
+
+	      <child>
+		<placeholder/>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">6</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	      <property name="pack_type">GTK_PACK_END</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">6</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>
diff --git a/src/connection-editor/nm-connection-editor.h b/src/connection-editor/nm-connection-editor.h
index f3daf72..4bf3178 100644
--- a/src/connection-editor/nm-connection-editor.h
+++ b/src/connection-editor/nm-connection-editor.h
@@ -39,6 +39,7 @@
 #define NM_SYSCONFIG_POLICY_ACTION_SYSTEM_MOBILE_MODIFY "org.freedesktop.network-manager-settings.system.mobile.modify"
 #define NM_SYSCONFIG_POLICY_ACTION_SYSTEM_VPN_MODIFY "org.freedesktop.network-manager-settings.system.vpn.modify"
 #define NM_SYSCONFIG_POLICY_ACTION_SYSTEM_DSL_MODIFY "org.freedesktop.network-manager-settings.system.dsl.modify"
+#define NM_SYSCONFIG_POLICY_ACTION_SYSTEM_MODEM_MODIFY "org.freedesktop.network-manager-settings.system.modem.modify"
 
 #define NM_TYPE_CONNECTION_EDITOR    (nm_connection_editor_get_type ())
 #define NM_IS_CONNECTION_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_CONNECTION_EDITOR))
diff --git a/src/connection-editor/nm-connection-list.c b/src/connection-editor/nm-connection-list.c
index c254e52..2bbbcd1 100644
--- a/src/connection-editor/nm-connection-list.c
+++ b/src/connection-editor/nm-connection-list.c
@@ -46,6 +46,7 @@
 #include <nm-setting-gsm.h>
 #include <nm-setting-cdma.h>
 #include <nm-setting-pppoe.h>
+#include <nm-setting-analog-modem.h>
 #include <nm-setting-ppp.h>
 #include <nm-setting-serial.h>
 #include <nm-vpn-plugin-ui-interface.h>
@@ -916,6 +917,23 @@ create_new_connection_for_type (NMConnectionList *list, const char *connection_t
 		} else {
 			/* user canceled; do nothing */
 		}
+	} else if (ctype == NM_TYPE_SETTING_ANALOG_MODEM) {
+		NMSettingAnalogModem *s_analog_modem;
+
+		id = get_next_available_name (list, _("Modem connection %d"));
+		g_object_set (s_con,
+					  NM_SETTING_CONNECTION_ID, id,
+					  NM_SETTING_CONNECTION_TYPE, NM_SETTING_ANALOG_MODEM_SETTING_NAME,
+					  NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+					  NULL);
+		g_free (id);
+
+		add_default_serial_setting (connection);
+
+		type_setting = nm_setting_analog_modem_new ();
+		s_analog_modem = NM_SETTING_ANALOG_MODEM (type_setting);
+
+		nm_connection_add_setting (connection, nm_setting_ppp_new ());
 	} else if (ctype == NM_TYPE_SETTING_VPN) {
 		char *service = NULL;
 
@@ -1454,6 +1472,8 @@ dispose (GObject *object)
 		g_object_unref (list->wireless_icon);
 	if (list->wwan_icon)
 		g_object_unref (list->wwan_icon);
+	if (list->modem_icon)
+		g_object_unref (list->modem_icon);
 	if (list->vpn_icon)
 		g_object_unref (list->vpn_icon);
 	if (list->unknown_icon)
@@ -1829,6 +1849,9 @@ add_connection_tabs (NMConnectionList *self, const char *def_type)
 
 	types = g_slist_append (NULL, NM_SETTING_PPPOE_SETTING_NAME);
 	add_connection_tab (self, def_type, types, self->wired_icon, "dsl", _("DSL"), FALSE);
+
+	types = g_slist_append (NULL, NM_SETTING_ANALOG_MODEM_SETTING_NAME);
+	add_connection_tab (self, def_type, types, self->modem_icon, "modem", _("Modem"), FALSE);
 }
 
 static void
@@ -1924,6 +1947,7 @@ nm_connection_list_new (const char *def_type)
 	ICON_LOAD(list->wired_icon, "nm-device-wired");
 	ICON_LOAD(list->wireless_icon, "nm-device-wireless");
 	ICON_LOAD(list->wwan_icon, "nm-device-wwan");
+	ICON_LOAD(list->modem_icon, "stock_landline-phone");
 	ICON_LOAD(list->vpn_icon, "nm-vpn-standalone-lock");
 	ICON_LOAD(list->unknown_icon, "nm-no-connection");
 
diff --git a/src/connection-editor/nm-connection-list.h b/src/connection-editor/nm-connection-list.h
index 800873a..ae32ba7 100644
--- a/src/connection-editor/nm-connection-list.h
+++ b/src/connection-editor/nm-connection-list.h
@@ -59,6 +59,7 @@ typedef struct {
 	GdkPixbuf *wired_icon;
 	GdkPixbuf *wireless_icon;
 	GdkPixbuf *wwan_icon;
+	GdkPixbuf *modem_icon;
 	GdkPixbuf *vpn_icon;
 	GdkPixbuf *unknown_icon;
 	GtkIconTheme *icon_theme;
diff --git a/src/connection-editor/page-ip4.c b/src/connection-editor/page-ip4.c
index bc23a4a..759540b 100644
--- a/src/connection-editor/page-ip4.c
+++ b/src/connection-editor/page-ip4.c
@@ -37,6 +37,7 @@
 #include <nm-setting-cdma.h>
 #include <nm-setting-pppoe.h>
 #include <nm-setting-vpn.h>
+#include <nm-setting-analog-modem.h>
 #include <nm-utils.h>
 
 #include "page-ip4.h"
@@ -116,7 +117,8 @@ ip4_private_init (CEPageIP4 *self, NMConnection *connection)
 		str_auto = _("Automatic (VPN)");
 		str_auto_only = _("Automatic (VPN) addresses only");
 	} else if (   priv->connection_type == NM_TYPE_SETTING_GSM
-	           || priv->connection_type == NM_TYPE_SETTING_CDMA) {
+	           || priv->connection_type == NM_TYPE_SETTING_CDMA
+	           || priv->connection_type == NM_TYPE_SETTING_ANALOG_MODEM) {
 		str_auto = _("Automatic (PPP)");
 		str_auto_only = _("Automatic (PPP) addresses only");
 	} else if (priv->connection_type == NM_TYPE_SETTING_PPPOE) {
@@ -143,9 +145,10 @@ ip4_private_init (CEPageIP4 *self, NMConnection *connection)
 	                    METHOD_COL_NUM, IP4_METHOD_AUTO_ADDRESSES,
 	                    -1);
 
-	/* Manual is pointless for Mobile Broadband */
+	/* Manual is pointless for Mobile Broadband and dial-up */
 	if (   priv->connection_type != NM_TYPE_SETTING_GSM
 	    && priv->connection_type != NM_TYPE_SETTING_CDMA
+	    && priv->connection_type != NM_TYPE_SETTING_ANALOG_MODEM
 	    && priv->connection_type != NM_TYPE_SETTING_VPN) {
 		gtk_list_store_append (priv->method_store, &iter);
 		gtk_list_store_set (priv->method_store, &iter,
@@ -192,6 +195,7 @@ ip4_private_init (CEPageIP4 *self, NMConnection *connection)
 	if (   priv->connection_type == NM_TYPE_SETTING_VPN
 	    || priv->connection_type == NM_TYPE_SETTING_GSM
 	    || priv->connection_type == NM_TYPE_SETTING_CDMA
+	    || priv->connection_type == NM_TYPE_SETTING_ANALOG_MODEM
 	    || priv->connection_type == NM_TYPE_SETTING_PPPOE) {
 		gtk_widget_hide (GTK_WIDGET (priv->dhcp_client_id_label));
 		gtk_widget_hide (GTK_WIDGET (priv->dhcp_client_id));
@@ -238,6 +242,7 @@ method_changed (GtkComboBox *combo, gpointer user_data)
 	if (   priv->connection_type == NM_TYPE_SETTING_VPN
 	    || priv->connection_type == NM_TYPE_SETTING_GSM
 	    || priv->connection_type == NM_TYPE_SETTING_CDMA
+	    || priv->connection_type == NM_TYPE_SETTING_ANALOG_MODEM
 	    || priv->connection_type == NM_TYPE_SETTING_PPPOE)
 		dhcp_enabled = FALSE;
 
diff --git a/src/connection-editor/page-modem.c b/src/connection-editor/page-modem.c
new file mode 100644
index 0000000..5ec524d
--- /dev/null
+++ b/src/connection-editor/page-modem.c
@@ -0,0 +1,286 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager Connection editor -- Connection editor for NetworkManager
+ *
+ * Dan Williams <dcbw@redhat.com>
+ * Hans Petter Jansson <hpj@novell.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2008 - 2010 Red Hat, Inc.
+ * (C) Copyright 2010 Novell, Inc.
+ */
+
+#include <string.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include <nm-setting-connection.h>
+#include <nm-setting-analog-modem.h>
+#include <nm-setting-serial.h>
+#include <nm-setting-ppp.h>
+
+#include "page-modem.h"
+#include "nm-connection-editor.h"
+#include "gconf-helpers.h"
+
+G_DEFINE_TYPE (CEPageModem, ce_page_modem, CE_TYPE_PAGE)
+
+#define CE_PAGE_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_MODEM, CEPageModemPrivate))
+
+typedef struct {
+	NMSettingAnalogModem *setting;
+
+	GtkEntry *prefix;
+	GtkEntry *number;
+	GtkEntry *username;
+	GtkEntry *password;
+
+	GtkCheckButton *speaker;
+	GtkCheckButton *dialtone;
+
+	GtkWindowGroup *window_group;
+	gboolean window_added;
+
+	gboolean disposed;
+} CEPageModemPrivate;
+
+static void
+modem_private_init (CEPageModem *self)
+{
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+	GladeXML *xml;
+
+	xml = CE_PAGE (self)->xml;
+
+	priv->prefix = GTK_ENTRY (glade_xml_get_widget (xml, "modem_prefix"));
+	priv->number = GTK_ENTRY (glade_xml_get_widget (xml, "modem_number"));
+	priv->username = GTK_ENTRY (glade_xml_get_widget (xml, "modem_username"));
+	priv->password = GTK_ENTRY (glade_xml_get_widget (xml, "modem_password"));
+	priv->speaker = GTK_CHECK_BUTTON (glade_xml_get_widget (xml, "modem_speaker"));
+	priv->dialtone = GTK_CHECK_BUTTON (glade_xml_get_widget (xml, "modem_dialtone"));
+
+	priv->window_group = gtk_window_group_new ();
+}
+
+static void
+populate_modem_ui (CEPageModem *self, NMConnection *connection)
+{
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+	NMSettingAnalogModem *setting = NM_SETTING_ANALOG_MODEM (priv->setting);
+	GHashTable *secrets = NULL;
+	const char *s;
+	gboolean b;
+
+	s = nm_setting_analog_modem_get_prefix (setting);
+	if (s)
+		gtk_entry_set_text (priv->prefix, s);
+
+	s = nm_setting_analog_modem_get_number (setting);
+	if (s)
+		gtk_entry_set_text (priv->number, s);
+
+	s = nm_setting_analog_modem_get_username (setting);
+	if (s)
+		gtk_entry_set_text (priv->username, s);
+
+	s = nm_setting_analog_modem_get_password (setting);
+	if (!s) {
+		GError *error = NULL;
+		GValue *value;
+
+		secrets = nm_gconf_get_keyring_items (connection,
+		                                      nm_setting_get_name (NM_SETTING (setting)),
+		                                      FALSE,
+		                                      &error);
+		if (secrets) {
+			value = g_hash_table_lookup (secrets, NM_SETTING_ANALOG_MODEM_PASSWORD);
+			if (value)
+				s = g_value_get_string (value);
+		} else if (error)
+			g_error_free (error);
+	}
+	if (s)
+		gtk_entry_set_text (priv->password, s);
+	if (secrets)
+		g_hash_table_destroy (secrets);
+
+	b = nm_setting_analog_modem_get_enable_speaker (setting);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->speaker), b);
+
+	b = nm_setting_analog_modem_get_detect_dialtone (setting);
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->dialtone), b);
+}
+
+static void
+stuff_changed (GtkWidget *w, gpointer user_data)
+{
+	ce_page_changed (CE_PAGE (user_data));
+}
+
+static void
+show_passwords (GtkToggleButton *button, gpointer user_data)
+{
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (user_data);
+	gboolean active;
+
+	active = gtk_toggle_button_get_active (button);
+
+	gtk_entry_set_visibility (priv->password, active);
+}
+
+static void
+finish_setup (CEPageModem *self, gpointer unused, GError *error, gpointer user_data)
+{
+	CEPage *parent = CE_PAGE (self);
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+
+	if (error)
+		return;
+
+	if (NM_IS_SETTING_ANALOG_MODEM (priv->setting))
+		populate_modem_ui (self, parent->connection);
+	else
+		g_assert_not_reached ();
+
+	g_signal_connect (priv->prefix, "changed", G_CALLBACK (stuff_changed), self);
+	g_signal_connect (priv->number, "changed", G_CALLBACK (stuff_changed), self);
+	g_signal_connect (priv->username, "changed", G_CALLBACK (stuff_changed), self);
+	g_signal_connect (priv->password, "changed", G_CALLBACK (stuff_changed), self);
+	g_signal_connect (priv->speaker, "toggled", G_CALLBACK (stuff_changed), self);
+	g_signal_connect (priv->dialtone, "toggled", G_CALLBACK (stuff_changed), self);
+
+	g_signal_connect (glade_xml_get_widget (parent->xml, "modem_show_passwords"),
+	                  "toggled",
+	                  G_CALLBACK (show_passwords),
+	                  self);
+}
+
+CEPage *
+ce_page_modem_new (NMConnection *connection,
+                    GtkWindow *parent_window,
+                    GError **error)
+{
+	CEPageModem *self;
+	CEPageModemPrivate *priv;
+	CEPage *parent;
+
+	self = CE_PAGE_MODEM (g_object_new (CE_TYPE_PAGE_MODEM,
+										CE_PAGE_CONNECTION, connection,
+										CE_PAGE_PARENT_WINDOW, parent_window,
+										NULL));
+	parent = CE_PAGE (self);
+
+	parent->xml = glade_xml_new (GLADEDIR "/ce-page-modem.glade", "ModemPage", NULL);
+	if (!parent->xml) {
+		g_set_error (error, 0, 0, "%s", _("Could not load modem user interface."));
+		g_object_unref (self);
+		return NULL;
+	}
+
+	parent->page = glade_xml_get_widget (parent->xml, "ModemPage");
+	if (!parent->page) {
+		g_set_error (error, 0, 0, "%s", _("Could not load modem user interface."));
+		g_object_unref (self);
+		return NULL;
+	}
+	g_object_ref_sink (parent->page);
+
+	parent->title = g_strdup (_("Modem"));
+
+	modem_private_init (self);
+	priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+
+	priv->setting = (NMSettingAnalogModem *) nm_connection_get_setting (connection, NM_TYPE_SETTING_ANALOG_MODEM);
+	if (!priv->setting) {
+		priv->setting = NM_SETTING_ANALOG_MODEM (nm_setting_analog_modem_new ());
+		nm_connection_add_setting (connection, NM_SETTING (priv->setting));
+	}
+
+	g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL);
+	if (!ce_page_initialize (parent, NM_SETTING_ANALOG_MODEM_SETTING_NAME, error)) {
+		g_object_unref (self);
+		return NULL;
+	}
+
+	return CE_PAGE (self);
+}
+
+static const char *
+nm_entry_get_text (GtkEntry *entry)
+{
+	const char *txt;
+
+	txt = gtk_entry_get_text (entry);
+	if (txt && strlen (txt) > 0)
+		return txt;
+
+	return NULL;
+}
+
+static void
+ui_to_setting (CEPageModem *self)
+{
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+
+	g_object_set (priv->setting,
+				  NM_SETTING_ANALOG_MODEM_PREFIX,          nm_entry_get_text (priv->prefix),
+				  NM_SETTING_ANALOG_MODEM_NUMBER,          nm_entry_get_text (priv->number),
+				  NM_SETTING_ANALOG_MODEM_USERNAME,        nm_entry_get_text (priv->username),
+				  NM_SETTING_ANALOG_MODEM_PASSWORD,        nm_entry_get_text (priv->password),
+				  NM_SETTING_ANALOG_MODEM_ENABLE_SPEAKER,  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->speaker)),
+				  NM_SETTING_ANALOG_MODEM_DETECT_DIALTONE, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->dialtone)),
+				  NULL);
+}
+
+static gboolean
+validate (CEPage *page, NMConnection *connection, GError **error)
+{
+	CEPageModem *self = CE_PAGE_MODEM (page);
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+
+	ui_to_setting (self);
+	return nm_setting_verify (NM_SETTING (priv->setting), NULL, error);
+}
+
+static void
+dispose (GObject *object)
+{
+	CEPageModem *self = CE_PAGE_MODEM (object);
+	CEPageModemPrivate *priv = CE_PAGE_MODEM_GET_PRIVATE (self);
+
+	if (priv->window_group)
+		g_object_unref (priv->window_group);
+
+	G_OBJECT_CLASS (ce_page_modem_parent_class)->dispose (object);
+}
+
+static void
+ce_page_modem_init (CEPageModem *self)
+{
+}
+
+static void
+ce_page_modem_class_init (CEPageModemClass *modem_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (modem_class);
+	CEPageClass *parent_class = CE_PAGE_CLASS (modem_class);
+
+	g_type_class_add_private (object_class, sizeof (CEPageModemPrivate));
+
+	/* virtual methods */
+	parent_class->validate = validate;
+	object_class->dispose = dispose;
+}
diff --git a/src/connection-editor/page-modem.h b/src/connection-editor/page-modem.h
new file mode 100644
index 0000000..e7da5be
--- /dev/null
+++ b/src/connection-editor/page-modem.h
@@ -0,0 +1,54 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* NetworkManager Connection editor -- Connection editor for NetworkManager
+ *
+ * Dan Williams <dcbw@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2008 Red Hat, Inc.
+ */
+
+#ifndef __PAGE_MODEM_H__
+#define __PAGE_MODEM_H__
+
+#include <nm-connection.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "ce-page.h"
+
+#define CE_TYPE_PAGE_MODEM            (ce_page_modem_get_type ())
+#define CE_PAGE_MODEM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), CE_TYPE_PAGE_MODEM, CEPageModem))
+#define CE_PAGE_MODEM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CE_TYPE_PAGE_MODEM, CEPageModemClass))
+#define CE_IS_PAGE_MODEM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CE_TYPE_PAGE_MODEM))
+#define CE_IS_PAGE_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), CE_TYPE_PAGE_MODEM))
+#define CE_PAGE_MODEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CE_TYPE_PAGE_MODEM, CEPageModemClass))
+
+typedef struct {
+	CEPage parent;
+} CEPageModem;
+
+typedef struct {
+	CEPageClass parent;
+} CEPageModemClass;
+
+GType ce_page_modem_get_type (void);
+
+CEPage *ce_page_modem_new (NMConnection *connection,
+						   GtkWindow *parent,
+						   GError **error);
+
+#endif  /* __PAGE_MODEM_H__ */
diff --git a/src/utils/utils.c b/src/utils/utils.c
index e74af09..f9df4f6 100644
--- a/src/utils/utils.c
+++ b/src/utils/utils.c
@@ -27,6 +27,7 @@
 
 #include <nm-device-ethernet.h>
 #include <nm-device-wifi.h>
+#include <nm-device-analog-modem.h>
 #include <nm-gsm-device.h>
 #include <nm-cdma-device.h>
 #include <nm-access-point.h>
@@ -39,6 +40,7 @@
 #include <nm-setting-gsm.h>
 #include <nm-setting-cdma.h>
 #include <nm-setting-pppoe.h>
+#include <nm-setting-analog-modem.h>
 #include <nm-utils.h>
 
 #include "utils.h"
@@ -789,6 +791,23 @@ connection_valid_for_cdma (NMConnection *connection,
 	return TRUE;
 }
 
+static gboolean
+connection_valid_for_modem (NMConnection *connection,
+							NMSettingConnection *s_con,
+							NMDevice *device,
+							gpointer specific_object)
+{
+	NMSettingAnalogModem *s_modem;
+
+	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_ANALOG_MODEM_SETTING_NAME))
+		return FALSE;
+
+	s_modem = NM_SETTING_ANALOG_MODEM (nm_connection_get_setting (connection, NM_TYPE_SETTING_ANALOG_MODEM));
+	g_return_val_if_fail (s_modem != NULL, FALSE);
+
+	return TRUE;
+}
+
 gboolean
 utils_connection_valid_for_device (NMConnection *connection,
                                    NMDevice *device,
@@ -811,6 +830,8 @@ utils_connection_valid_for_device (NMConnection *connection,
 		return connection_valid_for_gsm (connection, s_con, device, specific_object);
 	else if (NM_IS_CDMA_DEVICE (device))
 		return connection_valid_for_cdma (connection, s_con, device, specific_object);
+	else if (NM_IS_DEVICE_ANALOG_MODEM (device))
+		return connection_valid_for_modem (connection, s_con, device, specific_object);
 	else
 		g_warning ("Unknown device type '%s'", g_type_name (G_OBJECT_TYPE(device)));
 
