diff --git a/src/RingWindowController.mm b/src/RingWindowController.mm
index 8b4036d..b6a0166 100644
--- a/src/RingWindowController.mm
+++ b/src/RingWindowController.mm
@@ -28,32 +28,29 @@
 #import "Constants.h"
 #import "CurrentCallVC.h"
 
+#import "PreferencesWC.h"
+#import "views/NSColor+RingTheme.h"
 
-@interface RingWindowController ()
+@implementation RingWindowController {
 
-@property CurrentCallVC* currentVC;
-@property (unsafe_unretained) IBOutlet NSView *callView;
-@property (unsafe_unretained) IBOutlet NSTextField *ringIDLabel;
+    __unsafe_unretained IBOutlet NSView *callView;
+    __unsafe_unretained IBOutlet NSTextField *ringIDLabel;
 
-
-@end
-
-@implementation RingWindowController
-@synthesize currentVC;
-@synthesize callView, ringIDLabel;
+    PreferencesWC *preferencesWC;
+    CurrentCallVC* currentVC;
+}
 
 static NSString* const kPreferencesIdentifier = @"PreferencesIdentifier";
 
 - (void)windowDidLoad {
     [super windowDidLoad];
     [self.window setMovableByWindowBackground:YES];
-    [self displayMainToolBar];
 
     currentVC = [[CurrentCallVC alloc] initWithNibName:@"CurrentCall" bundle:nil];
     [callView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
     [[currentVC view] setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
 
-    [callView addSubview:[self.currentVC view] positioned:NSWindowAbove relativeTo:nil];
+    [callView addSubview:[currentVC view] positioned:NSWindowAbove relativeTo:nil];
 
     [currentVC initFrame];
 
@@ -99,149 +96,8 @@
 
 - (IBAction)openPreferences:(id)sender
 {
-    if(self.preferencesViewController != nil) {
-        [self closePreferences:nil];
-        return;
-    }
-    NSToolbar* tb = [[NSToolbar alloc] initWithIdentifier: @"PreferencesToolbar"];
-
-    self.preferencesViewController = [[PreferencesVC alloc] initWithNibName:@"PreferencesScreen" bundle:nil];
-    self.myCurrentViewController = self.preferencesViewController;
-
-    NSLayoutConstraint* test = [NSLayoutConstraint constraintWithItem:self.preferencesViewController.view
-                                                            attribute:NSLayoutAttributeWidth
-                                                            relatedBy:NSLayoutRelationEqual
-                                                               toItem:currentView
-                                                            attribute:NSLayoutAttributeWidth
-                                                           multiplier:1.0f
-                                                             constant:0.0f];
-
-    NSLayoutConstraint* test2 = [NSLayoutConstraint constraintWithItem:self.preferencesViewController.view
-                                                             attribute:NSLayoutAttributeHeight
-                                                             relatedBy:NSLayoutRelationEqual
-                                                                toItem:currentView
-                                                             attribute:NSLayoutAttributeHeight
-                                                            multiplier:1.0f
-                                                              constant:0.0f];
-
-    NSLayoutConstraint* test3 = [NSLayoutConstraint constraintWithItem:self.preferencesViewController.view
-                                                             attribute:NSLayoutAttributeCenterX
-                                                             relatedBy:NSLayoutRelationEqual
-                                                                toItem:currentView
-                                                             attribute:NSLayoutAttributeCenterX
-                                                            multiplier:1.0f
-                                                              constant:0.0f];
-
-
-    [currentView addSubview:[self.preferencesViewController view]];
-
-    [tb setDelegate: self.preferencesViewController];
-    [self.window setToolbar: tb];
-
-    [self.window.toolbar setSelectedItemIdentifier:@"GeneralPrefsIdentifier"];
-
-    [currentView addConstraint:test];
-    [currentView addConstraint:test2];
-    [currentView addConstraint:test3];
-    // make sure we automatically resize the controller's view to the current window size
-    [[self.myCurrentViewController view] setFrame:[currentView bounds]];
-
-    // set the view controller's represented object to the number of subviews in that controller
-    // (our NSTextField's value binding will reflect this value)
-    [self.myCurrentViewController setRepresentedObject:[NSNumber numberWithUnsignedInteger:[[[self.myCurrentViewController view] subviews] count]]];
-    
+    preferencesWC = [[PreferencesWC alloc] initWithWindowNibName:@"PreferencesWindow"];
+    [preferencesWC.window makeKeyAndOrderFront:preferencesWC.window];
 }
 
-- (IBAction) closePreferences:(NSToolbarItem *)sender {
-    if(self.myCurrentViewController != nil)
-    {
-        [self.preferencesViewController close];
-        [self displayMainToolBar];
-        self.preferencesViewController = nil;
-    }
-}
-
--(void) displayMainToolBar
-{
-    NSToolbar* tb = [[NSToolbar alloc] initWithIdentifier: @"MainToolbar"];
-    [tb setDisplayMode:NSToolbarDisplayModeIconAndLabel];
-    [tb setDelegate: self];
-    [self.window setToolbar: tb];
-}
-
-// FIXME: This is sick, NSWindowController is catching my selectors
-- (void)displayGeneral:(NSToolbarItem *)sender {
-    [self.preferencesViewController displayGeneral:sender];
-}
-
-- (void)displayAudio:(NSToolbarItem *)sender {
-    [self.preferencesViewController displayAudio:sender];
-}
-
-- (void)displayAncrage:(NSToolbarItem *)sender {
-    [self.preferencesViewController displayAncrage:sender];
-}
-
-- (void)displayVideo:(NSToolbarItem *)sender {
-    [self.preferencesViewController displayVideo:sender];
-}
-
-- (void)displayAccounts:(NSToolbarItem *)sender {
-    [self.preferencesViewController displayAccounts:sender];
-}
-
-- (void)togglePowerSettings:(id)sender
-{
-    BOOL advanced = [[NSUserDefaults standardUserDefaults] boolForKey:Preferences::ShowAdvanced];
-    [[NSUserDefaults standardUserDefaults] setBool:!advanced forKey:Preferences::ShowAdvanced];
-    [[NSUserDefaults standardUserDefaults] synchronize];
-
-    NSToolbar* tb = [[NSToolbar alloc] initWithIdentifier: @"PreferencesToolbar"];
-    [tb setDelegate: self.preferencesViewController];
-    [self.preferencesViewController displayGeneral:nil];
-    [self.window setToolbar:tb];
-}
-
-#pragma mark - NSToolbar Delegate
-
--(NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
-{
-    NSToolbarItem* item = nil;
-
-    if ([itemIdentifier isEqualToString: kPreferencesIdentifier]) {
-        item = [[NSToolbarItem alloc] initWithItemIdentifier: kPreferencesIdentifier];
-        [item setImage: [NSImage imageNamed: @"NSAdvanced"]];
-        [item setLabel: @"Settings"];
-        [item setAction:@selector(openPreferences:)];
-    }
-
-    return item;
-}
-
-
--(NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar
-{
-    return [NSArray arrayWithObjects:
-            NSToolbarSpaceItemIdentifier,
-            NSToolbarFlexibleSpaceItemIdentifier,
-            NSToolbarSpaceItemIdentifier,
-            NSToolbarSpaceItemIdentifier,
-            NSToolbarFlexibleSpaceItemIdentifier,
-            kPreferencesIdentifier,
-            nil];
-}
-
--(NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar
-{
-    return [NSArray arrayWithObjects:
-            kPreferencesIdentifier,
-            nil];
-}
-
--(NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar
-{
-    return nil;
-}
-
-
 @end
