diff --git a/win-client/driver/bus.inf b/win-client/driver/bus.inf
index 74263b8..a1715c4 100755
--- a/win-client/driver/bus.inf
+++ b/win-client/driver/bus.inf
@@ -9,7 +9,7 @@ Signature="$WINDOWS NT$"
 Class=USB
 ClassGuid={36FC9E60-C465-11CF-8056-444553540000}
 Provider=%INF-creator%
-DriverVer=06/15/2012,1.0.0002.2
+DriverVer=06/18/2012,1.0.0002.3
 CatalogFile.NT=synodriverx86.cat
 
 ;/* dirid 12: Drivers on WinNT platforms */
diff --git a/win-client/driver/busenum.c b/win-client/driver/busenum.c
index 0069be1..293465a 100755
--- a/win-client/driver/busenum.c
+++ b/win-client/driver/busenum.c
@@ -374,15 +374,19 @@ unsigned int tran_usb_status(int linux_status,int in)
 		case 0:
 			return USBD_STATUS_SUCCESS;
 		/* I guess it */
-		case -EPIPE:
+        case -EPIPE:
+            KdPrint(("## return -EPIPE\n"));
 			return USBD_STATUS_ENDPOINT_HALTED;
-		case -EOVERFLOW:
+        case -EOVERFLOW:
+            KdPrint(("## return -EOVERFLOW\n"));
 			return USBD_STATUS_DATA_OVERRUN;
-		case -EREMOTEIO:
+        case -EREMOTEIO:
+            KdPrint(("## return -EREMOTEIO\n"));
 			return USBD_STATUS_ERROR_SHORT_TRANSFER;
 #ifdef SYNO_DSM_BUG_15042
 		/* we repsonse some urb error accroding to direct connect result */
-		case -ETIME:
+        case -ETIME:
+            KdPrint(("## return -ETIME\n"));
 			return USBD_STATUS_DEV_NOT_RESPONDING ;
 #endif
 		default:
@@ -918,11 +922,11 @@ Ok:
 
     if(blTransferBuf) {
         urb->TransferBufferLength = h->u.ret_submit.actual_length;
-        KdPrint(("Finish URB FUNC,status=%u: %s %s len:%d ret:%d\n", urb->Hdr.Status,
+        KdPrint(("1.Finish URB FUNC,status=%u: %s %s len:%d ret:%d\n", urb->Hdr.Status,
 				func2name(urb->Hdr.Function),
 				in?"in":"out", urb->TransferBufferLength, h->u.ret_submit.actual_length));
     } else {
-        KdPrint(("Finish URB FUNC,status=%u: %s %s ret:%d\n", urb->Hdr.Status,
+        KdPrint(("2.Finish URB FUNC,status=%u: %s %s ret:%d\n", urb->Hdr.Status,
 				func2name(urb->Hdr.Function),
 				in?"in":"out", h->u.ret_submit.actual_length));
     }
@@ -1317,7 +1321,7 @@ int process_write_irp(PPDO_DEVICE_DATA pdodata, PIRP irp)
     }
 
     urb->Hdr.Status = tran_usb_status(h->u.ret_submit.status, in, type);
-    KdPrint(("Finish URB FUNC,status=%u:%d %s %s len:%d ret:%d\n", urb->Hdr.Status, urb->Hdr.Function,
+    KdPrint(("3.Finish URB FUNC,status=%u:%d %s %s len:%d ret:%d\n", urb->Hdr.Status, urb->Hdr.Function,
 				func2name(urb->Hdr.Function),
 				in?"in":"out", urb->TransferBufferLength,
 				h->u.ret_submit.actual_length));
@@ -1611,11 +1615,29 @@ int prepare_class_vendor_urb(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST  *req,
 	setup->wIndex = req->Index;
 
 	*copied=sizeof(*h);
-	if(!in){
-		RtlCopyMemory(h+1, req->TransferBuffer,
-				req->TransferBufferLength);
-		(*copied)+=req->TransferBufferLength;
-	}
+#ifdef SYNO_REFINE_TRANSFER_BUFFER
+    if(!in && req->TransferBufferLength > 0) {
+        if(req->TransferBuffer)
+            bufTmp=req->TransferBuffer;
+        else if (req->TransferBufferMDL){
+            bufTmp=MmGetSystemAddressForMdlSafe(
+            req->TransferBufferMDL,
+            LowPagePriority);
+        }
+        
+        if(NULL != bufTmp) {
+            KdPrint(("# %s, send buffer is not null!!\n", func2name(req->Hdr.Function)));
+            RtlCopyMemory(h+1, bufTmp, req->TransferBufferLength);
+            (*copied)+=req->TransferBufferLength;		
+        }
+    }
+#else
+    if(!in){
+          RtlCopyMemory(h+1, req->TransferBuffer,
+                  req->TransferBufferLength);
+          (*copied)+=req->TransferBufferLength;
+    }
+#endif
 	return  STATUS_SUCCESS;
 }
 
@@ -1652,6 +1674,8 @@ int prepare_get_intf_descriptor_urb(struct _URB_CONTROL_DESCRIPTOR_REQUEST * req
         KdPrint(("## 2. Request string descriptor, in index=%x\n", req->LanguageId));
     }
 
+    /* USB_REQUEST_GET_DESCRIPTOR is device to host request, we should not copy request buffer to device */
+
 	*copied=sizeof(*h);
 	return STATUS_SUCCESS;
 }
@@ -1691,6 +1715,9 @@ int prepare_get_dev_descriptor_urb( struct _URB_CONTROL_DESCRIPTOR_REQUEST * req
 			return STATUS_INVALID_PARAMETER;
 	}
 	*copied=sizeof(*h);
+
+    /* USB_REQUEST_GET_DESCRIPTOR is device to host request, we should not copy request buffer to device */
+
 	return STATUS_SUCCESS;
 }
 
diff --git a/win-client/driver/pnp.c b/win-client/driver/pnp.c
index 6aa3442..2feef35 100755
--- a/win-client/driver/pnp.c
+++ b/win-client/driver/pnp.c
@@ -1564,7 +1564,7 @@ NTSTATUS syno_bus_plugin_dev(ioctl_usbvbus_plugin * plugin, PFDO_DEVICE_DATA  fd
     pdodata->speed = plugin->speed;    
 #ifdef SYNO_MS_DESCRIPTOR_PARSER
     pdodata->NumInterfaces = plugin->inum;
-    KdPrint(("## set interface number=%d", pdodata->NumInterfaces));
+    KdPrint(("## set interface number=%d\n", pdodata->NumInterfaces));
 #endif
     bus_init_pdo (pdo, fdodata);
     
diff --git a/win-client/synodef.h b/win-client/synodef.h
index 8bdca0a..fe0f003 100755
--- a/win-client/synodef.h
+++ b/win-client/synodef.h
@@ -286,6 +286,6 @@
 #define SYNO_REFINE_PROCESS_WRITE_IRP
 
 /* Refine req->TransferBuffer and req->TransferBufferMDL usage */
-//#define SYNO_REFINE_TRANSFER_BUFFER
+#define SYNO_REFINE_TRANSFER_BUFFER
 
 #endif //_SYNODEF_WIN_CLIENT_H
