diff --git a/configure.ac b/configure.ac
index 2038fae..d33879c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -56,7 +56,7 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
 if $PKG_CONFIG --exists gstreamer-0.10 '>=' $GSTREAMER_MIN_VERSION ; then
    AC_MSG_RESULT(yes)
    build_recorder=true
-   recorder_modules="gstreamer-0.10 gstreamer-base-0.10 x11"
+   recorder_modules="gstreamer-0.10 gstreamer-base-0.10 clutter-gst-1.0 x11"
    PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes)
 else
    AC_MSG_RESULT(no)
diff --git a/src/shell-recorder.c b/src/shell-recorder.c
index 9df14d3..043af96 100644
--- a/src/shell-recorder.c
+++ b/src/shell-recorder.c
@@ -15,6 +15,10 @@
 
 #include <clutter/x11/clutter-x11.h>
 #include <X11/extensions/Xfixes.h>
+#include <clutter-gst/clutter-gst.h>
+
+void create_webcam_overlay(ShellRecorder *recorder);
+void delete_webcam_overlay(ShellRecorder *recorder);
 
 typedef enum {
   RECORDER_STATE_CLOSED,
@@ -55,6 +59,8 @@ struct _ShellRecorder {
   int xfixes_event_base;
 
   CoglHandle *recording_icon; /* icon shown while playing */
+  ClutterActor *webcam_overlay;
+  GstElement *webcam_pipeline;
 
   cairo_surface_t *cursor_image;
   int cursor_hot_x;
@@ -207,6 +213,42 @@ create_recording_icon (void)
   return texture;
 }
 
+//TODO: hardcoded webcam overlay dimensions
+#define webcam_width (recorder->stage_width/6)
+#define webcam_height (recorder->stage_height/6)
+
+void create_webcam_overlay(ShellRecorder *recorder) {
+
+  recorder->webcam_overlay = clutter_texture_new();
+  clutter_actor_show (recorder->webcam_overlay);
+
+  clutter_container_add_actor (CLUTTER_CONTAINER (recorder->stage), recorder->webcam_overlay);
+
+//TODO: hardcoded webcam overlay positioning on the stage
+  clutter_actor_set_position(recorder->webcam_overlay, (recorder->stage_width - 1.3*webcam_width), (recorder->stage_height - 1.3*webcam_height));
+  clutter_actor_set_size(recorder->webcam_overlay, webcam_width, webcam_height);
+  clutter_actor_set_opacity(recorder->webcam_overlay, 230);//TODO: hardcoded webcam opacity
+
+  GstElement* videosink = clutter_gst_video_sink_new ((ClutterTexture *) recorder->webcam_overlay);
+  GstElement* v4l2src = gst_element_factory_make ("v4l2src", NULL);
+  GstElement* ffmpegcolor = gst_element_factory_make ("ffmpegcolorspace", NULL);
+
+  g_object_set(G_OBJECT(v4l2src), "device", "/dev/video0", NULL); //TODO: hardcoded webcam video device
+
+  recorder->webcam_pipeline = gst_pipeline_new ("webcam");
+
+  gst_bin_add_many (GST_BIN (recorder->webcam_pipeline), v4l2src, ffmpegcolor, videosink, NULL);
+  gst_element_link_many (v4l2src, ffmpegcolor, videosink, NULL);
+
+  gst_element_set_state(recorder->webcam_pipeline, GST_STATE_PLAYING);
+}
+
+void delete_webcam_overlay(ShellRecorder *recorder){
+  gst_element_set_state(recorder->webcam_pipeline, GST_STATE_NULL);
+  gst_object_unref (recorder->webcam_pipeline);
+  clutter_container_remove_actor (CLUTTER_CONTAINER (recorder->stage), recorder->webcam_overlay);
+}
+
 static guint
 get_memory_target (void)
 {
@@ -861,6 +903,10 @@ recorder_set_stage (ShellRecorder *recorder,
       clutter_stage_ensure_current (stage);
 
       recorder_get_initial_cursor_position (recorder);
+      if (recorder->webcam_overlay){
+        clutter_container_add_actor (CLUTTER_CONTAINER (recorder->stage), recorder->webcam_overlay);
+      }
+
     }
 }
 
@@ -1656,6 +1702,8 @@ shell_recorder_record (ShellRecorder *recorder)
   g_return_val_if_fail (recorder->stage != NULL, FALSE);
   g_return_val_if_fail (recorder->state != RECORDER_STATE_RECORDING, FALSE);
 
+  create_webcam_overlay(recorder);
+
   if (recorder->current_pipeline)
     {
       /* Adjust the start time so that the times in the stream ignore the
@@ -1704,6 +1752,8 @@ shell_recorder_pause (ShellRecorder *recorder)
   g_return_if_fail (SHELL_IS_RECORDER (recorder));
   g_return_if_fail (recorder->state == RECORDER_STATE_RECORDING);
 
+  delete_webcam_overlay(recorder);
+
   recorder_remove_update_pointer_timeout (recorder);
   /* We want to record one more frame since some time may have
    * elapsed since the last frame
