diff --git a/src/apps/workspaces/Workspaces.cpp b/src/apps/workspaces/Workspaces.cpp
index e7b99f9..c6eb7a9 100644
--- a/src/apps/workspaces/Workspaces.cpp
+++ b/src/apps/workspaces/Workspaces.cpp
@@ -27,7 +27,6 @@
 #include <Screen.h>
 #include <TextView.h>
 #include <Window.h>
-
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -55,7 +54,6 @@ static const uint32 kMsgToggleAutoRaise = 'tgAR';
 static const uint32 kMsgToggleAlwaysOnTop = 'tgAT';
 static const uint32 kMsgToggleLiveInDeskbar = 'tgDb';
 
-static const float kScreenBorderOffset = 10.0;
 
 extern "C" _EXPORT BView* instantiate_deskbar_item();
 
@@ -71,6 +69,7 @@ class WorkspacesSettings {
 		bool AlwaysOnTop() const { return fAlwaysOnTop; }
 		bool HasTitle() const { return fHasTitle; }
 		bool HasBorder() const { return fHasBorder; }
+		bool SettingsLoaded() const { return fLoaded; }
 
 		void UpdateFramesForScreen(BRect screenFrame);
 		void UpdateScreenFrame();
@@ -90,6 +89,7 @@ class WorkspacesSettings {
 		bool	fAlwaysOnTop;
 		bool	fHasTitle;
 		bool	fHasBorder;
+		bool	fLoaded;
 };
 
 class WorkspacesView : public BView {
@@ -136,10 +136,15 @@ class WorkspacesWindow : public BWindow {
 
 		void SetAutoRaise(bool enable);
 		bool IsAutoRaising() const { return fAutoRaising; }
+		float GetTabHeight() { return fTabHeight; }
+		float GetBorderWidth() { return fBorderWidth; }
+		float GetScreenBorderOffset() { return 2.0 * fBorderWidth; }
 
 	private:
 		WorkspacesSettings *fSettings;
 		bool	fAutoRaising;
+		float	fTabHeight;
+		float	fBorderWidth;
 };
 
 class WorkspacesApp : public BApplication {
@@ -166,8 +171,9 @@ WorkspacesSettings::WorkspacesSettings()
 	fHasBorder(true)
 {
 	UpdateScreenFrame();
+	
+	fLoaded = false;
 
-	bool loaded = false;
 	BScreen screen;
 
 	BFile file;
@@ -176,7 +182,7 @@ WorkspacesSettings::WorkspacesSettings()
 		if (settings.Unflatten(&file) == B_OK) {
 			if (settings.FindRect("window", &fWindowFrame) == B_OK
 				&& settings.FindRect("screen", &fScreenFrame) == B_OK)
-				loaded = true;
+				fLoaded = true;
 
 			settings.FindBool("auto-raise", &fAutoRaising);
 			settings.FindBool("always on top", &fAlwaysOnTop);
@@ -202,53 +208,19 @@ WorkspacesSettings::WorkspacesSettings()
 				else
 					fScreenFrame = screen.Frame();
 
-				loaded = true;
+				fLoaded = true;
 			}
+		} else {
+			fprintf(stderr, "Opening settings file failed.\n");	
 		}
 	}
 
-	if (loaded) {
+	if (fLoaded) {
 		// if the current screen frame is different from the one
 		// just loaded, we need to alter the window frame accordingly
 		if (fScreenFrame != screen.Frame())
 			UpdateFramesForScreen(screen.Frame());
 	}
-
-	if (!loaded
-		|| !(screen.Frame().right + 5 >= fWindowFrame.right
-			&& screen.Frame().bottom + 5 >= fWindowFrame.bottom
-			&& screen.Frame().left - 5 <= fWindowFrame.left
-			&& screen.Frame().top - 5 <= fWindowFrame.top)) {
-		// set to some usable defaults
-		float screenWidth = screen.Frame().Width();
-		float screenHeight = screen.Frame().Height();
-		float aspectRatio = screenWidth / screenHeight;
-
-		uint32 columns, rows;
-		BPrivate::get_workspaces_layout(&columns, &rows);
-
-		// default size of ~1/10 of screen width
-		float workspaceWidth = screenWidth / 10;
-		float workspaceHeight = workspaceWidth / aspectRatio;
-
-		float width = floor(workspaceWidth * columns);
-		float height = floor(workspaceHeight * rows);
-
-		float tabHeight = 20;
-			// TODO: find tabHeight without being a window
-
-		// shrink to fit more
-		while (width + 2 * kScreenBorderOffset > screenWidth
-			|| height + 2 * kScreenBorderOffset + tabHeight > screenHeight) {
-			width = floor(0.95 * width);
-			height = floor(0.95 * height);
-		}
-
-		fWindowFrame = fScreenFrame;
-		fWindowFrame.OffsetBy(-kScreenBorderOffset, -kScreenBorderOffset);
-		fWindowFrame.left = fWindowFrame.right - width;
-		fWindowFrame.top = fWindowFrame.bottom - height;
-	}
 }
 
 
@@ -260,7 +232,7 @@ WorkspacesSettings::~WorkspacesSettings()
 		return;
 
 	BMessage settings('wksp');
-
+		
 	if (settings.AddRect("window", fWindowFrame) == B_OK
 		&& settings.AddRect("screen", fScreenFrame) == B_OK
 		&& settings.AddBool("auto-raise", fAutoRaising) == B_OK
@@ -268,6 +240,8 @@ WorkspacesSettings::~WorkspacesSettings()
 		&& settings.AddBool("has title", fHasTitle) == B_OK
 		&& settings.AddBool("has border", fHasBorder) == B_OK)
 		settings.Flatten(&file);
+	else
+		fprintf(stderr,"An error occured while saving settings.\n");
 }
 
 
@@ -313,7 +287,6 @@ WorkspacesSettings::UpdateFramesForScreen(BRect newScreenFrame)
 		fWindowFrame.OffsetTo(fWindowFrame.left,
 			newScreenFrame.bottom - (fScreenFrame.bottom - fWindowFrame.top));
 	}
-
 	fScreenFrame = newScreenFrame;
 }
 
@@ -339,8 +312,8 @@ WorkspacesSettings::SetWindowFrame(BRect frame)
 WorkspacesView::WorkspacesView(BRect frame, bool showDragger=true)
 	:
 	BView(frame, kDeskbarItemName, B_FOLLOW_ALL,
-		kWorkspacesViewFlag | B_FRAME_EVENTS),
-	fParentWhichDrawsOnChildren(NULL),
+		kWorkspacesViewFlag | B_FRAME_EVENTS),    // kWorkspacesViewFlag is picked up by the app_server.
+	fParentWhichDrawsOnChildren(NULL),            // ...That's how the desktop frames are done!
 	fCurrentFrame(frame)
 {
 	if(showDragger) {
@@ -645,7 +618,54 @@ WorkspacesWindow::WorkspacesWindow(WorkspacesSettings *settings)
  	fSettings(settings),
  	fAutoRaising(false)
 {
-	AddChild(new WorkspacesView(Bounds()));
+	
+	// Turn window decor on to grab decor widths.
+	BMessage windowSettings;
+	SetLook(B_TITLED_WINDOW_LOOK);
+	if (GetDecoratorSettings(&windowSettings) == B_OK){
+		BRect tabFrame = windowSettings.FindRect("tab frame");
+		float borderWidth = windowSettings.FindFloat("border width");
+		fTabHeight = tabFrame.Height();
+		fBorderWidth = borderWidth;
+		
+		/* Note: Below is based on old code from WorkspacesSettings::WorkspacesSettings(). 
+				 Decorator dimensions can be dynamically fetched instead of hardcoded here. */
+		
+		BScreen screen;
+		
+		float screenWidth = screen.Frame().Width();
+		float screenHeight = screen.Frame().Height();
+		float aspectRatio = screenWidth / screenHeight;
+
+		uint32 columns, rows;
+		BPrivate::get_workspaces_layout(&columns, &rows);
+
+		// default size of ~1/10 of screen width
+		float workspaceWidth = screenWidth / 10;
+		float workspaceHeight = workspaceWidth / aspectRatio;
+
+		float width = floor(workspaceWidth * columns);
+		float height = floor(workspaceHeight * rows);
+		
+		// If you have too many workspaces to fit on the screen, shrink until they fit.
+		while (width + 2 * borderWidth > screenWidth
+			|| height + 2 * borderWidth + GetTabHeight() > screenHeight) {
+			width = floor(0.95 * width);
+			height = floor(0.95 * height);
+		}
+		
+		BRect frame = fSettings->ScreenFrame();
+		frame.OffsetBy(-2.0 * borderWidth, -2.0 * borderWidth);
+		frame.left = frame.right - width;
+		frame.top = frame.bottom - height;
+		ResizeTo(frame.Width(), frame.Height());
+		if (!fSettings->SettingsLoaded()) {
+			// Put it in bottom corner by default.
+			MoveTo(screenWidth - frame.Width() - borderWidth, 
+					screenHeight - frame.Height() - borderWidth);
+		}
+		fSettings->SetWindowFrame(frame);
+	}
 
 	if (!fSettings->HasBorder())
 		SetLook(B_NO_BORDER_WINDOW_LOOK);
@@ -656,6 +676,8 @@ WorkspacesWindow::WorkspacesWindow(WorkspacesSettings *settings)
 		SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
 	else
 		SetAutoRaise(fSettings->AutoRaising());
+		
+		AddChild(new WorkspacesView(Bounds()));
 }
 
 
@@ -724,10 +746,9 @@ WorkspacesWindow::Zoom(BPoint origin, float width, float height)
 	width = floor(workspaceWidth * columns);
 	height = floor(workspaceHeight * rows);
 
-	float tabHeight = Frame().top - DecoratorFrame().top;
 
-	while (width + 2 * kScreenBorderOffset > screenWidth
-		|| height + 2 * kScreenBorderOffset + tabHeight > screenHeight) {
+	while (width + 2 * GetScreenBorderOffset() > screenWidth
+		|| height + 2 * GetScreenBorderOffset() + GetTabHeight() > screenHeight) {
 		width = floor(0.95 * width);
 		height = floor(0.95 * height);
 	}
@@ -735,8 +756,8 @@ WorkspacesWindow::Zoom(BPoint origin, float width, float height)
 	ResizeTo(width, height);
 
 	origin = screen.Frame().RightBottom();
-	origin.x -= kScreenBorderOffset + width;
-	origin.y -= kScreenBorderOffset + height;
+	origin.x -= GetScreenBorderOffset() + width;
+	origin.y -= GetScreenBorderOffset() + height;
 
 	MoveTo(origin);
 }
