       newCellSnapshotView.frame = CGRect(x: 0, y: imageViewOriginY, width: cellFrame.width, height: cellFrame.height)
       newCellWrapperView.clipsToBounds = true
       newCellWrapperView.frame = CGRect(x: minX, y: wrapperViewOriginY, width: 0, height: 0)
+      
+      newCellWrapperView.tag = AnimationItem.newCellWrapper.tag
+      newCellSnapshotView.tag = AnimationItem.newCell.tag
     }
     
     // MARK: Snapshot of right side of collectionView
     if let path = paths[safe: 1], let cell = collectionView.cellForItem(at: path) {
-      self.newRightSideLayer?.removeFromSuperlayer()
       UIGraphicsBeginImageContextWithOptions(cell.bounds.size, true, 0)
       if let context = UIGraphicsGetCurrentContext() {
         cell.layer.render(in: context)
       }
       newRightSideSnapshotView.image = UIGraphicsGetImageFromCurrentImageContext()
       UIGraphicsEndImageContext()
-      collectionView.addSubview(newRightSideSnapshotView)
-      newRightSideSnapshotView.frame = CGRect(x: bounds.maxX, y: 0, width: cell.bounds.width, height: cell.bounds.height)
-      self.newRightSideSnapshot = newRightSideSnapshotView
+      addSubview(newRightSideSnapshotView)
+      newRightSideSnapshotView.frame = CGRect(x: bounds.maxX, y: cellFrame.minY, width: cell.bounds.width, height: cell.bounds.height)
+      newRightSideSnapshotView.tag = AnimationItem.newRightSide.tag
     }
     
     collectionView.visibleCells.forEach { $0.alpha = 0 }

      cell.alpha = 1
    }
    guard animationInProcess else { return }
    
    if let anilayer = getAnilayer(of: AnimationItem.oldRightSide, at: lastExpandedItemIndex) {
      anilayer.layer.removeFromSuperlayer()
    }
    
    if let layer = self.newRightSideLayer {
      layer.removeFromSuperlayer()
      self.newRightSideLayer = nil
    }
  }
  

    oldCellLayer.anchorPoint = up ? CGPoint(x: 0, y: 0) : CGPoint(x: 0, y: 1)
    oldCellLayer.position = up ? CGPoint(x: minX, y: cellFrame.minY) : CGPoint(x: minX, y: cellFrame.maxY)
    let oldCellNewBoundsValue = AnimationValue.bounds(oldCellNewBounds)
    animate(oldCellSnapshotView, newValue: oldCellNewBoundsValue, item: .oldCell, delay: delay, index: index)
    
    // MARK: Animate old right cell off-screen
    let oldRightSideLayer = oldRightSideSnapshotView.layer
    oldRightSideLayer.anchorPoint = .zero
    oldRightSideLayer.position = CGPoint(x: cellFrame.maxX + space, y: cellFrame.minY)
    let oldRightSideNewPosition = CGPoint(x: bounds.width, y: cellFrame.minY)
    let oldRightSideNewValue = AnimationValue.position(oldRightSideNewPosition)
    animate(oldRightSideSnapshotView, newValue: oldRightSideNewValue, item: .oldRightSide, index: index)
    
    // MARK: Animate buttons
    UIView.animate(withDuration: duration, delay: duration/5, options: .curveEaseInOut, animations: {
      up ? self.animateBottomButtons() : self.animateTopButtons()
    }, completion: nil)
    
