diff --git a/po/POTFILES.in b/po/POTFILES.in
index b943a08..2f4d4a3 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -17,6 +17,7 @@ src/eggsmclient.c
 src/totem-audio-preview.c
 src/totem-cell-renderer-video.c
 src/totem-dnd-menu.c
+src/totem-dvb-setup.c
 src/totem-fullscreen.c
 src/totem-interface.c
 src/totem-menu.c
diff --git a/src/backend/bacon-video-widget-gst-0.10.c b/src/backend/bacon-video-widget-gst-0.10.c
index 0a9d740..f76997d 100644
--- a/src/backend/bacon-video-widget-gst-0.10.c
+++ b/src/backend/bacon-video-widget-gst-0.10.c
@@ -4771,132 +4771,6 @@ done:
   return res;
 }
 
-static char *
-bacon_video_widget_get_channels_file (void)
-{
-  gchar *filename;
-
-  filename = g_strdup(g_getenv("GST_DVB_CHANNELS_CONF"));
-  if (filename == NULL || g_file_test (filename, G_FILE_TEST_IS_REGULAR) == FALSE) {
-    gchar *directory;
-    guint major, minor, micro, nano;
-
-    g_free (filename);
-    gst_version(&major, &minor, &micro, &nano);
-    directory = g_strdup_printf (".gstreamer-%d.%d", major, minor);
-    filename = g_build_filename (g_get_home_dir (), directory, "dvb-channels.conf", NULL);
-    g_free (directory);
-
-    if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) == FALSE) {
-      g_free (filename);
-      filename = g_build_filename (g_get_home_dir (), ".xine", "channels.conf", NULL);
-    }
-  }
-
-  return filename;
-}
-
-static char
-bacon_video_widget_dvb_get_adapter_type (const char *device)
-{
-  GstElement *dvbelement;
-  GstBus *dvbbus;
-  GstPipeline * pipeline;
-  char adapter_type;
-
-  adapter_type = 'U'; /* unknown */
-  /* let gstreamer know what adapter to use */
-  g_setenv("GST_DVB_ADAPTER", device, TRUE);
-
-  /* HACK: find out type of adapter so it filters out the channels
-   * based on the type of adapter. */
-  dvbelement = gst_element_factory_make ("dvbsrc", "test_dvbsrc");
-  g_object_set (G_OBJECT (dvbelement), "adapter", atoi (device), NULL);
-
-  pipeline = GST_PIPELINE (gst_pipeline_new (""));
-  gst_bin_add (GST_BIN (pipeline), dvbelement);
-  gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
-  gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL, GST_CLOCK_TIME_NONE);
-  dvbbus = gst_pipeline_get_bus (pipeline);
-
-  while (gst_bus_have_pending (dvbbus)) {
-    GstMessage* msg;
-
-    msg = gst_bus_pop (dvbbus);
-    if (msg->type == GST_MESSAGE_ELEMENT && msg->src == GST_OBJECT(dvbelement)) {
-      GstStructure *structure;
-
-      structure = msg->structure;
-
-      if (g_str_equal (gst_structure_get_name (structure), "dvb-adapter") != FALSE) {
-        const GValue* val;
-
-	val = gst_structure_get_value (structure, "type");
-	if (val) {
-	  if (g_str_equal (g_value_get_string (val), "DVB-T") != FALSE) {
-	    adapter_type = 'T';
-	  } else if (g_str_equal (g_value_get_string (val), "DVB-S") != FALSE) {
-	    adapter_type = 'S';
-	  } else if (g_str_equal (g_value_get_string (val), "DVB-C") != FALSE) {
-	    adapter_type = 'C';
-	  } else if (g_str_equal (g_value_get_string (val), "ATSC") != FALSE) {
-	    adapter_type = 'A';
-	  }
-	}
-	gst_message_unref (msg);
-	break;
-      }
-    }
-    gst_message_unref (msg);
-  }
-  g_object_unref (dvbbus);
-  gst_element_set_state (GST_ELEMENT(pipeline), GST_STATE_NULL);
-  g_object_unref (G_OBJECT(pipeline));
-
-  return adapter_type;
-}
-
-static gchar **
-bacon_video_widget_get_dvb_mrls (const char *device)
-{
-  gchar* filename;
-  gchar* contents;
-  GPtrArray *array;
-  gchar adapter_type;
-
-  adapter_type = bacon_video_widget_dvb_get_adapter_type (device);
-  filename = bacon_video_widget_get_channels_file ();
-
-  if (g_file_get_contents (filename, &contents, NULL, NULL) != FALSE) {
-    gchar **lines, *line;
-    guint i;
-
-    lines = g_strsplit (contents, "\n", 0);
-    array = g_ptr_array_new ();
-
-    for (i = 0; lines[i] != NULL; i++) {
-      line = lines[i];
-
-      if (line[0] != '#') {
-	gchar** fields = g_strsplit(line, ":", 0);
-	if ((g_strv_length (fields) == 13 && adapter_type == 'T') ||
-	    (g_strv_length (fields) == 8 && adapter_type == 'S') ||
-	    (g_strv_length (fields) == 9 && adapter_type == 'C') ||
-	    (g_strv_length (fields) == 6 && adapter_type == 'A')) {
-	  g_ptr_array_add (array, g_strdup_printf("dvb://%s", fields[0]));
-	}
-	g_strfreev(fields);
-      }
-    }
-    g_strfreev(lines);
-  } else {
-    return NULL;
-  }
-  if (array->len >= 1)
-    g_ptr_array_add (array, NULL);
-  return (char **) g_ptr_array_free (array, FALSE);
-}
-
 /**
  * bacon_video_widget_get_mrls:
  * @bvw: a #BaconVideoWidget
@@ -4917,10 +4791,6 @@ bacon_video_widget_get_dvb_mrls (const char *device)
  * not exist for the given @type (for the GStreamer backend). *
  * If @device does not exist, a %BVW_ERROR_INVALID_DEVICE error will be returned.
  *
- * If @type is %MEDIA_TYPE_DVB and the DVB channels file (as given by
- * bacon_video_widget_get_channels_file() for the GStreamer backend)
- * does not exist, a %BVW_ERROR_FILE_NOT_FOUND error will be returned.
- *
  * Return value: a %NULL-terminated array of MRLs, or %NULL; free with g_strfreev()
  **/
 gchar **
@@ -4968,7 +4838,9 @@ bacon_video_widget_get_mrls (BaconVideoWidget * bvw,
       break;
     }
     case MEDIA_TYPE_DVB: {
-      gchar *filename;
+      GtkRecentManager *recent_manager;
+      GList *items, *l;
+      GtkRecentInfo *last_info = NULL;
 
       if (!gst_default_registry_check_feature_version ("dvbbasebin", 0, 10, 6) ||
           !gst_default_registry_check_feature_version ("mpegtsparse", 0, 10, 6) ||
@@ -4986,26 +4858,38 @@ bacon_video_widget_get_mrls (BaconVideoWidget * bvw,
                              "XXX Do not use XXX");
 	return NULL;
       }
-
-      filename = g_strdup_printf ("/dev/dvb/adapter%s/frontend0", device);
-      if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
-	g_free (filename);
-	g_set_error_literal (error, BVW_ERROR, BVW_ERROR_INVALID_DEVICE,
-                             "XXX Do not use XXX");
-	return NULL;
+      if (!g_file_test ("/dev/dvb/adapter0/frontend0", G_FILE_TEST_EXISTS)) {
+        g_set_error_literal (error, BVW_ERROR, BVW_ERROR_INVALID_DEVICE,
+            "XXX Do not use XXX");
+        return NULL;
       }
-      g_free (filename);
 
-      filename = bacon_video_widget_get_channels_file ();
-      if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
-	g_free (filename);
-        mrls = bacon_video_widget_get_dvb_mrls (device);
+      recent_manager = gtk_recent_manager_get_default ();
+      items = gtk_recent_manager_get_items (recent_manager);
+      for (l = items; l && l->data; l = l->next) {
+        GtkRecentInfo *info;
+
+        info = (GtkRecentInfo *) l->data;
+
+        if (gtk_recent_info_has_group (info, "Totem")
+            && gtk_recent_info_has_group (info, "gnome-dvb-daemon")) {
+          gtk_recent_info_ref (info);
+          last_info = info;
+          break;
+        }
+      }
+      g_list_foreach (items, (GFunc) gtk_recent_info_unref, NULL);
+      g_list_free (items);
+
+      if (last_info != NULL) {
+        gchar *uri[] = { NULL, NULL };
+        uri[0] = g_strdup (gtk_recent_info_get_uri (last_info));
+        mrls = g_strdupv (uri);
+        g_free (uri[0]);
       } else {
-        GST_DEBUG ("no channels file '%s'", filename);
-	g_set_error_literal (error, BVW_ERROR, BVW_ERROR_FILE_NOT_FOUND,
-                             "XXX Do not use XXX");
-	g_free (filename);
-	return NULL;
+        g_set_error_literal (error, BVW_ERROR, BVW_ERROR_READ_ERROR,
+            "XXX Do not use XXX");
+        return NULL;
       }
       break;
     }
diff --git a/src/totem-dvb-setup.c b/src/totem-dvb-setup.c
index 1012947..e6d25b7 100644
--- a/src/totem-dvb-setup.c
+++ b/src/totem-dvb-setup.c
@@ -26,6 +26,10 @@
 
 #include "totem-dvb-setup.h"
 
+#include <dbus/dbus-glib.h>
+#include <glib/gi18n.h>
+#include <string.h>
+
 #ifdef GDK_WINDOWING_X11
 
 static gboolean in_progress = FALSE;
@@ -33,10 +37,12 @@ static gboolean in_progress = FALSE;
 #include <gdk/gdkx.h>
 #include <sys/wait.h>
 
+#define DBUS_DVB_SERVICE "org.gnome.DVB"
+
 typedef struct {
 	TotemDvbSetupResultFunc func;
-	char *device;
 	gpointer user_data;
+	GtkWindow *parent;
 } TotemDvbSetupHelper;
 
 static const char *
@@ -44,11 +50,115 @@ totem_dvb_setup_helper (void)
 {
 	char *path = NULL;
 
-	if (path == NULL)
-		path = g_build_filename (LIBEXECDIR, "totem-dvb-scanner", NULL);
+	if (path == NULL) {
+		const gchar *path_env;
+		gchar **elements, **elem;
+
+		path_env = g_getenv ("PATH");
+		if (path_env != NULL) {
+			elements = g_strsplit (path_env, ":", 0);
+			for (elem = elements; *elem; elem++) {
+				path = g_build_filename (*elem, "gnome-dvb-setup", NULL);
+				if (g_file_test (path, G_FILE_TEST_EXISTS))
+					break;
+				g_free (path);
+				path = NULL;
+			}
+			g_strfreev (elements);
+		}
+	}
 	return path;
 }
 
+static DBusGConnection *
+get_session_bus ()
+{
+	DBusGConnection *connection;
+	GError *error = NULL;
+
+	/* get bus */
+	connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+	if (connection == NULL) {
+		g_warning ("Could not connect to session bus: %s\n", error->message);
+		g_error_free (error);
+		return NULL;
+	}
+
+	return connection;
+}
+
+static gboolean
+dbus_service_is_available (const gchar *name)
+{
+	DBusGConnection *connection;
+	DBusGProxy *proxy = NULL;
+	GError *error = NULL;
+	gchar **names = NULL;
+	gchar **names_ptr = NULL;
+	gboolean ret = FALSE;
+
+	/* get bus */
+	connection = get_session_bus ();
+	g_return_val_if_fail (connection != NULL, FALSE);
+
+	/* get proxy */
+	proxy = dbus_g_proxy_new_for_name (connection,
+            "org.freedesktop.DBus",
+            "/org/freedesktop/DBus",
+            "org.freedesktop.DBus");
+
+	if (proxy == NULL) {
+		g_warning ("Could not connect to DBus session service\n");
+		return FALSE;
+	}
+
+	if (!dbus_g_proxy_call (proxy, "ListNames", &error,
+			G_TYPE_INVALID,
+			G_TYPE_STRV,
+			&names_ptr,
+			G_TYPE_INVALID))
+	{
+		g_warning ("Error: %s", error->message);
+		g_error_free (error);
+		return FALSE;
+	}
+
+	for (names = names_ptr; *names; names++) {
+		if (strcmp (name, *names) == 0) {
+			ret = TRUE;
+			break;
+		}
+	}
+
+	g_strfreev (names_ptr);
+	names_ptr = NULL;
+
+	/* Same for activatable names */
+	if (ret == FALSE) {
+		if (!dbus_g_proxy_call (proxy, "ListActivatableNames", &error,
+				G_TYPE_INVALID,
+				G_TYPE_STRV,
+				&names_ptr,
+				G_TYPE_INVALID))
+		{
+			g_warning ("Error: %s", error->message);
+			g_error_free (error);
+			return FALSE;
+		}
+
+		for (names = names_ptr; *names; names++) {
+			if (strcmp (name, *names) == 0) {
+				ret = TRUE;
+				break;
+			}
+		}
+
+		g_strfreev (names_ptr);
+	}
+
+	return ret;
+}
+
 static void
 child_watch_func (GPid pid,
 		  gint status,
@@ -62,24 +172,19 @@ child_watch_func (GPid pid,
 	else
 		ret = WEXITSTATUS (status);
 
-	helper->func (ret, helper->device, helper->user_data);
+	helper->func (ret, helper->user_data);
 
 	in_progress = FALSE;
 
-	g_free (helper->device);
 	g_free (helper);
 }
 
-int
-totem_dvb_setup_device (const char *device,
-			GtkWindow *parent,
-			TotemDvbSetupResultFunc func,
-			gpointer user_data)
+static int
+totem_dvb_start_setup (TotemDvbSetupHelper *helper)
 {
 	GPtrArray *arr;
 	char *tmp, **argv;
 	GPid pid;
-	TotemDvbSetupHelper *helper;
 
 	if (in_progress != FALSE)
 		return TOTEM_DVB_SETUP_FAILURE;
@@ -89,9 +194,8 @@ totem_dvb_setup_device (const char *device,
 
 	arr = g_ptr_array_new ();
 	g_ptr_array_add (arr, g_strdup (totem_dvb_setup_helper ()));
-	tmp = g_strdup_printf ("--transient-for=%u", (unsigned int) GDK_WINDOW_XID (GTK_WIDGET (parent)->window));
+	tmp = g_strdup_printf ("--transient-for=%u", (unsigned int) GDK_WINDOW_XID (GTK_WIDGET (helper->parent)->window));
 	g_ptr_array_add (arr, tmp);
-	g_ptr_array_add (arr, g_strdup (device));
 	g_ptr_array_add (arr, NULL);
 
 	argv = (gchar **) arr->pdata;
@@ -104,11 +208,6 @@ totem_dvb_setup_device (const char *device,
 
 	g_ptr_array_free (arr, TRUE);
 
-	helper = g_new (TotemDvbSetupHelper, 1);
-	helper->user_data = user_data;
-	helper->func = func;
-	helper->device = g_strdup (device);
-
 	in_progress = TRUE;
 
 	g_child_watch_add (pid, child_watch_func, helper);
@@ -116,15 +215,52 @@ totem_dvb_setup_device (const char *device,
 	return TOTEM_DVB_SETUP_STARTED_OK;
 }
 
+int
+totem_dvb_setup (GtkWindow *parent, TotemDvbSetupResultFunc func,
+		gpointer user_data)
+{
+	TotemDvbSetupHelper *helper = NULL;
+	int ret;
+
+	/* Check if dvb-daemon is available */
+	if (totem_dvb_daemon_available ()) {
+		/* Start gnome-dvb-setup */
+		helper = g_new (TotemDvbSetupHelper, 1);
+		helper->user_data = user_data;
+		helper->func = func;
+		helper->parent = parent;
+
+		ret = totem_dvb_start_setup (helper);
+	} else {
+		ret = TOTEM_DVB_SETUP_MISSING;
+	}
+
+	if (ret != TOTEM_DVB_SETUP_STARTED_OK && helper != NULL) {
+		g_free (helper);
+	}
+
+	return ret;
+}
+
+gboolean
+totem_dvb_daemon_available (void)
+{
+  return dbus_service_is_available (DBUS_DVB_SERVICE);
+}
+
 #else /* GDK_WINDOWING_X11 */
 
 int
-totem_dvb_setup_device (const char *device,
-			GtkWindow *parent,
-			TotemDvbSetupResultFunc func,
-			gpointer user_data)
+totem_dvb_setup (GtkWindow *parent, TotemDvbSetupResultFunc func,
+		gpointer user_data)
 {
 	return TOTEM_DVB_SETUP_FAILURE;
 }
 
+gboolean
+totem_dvb_daemon_available (void)
+{
+  return FALSE;
+}
+
 #endif /* GDK_WINDOWING_X11 */
diff --git a/src/totem-dvb-setup.h b/src/totem-dvb-setup.h
index ce7387f..7885115 100644
--- a/src/totem-dvb-setup.h
+++ b/src/totem-dvb-setup.h
@@ -35,12 +35,12 @@ enum {
 	TOTEM_DVB_SETUP_SUCCESS
 };
 
-typedef void (*TotemDvbSetupResultFunc) (int result, const char *device, gpointer user_data);
+typedef void (*TotemDvbSetupResultFunc) (int result, gpointer user_data);
 
-int totem_dvb_setup_device (const char *device,
-			    GtkWindow *parent,
-			    TotemDvbSetupResultFunc func,
-			    gpointer user_data);
+int totem_dvb_setup (GtkWindow *parent,
+					 TotemDvbSetupResultFunc func,
+					 gpointer user_data);
+gboolean totem_dvb_daemon_available (void);
 
 G_END_DECLS
 
diff --git a/src/totem-menu.c b/src/totem-menu.c
index ff92161..c8c1fa8 100644
--- a/src/totem-menu.c
+++ b/src/totem-menu.c
@@ -35,6 +35,7 @@
 #include "totem-plugin-manager.h"
 #include "bacon-video-widget.h"
 #include "totem-uri.h"
+#include "totem-dvb-setup.h"
 
 #include "totem-profile.h"
 
@@ -745,17 +746,32 @@ on_play_disc_activate (GtkAction *action, Totem *totem)
 	totem_action_play_media_device (totem, device_path);
 }
 
+static void on_setup_dvb_finished (int result, gpointer user_data)
+{
+    g_message ("DVB SETUP FINISHED: %d\n", result);
+}
+
 /* Play DVB menu items */
 static void
 on_play_dvb_activate (GtkAction *action, Totem *totem)
 {
-	int adapter;
-	char *str;
-
-	adapter = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action), "adapter"));
-	str = g_strdup_printf ("%d", adapter);
-	totem_action_play_media (totem, MEDIA_TYPE_DVB, str);
-	g_free (str);
+	int status;
+	GtkWidget *dialog;
+
+	status = totem_dvb_setup (GTK_WINDOW (totem->win), on_setup_dvb_finished, NULL);
+
+	g_message ("DVB SETUP STARTED: %d\n", status);
+	if (status == TOTEM_DVB_SETUP_MISSING) {
+		dialog = gtk_message_dialog_new (GTK_WINDOW (totem->win),
+			GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+			GTK_MESSAGE_ERROR,
+			GTK_BUTTONS_CLOSE,
+			_("GNOME DVB Daemon is not installed"));
+		g_signal_connect (G_OBJECT (dialog), "response",
+						  G_CALLBACK (gtk_widget_destroy), NULL);
+		gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+		gtk_widget_show (dialog);
+	}
 }
 
 static void
@@ -895,41 +911,22 @@ update_drive_menu_items (GtkMenuItem *movie_menuitem, Totem *totem)
 static void
 update_dvb_menu_items (GtkMenuItem *movie_menuitem, Totem *totem)
 {
-	guint i;
+	char devicenode[] = "/dev/dvb/adapter0/frontend0";
+	char name[] = "dvbdevice";
 
-	for (i = 0 ; i < 8 ; i++) {
-		char *devicenode;
-
-		devicenode = g_strdup_printf("/dev/dvb/adapter%d/frontend0", i);
-
-		if (g_file_test (devicenode, G_FILE_TEST_EXISTS) != FALSE) {
-			char* label, *name, *adapter_name;
-			GtkAction* action;
-
-			/* translators: the index of the adapter
-			 * DVB Adapter 1 */
-			adapter_name = g_strdup_printf (_("DVB Adapter %u"), i);
-			/* translators:
-			 * Watch TV on 'DVB Adapter 1'
-			 * or
-			 * Watch TV on 'Hauppauge Nova-T Stick' */
-			label = g_strdup_printf (_("Watch TV on \'%s\'"), adapter_name);
-			g_free (adapter_name);
-			name = g_strdup_printf ("dvbdevice%d", i);
-			action = gtk_action_new (name, label, NULL, NULL);
-
-			g_object_set (G_OBJECT(action), "icon-name", "totem-tv", "sensitive", TRUE, NULL);
-			gtk_action_group_add_action (totem->devices_action_group, action);
-			g_object_unref (action);
-			gtk_ui_manager_add_ui (totem->ui_manager, totem->devices_ui_id,
-					       "/tmw-menubar/movie/devices-placeholder", name, name,
-					       GTK_UI_MANAGER_MENUITEM, FALSE);
-			g_object_set_data_full (G_OBJECT (action),
-						"adapter", GINT_TO_POINTER (i), NULL);
-			g_signal_connect (G_OBJECT (action), "activate",
-					  G_CALLBACK (on_play_dvb_activate), totem);
-		}
-		g_free (devicenode);
+	if (g_file_test (devicenode, G_FILE_TEST_EXISTS) != FALSE) {
+		GtkAction* action;
+
+		action = gtk_action_new (name, _("Watch TV"), NULL, NULL);
+
+		g_object_set (G_OBJECT(action), "icon-name", "totem-tv", "sensitive", TRUE, NULL);
+		gtk_action_group_add_action (totem->devices_action_group, action);
+		g_object_unref (action);
+		gtk_ui_manager_add_ui (totem->ui_manager, totem->devices_ui_id,
+				       "/tmw-menubar/movie/devices-placeholder", name, name,
+				       GTK_UI_MANAGER_MENUITEM, FALSE);
+		g_signal_connect (G_OBJECT (action), "activate",
+				  G_CALLBACK (on_play_dvb_activate), totem);
 	}
 }
 
diff --git a/src/totem-object.c b/src/totem-object.c
index 2635654..d8b19b0 100644
--- a/src/totem-object.c
+++ b/src/totem-object.c
@@ -1153,14 +1153,6 @@ totem_action_open_dialog (Totem *totem, const char *path, gboolean play)
 	return TRUE;
 }
 
-static void
-totem_dvb_setup_result (int result, const char *device, gpointer user_data)
-{
-	Totem *totem = (Totem *) user_data;
-
-	totem_action_play_media (totem, MEDIA_TYPE_DVB, device);
-}
-
 static gboolean
 totem_action_load_media (Totem *totem, TotemDiscMediaType type, const char *device)
 {
@@ -1196,23 +1188,12 @@ totem_action_load_media (Totem *totem, TotemDiscMediaType type, const char *devi
 			totem_action_error (_("Totem cannot play TV, because no TV adapters are present or they are not supported."),
 					    _("Please insert a supported TV adapter."), totem);
 			return FALSE;
-		/* No channels.conf file */
-		} else if (g_error_matches (error, BVW_ERROR, BVW_ERROR_FILE_NOT_FOUND) != FALSE) {
-			g_assert (type == MEDIA_TYPE_DVB);
-
-			if (totem_dvb_setup_device (device, GTK_WINDOW (totem->win), totem_dvb_setup_result, totem) == TOTEM_DVB_SETUP_STARTED_OK)
-				return FALSE;
-
-			link = "http://www.gnome.org/projects/totem/#dvb";
-			link_text = _("More information about watching TV");
-			msg = g_strdup (_("Totem is missing a channels listing to be able to tune the receiver."));
-			secondary = _("Please follow the instructions provided in the link to create a channels listing.");
-		} else if (g_error_matches (error, BVW_ERROR, BVW_ERROR_DEVICE_BUSY) != FALSE) {
-			g_assert (type == MEDIA_TYPE_DVB);
-			msg = g_strdup_printf(_("Totem cannot play this type of media (%s) because the TV device is busy."), _(totem_cd_get_human_readable_name (type)));
-			totem_action_error (msg, _("Please try again later."), totem);
-			g_free (msg);
-			return FALSE;
+                /* No recently watched channel */
+                } else if (g_error_matches (error, BVW_ERROR, BVW_ERROR_READ_ERROR) != FALSE) {
+                        g_assert (type == MEDIA_TYPE_DVB);
+                        totem_action_error (_("Totem could not find a recently watched channel."),
+                            _("Please choose a channel from the Digital TV sidebar."), totem);
+                        return FALSE;
 		/* Unsupported type (ie. CDDA) */
 		} else if (g_error_matches (error, BVW_ERROR, BVW_ERROR_INVALID_LOCATION) != FALSE) {
 			msg = g_strdup_printf(_("Totem cannot play this type of media (%s) because it is not supported."), _(totem_cd_get_human_readable_name (type)));
@@ -3325,15 +3306,6 @@ on_eos_event (GtkWidget *widget, Totem *totem)
 	if (bacon_video_widget_get_logo_mode (totem->bvw) != FALSE)
 		return FALSE;
 
-	/* EOS on DVB means that we lost the signal */
-	if (totem->mrl != NULL && g_str_has_prefix (totem->mrl, "dvb://") != FALSE) {
-		totem_action_stop (totem);
-		totem_action_error_and_exit (_("TV signal lost"),
-					     _("Please verify your hardware setup."),
-					     totem);
-		return FALSE;
-	}
-
 	if (totem_playlist_has_next_mrl (totem->playlist) == FALSE
 			&& totem_playlist_get_repeat (totem->playlist) == FALSE)
 	{
