diff --git a/src/Makefile.am b/src/Makefile.am
index cd719f4..c46891c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,8 +17,7 @@ sound_juicer_SOURCES = \
 	sj-genres.h \
 	sj-genres.c \
 	egg-play-preview.c \
-	egg-play-preview.h \
-	$(BACON_FILES)
+	egg-play-preview.h
 
 sound_juicer_CPPFLAGS = \
 	-I$(top_srcdir)/libjuicer \
@@ -47,9 +46,3 @@ sound_juicer_LDADD = \
 
 sound_juicer_LDFLAGS = \
 	$(AM_LDFLAGS)
-
-BACON_DIR=$(srcdir)/../../libbacon/src/
-BACON_FILES=bacon-message-connection.h bacon-message-connection.c
-
-regenerate-built-sources:
-	$(AM_V_GEN) BACONFILES="$(BACON_FILES)" BACONDIR="$(BACON_DIR)" $(top_srcdir)/src/update-from-bacon.sh
diff --git a/src/bacon-message-connection.c b/src/bacon-message-connection.c
deleted file mode 100644
index 972d8e0..0000000
--- a/src/bacon-message-connection.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Copyright (C) 2003 Bastien Nocera <hadess@hadess.net>
- *
- * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <errno.h>
-
-#include "bacon-message-connection.h"
-
-#ifndef UNIX_PATH_MAX
-#define UNIX_PATH_MAX 108
-#endif
-
-struct BaconMessageConnection {
-	/* A server accepts connections */
-	gboolean is_server;
-
-	/* The socket path itself */
-	char *path;
-
-	/* File descriptor of the socket */
-	int fd;
-	/* Channel to watch */
-	GIOChannel *chan;
-	/* Event id returned by g_io_add_watch() */
-	int conn_id;
-
-	/* Connections accepted by this connection */
-	GSList *accepted_connections;
-
-	/* callback */
-	void (*func) (const char *message, gpointer user_data);
-	gpointer data;
-};
-
-static gboolean
-test_is_socket (const char *path)
-{
-	struct stat s;
-
-	if (stat (path, &s) == -1)
-		return FALSE;
-
-	if (S_ISSOCK (s.st_mode))
-		return TRUE;
-
-	return FALSE;
-}
-
-static gboolean
-is_owned_by_user_and_socket (const char *path)
-{
-	struct stat s;
-
-	if (stat (path, &s) == -1)
-		return FALSE;
-
-	if (s.st_uid != geteuid ())
-		return FALSE;
-
-	if ((s.st_mode & S_IFSOCK) != S_IFSOCK)
-		return FALSE;
-	
-	return TRUE;
-}
-
-static gboolean server_cb (GIOChannel *source,
-			   GIOCondition condition, gpointer data);
-
-static gboolean
-setup_connection (BaconMessageConnection *conn)
-{
-	g_return_val_if_fail (conn->chan == NULL, FALSE);
-
-	conn->chan = g_io_channel_unix_new (conn->fd);
-	if (!conn->chan) {
-		return FALSE;
-	}
-	g_io_channel_set_line_term (conn->chan, "\n", 1);
-	conn->conn_id = g_io_add_watch (conn->chan, G_IO_IN, server_cb, conn);
-
-	return TRUE;
-}
-
-static void
-accept_new_connection (BaconMessageConnection *server_conn)
-{
-	BaconMessageConnection *conn;
-	int alen;
-
-	g_return_if_fail (server_conn->is_server);
-
-	conn = g_new0 (BaconMessageConnection, 1);
-	conn->is_server = FALSE;
-	conn->func = server_conn->func;
-	conn->data = server_conn->data;
-
-	conn->fd = accept (server_conn->fd, NULL, (guint *)&alen);
-
-	server_conn->accepted_connections =
-		g_slist_prepend (server_conn->accepted_connections, conn);
-
-	setup_connection (conn);
-}
-
-static gboolean
-server_cb (GIOChannel *source, GIOCondition condition, gpointer data)
-{
-	BaconMessageConnection *conn = (BaconMessageConnection *)data;
-	char *message, *subs, buf;
-	int cd, rc, offset;
-	gboolean finished;
-
-	offset = 0;
-	if (conn->is_server && conn->fd == g_io_channel_unix_get_fd (source)) {
-		accept_new_connection (conn);
-		return TRUE;
-	}
-	message = g_malloc (1);
-	cd = conn->fd;
-	rc = read (cd, &buf, 1);
-	while (rc > 0 && buf != '\n')
-	{
-		message = g_realloc (message, rc + offset + 1);
-		message[offset] = buf;
-		offset = offset + rc;
-		rc = read (cd, &buf, 1);
-	}
-	if (rc <= 0) {
-		g_io_channel_shutdown (conn->chan, FALSE, NULL);
-		g_io_channel_unref (conn->chan);
-		conn->chan = NULL;
-		close (conn->fd);
-		conn->fd = -1;
-		g_free (message);
-		conn->conn_id = 0;
-
-		return FALSE;
-	}
-	message[offset] = '\0';
-
-	subs = message;
-	finished = FALSE;
-
-	while (finished == FALSE && *subs != '\0')
-	{
-		if (conn->func != NULL)
-			(*conn->func) (subs, conn->data);
-
-		subs += strlen (subs) + 1;
-		if (subs - message >= offset)
-			finished = TRUE;
-	}
-
-	g_free (message);
-
-	return TRUE;
-}
-
-static char *
-find_file_with_pattern (const char *dir, const char *pattern)
-{
-	GDir *filedir;
-	char *found_filename;
-	const char *filename;
-	GPatternSpec *pat;
-
-	filedir = g_dir_open (dir, 0, NULL);
-	if (filedir == NULL)
-		return NULL;
-
-	pat = g_pattern_spec_new (pattern);
-	if (pat == NULL)
-	{
-		g_dir_close (filedir);
-		return NULL;
-	}
-
-	found_filename = NULL;
-
-	while ((filename = g_dir_read_name (filedir)))
-	{
-		if (g_pattern_match_string (pat, filename))
-		{
-			char *tmp = g_build_filename (dir, filename, NULL);
-			if (is_owned_by_user_and_socket (tmp))
-				found_filename = g_strdup (filename);
-			g_free (tmp);
-		}
-
-		if (found_filename != NULL)
-			break;
-	}
-
-	g_pattern_spec_free (pat);
-	g_dir_close (filedir);
-
-	return found_filename;
-}
-
-static char *
-socket_filename (const char *prefix)
-{
-	char *pattern, *newfile, *path, *filename;
-	const char *tmpdir;
-
-	pattern = g_strdup_printf ("%s.%s.*", prefix, g_get_user_name ());
-	tmpdir = g_get_tmp_dir ();
-	filename = find_file_with_pattern (tmpdir, pattern);
-	if (filename == NULL)
-	{
-		newfile = g_strdup_printf ("%s.%s.%u", prefix,
-				g_get_user_name (), g_random_int ());
-		path = g_build_filename (tmpdir, newfile, NULL);
-		g_free (newfile);
-	} else {
-		path = g_build_filename (tmpdir, filename, NULL);
-		g_free (filename);
-	}
-
-	g_free (pattern);
-	return path;
-}
-
-static gboolean
-try_server (BaconMessageConnection *conn)
-{
-	struct sockaddr_un uaddr;
-
-	uaddr.sun_family = AF_UNIX;
-	strncpy (uaddr.sun_path, conn->path,
-			MIN (strlen(conn->path)+1, UNIX_PATH_MAX));
-	conn->fd = socket (PF_UNIX, SOCK_STREAM, 0);
-	if (bind (conn->fd, (struct sockaddr *) &uaddr, sizeof (uaddr)) == -1)
-	{
-		conn->fd = -1;
-		return FALSE;
-	}
-	listen (conn->fd, 5);
-
-	if (!setup_connection (conn))
-		return FALSE;
-	return TRUE;
-}
-
-static gboolean
-try_client (BaconMessageConnection *conn)
-{
-	struct sockaddr_un uaddr;
-
-	uaddr.sun_family = AF_UNIX;
-	strncpy (uaddr.sun_path, conn->path,
-			MIN(strlen(conn->path)+1, UNIX_PATH_MAX));
-	conn->fd = socket (PF_UNIX, SOCK_STREAM, 0);
-	if (connect (conn->fd, (struct sockaddr *) &uaddr,
-				sizeof (uaddr)) == -1)
-	{
-		conn->fd = -1;
-		return FALSE;
-	}
-
-	return setup_connection (conn);
-}
-
-BaconMessageConnection *
-bacon_message_connection_new (const char *prefix)
-{
-	BaconMessageConnection *conn;
-
-	g_return_val_if_fail (prefix != NULL, NULL);
-
-	conn = g_new0 (BaconMessageConnection, 1);
-	conn->path = socket_filename (prefix);
-
-	if (test_is_socket (conn->path) == FALSE)
-	{
-		if (!try_server (conn))
-		{
-			bacon_message_connection_free (conn);
-			return NULL;
-		}
-
-		conn->is_server = TRUE;
-		return conn;
-	}
-
-	if (try_client (conn) == FALSE)
-	{
-		unlink (conn->path);
-		try_server (conn);
-		if (conn->fd == -1)
-		{
-			bacon_message_connection_free (conn);
-			return NULL;
-		}
-
-		conn->is_server = TRUE;
-		return conn;
-	}
-
-	conn->is_server = FALSE;
-	return conn;
-}
-
-void
-bacon_message_connection_free (BaconMessageConnection *conn)
-{
-	GSList *child_conn;
-
-	g_return_if_fail (conn != NULL);
-	/* Only servers can accept other connections */
-	g_return_if_fail (conn->is_server != FALSE ||
-			  conn->accepted_connections == NULL);
-
-	child_conn = conn->accepted_connections;
-	while (child_conn != NULL) {
-		bacon_message_connection_free (child_conn->data);
-		child_conn = g_slist_next (child_conn);
-	}
-	g_slist_free (conn->accepted_connections);
-
-	if (conn->conn_id) {
-		g_source_remove (conn->conn_id);
-		conn->conn_id = 0;
-	}
-	if (conn->chan) {
-		g_io_channel_shutdown (conn->chan, FALSE, NULL);
-		g_io_channel_unref (conn->chan);
-	}
-
-	if (conn->is_server != FALSE) {
-		unlink (conn->path);
-	}
-	if (conn->fd != -1) {
-		close (conn->fd);
-	}
-
-	g_free (conn->path);
-	g_free (conn);
-}
-
-void
-bacon_message_connection_set_callback (BaconMessageConnection *conn,
-				       BaconMessageReceivedFunc func,
-				       gpointer user_data)
-{
-	g_return_if_fail (conn != NULL);
-
-	conn->func = func;
-	conn->data = user_data;
-}
-
-void
-bacon_message_connection_send (BaconMessageConnection *conn,
-			       const char *message)
-{
-	g_return_if_fail (conn != NULL);
-	g_return_if_fail (message != NULL);
-
-	g_io_channel_write_chars (conn->chan, message, strlen (message),
-				  NULL, NULL);
-	g_io_channel_write_chars (conn->chan, "\n", 1, NULL, NULL);
-	g_io_channel_flush (conn->chan, NULL);
-}
-
-gboolean
-bacon_message_connection_get_is_server (BaconMessageConnection *conn)
-{
-	g_return_val_if_fail (conn != NULL, FALSE);
-
-	return conn->is_server;
-}
-
diff --git a/src/bacon-message-connection.h b/src/bacon-message-connection.h
deleted file mode 100644
index aac7a2d..0000000
--- a/src/bacon-message-connection.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2003 Bastien Nocera <hadess@hadess.net>
- *
- * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef BACON_MESSAGE_CONNECTION_H
-#define BACON_MESSAGE_CONNECTION_H
-
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-typedef void (*BaconMessageReceivedFunc) (const char *message,
-					  gpointer user_data);
-
-typedef struct BaconMessageConnection BaconMessageConnection;
-
-BaconMessageConnection *bacon_message_connection_new	(const char *prefix);
-void bacon_message_connection_free			(BaconMessageConnection *conn);
-void bacon_message_connection_set_callback		(BaconMessageConnection *conn,
-							 BaconMessageReceivedFunc func,
-							 gpointer user_data);
-void bacon_message_connection_send			(BaconMessageConnection *conn,
-							 const char *message);
-gboolean bacon_message_connection_get_is_server		(BaconMessageConnection *conn);
-
-G_END_DECLS
-
-#endif /* BACON_MESSAGE_CONNECTION_H */
diff --git a/src/sj-main.c b/src/sj-main.c
index ea99d53..bfb070b 100644
--- a/src/sj-main.c
+++ b/src/sj-main.c
@@ -39,7 +39,6 @@
 #include <gst/gst.h>
 #include <gst/pbutils/encoding-profile.h>
 
-#include "bacon-message-connection.h"
 #include "rb-gst-media-types.h"
 #include "sj-about.h"
 #include "sj-metadata-getter.h"
@@ -70,20 +69,20 @@ SjMetadataGetter *metadata;
 SjExtractor *extractor;
 
 GSettings *sj_settings;
+GSettings *http_settings;
 
 GtkWidget *main_window;
 static GtkWidget *message_area_eventbox;
 static GtkWidget *title_entry, *artist_entry, *duration_label, *genre_entry, *year_entry, *disc_number_entry;
-static GtkWidget *track_listview, *extract_button, *play_button;
+static GtkWidget *extract_button, *play_button;
 static GtkWidget *status_bar;
 static GtkWidget *extract_menuitem, *play_menuitem, *next_menuitem, *prev_menuitem, *select_all_menuitem, *deselect_all_menuitem;
 static GtkWidget *submit_menuitem;
 static GtkWidget *duplicate, *eject;
 GtkListStore *track_store;
-static BaconMessageConnection *connection;
 GtkCellRenderer *toggle_renderer, *title_renderer, *artist_renderer;
 
-GtkWidget *current_message_area;
+static GtkWidget *current_message_area;
 
 char *path_pattern = NULL;
 char *file_pattern = NULL;
@@ -100,10 +99,13 @@ static gint no_of_tracks_selected;
 static AlbumDetails *current_album;
 static char *current_submit_url = NULL;
 
-gboolean autostart = FALSE, autoplay = FALSE;
+gboolean autostart = FALSE;
+static gboolean autoplay = FALSE;
 
 static guint debug_flags = 0;
 
+static char *device = NULL;
+
 #define DEFAULT_PARANOIA 4
 #define RAISE_WINDOW "raise-window"
 #define SOURCE_BUILDER "../data/sound-juicer.ui"
@@ -1478,16 +1480,6 @@ G_MODULE_EXPORT void on_contents_activate(GtkWidget *button, gpointer user_data)
   }
 }
 
-static void
-on_message_received (const char *message, gpointer user_data)
-{
-  if (message == NULL)
-    return;
-  if (strcmp (RAISE_WINDOW, message) == 0) {
-    gtk_window_present (GTK_WINDOW (main_window));
-  }
-}
-
 /**
  * Performs various checks to ensure CD duplication is available.
  * If this is found TRUE is returned, otherwise FALSE is returned.
@@ -1571,44 +1563,52 @@ static void set_duplication(gboolean enabled)
   }
 }
 
-int main (int argc, char **argv)
+typedef GtkApplication SjShell;
+typedef GtkApplicationClass SjShellClass;
+GType sj_shell_get_type (void);
+
+G_DEFINE_TYPE (SjShell, sj_shell, GTK_TYPE_APPLICATION)
+
+static void sj_shell_startup (GApplication *app);
+static void sj_shell_activate (GApplication *app);
+static void sj_shell_quit_mainloop (GApplication *app);
+
+static void sj_shell_init (SjShell *shell)
 {
-  GError *error = NULL;
-  GtkTreeSelection *selection;
-  char *device = NULL, **uris = NULL;
-  GOptionContext *ctx;
-  const GOptionEntry entries[] = {
-    { "auto-start", 'a', 0, G_OPTION_ARG_NONE, &autostart, N_("Start extracting immediately"), NULL },
-    { "play", 'p', 0, G_OPTION_ARG_NONE, &autoplay, N_("Start playing immediately"), NULL},
-    { "device", 'd', 0, G_OPTION_ARG_FILENAME, &device, N_("What CD device to read"), N_("DEVICE") },
-    { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &uris, N_("URI to the CD device to read"), NULL },
-    { NULL }
-  };
-  GSettings *http_settings;
+}
 
-  if (!g_thread_supported ()) g_thread_init (NULL);
+static void sj_shell_class_init (SjShellClass *klass)
+{
+  G_APPLICATION_CLASS (klass)->activate = sj_shell_activate;
+  G_APPLICATION_CLASS (klass)->startup = sj_shell_startup;
+  G_APPLICATION_CLASS (klass)->quit_mainloop = sj_shell_quit_mainloop;
+}
 
-  bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
-  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-  textdomain (GETTEXT_PACKAGE);
+static SjShell *sj_shell_new (void)
+{
+  return g_object_new (sj_shell_get_type(),
+                       "application-id", "org.gnome.SoundJuicer",
+                       NULL);
+}
 
-  g_set_application_name (_("Sound Juicer"));
-  g_setenv ("PULSE_PROP_media.role", "music", TRUE);
+static void sj_shell_quit_mainloop (GApplication *app)
+{
+  g_object_unref (base_uri);
+  g_object_unref (metadata);
+  g_object_unref (extractor);
+  g_object_unref (sj_settings);
+  g_object_unref (http_settings);
+  brasero_media_library_stop ();
+  g_free (device);
+}
 
-  ctx = g_option_context_new (N_("- Extract music from your CDs"));
-  g_option_context_add_main_entries (ctx, entries, GETTEXT_PACKAGE);
-  g_option_context_set_translation_domain(ctx, GETTEXT_PACKAGE);
-  g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
-  g_option_context_add_group (ctx, gst_init_get_option_group ());
-  g_option_context_add_group (ctx, brasero_media_get_option_group ());
-  g_option_context_set_ignore_unknown_options (ctx, TRUE);
+static void sj_shell_startup (GApplication *app)
+{
+  GtkTreeSelection *selection;
+  GtkWidget *track_listview;
+  GError *error = NULL;
 
-  g_option_context_parse (ctx, &argc, &argv, &error);
-  if (error != NULL) {
-      g_printerr ("Error parsing options: %s", error->message);
-      exit (1);
-  }
-  g_option_context_free (ctx);
+  g_setenv ("PULSE_PROP_media.role", "music", TRUE);
 
   sj_debug_init ();
 
@@ -1616,15 +1616,6 @@ int main (int argc, char **argv)
 
   gtk_window_set_default_icon_name ("sound-juicer");
 
-  connection = bacon_message_connection_new ("sound-juicer");
-  if (bacon_message_connection_get_is_server (connection) == FALSE) {
-    bacon_message_connection_send (connection, RAISE_WINDOW);
-    bacon_message_connection_free (connection);
-    exit (0);
-  } else {
-    bacon_message_connection_set_callback (connection, on_message_received, NULL);
-  }
-
   brasero_media_library_start ();
 
   metadata = sj_metadata_getter_new ();
@@ -1706,6 +1697,8 @@ int main (int argc, char **argv)
   duplicate             = GET_WIDGET ("duplicate_menuitem");
   eject                 = GET_WIDGET ("eject");
 
+  gtk_window_set_application (GTK_WINDOW (main_window), GTK_APPLICATION (app));
+
   { /* ensure that the play/pause button's size is constant */
     GtkWidget *fake_button1, *fake_button2;
     GtkSizeGroup *size_group;
@@ -1812,37 +1805,19 @@ int main (int argc, char **argv)
   eject_changed_cb (sj_settings, SJ_SETTINGS_EJECT, NULL);
   open_changed_cb (sj_settings, SJ_SETTINGS_OPEN, NULL);
   audio_volume_changed_cb (sj_settings, SJ_SETTINGS_AUDIO_VOLUME, NULL);
-  if (device == NULL && uris == NULL) {
+  if (device == NULL) {
     /* FIXME: this should set the device gsettings key to a meaningful
      * value if it's empty (which is the case until the user changes it in
      * the prefs)
      */
     device_changed_cb (sj_settings, SJ_SETTINGS_DEVICE, NULL);
   } else {
-    if (device)
-      set_device (device, TRUE);
-    else {
-      char *d;
-
-      /* Mash up the CDDA URIs into a device path */
-      if (g_str_has_prefix (uris[0], "cdda://")) {
-      	gint len;
-        d = g_strdup_printf ("/dev/%s%c", uris[0] + strlen ("cdda://"), '\0');
-        /* Take last '/' out of path, or set_device thinks it is part of the device name */
-		len = strlen (d);
-		if (d[len - 1] == '/')
-			d [len - 1] = '\0';
-	set_device (d, TRUE);
-	g_free (d);
-      } else {
-        device_changed_cb (sj_settings, SJ_SETTINGS_DEVICE, NULL);
-      }
-    }
+    set_device (device, TRUE);
   }
 
   if (sj_extractor_supports_encoding (&error) == FALSE) {
     error_on_start (error);
-    return 0;
+    gtk_main_quit();
   }
 
   /* Set whether duplication of a cd is available using the brasero tool */
@@ -1851,14 +1826,77 @@ int main (int argc, char **argv)
 
   /*gconf_bridge_bind_window_size(gconf_bridge_get(), GCONF_WINDOW, GTK_WINDOW (main_window)); */
   gtk_widget_show (main_window);
-  gtk_main ();
+}
 
-  g_object_unref (base_uri);
-  g_object_unref (metadata);
-  g_object_unref (extractor);
-  g_object_unref (sj_settings);
-  g_object_unref (http_settings);
-  brasero_media_library_stop ();
+static void sj_shell_activate (GApplication *app)
+{
+    gtk_window_present (GTK_WINDOW (main_window));
+}
+
+/* Mash up a CDDA URIs into a device path */
+static char *
+cdda_uri_to_dev_path(const char *uri)
+{
+  char *d;
+  size_t len;
+
+  if (!g_str_has_prefix (uri, "cdda://"))
+    return NULL;
+
+  d = g_strdup_printf ("/dev/%s%c", uri + strlen ("cdda://"), '\0');
+  /* Take last '/' out of path, or set_device thinks it is part of the
+   * device name */
+  len = strlen (d);
+  if (d[len - 1] == '/')
+    d [len - 1] = '\0';
+
+  return d;
+}
+
+int main (int argc, char **argv)
+{
+  GError *error = NULL;
+  char **uris = NULL;
+  GOptionContext *ctx;
+  const GOptionEntry entries[] = {
+    { "auto-start", 'a', 0, G_OPTION_ARG_NONE, &autostart, N_("Start extracting immediately"), NULL },
+    { "play", 'p', 0, G_OPTION_ARG_NONE, &autoplay, N_("Start playing immediately"), NULL},
+    { "device", 'd', 0, G_OPTION_ARG_FILENAME, &device, N_("What CD device to read"), N_("DEVICE") },
+    { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &uris, N_("URI to the CD device to read"), NULL },
+    { NULL }
+  };
+  SjShell *shell;
+  int status;
+
+  if (!g_thread_supported ()) g_thread_init (NULL);
+
+  bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+  textdomain (GETTEXT_PACKAGE);
+
+  g_set_application_name (_("Sound Juicer"));
+
+  ctx = g_option_context_new (N_("- Extract music from your CDs"));
+  g_option_context_add_main_entries (ctx, entries, GETTEXT_PACKAGE);
+  g_option_context_set_translation_domain(ctx, GETTEXT_PACKAGE);
+  g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+  g_option_context_add_group (ctx, gst_init_get_option_group ());
+  g_option_context_add_group (ctx, brasero_media_get_option_group ());
+  g_option_context_set_ignore_unknown_options (ctx, TRUE);
+
+  g_option_context_parse (ctx, &argc, &argv, &error);
+  if (error != NULL) {
+      g_printerr ("Error parsing options: %s", error->message);
+      exit (1);
+  }
+  g_option_context_free (ctx);
+  if ((device == NULL) && (uris != NULL)) {
+    device = cdda_uri_to_dev_path(uris[0]);
+  }
+
+  shell = sj_shell_new ();
+  status = g_application_run (G_APPLICATION (shell), argc, argv);
+  g_object_unref (shell);
 
-  return 0;
+  return status;
 }
