     
     // MARK: Init
     
-    public convenience init() {
-        self.init(collectionViewLayout: UICollectionViewFlowLayout())
-    }
-    
-    public convenience init(collectionViewLayout layout: UICollectionViewLayout, dataSource: DataSource) {
+    public convenience init(layout: UICollectionViewLayout = UICollectionViewFlowLayout(),
+                            dataSource: DataSource = BasicDataSource()) {
         self.init(collectionViewLayout: layout)
         self.dataSource = dataSource
     }

        let identifier = dataSource.identifier(at: indexPath)
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
        if let cell = cell as? UICollectionViewCell & CollectionViewModelCell {
            update(cell, at: indexPath)
        }
        return cell
    }

    open override func viewDidLoad() {
        super.viewDidLoad()
        
        reload()
    }
    
    // MARK: Helpers
    
    private func reload() {
        if Thread.isMainThread {
            registerCells()
            collectionView?.reloadData()
        } else {
            DispatchQueue.main.async { [weak self] in
                self?.registerCells()
                self?.collectionView?.reloadData()
            }
        }
    }
    
    private func registerCells() {
