Index: src/kits/tracker/PoseList.h
===================================================================
--- src/kits/tracker/PoseList.h	(revision 21257)
+++ src/kits/tracker/PoseList.h	(working copy)
@@ -64,7 +64,7 @@
 	BPose *DeepFindPose(const node_ref *node, int32 *index = NULL) const;
 		// same as FindPose, node can be a target of the actual
 		// pose if the pose is a symlink
-	BPose *FindVolumePose(const dev_t device, int32 *index = NULL) const;
+	BPose *FindNextVolumePose(int32 *currentIndex) const;
 };
 
 // iteration glue, add permutations as needed
Index: src/kits/tracker/PoseView.cpp
===================================================================
--- src/kits/tracker/PoseView.cpp	(revision 21257)
+++ src/kits/tracker/PoseView.cpp	(working copy)
@@ -2338,12 +2338,10 @@
 							TrackerSettings().SetShowVolumeSpaceBar(enabled);
 						// supposed to fall through
 					case kSpaceBarColorChanged:
-						UpdateVolumeIcons();
+						UpdateVolumeIcons(true);
 						break;
 					case kUpdateVolumeSpaceBar:
-						dev_t device;
-						message->FindInt32("device", (int32 *)&device);
-						UpdateVolumeIcon(device);	
+						UpdateVolumeIcons(false);
 						break;
 				}
 			}
@@ -5214,33 +5212,21 @@
 
 
 void 
-BPoseView::UpdateVolumeIcon(dev_t device, bool forceUpdate)
+BPoseView::UpdateVolumeIcons(bool forceUpdate)
 {
-	int32 index;
-	BPose *pose = fPoseList->FindVolumePose(device,&index);
+	int32 index = -1;
+	BPose *pose = fPoseList->FindNextVolumePose(&index);
 	if (pose == NULL)
 		return;
 
-	if (pose->UpdateVolumeSpaceBar(TrackerSettings().ShowVolumeSpaceBar()) || forceUpdate) {
-		BPoint loc(0, index * fListElemHeight);
-		pose->UpdateIcon(loc, this);
-	}
-}
+	bool showSpaceBars = TrackerSettings().ShowVolumeSpaceBar();
+	while (pose != NULL) {
+		if (pose->UpdateVolumeSpaceBar(showSpaceBars) || forceUpdate) {
+			BPoint loc(0, index * fListElemHeight);
+			pose->UpdateIcon(loc, this);
+		}
 
-
-void 
-BPoseView::UpdateVolumeIcons()
-{
-	BVolumeRoster roster;
-
-	BVolume volume;
-	while(roster.GetNextVolume(&volume) == B_NO_ERROR) {
-		BDirectory dir;
-		volume.GetRootDirectory(&dir);
-		node_ref nodeRef;
-		dir.GetNodeRef(&nodeRef);
-
-		UpdateVolumeIcon(nodeRef.device, true);
+		pose = fPoseList->FindNextVolumePose(&index);
 	}
 }
 
Index: src/kits/tracker/Tracker.cpp
===================================================================
--- src/kits/tracker/Tracker.cpp	(revision 21257)
+++ src/kits/tracker/Tracker.cpp	(working copy)
@@ -497,20 +497,7 @@
 		return;
 
 	// update the volume icon's free space bars
-	BVolumeRoster roster;
-
- 	BVolume volume;
-	while (roster.GetNextVolume(&volume) == B_OK) {
-		BDirectory dir;
-		volume.GetRootDirectory(&dir);
-		node_ref nodeRef;
-		dir.GetNodeRef(&nodeRef);
-
-		BMessage notificationMessage;
-		notificationMessage.AddInt32("device", *(int32 *)&nodeRef.device);
-
-		SendNotices(kUpdateVolumeSpaceBar, &notificationMessage);
-	}
+	SendNotices(kUpdateVolumeSpaceBar, NULL);
 }
 
 
Index: src/kits/tracker/Pose.cpp
===================================================================
--- src/kits/tracker/Pose.cpp	(revision 21257)
+++ src/kits/tracker/Pose.cpp	(working copy)
@@ -49,32 +49,15 @@
 
 
 int32
-CalcFreeSpace(dev_t device)
+CalcFreeSpace(BVolume *volume)
 {
-	BVolume volume(device);
-	fs_info info;
-	if (volume.InitCheck() == B_OK && fs_stat_dev(device,&info) == B_OK) {
-		// Philosophy here:
-		// Bars go on all drives with read/write capabilities
-		// Exceptions: Not on CDDA, but on NTFS/Ext2
-		// Also note that some volumes may return 0 when
-		// BVolume::Capacity() is called (believe-me... That *DOES*
-		// happen) so we also check for that.
-		off_t capacity = volume.Capacity();
-		if (((!volume.IsReadOnly() && strcmp(info.fsh_name,"cdda"))
-			|| !strcmp(info.fsh_name,"ntfs")
-			|| !strcmp(info.fsh_name,"ext2"))
-			&& (capacity > 0)) {
-			int32 percent = static_cast<int32>(volume.FreeBytes() / (capacity / 100));
+	off_t capacity = volume->Capacity();
+	int32 percent = static_cast<int32>(volume->FreeBytes() / (capacity / 100));
 
-			// warn below 20 MB of free space (if this is less than 10% of free space)
-			if (volume.FreeBytes() < 20 * 1024 * 1024 && percent < 10)
-				return -2 - percent;
-
-			return percent;
-		}
-	}
-	return -1;
+	// warn below 20 MB of free space (if this is less than 10% of free space)
+	if (volume->FreeBytes() < 20 * 1024 * 1024 && percent < 10)
+		return -2 - percent;
+	return percent;
 }
 
 
@@ -86,6 +69,7 @@
 BPose::BPose(Model *model, BPoseView *view, bool selected)
 	:	fModel(model),
 		fWidgetList(4, true),
+		fVolume(NULL),
 		fPercent(-1),
 		fIsSelected(selected),
 		fDelayedEdit(true),
@@ -98,9 +82,32 @@
 {
 	CreateWidgets(view);
 
-	if (model->IsVolume() && TrackerSettings().ShowVolumeSpaceBar()) {
+	if (model->IsVolume()) {
+		fs_info info;
 		dev_t device = model->NodeRef()->device;
-		fPercent = CalcFreeSpace(device);
+		BVolume *volume = new BVolume(device);
+		if (volume->InitCheck() == B_OK
+			&& fs_stat_dev(device, &info) == B_OK) {
+			// Philosophy here:
+			// Bars go on all drives with read/write capabilities
+			// Exceptions: Not on CDDA, but on NTFS/Ext2
+			// Also note that some volumes may return 0 when
+			// BVolume::Capacity() is called (believe-me... That *DOES*
+			// happen) so we also check for that.
+			off_t capacity = volume->Capacity();
+			if (((!volume->IsReadOnly() && strcmp(info.fsh_name,"cdda"))
+				|| !strcmp(info.fsh_name,"ntfs")
+				|| !strcmp(info.fsh_name,"ext2"))
+				&& capacity > 0) {
+				// The volume is ok and we want space bars on it
+				fVolume = volume;
+			} else
+				delete volume;
+		} else
+			delete volume;
+
+		if (fVolume && TrackerSettings().ShowVolumeSpaceBar())
+			fPercent = CalcFreeSpace(fVolume);
 	}
 
 	if ((fClipboardMode = FSClipboardFindNodeMode(model,true)) != 0
@@ -113,6 +120,7 @@
 BPose::~BPose()
 {
 	delete fModel;
+	delete fVolume;
 }
 
 
@@ -295,9 +303,13 @@
 		return true;
 	}
 
-	dev_t device = TargetModel()->NodeRef()->device;
-	int32 percent = CalcFreeSpace(device);
+	if (fVolume == NULL) {
+		// we don't want or cannot get the
+		// available space from this volume
+		return false;
+	}
 
+	int32 percent = CalcFreeSpace(fVolume);
 	if (fPercent != percent) {
 		if (percent > 100)
 			fPercent = 100;
Index: src/kits/tracker/PoseView.h
===================================================================
--- src/kits/tracker/PoseView.h	(revision 21257)
+++ src/kits/tracker/PoseView.h	(working copy)
@@ -159,8 +159,7 @@
 		void SetAutoScroll(bool);
 		void SetPoseEditing(bool);
 
-		void UpdateVolumeIcon(dev_t device, bool forceUpdate = false);
-		void UpdateVolumeIcons();
+		void UpdateVolumeIcons(bool forceUpdate = false);
 
 		// file change notification handler
 		virtual bool FSNotification(const BMessage *);
Index: src/kits/tracker/Pose.h
===================================================================
--- src/kits/tracker/Pose.h	(revision 21257)
+++ src/kits/tracker/Pose.h	(working copy)
@@ -135,6 +135,7 @@
 		BPoint fLocation;
 
 		uint32 fClipboardMode;
+		BVolume *fVolume;
 		int32 fPercent;
 
 		bool fIsSelected : 1;
Index: src/kits/tracker/PoseList.cpp
===================================================================
--- src/kits/tracker/PoseList.cpp	(revision 21257)
+++ src/kits/tracker/PoseList.cpp	(working copy)
@@ -107,16 +107,15 @@
 }
 
 BPose *
-PoseList::FindVolumePose(const dev_t device, int32 *resultingIndex) const
+PoseList::FindNextVolumePose(int32 *currentIndex) const
 {
 	int32 count = CountItems();
-	for (int32 index = 0; index < count; index++) {
+	for (int32 index = *currentIndex + 1; index < count; index++) {
 		BPose *pose = ItemAt(index);
 		Model *model = pose->TargetModel();
 		ASSERT(model);
-		if (model->IsVolume() && model->NodeRef()->device == device) {
-			if (resultingIndex)
-				*resultingIndex = index;
+		if (model->IsVolume()) {
+			*currentIndex = index;
 			return pose;
 		}
 	}
