diff --git a/ur_driver/src/ur_driver/driver.py b/ur_driver/src/ur_driver/driver.py
index 1134ea799d21a3dc99b351e3c63fd1e52115901e..bc79db1d370554b29192ddffee2ad2612bb7de07 100755
--- a/ur_driver/src/ur_driver/driver.py
+++ b/ur_driver/src/ur_driver/driver.py
@@ -423,7 +423,7 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler):
                     raise EOF()
 
     def handle(self):
-        self.socket_lock = threading.Lock()
+        self.__socket_lock = threading.Lock()
         setConnectedRobot(self)
         print "Handling a request"
         try:
@@ -467,9 +467,23 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler):
             print "Connection closed (command):", ex
             setConnectedRobot(None)
 
+    def __send_message(self, data):
+        """
+        Send a message to the robot.
+
+        The message is given as a list of integers that will be packed
+        as 4 bytes each in network byte order (big endian).
+
+        A lock is acquired before sending the message to prevent race conditions.
+
+        :param data: list of int, the data to send
+        """
+        buf = struct.pack("!%ii" % len(data), *data)
+        with self.__socket_lock:
+            self.request.send(buf)
+
     def send_quit(self):
-        with self.socket_lock:
-            self.request.send(struct.pack("!i", MSG_QUIT))
+        self.__send_message([MSG_QUIT])
 
     def send_servoj(self, waypoint_id, q_actual, t):
         assert(len(q_actual) == 6)
@@ -479,61 +493,32 @@ class CommanderTCPHandler(SocketServer.BaseRequestHandler):
         params = [MSG_SERVOJ, waypoint_id] + \
                  [MULT_jointstate * qq for qq in q_robot] + \
                  [MULT_time * t]
-        buf = struct.pack("!%ii" % len(params), *params)
-        with self.socket_lock:
-            self.request.send(buf)
-        
+        self.__send_message(params)
+
     #Experimental set_payload implementation
     def send_payload(self,payload):
-        buf = struct.pack('!ii', MSG_SET_PAYLOAD, payload * MULT_payload)
-        with self.socket_lock:
-            self.request.send(buf)
+        self.__send_message([MSG_SET_PAYLOAD, payload * MULT_payload])
 
     #Experimental set_digital_output implementation
     def set_digital_out(self, pinnum, value):
-        params = [MSG_SET_DIGITAL_OUT] + \
-                 [pinnum] + \
-                 [value]
-        buf = struct.pack("!%ii" % len(params), *params)
-        #print params
-        with self.socket_lock:
-            self.request.send(buf) 
+        self.__send_message([MSG_SET_DIGITAL_OUT, pinnum, value])
         time.sleep(IO_SLEEP_TIME)
 
     def set_analog_out(self, pinnum, value):
-        params = [MSG_SET_ANALOG_OUT] + \
-                 [pinnum] + \
-                 [value * MULT_analog]
-        buf = struct.pack("!%ii" % len(params), *params)
-        #print params
-        with self.socket_lock:
-            self.request.send(buf) 
+        self.__send_message([MSG_SET_ANALOG_OUT, pinnum, value * MULT_analog])
         time.sleep(IO_SLEEP_TIME)
 
     def set_tool_voltage(self, value):
-        params = [MSG_SET_TOOL_VOLTAGE] + \
-                 [value] + \
-                 [0]
-        buf = struct.pack("!%ii" % len(params), *params)
-        #print params
-        with self.socket_lock:
-            self.request.send(buf) 
+        self.__send_message([MSG_SET_TOOL_VOLTAGE, value, 0])
         time.sleep(IO_SLEEP_TIME)
 
     def set_flag(self, pin, val):
-        params = [MSG_SET_FLAG] + \
-                 [pin] + \
-                 [val]
-        buf = struct.pack("!%ii" % len(params), *params)
-        #print params
-        with self.socket_lock:
-            self.request.send(buf) 
+        self.__send_message([MSG_SET_FLAG, pin, val])
         #set_flag will fail if called too closely together--added delay
         time.sleep(IO_SLEEP_TIME)
 
     def send_stopj(self):
-        with self.socket_lock:
-            self.request.send(struct.pack("!i", MSG_STOPJ))
+        self.__send_message([MSG_STOPJ])
 
     def set_waypoint_finished_cb(self, cb):
         self.waypoint_finished_cb = cb