     }
 
     fileprivate override func main() {
-        if windows.count == 0 {
+        guard !windows.isEmpty else {
             return
         }
 
+        let mainPaneCount = min(windows.count, layout.mainPaneCount)
+        let secondaryPaneCount = windows.count - mainPaneCount
+        let hasSecondaryPane = secondaryPaneCount > 0
+
         let screenFrame = adjustedFrameForLayout(screen)
-        let windowWidth = screenFrame.width / CGFloat(windows.count)
+        let mainPaneWindowWidth = round(screenFrame.width * (hasSecondaryPane ? CGFloat(layout.mainPaneRatio) : 1.0))
+        let secondaryPaneWindowWidth = hasSecondaryPane ? round((screenFrame.width - mainPaneWindowWidth) / CGFloat(secondaryPaneCount)) : 0.0
 
         let focusedWindow = SIWindow.focused()
 
         let frameAssignments = windows.reduce([]) { frameAssignments, window -> [FrameAssignment] in
             var assignments = frameAssignments
-            let originX = screenFrame.origin.x + CGFloat(frameAssignments.count) * windowWidth
-            let windowFrame = CGRect(x: originX, y: screenFrame.origin.y, width: windowWidth, height: screenFrame.size.height)
+            var windowFrame: CGRect = .zero
+
+            if frameAssignments.count < mainPaneCount {
+                windowFrame.origin.x = screenFrame.origin.x + (mainPaneWindowWidth * CGFloat(frameAssignments.count))
+                windowFrame.origin.y = screenFrame.origin.y
+                windowFrame.size.width = mainPaneWindowWidth
+                windowFrame.size.height = screenFrame.height
+            } else {
+                windowFrame.origin.x = screenFrame.origin.x + mainPaneWindowWidth + (secondaryPaneWindowWidth * CGFloat(frameAssignments.count - mainPaneCount))
+                windowFrame.origin.y = screenFrame.origin.y
+                windowFrame.size.width = secondaryPaneWindowWidth
+                windowFrame.size.height = screenFrame.height
+            }
 
             let frameAssignment = FrameAssignment(frame: windowFrame, window: window, focused: window.isEqual(to: focusedWindow), screenFrame: screenFrame)
 

    override open class var layoutName: String { return "Column" }
    override open class var layoutKey: String { return "column" }

    override open func reflowOperationForScreen(_ screen: NSScreen, withWindows windows: [SIWindow]) -> ReflowOperation {
        return ColumnReflowOperation(screen: screen, windows: windows, layout: self, windowActivityCache: windowActivityCache)
    }
}

            return assignments
        }

        guard !isCancelled else {
            return
        }

