diff --git a/controls/button.c b/controls/button.c
index 1fa628f..9210f7e 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -20,6 +20,7 @@
 static void UB_Paint( WND *wndPtr, HDC hDC, WORD action );
 static void OB_Paint( WND *wndPtr, HDC hDC, WORD action );
 static void BUTTON_CheckAutoRadioButton( WND *wndPtr );
+static void BUTTON_DrawPushButton( WND *wndPtr, HDC hDC, WORD action, BOOL pushedState);
 
 #define MAX_BTN_TYPE  12
 
@@ -233,12 +234,17 @@
 
     case BM_SETIMAGE:
 	oldHbitmap = infoPtr->hImage;
-	if(wndPtr->dwStyle & BS_BITMAP)
+	if ((wndPtr->dwStyle & BS_BITMAP) || (wndPtr->dwStyle & BS_ICON))
 	    infoPtr->hImage = (HANDLE) lParam;
 	return oldHbitmap;
 
     case BM_GETIMAGE:
-        return infoPtr->hImage;
+        if (wParam == IMAGE_BITMAP)
+	    return (HBITMAP)infoPtr->hImage;
+	else if (wParam == IMAGE_ICON)
+	    return (HICON)infoPtr->hImage;
+	else
+	    return NULL;
 
     case BM_GETCHECK16:
     case BM_GETCHECK:
@@ -309,9 +315,31 @@
 /**********************************************************************
  *       Push Button Functions
  */
-
 static void PB_Paint( WND *wndPtr, HDC hDC, WORD action )
 {
+    BUTTONINFO *infoPtr      = (BUTTONINFO *)wndPtr->wExtra;
+    BOOL        bHighLighted = (infoPtr->state & BUTTON_HIGHLIGHTED);
+
+    /* 
+     * Delegate this to the more generic pushbutton painting
+     * method.
+     */
+    return BUTTON_DrawPushButton(wndPtr,
+				 hDC,
+				 action,
+				 bHighLighted);
+}
+
+/**********************************************************************
+ * This method will actually do the drawing of the pushbutton 
+ * depending on it's state and the pushedState parameter.
+ */
+static void BUTTON_DrawPushButton(
+  WND* wndPtr,
+  HDC  hDC, 
+  WORD action, 
+  BOOL pushedState )
+{
     RECT rc, focus_rect;
     HPEN hOldPen;
     HBRUSH hOldBrush;
@@ -347,7 +375,7 @@
 
     if (TWEAK_WineLook == WIN31_LOOK)
     {
-        if (infoPtr->state & BUTTON_HIGHLIGHTED)
+        if (pushedState)
 	{
 	    /* draw button shadow: */
 	    SelectObject(hDC, GetSysColorBrush(COLOR_BTNSHADOW));
@@ -370,7 +398,7 @@
     {
         UINT uState = DFCS_BUTTONPUSH;
 
-        if (infoPtr->state & BUTTON_HIGHLIGHTED)
+        if (pushedState)
 	{
 	    if ( (wndPtr->dwStyle & 0x000f) == BS_DEFPUSHBUTTON )
 	        uState |= DFCS_FLAT;
@@ -383,7 +411,7 @@
 
 	focus_rect = rc;
 
-        if (infoPtr->state & BUTTON_HIGHLIGHTED)
+        if (pushedState)
 	{
 	    rc.left += 2;  /* To position the text down and right */
 	    rc.top  += 2;
@@ -433,21 +461,39 @@
             }
         }   
     }
-
-    if((wndPtr->dwStyle & BS_BITMAP) && (infoPtr->hImage != NULL))
+    if ( ((wndPtr->dwStyle & BS_ICON) || (wndPtr->dwStyle & BS_BITMAP) ) &&
+	 (infoPtr->hImage != NULL) )
     {
-	BITMAP bm;
-	HDC hdcMem;
-	int yOffset, xOffset, imageWidth, imageHeight;
+	int yOffset, xOffset;
+	int imageWidth, imageHeight;
 
-	GetObjectA (infoPtr->hImage, sizeof(BITMAP), &bm);
+	/*
+	 * We extract the size of the image from the handle.
+	 */
+	if (wndPtr->dwStyle & BS_ICON)
+	{
+	    ICONINFO iconInfo;
+	    BITMAP   bm;
+
+	    GetIconInfo((HICON)infoPtr->hImage, &iconInfo);
+	    GetObjectA (iconInfo.hbmColor, sizeof(BITMAP), &bm);
+	    
+	    imageWidth  = bm.bmWidth;
+	    imageHeight = bm.bmHeight;
+	}
+	else
+	{
+	    BITMAP   bm;
+
+	    GetObjectA (infoPtr->hImage, sizeof(BITMAP), &bm);
 	
-	/* Center the bitmap */
-	xOffset = (((rc.right - rc.left) - 2*xBorderOffset) - bm.bmWidth ) / 2;
-	yOffset = (((rc.bottom - rc.top) - 2*yBorderOffset) - bm.bmHeight ) / 2;
+	    imageWidth  = bm.bmWidth;
+	    imageHeight = bm.bmHeight;
+	}
 
-	imageWidth = bm.bmWidth;
-	imageHeight = bm.bmHeight;
+	/* Center the bitmap */
+	xOffset = (((rc.right - rc.left) - 2*xBorderOffset) - imageWidth ) / 2;
+	yOffset = (((rc.bottom - rc.top) - 2*yBorderOffset) - imageHeight) / 2;
 
 	/* If the image is to big for the button */
 	if (xOffset < 0)
@@ -465,14 +511,30 @@
 	/* Let minimum 1 space from border */
 	xOffset++, yOffset++;
 
-	hdcMem = CreateCompatibleDC (hDC);
-	SelectObject (hdcMem, (HBITMAP)infoPtr->hImage);
-	BitBlt(hDC, rc.left + xOffset, 
-	       rc.top + yOffset, 
-	       imageWidth, imageHeight,
-	       hdcMem, 0, 0, SRCCOPY);
+	/*
+	 * Draw the image now.
+	 */
+	if (wndPtr->dwStyle & BS_ICON)
+	{
+  	    DrawIcon(hDC,
+		     rc.left + xOffset, 
+		     rc.top  + yOffset, 
+		     (HICON)infoPtr->hImage);
+	}
+	else
+        {
+	    HDC hdcMem;
 
-	DeleteDC (hdcMem);
+	    hdcMem = CreateCompatibleDC (hDC);
+	    SelectObject (hdcMem, (HBITMAP)infoPtr->hImage);
+	    BitBlt(hDC, 
+		   rc.left + xOffset, 
+		   rc.top + yOffset, 
+		   imageWidth, imageHeight,
+		   hdcMem, 0, 0, SRCCOPY);
+	    
+	    DeleteDC (hdcMem);
+	}
     }
 
     if (TWEAK_WineLook != WIN31_LOOK
@@ -554,6 +616,21 @@
     int textlen, delta;
     BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
 
+    /* 
+     * if the button has a bitmap/icon, draw a normal pushbutton
+     * instead of a radion button.
+     */
+    if (infoPtr->hImage!=NULL)
+    {
+        BOOL bHighLighted = ((infoPtr->state & BUTTON_HIGHLIGHTED) ||
+			     (infoPtr->state & BUTTON_CHECKED));
+
+        return BUTTON_DrawPushButton(wndPtr,
+				     hDC,
+				     action,
+				     bHighLighted);
+    }
+
     textlen = 0;
     GetClientRect(wndPtr->hwndSelf, &client);
     rbox = rtext = client;
