Index: sources/rb-ipod-source.h
===================================================================
--- sources/rb-ipod-source.h	(revision 4723)
+++ sources/rb-ipod-source.h	(working copy)
@@ -24,6 +24,7 @@
 
 #include "rb-shell.h"
 #include "rb-removable-media-source.h"
+#include "rb-plugin.h"
 #include "rhythmdb.h"
 
 G_BEGIN_DECLS
@@ -45,11 +46,14 @@ typedef struct
 	RBRemovableMediaSourceClass parent;
 } RBiPodSourceClass;
 
-RBRemovableMediaSource *	rb_ipod_source_new		(RBShell *shell, GnomeVFSVolume *volume);
+RBRemovableMediaSource * rb_ipod_source_new		(RBShell *shell,
+							 RBPlugin *plugin,
+							 GnomeVFSVolume *volume);
 GType			rb_ipod_source_get_type		(void);
 GType                   rb_ipod_source_register_type    (GTypeModule *module);
 
-gboolean		rb_ipod_is_volume_ipod		(GnomeVFSVolume *volume);
+gboolean		rb_ipod_is_volume_ipod		(GnomeVFSVolume *volume,
+							 RBPlugin *plugin);
 
 G_END_DECLS
 
Index: sources/rb-ipod-source.c
===================================================================
--- sources/rb-ipod-source.c	(revision 4723)
+++ sources/rb-ipod-source.c	(working copy)
@@ -43,6 +43,8 @@
 #include "rb-static-playlist-source.h"
 #include "rb-util.h"
 #include "rhythmdb.h"
+#include "rb-dialog.h"
+#include "rb-glade-helpers.h"
 #include "rb-cut-and-paste-code.h"
 
 #ifdef IPOD_SUPPORT
@@ -107,14 +109,14 @@ rb_ipod_source_class_init (RBiPodSourceC
 
 	source_class->impl_show_popup = impl_show_popup;
 	source_class->impl_delete_thyself = impl_delete_thyself;
-   	source_class->impl_can_move_to_trash = (RBSourceFeatureFunc) rb_true_function;
-   	source_class->impl_move_to_trash = impl_move_to_trash;
+	 	source_class->impl_can_move_to_trash = (RBSourceFeatureFunc) rb_true_function;
+	 	source_class->impl_move_to_trash = impl_move_to_trash;
 	source_class->impl_can_rename = (RBSourceFeatureFunc) rb_true_function;
 	source_class->impl_get_ui_actions = impl_get_ui_actions;
 #ifdef ENABLE_IPOD_WRITING
-  	source_class->impl_can_paste = (RBSourceFeatureFunc) rb_true_function;
-  	source_class->impl_paste = impl_paste;
-  	source_class->impl_receive_drag = impl_receive_drag;
+		source_class->impl_can_paste = (RBSourceFeatureFunc) rb_true_function;
+		source_class->impl_paste = impl_paste;
+		source_class->impl_receive_drag = impl_receive_drag;
 #endif
 
 	g_type_class_add_private (klass, sizeof (RBiPodSourcePrivate));
@@ -186,7 +188,7 @@ rb_ipod_source_dispose (GObject *object)
  	if (priv->ipod_db != NULL) {
  		itdb_free (priv->ipod_db);
  		priv->ipod_db = NULL;
-  	}
+		}
 
 	if (priv->ipod_mount_path) {
 		g_free (priv->ipod_mount_path);
@@ -208,13 +210,14 @@ rb_ipod_source_dispose (GObject *object)
 
 RBRemovableMediaSource *
 rb_ipod_source_new (RBShell *shell,
-                    GnomeVFSVolume *volume)
+		    RBPlugin *plugin,
+	            GnomeVFSVolume *volume)
 {
 	RBiPodSource *source;
 	RhythmDBEntryType entry_type;
 	RhythmDB *db;
 
-	g_assert (rb_ipod_is_volume_ipod (volume));
+	g_assert (rb_ipod_is_volume_ipod (volume, plugin));
 
 	g_object_get (shell, "db", &db, NULL);
 	entry_type =  rhythmdb_entry_register_type (db, NULL);
@@ -274,7 +277,7 @@ add_rb_playlist (RBiPodSource *source, I
 	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (source);
 	RhythmDBEntryType entry_type;
 
-  	g_object_get (source,
+		g_object_get (source,
 		      "shell", &shell,
 		      "entry-type", &entry_type,
 		      NULL);
@@ -518,11 +521,11 @@ get_db_for_source (RBiPodSource *source)
 	RBShell *shell;
 	RhythmDB *db;
 
-  	g_object_get (source, "shell", &shell, NULL);
-  	g_object_get (shell, "db", &db, NULL);
-  	g_object_unref (shell);
+		g_object_get (source, "shell", &shell, NULL);
+		g_object_get (shell, "db", &db, NULL);
+		g_object_unref (shell);
 
-        return db;
+	      return db;
 }
 
 static gboolean
@@ -534,9 +537,9 @@ load_ipod_db_idle_cb (RBiPodSource *sour
 
 	GDK_THREADS_ENTER ();
 
-        db = get_db_for_source (source);
+	      db = get_db_for_source (source);
 
-  	g_assert (db != NULL);
+		g_assert (db != NULL);
  	for (it = priv->ipod_db->tracks; it != NULL; it = it->next) {
 		add_ipod_song_to_db (source, db, (Itdb_Track *)it->data);
 	}
@@ -576,7 +579,7 @@ rb_ipod_load_songs (RBiPodSource *source
 		priv->load_idle_id = g_idle_add ((GSourceFunc)load_ipod_db_idle_cb, source);
 	}
 
-        g_object_unref (volume);
+	      g_object_unref (volume);
 }
 
 static gchar *
@@ -640,30 +643,229 @@ rb_ipod_volume_has_ipod_db (GnomeVFSVolu
 	return result;
 }
 
+enum {
+	COL_INFO = 0,
+	COL_NAME
+};
+
+static void
+set_cell (GtkCellLayout   *cell_layout,
+	  GtkCellRenderer *cell,
+	  GtkTreeModel    *tree_model,
+	  GtkTreeIter     *iter,
+	  gpointer         data)
+{
+	gboolean header;
+	gchar *text;
+	Itdb_IpodInfo *info;
+
+	gtk_tree_model_get (tree_model, iter, COL_INFO, &info, -1);
+	g_return_if_fail (info);
+
+	header = gtk_tree_model_iter_has_child (tree_model, iter);
+
+	if (header) {
+	    text = g_strdup (
+	  itdb_info_get_ipod_generation_string (info->ipod_generation));
+	} else {
+	    if (info->capacity >= 1) {   /* size in GB */
+	  text = g_strdup_printf ("%2.0f GB %s (x%s)",
+				  info->capacity,
+				  itdb_info_get_ipod_model_name_string (
+				      info->ipod_model),
+				  info->model_number);
+	    } else if (info->capacity > 0) {   /* size in MB */
+	  text = g_strdup_printf ("%3.0f MB %s (x%s)",
+				  info->capacity * 1024,
+				  itdb_info_get_ipod_model_name_string (
+				      info->ipod_model),
+				  info->model_number);
+	    } else {   /* no capacity information available */
+	  text = g_strdup_printf ("%s (x%s)",
+				  itdb_info_get_ipod_model_name_string (
+				      info->ipod_model),
+				  info->model_number);
+	    }
+	}
+
+	g_object_set (cell,
+		"sensitive", !header,
+		"text", text,
+		NULL);
+	g_free (text);
+}
+
+static void
+_setup_model_combo (GtkWidget *combo, const char *mount_path)
+{
+	const Itdb_IpodInfo *table;
+	const Itdb_IpodInfo *ipod_info;
+	Itdb_IpodGeneration generation;
+	Itdb_Device *device;
+	GtkTreeStore *store;
+	GtkCellRenderer *renderer;
+	GtkTreeIter *ipod_iter;
+	gboolean info_found;
+
+	table = itdb_info_get_ipod_info_table ();
+	device = itdb_device_new ();
+	itdb_device_set_mountpoint (device, mount_path);
+	itdb_device_read_sysinfo (device);
+	ipod_info = itdb_device_get_ipod_info (device);
+	ipod_iter = NULL;
+
+	store = gtk_tree_store_new (2, G_TYPE_POINTER, G_TYPE_STRING);
+	info_found = TRUE;
+	for (generation = ITDB_IPOD_GENERATION_FIRST; info_found; generation++) {
+		GtkTreeIter iter;
+		const Itdb_IpodInfo *model_info;
+
+		info_found = FALSE;
+		for (model_info = table; model_info->model_number; model_info++) {
+			if (model_info->ipod_generation == generation) {
+				GtkTreeIter iter_child;
+				char *model_name;
+
+				if (!info_found) {
+					gtk_tree_store_append (store, &iter, NULL);
+					gtk_tree_store_set (store, &iter,
+							    COL_INFO, model_info,
+							    COL_NAME, "",
+							    -1);
+					info_found = TRUE;
+				}
+				gtk_tree_store_append (store, &iter_child, &iter);
+				model_name = g_strdup_printf ("x%s", model_info->model_number);
+				gtk_tree_store_set (store, &iter_child,
+						    COL_INFO, model_info,
+						    COL_NAME, model_name,
+						    -1);
+
+				if (model_info == ipod_info) {
+					rb_debug ("found matching iPod model: %s", model_name);
+					ipod_iter = gtk_tree_iter_copy (&iter_child);
+				}
+
+				g_free (model_name);
+			}
+		}
+	}
+
+	gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store));
+	g_object_unref (store);
+	gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (combo), COL_NAME);
+	gtk_cell_layout_clear (GTK_CELL_LAYOUT (combo));
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE);
+	gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combo),
+					    renderer,
+					    set_cell,
+					    NULL, NULL);
+
+	if (ipod_iter) {
+		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), ipod_iter);
+		gtk_tree_iter_free (ipod_iter);
+	} else {
+		/* the ipod wasn't found */
+	}
+
+	itdb_device_free (device);
+}
+
 gboolean
-rb_ipod_is_volume_ipod (GnomeVFSVolume *volume)
+rb_ipod_is_volume_ipod (GnomeVFSVolume *volume, RBPlugin *plugin)
 {
 #ifdef HAVE_HAL
 	gchar *udi;
+	gboolean result;
+	GError *error = NULL;
 #endif
-	if (gnome_vfs_volume_get_volume_type (volume) != GNOME_VFS_VOLUME_TYPE_MOUNTPOINT) {
+	if (gnome_vfs_volume_get_volume_type (volume) != GNOME_VFS_VOLUME_TYPE_MOUNTPOINT)
 		return FALSE;
-	}
 
 #ifdef HAVE_HAL
 	udi = gnome_vfs_volume_get_hal_udi (volume);
-	if (udi != NULL) {
-		gboolean result;
+	if (udi == NULL)
+		return FALSE;
+
+	result = hal_udi_is_ipod (udi);
+	g_free (udi);
+	if (result == FALSE)
+		return FALSE;
+
+	if (!rb_ipod_volume_has_ipod_db (volume)) {
+		/* could be an uninitialised iPod, ask the user */
+		GladeXML *xml;
+		GtkWidget *dialog;
+		GtkWidget *widget;
+		GtkWidget *device;
+		GtkTreeModel *tree_model;
+		GtkTreeIter iter;
+		int response;
+		char *uri;
+		char *glade_file;
+		char *mountpoint;
+		char *model_name;
+		char *ipod_name;
+
+		uri = gnome_vfs_volume_get_activation_uri (volume);
+		mountpoint = g_filename_from_uri (uri, NULL, NULL);
+		g_free (uri);
+		if (mountpoint == NULL)
+			return FALSE;
 
-		result = hal_udi_is_ipod (udi);
-		g_free (udi);
-		if (result == FALSE) {
+		/* create message dialog with model-number combo box
+		 * and asking whether they want to initialise the iPod
+		 */
+		glade_file = rb_plugin_find_file (plugin, "ipod_init.glade");
+		xml = glade_xml_new (glade_file, NULL, NULL);
+		g_free (glade_file);
+		dialog = glade_xml_get_widget (xml, "ipod_init");
+		widget = glade_xml_get_widget (xml, "model_combo");
+		_setup_model_combo (widget, mountpoint);
+
+		device = glade_xml_get_widget (xml, "device_info");
+		uri = gnome_vfs_volume_get_device_path (volume);
+		gtk_label_set_text (GTK_LABEL (device), uri);
+		g_free (uri);
+
+		response = gtk_dialog_run (GTK_DIALOG (dialog));
+		if (response != GTK_RESPONSE_ACCEPT) {
+			gtk_widget_destroy (dialog);
+			g_free (mountpoint);
 			return FALSE;
 		}
+
+		/* get model number and name */
+		tree_model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+		gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
+		gtk_tree_model_get (tree_model, &iter, COL_NAME, &model_name, -1);
+		widget = glade_xml_get_widget (xml, "name_entry");
+		ipod_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (widget)));
+
+		gtk_widget_destroy (dialog);
+
+		rb_debug ("attempting to init ipod on '%s', with model '%s' and name '%s'", mountpoint, model_name, ipod_name);
+		if (!itdb_init_ipod (mountpoint, model_name, ipod_name, &error)) {
+			rb_error_dialog (NULL, _("Unable to initialise new iPod"), "%s", error->message);
+
+			g_free (mountpoint);
+			g_free (model_name);
+			g_free (ipod_name);
+			g_error_free (error);
+			return FALSE;
+		}
+
+		g_free (mountpoint);
+		g_free (model_name);
+		g_free (ipod_name);
 	}
-#endif
 
+	return TRUE;
+#else
 	return rb_ipod_volume_has_ipod_db (volume);
+#endif
 }
 
 #ifdef HAVE_HAL_0_5
@@ -674,7 +876,7 @@ hal_udi_is_ipod (const char *udi)
 	LibHalContext *ctx;
 	DBusConnection *conn;
 	char *parent_udi;
-        char *parent_name;
+	char *parent_name;
 	gboolean result;
 	DBusError error;
 	gboolean inited = FALSE;
@@ -683,8 +885,8 @@ hal_udi_is_ipod (const char *udi)
 	dbus_error_init (&error);
 
 	conn = NULL;
-        parent_udi = NULL;
-        parent_name = NULL;
+	      parent_udi = NULL;
+	      parent_name = NULL;
 
 	ctx = libhal_ctx_new ();
 	if (ctx == NULL) {
@@ -786,7 +988,7 @@ hal_udi_is_ipod (const char *udi)
 {
 	LibHalContext *ctx;
 	char *parent_udi;
-        char *parent_name;
+	      char *parent_name;
 	gboolean result;
 
 	result = FALSE;
@@ -852,7 +1054,7 @@ impl_move_to_trash (RBSource *asource)
 	RBiPodSourcePrivate *priv = IPOD_SOURCE_GET_PRIVATE (asource);
 	RBiPodSource *source = RB_IPOD_SOURCE (asource);
 
-        db = get_db_for_source (source);
+	      db = get_db_for_source (source);
 
 	songs = rb_source_get_entry_view (RB_SOURCE (asource));
 	sel = rb_entry_view_get_selected_entries (songs);
@@ -880,7 +1082,7 @@ impl_move_to_trash (RBSource *asource)
 		itdb_write (priv->ipod_db, NULL);
 	}
 
-  	g_object_unref (db);
+		g_object_unref (db);
 
 	g_list_free (sel);
 }
@@ -888,14 +1090,14 @@ impl_move_to_trash (RBSource *asource)
 static void
 itdb_schedule_save (Itdb_iTunesDB *db)
 {
-       /* FIXME: should probably be delayed a bit to avoid doing
-        * it after each file when we are copying several files
-        * consecutively
-        * FIXME: or this function could be called itdb_set_dirty, and we'd
-        * have a timeout firing every 5 seconds and saving the db if it's
-        * dirty
-        */
-       itdb_write (db, NULL);
+	     /* FIXME: should probably be delayed a bit to avoid doing
+	      * it after each file when we are copying several files
+	      * consecutively
+	      * FIXME: or this function could be called itdb_set_dirty, and we'd
+	      * have a timeout firing every 5 seconds and saving the db if it's
+	      * dirty
+	      */
+	     itdb_write (db, NULL);
 }
 
 #ifdef ENABLE_IPOD_WRITING
@@ -925,7 +1127,7 @@ completed_cb (RhythmDBEntry *entry, cons
 	RhythmDB *db;
 	Itdb_Track *song;
 
-        db = get_db_for_source (source);
+	      db = get_db_for_source (source);
 
 	song = create_ipod_song_from_entry (entry);
 	if (song != NULL) {
@@ -1005,7 +1207,7 @@ impl_receive_drag (RBSource *asource, Gt
 	list = rb_uri_list_parse ((const char *) data->data);
 	is_id = (data->type == gdk_atom_intern ("application/x-rhythmbox-entry", TRUE));
 
-        db = get_db_for_source (RB_IPOD_SOURCE (source));
+	      db = get_db_for_source (RB_IPOD_SOURCE (source));
 
 	for (i = list; i != NULL; i = g_list_next (i)) {
 		if (i->data != NULL) {
@@ -1148,13 +1350,13 @@ utf8_to_ascii (const gchar *utf8)
 
 	string = g_string_new ("");
 	while ((it != NULL) && (*it != '\0')) {
-		/* Do we have a 7 bit char ? */
-		if (*it < 0x80) {
-			g_string_append_c (string, *it);
-		} else {
-			g_string_append_c (string, '_');
-		}
-		it = (const guchar *)g_utf8_next_char (it);
+	        /* Do we have a 7 bit char ? */
+	        if (*it < 0x80) {
+	                g_string_append_c (string, *it);
+	        } else {
+	                g_string_append_c (string, '_');
+	        }
+	        it = (const guchar *)g_utf8_next_char (it);
 	}
 
 	return g_string_free (string, FALSE);
@@ -1228,29 +1430,29 @@ ipod_get_filename_for_uri (const gchar *
 static gchar *
 ipod_path_from_unix_path (const gchar *mount_point, const gchar *unix_path)
 {
-        gchar *ipod_path;
+	gchar *ipod_path;
+
+	g_assert (g_utf8_validate (unix_path, -1, NULL));
 
-        g_assert (g_utf8_validate (unix_path, -1, NULL));
+	if (!g_str_has_prefix (unix_path, mount_point)) {
+		return NULL;
+	}
 
-        if (!g_str_has_prefix (unix_path, mount_point)) {
-                return NULL;
-        }
-
-        ipod_path = g_strdup (unix_path + strlen (mount_point));
-        if (*ipod_path != G_DIR_SEPARATOR) {
-                gchar *tmp;
-                tmp = g_strdup_printf ("/%s", ipod_path);
-                g_free (ipod_path);
-                ipod_path = tmp;
-        }
+	ipod_path = g_strdup (unix_path + strlen (mount_point));
+	if (*ipod_path != G_DIR_SEPARATOR) {
+		gchar *tmp;
+	              tmp = g_strdup_printf ("/%s", ipod_path);
+	              g_free (ipod_path);
+	              ipod_path = tmp;
+	      }
 
-        /* Make sure the filename doesn't contain any ':' */
-        g_strdelimit (ipod_path, ":", ';');
+	      /* Make sure the filename doesn't contain any ':' */
+	      g_strdelimit (ipod_path, ":", ';');
 
-        /* Convert path to a Mac path where the dir separator is ':' */
+	      /* Convert path to a Mac path where the dir separator is ':' */
 	itdb_filename_fs2ipod (ipod_path);
 
-        return ipod_path;
+	      return ipod_path;
 }
 #endif
 
Index: plugins/ipod/Makefile.am
===================================================================
--- plugins/ipod/Makefile.am	(revision 4723)
+++ plugins/ipod/Makefile.am	(working copy)
@@ -41,7 +41,10 @@ plugin_in_files = ipod.rb-plugin.desktop
 
 plugin_DATA = $(plugin_in_files:.rb-plugin.desktop.in=.rb-plugin)
 
-EXTRA_DIST = $(plugin_in_files)
+gladedir = $(plugindir)
+glade_DATA = ipod_init.glade
+
+EXTRA_DIST = $(plugin_in_files) $(glade_DATA)
 
 CLEANFILES = $(plugin_DATA)
 DISTCLEANFILES = $(plugin_DATA)
Index: plugins/ipod/rb-ipod-plugin.c
===================================================================
--- plugins/ipod/rb-ipod-plugin.c	(revision 4723)
+++ plugins/ipod/rb-ipod-plugin.c	(working copy)
@@ -199,9 +199,9 @@ rb_ipod_plugin_source_deleted (RBiPodSou
 static RBSource *
 create_source_cb (RBRemovableMediaManager *rmm, GnomeVFSVolume *volume, RBIpodPlugin *plugin)
 {
-	if (rb_ipod_is_volume_ipod (volume)) {
+	if (rb_ipod_is_volume_ipod (volume, RB_PLUGIN (plugin))) {
 		RBSource *src;
-		src = RB_SOURCE (rb_ipod_source_new (plugin->shell, volume));
+		src = RB_SOURCE (rb_ipod_source_new (plugin->shell, RB_PLUGIN (plugin), volume));
 
 		plugin->ipod_sources = g_list_prepend (plugin->ipod_sources, src);
 		g_signal_connect_object (G_OBJECT (src),
Index: plugins/ipod/ipod_init.glade
===================================================================
--- plugins/ipod/ipod_init.glade	(revision 0)
+++ plugins/ipod/ipod_init.glade	(revision 0)
@@ -0,0 +1,269 @@
+<?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="ipod_init">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">iPod detected</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area1">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="initialise_button">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">_Initialise</property>
+	      <property name="use_underline">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-3</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="GtkTable" id="table1">
+	  <property name="border_width">12</property>
+	  <property name="visible">True</property>
+	  <property name="n_rows">4</property>
+	  <property name="n_columns">2</property>
+	  <property name="homogeneous">False</property>
+	  <property name="row_spacing">12</property>
+	  <property name="column_spacing">12</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label3">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_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</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	      <property name="mnemonic_widget">name_entry</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="label2">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Model:</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">model_combo</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="label4">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Device:</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.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="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="GtkEntry" id="name_entry">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="editable">True</property>
+	      <property name="visibility">True</property>
+	      <property name="max_length">0</property>
+	      <property name="text" translatable="yes"></property>
+	      <property name="has_frame">True</property>
+	      <property name="invisible_char">●</property>
+	      <property name="activates_default">False</property>
+	    </widget>
+	    <packing>
+	      <property name="left_attach">1</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">3</property>
+	      <property name="bottom_attach">4</property>
+	      <property name="x_options">expand|shrink|fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="device_info">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">...</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">True</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="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="GtkLabel" id="text">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label" translatable="yes">Rhythmbox has detected a device that is probably an unintialised or corrupted iPod. It must be initialised before Rhythmbox can use it, but this will destroy any song metadata already present. If you wish Rhythmbox to initialsise the iPod, please fill in the information below. If the device is not an iPod, or you do not wish to initialise it, please click cancel.</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">True</property>
+	      <property name="selectable">True</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="left_attach">0</property>
+	      <property name="right_attach">2</property>
+	      <property name="top_attach">0</property>
+	      <property name="bottom_attach">1</property>
+	      <property name="x_options">expand|shrink|fill</property>
+	      <property name="y_options"></property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkComboBoxEntry" id="model_combo">
+	      <property name="visible">True</property>
+	      <property name="add_tearoffs">False</property>
+	      <property name="has_frame">True</property>
+	      <property name="focus_on_click">True</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">fill</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
