diff --git a/vncviewer/FTBrowseDlg.cxx b/vncviewer/FTBrowseDlg.cxx
index 81cd882..7c88ff6 100644
--- a/vncviewer/FTBrowseDlg.cxx
+++ b/vncviewer/FTBrowseDlg.cxx
@@ -30,6 +30,8 @@
 {
   m_pFTDlg = pFTDlg;
   m_hwndDlg = NULL;
+  m_hwndTree = NULL;
+  m_hParentItem = NULL;
 }
 
 FTBrowseDlg::~FTBrowseDlg()
@@ -46,6 +48,8 @@
 
   if (m_hwndDlg == NULL) return false;
 
+  m_hwndTree = GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE);
+
   ShowWindow(m_hwndDlg, SW_SHOW);
   UpdateWindow(m_hwndDlg);
 
@@ -64,17 +68,70 @@
   TVITEM tvi;
   TVINSERTSTRUCT tvins;
 
+  while (TreeView_GetChild(m_hwndTree, m_hParentItem) != NULL) {
+    TreeView_DeleteItem(m_hwndTree, TreeView_GetChild(m_hwndTree, m_hParentItem));
+  }
+
   for (unsigned int i = 0; i < pFI->getNumEntries(); i++)
   {
     tvi.mask = TVIF_TEXT;
     tvi.pszText = pFI->getNameAt(i);;
-    tvins.hParent = NULL;
+    tvins.hParent = m_hParentItem;
     tvins.item = tvi;
-    tvins.hParent = TreeView_InsertItem(GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE), &tvins);
-    TreeView_InsertItem(GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE), &tvins);
+    tvins.hParent = TreeView_InsertItem(m_hwndTree, &tvins);
+    TreeView_InsertItem(m_hwndTree, &tvins);
   }
 }
 
+char *
+FTBrowseDlg::getTVPath(HTREEITEM hTItem)
+{
+  char path[FT_FILENAME_SIZE];
+  char szText[FT_FILENAME_SIZE];
+
+  TVITEM tvi;
+  path[0] = '\0';
+
+  do {
+    tvi.mask = TVIF_TEXT | TVIF_HANDLE;
+    tvi.hItem = hTItem;
+    tvi.pszText = szText;
+    tvi.cchTextMax = FT_FILENAME_SIZE;
+    TreeView_GetItem(m_hwndTree, &tvi);
+    sprintf(path, "%s\\%s", path, tvi.pszText);
+    hTItem = TreeView_GetParent(m_hwndTree, hTItem);
+  } while(hTItem != NULL);
+
+  return pathInvert(path);
+}
+
+char *
+FTBrowseDlg::pathInvert(char *pPath)
+{
+  int len = strlen(pPath);
+  m_szPath[0] = '\0';
+  char *pos = NULL;
+  
+  while ((pos = strrchr(pPath, '\\')) != NULL) {
+    if (strlen(m_szPath) == 0) {
+      strcpy(m_szPath, (pos + 1));
+    } else {
+      sprintf(m_szPath, "%s\\%s", m_szPath, (pos + 1));
+    }
+    *pos = '\0';
+  }
+
+  m_szPath[len] = '\0';
+  return m_szPath;
+}
+
+char *
+FTBrowseDlg::getPath()
+{
+  GetDlgItemText(m_hwndDlg, IDC_FTBROWSEPATH, m_szPath, FT_FILENAME_SIZE);
+  return m_szPath;
+}
+
 BOOL CALLBACK 
 FTBrowseDlg::FTBrowseDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
@@ -92,8 +149,10 @@
       switch (LOWORD(wParam))
       {
       case IDOK:
+        _this->m_pFTDlg->onEndBrowseDlg(true);
         return FALSE;
       case IDCANCEL:
+        _this->m_pFTDlg->onEndBrowseDlg(false);
         return FALSE;
       }
     }
@@ -105,16 +164,23 @@
       switch (((LPNMHDR) lParam)->code)
       {
       case TVN_SELCHANGED:
+        SetDlgItemText(hwnd, IDC_FTBROWSEPATH, _this->getTVPath(((NMTREEVIEW *) lParam)->itemNew.hItem));
         return FALSE;
       case TVN_ITEMEXPANDING:
+        {
+          NMTREEVIEW *nmCode = (NMTREEVIEW *) lParam;
+          if (nmCode->action == 2) {
+            _this->m_hParentItem = nmCode->itemNew.hItem;
+            _this->m_pFTDlg->getBrowseItems(_this->getTVPath(_this->m_hParentItem));
+          }
+        }
         return FALSE;
       }
-      break;
-    }
     break;
     case WM_CLOSE:
-    case WM_DESTROY:
+      _this->m_pFTDlg->onEndBrowseDlg(false);
       return FALSE;
     }
+  }
     return 0;
 }
diff --git a/vncviewer/FTBrowseDlg.h b/vncviewer/FTBrowseDlg.h
index 0ebf569..1a5e663 100644
--- a/vncviewer/FTBrowseDlg.h
+++ b/vncviewer/FTBrowseDlg.h
@@ -47,10 +47,18 @@
       void destroy();
 
       void addItems(FileInfo *pFI);
+      char *getPath();
 
     private:
       HWND m_hwndDlg;
+      HWND m_hwndTree;
       FTDialog *m_pFTDlg;
+      HTREEITEM m_hParentItem;
+
+      char m_szPath[FT_FILENAME_SIZE];
+
+      char *pathInvert(char *pPath);
+      char *getTVPath(HTREEITEM hTItem);
     };
   }
 }
diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx
index b7ec9ba..5998a0f 100644
--- a/vncviewer/FTDialog.cxx
+++ b/vncviewer/FTDialog.cxx
@@ -36,6 +36,7 @@
   m_hInstance = hInst;
 
   m_bDlgShown = false;
+  m_bLocalBrowsing = true;
   m_bCloseDlgAfterCancel = false;
 
   m_pLocalLV = NULL;
@@ -362,9 +363,35 @@
 }
 
 void 
+FTDialog::onEndBrowseDlg(bool bResult)
+{
+  if (m_pBrowseDlg == NULL) return;
+
+  if (bResult) {
+    if (m_bLocalBrowsing) {
+      strcpy(m_szLocalPathTmp, m_pBrowseDlg->getPath());
+      showLocalLVItems();
+    } else {
+      strcpy(m_szRemotePathTmp, m_pBrowseDlg->getPath());
+      showRemoteLVItems();
+    }
+  }
+
+  delete m_pBrowseDlg;
+  m_pBrowseDlg = NULL;
+}
+
+void 
 FTDialog::onLocalBrowse()
 {
+  if (m_pBrowseDlg != NULL) return;
+  
+  m_bLocalBrowsing = true;
 
+  m_pBrowseDlg = new FTBrowseDlg(this);
+  m_pBrowseDlg->create();
+
+  getBrowseItems("");
 }
 
 void 
@@ -372,6 +399,8 @@
 {
   if (m_pBrowseDlg != NULL) return;
   
+  m_bLocalBrowsing = false;
+
   m_pBrowseDlg = new FTBrowseDlg(this);
   m_pBrowseDlg->create();
 
@@ -881,6 +910,19 @@
 }
 
 void 
+FTDialog::getBrowseItems(char *pPath)
+{
+  if (m_bLocalBrowsing) {
+    FileInfo fi;
+    FolderManager fm;
+    fm.getDirInfo(pPath, &fi, 1);
+    if (m_pBrowseDlg != NULL) m_pBrowseDlg->addItems(&fi);
+  } else {
+    m_pFileTransfer->requestFileList(pPath, FT_FLR_DEST_BROWSE, true);
+  }
+}
+
+void 
 FTDialog::addBrowseItems(FileInfo *pFI)
 {
   if (m_pBrowseDlg == NULL) return;
diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h
index d505e5f..36cb669 100644
--- a/vncviewer/FTDialog.h
+++ b/vncviewer/FTDialog.h
@@ -60,6 +60,8 @@
       void addRemoteLVItems(FileInfo *pFI);
       void reqFolderUnavailable();
 
+      void onEndBrowseDlg(bool bResult);
+      void getBrowseItems(char *pPath);
       void addBrowseItems(FileInfo *pFI);
 
       void setStatusText(LPCSTR format,...);
@@ -132,6 +134,7 @@
       void setButtonsState();
       
       bool m_bDlgShown;
+      bool m_bLocalBrowsing;
       bool m_bCloseDlgAfterCancel;
 
       UINT m_msgCheckDeleteQueue;
