diff --git a/rfb_win32/ToolBar.cxx b/rfb_win32/ToolBar.cxx
new file mode 100644
index 0000000..77a2f3d
--- /dev/null
+++ b/rfb_win32/ToolBar.cxx
@@ -0,0 +1,201 @@
+/* Copyright (C) 2004 TightVNC Team.  All Rights Reserved.
+ *    
+ * 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.
+ */
+
+// -=- ToolBar control class.
+
+#include "ToolBar.h"
+
+ToolBar::ToolBar() : hwndToolBar(0), tbID(-1) {
+  INITCOMMONCONTROLSEX icex;
+
+  // Ensure that the common control DLL is loaded
+  icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
+  icex.dwICC  = ICC_BAR_CLASSES;
+  InitCommonControlsEx(&icex);
+}
+
+ToolBar::~ToolBar() {
+  DestroyWindow(getHandle());
+}
+
+bool ToolBar::create(int _tbID, HWND _parentHwnd, DWORD dwStyle) {
+  parentHwnd = _parentHwnd;
+  dwStyle |= WS_CHILD;
+
+  // Create the ToolBar window
+  hwndToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, 0, dwStyle, 
+    0, 0, 25, 25, parentHwnd, (HMENU)_tbID, GetModuleHandle(0), 0);
+
+  if (hwndToolBar) {
+    tbID = _tbID;
+
+    // It's required for backward compatibility
+    SendMessage(hwndToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
+  }
+  return (hwndToolBar ? true : false);
+};
+
+int ToolBar::addBitmap(int nButtons, UINT bitmapID) {
+  assert(nButtons > 0);
+  TBADDBITMAP resBitmap;
+  resBitmap.hInst = GetModuleHandle(0);
+  resBitmap.nID = bitmapID;
+  return SendMessage(getHandle(), TB_ADDBITMAP, nButtons, (LPARAM)&resBitmap);
+}
+
+int ToolBar::addSystemBitmap(UINT stdBitmapID) {
+  TBADDBITMAP resBitmap;
+  resBitmap.hInst = HINST_COMMCTRL;
+  resBitmap.nID = stdBitmapID;
+  return SendMessage(getHandle(), TB_ADDBITMAP, 0, (LPARAM)&resBitmap);
+}
+
+bool ToolBar::setBitmapSize(int width, int height) {
+  int result = SendMessage(getHandle(), TB_SETBITMAPSIZE, 
+    0, MAKELONG(width, height));
+  return (result ? true : false);
+}
+
+bool ToolBar::addButton(int iBitmap, int idCommand, BYTE state, BYTE style, UINT dwData, int iString) {
+  TBBUTTON tbb;
+  tbb.iBitmap = iBitmap;
+  tbb.idCommand = idCommand;
+  tbb.fsState = state;
+  tbb.fsStyle = style;
+  tbb.dwData = dwData;
+  tbb.iString = iString;
+
+  int result = SendMessage(getHandle(), TB_ADDBUTTONS, 1, (LPARAM)&tbb);
+  if (result) {
+    SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
+  }
+  return (result ? true : false);
+}
+
+bool ToolBar::addNButton(int nButtons, LPTBBUTTON tbb) {
+  assert(nButtons > 0);
+  assert(tbb > 0);
+  int result = SendMessage(getHandle(), TB_ADDBUTTONS, nButtons, (LPARAM)tbb);
+  if (result) {
+    SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
+  }
+  return (result ? true : false);
+}
+
+bool ToolBar::deleteButton(int indexButton) {
+  assert(indexButton >= 0);
+  int result = SendMessage(getHandle(), TB_DELETEBUTTON, indexButton, 0);
+  
+  if (result) {
+    SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
+  }
+  return (result ? true : false);
+}
+
+bool ToolBar::insertButton(int indexButton, LPTBBUTTON tbb) {
+  assert(indexButton >= 0);
+  assert(tbb > 0);
+  int result = SendMessage(getHandle(), TB_INSERTBUTTON, 
+    indexButton, (LPARAM)tbb);
+
+  if (result) {
+    SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
+  }
+  return (result ? true : false);
+}
+
+int ToolBar::getButtonInfo(int idButton, TBBUTTONINFO *btnInfo) {
+  assert(idButton >= 0);
+  assert(btnInfo > 0);
+  return SendMessage(getHandle(), TB_GETBUTTONINFO, idButton, (LPARAM)btnInfo);
+}
+
+int ToolBar::getButtonsHeight() {
+  return HIWORD(SendMessage(getHandle(), TB_GETBUTTONSIZE, 0, 0));
+}
+
+int ToolBar::getButtonsWidth() {
+  return LOWORD(SendMessage(getHandle(), TB_GETBUTTONSIZE, 0, 0));
+}
+
+bool ToolBar::setButtonInfo(int idButton, TBBUTTONINFO* btnInfo) {
+  assert(idButton >= 0);
+  assert(btnInfo > 0);
+  int result = SendMessage(getHandle(), TB_SETBUTTONINFO, 
+    idButton, (LPARAM)(LPTBBUTTONINFO)btnInfo);
+  return (result ? true : false);
+}
+
+bool ToolBar::checkButton(int idButton, bool check) {
+  assert(idButton >= 0);
+  int result = SendMessage(getHandle(), TB_CHECKBUTTON, 
+    idButton, MAKELONG(check, 0));
+  return (result ? true : false);
+}
+
+bool ToolBar::enableButton(int idButton, bool enable) {
+  assert(idButton >= 0);
+  int result = SendMessage(getHandle(), TB_ENABLEBUTTON, 
+    idButton, MAKELONG(enable, 0));
+  return (result ? true : false);
+}
+
+bool ToolBar::pressButton(int idButton, bool press) {
+  assert(idButton >= 0);
+  int result = SendMessage(getHandle(), TB_PRESSBUTTON, 
+    idButton, MAKELONG(press, 0));
+  return (result ? true : false);
+}
+
+bool ToolBar::getButtonRect(int nIndex, LPRECT buttonRect) {
+  int result = SendMessage(getHandle(), TB_GETITEMRECT, 
+    nIndex, (LPARAM)buttonRect);
+  return (result ? true : false);
+}
+
+bool ToolBar::setButtonSize(int width, int height) {
+  assert(width > 0);
+  assert(height > 0);
+  int result = SendMessage(getHandle(), TB_SETBUTTONSIZE, 
+    0, MAKELONG(width, height));
+  if (result) {
+    SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
+    return true;
+  }
+  return false; 
+}
+
+void ToolBar::autoSize() {
+  DWORD style = SendMessage(getHandle(), TB_GETSTYLE,  0, 0);
+  if (style & CCS_NORESIZE) {
+    RECT r, btnRect;
+    GetClientRect(parentHwnd, &r);
+    getButtonRect(0, &btnRect);
+    int height = getButtonsHeight() + btnRect.top * 2 + 2;
+    SetWindowPos(getHandle(), HWND_TOP, 0, 0, r.right - r.left, height, 
+      SWP_NOMOVE);
+  } else {
+    SendMessage(getHandle(), TB_AUTOSIZE, 0, 0);
+  }
+}
+
+int ToolBar::getHeight() {
+  RECT r;
+  GetWindowRect(getHandle(), &r);
+  return r.bottom - r.top;
+}
diff --git a/rfb_win32/ToolBar.h b/rfb_win32/ToolBar.h
new file mode 100644
index 0000000..d1c0d0a
--- /dev/null
+++ b/rfb_win32/ToolBar.h
@@ -0,0 +1,110 @@
+/* Copyright (C) 2004 TightVNC Team.  All Rights Reserved.
+ *    
+ * 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.
+ */
+
+// -=- ToolBar.h
+
+#include <windows.h>
+#include <commctrl.h>
+#include <assert.h>
+
+class ToolBar {
+public:
+  ToolBar();
+  virtual ~ToolBar();
+
+  // create() creates a windows toolbar. dwStyle is a combination of 
+  // the toolbar control and button styles. It returns TRUE if successful,
+  // or FALSE otherwise.
+  bool create(int tbID, HWND parentHwnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT);
+
+  // -=- Button images operations
+
+  // addBitmap() adds one or more images from resources to the list of button
+  // images available for a toolbar. Returns the index of the first new image 
+  // if successful, or -1 otherwise.
+  int addBitmap(int nButtons, UINT bitmapID);
+
+  // addSystemBitmap() adds the system-defined button bitmaps to the list
+  // of the toolbar button specifying by stdBitmapID. Returns the index of 
+  // the first new image if successful, or -1 otherwise.
+  int addSystemBitmap(UINT stdBitmapID);
+
+  // setBitmapSize() sets the size of the bitmapped images to be added
+  // to a toolbar. It returns TRUE if successful, or FALSE otherwise.
+  // You must call it before addBitmap().
+  bool setBitmapSize(int width, int height);
+
+  // -=- Button operations
+
+  // addButton() adds one button.
+  bool addButton(int iBitmap, int idCommand, BYTE state=TBSTATE_ENABLED, BYTE style=TBSTYLE_BUTTON, UINT dwData=0, int iString=0);
+
+  // addNButton() adds nButtons buttons to a toolbar.
+  bool addNButton(int nButtons, LPTBBUTTON tbb);
+
+  // deleteButton() removes a button from the toolbar.
+  bool deleteButton(int nIndex);
+
+  // insertButton() inserts a button in a toolbar control by index.
+  bool insertButton(int nIndex, LPTBBUTTON tbb);
+
+  // getButtonInfo() retrieves extended information about a toolbar's button.
+  // It returns index of the button if successful, or -1 otherwise.
+  int getButtonInfo(int idButton, TBBUTTONINFO *btnInfo);
+
+  // getButtonsHeight() retrieves the height of the toolbar buttons.
+  int getButtonsHeight();
+
+  // getButtonsWidth() retrieves the width of the toolbar buttons.
+  int getButtonsWidth();
+
+  // setButtonInfo() sets the information for an existing button in a toolbar.
+  bool setButtonInfo(int idButton, TBBUTTONINFO* ptbbi);
+
+  // checkButton() checks or unchecks a given button in a toolbar control.
+  bool checkButton(int idButton, bool check);
+
+  // enableButton() enables or disables the specified button in the toolbar.
+  bool enableButton(int idButton, bool enable);
+
+  // pressButton() presses or releases the specified button in the toolbar.
+  bool pressButton(int idButton, bool press);
+
+  // getButtonRect() gets the bounding rectangle of a button in a toolbar.
+  bool getButtonRect(int nIndex, LPRECT buttonRect);
+  
+  // setButtonSize() sets the size of the buttons to be added to a toolbar.
+  // Button size must be largen the button bitmap.
+  bool setButtonSize(int width, int height);
+
+   
+  
+  // autoSize() resizes the toolbar window.
+  void autoSize();
+
+  // getHandle() returns handle to a toolbar window.
+  HWND getHandle() { return hwndToolBar; }
+
+  // getHeight() returns the toolbar window height.
+  int getHeight();
+
+protected:
+  HWND hwndToolBar;
+  HWND parentHwnd;
+  int tbID;
+};
