diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c
index 64709167c6c..4a8ddf203ab 100644
--- a/dlls/comctl32/trackbar.c
+++ b/dlls/comctl32/trackbar.c
@@ -10,7 +10,7 @@
  * TODO:
  *   - Some messages.
  *   - more display code.
- *   - dragging slider
+ *   - handle dragging slider better
  *   - better tic handling.
  *   - more notifications.
  *   - tooltips
@@ -22,6 +22,7 @@
    trackbar, not the actual amount of tics in the list.
 	-TBM_GETTIC & TBM_GETTICPOS shouldn't rely on infoPtr->tics being sorted.
   	-code currently only handles horizontal trackbars correct.
+	-TB_DRAGTIMER behaves wierd.
 */
 
 
@@ -40,9 +41,12 @@
 /* Used by TRACKBAR_Refresh to find out which parts of the control 
 	need to be recalculated */
 
-#define TB_THUMBCHANGED 	1
-#define TB_SELECTIONCHANGED 2
-
+#define TB_THUMBPOSCHANGED 	1
+#define TB_THUMBSIZECHANGED 2
+#define TB_THUMBCHANGED 	3
+#define TB_SELECTIONCHANGED 4
+#define TB_DRAG_TIMER_SET	16
+#define TB_DRAGPOSVALID  	32
 
 
 static BOOL32 TRACKBAR_SendNotify (WND *wndPtr, UINT32 code);
@@ -74,35 +78,26 @@ void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr)
 }
 
 
+/* converts from physical (mouse) position to logical position 
+   (in range of trackbar) */
 
-static INT32
-TRACKBAR_ConvertPositionToTic (WND *wndPtr, TRACKBAR_INFO *infoPtr, POINT32 pt) 
+static inline INT32
+TRACKBAR_ConvertPlaceToPosition (TRACKBAR_INFO *infoPtr, int place) 
 {
-	double newpos,newtic;
-    int i,range,width,delta,currentdelta,currenttic;
-
-/* buggy */
+	double range,width,pos;
 
     range=infoPtr->nRangeMax - infoPtr->nRangeMin;
     width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
+	pos=(range*(place - infoPtr->rcChannel.left)) / width;
 	
-	newpos=(pt.x-infoPtr->rcChannel.left) / (double) width;
-
-	newtic=infoPtr->nRangeMin+newpos*range;
-	currenttic=0;
-	currentdelta=currenttic-infoPtr->nRangeMin;
-	for (i=0; i<infoPtr->uNumTics; i++) {
-		delta=newtic-infoPtr->tics[i];
-		if ((delta>0) && (delta<currentdelta)) {
-			currentdelta=delta;
-			currenttic=i;
-		}
-	}
-	return (INT32) currenttic;
+    TRACE (trackbar,"%.2f\n",pos);
+    return pos;
 }
 
+
+
 static VOID
-TRACKBAR_Calc (WND *wndPtr, TRACKBAR_INFO *infoPtr)
+TRACKBAR_CalcChannel (WND *wndPtr, TRACKBAR_INFO *infoPtr)
 {
     INT32 cyChannel;
 	RECT32 lpRect,*channel = & infoPtr->rcChannel;
@@ -114,7 +109,6 @@ TRACKBAR_Calc (WND *wndPtr, TRACKBAR_INFO *infoPtr)
     else
 		cyChannel = 4;
 
-    /* calculate channel rect */
     if (wndPtr->dwStyle & TBS_VERT) {
 		channel->top    = lpRect.top + 8;
 		channel->bottom = lpRect.bottom - 8;
@@ -162,8 +156,8 @@ TRACKBAR_CalcThumb (WND *wndPtr, TRACKBAR_INFO *infoPtr)
     width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
 
 	thumb->left  = infoPtr->rcChannel.left +
-					width*(65536*infoPtr->nPos/range)/65536 - 5;
-	thumb->right  = thumb->left + 10;
+					(width*infoPtr->nPos)/range - 5;
+	thumb->right  = thumb->left + infoPtr->uThumbLen/3;
 	thumb->top	  = infoPtr->rcChannel.top - 1;
 	thumb->bottom = infoPtr->rcChannel.top + infoPtr->uThumbLen - 8;
 }
@@ -176,14 +170,18 @@ TRACKBAR_CalcSelection (WND *wndPtr, TRACKBAR_INFO *infoPtr)
 
 	selection= & infoPtr->rcSelection;
 	range=infoPtr->nRangeMax - infoPtr->nRangeMin;
-    width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
-	
-	selection->left   = infoPtr->rcChannel.left +
-						width*(65536*infoPtr->nSelMin/range)/65536;
-	selection->right  = infoPtr->rcChannel.left +
-						width*(65536*infoPtr->nSelMax/range)/65536;
-	selection->top    = infoPtr->rcChannel.top + 2;
-    selection->bottom = infoPtr->rcChannel.bottom - 2;
+	width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
+
+	if (range > 0) {
+		selection->left   = infoPtr->rcChannel.left +
+						(width*infoPtr->nSelMin)/range;
+		selection->right  = infoPtr->rcChannel.left +
+						(width*infoPtr->nSelMax)/range;
+		selection->top    = infoPtr->rcChannel.top + 2;
+		selection->bottom = infoPtr->rcChannel.bottom - 2;
+	}
+	else
+		SetRectEmpty32 (selection);
 }
 
 
@@ -204,8 +202,11 @@ TRACKBAR_Refresh (WND *wndPtr, HDC32 hdc)
 
 	
 	
-	if (infoPtr->flags & TB_THUMBCHANGED) 
+	if (infoPtr->flags & TB_THUMBCHANGED) {
 		TRACKBAR_CalcThumb	(wndPtr, infoPtr);
+		if (infoPtr->flags & TB_THUMBSIZECHANGED) 
+			TRACKBAR_CalcChannel (wndPtr, infoPtr);
+	}
 	if (infoPtr->flags & TB_SELECTIONCHANGED)
 		TRACKBAR_CalcSelection (wndPtr, infoPtr);
 	infoPtr->flags &= ~ (TB_THUMBCHANGED | TB_SELECTIONCHANGED);
@@ -249,7 +250,7 @@ TRACKBAR_Refresh (WND *wndPtr, HDC32 hdc)
         for (i=0; i<infoPtr->uNumTics; i++) {
 			tic=infoPtr->tics[i];
 			if ((tic>infoPtr->nRangeMin) && (tic<infoPtr->nRangeMax)) {
-            	x=rcChannel.left + width*(65536*tic/range)/65536;
+            	x=rcChannel.left + (width*tic)/range;
             	SetPixel32 (hdc, x,y+5, clrTic);
             	SetPixel32 (hdc, x,y+6, clrTic);
             	SetPixel32 (hdc, x,y+7, clrTic);
@@ -257,10 +258,10 @@ TRACKBAR_Refresh (WND *wndPtr, HDC32 hdc)
           }
 	   if ((wndPtr->dwStyle & TBS_ENABLESELRANGE) && 
 		   (rcSelection.left!=rcSelection.right)) {
-			x=rcChannel.left + width*(65536*infoPtr->nSelMin/range)/65536 - 1;
+			x=rcChannel.left + (width*infoPtr->nSelMin)/range - 1;
            	SetPixel32 (hdc, x,y+6, clrTic);
            	SetPixel32 (hdc, x,y+7, clrTic);
-			x=rcChannel.left + width*(65536*infoPtr->nSelMax/range)/65536 + 1; 
+			x=rcChannel.left + (width*infoPtr->nSelMax)/range + 1; 
            	SetPixel32 (hdc, x,y+6, clrTic);
            	SetPixel32 (hdc, x,y+7, clrTic);
 		}
@@ -602,7 +603,7 @@ TRACKBAR_GetTicPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 
  range=infoPtr->nRangeMax - infoPtr->nRangeMin;
  width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
- pos=infoPtr->rcChannel.left + width*(65536*infoPtr->tics[iTic]/range)/65536;
+ pos=infoPtr->rcChannel.left + (width * infoPtr->tics[iTic]) / range;
 
 
  return (LRESULT) pos;
@@ -685,7 +686,7 @@ TRACKBAR_SetPos (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 
     if (infoPtr->nPos > infoPtr->nRangeMax)
 	infoPtr->nPos = infoPtr->nRangeMax;
-	infoPtr->flags |=TB_THUMBCHANGED;
+	infoPtr->flags |=TB_THUMBPOSCHANGED;
 
     if (wParam) {
 		HDC32 hdc = GetDC32 (wndPtr->hwndSelf);
@@ -706,12 +707,12 @@ TRACKBAR_SetRange (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 
     if (infoPtr->nPos < infoPtr->nRangeMin) {
 		infoPtr->nPos = infoPtr->nRangeMin;
-		infoPtr->flags |=TB_THUMBCHANGED;
+		infoPtr->flags |=TB_THUMBPOSCHANGED;
 	}
 
     if (infoPtr->nPos > infoPtr->nRangeMax) {
 		infoPtr->nPos = infoPtr->nRangeMax;
-		infoPtr->flags |=TB_THUMBCHANGED;
+		infoPtr->flags |=TB_THUMBPOSCHANGED;
 	}
 
 	infoPtr->nPageSize=(infoPtr->nRangeMax -  infoPtr->nRangeMin)/5;
@@ -735,7 +736,7 @@ TRACKBAR_SetRangeMax (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
     infoPtr->nRangeMax = (INT32)lParam;
     if (infoPtr->nPos > infoPtr->nRangeMax) {
 		infoPtr->nPos = infoPtr->nRangeMax;
-		infoPtr->flags |=TB_THUMBCHANGED;
+		infoPtr->flags |=TB_THUMBPOSCHANGED;
 	}
 
 	infoPtr->nPageSize=(infoPtr->nRangeMax -  infoPtr->nRangeMin)/5;
@@ -759,7 +760,7 @@ TRACKBAR_SetRangeMin (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
     infoPtr->nRangeMin = (INT32)lParam;
     if (infoPtr->nPos < infoPtr->nRangeMin) {
 		infoPtr->nPos = infoPtr->nRangeMin;
-		infoPtr->flags |=TB_THUMBCHANGED;
+		infoPtr->flags |=TB_THUMBPOSCHANGED;
 	}
 
 	infoPtr->nPageSize=(infoPtr->nRangeMax -  infoPtr->nRangeMin)/5;
@@ -876,7 +877,7 @@ TRACKBAR_SetThumbLength (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 		infoPtr->uThumbLen = (UINT32)wParam;
 
 	hdc = GetDC32 (wndPtr->hwndSelf);
-	infoPtr->flags |=TB_THUMBCHANGED;
+	infoPtr->flags |=TB_THUMBSIZECHANGED;
 	TRACKBAR_Refresh (wndPtr, hdc);
 	ReleaseDC32 (wndPtr->hwndSelf, hdc);
 	
@@ -942,7 +943,7 @@ TRACKBAR_InitializeThumb (WND *wndPtr)
 
     infoPtr->uThumbLen = 23;   /* initial thumb length */
 
-	TRACKBAR_Calc (wndPtr,infoPtr);
+	TRACKBAR_CalcChannel (wndPtr,infoPtr);
 	TRACKBAR_CalcThumb (wndPtr, infoPtr);
 	infoPtr->flags &= ~TB_SELECTIONCHANGED;
 
@@ -984,11 +985,10 @@ TRACKBAR_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
 
-
-
+	if (infoPtr->flags & TB_DRAG_TIMER_SET) 
+        KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
 
     HeapFree (GetProcessHeap (), 0, infoPtr);
-
     return 0;
 }
 
@@ -999,6 +999,11 @@ TRACKBAR_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
     HDC32 hdc;
 
+	TRACE (trackbar,"\n");
+
+	if (infoPtr->flags & TB_DRAG_TIMER_SET) 
+		 KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
+
     infoPtr->bFocus = FALSE;
     hdc = GetDC32 (wndPtr->hwndSelf);
     TRACKBAR_Refresh (wndPtr, hdc);
@@ -1013,19 +1018,23 @@ static LRESULT
 TRACKBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
-	int prevPlace,range,width,clickPlace,prevPos;
+	int clickPlace,prevPos,clickPos;
 	
     SetFocus32 (wndPtr->hwndSelf);
 
 	clickPlace=(INT32)LOWORD(lParam);
-    range=infoPtr->nRangeMax - infoPtr->nRangeMin;
-    width=infoPtr->rcChannel.right - infoPtr->rcChannel.left;
-    prevPlace = infoPtr->rcChannel.left +
-                    width*(65536*infoPtr->nPos/range)/65536;
-	printf ("%d->%d\n",prevPlace,clickPlace);
 
+	if ((clickPlace>infoPtr->rcThumb.left) && 
+		(clickPlace<infoPtr->rcThumb.right)) {
+		SetTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER, TB_DRAG_DELAY, 0);
+		infoPtr->flags |= TB_DRAG_TIMER_SET;
+		return 0;
+	}
+
+	clickPos=TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace);
 	prevPos	= infoPtr->nPos;
-	if (clickPlace > prevPlace) {					/* similar to VK_NEXT */
+
+	if (clickPos > prevPos) {					/* similar to VK_NEXT */
 		infoPtr->nPos += infoPtr->nPageSize;
         if (infoPtr->nPos > infoPtr->nRangeMax)
 			infoPtr->nPos = infoPtr->nRangeMax;
@@ -1037,17 +1046,15 @@ TRACKBAR_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
         TRACKBAR_SendNotify (wndPtr, TB_PAGEDOWN);
 	}
 
-	printf ("%d->%d\n",prevPos,infoPtr->nPos);
 	if (prevPos!=infoPtr->nPos) {
     	HDC32 hdc;
 
     	hdc=GetDC32 (wndPtr->hwndSelf);
-		infoPtr->flags |=TB_THUMBCHANGED;
+		infoPtr->flags |=TB_THUMBPOSCHANGED;
     	TRACKBAR_Refresh (wndPtr, hdc);
     	ReleaseDC32 (wndPtr->hwndSelf, hdc);
  	}
-
-
+	
     return 0;
 }
 
@@ -1056,7 +1063,10 @@ TRACKBAR_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
 
-    FIXME (trackbar,"stub\n");
+	if (infoPtr->flags & TB_DRAG_TIMER_SET) {
+	 	KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
+    	infoPtr->flags &= ~TB_DRAG_TIMER_SET;
+	}
 
 	TRACKBAR_SendNotify (wndPtr, TB_ENDTRACK);
 
@@ -1066,7 +1076,15 @@ TRACKBAR_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 static LRESULT
 TRACKBAR_CaptureChanged (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
-    FIXME (trackbar,"stub\n");
+    TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+	
+	if (infoPtr->flags & TB_DRAG_TIMER_SET) 
+		 KillTimer32 (wndPtr->hwndSelf, TB_DRAG_TIMER);
+
+	if (infoPtr->flags & TB_DRAGPOSVALID) 
+		infoPtr->nPos=infoPtr->dragPos;
+
+	infoPtr->flags &= ~ (TB_DRAGPOSVALID | TB_DRAG_TIMER_SET);
 
 	TRACKBAR_SendNotify (wndPtr, TB_ENDTRACK);
 	return 0;
@@ -1092,6 +1110,7 @@ TRACKBAR_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
     HDC32 hdc;
 
+	TRACE (trackbar,"\n");
     infoPtr->bFocus = TRUE;
 
     hdc = GetDC32 (wndPtr->hwndSelf);
@@ -1107,15 +1126,13 @@ TRACKBAR_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
 
-    TRACKBAR_Calc (wndPtr, infoPtr);
+    TRACKBAR_CalcChannel (wndPtr, infoPtr);
     TRACKBAR_AlignBuddies (wndPtr, infoPtr);
 
     return 0;
 }
 
 
-// << TRACKBAR_Timer >>
-
 
 static BOOL32
 TRACKBAR_SendNotify (WND *wndPtr, UINT32 code)
@@ -1134,8 +1151,14 @@ static LRESULT
 TRACKBAR_MouseMove (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 {
     TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+	INT32 clickPlace;
 			
-	
+	clickPlace=(INT32)LOWORD(lParam);
+
+	infoPtr->dragPos=TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace);
+	infoPtr->flags|=TB_DRAGPOSVALID;
+
+	TRACKBAR_SendNotify (wndPtr, TB_THUMBTRACK | (infoPtr->dragPos>>16));
  	return TRUE;
 }
 
@@ -1196,7 +1219,7 @@ TRACKBAR_KeyDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
 	HDC32 hdc;
 
 	hdc=GetDC32 (wndPtr->hwndSelf);
-	infoPtr->flags |=TB_THUMBCHANGED;
+	infoPtr->flags |=TB_THUMBPOSCHANGED;
 	TRACKBAR_Refresh (wndPtr, hdc);
 	ReleaseDC32 (wndPtr->hwndSelf, hdc);
  }
@@ -1220,6 +1243,31 @@ TRACKBAR_KeyUp (WND *wndPtr, WPARAM32 wParam)
  return TRUE;
 }
 
+
+static LRESULT 
+TRACKBAR_HandleTimer ( WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
+{
+ TRACKBAR_INFO *infoPtr = TRACKBAR_GetInfoPtr(wndPtr);
+ HDC32 hdc;
+
+ TRACE (trackbar,"timer\n");
+
+ switch (wParam) {
+	case TB_DRAG_TIMER: 
+		if (infoPtr->flags & TB_DRAGPOSVALID)  {
+			infoPtr->nPos=infoPtr->dragPos;
+			infoPtr->flags |= TB_THUMBPOSCHANGED;
+		}
+		infoPtr->flags &= ~ (TB_DRAG_TIMER_SET | TB_DRAGPOSVALID);
+        hdc=GetDC32 (wndPtr->hwndSelf);
+        TRACKBAR_Refresh (wndPtr, hdc);
+        ReleaseDC32 (wndPtr->hwndSelf, hdc);
+		return 0;
+	}
+ return 1;
+}
+
+
 LRESULT WINAPI
 TRACKBAR_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
 {
@@ -1376,7 +1424,8 @@ TRACKBAR_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
 	case WM_SIZE:
 	    return TRACKBAR_Size (wndPtr, wParam, lParam);
 
-//	case WM_TIMER:
+  	case WM_TIMER:
+		return TRACKBAR_HandleTimer (wndPtr, wParam, lParam);
 
 	case WM_WININICHANGE:
 		return TRACKBAR_InitializeThumb (wndPtr);
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 9b5fcf5860e..52ec8805f83 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -33,24 +33,8 @@
 #include "debug.h"
 #include <asm/bitops.h>      /* FIXME: linux specific */
 
-static int TREEVIEW_Timer;
-
-
-
 #define TREEVIEW_GetInfoPtr(wndPtr) ((TREEVIEW_INFO *)wndPtr->wExtra[0])
 
-
-
-#include <asm/bitops.h>      /* FIXME: linux specific */
-
-static int TREEVIEW_Timer;
-
-  
-  #define TREEVIEW_GetInfoPtr(wndPtr) ((TREEVIEW_INFO *)wndPtr->wExtra[0])
-  
-  
-  
-
 static BOOL32
 TREEVIEW_SendSimpleNotify (WND *wndPtr, UINT32 code);
 static BOOL32
@@ -198,22 +182,21 @@ static void TREEVIEW_RemoveAllChildren (TREEVIEW_INFO *infoPtr,
 }
 
 
+/* Note:TREEVIEW_RemoveTree doesn't remove infoPtr itself */
 
 static void TREEVIEW_RemoveTree (TREEVIEW_INFO *infoPtr)
 					   
 
 {
- TREEVIEW_ITEM *killItem;
- int i;
+ 	TREEVIEW_ITEM *killItem;
+ 	int i;
 
-	/* bummer: if we didn't delete anything, test_bit is overhead */
- 
     for (i=1; i<=infoPtr->uMaxHandle; i++) 
-	if (!test_bit (i, infoPtr->freeList)) {
-		killItem=& infoPtr->items [i];	
-		if (killItem->pszText!=LPSTR_TEXTCALLBACK32A)
-			HeapFree (GetProcessHeap (), 0, killItem->pszText);
-	} 
+		if (!test_bit (i, infoPtr->freeList)) {
+			killItem=& infoPtr->items [i];	
+			if (killItem->pszText!=LPSTR_TEXTCALLBACK32A)
+				HeapFree (GetProcessHeap (), 0, killItem->pszText);
+		} 
 
     if (infoPtr->uNumPtrsAlloced) {
         HeapFree (GetProcessHeap (), 0, infoPtr->items);
@@ -222,8 +205,6 @@ static void TREEVIEW_RemoveTree (TREEVIEW_INFO *infoPtr)
         infoPtr->uNumPtrsAlloced=0;
         infoPtr->uMaxHandle=0;
     }   
-
-	/* this function doesn't remove infoPtr itself */
 }
 
 
@@ -561,9 +542,9 @@ TREEVIEW_Refresh (WND *wndPtr, HDC32 hdc)
 
     TRACE (treeview,"\n");
 
-    if (TREEVIEW_Timer & TV_REFRESH_TIMER_SET) {
+    if (infoPtr->Timer & TV_REFRESH_TIMER_SET) {
 		KillTimer32 (wndPtr->hwndSelf, TV_REFRESH_TIMER);
-		TREEVIEW_Timer &= ~TV_REFRESH_TIMER_SET;
+		infoPtr->Timer &= ~TV_REFRESH_TIMER_SET;
     }
 
     
@@ -669,14 +650,14 @@ TREEVIEW_HandleTimer ( WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
   switch (wParam) {
 	case TV_REFRESH_TIMER:
 		KillTimer32 (wndPtr->hwndSelf, TV_REFRESH_TIMER);
-		TREEVIEW_Timer &= ~TV_REFRESH_TIMER_SET;
+		infoPtr->Timer &= ~TV_REFRESH_TIMER_SET;
 		hdc=GetDC32 (wndPtr->hwndSelf);
 		TREEVIEW_Refresh (wndPtr, hdc);
 		ReleaseDC32 (wndPtr->hwndSelf, hdc);
 		return 0;
 	case TV_EDIT_TIMER:
 		KillTimer32 (wndPtr->hwndSelf, TV_EDIT_TIMER);
-		TREEVIEW_Timer &= ~TV_EDIT_TIMER_SET;
+		infoPtr->Timer &= ~TV_EDIT_TIMER_SET;
 		return 0;
  }
 		
@@ -688,14 +669,15 @@ static void
 TREEVIEW_QueueRefresh (WND *wndPtr)
 
 {
- 
+ TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
+
  TRACE (treeview,"queued\n");
- if (TREEVIEW_Timer & TV_REFRESH_TIMER_SET) {
+ if (infoPtr->Timer & TV_REFRESH_TIMER_SET) {
 	KillTimer32 (wndPtr->hwndSelf, TV_REFRESH_TIMER);
  }
 
  SetTimer32 (wndPtr->hwndSelf, TV_REFRESH_TIMER, TV_REFRESH_DELAY, 0);
- TREEVIEW_Timer|=TV_REFRESH_TIMER_SET;
+ infoPtr->Timer|=TV_REFRESH_TIMER_SET;
 }
 
 
@@ -1113,6 +1095,8 @@ TREEVIEW_Destroy (WND *wndPtr)
    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(wndPtr);
      
    TREEVIEW_RemoveTree (infoPtr);
+   if (infoPtr->Timer & TV_REFRESH_TIMER_SET) 
+        KillTimer32 (wndPtr->hwndSelf, TV_REFRESH_TIMER);
 
    HeapFree (GetProcessHeap (), 0, infoPtr);
 
diff --git a/include/trackbar.h b/include/trackbar.h
index 3da5a651a47..ae3cf8b4825 100644
--- a/include/trackbar.h
+++ b/include/trackbar.h
@@ -30,10 +30,16 @@ typedef struct tagTRACKBAR_INFO
     RECT32 rcChannel;
     RECT32 rcSelection;
     RECT32 rcThumb;
+    INT32  dragPos;
     LPLONG tics;
 } TRACKBAR_INFO;
 
 
+#define TB_DRAG_TIMER       1
+#define TB_DRAG_DELAY       10
+
+
+
 extern void TRACKBAR_Register (void);
 
 #endif  /* __WINE_TRACKBAR_H */
diff --git a/include/treeview.h b/include/treeview.h
index 2e19fae8508..d48c5d4f882 100644
--- a/include/treeview.h
+++ b/include/treeview.h
@@ -51,6 +51,7 @@ typedef struct {
 typedef struct tagTREEVIEW_INFO
 {
     UINT32	uInternalStatus;		
+    INT32	Timer;
     UINT32  uNumItems;	/* number of valid TREEVIEW_ITEMs */
     UINT32	uNumPtrsAlloced; 
     UINT32	uMaxHandle;	/* needed for delete_item */