         }
     }
     
-    private lazy var assetFetchOptions: PHFetchOptions = {
-        let assetFetchOptions = PHFetchOptions()
-        return assetFetchOptions
-    }()
-  
     @objc open func makeRootVC() -> DKAssetGroupDetailVC {
       return DKAssetGroupDetailVC()
     }
     
-    private func createAssetFetchOptions() -> PHFetchOptions? {
+    private func updateCancelButtonForVC(_ vc: UIViewController) {
+        if self.showsCancelButton {
+            self.UIDelegate.imagePickerController(self, showsCancelButtonForVC: vc)
+        } else {
+            self.UIDelegate.imagePickerController(self, hidesCancelButtonForVC: vc)
+        }
+    }
+    
+    private func createAssetFetchOptions() -> PHFetchOptions {
         let createImagePredicate = { () -> NSPredicate in
-            var imagePredicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue)
-            if let imageFetchPredicate = self.imageFetchPredicate {
-                imagePredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [imagePredicate, imageFetchPredicate])
-            }
+            let imagePredicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.image.rawValue)
             
             return imagePredicate
         }
         
         let createVideoPredicate = { () -> NSPredicate in
-            var videoPredicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.video.rawValue)
-            if let videoFetchPredicate = self.videoFetchPredicate {
-                videoPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [videoPredicate, videoFetchPredicate])
-            }
+            let videoPredicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.video.rawValue)
             
             return videoPredicate
         }

        }
    }
    
    // MARK: - Selection
    
    @objc public func selectImage(atIndexPath index: IndexPath) {
        if let rootVC = self.viewControllers.first as? DKAssetGroupDetailVC {
            rootVC.selectAsset(atIndex: index)
            rootVC.collectionView?.reloadData()
        }
    }
    
    @objc public func deselectAssetAtIndex(_ index: Int) {
        let asset = self.selectedAssets[index]
        self.deselectAsset(asset)
    }
    
    @objc public func deselectAsset(_ asset: DKAsset) {
        self.deselectImage(asset)
        if let rootVC = self.viewControllers.first as? DKAssetGroupDetailVC {
            rootVC.collectionView?.reloadData()
        }
    }
    
    @objc public func deselectAllAssets() {
        if self.selectedAssets.count > 0 {
            let assets = self.selectedAssets
            self.selectedAssets.removeAll()
            self.triggerSelectedChanged()
            self.UIDelegate.imagePickerController(self, didDeselectAssets: assets)
            if let rootVC = self.viewControllers.first as? DKAssetGroupDetailVC {
                rootVC.collectionView?.reloadData()
            }
        }
    }
    
    internal func selectImage(_ asset: DKAsset) {
        if self.singleSelect {
            self.deselectAllAssets()
            self.selectedAssets.append(asset)
            if self.sourceType == .camera || autoCloseOnSingleSelect {
                self.done()
            } else {
                self.UIDelegate.imagePickerController(self, didSelectAssets: [asset])
            }
        } else {
            self.selectedAssets.append(asset)
            if self.sourceType == .camera {
                self.done()
            } else {
                self.UIDelegate.imagePickerController(self, didSelectAssets: [asset])
                self.triggerSelectedChanged()
            }
        }
    }
    
    internal func deselectImage(_ asset: DKAsset) {
        self.selectedAssets.remove(at: selectedAssets.index(of: asset)!)
        self.UIDelegate.imagePickerController(self, didDeselectAssets: [asset])
        self.triggerSelectedChanged()
    }
    
    internal func triggerSelectedChanged() {
        if let selectedChanged = self.selectedChanged {
            selectedChanged()
        }
    }
    
    // MARK: - Handles Orientation
    
    open override var shouldAutorotate : Bool {
        return self.allowsLandscape && self.sourceType != .camera ? true : false
    }
    
    open override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
        if self.allowsLandscape {
            return super.supportedInterfaceOrientations
        } else {

        }
    }
    
    @objc open func saveImageToAlbum(_ image: UIImage, _ completeBlock: @escaping ((_ asset: DKAsset) -> Void)) {
        var newImageIdentifier: String!
        
        PHPhotoLibrary.shared().performChanges({
