diff --git a/browser-plugin/totem-plugin-viewer.c b/browser-plugin/totem-plugin-viewer.c
index 37f530e..e36ef8a 100644
--- a/browser-plugin/totem-plugin-viewer.c
+++ b/browser-plugin/totem-plugin-viewer.c
@@ -60,8 +60,8 @@ GtkWidget *totem_statusbar_create (void);
 GtkWidget *totem_volume_create (void);
 GtkWidget *totem_pp_create (void);
 
-#define VOLUME_DOWN_OFFSET -8
-#define VOLUME_UP_OFFSET 8
+#define VOLUME_DOWN_OFFSET (-0.08)
+#define VOLUME_UP_OFFSET (0.08)
 
 /* For newer D-Bus version */
 #ifndef DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT
@@ -1295,7 +1295,7 @@ static gboolean
 on_volume_scroll_event (GtkWidget *win, GdkEventScroll *event, TotemEmbedded *emb)
 {
 	GtkWidget *vbut;
-	int vol, offset;
+	double vol, offset;
 
 	switch (event->direction) {
 	case GDK_SCROLL_UP:
@@ -1379,7 +1379,7 @@ totem_embedded_construct (TotemEmbedded *emb,
 	BvwUseType type;
 	GError *err = NULL;
 	GConfClient *gc;
-	int volume;
+	double volume;
 
 	if (xid != 0) {
 		g_assert (!emb->hidden);
@@ -1465,7 +1465,7 @@ totem_embedded_construct (TotemEmbedded *emb,
 			  G_CALLBACK (on_play_pause), emb);
 
 	gc = gconf_client_get_default ();
-	volume = gconf_client_get_int (gc, GCONF_PREFIX"/volume", NULL);
+	volume = ((double) gconf_client_get_int (gc, GCONF_PREFIX"/volume", NULL)) / 100.0;
 	g_object_unref (G_OBJECT (gc));
 
 	bacon_video_widget_set_volume (emb->bvw, volume);
@@ -1745,7 +1745,7 @@ totem_volume_create (void)
 	GtkWidget *widget;
 
 	widget = bacon_volume_button_new (GTK_ICON_SIZE_MENU,
-					  0, 100, 1);
+					  0.0, 1.0, 0.01);
 	gtk_button_set_focus_on_click (GTK_BUTTON (widget), FALSE);
 	gtk_widget_show (widget);
 
diff --git a/data/totem.glade b/data/totem.glade
index e8b7734..78e28f7 100644
--- a/data/totem.glade
+++ b/data/totem.glade
@@ -1603,7 +1603,7 @@ AC3 Passthrough</property>
 	      <property name="digits">1</property>
 	      <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
 	      <property name="inverted">False</property>
-	      <property name="adjustment">0 0 100 1 10 0</property>
+              <property name="adjustment">0 0 1.0 0.01 0.1 0</property>
 	    </widget>
 	    <packing>
 	      <property name="padding">0</property>
diff --git a/src/backend/bacon-video-widget-gst-0.10.c b/src/backend/bacon-video-widget-gst-0.10.c
index 77d174b..1193217 100644
--- a/src/backend/bacon-video-widget-gst-0.10.c
+++ b/src/backend/bacon-video-widget-gst-0.10.c
@@ -1021,7 +1021,7 @@ bacon_video_widget_class_init (BaconVideoWidgetClass * klass)
                                                      0, G_MAXINT, 0,
                                                      G_PARAM_READABLE));
   g_object_class_install_property (object_class, PROP_STREAM_LENGTH,
-                                   g_param_spec_int64 ("stream_length", NULL,
+                                   g_param_spec_int64 ("stream-length", NULL,
                                                      NULL, 0, G_MAXINT64, 0,
                                                      G_PARAM_READABLE));
   g_object_class_install_property (object_class, PROP_PLAYING,
@@ -1033,9 +1033,9 @@ bacon_video_widget_class_init (BaconVideoWidgetClass * klass)
                                                          NULL, FALSE,
                                                          G_PARAM_READABLE));
   g_object_class_install_property (object_class, PROP_VOLUME,
-                                     g_param_spec_int ("volume", NULL, NULL,
-                                                     0, 100, 0,
-                                                     G_PARAM_READABLE));
+                                   g_param_spec_double ("volume", NULL, NULL,
+                                                        0.0, 1.0, 0.0,
+                                                        G_PARAM_READWRITE));
   g_object_class_install_property (object_class, PROP_SHOWCURSOR,
                                    g_param_spec_boolean ("showcursor", NULL,
                                                          NULL, FALSE,
@@ -1962,6 +1962,9 @@ bacon_video_widget_set_property (GObject * object, guint property_id,
       bacon_video_widget_set_show_visuals (bvw,
       g_value_get_boolean (value));
       break;
+    case PROP_VOLUME:
+      bacon_video_widget_set_volume (bvw, g_value_get_double (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -2001,7 +2004,7 @@ bacon_video_widget_get_property (GObject * object, guint property_id,
       bacon_video_widget_get_show_cursor (bvw));
       break;
     case PROP_VOLUME:
-      g_value_set_int (value, bacon_video_widget_get_volume (bvw));
+      g_value_set_double (value, bacon_video_widget_get_volume (bvw));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -3170,33 +3173,31 @@ bacon_video_widget_can_set_volume (BaconVideoWidget * bvw)
 }
 
 void
-bacon_video_widget_set_volume (BaconVideoWidget * bvw, int volume)
+bacon_video_widget_set_volume (BaconVideoWidget * bvw, double volume)
 {
-  g_return_if_fail (bvw != NULL);
   g_return_if_fail (BACON_IS_VIDEO_WIDGET (bvw));
   g_return_if_fail (GST_IS_ELEMENT (bvw->priv->play));
 
   if (bacon_video_widget_can_set_volume (bvw) != FALSE)
   {
-    volume = CLAMP (volume, 0, 100);
+    volume = CLAMP (volume, 0.0, 1.0);
     g_object_set (bvw->priv->play, "volume",
-                  (gdouble) (1. * volume / 100), NULL);
+                  (gdouble) volume, NULL);
     g_object_notify (G_OBJECT (bvw), "volume");
   }
 }
 
-int
+double
 bacon_video_widget_get_volume (BaconVideoWidget * bvw)
 {
-  gdouble vol;
+  double vol;
 
-  g_return_val_if_fail (bvw != NULL, -1);
-  g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), -1);
-  g_return_val_if_fail (GST_IS_ELEMENT (bvw->priv->play), -1);
+  g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), 0.0);
+  g_return_val_if_fail (GST_IS_ELEMENT (bvw->priv->play), 0.0);
 
   g_object_get (G_OBJECT (bvw->priv->play), "volume", &vol, NULL);
 
-  return (gint) (vol * 100 + 0.5);
+  return vol;
 }
 
 gboolean
diff --git a/src/backend/bacon-video-widget-xine.c b/src/backend/bacon-video-widget-xine.c
index bf93cb0..2f5258c 100644
--- a/src/backend/bacon-video-widget-xine.c
+++ b/src/backend/bacon-video-widget-xine.c
@@ -169,7 +169,7 @@ struct BaconVideoWidgetPrivate {
 	/* Other stuff */
 	int xpos, ypos;
 	guint tick_id;
-	int volume;
+	double volume;
 	BaconVideoWidgetAudioOutType audio_out_type;
 	TvOutType tvout;
 	int stream_length;
@@ -330,9 +330,10 @@ bacon_video_widget_class_init (BaconVideoWidgetClass *klass)
 	g_object_class_install_property (object_class, PROP_SEEKABLE,
 			g_param_spec_boolean ("seekable", NULL, NULL,
 				FALSE, G_PARAM_READABLE));
-	g_object_class_install_property (object_class, PROP_VOLUME,
-			g_param_spec_int ("volume", NULL, NULL,
-				0, 100, 0, G_PARAM_READABLE));
+        g_object_class_install_property (object_class, PROP_VOLUME,
+                        g_param_spec_double ("volume", NULL, NULL,
+                                0.0, 1.0, 0.0,
+                                G_PARAM_READWRITE));
 	g_object_class_install_property (object_class, PROP_SHOWCURSOR,
 			g_param_spec_boolean ("showcursor", NULL, NULL,
 				FALSE, G_PARAM_READWRITE));
@@ -430,7 +431,7 @@ bacon_video_widget_init (BaconVideoWidget *bvw)
 	bvw->priv = g_new0 (BaconVideoWidgetPrivate, 1);
 	bvw->priv->xine = xine_new ();
 	bvw->priv->cursor_shown = TRUE;
-	bvw->priv->volume = 0;
+	bvw->priv->volume = 0.0;
 
 	bvw->priv->init_width = 0;
 	bvw->priv->init_height = 0;
@@ -1625,8 +1626,11 @@ bacon_video_widget_unrealize (GtkWidget *widget)
 	/* Save the current volume */
 	if (bacon_video_widget_can_set_volume (bvw) != FALSE)
 	{
+                int vol;
+
+                vol = (bvw->priv->volume * 100.0 + 0.5);
 		gconf_client_set_int (bvw->priv->gc, GCONF_PREFIX"/volume",
-				bvw->priv->volume, NULL);
+				CLAMP (vol, 0, 100), NULL);
 	}
 
 	/* Kill the TV out */
@@ -2631,6 +2635,9 @@ bacon_video_widget_set_property (GObject *object, guint property_id,
 		bacon_video_widget_set_show_visuals (bvw,
 				g_value_get_boolean (value));
 		break;
+        case PROP_VOLUME:
+                bacon_video_widget_set_volume (bvw, g_value_get_double (value));
+                break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 	}
@@ -2670,7 +2677,7 @@ bacon_video_widget_get_property (GObject *object, guint property_id,
 				bacon_video_widget_get_show_cursor (bvw));
 		break;
 	case PROP_VOLUME:
-		g_value_set_int (value, bvw->priv->volume);
+		g_value_set_double (value, bvw->priv->volume);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -2842,31 +2849,31 @@ bacon_video_widget_can_set_volume (BaconVideoWidget *bvw)
 }
 
 void
-bacon_video_widget_set_volume (BaconVideoWidget *bvw, int volume)
+bacon_video_widget_set_volume (BaconVideoWidget *bvw, double volume)
 {
-	g_return_if_fail (bvw != NULL);
 	g_return_if_fail (BACON_IS_VIDEO_WIDGET (bvw));
 	g_return_if_fail (bvw->priv->xine != NULL);
 
 	if (bacon_video_widget_can_set_volume (bvw) != FALSE)
 	{
+		bvw->priv->volume = volume;
+
+                volume = volume * 100 + 0.5;
 		volume = CLAMP (volume, 0, 100);
 		xine_set_param (bvw->priv->stream,
 				XINE_PARAM_AUDIO_AMP_LEVEL, volume);
-		bvw->priv->volume = volume;
 		g_object_notify (G_OBJECT (bvw), "volume");
 	}
 }
 
-int
+double
 bacon_video_widget_get_volume (BaconVideoWidget *bvw)
 {
-	g_return_val_if_fail (bvw != NULL, 0);
-	g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), 0);
-	g_return_val_if_fail (bvw->priv->xine != NULL, 0);
+	g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), 0.0);
+	g_return_val_if_fail (bvw->priv->xine != NULL, 0.0);
 
 	if (bacon_video_widget_can_set_volume (bvw) == FALSE)
-		return 0;
+		return 0.0;
 
 	return bvw->priv->volume;
 }
diff --git a/src/backend/bacon-video-widget.h b/src/backend/bacon-video-widget.h
index c98e68f..61285fc 100644
--- a/src/backend/bacon-video-widget.h
+++ b/src/backend/bacon-video-widget.h
@@ -145,8 +145,8 @@ void bacon_video_widget_close                    (BaconVideoWidget *bvw);
 /* Audio volume */
 gboolean bacon_video_widget_can_set_volume       (BaconVideoWidget *bvw);
 void bacon_video_widget_set_volume               (BaconVideoWidget *bvw,
-						  int volume);
-int bacon_video_widget_get_volume                (BaconVideoWidget *bvw);
+						  double volume);
+double bacon_video_widget_get_volume             (BaconVideoWidget *bvw);
 
 /* Properties */
 void bacon_video_widget_set_logo		 (BaconVideoWidget *bvw,
diff --git a/src/bacon-volume.c b/src/bacon-volume.c
index dee0188..b6790d3 100644
--- a/src/bacon-volume.c
+++ b/src/bacon-volume.c
@@ -46,7 +46,7 @@ struct _BaconVolumeButton {
   GtkTooltips *tooltips;
   GtkIconSize size;
   gint click_id;
-  float direction;
+  double direction;
   guint32 pop_time;
   guint timeout : 1;
   guint icon : 3;
@@ -84,8 +84,8 @@ static void	bacon_volume_scale_value_changed(GtkRange       * range);
 
 /* see below for scale definitions */
 static GtkWidget *bacon_volume_scale_new	(BaconVolumeButton * button,
-						 float min, float max,
-						 float step);
+						 double min, double max,
+						 double step);
 
 static GtkButtonClass *parent_class;
 static guint signals[NUM_SIGNALS];
@@ -174,8 +174,8 @@ bacon_volume_button_dispose (GObject *object)
 
 GtkWidget *
 bacon_volume_button_new (GtkIconSize size,
-			 float min, float max,
-			 float step)
+			 double min, double max,
+			 double step)
 {
   BaconVolumeButton *button;
   GtkWidget *frame, *box;
@@ -245,7 +245,7 @@ bacon_volume_button_new (GtkIconSize size,
   return GTK_WIDGET (button);
 }
 
-float
+double
 bacon_volume_button_get_value (BaconVolumeButton * button)
 {
   g_return_val_if_fail (button != NULL, 0);
@@ -255,7 +255,7 @@ bacon_volume_button_get_value (BaconVolumeButton * button)
 
 void
 bacon_volume_button_set_value (BaconVolumeButton * button,
-			       float value)
+			       double value)
 {
   g_return_if_fail (button != NULL);
 
@@ -272,7 +272,7 @@ bacon_volume_button_scroll (GtkWidget      * widget,
 {
   BaconVolumeButton *button = BACON_VOLUME_BUTTON (widget);
   GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
-  float d;
+  double d;
 
   if (event->type != GDK_SCROLL)
     return FALSE;
@@ -299,7 +299,7 @@ bacon_volume_button_press (GtkWidget      * widget,
   BaconVolumeButton *button = BACON_VOLUME_BUTTON (widget);
   GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
   gint x, y, m, dx, dy, sx, sy, ystartoff, mouse_y;
-  float v;
+  double v;
   GdkEventButton *e;
   GdkDisplay *display;
   GdkScreen *screen;
@@ -386,7 +386,7 @@ bacon_volume_key_release (GtkWidget      * widget,
   BaconVolumeButton *button = BACON_VOLUME_BUTTON (widget);
   GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
   gint x, y, m, dx, dy, sx, sy, ystartoff;
-  float v;
+  double v;
   GdkDisplay *display;
   GdkScreen *screen;
 
@@ -457,7 +457,7 @@ cb_button_timeout (gpointer data)
 {
   BaconVolumeButton *button = BACON_VOLUME_BUTTON (data);
   GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE (button->scale));
-  float val;
+  double val;
   gboolean res = TRUE;
 
   if (button->click_id == 0)
@@ -666,8 +666,8 @@ bacon_volume_scale_class_init (GtkVScaleClass * klass)
 
 static GtkWidget *
 bacon_volume_scale_new (BaconVolumeButton * button,
-			float min, float max,
-			float step)
+			double min, double max,
+			double step)
 {
   BaconVolumeScale *scale = g_object_new (BACON_TYPE_VOLUME_SCALE, NULL);
   GtkObject *adj;
@@ -733,9 +733,9 @@ bacon_volume_button_update_icon (BaconVolumeButton *button)
     "audio-volume-high"
   };
   GtkRange *range = GTK_RANGE (button->scale);
-  float val = gtk_range_get_value (range);
+  double val = gtk_range_get_value (range);
   GtkAdjustment *adj;
-  float step;
+  double step;
   guint icon;
 
   adj = gtk_range_get_adjustment (range);
@@ -763,7 +763,7 @@ static void
 bacon_volume_button_update_tip (BaconVolumeButton *button)
 {
   GtkRange *range = GTK_RANGE (button->scale);
-  float val = gtk_range_get_value (range);
+  double val = gtk_range_get_value (range);
   GtkAdjustment *adj;
   char *str;
 
diff --git a/src/bacon-volume.h b/src/bacon-volume.h
index ec9f636..8c53429 100644
--- a/src/bacon-volume.h
+++ b/src/bacon-volume.h
@@ -46,11 +46,11 @@ typedef struct _BaconVolumeButtonClass {
 GType		bacon_volume_button_get_type	(void);
 
 GtkWidget *	bacon_volume_button_new		(GtkIconSize size,
-						 float min, float max,
-						 float step);
-float		bacon_volume_button_get_value	(BaconVolumeButton * button);
+						 double min, double max,
+						 double step);
+double  	bacon_volume_button_get_value	(BaconVolumeButton * button);
 void		bacon_volume_button_set_value	(BaconVolumeButton * button,
-						 float value);
+						 double value);
 
 G_END_DECLS
 
diff --git a/src/totem-private.h b/src/totem-private.h
index 7a58ea1..a74b515 100644
--- a/src/totem-private.h
+++ b/src/totem-private.h
@@ -181,8 +181,8 @@ GtkWidget *totem_volume_create (void);
 #define SEEK_FORWARD_OFFSET 60
 #define SEEK_BACKWARD_OFFSET -15
 
-#define VOLUME_DOWN_OFFSET -8
-#define VOLUME_UP_OFFSET 8
+#define VOLUME_DOWN_OFFSET (-0.08)
+#define VOLUME_UP_OFFSET (0.08)
 
 #define ZOOM_IN_OFFSET 1
 #define ZOOM_OUT_OFFSET -1
diff --git a/src/totem.c b/src/totem.c
index 5f9733d..50714e5 100644
--- a/src/totem.c
+++ b/src/totem.c
@@ -87,6 +87,8 @@
 
 #define BVW_VBOX_BORDER_WIDTH 1
 
+#define VOLUME_EPSILON (0.005)
+
 static const GtkTargetEntry target_table[] = {
 	{ "text/uri-list", 0, 0 },
 	{ "_NETSCAPE_URL", 0, 1 },
@@ -211,10 +213,13 @@ totem_action_exit (Totem *totem)
 		gdk_display_sync (display);
 
 	if (totem->bvw) {
+                int vol;
+
+                vol = bacon_video_widget_get_volume (totem->bvw) * 100.0 + 0.5;
 		//FIXME move the volume to the static file?
 		gconf_client_set_int (totem->gc,
 				GCONF_PREFIX"/volume",
-				bacon_video_widget_get_volume (totem->bvw),
+				CLAMP (vol, 0, 100),
 				NULL);
 		totem_action_save_size (totem);
 	}
@@ -929,8 +934,8 @@ totem_action_set_mrl_with_warning (Totem *totem, const char *mrl,
 		caps = bacon_video_widget_can_set_volume (totem->bvw);
 		totem_main_set_sensitivity ("tcw_volume_button", caps);
 		totem_main_set_sensitivity ("tcw_volume_hbox", caps);
-		totem_action_set_sensitivity ("volume-up", caps && totem->prev_volume < 100);
-		totem_action_set_sensitivity ("volume-down", caps && totem->prev_volume > 0);
+		totem_action_set_sensitivity ("volume-up", caps && totem->prev_volume < 1.0 - VOLUME_EPSILON);
+		totem_action_set_sensitivity ("volume-down", caps && totem->prev_volume > VOLUME_EPSILON);
 		totem->volume_sensitive = caps;
 
 		/* Take a screenshot */
@@ -1143,9 +1148,9 @@ totem_action_zoom_reset (Totem *totem)
 }
 
 void
-totem_action_volume_relative (Totem *totem, int off_pct)
+totem_action_volume_relative (Totem *totem, double off_pct)
 {
-	int vol;
+	float vol;
 
 	if (bacon_video_widget_can_set_volume (totem->bvw) == FALSE)
 		return;
@@ -1545,25 +1550,27 @@ vol_slider_released_cb (GtkWidget *widget, GdkEventButton *event, Totem *totem)
 static void
 update_volume_sliders (Totem *totem)
 {
-	int volume;
+        float vol;
+        int volume;
 	GtkAction *action;
 
-	volume = bacon_video_widget_get_volume (totem->bvw);
+        vol = bacon_video_widget_get_volume (totem->bvw);
+	volume = (int) (vol * 100.0 + 0.5);
+        volume = CLAMP (volume, 0, 100);
 
 	if (totem->volume_first_time || (totem->prev_volume != volume &&
 				totem->prev_volume != -1 && volume != -1))
 	{
 		totem->volume_first_time = 0;
 		bacon_volume_button_set_value (
-			BACON_VOLUME_BUTTON (totem->volume), (float) volume);
-		gtk_adjustment_set_value (totem->fs_voladj,
-				(float) volume);
+			BACON_VOLUME_BUTTON (totem->volume), vol);
+		gtk_adjustment_set_value (totem->fs_voladj, vol);
 
 		action = gtk_action_group_get_action (totem->main_action_group, "volume-down");
-		gtk_action_set_sensitive (action, volume > 0 && totem->volume_sensitive);
+		gtk_action_set_sensitive (action, vol > VOLUME_EPSILON && totem->volume_sensitive);
 		
 		action = gtk_action_group_get_action (totem->main_action_group, "volume-up");
-		gtk_action_set_sensitive (action, volume < 100 && totem->volume_sensitive);
+		gtk_action_set_sensitive (action, volume < (1.0 - VOLUME_EPSILON) && totem->volume_sensitive);
 	}
 
 	totem->prev_volume = volume;
@@ -1655,17 +1662,17 @@ vol_cb (GtkWidget *widget, Totem *totem)
 	{
 		totem->vol_lock = TRUE;
 
-		if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "fs")) != FALSE)
+		if (g_object_get_data (G_OBJECT (widget), "fs") != NULL)
 		{
 			bacon_video_widget_set_volume
-				(totem->bvw, (gint) totem->fs_voladj->value);
+				(totem->bvw, totem->fs_voladj->value);
 
 			/* Update the fullscreen volume adjustment */
 			bacon_volume_button_set_value (
 				BACON_VOLUME_BUTTON (totem->volume),
 				gtk_adjustment_get_value (totem->fs_voladj));
 		} else {
-			int value = bacon_volume_button_get_value (
+			double value = bacon_volume_button_get_value (
 				BACON_VOLUME_BUTTON (totem->volume));
 
 			bacon_video_widget_set_volume (totem->bvw, value);
@@ -1897,13 +1904,13 @@ totem_action_next_angle (Totem *totem)
 static void
 on_volume_mute_button (GtkButton *button, Totem *totem)
 {
-	totem_action_volume_relative (totem, -100);
+	totem_action_volume_relative (totem, -1.0);
 }
 
 static void
 on_volume_max_button (GtkButton *button, Totem *totem)
 {
-	totem_action_volume_relative (totem, 100);
+	totem_action_volume_relative (totem, 1.0);
 }
 
 void
@@ -2052,7 +2059,7 @@ totem_action_remote (Totem *totem, TotemRemoteCommand cmd, const char *url)
 		// TODO - how to see if can, and play the DVD (like the menu item)
 		break;
 	case TOTEM_REMOTE_COMMAND_MUTE:
-		totem_action_volume_relative (totem, -100);
+		totem_action_volume_relative (totem, -1.0);
 		break;
 	default:
 		handled = FALSE;
@@ -3258,8 +3265,8 @@ video_widget_create (Totem *totem)
 	gtk_widget_show (GTK_WIDGET (totem->bvw));
 
 	bacon_video_widget_set_volume (totem->bvw,
-			gconf_client_get_int (totem->gc,
-				GCONF_PREFIX"/volume", NULL));
+			((double) gconf_client_get_int (totem->gc,
+				GCONF_PREFIX"/volume", NULL)) / 100.0);
 	g_signal_connect (G_OBJECT (totem->bvw), "notify::volume",
 			G_CALLBACK (property_notify_cb_volume), totem);
 	g_signal_connect (G_OBJECT (totem->bvw), "notify::logo-mode",
@@ -3298,7 +3305,7 @@ totem_volume_create (void)
 	GtkWidget *widget;
 
 	widget = bacon_volume_button_new (GTK_ICON_SIZE_SMALL_TOOLBAR,
-					  0, 100, 1);
+					  0.0, 1.0, 0.01);
 	gtk_widget_set_sensitive (widget, FALSE);
 	gtk_widget_show (widget);
 
diff --git a/src/totem.h b/src/totem.h
index 52f53d3..80dc022 100644
--- a/src/totem.h
+++ b/src/totem.h
@@ -122,7 +122,7 @@ void	totem_action_next			(Totem *totem);
 void	totem_action_previous			(Totem *totem);
 void	totem_action_seek_time			(Totem *totem, gint64 sec);
 void	totem_action_seek_relative		(Totem *totem, int off_sec);
-void	totem_action_volume_relative		(Totem *totem, int off_pct);
+void	totem_action_volume_relative		(Totem *totem, double off_pct);
 gboolean totem_action_set_mrl			(Totem *totem,
 						 const char *mrl);
 void	totem_action_set_mrl_and_play		(Totem *totem,
