diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx
index 47e0c24..164de96 100644
--- a/vncviewer/FTDialog.cxx
+++ b/vncviewer/FTDialog.cxx
@@ -622,7 +622,11 @@
 }
 
 void 
-FTDialog::setStatusText(char *pText)
+FTDialog::setStatusText(LPCSTR format,...)
 {
-  SetDlgItemText(m_hwndFTDialog, IDC_FTSTATUS, pText);
+  char text[1024];
+  va_list args;
+  va_start(args, format);
+  int nSize = _vsnprintf(text, sizeof(text), format, args);
+  SetDlgItemText(m_hwndFTDialog, IDC_FTSTATUS, text);
 }
diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h
index 2c9ebfa..2e70db3 100644
--- a/vncviewer/FTDialog.h
+++ b/vncviewer/FTDialog.h
@@ -52,7 +52,9 @@
       void addRemoteLVItems(FileInfo *pFI);
       void reqFolderUnavailable();
 
-      void setStatusText(char *pText);
+      void setStatusText(LPCSTR format,...);
+
+      HWND getWndHandle() { return m_hwndFTDialog; }
 
       FTProgress *m_pProgress;
       
diff --git a/vncviewer/FileTransfer.cxx b/vncviewer/FileTransfer.cxx
index 2eacee3..5b01334 100644
--- a/vncviewer/FileTransfer.cxx
+++ b/vncviewer/FileTransfer.cxx
@@ -35,6 +35,9 @@
 
   m_pReader = NULL;
   m_pWriter = NULL;
+
+  m_dw64SizeSending = 0;
+  m_dirSizeRqstNum = 0;
 }
 
 FileTransfer::~FileTransfer()
@@ -108,7 +111,8 @@
   m_TransferQueue.add(pTransQueue);
 
   resizeSending();
-  
+
+  checkTransferQueue();
 }
 
 void 
@@ -123,6 +127,87 @@
 
 }
 
+void
+FileTransfer::checkTransferQueue()
+{
+  if (!isTransferEnable()) {
+    if (m_bFTDlgShown) {
+      m_pFTDialog->setStatusText("File Transfer Operation Completed Successfully");
+      PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTLOCALRELOAD, 0), 0);
+      PostMessage(m_pFTDialog->getWndHandle(), WM_COMMAND, MAKEWPARAM(IDC_FTREMOTERELOAD, 0), 0);
+      return;
+    }
+  } else {
+    for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++) {
+      unsigned int flags = m_TransferQueue.getFlagsAt(i);
+      if (flags & FT_ATTR_RESIZE_NEEDED) {
+        if (flags & FT_ATTR_FILE) {
+          m_dw64SizeSending += m_TransferQueue.getSizeAt(i);
+          m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
+        } else {
+          if (flags & FT_ATTR_DIR) {
+            if (flags & FT_ATTR_COPY_DOWNLOAD) {
+              char *pPath = m_TransferQueue.getFullRemPathAt(i);
+              m_dirSizeRqstNum = i;
+              m_pWriter->writeFileDirSizeRqst(strlen(pPath), pPath);
+              return;
+            } else {
+              if (flags & FT_ATTR_COPY_UPLOAD) {
+                FolderManager fm;
+                DWORD64 dw64Size;
+                fm.getDirSize(m_TransferQueue.getFullLocPathAt(i), &dw64Size);
+                m_dw64SizeSending += dw64Size;
+                m_TransferQueue.clearFlagAt(i, FT_ATTR_RESIZE_NEEDED);
+              }
+            } // if (flags & FT_ATTR_COPY_DOWNLOAD)
+          } // if (flags & FT_ATTR_FOLDER)
+        } // if (flags & FT_ATTR_FILE)
+      } // if (flags & FT_ATTR_NEEDED_RESIZE)
+    } // for (unsigned int i = 0; i < m_TransferQueue.getNumEntries(); i++)
+
+    unsigned int flag0 = m_TransferQueue.getFlagsAt(0);
+    
+    if (flag0 & FT_ATTR_COPY_UPLOAD) {
+      if (flag0 & FT_ATTR_FILE) {
+          uploadFile();
+          return;
+      }
+      if (flag0 & FT_ATTR_DIR) {
+        char *pFullPath = m_TransferQueue.getFullRemPathAt(0);
+        if (m_bFTDlgShown) m_pFTDialog->setStatusText("Creating Remote Folder. %s", pFullPath);
+        m_pWriter->writeFileCreateDirRqst(strlen(pFullPath), pFullPath);
+
+        char *pPath = m_TransferQueue.getRemPathAt(0);
+        m_TransferQueue.setFlagsAt(0, (flag0 | FT_ATTR_FLR_UPLOAD_CHECK));
+        m_queueFileListRqst.add(pPath, 0, 0, FT_FLR_DEST_UPLOAD);
+        m_pWriter->writeFileListRqst(strlen(pPath), pPath, 0);
+        return;
+      }
+    } else {
+      if (flag0 & FT_ATTR_COPY_DOWNLOAD) {
+        if (flag0 & FT_ATTR_FILE) {
+        }
+        if (flag0 & FT_ATTR_DIR) {
+        }
+      }
+    }
+    if (m_bFTDlgShown) m_pFTDialog->setStatusText("File Transfer Operation Failed. Unknown data in the transfer queue");
+
+  } // if (!isTransferEnable())
+}
+
+bool
+FileTransfer::uploadFile()
+{
+  return false;
+}
+
+bool
+FileTransfer::downloadFile()
+{
+  return false;
+}
+
 bool 
 FileTransfer::procFileListDataMsg()
 {
@@ -183,7 +268,10 @@
 bool 
 FileTransfer::procFileDirSizeDataMsg()
 {
-  return false;
+  DWORD64 dw64DirSize = 0;
+  m_pReader->readFileDirSizeData(&dw64DirSize);
+  m_TransferQueue.clearFlagAt(m_dirSizeRqstNum, FT_ATTR_RESIZE_NEEDED);
+  return true;
 }
 
 bool 
diff --git a/vncviewer/FileTransfer.h b/vncviewer/FileTransfer.h
index 71ecf0a..53ebbb7 100644
--- a/vncviewer/FileTransfer.h
+++ b/vncviewer/FileTransfer.h
@@ -67,6 +67,10 @@
       FileInfo m_queueFileListRqst;
 
       TransferQueue m_TransferQueue;
+
+      void checkTransferQueue();
+      bool uploadFile();
+      bool downloadFile();
       
       bool procFileListDataMsg();
       bool procFileDownloadDataMsg();
@@ -81,6 +85,9 @@
       bool procFLRDownload(FileInfo *pFI);
       bool procFLRDelete(FileInfo *pFI);
       bool procFLRRename(FileInfo *pFI);
+
+      DWORD64 m_dw64SizeSending;
+      unsigned int m_dirSizeRqstNum;
       
     };
   }
