 		}
 	}
 
+	private func doViewDidLayout() {
+		/* Keep prefered size */
+		if let root = mRootView {
+			#if os(OSX)
+				self.preferredContentSize = root.frame.size
+				mHasPreferedContentSize   = true
+			#endif
+		} else {
+			CNLog(logLevel: .error, message: "No root view")
+		}
+	}
+
 	private func doViewDidAppear() {
 		#if os(OSX)
 			if let window = self.view.window, let root = mRootView {
-				//NSLog("doViewDidAppear")
+				/* decide 1st responder */
 				let decider = KCFirstResponderDecider(window: window)
 				let _ = decider.decideFirstResponder(rootView: root)
 				//dumpInfo(phase: "- [doViewDidAppear]", rootView: root)


	private func doViewWillLayout() {
		if let root = mRootView {
			if root.hasCoreView {
				/* Layout components */
				CNLog(logLevel: .debug, message: "- [Execute Layout] (root-size=\(root.frame.size.description)")

	#endif

	#if os(OSX)
	open override func viewDidLayout() {
		super.viewDidLayout()
		doViewDidLayout()
	}
	#else
	open override func viewDidLayoutSubviews() {
		super.viewDidLayoutSubviews()
		doViewDidLayout()
	}
	#endif

	#if os(OSX)
	open override func viewDidAppear() {
		super.viewDidAppear()
		doViewDidAppear()
