diff --git a/src/bumblebee.cpp b/src/bumblebee.cpp
index 6cbcfe5d1775ae4b3550765e2d796728651b139f..b09249ad79406f1b79555bf083da4b999619a014 100755
--- a/src/bumblebee.cpp
+++ b/src/bumblebee.cpp
@@ -58,13 +58,25 @@ void CBumblebee::set_config(unsigned int *left_off,unsigned int *top_off,unsigne
   }
   this->mode=DC1394_VIDEO_MODE_FORMAT7_3;
   // configure the camera
-  if(this->stereo_coding==MONO)
+  if(this->stereo_coding==MONO)// the image sensor is mono
   {
     this->coding=MONO;
     dc1394_coding=DC1394_COLOR_CODING_MONO16;
   }
-  else
+  else// the image sensor is color
   {
+    if(coding==RAW)// the desired coding is RAW
+    {
+      this->stereo_depth=DEPTH8;
+      this->stereo_coding=RAW;
+    }
+    else if(coding==RGB)
+    {
+      this->stereo_depth=DEPTH24;
+      this->stereo_coding=RGB;
+    }
+    else
+      throw CFirewireCameraException(_HERE_,"Invalid color coding");
     this->coding=RAW;
     dc1394_coding=DC1394_COLOR_CODING_RAW16;
   }
@@ -194,7 +206,7 @@ void CBumblebee::get_stereo_image(char **left,char **right)
     }
     else
     {
-      depth = (int)ceil((float)this->depth/8.0);
+      depth = (int)ceil((float)this->stereo_depth/8.0);
       *left = new char[this->width*this->height*depth];
       *right = new char[this->width*this->height*depth];
       memcpy(*left,de_interleaved,this->width*this->height*depth);
@@ -249,7 +261,7 @@ void CBumblebee::get_stereo_image(char **left,char **right)
     }
     else
     {
-      depth = (int)ceil((float)this->depth/8.0);
+      depth = (int)ceil((float)this->stereo_depth/8.0);
       *left = new char[this->width*this->height*depth];
       *right = new char[this->width*this->height*depth];
       memcpy(*left,de_interleaved,this->width*this->height*depth);
@@ -260,6 +272,127 @@ void CBumblebee::get_stereo_image(char **left,char **right)
   }
 }
 
+void Cbumblebee::get_stereo_image_shared(char *left,char *right)
+{
+  int depth;
+  dc1394error_t error;
+  dc1394video_frame_t *frame;
+  unsigned char *de_interleaved,*RGB_image;
+
+  if ( *left != NULL || *right != NULL)
+  {
+    DEBUG_INFO("Invalid image buffer.\n");
+    /* handle error */
+    throw CFirewireCameraException(_HERE_,"Invalid image buffer. Please provide an unallocated memory buffer.");
+  }
+  DEBUG_INFO("Capturing a new image ... ");
+  if ( this->one_shot_mode == DC1394_ON )
+  {
+    /* set the one shot mode */
+    DEBUG_INFO("Setting the one shot mode ... ");
+    error = dc1394_video_set_one_shot(this->camera_handle,DC1394_ON);
+    if ( error != DC1394_SUCCESS )
+    {
+      DEBUG_INFO("failed\n");
+      /* handle the error */
+      throw CFirewireInternalException(_HERE_,error);
+    }
+    DEBUG_INFO("ok\n");
+    DEBUG_INFO("Dequeuing a DMA buffer ... ");
+    error = dc1394_capture_dequeue(this->camera_handle,DC1394_CAPTURE_POLICY_WAIT,&frame);
+    if ( error != DC1394_SUCCESS )
+    {
+      DEBUG_INFO("failed\n");
+      /* handle error */
+      throw CFirewireInternalException(_HERE_,error);
+    }
+    depth = (int)ceil((float)this->depth/8.0);
+    de_interleaved=new unsigned char[this->width*this->height*depth];
+    // de-interlace the 16 bit data into 2 bayer tile pattern images
+    dc1394_deinterlace_stereo( (unsigned char *)frame->image,
+                               de_interleaved,
+                               this->width,
+                               2*this->height);
+
+    if(this->stereo_coding==RGB)
+    {
+      depth = (int)ceil((float)this->stereo_depth/8.0);
+      RGB_image=new unsigned char[this->width*2*this->height*depth];
+      // extract color from the bayer tile image
+      // note: this will alias colors on the top and bottom rows
+      dc1394_bayer_decoding_8bit( de_interleaved,
+                                  RGB_image,
+                                  this->width,
+                                  2*this->height,
+                                  this->bayer_pattern,
+                                  DC1394_BAYER_METHOD_NEAREST);
+
+      memcpy(left,RGB_image,this->width*this->height*depth);
+      memcpy(right,RGB_image+this->height*this->width*depth,this->width*this->height*depth);
+      delete[] RGB_image;
+    }
+    else
+    {
+      depth = (int)ceil((float)this->stereo_depth/8.0);
+      memcpy(left,de_interleaved,this->width*this->height*depth);
+      memcpy(right,de_interleaved+this->height*this->width*depth,this->width*this->height*depth);
+    }
+    if(this->frame_buffer!=NULL)
+      delete[] this->frame_buffer;
+    depth = (int)ceil((float)this->depth/8.0);
+    this->frame_buffer = new char[this->width*this->height*depth];
+    memcpy(this->frame_buffer,frame->image,this->width*this->height*this->depth/8.0);
+    DEBUG_INFO("ok\n");
+    DEBUG_INFO("Freeing the DMA buffer ... ");
+    error = dc1394_capture_enqueue(this->camera_handle,frame);
+    if ( error != DC1394_SUCCESS )
+    {
+      DEBUG_INFO("failed\n");
+      /* handle error */
+      throw CFirewireInternalException(_HERE_,error);
+    }
+    DEBUG_INFO("ok\n");
+    delete[] de_interleaved;
+  }
+  else
+  {
+    this->image_access.enter();
+    depth = (int)ceil((float)this->depth/8.0);
+    de_interleaved=new unsigned char[this->width*this->height*depth];
+    // de-interlace the 16 bit data into 2 bayer tile pattern images
+    dc1394_deinterlace_stereo( (unsigned char *)this->frame_buffer,
+                               de_interleaved,
+                               this->width,
+                               2*this->height);
+
+    if(this->stereo_coding==RGB)
+    {
+      depth = (int)ceil((float)this->stereo_depth/8.0);
+      RGB_image=new unsigned char[this->width*2*this->height*depth];
+      // extract color from the bayer tile image
+      // note: this will alias colors on the top and bottom rows
+      dc1394_bayer_decoding_8bit( de_interleaved,
+                                  RGB_image,
+                                  this->width,
+                                  2*this->height,
+                                  this->bayer_pattern,
+                                  DC1394_BAYER_METHOD_NEAREST);
+
+      memcpy(left,RGB_image,this->width*this->height*depth);
+      memcpy(right,RGB_image+this->width*this->height*depth,this->width*this->height*depth);
+      delete[] RGB_image;
+    }
+    else
+    {
+      depth = (int)ceil((float)this->stereo_depth/8.0);
+      memcpy(left,de_interleaved,this->width*this->height*depth);
+      memcpy(right,de_interleaved+this->height*this->width*depth,this->width*this->height*depth);
+    }
+    this->image_access.exit();
+    delete[] de_interleaved;
+  }
+}
+
 void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right)
 {
   std::string header,name;
@@ -287,7 +420,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right
     header+=" ";
     header+=text.str();
     header+='\n';
-    if ( this->depth == DEPTH48 )
+    if ( this->stereo_depth == DEPTH48 )
       header+="65535\n";
     else
       header+="255\n";
@@ -302,7 +435,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right
     header+=" ";
     header+=text.str();
     header+='\n';
-    if ( this->depth == DEPTH16 )
+    if ( this->stereo_depth == DEPTH16 )
       header+="65535\n";
     else
       header+="255\n";
@@ -310,7 +443,7 @@ void CBumblebee::save_stereo_image(std::string &filename,char *left, char *right
   depth = (int)ceil((float)this->stereo_depth/8.0);
   write(file_left,header.c_str(),header.size());
   write(file_right,header.c_str(),header.size());
-  for( i =  0 ; i < this->height ; i++ )
+  for( i = 0 ; i < this->height ; i++ )
   {
     write(file_left,&left[i*this->width*depth],this->width*depth);
     write(file_right,&right[i*this->width*depth],this->width*depth);
diff --git a/src/bumblebee.h b/src/bumblebee.h
index b7b9c598cabc424c9e52c75c82a227613a359dfd..71a99c63bca30ae61ab2f69afb8ad6065db6db5b 100755
--- a/src/bumblebee.h
+++ b/src/bumblebee.h
@@ -44,6 +44,11 @@ class CBumblebee : public CPTGCamera
      * 
      */
     void get_stereo_image(char **left,char **right);
+    /** 
+     * \brief
+     * 
+     */
+    void get_stereo_image_shared(char *left,char *right);
     /** 
      * \brief
      * 
diff --git a/src/examples/bumblebee.cpp b/src/examples/bumblebee.cpp
index 98ebb2b194b5c84a8795041e6f7625af6f946d0f..d76dcbc255522b8de585f5db5d239dbb048f7ade 100755
--- a/src/examples/bumblebee.cpp
+++ b/src/examples/bumblebee.cpp
@@ -40,6 +40,8 @@ int main(int argc, char *argv[])
     event_server=CEventServer::instance();
     bumblebee->get_config(&left_off,&top_off,&width,&height,&framerate,&depth,&coding);
     framerate=20;
+    coding=MONO;
+    depth=DEPTH8;
     bumblebee->set_config(&left_off,&top_off,&width,&height,&framerate,depth,coding);
     bumblebee->get_stereo_config(&width,&height,&framerate,&depth,&coding);
     std::cout << "Image size: " << width << "x" << height << std::endl;
@@ -52,7 +54,7 @@ int main(int argc, char *argv[])
     {
       text.str("");
       gettimeofday(&start_time,NULL);
-      event_server->wait_all(events,0);
+      event_server->wait_all(events,1000);
       bumblebee->get_stereo_image(&left,&right);
       filename="image_";
       text << i;