diff --git a/rfb/CFTMsgReader.cxx b/rfb/CFTMsgReader.cxx
new file mode 100644
index 0000000..66adbf5
--- /dev/null
+++ b/rfb/CFTMsgReader.cxx
@@ -0,0 +1,162 @@
+/* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ *
+ * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
+ *
+ */
+
+// -=- CFTMsgReader.cxx
+
+#include <rfb/CFTMsgReader.h>
+
+using namespace rfb;
+
+CFTMsgReader::CFTMsgReader(rdr::InStream *pIS)
+{
+  m_pInStream = pIS;
+}
+
+CFTMsgReader::~CFTMsgReader()
+{
+
+}
+
+int 
+CFTMsgReader::readFileListData(FileInfo *pFileInfo)
+{
+  unsigned char flags = m_pInStream->readU8();
+  int numFiles = m_pInStream->readU16();
+  int dataSize = m_pInStream->readU16();
+  int compressedSize = m_pInStream->readU16();
+  
+  if (flags & 0x80) {
+    return -1;
+  } else {
+    if (numFiles > 0) {
+      char *pFilenames = new char[compressedSize];
+      SIZEDATAINFO *pSDI = new SIZEDATAINFO[numFiles];
+      for (int i = 0; i < numFiles; i++) {
+        pSDI[i].size = m_pInStream->readU32();
+        pSDI[i].data = m_pInStream->readU32();
+      }
+      m_pInStream->readBytes((void *)pFilenames, compressedSize);
+      createFileInfo(numFiles, pFileInfo, pSDI, pFilenames);
+      delete [] pSDI;
+      delete [] pFilenames;
+    }
+  }
+  return numFiles;
+}
+
+void * 
+CFTMsgReader::readFileDownloadData(unsigned int *pSize, unsigned int *pModTime)
+{
+  unsigned char compressLevel = m_pInStream->readU8();
+  int realSize = m_pInStream->readU16();
+  int compressedSize = m_pInStream->readU16();
+
+  if ((realSize == 0) && (compressedSize == 0)) {
+    *pSize = 0;
+    *pModTime = m_pInStream->readU32();
+    return NULL;
+  } else {
+    char *pFile = new char [compressedSize];
+    if (pFile == NULL) {
+      m_pInStream->skip(compressedSize);
+      *pModTime = 0;
+      return NULL;
+    } else {
+      m_pInStream->readBytes(pFile, compressedSize);
+      *pSize = compressedSize;
+      return pFile;
+    }
+  }
+}
+
+char * 
+CFTMsgReader::readFileUploadCancel(unsigned int *pReasonSize)
+{
+  m_pInStream->skip(1);
+  return readReasonMsg(pReasonSize);
+}
+
+char * 
+CFTMsgReader::readFileDownloadFailed(unsigned int *pReasonSize)
+{
+  m_pInStream->skip(1);
+  return readReasonMsg(pReasonSize);
+}
+
+int 
+CFTMsgReader::readFileDirSizeData(unsigned short *pDirSizeLow16, 
+                                 unsigned int *pDirSizeHigh32)
+{
+  m_pInStream->skip(1);
+  *pDirSizeLow16 = m_pInStream->readU16();
+  *pDirSizeHigh32 = m_pInStream->readU32();
+  return 1;
+}
+
+char * 
+CFTMsgReader::readFileLastRqstFailed(int *pTypeOfRequest, unsigned int *pReasonSize)
+{
+  *pTypeOfRequest = m_pInStream->readU8();
+  return readReasonMsg(pReasonSize);
+}
+
+bool 
+CFTMsgReader::createFileInfo(unsigned int numFiles, FileInfo *fi, 
+                             SIZEDATAINFO *pSDInfo, char *pFilenames)
+{
+  int pos = 0;
+  int size = 0;
+  for (unsigned int i = 0; i < numFiles; i++) {
+    size = pSDInfo[i].size;
+    if (size == FT_NET_ATTR_DIR) {
+      fi->add((pFilenames + pos), size, pSDInfo[i].data, FT_ATTR_DIR);
+    } else {
+      fi->add((pFilenames + pos), size, pSDInfo[i].data, FT_ATTR_FILE);
+    }
+    pos += strlen(pFilenames + pos) + 1;
+  }
+  return true;
+}
+
+char * 
+CFTMsgReader::readReasonMsg(unsigned int *pReasonSize)
+{
+  int reasonLen = m_pInStream->readU16();
+  int _reasonLen = reasonLen + 1;
+  char *pReason;
+  if (reasonLen == 0) {
+    *pReasonSize = 0;
+    return NULL;
+  } else {
+    pReason = new char [_reasonLen];
+    if (pReason == NULL) {
+      m_pInStream->skip(reasonLen);
+      *pReasonSize = 0;
+      return NULL;
+    }
+    m_pInStream->readBytes(pReason, reasonLen);
+    memset(((char *)pReason+reasonLen), '\0', 1);
+    return pReason;
+  }
+}
+
diff --git a/rfb/CFTMsgReader.h b/rfb/CFTMsgReader.h
new file mode 100644
index 0000000..b0e2c7a
--- /dev/null
+++ b/rfb/CFTMsgReader.h
@@ -0,0 +1,56 @@
+/* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ *
+ * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
+ *
+ */
+
+// -=- CFTMsgReader.h
+
+#ifndef __RFB_CFTMSGREADER_H__
+#define __RFB_CFTMSGREADER_H__
+
+#include <rdr/InStream.h>
+#include <rfb/FileInfo.h>
+
+namespace rfb {
+  class CFTMsgReader
+  {
+  public:
+    CFTMsgReader(rdr::InStream *pIS);
+    ~CFTMsgReader();
+    
+    int readFileListData(FileInfo *pFileInfo);
+    int readFileDirSizeData(unsigned short *pDirSizeLow16, unsigned int *pDirSizeHigh32);
+    
+    char *readFileUploadCancel(unsigned int *pReasonSize);
+    char *readFileDownloadFailed(unsigned int *pReasonSize);
+    char *readFileLastRqstFailed(int *pTypeOfRequest, unsigned int *pReasonSize);
+    void *readFileDownloadData(unsigned int *pSize, unsigned int *pModTime);
+    
+  private:
+    rdr::InStream *m_pInStream;
+    
+    bool createFileInfo(unsigned int numFiles, FileInfo *fi, 
+                        SIZEDATAINFO *pSDInfo, char *pFilenames);
+    char *readReasonMsg(unsigned int *pReasonSize);
+  };
+}
+
+#endif // __RFB_CFTMSGREADER_H__
diff --git a/rfb/CFTMsgWriter.cxx b/rfb/CFTMsgWriter.cxx
new file mode 100644
index 0000000..278cf80
--- /dev/null
+++ b/rfb/CFTMsgWriter.cxx
@@ -0,0 +1,182 @@
+/* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ *
+ * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
+ *
+ */
+
+// -=- CFTMsgWriter.cxx
+
+#include <rfb/CFTMsgWriter.h>
+
+using namespace rfb;
+
+CFTMsgWriter::CFTMsgWriter(rdr::OutStream *pOS)
+{
+  m_pOutStream = pOS;
+}
+
+CFTMsgWriter::~CFTMsgWriter()
+{
+}
+
+bool 
+CFTMsgWriter::writeFileListRqst(unsigned short dirnameLen, char *pDirName, 
+                                bool bDirOnly)
+{
+  if (dirnameLen >= FT_FILENAME_SIZE) return false;
+
+  unsigned char flags = 0;
+  if (bDirOnly) flags = 0x10;
+
+  m_pOutStream->writeU8(msgTypeFileListRequest);
+  m_pOutStream->writeU8(flags);
+  m_pOutStream->writeU16(dirnameLen);
+  m_pOutStream->writeBytes((void *)pDirName, dirnameLen);
+  m_pOutStream->flush();
+
+  return true;
+}
+
+
+bool 
+CFTMsgWriter::writeFileDownloadCancel(unsigned short reasonLen, char *pReason)
+{
+  m_pOutStream->writeU8(msgTypeFileDownloadCancel);
+  return writeU8U16StringMsg(reasonLen, pReason);
+}
+
+bool 
+CFTMsgWriter::writeFileDownloadRqst(unsigned short filenameLen, char *pFilename, 
+                                    unsigned int position)
+{
+  if (filenameLen >= FT_FILENAME_SIZE) return false;
+
+  m_pOutStream->writeU8(msgTypeFileDownloadRequest);
+  m_pOutStream->writeU8(0);
+  m_pOutStream->writeU16(filenameLen);
+  m_pOutStream->writeU32(position);
+  m_pOutStream->writeBytes(pFilename, filenameLen);
+  m_pOutStream->flush();
+
+  return true;
+}
+
+bool 
+CFTMsgWriter::writeFileUploadData(unsigned short dataSize, char *pData)
+{
+  m_pOutStream->writeU8(msgTypeFileUploadData);
+  m_pOutStream->writeU8(0);
+  m_pOutStream->writeU16(dataSize);
+  m_pOutStream->writeU16(dataSize);
+  m_pOutStream->writeBytes(pData, dataSize);
+  m_pOutStream->flush();
+
+  return true;
+}
+
+bool 
+CFTMsgWriter::writeFileUploadData(unsigned int modTime)
+{
+  m_pOutStream->writeU8(msgTypeFileUploadData);
+  m_pOutStream->writeU8(0);
+  m_pOutStream->writeU16(0);
+  m_pOutStream->writeU16(0);
+  m_pOutStream->writeU32(modTime);
+  m_pOutStream->flush();
+
+  return true;
+}
+
+bool 
+CFTMsgWriter::writeFileUploadFailed(unsigned short reasonLen, char *pReason)
+{
+  m_pOutStream->writeU8(msgTypeFileUploadFailed);
+  return writeU8U16StringMsg(reasonLen, pReason);
+}
+
+bool 
+CFTMsgWriter::writeFileUploadRqst(unsigned short filenameLen, char *pFilename, 
+                                  unsigned int position)
+{
+  if (filenameLen >= FT_FILENAME_SIZE) return false;
+
+  m_pOutStream->writeU8(msgTypeFileUploadRequest);
+  m_pOutStream->writeU8(0);
+  m_pOutStream->writeU16(filenameLen);
+  m_pOutStream->writeU32(position);
+  m_pOutStream->writeBytes((void *)pFilename, filenameLen);
+  m_pOutStream->flush();
+
+  return true;
+}
+
+bool 
+CFTMsgWriter::writeFileCreateDirRqst(unsigned short dirNameLen, char *pDirName)
+{
+  if (dirNameLen >= FT_FILENAME_SIZE) return false;
+
+  m_pOutStream->writeU8(msgTypeFileCreateDirRequest);
+  return writeU8U16StringMsg(dirNameLen, pDirName);
+}
+
+bool 
+CFTMsgWriter::writeFileDirSizeRqst(unsigned short dirNameLen, char *pDirName)
+{
+  if (dirNameLen >= FT_FILENAME_SIZE) return false;
+
+  m_pOutStream->writeU8(msgTypeFileDirSizeRequest);
+  return writeU8U16StringMsg(dirNameLen, pDirName);
+}
+
+bool 
+CFTMsgWriter::writeFileRenameRqst(unsigned short oldNameLen, unsigned short newNameLen,
+                                  char *pOldName, char *pNewName)
+{
+  if ((oldNameLen >= FT_FILENAME_SIZE) || (newNameLen >= FT_FILENAME_SIZE)) return false;
+
+  m_pOutStream->writeU8(msgTypeFileRenameRequest);
+  m_pOutStream->writeU8(0);
+  m_pOutStream->writeU16(oldNameLen);
+  m_pOutStream->writeU16(newNameLen);
+  m_pOutStream->writeBytes(pOldName, oldNameLen);
+  m_pOutStream->writeBytes(pNewName, newNameLen);
+  m_pOutStream->flush();
+  
+  return true;
+}
+
+bool 
+CFTMsgWriter::writeFileDeleteRqst(unsigned short nameLen, char *pName)
+{
+  if (nameLen >= FT_FILENAME_SIZE) return false;
+
+  m_pOutStream->writeU8(msgTypeFileDeleteRequest);
+  return writeU8U16StringMsg(nameLen, pName);
+}
+
+bool 
+CFTMsgWriter::writeU8U16StringMsg(unsigned short strLength, char *pString)
+{
+  m_pOutStream->writeU8(0);
+  m_pOutStream->writeU16(strLength);
+  m_pOutStream->writeBytes(pString, strLength);
+  m_pOutStream->flush();
+  return true;
+}
diff --git a/rfb/CFTMsgWriter.h b/rfb/CFTMsgWriter.h
new file mode 100644
index 0000000..c49c2aa
--- /dev/null
+++ b/rfb/CFTMsgWriter.h
@@ -0,0 +1,67 @@
+/* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
+ *    
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
+ * USA.
+ *
+ * TightVNC distribution homepage on the Web: http://www.tightvnc.com/
+ *
+ */
+
+// -=- CFTMsgWriter.h
+
+#ifndef __RFB_CFTMSGWRITER_H__
+#define __RFB_CFTMSGWRITER_H__
+
+#include <rdr/types.h>
+#include <rdr/OutStream.h>
+#include <rfb/msgTypes.h>
+#include <rfb/fttypes.h>
+
+namespace rfb {
+  class CFTMsgWriter
+  {
+  public:
+    CFTMsgWriter(rdr::OutStream *pOS);
+    ~CFTMsgWriter();
+    
+    bool writeFileListRqst(unsigned short dirnameLen, char *pDirName, bool bDirOnly);
+    
+    bool writeFileDownloadCancel(unsigned short reasonLen, char *pReason);
+    bool writeFileDownloadRqst(unsigned short filenameLen, char *pFilename, 
+                               unsigned int position);
+    
+    bool writeFileUploadData(unsigned short dataSize, char *pData);
+    bool writeFileUploadData(unsigned int modTime);
+    bool writeFileUploadFailed(unsigned short reasonLen, char *pReason);
+    bool writeFileUploadRqst(unsigned short filenameLen, char *pFilename, 
+                             unsigned int position);
+    
+    bool writeFileCreateDirRqst(unsigned short dirNameLen, char *pDirName);
+    bool writeFileDirSizeRqst(unsigned short dirNameLen, char *pDirName);
+    
+    bool writeFileRenameRqst(unsigned short oldNameLen, unsigned short newNameLen,
+                             char *pOldName, char *pNewName);
+    bool writeFileDeleteRqst(unsigned short nameLen, char *pName);
+    
+  private:
+    rdr::OutStream *m_pOutStream;
+    
+    bool writeU8U16StringMsg(unsigned short strLength, char *pString);
+  };
+}
+
+#endif // __RFB_CFTMSGWRITER_H__
diff --git a/rfb/DirManager.h b/rfb/DirManager.h
index d59ffde..c820f64 100644
--- a/rfb/DirManager.h
+++ b/rfb/DirManager.h
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileInfo.cxx b/rfb/FileInfo.cxx
index 34074f7..e97e0ad 100644
--- a/rfb/FileInfo.cxx
+++ b/rfb/FileInfo.cxx
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileInfo.h b/rfb/FileInfo.h
index 4dccc95..270eeee 100644
--- a/rfb/FileInfo.h
+++ b/rfb/FileInfo.h
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileManager.cxx b/rfb/FileManager.cxx
index c0403a7..be1d2a8 100644
--- a/rfb/FileManager.cxx
+++ b/rfb/FileManager.cxx
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileManager.h b/rfb/FileManager.h
index a673f4d..f4e8596 100644
--- a/rfb/FileManager.h
+++ b/rfb/FileManager.h
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileReader.cxx b/rfb/FileReader.cxx
index 063b742..a8cd272 100644
--- a/rfb/FileReader.cxx
+++ b/rfb/FileReader.cxx
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileReader.h b/rfb/FileReader.h
index 12cdfa1..0c985d8 100644
--- a/rfb/FileReader.h
+++ b/rfb/FileReader.h
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileWriter.cxx b/rfb/FileWriter.cxx
index 9c06c37..2bed576 100644
--- a/rfb/FileWriter.cxx
+++ b/rfb/FileWriter.cxx
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/FileWriter.h b/rfb/FileWriter.h
index e522ae1..73094a7 100644
--- a/rfb/FileWriter.h
+++ b/rfb/FileWriter.h
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/SFTMsgReader.cxx b/rfb/SFTMsgReader.cxx
index 3d9aeb2..2a5d283 100644
--- a/rfb/SFTMsgReader.cxx
+++ b/rfb/SFTMsgReader.cxx
@@ -106,10 +106,40 @@
   return readU8U16StringMsg(pNameSize, pName);
 }
     
-bool readFileRenameRqst(unsigned int *pOldNameSize, unsigned int *pNewNameSize,
-                        char *pOldName, char *pNewName)
+bool 
+SFTMsgReader::readFileRenameRqst(unsigned int *pOldNameSize, 
+                                 unsigned int *pNewNameSize,
+                                 char *pOldName, char *pNewName)
 {
-  return false;
+  m_pIS->skip(1);
+
+  unsigned int oldNameSize = m_pIS->readU16();
+  unsigned int newNameSize = m_pIS->readU16();
+
+  if ((oldNameSize >= *pOldNameSize) || (newNameSize >= *pNewNameSize)) {
+    m_pIS->skip(oldNameSize);
+    m_pIS->skip(newNameSize);
+    return false;
+  }
+
+  if (oldNameSize != 0) {
+    m_pIS->readBytes(pOldName, oldNameSize);
+    pOldName[oldNameSize] = '\0';
+    *pOldNameSize = oldNameSize;
+  } else {
+    *pOldNameSize = 0;
+    pOldName[0] = '\0';
+  }
+
+  if (newNameSize != 0) {
+    m_pIS->readBytes(pNewName, newNameSize);
+    pNewName[newNameSize] = '\0';
+  } else {
+    *pNewNameSize = 0;
+    pNewName[0] = '\0';
+  }
+
+  return true;
 }
 
 bool
diff --git a/rfb/SFTMsgWriter.cxx b/rfb/SFTMsgWriter.cxx
index 4edfc46..dfd0ad5 100644
--- a/rfb/SFTMsgWriter.cxx
+++ b/rfb/SFTMsgWriter.cxx
@@ -60,9 +60,13 @@
       unsigned int len = strlen(pName);
 
       memcpy((void *)&pFilenames[pos], pName, len + 1);
-      pos += len + 2;
+      pos += (len + 1);
 
-      m_pOS->writeU32(pFileInfo->getSizeAt(i));
+      if (pFileInfo->getFlagsAt(i) & FT_ATTR_DIR) {
+        m_pOS->writeU32(FT_NET_ATTR_DIR);
+      } else {
+        m_pOS->writeU32(pFileInfo->getSizeAt(i));
+      }
       m_pOS->writeU32(pFileInfo->getDataAt(i));
     }
 
diff --git a/rfb/TransferQueue.cxx b/rfb/TransferQueue.cxx
index 58b9273..0180752 100644
--- a/rfb/TransferQueue.cxx
+++ b/rfb/TransferQueue.cxx
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/TransferQueue.h b/rfb/TransferQueue.h
index 02a043d..ba748e0 100644
--- a/rfb/TransferQueue.h
+++ b/rfb/TransferQueue.h
@@ -1,4 +1,6 @@
 /* Copyright (C) 2005 TightVNC Team.  All Rights Reserved.
+ *
+ * Developed by Dennis Syrovatsky.
  *    
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
diff --git a/rfb/fttypes.h b/rfb/fttypes.h
index 1e9f601..9cfbb29 100644
--- a/rfb/fttypes.h
+++ b/rfb/fttypes.h
@@ -32,6 +32,8 @@
 
 #define FT_MAX_SENDING_SIZE 8192
 
+#define FT_NET_ATTR_DIR ((unsigned int)-1)
+
 #define FT_ATTR_UNKNOWN			    0x00000000
 #define FT_ATTR_FILE			    0x00000001
 #define FT_ATTR_DIR 			    0x00000002
diff --git a/rfb/rfb.dsp b/rfb/rfb.dsp
index 4e18c7b..bac1e00 100644
--- a/rfb/rfb.dsp
+++ b/rfb/rfb.dsp
@@ -118,6 +118,14 @@
 # End Source File
 # Begin Source File
 
+SOURCE=.\CFTMsgReader.cxx
+# End Source File
+# Begin Source File
+
+SOURCE=.\CFTMsgWriter.cxx
+# End Source File
+# Begin Source File
+
 SOURCE=.\CMsgHandler.cxx
 # End Source File
 # Begin Source File
@@ -364,6 +372,14 @@
 # End Source File
 # Begin Source File
 
+SOURCE=.\CFTMsgReader.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\CFTMsgWriter.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\CMsgHandler.h
 # End Source File
 # Begin Source File
