             rootContainer.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
             rootContainer.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16),
 
-            stackView.topAnchor.constraint(equalTo: rootContainer.topAnchor),
-            stackView.bottomAnchor.constraint(equalTo: rootContainer.bottomAnchor),
-            stackView.leadingAnchor.constraint(equalTo: rootContainer.leadingAnchor),
-            stackView.trailingAnchor.constraint(equalTo: rootContainer.trailingAnchor)
+            stackView.topAnchor.constraint(equalTo: rootContainer.topAnchor, constant: 12),
+            stackView.bottomAnchor.constraint(equalTo: rootContainer.bottomAnchor, constant: -12),
+            stackView.leadingAnchor.constraint(equalTo: rootContainer.leadingAnchor, constant: 12),
+            stackView.trailingAnchor.constraint(equalTo: rootContainer.trailingAnchor, constant: -12)
         ])
+
+        stackView.addArrangedSubview(disclosureRow)
+        stackView.addArrangedSubview(topicView)
+    }
+
+    // MARK: - Configure
+
+    func configure(viewModel: TalkPageCellViewModel) {
+        self.viewModel = viewModel
+
+        disclosureRow.configure(viewModel: viewModel)
+        topicView.configure(viewModel: viewModel)
+
+        let comments: [UIView] = stackView.arrangedSubviews.filter { view in view is TalkPageCellCommentView || view is TalkPageCellCommentSeparator }
+        stackView.arrangedSubviews.forEach { view in
+            if comments.contains(view) {
+                view.removeFromSuperview()
+            }
+        }
+
+        for commentViewModel in viewModel.replies {
+            let separator = TalkPageCellCommentSeparator()
+            let commentView = TalkPageCellCommentView()
+            commentView.configure(viewModel: commentViewModel)
+
+            commentView.isHidden = !viewModel.isThreadExpanded
+            separator.isHidden = !viewModel.isThreadExpanded
+
+            stackView.addArrangedSubview(separator)
+            stackView.addArrangedSubview(commentView)
+        }
+
+        disclosureRow.disclosureButton.addTarget(self, action: #selector(userDidTapDisclosureButton), for: .primaryActionTriggered)
+        disclosureRow.subscribeButton.addTarget(self, action: #selector(userDidTapSubscribeButton), for: .primaryActionTriggered)
+    }
+
+    // MARK: - Actions
+
+    @objc func userDidTapDisclosureButton() {
+        delegate?.userDidTapDisclosureButton(cellViewModel: viewModel)
+    }
+
+    @objc func userDidTapSubscribeButton() {
+        delegate?.userDidTapSubscribeButton(cellViewModel: viewModel)
     }
 
 }

        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical
        return stackView
    }()

    // MARK: - Lifecycle


import Foundation
import UIKit
import WMF

protocol TalkPageCellDelegate: AnyObject {
    func userDidTapDisclosureButton(cellViewModel: TalkPageCellViewModel?)
    func userDidTapSubscribeButton(cellViewModel: TalkPageCellViewModel?)
}

final class TalkPageCell: UICollectionViewCell {

    // MARK: - Properties

    static let reuseIdentifier = "TalkPageCell"

    weak var viewModel: TalkPageCellViewModel?
    weak var delegate: TalkPageCellDelegate?

    // MARK: - UI Elements

