             output += "\n\n"
             output += "extension UICollectionView {\n"
             output += "\n\n"
-            output += "    func dequeueReusableCell<T: ReusableViewProtocol>(reusable: T, forIndexPath: NSIndexPath!) -> UICollectionViewCell? {\n"
-            output += "        if let identifier = reusable.storyboardIdentifier {\n"
-            output += "            return dequeueReusableCellWithReuseIdentifier(identifier, forIndexPath: forIndexPath)\n"
+            output += "    func dequeueReusableCell<T: ReusableViewProtocol>(reusable: T, for: IndexPath) -> UICollectionViewCell? {\n"
+            output += "        if let identifier = reusable.storyboardIdentifier {\n"
+            output += "            return dequeueReusableCell(withReuseIdentifier: identifier, for: `for`)\n"
             output += "        }\n"
             output += "        return nil\n"
             output += "    }\n"
             output += "\n\n"
             output += "    func registerReusableCell<T: ReusableViewProtocol>(reusable: T) {\n"
-            output += "        if let type = reusable.viewType, identifier = reusable.storyboardIdentifier {\n"
-            output += "            registerClass(type, forCellWithReuseIdentifier: identifier)\n"
-            output += "        }\n"
-            output += "    }\n"
-            output += "\n\n"
-            output += "    func dequeueReusableSupplementaryViewOfKind<T: ReusableViewProtocol>(elementKind: String, withReusable reusable: T, forIndexPath: NSIndexPath!) -> UICollectionReusableView? {\n"
-            output += "        if let identifier = reusable.storyboardIdentifier {\n"
-            output += "            return dequeueReusableSupplementaryViewOfKind(elementKind, withReuseIdentifier: identifier, forIndexPath: forIndexPath)\n"
+            output += "        if let type = reusable.viewType, let identifier = reusable.storyboardIdentifier {\n"
+            output += "            register(type, forCellWithReuseIdentifier: identifier)\n"
+            output += "        }\n"
+            output += "    }\n"
+            output += "\n\n"
+            output += "    func dequeueReusableSupplementaryViewOfKind<T: ReusableViewProtocol>(elementKind: String, withReusable reusable: T, for: IndexPath!) -> UICollectionReusableView? {\n"
+            output += "        if let identifier = reusable.storyboardIdentifier {\n"
+            output += "            return dequeueReusableSupplementaryView(ofKind: elementKind, withReuseIdentifier: identifier, for: `for`)\n"
             output += "        }\n"
             output += "        return nil\n"
             output += "    }\n"
             output += "\n\n"
             output += "    func registerReusable<T: ReusableViewProtocol>(reusable: T, forSupplementaryViewOfKind elementKind: String) {\n"
-            output += "        if let type = reusable.viewType, identifier = reusable.storyboardIdentifier {\n"
-            output += "            registerClass(type, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: identifier)\n"
+            output += "        if let type = reusable.viewType, let identifier = reusable.storyboardIdentifier {\n"
+            output += "            register(type, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: identifier)\n"
             output += "        }\n"
             output += "    }\n"
             output += "}\n"

            output += "\n\n"
            output += "extension UITableView {\n"
            output += "\n\n"
            output += "    func dequeueReusableCell<T: ReusableViewProtocol>(reusable: T, forIndexPath: NSIndexPath!) -> UITableViewCell? {\n"
            output += "        if let identifier = reusable.storyboardIdentifier {\n"
            output += "            return dequeueReusableCellWithIdentifier(identifier, forIndexPath: forIndexPath)\n"
            output += "        }\n"
            output += "        return nil\n"
            output += "    }\n"
            output += "\n\n"
            output += "    func registerReusableCell<T: ReusableViewProtocol>(reusable: T) {\n"
            output += "        if let type = reusable.viewType, identifier = reusable.storyboardIdentifier {\n"
            output += "            registerClass(type, forCellReuseIdentifier: identifier)\n"
            output += "        }\n"
            output += "    }\n"
            output += "\n\n"
            output += "    func dequeueReusableHeaderFooter<T: ReusableViewProtocol>(reusable: T) -> UITableViewHeaderFooterView? {\n"
            output += "        if let identifier = reusable.storyboardIdentifier {\n"
            output += "            return dequeueReusableHeaderFooterViewWithIdentifier(identifier)\n"
            output += "        }\n"
            output += "        return nil\n"
            output += "    }\n"
            output += "\n\n"
            output += "    func registerReusableHeaderFooter<T: ReusableViewProtocol>(reusable: T) {\n"
            output += "        if let type = reusable.viewType, identifier = reusable.storyboardIdentifier {\n"
            output += "             registerClass(type, forHeaderFooterViewReuseIdentifier: identifier)\n"
            output += "        }\n"
            output += "    }\n"
            output += "}\n"

            output += "    func instantiateViewController<T: \(returnType) where T: IdentifiableProtocol>(type: T.Type) -> T? {\n"
            output += "        let instance = type.init()\n"
            output += "        if let identifier = instance.storyboardIdentifier {\n"
            output += "            return self.instantiate\(signatureType)(withIdentifier: identifier) as? T\n"
            output += "        }\n"
            output += "        return nil\n"
            output += "    }\n"
