diff --git headers/os/interface/InterfaceDefs.h headers/os/interface/InterfaceDefs.h
index 40f2d89..0f85a48 100644
--- headers/os/interface/InterfaceDefs.h
+++ headers/os/interface/InterfaceDefs.h
@@ -322,7 +322,10 @@ enum color_which {
 	B_WINDOW_TAB_COLOR = 3,
 	B_WINDOW_TEXT_COLOR = 22,
 	B_WINDOW_INACTIVE_TAB_COLOR = 23,
-	B_WINDOW_INACTIVE_TEXT_COLOR = 24
+	B_WINDOW_INACTIVE_TEXT_COLOR = 24,
+
+	B_WINDOW_BORDER_COLOR = 25,
+	B_WINDOW_INACTIVE_BORDER_COLOR = 26
 };
 
 
diff --git headers/private/app/ServerReadOnlyMemory.h headers/private/app/ServerReadOnlyMemory.h
index e0bb817..477ee4c 100644
--- headers/private/app/ServerReadOnlyMemory.h
+++ headers/private/app/ServerReadOnlyMemory.h
@@ -26,10 +26,10 @@ static inline int32
 color_which_to_index(color_which which)
 {
 	// NOTE: this must be kept in sync with InterfaceDefs.h color_which!
-	if (which <= B_WINDOW_INACTIVE_TEXT_COLOR)
+	if (which <= B_WINDOW_INACTIVE_BORDER_COLOR)
 		return which - 1;
 	if (which >= B_SUCCESS_COLOR && which <= B_FAILURE_COLOR)
-		return which - B_SUCCESS_COLOR + B_WINDOW_INACTIVE_TEXT_COLOR;
+		return which - B_SUCCESS_COLOR + B_WINDOW_INACTIVE_BORDER_COLOR;
 
 	return -1;
 }
@@ -38,10 +38,10 @@ static inline color_which
 index_to_color_which(int32 index)
 {
 	if (index >= 0 && index < kNumColors) {
-		if ((color_which)index < B_WINDOW_INACTIVE_TEXT_COLOR)
+		if ((color_which)index < B_WINDOW_INACTIVE_BORDER_COLOR)
 			return (color_which)(index + 1);
 		else 
-			return (color_which)(index + B_SUCCESS_COLOR - B_WINDOW_INACTIVE_TEXT_COLOR);
+			return (color_which)(index + B_SUCCESS_COLOR - B_WINDOW_INACTIVE_BORDER_COLOR);
 	}
 
 	return (color_which)-1;
diff --git src/bin/WindowShade.cpp src/bin/WindowShade.cpp
index 9b5bc31..dcca8d2 100644
--- src/bin/WindowShade.cpp
+++ src/bin/WindowShade.cpp
@@ -63,6 +63,8 @@ static struct option const kLongOptions[] = {
 	I(window_text_color, B_WINDOW_TEXT_COLOR),
 	I(window_inactive_tab_color, B_WINDOW_INACTIVE_TAB_COLOR),
 	I(window_inactive_text_color, B_WINDOW_INACTIVE_TEXT_COLOR),
+	I(window_border_color, B_WINDOW_BORDER_COLOR),
+	I(window_inactive_border_color, B_WINDOW_INACTIVE_BORDER_COLOR),
 	{"sum", required_argument, 0, 's'},
 	{"refresh", no_argument, 0, 'r'},
 	{"help", no_argument, 0, 'h'},
diff --git src/kits/interface/InterfaceDefs.cpp src/kits/interface/InterfaceDefs.cpp
index ed61c2f..1c53538 100644
--- src/kits/interface/InterfaceDefs.cpp
+++ src/kits/interface/InterfaceDefs.cpp
@@ -94,6 +94,8 @@ static const rgb_color _kDefaultColors[kNumColors] = {
 	{0, 0, 0, 255},			// B_WINDOW_TEXT_COLOR
 	{232, 232, 232, 255},	// B_WINDOW_INACTIVE_TAB_COLOR
 	{80, 80, 80, 255},		// B_WINDOW_INACTIVE_TEXT_COLOR
+	{224, 224, 224, 255},	// B_WINDOW_BORDER_COLOR
+	{232, 232, 232, 255},	// B_WINDOW_INACTIVE_BORDER_COLOR
 	// 100...
 	{0, 255, 0, 255},		// B_SUCCESS_COLOR
 	{255, 0, 0, 255},		// B_FAILURE_COLOR
diff --git src/preferences/appearance/ColorSet.cpp src/preferences/appearance/ColorSet.cpp
index 653eba5..9840693 100644
--- src/preferences/appearance/ColorSet.cpp
+++ src/preferences/appearance/ColorSet.cpp
@@ -52,7 +52,10 @@ static ColorDescription sColorDescriptionTable[] =
 	{ B_WINDOW_TEXT_COLOR, B_TRANSLATE_MARK("Window tab text") },
 	{ B_WINDOW_INACTIVE_TAB_COLOR, B_TRANSLATE_MARK("Inactive window tab") },
 	{ B_WINDOW_INACTIVE_TEXT_COLOR,
-		B_TRANSLATE_MARK("Inactive window tab text") }
+		B_TRANSLATE_MARK("Inactive window tab text") },
+	{ B_WINDOW_BORDER_COLOR, B_TRANSLATE_MARK("Window border") },
+	{ B_WINDOW_INACTIVE_BORDER_COLOR,
+		B_TRANSLATE_MARK("Inactive window border") }
 };
 
 const int32 sColorDescriptionCount = sizeof(sColorDescriptionTable)
@@ -134,6 +137,8 @@ ColorSet::DefaultColorSet(void)
 	set.fColors[B_WINDOW_TEXT_COLOR] = make_color(0, 0, 0);
 	set.fColors[B_WINDOW_INACTIVE_TAB_COLOR] = make_color(232, 232, 232);
 	set.fColors[B_WINDOW_INACTIVE_TEXT_COLOR] = make_color(80, 80, 80);
+	set.fColors[B_WINDOW_BORDER_COLOR] = make_color(224, 224, 224);
+	set.fColors[B_WINDOW_INACTIVE_BORDER_COLOR] = make_color(232, 232, 232);
 
 	return set;
 }
diff --git src/servers/app/WorkspacesView.cpp src/servers/app/WorkspacesView.cpp
index 76045b8..c20e12c 100644
--- src/servers/app/WorkspacesView.cpp
+++ src/servers/app/WorkspacesView.cpp
@@ -15,6 +15,7 @@
 #include "Desktop.h"
 #include "DrawingEngine.h"
 #include "DrawState.h"
+#include "InterfaceDefs.h"
 #include "ServerApp.h"
 #include "Window.h"
 #include "Workspace.h"
@@ -166,7 +167,7 @@ WorkspacesView::_WindowFrame(const BRect& workspaceFrame,
 void
 WorkspacesView::_DrawWindow(DrawingEngine* drawingEngine,
 	const BRect& workspaceFrame, const BRect& screenFrame, ::Window* window,
-	BPoint windowPosition, BRegion& backgroundRegion, bool active)
+	BPoint windowPosition, BRegion& backgroundRegion, bool workspaceActive)
 {
 	if (window->Feel() == kDesktopWindowFeel || window->IsHidden())
 		return;
@@ -188,27 +189,30 @@ WorkspacesView::_DrawWindow(DrawingEngine* drawingEngine,
 	rgb_color activeTabColor = (rgb_color){ 255, 203, 0, 255 };
 	rgb_color inactiveTabColor = (rgb_color){ 232, 232, 232, 255 };
 	rgb_color navColor = (rgb_color){ 0, 0, 229, 255 };
+	rgb_color activeFrameColor = (rgb_color){ 180, 180, 180, 255 };
+	rgb_color inactiveFrameColor = (rgb_color){ 180, 180, 180, 255 };
 	if (decorator != NULL) {
 		activeTabColor = decorator->UIColor(B_WINDOW_TAB_COLOR);
 		inactiveTabColor = decorator->UIColor(B_WINDOW_INACTIVE_TAB_COLOR);
 		navColor = decorator->UIColor(B_NAVIGATION_BASE_COLOR);
+		activeFrameColor = decorator->UIColor(B_WINDOW_BORDER_COLOR);
+		inactiveFrameColor = decorator->UIColor(B_WINDOW_INACTIVE_BORDER_COLOR);
 	}
-	// TODO: let decorator do this!
-	rgb_color frameColor = (rgb_color){ 180, 180, 180, 255 };
+
 	rgb_color white = (rgb_color){ 255, 255, 255, 255 };
 
 	rgb_color tabColor = inactiveTabColor;
-	if (window->IsFocus())
+	rgb_color frameColor = inactiveFrameColor;
+	if (window->IsFocus()) {
 		tabColor = activeTabColor;
+		frameColor = activeFrameColor;
+	}
 
-	if (!active) {
+	if (!workspaceActive) {
 		_DarkenColor(tabColor);
 		_DarkenColor(frameColor);
 		_DarkenColor(white);
 	}
-	if (window == fSelectedWindow) {
-		frameColor = navColor;
-	}
 
 	if (tabFrame.left < frame.left)
 		tabFrame.left = frame.left;
@@ -274,8 +278,8 @@ WorkspacesView::_DrawWorkspace(DrawingEngine* drawingEngine,
 	BRect rect = _WorkspaceAt(index);
 
 	Workspace workspace(*Window()->Desktop(), index);
-	bool active = workspace.IsCurrent();
-	if (active) {
+	bool workspaceActive = workspace.IsCurrent();
+	if (workspaceActive) {
 		// draw active frame
 		rgb_color black = (rgb_color){ 0, 0, 0, 255 };
 		drawingEngine->StrokeRect(rect, black);
@@ -287,7 +291,7 @@ WorkspacesView::_DrawWorkspace(DrawingEngine* drawingEngine,
 	rect.InsetBy(1, 1);
 
 	rgb_color color = workspace.Color();
-	if (!active)
+	if (!workspaceActive)
 		_DarkenColor(color);
 
 	// draw windows
@@ -317,7 +321,7 @@ WorkspacesView::_DrawWorkspace(DrawingEngine* drawingEngine,
 	BPoint leftTop;
 	while (workspace.GetPreviousWindow(window, leftTop) == B_OK) {
 		_DrawWindow(drawingEngine, rect, screenFrame, window,
-			leftTop, backgroundRegion, active);
+			leftTop, backgroundRegion, workspaceActive);
 	}
 
 	// draw background
diff --git src/servers/app/WorkspacesView.h src/servers/app/WorkspacesView.h
index a34b54a..179e6cb 100644
--- src/servers/app/WorkspacesView.h
+++ src/servers/app/WorkspacesView.h
@@ -45,7 +45,7 @@ private:
 			void	_DrawWindow(DrawingEngine* drawingEngine,
 						const BRect& workspaceFrame, const BRect& screenFrame,
 						::Window* window, BPoint windowPosition,
-						BRegion& backgroundRegion, bool active);
+						BRegion& backgroundRegion, bool workspaceActive);
 			void	_DrawWorkspace(DrawingEngine* drawingEngine,
 						BRegion& redraw, int32 index);
 
diff --git src/servers/app/decorator/DefaultDecorator.cpp src/servers/app/decorator/DefaultDecorator.cpp
index ea93151..05e693d 100644
--- src/servers/app/decorator/DefaultDecorator.cpp
+++ src/servers/app/decorator/DefaultDecorator.cpp
@@ -87,17 +87,6 @@ const rgb_color DefaultDecorator::kFrameColors[4] = {
 	{ 108, 108, 108, 255 }
 };
 
-const rgb_color DefaultDecorator::kFocusFrameColors[2] = {
-	{ 224, 224, 224, 255 },
-	{ 208, 208, 208, 255 }
-};
-
-const rgb_color DefaultDecorator::kNonFocusFrameColors[2] = {
-	{ 232, 232, 232, 255 },
-	{ 232, 232, 232, 255 }
-};
-
-
 
 // TODO: get rid of DesktopSettings here, and introduce private accessor
 //	methods to the Decorator base class
@@ -105,6 +94,7 @@ DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect)
 	:
 	Decorator(settings, rect),
 	// focus color constants
+	kFocusFrameColor(settings.UIColor(B_WINDOW_BORDER_COLOR)),
 	kFocusTabColor(settings.UIColor(B_WINDOW_TAB_COLOR)),
 	kFocusTabColorLight(tint_color(kFocusTabColor,
  		(B_LIGHTEN_MAX_TINT + B_LIGHTEN_2_TINT) / 2)),
@@ -113,6 +103,7 @@ DefaultDecorator::DefaultDecorator(DesktopSettings& settings, BRect rect)
  		(B_DARKEN_1_TINT + B_NO_TINT) / 2)),
 	kFocusTextColor(settings.UIColor(B_WINDOW_TEXT_COLOR)),
 	// non-focus color constants
+	kNonFocusFrameColor(settings.UIColor(B_WINDOW_INACTIVE_BORDER_COLOR)),
 	kNonFocusTabColor(settings.UIColor(B_WINDOW_INACTIVE_TAB_COLOR)),
 	kNonFocusTabColorLight(tint_color(kNonFocusTabColor,
  		(B_LIGHTEN_MAX_TINT + B_LIGHTEN_2_TINT) / 2)),
@@ -143,7 +134,7 @@ DefaultDecorator::TabLocation(int32 tab) const
 {
 	DefaultDecorator::Tab* decoratorTab = _TabAt(tab);
 	if (decoratorTab == NULL)
-		return 0.;
+		return 0.0f;
 	return (float)decoratorTab->tabOffset;
 }
 
@@ -666,7 +657,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// top
 			if (invalid.Intersects(fTopBorder)) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_TOP_BORDER, colors);
+				_GetComponentColors(COMPONENT_TOP_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 5; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.left + i, r.top + i),
@@ -686,7 +677,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// left
 			if (invalid.Intersects(fLeftBorder.InsetByCopy(0, -fBorderWidth))) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_LEFT_BORDER, colors);
+				_GetComponentColors(COMPONENT_LEFT_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 5; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.left + i, r.top + i),
@@ -696,7 +687,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// bottom
 			if (invalid.Intersects(fBottomBorder)) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_BOTTOM_BORDER, colors);
+				_GetComponentColors(COMPONENT_BOTTOM_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 5; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.left + i, r.bottom - i),
@@ -707,7 +698,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// right
 			if (invalid.Intersects(fRightBorder.InsetByCopy(0, -fBorderWidth))) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_RIGHT_BORDER, colors);
+				_GetComponentColors(COMPONENT_RIGHT_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 5; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.right - i, r.top + i),
@@ -724,7 +715,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// top
 			if (invalid.Intersects(fTopBorder)) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_TOP_BORDER, colors);
+				_GetComponentColors(COMPONENT_TOP_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 3; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.left + i, r.top + i),
@@ -744,7 +735,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// left
 			if (invalid.Intersects(fLeftBorder.InsetByCopy(0, -fBorderWidth))) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_LEFT_BORDER, colors);
+				_GetComponentColors(COMPONENT_LEFT_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 3; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.left + i, r.top + i),
@@ -764,7 +755,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// bottom
 			if (invalid.Intersects(fBottomBorder)) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_BOTTOM_BORDER, colors);
+				_GetComponentColors(COMPONENT_BOTTOM_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 3; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.left + i, r.bottom - i),
@@ -775,7 +766,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 			// right
 			if (invalid.Intersects(fRightBorder.InsetByCopy(0, -fBorderWidth))) {
 				ComponentColors colors;
-				_GetComponentColors(COMPONENT_RIGHT_BORDER, colors);
+				_GetComponentColors(COMPONENT_RIGHT_BORDER, colors, fTopTab);
 
 				for (int8 i = 0; i < 3; i++) {
 					fDrawingEngine->StrokeLine(BPoint(r.right - i, r.top + i),
@@ -790,7 +781,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 		{
 			// TODO: Draw the borders individually!
 			ComponentColors colors;
-			_GetComponentColors(COMPONENT_LEFT_BORDER, colors);
+			_GetComponentColors(COMPONENT_LEFT_BORDER, colors, fTopTab);
 
 			fDrawingEngine->StrokeRect(r, colors[5]);
 			break;
@@ -806,7 +797,7 @@ DefaultDecorator::_DrawFrame(BRect invalid)
 		r = fResizeRect;
 
 		ComponentColors colors;
-		_GetComponentColors(COMPONENT_RESIZE_CORNER, colors);
+		_GetComponentColors(COMPONENT_RESIZE_CORNER, colors, fTopTab);
 
 		switch ((int)fTopTab->look) {
 			case B_DOCUMENT_WINDOW_LOOK:
@@ -1499,8 +1490,10 @@ DefaultDecorator::GetComponentColors(Component component, uint8 highlight,
 	DefaultDecorator::Tab* tab = static_cast<DefaultDecorator::Tab*>(_tab);
 	switch (component) {
 		case COMPONENT_TAB:
-			_colors[COLOR_TAB_FRAME_LIGHT] = kFrameColors[0];
-			_colors[COLOR_TAB_FRAME_DARK] = kFrameColors[3];
+			_colors[COLOR_TAB_FRAME_LIGHT]
+				= tint_color(kFocusFrameColor, B_DARKEN_2_TINT);
+			_colors[COLOR_TAB_FRAME_DARK]
+				= tint_color(kFocusFrameColor, B_DARKEN_3_TINT);
 			if (tab && tab->buttonFocus) {
 				_colors[COLOR_TAB] = kFocusTabColor;
 				_colors[COLOR_TAB_LIGHT] = kFocusTabColorLight;
@@ -1533,17 +1526,23 @@ DefaultDecorator::GetComponentColors(Component component, uint8 highlight,
 		case COMPONENT_BOTTOM_BORDER:
 		case COMPONENT_RESIZE_CORNER:
 		default:
-			_colors[0] = kFrameColors[0];
-			_colors[1] = kFrameColors[1];
 			if (tab && tab->buttonFocus) {
-				_colors[2] = kFocusFrameColors[0];
-				_colors[3] = kFocusFrameColors[1];
+				_colors[0] = tint_color(kFocusFrameColor, B_DARKEN_2_TINT);
+				_colors[1] = tint_color(kFocusFrameColor, B_LIGHTEN_2_TINT);
+				_colors[2] = kFocusFrameColor;
+				_colors[3] = tint_color(kFocusFrameColor,
+					(B_DARKEN_1_TINT + B_NO_TINT) / 2);
+				_colors[4] = tint_color(kFocusFrameColor, B_DARKEN_2_TINT);
+				_colors[5] = tint_color(kFocusFrameColor, B_DARKEN_3_TINT);
 			} else {
-				_colors[2] = kNonFocusFrameColors[0];
-				_colors[3] = kNonFocusFrameColors[1];
+				_colors[0] = tint_color(kNonFocusFrameColor, B_DARKEN_2_TINT);
+				_colors[1] = tint_color(kNonFocusFrameColor, B_LIGHTEN_2_TINT);
+				_colors[2] = kNonFocusFrameColor;
+				_colors[3] = tint_color(kNonFocusFrameColor,
+					(B_DARKEN_1_TINT + B_NO_TINT) / 2);
+				_colors[4] = tint_color(kNonFocusFrameColor, B_DARKEN_2_TINT);
+				_colors[5] = tint_color(kNonFocusFrameColor, B_DARKEN_3_TINT);
 			}
-			_colors[4] = kFrameColors[2];
-			_colors[5] = kFrameColors[3];
 
 			// for the resize-border highlight dye everything bluish.
 			if (highlight == HIGHLIGHT_RESIZE_BORDER) {
diff --git src/servers/app/decorator/DefaultDecorator.h src/servers/app/decorator/DefaultDecorator.h
index 89fd663..7f46309 100644
--- src/servers/app/decorator/DefaultDecorator.h
+++ src/servers/app/decorator/DefaultDecorator.h
@@ -186,8 +186,8 @@ private:
 			void				_CalculateTabsRegion();
 protected:
 	static	const rgb_color		kFrameColors[4];
-	static	const rgb_color		kFocusFrameColors[2];
-	static	const rgb_color		kNonFocusFrameColors[2];
+
+			const rgb_color		kFocusFrameColor;
 
 			const rgb_color		kFocusTabColor;
 			const rgb_color		kFocusTabColorLight;
@@ -195,6 +195,8 @@ protected:
 			const rgb_color		kFocusTabColorShadow;
 			const rgb_color		kFocusTextColor;
 
+			const rgb_color		kNonFocusFrameColor;
+
 			const rgb_color		kNonFocusTabColor;
 			const rgb_color		kNonFocusTabColorLight;
 			const rgb_color		kNonFocusTabColorBevel;
