Index: backend/bacon-video-widget.h
===================================================================
--- backend/bacon-video-widget.h	(revision 5405)
+++ backend/bacon-video-widget.h	(working copy)
@@ -133,6 +133,8 @@
 gboolean bacon_video_widget_seek_time		 (BaconVideoWidget *bvw,
 						  gint64 time,
 						  GError **error);
+gboolean bacon_video_widget_step		 (BaconVideoWidget *bvw,
+						  GError **error);
 gboolean bacon_video_widget_can_direct_seek	 (BaconVideoWidget *bvw);
 double bacon_video_widget_get_position           (BaconVideoWidget *bvw);
 gint64 bacon_video_widget_get_current_time       (BaconVideoWidget *bvw);
Index: backend/bacon-video-widget-gst-0.10.c
===================================================================
--- backend/bacon-video-widget-gst-0.10.c	(revision 5405)
+++ backend/bacon-video-widget-gst-0.10.c	(working copy)
@@ -2895,6 +2895,22 @@
   return bacon_video_widget_seek_time (bvw, seek_time / GST_MSECOND, error);
 }
 
+gboolean
+bacon_video_widget_step (BaconVideoWidget *bvw, GError **error)
+{
+  int fps;
+  fps = (bvw->priv->video_fps_n + bvw->priv->video_fps_d/2) /
+	  bvw->priv->video_fps_d;
+  g_message ("fps: %d", fps);
+  gst_element_seek (bvw->priv->play, 1.0,
+  		    GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+  		    GST_SEEK_TYPE_CUR, GST_NSECOND / fps,
+  		    GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+  gst_element_get_state (bvw->priv->play, NULL, NULL, 100 * GST_MSECOND);
+
+  return TRUE;
+}
+
 static void
 bvw_stop_play_pipeline (BaconVideoWidget * bvw)
 {
Index: totem.c
===================================================================
--- totem.c	(revision 5405)
+++ totem.c	(working copy)
@@ -2666,6 +2666,10 @@
 		else 
 			totem_action_play_pause (totem);
 		break;
+	case GDK_period:
+		totem_action_pause (totem);
+		bacon_video_widget_step (totem->bvw, NULL);
+		break;
 #ifdef HAVE_XFREE
 	case XF86XK_AudioPause:
 	case XF86XK_AudioStop:
