diff --git a/src/examples/ladybug.cpp b/src/examples/ladybug.cpp
index 2e04153132b950cce938fae008eb351a1596900e..3eabc982cf89ea137e3f9241eef6e85e920edf8c 100755
--- a/src/examples/ladybug.cpp
+++ b/src/examples/ladybug.cpp
@@ -7,7 +7,9 @@
 #include <sstream>
 #include <iostream>
 
-const int num_frames=10;
+//#define SHARED
+
+const int num_frames=1000;
 
 int main(int argc, char *argv[])
 {
@@ -39,8 +41,9 @@ int main(int argc, char *argv[])
     event_server=CEventServer::instance();
     ladybug->get_config(&left_off,&top_off,&width,&height,&framerate,&depth,&coding);
     std::cout << "Fremerate: " << framerate << std::endl;
-    coding=RGB;
-    framerate=1;
+    coding=MONO;
+    depth=DEPTH8;
+    framerate=5;
     ladybug->set_config(&left_off,&top_off,&width,&height,&framerate,depth,coding);
     ladybug->get_multi_config(&width,&height,&framerate,&depth,&coding);
     std::cout << "Image size: " << width << "x" << height << std::endl;
@@ -48,18 +51,31 @@ int main(int argc, char *argv[])
     std::cout << "Color coding: " << (int)coding << "-" << (int)depth << std::endl;
     ladybug->get_new_frame_event_id(new_frame);
     events.push_back(new_frame);
+    #ifdef SHARED
+    front=new char[width*height*depth/8];
+    front_right=new char[width*height*depth/8];
+    rear_right=new char[width*height*depth/8];
+    rear_left=new char[width*height*depth/8];
+    front_left=new char[width*height*depth/8];
+    top=new char[width*height*depth/8];
+    #endif
     ladybug->start();
     for ( i=0 ; i<num_frames ; i++ )
     {
       text.str("");
       gettimeofday(&start_time,NULL);
-      event_server->wait_all(events,0);
+      event_server->wait_all(events,5000);
+      #ifdef SHARED
+      ladybug->get_images_shared(front,front_right,rear_right,rear_left,front_left,top);
+      #else
       ladybug->get_images(&front,&front_right,&rear_right,&rear_left,&front_left,&top);
+      #endif
       filename="image_";
       text << i;
       filename+=text.str();
       filename+=".ppm";
       ladybug->save_images(filename,front,front_right,rear_right,rear_left,front_left,top);
+      #ifndef SHARED
       if(front!=NULL)
       {
         delete[] front;
@@ -90,6 +106,7 @@ int main(int argc, char *argv[])
         delete[] top;
         top=NULL;
       }
+      #endif
       gettimeofday(&end_time,NULL);
       elapsed_time[i]=(end_time.tv_sec-start_time.tv_sec)*1000000+end_time.tv_usec-start_time.tv_usec;
       std::cout << "Elapsed time: " << elapsed_time[i] << "s" << std::endl;
diff --git a/src/ladybug.cpp b/src/ladybug.cpp
index 21a6b17ab6b837330c05d1799b1bcbc066119928..a0831ecbf1e984f4864f8f580d907d5ece3f92b0 100755
--- a/src/ladybug.cpp
+++ b/src/ladybug.cpp
@@ -42,7 +42,13 @@ void CLadyBug::set_config(unsigned int *left_off,unsigned int *top_off,unsigned
   this->set_framerate(framerate);
   this->set_num_DMA_buffers(4);
   if(coding==RGB || coding==MONO)
+  {
+    if(coding==RGB)
+      this->multi_depth=DEPTH24;
+    else
+      this->multi_depth=DEPTH8;
     this->multi_coding=coding;
+  }
   else
     this->multi_coding=RGB;
 }
@@ -63,7 +69,7 @@ void CLadyBug::get_images(char **front, char **front_right, char **rear_right, c
   dc1394video_frame_t *frame;
   unsigned char *RGB_image;
 
-  if ( *front != NULL || *front_right != NULL || *rear_right != NULL || *rear_left != NULL || *front_left != NULL || *top != NULL)
+ if ( *front != NULL || *front_right != NULL || *rear_right != NULL || *rear_left != NULL || *front_left != NULL || *top != NULL)
   {
     DEBUG_INFO("Invalid image buffer.\n");
     /* handle error */
@@ -199,6 +205,118 @@ void CLadyBug::get_images(char **front, char **front_right, char **rear_right, c
   }
 }
 
+void CLadyBug::get_images_shared(char *front, char *front_right, char *rear_right, char *rear_left, char *front_left, char *top)
+{
+  int depth;
+  dc1394error_t error;
+  dc1394video_frame_t *frame;
+  unsigned char *RGB_image;
+
+  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);
+    }
+    if(this->multi_coding==RGB)
+    {
+      depth = (int)ceil((float)this->multi_depth/8.0);
+      RGB_image=new unsigned char[this->width*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( (unsigned char *)frame->image,
+                                  RGB_image,
+                                  this->width,
+                                  this->height,
+                                  this->bayer_pattern,
+                                  DC1394_BAYER_METHOD_NEAREST);
+      memcpy(front,RGB_image,this->multi_width*this->multi_height*depth);
+      memcpy(front_right,RGB_image+this->multi_height*this->multi_width*depth,this->multi_width*this->multi_height*depth);
+      memcpy(rear_right,RGB_image+2*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(rear_left,RGB_image+3*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(front_left,RGB_image+4*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(top,RGB_image+5*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      delete[] RGB_image;
+    }
+    else
+    {
+      depth = (int)ceil((float)this->depth/8.0);
+      memcpy(front,(unsigned char *)frame->image,this->multi_width*this->multi_height*depth);
+      memcpy(front_right,(unsigned char *)frame->image+this->multi_height*this->multi_width*depth,this->multi_width*this->multi_height*depth);
+      memcpy(rear_right,(unsigned char *)frame->image+2*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(rear_left,(unsigned char *)frame->image+3*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(front_left,(unsigned char *)frame->image+4*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(top,(unsigned char *)frame->image+5*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_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");
+  }
+  else
+  {
+    this->image_access.enter();
+    if(this->multi_coding==RGB)
+    {
+      depth = (int)ceil((float)this->multi_depth/8.0);
+      RGB_image=new unsigned char[this->width*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( (unsigned char *)this->frame_buffer,
+                                  RGB_image,
+                                  this->width,
+                                  this->height,
+                                  this->bayer_pattern,
+                                  DC1394_BAYER_METHOD_NEAREST);
+
+      memcpy(front,RGB_image,this->multi_width*this->multi_height*depth);
+      memcpy(front_right,RGB_image+this->multi_height*this->multi_width*depth,this->multi_width*this->multi_height*depth);
+      memcpy(rear_right,RGB_image+2*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(rear_left,RGB_image+3*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(front_left,RGB_image+4*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(top,RGB_image+5*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      delete[] RGB_image;
+    }
+    else
+    {
+      depth = (int)ceil((float)this->depth/8.0);
+      memcpy(front,(unsigned char *)this->frame_buffer,this->multi_width*this->multi_height*depth);
+      memcpy(front_right,(unsigned char *)this->frame_buffer+this->multi_height*this->multi_width*depth,this->multi_width*this->multi_height*depth);
+      memcpy(rear_right,(unsigned char *)this->frame_buffer+2*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(rear_left,(unsigned char *)this->frame_buffer+3*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(front_left,(unsigned char *)this->frame_buffer+4*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+      memcpy(top,(unsigned char *)this->frame_buffer+5*(this->multi_height*this->multi_width*depth),this->multi_width*this->multi_height*depth);
+    }
+    this->image_access.exit();
+  }
+}
+
 void CLadyBug::save_images(std::string &filename,char *front, char *front_right, char *rear_right, char *rear_left, char *front_left, char *top)
 {
   std::string header,name;
diff --git a/src/ladybug.h b/src/ladybug.h
index f485aeb9bbf5f96cd73793664a37b715be723d91..b52d0a566fd2ca78e82b90025ddc531ebd490b4e 100755
--- a/src/ladybug.h
+++ b/src/ladybug.h
@@ -47,6 +47,11 @@ class CLadyBug : public CPTGCamera
      * 
      */
     void get_images(char **front, char **front_right, char **rear_right, char **rear_left, char **front_left, char **top);
+    /** 
+     * \brief
+     * 
+     */
+    void get_images_shared(char *front, char *front_right, char *rear_right, char *rear_left, char *front_left, char *top);
     /** 
      * \brief
      *