diff --git a/Evergreen/AppDefaults.swift b/Evergreen/AppDefaults.swift
index 6841b0b61..ae137aca4 100644
--- a/Evergreen/AppDefaults.swift
+++ b/Evergreen/AppDefaults.swift
@@ -27,6 +27,7 @@ final class AppDefaults {
 		static let timelineSortDirection = "timelineSortDirection"
 		static let detailFontSize = "detailFontSize"
 		static let openInBrowserInBackground = "openInBrowserInBackground"
+		static let mainWindowWidths = "mainWindowWidths"
 
 		// Hidden prefs
 		static let showTitleOnMainWindow = "KafasisTitleMode"
@@ -86,6 +87,15 @@ final class AppDefaults {
 		}
 	}
 
+	var mainWindowWidths: [Int]? {
+		get {
+			return UserDefaults.standard.object(forKey: Key.mainWindowWidths) as? [Int]
+		}
+		set {
+			UserDefaults.standard.set(newValue, forKey: Key.mainWindowWidths)
+		}
+	}
+	
 	private init() {
 
 		AppDefaults.registerDefaults()
diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift
index bc9617c6e..46c20420f 100644
--- a/Evergreen/MainWindow/MainWindowController.swift
+++ b/Evergreen/MainWindow/MainWindowController.swift
@@ -31,6 +31,8 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
 		return window?.toolbar?.existingItem(withIdentifier: .Share)
 	}
 
+	private static var detailViewMinimumThickness = 384
+
 	// MARK: - NSWindowController
 
 	override func windowDidLoad() {
@@ -53,8 +55,9 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
 			}
 		}
 
-		detailSplitViewItem?.minimumThickness = 384
-		
+		detailSplitViewItem?.minimumThickness = CGFloat(MainWindowController.detailViewMinimumThickness)
+		restoreSplitViewState()
+
 		NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate(_:)), name: NSApplication.willTerminateNotification, object: nil)
 
 		NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressDidChange(_:)), name: .AccountRefreshDidBegin, object: nil)
@@ -72,11 +75,10 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
 
 	func saveState() {
 
-		// TODO: save width of split view and anything else that should be saved.
-
-		
+		saveSplitViewState()
 	}
 
+
 	func selectedObjectsInSidebar() -> [AnyObject]? {
 
 		return sidebarViewController?.selectedObjects
@@ -86,6 +88,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
 
 	@objc func applicationWillTerminate(_ note: Notification) {
 
+		saveState()
 		window?.saveFrame(usingName: windowAutosaveName)
 	}
 
@@ -483,5 +486,39 @@ private extension MainWindowController {
 			window?.title = "\(appDelegate.appName!) (\(unreadCount))"
 		}
 	}
+
+	func saveSplitViewState() {
+
+		// TODO: Update this for multiple windows.
+
+		guard let splitView = splitViewController?.splitView else {
+			return
+		}
+
+		let widths = splitView.arrangedSubviews.map{ Int(floor($0.frame.width)) }
+		AppDefaults.shared.mainWindowWidths = widths
+	}
+
+	func restoreSplitViewState() {
+
+		// TODO: Update this for multiple windows.
+
+		guard let splitView = splitViewController?.splitView, let widths = AppDefaults.shared.mainWindowWidths, widths.count == 3, let window = window else {
+			return
+		}
+
+		let windowWidth = Int(floor(window.frame.width))
+		let dividerThickness: Int = Int(splitView.dividerThickness)
+		let sidebarWidth: Int = widths[0]
+		let timelineWidth: Int = widths[1]
+
+		// Make sure the detail view has its mimimum thickness, at least.
+		if windowWidth < sidebarWidth + dividerThickness + timelineWidth + dividerThickness + MainWindowController.detailViewMinimumThickness {
+			return
+		}
+
+		splitView.setPosition(CGFloat(sidebarWidth), ofDividerAt: 0)
+		splitView.setPosition(CGFloat(sidebarWidth + dividerThickness + timelineWidth), ofDividerAt: 1)
+	}
 }