diff --git a/trunk/src/CMakeLists.txt b/trunk/src/CMakeLists.txt
index 088139bbf0a7c05f009235f9c725f7b90d60ddb8..8b8c85c0d3123d4d3a79fef400c50c1045fddb8f 100644
--- a/trunk/src/CMakeLists.txt
+++ b/trunk/src/CMakeLists.txt
@@ -1,7 +1,7 @@
 # edit the following line to add all the source code files of the library
-SET(sources usb_i2c.cpp)
+SET(sources usb_i2c.cpp usb_i2c_exceptions.cpp)
 # edit the following line to add all the header files of the library
-SET(headers usb_i2c.h)
+SET(headers usb_i2c.h usb_i2c_exceptions.h)
 
 # edit the following line to find the necessary packages
 FIND_PACKAGE(iriutils REQUIRED)
diff --git a/trunk/src/usb_i2c.cpp b/trunk/src/usb_i2c.cpp
index 92aa2b14a06255ef1906a474b9bd150f8b9d6716..8deee1d6a82cb8abb35a12c80f9789f209dbbedc 100644
--- a/trunk/src/usb_i2c.cpp
+++ b/trunk/src/usb_i2c.cpp
@@ -1,6 +1,8 @@
 #include "usb_i2c.h"
 #include "eventexceptions.h"
+#include "usb_i2c_exceptions.h"
 #include <string.h>
+#include <iostream>
 
 CUSBI2C::CUSBI2C(const std::string &adapter_id)
 {
@@ -9,6 +11,7 @@ CUSBI2C::CUSBI2C(const std::string &adapter_id)
   if(adapter_id.size()==0)
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"Invalid adapter identifier.");
   }
   else
   {
@@ -47,6 +50,7 @@ unsigned char CUSBI2C::get_revision(void)
   if((written=this->comm_dev->write(cmd,4))!=4)
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
   }
   else
   {
@@ -64,6 +68,7 @@ void CUSBI2C::config_gpio(gpio_pins pin, gpio_types type)
     case gpio1: if(type!=digital_input)
                 {
                   /* handle exceptions */
+                  throw CUSBI2CException(_HERE_,"GPIO1 can only be configured as a digital input.");
                 }
                 else
                 {
@@ -116,6 +121,7 @@ void CUSBI2C::set_gpio(gpio_pins pin, bool value)
       if((written=this->comm_dev->write(cmd,4))!=4) 
       {
         /* handle exceptions */
+        throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
       }
       else
       {
@@ -127,6 +133,7 @@ void CUSBI2C::set_gpio(gpio_pins pin, bool value)
   else
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"The desired GPIO is not configured as a digital output");
   }
 }
 
@@ -143,6 +150,7 @@ bool CUSBI2C::get_gpio(gpio_pins pin)
     if((written=this->comm_dev->write(cmd,4))!=4)
     {
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
     }
     else
     {
@@ -157,6 +165,7 @@ bool CUSBI2C::get_gpio(gpio_pins pin)
   else
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"The desired GPIO is not configured as a digital input");
   }  
 
   return false;
@@ -188,6 +197,7 @@ short int CUSBI2C::get_analog(gpio_pins pin)
   else
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"The desired GPIO is not configured as an analog input");
   }  
   
   return analog_value;
@@ -204,6 +214,7 @@ void CUSBI2C::turn_led_on(void)
   if((written=this->comm_dev->write(cmd,4))!=4)
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
   }
   else
   {
@@ -215,6 +226,7 @@ void CUSBI2C::turn_led_on(void)
     if((written=this->comm_dev->write(cmd,4))!=4) 
     {
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
     }
     else
     {
@@ -235,6 +247,7 @@ void CUSBI2C::turn_led_off(void)
   if((written=this->comm_dev->write(cmd,4))!=4)
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
   }
   else
   {
@@ -246,6 +259,7 @@ void CUSBI2C::turn_led_off(void)
     if((written=this->comm_dev->write(cmd,4))!=4) 
     {
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
     }
     else
     {
@@ -265,12 +279,14 @@ int CUSBI2C::write(unsigned char dev_id, unsigned char *data, int len)
   if(len>1)
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"At least one byte must be send in a write operation");
   }
   else
   {
     if(data==NULL)
     {
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"Invalid data input buffer");
     }
     else
     {
@@ -280,6 +296,7 @@ int CUSBI2C::write(unsigned char dev_id, unsigned char *data, int len)
       if((written=this->comm_dev->write(cmd,3))!=3)
       {
         /* handle exceptions */
+        throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
       }  
       else
       {
@@ -289,9 +306,11 @@ int CUSBI2C::write(unsigned char dev_id, unsigned char *data, int len)
           if(status==0x00)
           {
             /* handle exceptions */
+            throw CUSBI2CException(_HERE_,"The write operation did not succed");
           }
         }catch(CEventTimeoutException &e){
           /* handle exceptions */
+          throw CUSBI2CException(_HERE_,"The write operation did not complete in the allowed time");
         }
       }
     }
@@ -308,6 +327,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len)
   if(data==NULL)
   {
     /* handle exceptions */
+    throw CUSBI2CException(_HERE_,"Invalid data input buffer");
   }
   else
   {
@@ -319,6 +339,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len)
       if((written=this->comm_dev->write(cmd,2))!=2)
       {
         /* handle exceptions */
+        throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
       }  
     }
     else
@@ -328,6 +349,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len)
       if((written=this->comm_dev->write(cmd,3))!=3)
       {
         /* handle exceptions */
+        throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
       }
     }
     try{
@@ -338,6 +360,7 @@ int CUSBI2C::read(unsigned char dev_id, unsigned char *data, int len)
       }while(total_read<len);
     }catch(CEventTimeoutException &e){
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"The read operation did not complete in the allowed time");
     }  
   }
 
@@ -350,7 +373,8 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d
   std::list<std::string> events;
   unsigned char status;
   unsigned char *cmd;
-
+ 
+  events.push_back(this->rx_event_id);
   do{
     if((len-total_written)>64) num=64;
     else num=len-total_written;
@@ -378,6 +402,7 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d
     if((written=this->comm_dev->write(cmd,num))!=num)
     {
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
     }
     else
     {
@@ -387,9 +412,11 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d
         if(status==0x00)
         {
           /* handle exceptions */
+          throw CUSBI2CException(_HERE_,"The write operation did not succed");
         }
       }catch(CEventTimeoutException &e){
         /* handle exceptions */
+        throw CUSBI2CException(_HERE_,"The write operation did not complete in the allowed time");
       }
     }
     delete[] cmd;
@@ -402,33 +429,37 @@ int CUSBI2C::write_reg(unsigned char dev_id, short int address, unsigned char *d
 
 int CUSBI2C::read_reg(unsigned char dev_id, short int address, unsigned char *data, int len)
 {
-  int written=0,read=0,total_read=0,num=0,total_num=0;
+  int written=0,read=0,total_read=0,num=0,total_num=0,num_cmd;
   std::list<std::string> events;
   unsigned char cmd[5];
 
+  events.push_back(this->rx_event_id);
   do{
     if((len-total_read)>60) num=60;
     else num=len-total_read;
     if(address<256)
     {
       cmd[0]=0x55;
-      cmd[1]=dev_id<<1;
+      cmd[1]=(dev_id<<1)+1;
       cmd[2]=address;
       cmd[3]=num;
-      written=this->comm_dev->write(cmd,4)!=4;
+      written=this->comm_dev->write(cmd,4);
+      num_cmd=4;
     }
     else
     {
       cmd[0]=0x56;
-      cmd[1]=dev_id<<1;
+      cmd[1]=(dev_id<<1)+1;
       cmd[2]=address/256;
       cmd[3]=address%256;
       cmd[4]=num;
-      written=this->comm_dev->write(cmd,5)!=5;
+      written=this->comm_dev->write(cmd,5);
+      num_cmd=5;
     }
-    if(written!=num)
+    if(written!=num_cmd)
     {
       /* handle exceptions */
+      throw CUSBI2CException(_HERE_,"Error while sending the command to the converter");
     }
     else
     {
@@ -440,6 +471,7 @@ int CUSBI2C::read_reg(unsigned char dev_id, short int address, unsigned char *da
         }while(total_num<num);
       }catch(CEventTimeoutException &e){
         /* handle exceptions */
+        throw CUSBI2CException(_HERE_,"The write operation did not complete in the allowed time");
       }
     }
     total_read+=num;
diff --git a/trunk/src/usb_i2c_exceptions.cpp b/trunk/src/usb_i2c_exceptions.cpp
new file mode 100755
index 0000000000000000000000000000000000000000..85ebc7263a2d6a5d892e9c07234a2c794aab9896
--- /dev/null
+++ b/trunk/src/usb_i2c_exceptions.cpp
@@ -0,0 +1,10 @@
+#include "usb_i2c_exceptions.h"
+#include <string.h>
+#include <stdio.h>
+
+const std::string usb_i2c_exception_msg="[CUSBI2C class] - ";
+
+CUSBI2CException::CUSBI2CException(const std::string& where, const std::string& error_msg):CException(where,usb_i2c_exception_msg)
+{
+  this->error_msg+=error_msg;
+}
diff --git a/trunk/src/usb_i2c_exceptions.h b/trunk/src/usb_i2c_exceptions.h
new file mode 100755
index 0000000000000000000000000000000000000000..c65fdfba6600754a85757806a545228c6db55a82
--- /dev/null
+++ b/trunk/src/usb_i2c_exceptions.h
@@ -0,0 +1,12 @@
+#ifndef USB_I2C_EXCEPTIONS
+#define USB_I2C_EXCEPTIONS
+
+#include "exceptions.h"
+
+class CUSBI2CException : public CException
+{
+  public:
+    CUSBI2CException(const std::string& where,const std::string& error_msg);
+};
+
+#endif