diff --git a/src/backend/bacon-video-widget-gst-0.10.c b/src/backend/bacon-video-widget-gst-0.10.c
index d429a24..8405827 100644
--- a/src/backend/bacon-video-widget-gst-0.10.c
+++ b/src/backend/bacon-video-widget-gst-0.10.c
@@ -3882,6 +3882,40 @@ bacon_video_widget_can_direct_seek (BaconVideoWidget *bvw)
   return FALSE;
 }
 
+gboolean
+bacon_video_widget_change_rate (BaconVideoWidget *bvw, gdouble rate)
+{
+  GstEvent *event;
+  gboolean retval = FALSE;
+  GstFormat fmt;
+  gint64 cur;
+
+  g_return_val_if_fail (bvw != NULL, FALSE);
+  g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), FALSE);
+  g_return_val_if_fail (GST_IS_ELEMENT (bvw->priv->play), FALSE);
+
+  fmt = GST_FORMAT_TIME;
+
+  if (gst_element_query_position (bvw->priv->play, &fmt, &cur)) {
+    GST_DEBUG ("Setting playback direction to reverse at %"G_GINT64_FORMAT"", cur);
+    event = gst_event_new_seek (rate,
+        fmt, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+        GST_SEEK_TYPE_SET, cur,
+				GST_SEEK_TYPE_SET, GST_CLOCK_TIME_NONE);
+    if (gst_element_send_event (bvw->priv->play, event) == FALSE) {
+      GST_DEBUG ("Failed to change rate");
+    } else {
+      gst_element_get_state (bvw->priv->play, NULL, NULL, GST_CLOCK_TIME_NONE);
+      bvw->priv->rate = rate;
+      GST_DEBUG ("changed rate to %g\n", rate);
+      retval = TRUE;
+    }
+  }
+  else {
+    GST_DEBUG ("failed to query position");
+  }  
+  return retval;
+}
 /**
  * bacon_video_widget_seek_time:
  * @bvw: a #BaconVideoWidget
diff --git a/src/totem-object.c b/src/totem-object.c
index 4b19c46..c996629 100644
--- a/src/totem-object.c
+++ b/src/totem-object.c
@@ -144,6 +144,7 @@ static void totem_object_get_property		(GObject *object,
 static void totem_object_finalize (GObject *totem);
 
 static int totem_table_signals[LAST_SIGNAL] = { 0 };
+static gdouble playback_rate = 1.0;
 
 G_DEFINE_TYPE(TotemObject, totem_object, G_TYPE_OBJECT)
 
@@ -3475,6 +3476,8 @@ totem_action_handle_key_release (Totem *totem, GdkEventKey *event)
 	case GDK_Right:
 		totem_statusbar_set_seeking (TOTEM_STATUSBAR (totem->statusbar), FALSE);
 		totem_time_label_set_seeking (TOTEM_TIME_LABEL (totem->fs->time_label), FALSE);
+    /* reset playback speed to normal */
+    playback_rate = 1.0;
 		break;
 	default:
 		retval = FALSE;
@@ -3656,6 +3659,16 @@ totem_action_handle_key_press (Totem *totem, GdkEventKey *event)
 		totem_action_seek (totem, 0);
 		icon_name = "media-seek-backward-symbolic";
 		break;
+  case GDK_KP_9:
+  case GDK_Page_Up:
+    if (bacon_video_widget_change_rate (totem->bvw, playback_rate + 1.0) == TRUE) 
+      playback_rate = playback_rate + 1.0;
+    break;
+  case GDK_KP_3:
+  case GDK_Page_Down:
+    if (bacon_video_widget_change_rate (totem->bvw, playback_rate - 1.0) == TRUE)
+      playback_rate = playback_rate - 1.0;
+    break;
 	case GDK_Up:
 		if (bacon_video_widget_has_menus (totem->bvw) != FALSE)
 			bacon_video_widget_dvd_event (totem->bvw, BVW_DVD_ROOT_MENU_UP);
