 
         let possibleCameraInput: AnyObject?
         do {
-            possibleCameraInput = try AVCaptureDeviceInput(device: backCameraDevice)
+            possibleCameraInput = try AVCaptureDeviceInput(device: backCameraDevice!)
         } catch let error1 as NSError {
             error = error1
             possibleCameraInput = nil
         }
         let backCameraInput = possibleCameraInput as? AVCaptureDeviceInput
-        if captureSession.canAddInput(backCameraInput) {
-            captureSession.addInput(backCameraInput)
+        if captureSession.canAddInput(backCameraInput!) {
+            captureSession.addInput(backCameraInput!)
         }
 
         stillImageOutput = AVCaptureStillImageOutput()
-        if captureSession.canAddOutput(stillImageOutput) {
+        if captureSession.canAddOutput(stillImageOutput!) {
             stillImageOutput?.isHighResolutionStillImageOutputEnabled = true;
             stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG];
-            captureSession.addOutput(stillImageOutput)
-        }
-        captureSession.sessionPreset = AVCaptureSessionPresetPhoto
+            captureSession.addOutput(stillImageOutput!)
+        }
+        captureSession.sessionPreset = AVCaptureSession.Preset.photo
         setFlashModeToAuto(backCameraDevice!)
         beginSession()
     }

        if(canTakePhoto){
            HappieCameraJSON.incrementProcessingCount();
            canTakePhoto = false;
            let connection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo)

            stillImageOutput?.captureStillImageAsynchronously(from: connection) { imageBuffer, error in
                if((imageBuffer) != nil){
                    let imageData: Data = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageBuffer)
                    let UIImageFromData = UIImage(data: imageData)

                    var  orient = UIImageOrientation.right;

                try device.lockForConfiguration();

                if(flashState == 0){
                    if(backCameraDevice!.isFlashModeSupported(AVCaptureDevice.FlashMode.off)){
                        device.flashMode = AVCaptureDevice.FlashMode.off;
                        let image = UIImage(named: "camera_flash_off.png") as UIImage!
                        flashUIButton.setImage(image, for: UIControlState())
                    }
                    if(backCameraDevice!.isTorchModeSupported(AVCaptureDevice.TorchMode.off)){
                        device.torchMode = AVCaptureDevice.TorchMode.off;
                    }
                    flashState = 1;
                }

                else if(flashState == 1){
                    if(backCameraDevice!.isFlashModeSupported(AVCaptureDevice.FlashMode.auto)){
                        device.flashMode = AVCaptureDevice.FlashMode.auto;
                        let image = UIImage(named: "camera_flash_auto.png") as UIImage!
                        flashUIButton.setImage(image, for: UIControlState())
                    }
                    if(backCameraDevice!.isTorchModeSupported(AVCaptureDevice.TorchMode.off)){
                        device.torchMode = AVCaptureDevice.TorchMode.off;
                    }
                    flashState = 2
                }
                else if(flashState == 2){
                    if(backCameraDevice!.isFlashModeSupported(AVCaptureDevice.FlashMode.off)){
                        device.flashMode = AVCaptureDevice.FlashMode.off;
                        let image = UIImage(named: "camera_flash_on.png") as UIImage!
                        flashUIButton.setImage(image, for: UIControlState())
                    }
                    if(backCameraDevice!.isTorchModeSupported(AVCaptureDevice.TorchMode.on)){
                        device.torchMode = AVCaptureDevice.TorchMode.on;
                    }

                    flashState = 0;
