diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c
index 92c2734..2691a94 100644
--- a/dlls/hhctrl.ocx/help.c
+++ b/dlls/hhctrl.ocx/help.c
@@ -42,6 +42,8 @@
 #define WINTYPE_DEFAULT_HEIGHT      640
 #define WINTYPE_DEFAULT_NAVWIDTH    250
 
+static const WCHAR szEmpty[] = {0};
+
 typedef struct tagHHInfo
 {
     HH_WINTYPEW *pHHWinType;
@@ -50,6 +52,7 @@
     HINSTANCE hInstance;
     LPWSTR szCmdLine;
     HWND hwndTabCtrl;
+    HWND hwndSizeBar;
     HFONT hFont;
 } HHInfo;
 
@@ -82,14 +85,117 @@
     return string;
 }
 
+/* Size Bar */
+
+#define SIZEBAR_WIDTH   4
+
+static const WCHAR szSizeBarClass[] = {
+    'H','H',' ','S','i','z','e','B','a','r',0
+};
+
+/* Draw the SizeBar */
+static void SB_OnPaint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    HDC hdc;
+    RECT rc;
+    
+    hdc = BeginPaint(hWnd, &ps);
+
+    GetClientRect(hWnd, &rc);
+
+    /* dark frame */
+    rc.right += 1;
+    rc.bottom -= 1;
+    FrameRect(hdc, &rc, GetStockObject(GRAY_BRUSH));
+
+    /* white highlight */
+    SelectObject(hdc, GetStockObject(WHITE_PEN));
+    MoveToEx(hdc, rc.right, 1, NULL);
+    LineTo(hdc, 1, 1);
+    LineTo(hdc, 1, rc.bottom - 1);
+
+    
+    MoveToEx(hdc, 0, rc.bottom, NULL);
+    LineTo(hdc, rc.right, rc.bottom);
+
+    EndPaint(hWnd, &ps);
+}
+
+LRESULT CALLBACK SizeBar_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    switch (message)
+    {
+        case WM_PAINT:
+            SB_OnPaint(hWnd);
+            break;
+        default:
+            return DefWindowProcW(hWnd, message, wParam, lParam);
+    }
+
+    return 0;
+}
+
+static void HH_RegisterSizeBarClass(HHInfo *pHHInfo)
+{
+    WNDCLASSEXW wcex;
+
+    wcex.cbSize         = sizeof(WNDCLASSEXW);
+    wcex.style          = 0;
+    wcex.lpfnWndProc    = (WNDPROC)SizeBar_WndProc;
+    wcex.cbClsExtra     = 0;
+    wcex.cbWndExtra     = 0;
+    wcex.hInstance      = pHHInfo->hInstance;
+    wcex.hIcon          = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION);
+    wcex.hCursor        = LoadCursorW(NULL, (LPCWSTR)IDC_SIZEWE);
+    wcex.hbrBackground  = (HBRUSH)(COLOR_MENU + 1);
+    wcex.lpszMenuName   = NULL;
+    wcex.lpszClassName  = szSizeBarClass;
+    wcex.hIconSm        = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION);
+
+    RegisterClassExW(&wcex);
+}
+
+static void SB_GetSizeBarRect(HHInfo *pHHInfo, RECT *rc)
+{
+    RECT rectWND, rectTB, rectNP;
+
+    GetClientRect(pHHInfo->pHHWinType->hwndHelp, &rectWND);
+    GetClientRect(pHHInfo->pHHWinType->hwndToolBar, &rectTB);
+    GetClientRect(pHHInfo->pHHWinType->hwndNavigation, &rectNP);
+
+    rc->left = rectNP.right;
+    rc->top = rectTB.bottom;
+    rc->bottom = rectWND.bottom - rectTB.bottom;
+    rc->right = SIZEBAR_WIDTH;
+}
+
+static BOOL HH_AddSizeBar(HHInfo *pHHInfo)
+{
+    HWND hWnd;
+    HWND hwndParent = pHHInfo->pHHWinType->hwndHelp;
+    DWORD dwStyles = WS_CHILDWINDOW | WS_VISIBLE | WS_OVERLAPPED;
+    DWORD dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
+    RECT rc;
+
+    SB_GetSizeBarRect(pHHInfo, &rc);
+
+    hWnd = CreateWindowExW(dwExStyles, szSizeBarClass, szEmpty, dwStyles,
+                           rc.left, rc.top, rc.right, rc.bottom,
+                           hwndParent, NULL, pHHInfo->hInstance, NULL);
+    if (!hWnd)
+        return FALSE;
+
+    pHHInfo->hwndSizeBar = hWnd;
+    return TRUE;
+}
+
 /* Child Window */
 
 static const WCHAR szChildClass[] = {
     'H','H',' ','C','h','i','l','d',0
 };
 
-static const WCHAR szEmpty[] = {0};
-
 static void Child_OnPaint(HWND hWnd)
 {
     PAINTSTRUCT ps;
@@ -397,18 +503,16 @@
 
 static void HP_GetHTMLRect(HHInfo *pHHInfo, RECT *rc)
 {
-    HWND hwndParent = pHHInfo->pHHWinType->hwndHelp;
-    HWND hwndToolbar = pHHInfo->pHHWinType->hwndToolBar;
-    HWND hwndNavigation = pHHInfo->pHHWinType->hwndNavigation;
-    RECT rectTB, rectWND, rectNP;
+    RECT rectTB, rectWND, rectNP, rectSB;
 
-    GetClientRect(hwndParent, &rectWND);
-    GetClientRect(hwndToolbar, &rectTB);
-    GetClientRect(hwndNavigation, &rectNP);
+    GetClientRect(pHHInfo->pHHWinType->hwndHelp, &rectWND);
+    GetClientRect(pHHInfo->pHHWinType->hwndToolBar, &rectTB);
+    GetClientRect(pHHInfo->pHHWinType->hwndNavigation, &rectNP);
+    GetClientRect(pHHInfo->hwndSizeBar, &rectSB);
 
-    rc->left = rectNP.right;
+    rc->left = rectNP.right + rectSB.right;
     rc->top = rectTB.bottom;
-    rc->right = rectWND.right - rectNP.right;
+    rc->right = rectWND.right - rc->left;
     rc->bottom = rectWND.bottom - rectTB.bottom;
 }
 
@@ -451,7 +555,7 @@
     if (!pHHInfo)
         return;
 
-    /* Only resize the Navigation pane vertically */
+    /* Only resize the Navigation pane and SizeBar vertically */
     if (HIWORD(lParam))
     {
         NP_GetNavigationRect(pHHInfo, &rc);
@@ -462,6 +566,10 @@
         SetWindowPos(pHHInfo->hwndTabCtrl, HWND_TOP, 0, 0,
                      rc.right - TAB_RIGHT_PADDING,
                      rc.bottom - TAB_TOP_PADDING, SWP_NOMOVE);
+
+        SB_GetSizeBarRect(pHHInfo, &rc);
+        SetWindowPos(pHHInfo->hwndSizeBar, HWND_TOP, 0, 0,
+                     rc.right, rc.bottom, SWP_NOMOVE);
     }
 
     HP_GetHTMLRect(pHHInfo, &rc);
@@ -608,6 +716,11 @@
     if (!HH_AddNavigationPane(pHHInfo))
         return FALSE;
 
+    HH_RegisterSizeBarClass(pHHInfo);
+
+    if (!HH_AddSizeBar(pHHInfo))
+        return FALSE;
+
     if (!HH_AddHTMLPane(pHHInfo))
         return FALSE;
 
