diff --git a/src/modbus-private.h b/src/modbus-private.h
index c5af0f9..1e5699a 100755
--- a/src/modbus-private.h
+++ b/src/modbus-private.h
@@ -87,6 +87,7 @@ typedef struct _modbus_backend {
     int (*flush) (modbus_t *ctx);
     int (*select) (modbus_t *ctx, fd_set *rset, struct timeval *tv, int msg_length);
     void (*free) (modbus_t *ctx);
+	int (*build_request_basis_communication_transparent) (modbus_t *ctx, char *buf, int len, uint8_t *req);
 } modbus_backend_t;
 
 struct _modbus {
@@ -98,6 +99,7 @@ struct _modbus {
     int error_recovery;
     struct timeval response_timeout;
     struct timeval byte_timeout;
+    struct timeval indication_timeout;
     const modbus_backend_t *backend;
     void *backend_data;
 };
diff --git a/src/modbus-rtu.c b/src/modbus-rtu.c
index cb2fb50..373c4cb 100755
--- a/src/modbus-rtu.c
+++ b/src/modbus-rtu.c
@@ -161,6 +161,15 @@ static int _modbus_rtu_send_msg_pre(uint8_t *req, int req_length)
     return req_length;
 }
 
+int modbus_calculate_crc(uint8_t *req, int req_length)
+{
+    uint16_t crc = crc16(req, req_length);
+    req[req_length++] = crc >> 8;
+    req[req_length++] = crc & 0x00FF;
+
+    return req_length;
+}
+
 #if defined(_WIN32)
 
 /* This simple implementation is sort of a substitute of the select() call,
@@ -1204,7 +1213,8 @@ const modbus_backend_t _modbus_rtu_backend = {
     _modbus_rtu_close,
     _modbus_rtu_flush,
     _modbus_rtu_select,
-    _modbus_rtu_free
+    _modbus_rtu_free,
+    NULL
 };
 
 modbus_t* modbus_new_rtu(const char *device,
diff --git a/src/modbus-rtu.h b/src/modbus-rtu.h
index 214a888..bcba780 100755
--- a/src/modbus-rtu.h
+++ b/src/modbus-rtu.h
@@ -37,6 +37,9 @@ MODBUS_API int modbus_rtu_set_custom_rts(modbus_t *ctx, void (*set_rts) (modbus_
 MODBUS_API int modbus_rtu_set_rts_delay(modbus_t *ctx, int us);
 MODBUS_API int modbus_rtu_get_rts_delay(modbus_t *ctx);
 
+MODBUS_API int modbus_calculate_crc(uint8_t *req, int req_length);
+
+
 MODBUS_END_DECLS
 
 #endif /* MODBUS_RTU_H */
diff --git a/src/modbus-tcp.c b/src/modbus-tcp.c
index 15a8f00..a691fee 100755
--- a/src/modbus-tcp.c
+++ b/src/modbus-tcp.c
@@ -120,6 +120,42 @@ static int _modbus_tcp_build_request_basis(modbus_t *ctx, int function,
     return _MODBUS_TCP_PRESET_REQ_LENGTH;
 }
 
+static int _modbus_tcp_build_request_basis_communication_transparent(modbus_t *ctx, char *buf,
+										  int len, uint8_t *req)
+{
+   modbus_tcp_t *ctx_tcp = ctx->backend_data;
+   printf("%s line %d\n",__FUNCTION__,__LINE__);
+
+   /* Increase transaction ID */
+   if (ctx_tcp->t_id < UINT16_MAX)
+	   ctx_tcp->t_id++;
+   else
+	   ctx_tcp->t_id = 0;
+   req[0] = ctx_tcp->t_id >> 8;
+   req[1] = ctx_tcp->t_id & 0x00ff;
+
+   /* Protocol Modbus */
+   req[2] = 0;
+   req[3] = 0;
+   printf("%s line %d len %d\n",__FUNCTION__,__LINE__,len);
+   /* Length will be defined later by set_req_length_tcp at offsets 4
+	  and 5 */
+#if 1
+	memcpy(req+6, buf, len);
+	printf("%s line %d\n",__FUNCTION__,__LINE__);
+	return 6+len;
+#else
+   req[6] = ctx->slave;
+   req[7] = function;
+   req[8] = addr >> 8;
+   req[9] = addr & 0x00ff;
+   req[10] = nb >> 8;
+   req[11] = nb & 0x00ff;
+
+   return _MODBUS_TCP_PRESET_REQ_LENGTH;
+#endif
+}
+
 /* Builds a TCP response header */
 static int _modbus_tcp_build_response_basis(sft_t *sft, uint8_t *rsp)
 {
@@ -751,7 +787,8 @@ const modbus_backend_t _modbus_tcp_backend = {
     _modbus_tcp_close,
     _modbus_tcp_flush,
     _modbus_tcp_select,
-    _modbus_tcp_free
+    _modbus_tcp_free,
+    _modbus_tcp_build_request_basis_communication_transparent
 };
 
 
@@ -774,7 +811,8 @@ const modbus_backend_t _modbus_tcp_pi_backend = {
     _modbus_tcp_close,
     _modbus_tcp_flush,
     _modbus_tcp_select,
-    _modbus_tcp_free
+    _modbus_tcp_free,
+    _modbus_tcp_build_request_basis_communication_transparent
 };
 
 modbus_t* modbus_new_tcp(const char *ip, int port)
diff --git a/src/modbus.c b/src/modbus.c
index f1da5c6..79645a4 100755
--- a/src/modbus.c
+++ b/src/modbus.c
@@ -1174,6 +1174,51 @@ static int read_registers(modbus_t *ctx, int function, int addr, int nb,
     return rc;
 }
 
+static int communication_transparent(modbus_t *ctx, char *buf, int len, char *dest)
+{
+  int rc;
+  int req_length;
+  uint8_t req[MAX_MESSAGE_LENGTH];
+  uint8_t rsp[MAX_MESSAGE_LENGTH];
+  printf("%s line %d _MIN_REQ_LENGTH %d MAX_MESSAGE_LENGTH %d\n",__FUNCTION__,__LINE__,_MIN_REQ_LENGTH,MAX_MESSAGE_LENGTH);
+  if(!ctx->backend->build_request_basis_communication_transparent)
+  	return -1;
+  printf("%s line %d\n",__FUNCTION__,__LINE__);
+  req_length = ctx->backend->build_request_basis_communication_transparent(ctx, buf, len, req);
+  printf("%s line %d req_length %d\n",__FUNCTION__,__LINE__,req_length);
+  rc = send_msg(ctx, req, req_length);
+  if (rc > 0) {
+	  int offset;
+	  int i;
+  	  int len=0;
+  	  int rcv=0;
+	  printf("%s line %d rc %d\n",__FUNCTION__,__LINE__,rc);
+	  rc = _modbus_receive_msg(ctx, rsp, MSG_CONFIRMATION);
+	  printf("%s line %d rc %d\n",__FUNCTION__,__LINE__,rc);
+	  if (rc == -1)
+		  return -1;
+	  printf("%s line %d\n",__FUNCTION__,__LINE__);
+	  rcv = check_confirmation(ctx, req, rsp, rc);
+	  if (rcv == -1)
+		  return -1;
+	  
+	  printf("%s line %d rc %d rcv %d\n",__FUNCTION__,__LINE__,rc,rcv);
+	  for(i=0; i<rc; i++)
+	  {
+		printf("[0x%x] ",rsp[i]);
+	  }
+	  printf("%s line %d rc %d\n",__FUNCTION__,__LINE__,rc);
+	  len = rc-6;
+	  memcpy(dest, rsp+6, len);
+
+	  len = modbus_calculate_crc(dest, len);
+	  
+	  return len;
+  }
+  return -1;
+}
+
+
 /* Reads the holding registers of remote device and put the data into an
    array */
 int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)
@@ -1200,6 +1245,29 @@ int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest)
     return status;
 }
 
+int modbus_communication_transparent(modbus_t *ctx, char *buf, int len, char *dest)
+{
+    int status;
+	printf("%s line %d\n",__FUNCTION__,__LINE__);
+    if (ctx == NULL) {
+        errno = EINVAL;
+        return -1;
+    }
+
+    if (len > 100) {
+        if (ctx->debug) {
+            fprintf(stderr,
+                    "ERROR Too many registers requested (%d > %d)\n",
+                    len, 100);
+        }
+        errno = EMBMDATA;
+        return -1;
+    }
+	printf("%s line %d\n",__FUNCTION__,__LINE__);
+    status = communication_transparent(ctx, buf, len, dest);
+    return status;
+}
+
 /* Reads the input registers of remote device and put the data into an array */
 int modbus_read_input_registers(modbus_t *ctx, int addr, int nb,
                                 uint16_t *dest)
