 			layer?.backgroundColor = color.cgColor
 		}
 	}
-
-	private func updateTitleView() {
+}
+
+// MARK: - Private
+
+private extension TimelineTableCellView {
+
+	func addSubviewAtInit(_ view: NSView, hidden: Bool) {
+
+		addSubview(view)
+		view.translatesAutoresizingMaskIntoConstraints = false
+		view.isHidden = hidden
+	}
+
+	func commonInit() {
+
+		addSubviewAtInit(titleView, hidden: false)
+		addSubviewAtInit(unreadIndicatorView, hidden: true)
+		addSubviewAtInit(dateView, hidden: false)
+		addSubviewAtInit(feedNameView, hidden: true)
+		addSubviewAtInit(avatarImageView, hidden: false)
+		addSubviewAtInit(starView, hidden: false)
+	}
+
+	func updatedLayoutRects() -> TimelineCellLayout {
+
+		return timelineCellLayout(NSWidth(bounds), cellData: cellData, appearance: cellAppearance)
+	}
+
+	func updateAppearance() {
+
+		if let rowView = superview as? NSTableRowView {
+			isEmphasized = rowView.isEmphasized
+			isSelected = rowView.isSelected
+		}
+		else {
+			isEmphasized = false
+			isSelected = false
+		}
+	}
+
+	func updateTitleView() {
 
 		titleView.attributedStringValue = cellData.attributedTitle
 		needsLayout = true
 	}
-	
-	private func updateDateView() {
+
+	func updateDateView() {
 
 		dateView.attributedStringValue = cellData.attributedDateString
 		needsLayout = true
 	}
 
-	private func updateFeedNameView() {
+	func updateFeedNameView() {
 
 		if cellData.showFeedName {
 			if feedNameView.isHidden {

		return imageView
	}()

	let starView: NSImageView = {
		let imageView = NSImageView(frame: NSRect.zero)
		imageView.imageScaling = .scaleNone
		imageView.animates = false

		}
	}

	func updateUnreadIndicator() {

		let shouldHide = cellData.read || cellData.starred
		if unreadIndicatorView.isHidden != shouldHide {
