     
     // UICollectionView delegate
     
-    open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) -> UICollectionViewCell {
-        return self.collectionView(collectionView, cellForItemAt: indexPath, with: Cell.identifier)
-    }
-    
-    //TODO: It is a workaround to achieve different rows for dequeue.
-    open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, with identifier: String) -> UICollectionViewCell {
-        let collectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)
-        if var cell = collectionViewCell as? Cell {
-            cell.raiser = self.content
-            self.content.callbacks.onCellSetupBlock?(self.content.items[(indexPath as NSIndexPath).row], cell)
+    open func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+        let cell = collectionView.cellForItem(at: indexPath) as! Cell
+        self.content.actions.onSelect?(self.content, self.content.items[indexPath.row], cell)
+        if self.content.configuration.autoDeselect {
+            self.collectionView.deselectItem(at: indexPath, animated: true)
         }
-        return collectionViewCell
     }
     
     open func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
         let cell = collectionView.cellForItem(at: indexPath) as! Cell
-        self.content.actions.onDeselect?(self.content, self.content.items[(indexPath as NSIndexPath).row], cell)
-        if self.content.configuration.autoDeselect {
-            self.collectionView.deselectItem(at: indexPath, animated: true)
-        }
+        self.content.actions.onDeselect?(self.content, self.content.items[indexPath.row], cell)
     }
     
     // UICollectionView data

    }
    
    open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let collectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: Cell.identifier, for: indexPath)
        if var cell = collectionViewCell as? Cell {
            cell.raiser = self.content
            self.content.callbacks.onCellSetupBlock?(self.content.items[(indexPath as NSIndexPath).row], cell)
        }
        return collectionViewCell
    }

    // CollectionView float layout
    
    open func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        if let size = self.content.callbacks.onLayout?(self.content, self.content.items[indexPath.row]) {
            return size
        }
//        print(#file + " You didn't specify size block. Use on(:layout) chain.")
