		@Override
		protected Task<Void> createTask() {
			return new Task<>() {

				@Override
				protected Void call() throws Exception {

					Platform.runLater(() -> {

						// == title
						title.textProperty().bind(media.titleProperty());

						// == duration
						duration.setText(media.durationEditedProperty().get());

						// == stars
						stars.textProperty().bind(media.starsProperty().asString());

						// == drive
						drive.setText(media.getDrive());

						// == type
						type.setText(media.getFileType());

						// == size
						size.setText(media.fileSizeProperty().get());

					});

					// Try to get other information
					try {
						File file = new File(media.getFilePath());

						// ---------------------MP3--------------------------------------
						if ("mp3".equals(media.fileTypeProperty().get()) && file.exists() && file.length() != 0) {
							MP3AudioHeader mp3Header = new MP3File(file).getMP3AudioHeader();

							_sampleRate = mp3Header.getSampleRate();
							_bitRate = Long.toString(mp3Header.getBitRateAsNumber());
							_encoder = mp3Header.getEncoder();
							_Channel = mp3Header.getChannels();
							_format = mp3Header.getFormat();

							_mpegVersion = mp3Header.getMpegVersion();
							_mpegLayer = mp3Header.getMpegLayer();
							_totalFrames = Long.toString(mp3Header.getNumberOfFrames());
							_noOfSamples = Long.toString(mp3Header.getNoOfSamples());
							_mp3StartByte = Long.toString(mp3Header.getMp3StartByte());
							_empasis = mp3Header.isVariableBitRate() ? "yes" : "no";
							_isVariableBitRate = mp3Header.getEmphasis();
							_isOriginal = mp3Header.isOriginal() ? "yes" : "no";
							_isCopyrighted = mp3Header.isCopyrighted() ? "yes" : "no";
							_isPadding = mp3Header.isPadding() ? "yes" : "no";
							_isProtected = mp3Header.isProtected() ? "yes" : "no";
							_isPrivate = mp3Header.isPrivate() ? "yes" : "no";

							// Run it on JavaFX Thread
							Platform.runLater(() -> {
								sampleRate.setText(_sampleRate);
								bitRate.setText(_bitRate);
								encoder.setText(_encoder);
								channel.setText(_Channel);
								format.setText(_format);

								mpegVersion.setText(_mpegVersion);
								mpegLayer.setText(_mpegLayer);
								totalFrames.setText(_totalFrames);
								noOfSamples.setText(_noOfSamples);
								mp3StartByte.setText(_mp3StartByte);
								empasis.setText(_empasis);
								isVariableBitRate.setText(_isVariableBitRate);
								isOriginal.setText(_isOriginal);
								isCopyrighted.setText(_isCopyrighted);
								isPadding.setText(_isPadding);
								isProtected.setText(_isProtected);
								isPrivate.setText(_isPrivate);
							});

							// ------------------------OTHER FORMAT-------------------------
						} else {

							// Run it on JavaFX Thread
							Platform.runLater(() -> {
								sampleRate.setText("-");
								bitRate.setText("-");
								encoder.setText("-");
								channel.setText("-");
								format.setText("-");

								mpegVersion.setText("-");
								mpegLayer.setText("-");
								totalFrames.setText("-");
								noOfSamples.setText("-");
								mp3StartByte.setText("-");
								empasis.setText("-");
								isVariableBitRate.setText("-");
								isOriginal.setText("-");
								isCopyrighted.setText("-");
								isPadding.setText("-");
								isProtected.setText("-");
								isPrivate.setText("-");
							});
						}
					} catch (IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException
							| CannotReadException ex) {
						// ex.printStackTrace()
					}

					return null;
				}
			};
		}

		@Override
		protected Task<Void> createTask() {
			return new Task<Void>() {

				@Override
				protected Void call() throws Exception {

					Platform.runLater(() -> {

						// == title
						title.textProperty().bind(media.titleProperty());

						// == duration
						duration.setText(media.durationEditedProperty().get());

						// == stars
						stars.textProperty().bind(media.starsProperty().asString());

						// == drive
						drive.setText(media.getDrive());

						// == type
						type.setText(media.getFileType());

						// == size
						size.setText(media.fileSizeProperty().get());

					});

					// Try to get other information
					try {
						File file = new File(media.getFilePath());

						// ---------------------MP3--------------------------------------
						if ("mp3".equals(media.fileTypeProperty().get()) && file.exists() && file.length() != 0) {
							MP3AudioHeader mp3Header = new MP3File(file).getMP3AudioHeader();

							_sampleRate = mp3Header.getSampleRate();
							_bitRate = Long.toString(mp3Header.getBitRateAsNumber());
							_encoder = mp3Header.getEncoder();
							_Channel = mp3Header.getChannels();
							_format = mp3Header.getFormat();

							_mpegVersion = mp3Header.getMpegVersion();
							_mpegLayer = mp3Header.getMpegLayer();
							_totalFrames = Long.toString(mp3Header.getNumberOfFrames());
							_noOfSamples = Long.toString(mp3Header.getNoOfSamples());
							_mp3StartByte = Long.toString(mp3Header.getMp3StartByte());
							_empasis = mp3Header.isVariableBitRate() ? "yes" : "no";
							_isVariableBitRate = mp3Header.getEmphasis();
							_isOriginal = mp3Header.isOriginal() ? "yes" : "no";
							_isCopyrighted = mp3Header.isCopyrighted() ? "yes" : "no";
							_isPadding = mp3Header.isPadding() ? "yes" : "no";
							_isProtected = mp3Header.isProtected() ? "yes" : "no";
							_isPrivate = mp3Header.isPrivate() ? "yes" : "no";

							// Run it on JavaFX Thread
							Platform.runLater(() -> {
								sampleRate.setText(_sampleRate);
								bitRate.setText(_bitRate);
								encoder.setText(_encoder);
								channel.setText(_Channel);
								format.setText(_format);

								mpegVersion.setText(_mpegVersion);
								mpegLayer.setText(_mpegLayer);
								totalFrames.setText(_totalFrames);
								noOfSamples.setText(_noOfSamples);
								mp3StartByte.setText(_mp3StartByte);
								empasis.setText(_empasis);
								isVariableBitRate.setText(_isVariableBitRate);
								isOriginal.setText(_isOriginal);
								isCopyrighted.setText(_isCopyrighted);
								isPadding.setText(_isPadding);
								isProtected.setText(_isProtected);
								isPrivate.setText(_isPrivate);
							});

							// ------------------------OTHER FORMAT-------------------------
						} else {

							// Run it on JavaFX Thread
							Platform.runLater(() -> {
								sampleRate.setText("-");
								bitRate.setText("-");
								encoder.setText("-");
								channel.setText("-");
								format.setText("-");

								mpegVersion.setText("-");
								mpegLayer.setText("-");
								totalFrames.setText("-");
								noOfSamples.setText("-");
								mp3StartByte.setText("-");
								empasis.setText("-");
								isVariableBitRate.setText("-");
								isOriginal.setText("-");
								isCopyrighted.setText("-");
								isPadding.setText("-");
								isProtected.setText("-");
								isPrivate.setText("-");
							});
						}
					} catch (IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException
							| CannotReadException ex) {
						// ex.printStackTrace()
					}

					return null;
				}
			};
		}

Replace Generic With Diamond Task<Void> with Task<> in method protected createTask() : Task<Void> from class com.goxr3plus.xr3player.controllers.tagging.MP3BasicInfo.UpdateInformationService


	/**
	 * Called as soon as .fxml is initialized
	 */
	@FXML
	private void initialize() {

		// dragAndDropLabel
		dragAndDropLabel.setVisible(false);
		dragAndDropLabel.setOnDragOver(event -> event.acceptTransferModes(TransferMode.LINK));
		dragAndDropLabel.setOnDragDropped(event -> {
			// File?
			for (File file : event.getDragboard().getFiles()) {

				// No directories allowed
				if (!file.isDirectory()) {

					// Get it
					FileTypeAndAbsolutePath ftaap = IOInfo.getRealPathFromFile(file.getAbsolutePath());

					// Check if File exists
					if (!new File(ftaap.getFileAbsolutePath()).exists()) {
						AlertTool.showNotification("File doesn't exist",
								(ftaap.getFileType() == FileLinkType.SYMBOLIC_LINK ? "Symbolic link" : "Windows Shortcut")
										+ " points to a file that doesn't exists anymore.",
								Duration.millis(2000), NotificationType.INFORMATION);
						return;
					}

					openAudio(file.getAbsolutePath(), TagTabCategory.BASICINFO, true);

					// break
					break;
				}
			}

			event.consume();

		});
		dragAndDropLabel.setOnDragExited(event -> {
			dragAndDropLabel.setVisible(false);
			event.consume();
		});

		// basicInfoTab
		basicInfoTab.setContent(mp3BasicInfo);

		// artWorkTab
		artWorkTab.setContent(artWork);

		// ImageView
		artWork.getImageView().fitWidthProperty().bind(window.widthProperty().subtract(20));
		artWork.getImageView().fitHeightProperty().bind(window.heightProperty().subtract(145));

		// id3v1Tab
		id3v1Tab.setContent(id3V1Controller);

		// id3v2Tab
		id3v2Tab.setContent(id3V2Controller);

		// listView
		// listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE)
		listView.setCellFactory(lv -> new ListCell<>() {
			@Override
			public void updateItem(String item, boolean empty) {
				super.updateItem(item, empty);
				if (empty) {
					setText(null);
				} else {
					setText(IOInfo.getFileName(item));
					setTooltip(new Tooltip(item));
				}
			}
		});
		listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
			if (newValue != null)
				openAudio(newValue, TagTabCategory.CURRENT, false);
		});

		// Drag Implementation
		listView.setOnDragDetected(event -> {

			if (!listView.getSelectionModel().getSelectedItems().isEmpty()) {

				// Allow this transfer Mode
				Dragboard board = startDragAndDrop(TransferMode.LINK);

				// Put a String on DragBoard
				ClipboardContent content = new ClipboardContent();
				content.putFiles(listView.getSelectionModel().getSelectedItems().stream().map(item -> new File(item))
						.collect(Collectors.toList()));

				board.setContent(content);
				event.consume();
			}
		});

		// previous
		previous.setOnAction(a -> {
			// listView.getSelectionModel().clearSelection()

			// Rotation on list if you finish start
			if (listView.getSelectionModel().getSelectedIndex() != 0)
				listView.getSelectionModel().selectPrevious();
			else
				listView.getSelectionModel().selectLast();
		});

		// next
		next.setOnAction(a -> {
			// listView.getSelectionModel().clearSelection()

			// Rotation on list if you finish start
			if (listView.getSelectionModel().getSelectedIndex() != listView.getItems().size() - 1)
				listView.getSelectionModel().selectNext();
			else
				listView.getSelectionModel().selectFirst();
		});

		// TabPane
		tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
			if (newValue == id3v1Tab)
				id3V1Controller.populateTagFields(listView.getSelectionModel().getSelectedItem());
			else if (newValue == id3v2Tab)
				id3V2Controller.populateTagFields(listView.getSelectionModel().getSelectedItem());

		});

		// closeButton
		closeButton.setOnAction(a -> close());

	}

	/**
	 * Called as soon as .fxml is initialized
	 */
	@FXML
	private void initialize() {

		// dragAndDropLabel
		dragAndDropLabel.setVisible(false);
		dragAndDropLabel.setOnDragOver(event -> event.acceptTransferModes(TransferMode.LINK));
		dragAndDropLabel.setOnDragDropped(event -> {
			// File?
			for (File file : event.getDragboard().getFiles()) {

				// No directories allowed
				if (!file.isDirectory()) {

					// Get it
					FileTypeAndAbsolutePath ftaap = IOInfo.getRealPathFromFile(file.getAbsolutePath());

					// Check if File exists
					if (!new File(ftaap.getFileAbsolutePath()).exists()) {
						AlertTool.showNotification("File doesn't exist",
								(ftaap.getFileType() == FileLinkType.SYMBOLIC_LINK ? "Symbolic link" : "Windows Shortcut")
										+ " points to a file that doesn't exists anymore.",
								Duration.millis(2000), NotificationType.INFORMATION);
						return;
					}

					openAudio(file.getAbsolutePath(), TagTabCategory.BASICINFO, true);

					// break
					break;
				}
			}

			event.consume();

		});
		dragAndDropLabel.setOnDragExited(event -> {
			dragAndDropLabel.setVisible(false);
			event.consume();
		});

		// basicInfoTab
		basicInfoTab.setContent(mp3BasicInfo);

		// artWorkTab
		artWorkTab.setContent(artWork);

		// ImageView
		artWork.getImageView().fitWidthProperty().bind(window.widthProperty().subtract(20));
		artWork.getImageView().fitHeightProperty().bind(window.heightProperty().subtract(145));

		// id3v1Tab
		id3v1Tab.setContent(id3V1Controller);

		// id3v2Tab
		id3v2Tab.setContent(id3V2Controller);

		// listView
		// listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE)
		listView.setCellFactory(lv -> new ListCell<String>() {
			@Override
			public void updateItem(String item, boolean empty) {
				super.updateItem(item, empty);
				if (empty) {
					setText(null);
				} else {
					setText(IOInfo.getFileName(item));
					setTooltip(new Tooltip(item));
				}
			}
		});
		listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
			if (newValue != null)
				openAudio(newValue, TagTabCategory.CURRENT, false);
		});

		// Drag Implementation
		listView.setOnDragDetected(event -> {

			if (!listView.getSelectionModel().getSelectedItems().isEmpty()) {

				// Allow this transfer Mode
				Dragboard board = startDragAndDrop(TransferMode.LINK);

				// Put a String on DragBoard
				ClipboardContent content = new ClipboardContent();
				content.putFiles(listView.getSelectionModel().getSelectedItems().stream().map(item -> new File(item))
						.collect(Collectors.toList()));

				board.setContent(content);
				event.consume();
			}
		});

		// previous
		previous.setOnAction(a -> {
			// listView.getSelectionModel().clearSelection()

			// Rotation on list if you finish start
			if (listView.getSelectionModel().getSelectedIndex() != 0)
				listView.getSelectionModel().selectPrevious();
			else
				listView.getSelectionModel().selectLast();
		});

		// next
		next.setOnAction(a -> {
			// listView.getSelectionModel().clearSelection()

			// Rotation on list if you finish start
			if (listView.getSelectionModel().getSelectedIndex() != listView.getItems().size() - 1)
				listView.getSelectionModel().selectNext();
			else
				listView.getSelectionModel().selectFirst();
		});

		// TabPane
		tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
			if (newValue == id3v1Tab)
				id3V1Controller.populateTagFields(listView.getSelectionModel().getSelectedItem());
			else if (newValue == id3v2Tab)
				id3V2Controller.populateTagFields(listView.getSelectionModel().getSelectedItem());

		});

		// closeButton
		closeButton.setOnAction(a -> close());

	}

Replace Generic With Diamond ListCell<String> with ListCell<> in method private initialize() : void from class com.goxr3plus.xr3player.controllers.tagging.TagWindow


		@Override
		protected Task<Void> createTask() {
			return new Task<>() {
				@Override
				protected Void call() throws Exception {
					// int totalSteps = 4

					// -------------------------- Load all the libraries
					// -------------------------------------------------
					try (ResultSet resultSet = getConnection().createStatement()
							.executeQuery("SELECT* FROM LIBRARIES;");
						 ResultSet dbCounter = getConnection().createStatement()
								 .executeQuery("SELECT COUNT(NAME) FROM LIBRARIES;");) {

						totalLibraries = dbCounter.getInt(1);

						// Refresh the text
						Platform.runLater(() -> Main.updateScreen.getLabel()
								.setText("Loading Libraries....[ 0 / " + totalLibraries + " ]"));

						// Kepp a List of all Libraries
						final List<Node> libraries = new ArrayList<>(totalLibraries);
						final int[] counter = {0};

						// Load all the libraries
						while (resultSet.next()) {

							// Create a CountDown Latch
							final CountDownLatch countDown = new CountDownLatch(1);

							// Run on JavaFX Thread
							Platform.runLater(() -> {

								// Add the library to the List of Libraries
								try {
									libraries.add(new Library(resultSet.getString("NAME"),
											resultSet.getString("TABLENAME"), resultSet.getDouble("STARS"),
											resultSet.getString("DATECREATED"), resultSet.getString("TIMECREATED"),
											resultSet.getString("DESCRIPTION"), resultSet.getInt("SAVEMODE"),
											resultSet.getInt("POSITION"), resultSet.getString("LIBRARYIMAGE"),
											resultSet.getBoolean("OPENED")));
								} catch (final SQLException e) {
									e.printStackTrace();
								}

								// Countdown
								countDown.countDown();
							});

							// Await for the CountDown
							countDown.await();

							// Change Label Text
							++counter[0];
							Platform.runLater(() -> Main.updateScreen.getLabel()
									.setText("Loading Libraries... [ " + counter[0] + " / " + totalLibraries + " ]"));

						}

						// Update the Progress
						// updateProgress(1, totalSteps)

						// Run of JavaFX Thread
						Platform.runLater(() -> {

							// Change Label Text
							Main.updateScreen.getLabel().setText("Adding Libraries ...");

							// Add all the Libraries to the Library Viewer
							Main.libraryMode.viewer.addMultipleItems(libraries);

						});

						// Load PlayerMediaList
						Platform.runLater(() -> Main.updateScreen.getLabel().setText("Loading Emotion Lists..."));
						Main.playedSongs.uploadFromDataBase();
						Main.starredMediaList.uploadFromDataBase();
						Main.emotionListsController.hatedMediaList.uploadFromDataBase();
						Main.emotionListsController.dislikedMediaList.uploadFromDataBase();
						Main.emotionListsController.likedMediaList.uploadFromDataBase();
						Main.emotionListsController.lovedMediaList.uploadFromDataBase();

						// -----------------------Load the application
						// settings-------------------------------
						final CountDownLatch countDown1 = new CountDownLatch(1);
						Platform.runLater(() -> {
							// Change label text
							Main.updateScreen.getLabel().setText("Loading Settings...");

							// Load application settings
							ApplicationSettingsLoader.loadApplicationSettings();

							// Change Label Text
							Main.updateScreen.getLabel().setText("Loading Opened Libraries...");

							// Count down
							countDown1.countDown();

						});

						// Wait for the application settings to be loaded
						countDown1.await();

						// Load the Opened Libraries
						Main.libraryMode.loadOpenedLibraries();

						// Run of JavaFX Thread
						Platform.runLater(() -> {

							// Calculate Opened Libraries
							Main.libraryMode.calculateOpenedLibraries();

							// Calculate Empty Libraries
							Main.libraryMode.calculateEmptyLibraries();

						});

						//
						Platform.runLater(() -> {

							// Change Label Text
							Platform.runLater(() -> Main.updateScreen.getLabel().setText("Loading Bindings..."));

							// Update the emotion smart controller
							Main.emotionListsController
									.updateSelectedSmartController(new boolean[]{true, true, true, true});

							// Update the selected smart controller
							((SmartController) Main.emotionsTabPane.getTabPane().getSelectionModel().getSelectedItem()
									.getContent()).getLoadService().startService(false, false, true);

							// Refresh all the XPlayers PlayLists
							Main.xPlayersList.getList().stream()
									.forEach(xPlayerController -> xPlayerController.getxPlayerPlayList()
											.getSmartController().getLoadService().startService(false, false, false));

							// ------Bind Instant Search between all SmartControllers

							// For Search Window
							Main.searchWindowSmartController.getInstantSearch().selectedProperty()
									.bindBidirectional(Main.settingsWindow.getPlayListsSettingsController()
											.getInstantSearch().selectedProperty());

							// For Libraries
							Main.libraryMode.viewer.getItemsObservableList().stream()
									.map(library -> ((Library) library).getSmartController())
									.forEach(controller -> controller.getInstantSearch().selectedProperty()
											.bindBidirectional(Main.settingsWindow.getPlayListsSettingsController()
													.getInstantSearch().selectedProperty()));

							Stream<XPlayerController> cs1;
							cs1 = Main.xPlayersList.getList().stream();
							cs1.forEach(xPlayerController -> xPlayerController.getxPlayerPlayList().getSmartController()
									.getInstantSearch().selectedProperty().bindBidirectional(Main.settingsWindow
											.getPlayListsSettingsController().getInstantSearch().selectedProperty()));

							// Load Saved DropBox Accounts
							Main.dropBoxViewer.refreshSavedAccounts();

							// Resize Main Window
							Main.window.setWidth(Main.window.getWidth() + 1);
							Main.window.setHeight(Main.window.getHeight() + 1);
						});

						// Update the Progress
						// updateProgress(4, 4)

					} catch (final Exception param) {
						Main.logger.log(Level.SEVERE, "", param);
					}

					return null;
				}
			};
		}

		@Override
		protected Task<Void> createTask() {
			return new Task<Void>() {
				@Override
				protected Void call() throws Exception {
					// int totalSteps = 4

					// -------------------------- Load all the libraries
					// -------------------------------------------------
					try (ResultSet resultSet = getConnection().createStatement()
							.executeQuery("SELECT* FROM LIBRARIES;");
							ResultSet dbCounter = getConnection().createStatement()
									.executeQuery("SELECT COUNT(NAME) FROM LIBRARIES;");) {

						totalLibraries = dbCounter.getInt(1);

						// Refresh the text
						Platform.runLater(() -> Main.updateScreen.getLabel()
								.setText("Loading Libraries....[ 0 / " + totalLibraries + " ]"));

						// Kepp a List of all Libraries
						final List<Node> libraries = new ArrayList<>(totalLibraries);
						final int[] counter = { 0 };

						// Load all the libraries
						while (resultSet.next()) {

							// Create a CountDown Latch
							final CountDownLatch countDown = new CountDownLatch(1);

							// Run on JavaFX Thread
							Platform.runLater(() -> {

								// Add the library to the List of Libraries
								try {
									libraries.add(new Library(resultSet.getString("NAME"),
											resultSet.getString("TABLENAME"), resultSet.getDouble("STARS"),
											resultSet.getString("DATECREATED"), resultSet.getString("TIMECREATED"),
											resultSet.getString("DESCRIPTION"), resultSet.getInt("SAVEMODE"),
											resultSet.getInt("POSITION"), resultSet.getString("LIBRARYIMAGE"),
											resultSet.getBoolean("OPENED")));
								} catch (final SQLException e) {
									e.printStackTrace();
								}

								// Countdown
								countDown.countDown();
							});

							// Await for the CountDown
							countDown.await();

							// Change Label Text
							++counter[0];
							Platform.runLater(() -> Main.updateScreen.getLabel()
									.setText("Loading Libraries... [ " + counter[0] + " / " + totalLibraries + " ]"));

						}

						// Update the Progress
						// updateProgress(1, totalSteps)

						// Run of JavaFX Thread
						Platform.runLater(() -> {

							// Change Label Text
							Main.updateScreen.getLabel().setText("Adding Libraries ...");

							// Add all the Libraries to the Library Viewer
							Main.libraryMode.viewer.addMultipleItems(libraries);

						});

						// Load PlayerMediaList
						Platform.runLater(() -> Main.updateScreen.getLabel().setText("Loading Emotion Lists..."));
						Main.playedSongs.uploadFromDataBase();
						Main.starredMediaList.uploadFromDataBase();
						Main.emotionListsController.hatedMediaList.uploadFromDataBase();
						Main.emotionListsController.dislikedMediaList.uploadFromDataBase();
						Main.emotionListsController.likedMediaList.uploadFromDataBase();
						Main.emotionListsController.lovedMediaList.uploadFromDataBase();

						// -----------------------Load the application
						// settings-------------------------------
						final CountDownLatch countDown1 = new CountDownLatch(1);
						Platform.runLater(() -> {
							// Change label text
							Main.updateScreen.getLabel().setText("Loading Settings...");

							// Load application settings
							ApplicationSettingsLoader.loadApplicationSettings();

							// Change Label Text
							Main.updateScreen.getLabel().setText("Loading Opened Libraries...");

							// Count down
							countDown1.countDown();

						});

						// Wait for the application settings to be loaded
						countDown1.await();

						// Load the Opened Libraries
						Main.libraryMode.loadOpenedLibraries();

						// Run of JavaFX Thread
						Platform.runLater(() -> {

							// Calculate Opened Libraries
							Main.libraryMode.calculateOpenedLibraries();

							// Calculate Empty Libraries
							Main.libraryMode.calculateEmptyLibraries();

						});

						//
						Platform.runLater(() -> {

							// Change Label Text
							Platform.runLater(() -> Main.updateScreen.getLabel().setText("Loading Bindings..."));

							// Update the emotion smart controller
							Main.emotionListsController
									.updateSelectedSmartController(new boolean[] { true, true, true, true });

							// Update the selected smart controller
							((SmartController) Main.emotionsTabPane.getTabPane().getSelectionModel().getSelectedItem()
									.getContent()).getLoadService().startService(false, false, true);

							// Refresh all the XPlayers PlayLists
							Main.xPlayersList.getList().stream()
									.forEach(xPlayerController -> xPlayerController.getxPlayerPlayList()
											.getSmartController().getLoadService().startService(false, false, false));

							// ------Bind Instant Search between all SmartControllers

							// For Search Window
							Main.searchWindowSmartController.getInstantSearch().selectedProperty()
									.bindBidirectional(Main.settingsWindow.getPlayListsSettingsController()
											.getInstantSearch().selectedProperty());

							// For Libraries
							Main.libraryMode.viewer.getItemsObservableList().stream()
									.map(library -> ((Library) library).getSmartController())
									.forEach(controller -> controller.getInstantSearch().selectedProperty()
											.bindBidirectional(Main.settingsWindow.getPlayListsSettingsController()
													.getInstantSearch().selectedProperty()));

							Stream<XPlayerController> cs1;
							cs1 = Main.xPlayersList.getList().stream();
							cs1.forEach(xPlayerController -> xPlayerController.getxPlayerPlayList().getSmartController()
									.getInstantSearch().selectedProperty().bindBidirectional(Main.settingsWindow
											.getPlayListsSettingsController().getInstantSearch().selectedProperty()));

							// Load Saved DropBox Accounts
							Main.dropBoxViewer.refreshSavedAccounts();

							// Resize Main Window
							Main.window.setWidth(Main.window.getWidth() + 1);
							Main.window.setHeight(Main.window.getHeight() + 1);
						});

						// Update the Progress
						// updateProgress(4, 4)

					} catch (final Exception param) {
						Main.logger.log(Level.SEVERE, "", param);
					}

					return null;
				}
			};
		}

Replace Generic With Diamond Task<Void> with Task<> in method protected createTask() : Task<Void> from class com.goxr3plus.xr3player.database.DatabaseManager.DataLoader


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {

				// Create a list with all the files and folders of the
				// sourceFolder
				fileList.clear();
				generateFileList(new File(sourceFolder), sourceFolder);
				byte[] buffer = new byte[1024];

				double total = fileList.size(), counter = 0;

				// GO
				try (FileOutputStream fos = new FileOutputStream(zipFile);
					 ZipOutputStream zos = new ZipOutputStream(fos)) {

					// Start
					for (String file : fileList) {

						// Check if service is cancelled
						if (isCancelled())
							break;

						// Refresh the label Text
						Platform.runLater(() -> Main.updateScreen.getLabel().setText("OUT:" + file));

						// Create zipEntry
						zos.putNextEntry(new ZipEntry(file));

						// Create File Input Stream
						try (FileInputStream in = new FileInputStream(sourceFolder + File.separator + file)) {

							// Copy byte by byte
							int len;
							while ((len = in.read(buffer)) > 0)
								zos.write(buffer, 0, len);

						} catch (IOException ex) {
							ex.printStackTrace();
							exception = ex.getMessage();
						}

						// Update Progress
						updateProgress(++counter / total, 1);

					}

					// Close the motherFuckers
					zos.closeEntry();

				} catch (IOException ex) {
					ex.printStackTrace();
					exception = ex.getMessage();
					return false;
				}

				// Delete the zip folder if cancelled
				if (isCancelled())
					new File(zipFile).delete();

				return true;
			}

		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {

				// Create a list with all the files and folders of the
				// sourceFolder
				fileList.clear();
				generateFileList(new File(sourceFolder), sourceFolder);
				byte[] buffer = new byte[1024];

				double total = fileList.size(), counter = 0;

				// GO
				try (FileOutputStream fos = new FileOutputStream(zipFile);
						ZipOutputStream zos = new ZipOutputStream(fos)) {

					// Start
					for (String file : fileList) {

						// Check if service is cancelled
						if (isCancelled())
							break;

						// Refresh the label Text
						Platform.runLater(() -> Main.updateScreen.getLabel().setText("OUT:" + file));

						// Create zipEntry
						zos.putNextEntry(new ZipEntry(file));

						// Create File Input Stream
						try (FileInputStream in = new FileInputStream(sourceFolder + File.separator + file)) {

							// Copy byte by byte
							int len;
							while ((len = in.read(buffer)) > 0)
								zos.write(buffer, 0, len);

						} catch (IOException ex) {
							ex.printStackTrace();
							exception = ex.getMessage();
						}

						// Update Progress
						updateProgress(++counter / total, 1);

					}

					// Close the motherFuckers
					zos.closeEntry();

				} catch (IOException ex) {
					ex.printStackTrace();
					exception = ex.getMessage();
					return false;
				}

				// Delete the zip folder if cancelled
				if (isCancelled())
					new File(zipFile).delete();

				return true;
			}

		};
	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.database.DatabaseExportService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {

				// Previous versions < Update 56 of XR3Player will be broken after this update
				// :( future is future

				// ----------------------Search for the signature
				// file-------------------------------
				try (ZipFile zis = new ZipFile(inputZip)) {

					// signature file
					String signatureFile = DatabaseTool.getDatabaseSignatureFile().getName();
					boolean found = zis.getEntry(signatureFile) != null;

					// Found it?
					if (!found) {
						exception = "Selected folder is not XR3Player database...";
						return false;
					}

				} catch (IOException ex) {
					exception = ex.getMessage();
					Main.logger.log(Level.WARNING, "", ex);
					return false;
				}

				// ----------------------Found the signature file so we can
				// procceeed-------------------------------

				// Close all the connections with database
				if (Main.dbManager != null)
					Main.dbManager.manageConnection(Operation.CLOSE);

				// Delete the previous database
				IOAction.deleteFile(new File(DatabaseTool.getAbsoluteDatabasePathPlain()));

				// ---------------------Move on Importing the
				// Database-----------------------------------------------

				// get the zip file content
				try (ZipInputStream zis = new ZipInputStream(new FileInputStream(inputZip))) {

					// create output directory is not exists
					File folder = new File(outPutFolder);
					if (!folder.exists())
						folder.mkdir();

					// get the zipped file list entry
					ZipEntry ze = zis.getNextEntry();

					// Count entries
					double counter = 0, total = 0;
					try (ZipFile zip = new ZipFile(inputZip)) {
						total = zip.size(); // total entries of the zip file
					} catch (Exception ex) {
						ex.printStackTrace();
					}

					// We don't want division by 0
					if (total == 0)
						total = 1;

					// Start
					for (byte[] buffer = new byte[1024]; ze != null; ) {

						String fileName = ze.getName();
						File newFile = new File(outPutFolder + File.separator + fileName);

						// Refresh the dataLabel text
						Platform.runLater(() -> Main.updateScreen.getLabel().setText("In:" + newFile.getName()));

						// create all non exists folders else you will hit FileNotFoundException for
						// compressed folder
						new File(newFile.getParent()).mkdirs();

						// Create File OutputStream
						try (FileOutputStream fos = new FileOutputStream(newFile)) {

							// Copy byte by byte
							int len;
							while ((len = zis.read(buffer)) > 0)
								fos.write(buffer, 0, len);

						} catch (IOException ex) {
							exception = ex.getMessage();
							Main.logger.log(Level.WARNING, "", ex);
						}

						// Get next entry
						ze = zis.getNextEntry();

						// Update the progress
						updateProgress(++counter / total, 1);
					}

					zis.closeEntry();
					zis.close();

				} catch (IOException ex) {
					exception = ex.getMessage();
					Main.logger.log(Level.WARNING, "", ex);
					return false;
				}

				return true;
			}

		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {

				// Previous versions < Update 56 of XR3Player will be broken after this update
				// :( future is future

				// ----------------------Search for the signature
				// file-------------------------------
				try (ZipFile zis = new ZipFile(inputZip)) {

					// signature file
					String signatureFile = DatabaseTool.getDatabaseSignatureFile().getName();
					boolean found = zis.getEntry(signatureFile) != null;

					// Found it?
					if (!found) {
						exception = "Selected folder is not XR3Player database...";
						return false;
					}

				} catch (IOException ex) {
					exception = ex.getMessage();
					Main.logger.log(Level.WARNING, "", ex);
					return false;
				}

				// ----------------------Found the signature file so we can
				// procceeed-------------------------------

				// Close all the connections with database
				if (Main.dbManager != null)
					Main.dbManager.manageConnection(Operation.CLOSE);

				// Delete the previous database
				IOAction.deleteFile(new File(DatabaseTool.getAbsoluteDatabasePathPlain()));

				// ---------------------Move on Importing the
				// Database-----------------------------------------------

				// get the zip file content
				try (ZipInputStream zis = new ZipInputStream(new FileInputStream(inputZip))) {

					// create output directory is not exists
					File folder = new File(outPutFolder);
					if (!folder.exists())
						folder.mkdir();

					// get the zipped file list entry
					ZipEntry ze = zis.getNextEntry();

					// Count entries
					double counter = 0, total = 0;
					try (ZipFile zip = new ZipFile(inputZip)) {
						total = zip.size(); // total entries of the zip file
					} catch (Exception ex) {
						ex.printStackTrace();
					}

					// We don't want division by 0
					if (total == 0)
						total = 1;

					// Start
					for (byte[] buffer = new byte[1024]; ze != null;) {

						String fileName = ze.getName();
						File newFile = new File(outPutFolder + File.separator + fileName);

						// Refresh the dataLabel text
						Platform.runLater(() -> Main.updateScreen.getLabel().setText("In:" + newFile.getName()));

						// create all non exists folders else you will hit FileNotFoundException for
						// compressed folder
						new File(newFile.getParent()).mkdirs();

						// Create File OutputStream
						try (FileOutputStream fos = new FileOutputStream(newFile)) {

							// Copy byte by byte
							int len;
							while ((len = zis.read(buffer)) > 0)
								fos.write(buffer, 0, len);

						} catch (IOException ex) {
							exception = ex.getMessage();
							Main.logger.log(Level.WARNING, "", ex);
						}

						// Get next entry
						ze = zis.getNextEntry();

						// Update the progress
						updateProgress(++counter / total, 1);
					}

					zis.closeEntry();
					zis.close();

				} catch (IOException ex) {
					exception = ex.getMessage();
					Main.logger.log(Level.WARNING, "", ex);
					return false;
				}

				return true;
			}

		};
	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.database.DatabaseImportService


	@Override
	protected Task<Void> createTask() {
		return new Task<>() {
			@Override
			protected Void call() throws Exception {

				updateMessage("Hold on(Vacuum running)...");

				long bfL = basicFile.length(), jfL;
				// Update Message
				updateMessage("Before:" + IOInfo.getFileSizeEdited(basicFile) + "  After:"
						+ IOInfo.getFileSizeEdited(journalFile));

				// Wait until it is created
				while (!journalFile.exists())
					Thread.sleep(50);

				// creating process...
				while ((jfL = journalFile.length()) < bfL) {

					// Update Message
					updateMessage("Before:" + IOInfo.getFileSizeEdited(basicFile) + "  After:"
							+ IOInfo.getFileSizeEdited(journalFile));

					// Update Progress
					updateProgress(jfL, bfL);

					// Sleep
					Thread.sleep(50);
				}

				// Update Message
				updateMessage("Terminating..");

				// System.out.println("Exited Vacuum Progress Service")
				return null;
			}

		};
	}

	@Override
	protected Task<Void> createTask() {
		return new Task<Void>() {
			@Override
			protected Void call() throws Exception {

				updateMessage("Hold on(Vacuum running)...");

				long bfL = basicFile.length(), jfL;
				// Update Message
				updateMessage("Before:" + IOInfo.getFileSizeEdited(basicFile) + "  After:"
						+ IOInfo.getFileSizeEdited(journalFile));

				// Wait until it is created
				while (!journalFile.exists())
					Thread.sleep(50);

				// creating process...
				while ((jfL = journalFile.length()) < bfL) {

					// Update Message
					updateMessage("Before:" + IOInfo.getFileSizeEdited(basicFile) + "  After:"
							+ IOInfo.getFileSizeEdited(journalFile));

					// Update Progress
					updateProgress(jfL, bfL);

					// Sleep
					Thread.sleep(50);
				}

				// Update Message
				updateMessage("Terminating..");

				// System.out.println("Exited Vacuum Progress Service")
				return null;
			}

		};
	}

Replace Generic With Diamond Task<Void> with Task<> in method protected createTask() : Task<Void> from class com.goxr3plus.xr3player.services.database.VacuumProgressService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {

				final int[] counter = {0};
				final int[] totalSize = {dropBoxViewer.getSavedAccountsArray().size()};

				// Create a multimap
				final Map<String, List<String>> multimap = new HashMap<>();

				// For each item on the list view
				dropBoxViewer.getSavedAccountsArray().forEach(accessToken -> {

					try {

						// Create the Client
						final DbxClientV2 client = new DbxClientV2(config, accessToken);

						// Get informations for the client
						final String email = client.users().getCurrentAccount().getEmail();

						// Add to the map
						multimap.computeIfAbsent(email, k -> new ArrayList<>()).add(accessToken);

					} catch (final InvalidAccessTokenException e) {
						System.err.println(e.getMessage());
					} catch (final DbxException e) {
						e.printStackTrace();
					}

					updateProgress(++counter[0], totalSize[0]);
				});

				// Based on multimap add the values
				multimap.forEach((email, list) -> {

					// Check if list is empty
					if (!list.isEmpty()) {
						// Parent represents the client and it contains the accesstokens as leafs
						final DropboxClientTreeItem parent = produceTreeItem(email + " [ " + list.size() + " ]", "no token",
								email, JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 32));

						// For each element on the list
						list.forEach(accessToken -> parent.getChildren()
								.add(produceTreeItem(InfoTool.getMinString(accessToken, 25, "..."), accessToken, email,
										JavaFXTool.getFontIcon("fas-key", goldColor, 20))));

						// Append to the treeview root item
						dropBoxViewer.getTreeView().getRoot().getChildren().add(parent);

						// DEcide if the parent will be expanded
						if (expandedTreeItems.contains(email))
							parent.setExpanded(true);
					}
				});

				return true;
			}

			/**
			 * Fast method to produce TreeItems without duplicate code
			 *
			 * @param value
			 * @return
			 */
			private DropboxClientTreeItem produceTreeItem(final String value, final String accessToken, final String email,
														  final Node graphic) {
				final DropboxClientTreeItem treeItem = new DropboxClientTreeItem(value, accessToken, email);
				treeItem.setGraphic(graphic);

				return treeItem;
			}

		};

	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {

				final int[] counter = { 0 };
				final int[] totalSize = { dropBoxViewer.getSavedAccountsArray().size() };

				// Create a multimap
				final Map<String, List<String>> multimap = new HashMap<>();

				// For each item on the list view
				dropBoxViewer.getSavedAccountsArray().forEach(accessToken -> {

					try {

						// Create the Client
						final DbxClientV2 client = new DbxClientV2(config, accessToken);

						// Get informations for the client
						final String email = client.users().getCurrentAccount().getEmail();

						// Add to the map
						multimap.computeIfAbsent(email, k -> new ArrayList<>()).add(accessToken);

					} catch (final InvalidAccessTokenException e) {
						System.err.println(e.getMessage());
					} catch (final DbxException e) {
						e.printStackTrace();
					}

					updateProgress(++counter[0], totalSize[0]);
				});

				// Based on multimap add the values
				multimap.forEach((email, list) -> {

					// Check if list is empty
					if (!list.isEmpty()) {
						// Parent represents the client and it contains the accesstokens as leafs
						final DropboxClientTreeItem parent = produceTreeItem(email + " [ " + list.size() + " ]", "no token",
								email, JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 32));

						// For each element on the list
						list.forEach(accessToken -> parent.getChildren()
								.add(produceTreeItem(InfoTool.getMinString(accessToken, 25,"..."), accessToken, email,
										JavaFXTool.getFontIcon("fas-key", goldColor, 20))));

						// Append to the treeview root item
						dropBoxViewer.getTreeView().getRoot().getChildren().add(parent);

						// DEcide if the parent will be expanded
						if (expandedTreeItems.contains(email))
							parent.setExpanded(true);
					}
				});

				return true;
			}

			/**
			 * Fast method to produce TreeItems without duplicate code
			 *
			 * @param value
			 * @return
			 */
			private DropboxClientTreeItem produceTreeItem(final String value, final String accessToken, final String email,
					final Node graphic) {
				final DropboxClientTreeItem treeItem = new DropboxClientTreeItem(value, accessToken, email);
				treeItem.setGraphic(graphic);

				return treeItem;
			}

		};

	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.dropbox.AccountsService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {

				try {

					// Create the Client
					client = new DbxClientV2(config, dropBoxViewer.getAccessToken());

					// Try to download the File
					downloadFile(client, dropboxFile, localFileAbsolutePath);

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Download completed",
							"Completed downloading " + (!dropboxFile.isDirectory() ? "File" : FOLDER) + " :\n[ "
									+ dropboxFile.getMetadata().getName() + " ]",
							Duration.millis(3000), NotificationType.SIMPLE,
							JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 64)));

					// Update the progress
					updateProgress(1, 1);

					return true;
				} catch (final Exception ex) {
					ex.printStackTrace();

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Download Failed",
							"Failed to download " + (!dropboxFile.isDirectory() ? "File" : FOLDER) + ":\n[ "
									+ dropboxFile.getMetadata().getName() + " ]",
							Duration.millis(3000), NotificationType.ERROR));

					return false;
				}
			}

			/**
			 * Download Dropbox File to Local Computer
			 *
			 * @param client                Current connected client
			 * @param dropboxFile           The file path on the Dropbox cloud server ->
			 *                              [/foldername/something.txt] or a Folder [/fuck]
			 * @param localFileAbsolutePath The absolute file path of the File on the Local
			 *                              File System
			 * @throws DbxException
			 * @throws DownloadErrorException
			 * @throws IOException
			 */
			public void downloadFile(final DbxClientV2 client, final DropboxFile dropboxFile,
									 final String localFileAbsolutePath) throws DownloadErrorException, DbxException, IOException {
				final String dropBoxFilePath = dropboxFile.getMetadata().getPathLower();

				// Simple File
				if (!dropboxFile.isDirectory()) {
					// Create DbxDownloader
					downloadFile = client.files().download(dropBoxFilePath);
					try (// FileOutputStream
						 FileOutputStream fOut = new FileOutputStream(localFileAbsolutePath);
						 // ProgressOutPutStream
						 ProgressOutputStream output = new ProgressOutputStream(fOut,
								 downloadFile.getResult().getSize(), (long completed, long totalSize) -> {
							 // System.out.println( ( completed * 100 ) / totalSize + " %")

							 updateProgress((completed * 100), totalSize);
						 })) {

						// FileOutputStream
						System.out.println("Downloading .... " + dropBoxFilePath);

						// Add a progress Listener
						downloadFile.download(output);

						// Fast way...
						// client.files().downloadBuilder(file).download(new
						// FileOutputStream("downloads/" + md.getName()))
						// DbxRawClientV2 rawClient = new
						// DbxRawClientV2(config,dropBoxViewer.getAccessToken())
						// DbxUserFilesRequests r = new DbxUserFilesRequests(client)
					} catch (final Exception ex) {
						ex.printStackTrace();
					}
					// Directory
				} else {
					// Create DbxDownloader
					downloadFolder = client.files().downloadZip(dropBoxFilePath);
					try (
							// FileOutputStream
							FileOutputStream fOut = new FileOutputStream(localFileAbsolutePath)) {

						// FileOutputStream
						System.out.println("Downloading .... " + dropBoxFilePath);

						// Add a progress Listener
						downloadFolder.download(fOut);
					} catch (final Exception ex) {
						ex.printStackTrace();
					}
				}
			}

		};

	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {

				try {

					// Create the Client
					client = new DbxClientV2(config, dropBoxViewer.getAccessToken());

					// Try to download the File
					downloadFile(client, dropboxFile, localFileAbsolutePath);

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Download completed",
							"Completed downloading " + (!dropboxFile.isDirectory() ? "File" : FOLDER) + " :\n[ "
									+ dropboxFile.getMetadata().getName() + " ]",
							Duration.millis(3000), NotificationType.SIMPLE,
							JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 64)));

					// Update the progress
					updateProgress(1, 1);

					return true;
				} catch (final Exception ex) {
					ex.printStackTrace();

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Download Failed",
							"Failed to download " + (!dropboxFile.isDirectory() ? "File" : FOLDER) + ":\n[ "
									+ dropboxFile.getMetadata().getName() + " ]",
							Duration.millis(3000), NotificationType.ERROR));

					return false;
				}
			}

			/**
			 * Download Dropbox File to Local Computer
			 *
			 * @param client                Current connected client
			 * @param dropboxFile           The file path on the Dropbox cloud server ->
			 *                              [/foldername/something.txt] or a Folder [/fuck]
			 * @param localFileAbsolutePath The absolute file path of the File on the Local
			 *                              File System
			 * @throws DbxException
			 * @throws DownloadErrorException
			 * @throws IOException
			 */
			public void downloadFile(final DbxClientV2 client, final DropboxFile dropboxFile,
					final String localFileAbsolutePath) throws DownloadErrorException, DbxException, IOException {
				final String dropBoxFilePath = dropboxFile.getMetadata().getPathLower();

				// Simple File
				if (!dropboxFile.isDirectory()) {
					// Create DbxDownloader
					downloadFile = client.files().download(dropBoxFilePath);
					try (// FileOutputStream
							FileOutputStream fOut = new FileOutputStream(localFileAbsolutePath);
							// ProgressOutPutStream
							ProgressOutputStream output = new ProgressOutputStream(fOut,
									downloadFile.getResult().getSize(), (long completed, long totalSize) -> {
										// System.out.println( ( completed * 100 ) / totalSize + " %")

										updateProgress((completed * 100), totalSize);
									})) {

						// FileOutputStream
						System.out.println("Downloading .... " + dropBoxFilePath);

						// Add a progress Listener
						downloadFile.download(output);

						// Fast way...
						// client.files().downloadBuilder(file).download(new
						// FileOutputStream("downloads/" + md.getName()))
						// DbxRawClientV2 rawClient = new
						// DbxRawClientV2(config,dropBoxViewer.getAccessToken())
						// DbxUserFilesRequests r = new DbxUserFilesRequests(client)
					} catch (final Exception ex) {
						ex.printStackTrace();
					}
					// Directory
				} else {
					// Create DbxDownloader
					downloadFolder = client.files().downloadZip(dropBoxFilePath);
					try (
							// FileOutputStream
							FileOutputStream fOut = new FileOutputStream(localFileAbsolutePath)) {

						// FileOutputStream
						System.out.println("Downloading .... " + dropBoxFilePath);

						// Add a progress Listener
						downloadFolder.download(fOut);
					} catch (final Exception ex) {
						ex.printStackTrace();
					}
				}
			}

		};

	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.dropbox.DownloadService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {

				try {

					// REFRESH?
					if (operation == DropBoxOperation.REFRESH) {

						// Create the Client
						if (client == null || previousAccessToken == null
								|| !previousAccessToken.equals(dropBoxViewer.getAccessToken())) {
							previousAccessToken = dropBoxViewer.getAccessToken();
							client = new DbxClientV2(config, dropBoxViewer.getAccessToken());
						}

						// Get current account info
						final FullAccount account = client.users().getCurrentAccount();
						Platform.runLater(() -> dropBoxViewer.getTopMenuButton()
								.setText(" " + account.getName().getDisplayName()));

						// List all the files brooooo!
						final ObservableList<DropboxFile> observableList = FXCollections.observableArrayList();
						listAllFiles(currentPath, observableList, false, true);

						// Check if folder is empty
						Platform.runLater(() -> {
							dropBoxViewer.getSearchResultsLabel().setVisible(false);
							dropBoxViewer.getEmptyFolderLabel().setVisible(observableList.isEmpty());

							// Set the items to TableView
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().clear();
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().addAll(observableList);
							dropBoxViewer.getDropboxFilesTableViewer().updateLabel();

							// Sort the Table
							dropBoxViewer.getDropboxFilesTableViewer().sortTable();

							// Make the CacheService Available to the bro user
							if (searchCacheService.getCachedList().isEmpty() && !searchCacheService.isRunning())
								searchCacheService.prepareCachedSearch(client);
						});
					} else if (operation == DropBoxOperation.DELETE) {

						// Delete all the selected files and folders
						final List<DropboxFile> list = dropBoxViewer.getDropboxFilesTableViewer().getSelectionModel()
								.getSelectedItems().stream().collect(Collectors.toList());

						// Remove from the TreeView one by one
						list.forEach(item -> {
							if (delete(item.getMetadata().getPathLower()))
								Platform.runLater(() -> dropBoxViewer.getDropboxFilesTableViewer().getTableView()
										.getItems().remove(item));
						});

						// Update the bottom label
						Platform.runLater(() -> {

							// Update the Label
							dropBoxViewer.getDropboxFilesTableViewer().updateLabel();

							// Sort the Table
							dropBoxViewer.getDropboxFilesTableViewer().sortTable();
						});

					} else if (operation == DropBoxOperation.CREATE_FOLDER) {

						// Create Folder
						createFolder(folderName);

						// Refresh
						Platform.runLater(() -> refresh(currentPath));

					} else if (operation == DropBoxOperation.RENAME) {

						// Try to rename
						rename(dropboxFile.getMetadata().getPathLower(), newPath);

					} else if (operation == DropBoxOperation.SEARCH) {
						ObservableList<DropboxFile> observableList;

						// CountDown Latch
						final CountDownLatch countDown = new CountDownLatch(1);
						final boolean[] searchCacheServiceIsRunning = {false};
						Platform.runLater(() -> {
							searchCacheServiceIsRunning[0] = searchCacheService.isRunning();
							countDown.countDown();
						});

						// Wait
						countDown.await();

						// Check if cached search is available
						if (!searchCacheService.getCachedList().isEmpty() && !searchCacheServiceIsRunning[0]) {

							System.out.println("Doing ++CACHED SEARCH++");

							// Search based on cachedList
							observableList = cachedSearch(searchCacheService.getCachedList());

						}

						// Do normal global search
						else {

							System.out.println("Doing --NORMAL SEARCH--");
							searchMatchingFilesCounter = 0;

							// Prepare an observableList
							observableList = FXCollections.observableArrayList();

							// Clear Cached Search
							searchCacheService.getCachedList().clear();

							// Start a normal Search
							search("", observableList);

						}

						// Run of JavaFX Thread
						Platform.runLater(() -> {

							// Set Label Visible
							dropBoxViewer.getSearchResultsLabel().setVisible(true);

							// Set the items to TableView
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().clear();
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().addAll(observableList);

							// Set Label Visible
							dropBoxViewer.getSearchResultsLabel()
									.setText("Total Found -> " + InfoTool.getNumberWithDots(observableList.size()));
							dropBoxViewer.getDropboxFilesTableViewer().updateLabel();

							// Sort the Table
							dropBoxViewer.getDropboxFilesTableViewer().sortTable();
						});

					}
				} catch (final ListFolderErrorException ex) {
					ex.printStackTrace();

					// Show to user about the error
					Platform.runLater(() -> AlertTool.showNotification("Missing Folder",
							"Folder : [ " + currentPath + " ] doesn't exist.", Duration.seconds(2),
							NotificationType.ERROR));

					// Check the Internet Connection
					checkConnection();

				} catch (final Exception ex) {
					ex.printStackTrace();

					// Check the Internet Connection
					checkConnection();

					// Change the Operation so CachedSearch works correctly
					operation = DropBoxOperation.STOPPED;

					return false;
				}

				// Change the Operation so CachedSearch works correctly
				operation = DropBoxOperation.STOPPED;

				return true;
			}

			/**
			 * Check if there is Internet Connection
			 */
			private boolean checkConnection() {

				// Check if there is Internet Connection
				if (!NetworkingTool.isReachableByPing("www.google.com")) {
					Platform.runLater(() -> dropBoxViewer.getErrorVBox().setVisible(true));
					return false;
				}

				return true;
			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @param client
			 * @param path
			 * @param children
			 * @param arrayList
			 * @throws DbxException
			 * @throws ListFolderErrorException
			 */
			public void listAllFiles(final String path, final ObservableList<DropboxFile> children,
									 final boolean recursive, final boolean appendToMap) throws DbxException {

				ListFolderResult result = client.files().listFolder(path);

				while (true) {
					for (final Metadata metadata : result.getEntries()) {
						if (metadata instanceof DeletedMetadata) { // Deleted
							// children.remove(metadata.getPathLower())
						} else if (metadata instanceof FolderMetadata) { // Folder
							final String folder = metadata.getPathLower();
							// String parent = new File(metadata.getPathLower()).getParent().replace("\\",
							// "/")
							if (appendToMap)
								children.add(new DropboxFile(metadata));

							// boolean subFileOfCurrentFolder = path.equals(parent)
							// System.out.println( ( subFileOfCurrentFolder ? "" : "\n" ) + "Folder ->" +
							// folder)

							if (recursive)
								listAllFiles(folder, children, recursive, appendToMap);
						} else if (metadata instanceof FileMetadata) { // File
							// String file = metadata.getPathLower()
							// String parent = new File(metadata.getPathLower()).getParent().replace("\\",
							// "/")
							if (appendToMap)
								children.add(new DropboxFile(metadata));

							// boolean subFileOfCurrentFolder = path.equals(parent)
							// System.out.println( ( subFileOfCurrentFolder ? "" : "\n" ) + "File->" + file
							// + " Media Info: " + InfoTool.isAudioSupported(file))
						}
					}

					if (!result.getHasMore())
						break;

					try {
						result = client.files().listFolderContinue(result.getCursor());
						// System.out.println("Entered result next")
					} catch (final ListFolderContinueErrorException ex) {
						ex.printStackTrace();
					}
				}

			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @param client
			 * @param path
			 * @param children
			 * @throws DbxException
			 */
			public void search(final String path, final ObservableList<DropboxFile> children) throws DbxException {

				ListFolderResult result = client.files().listFolder(path);

				while (true) {
					for (final Metadata metadata : result.getEntries()) {
						if (metadata instanceof DeletedMetadata) { // Deleted
							// children.remove(metadata.getPathLower())
						} else if (metadata instanceof FolderMetadata) { // Folder
							final String folder = metadata.getPathLower();
							if (metadata.getName().toLowerCase().contains(searchWord))
								children.add(new DropboxFile(metadata));

							// Run again
							search(folder, children);
						} else if (metadata instanceof FileMetadata) { // File
							if (metadata.getName().toLowerCase().contains(searchWord)) {
								children.add(new DropboxFile(metadata));
								++searchMatchingFilesCounter;

								// Refresh the Search Label
								Platform.runLater(() -> dropBoxViewer.getRefreshLabel()
										.setText("Searching , found [ "
												+ InfoTool.getNumberWithDots(searchMatchingFilesCounter)
												+ " ] matching files"));

								// System.out.println(searchMatchingFilesCounter)
							}

							// Add each and every item to the cached search list
							searchCacheService.getCachedList().add(metadata);

							// System.out.println(searchCacheService.getCachedList().size());
						}
					}

					if (!result.getHasMore())
						break;

					try {
						result = client.files().listFolderContinue(result.getCursor());
						// System.out.println("Entered result next")
					} catch (final ListFolderContinueErrorException ex) {
						ex.printStackTrace();
					}
				}

			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @return
			 */
			public ObservableList<DropboxFile> cachedSearch(final List<Metadata> cachedList) {

				// Find matching patterns
				return cachedList.stream().filter(metadata -> metadata.getName().toLowerCase().contains(searchWord))
						.map(DropboxFile::new).collect(Collectors.toCollection(FXCollections::observableArrayList));

			}

			/**
			 * Deletes the given file or folder from Dropbox Account
			 *
			 * @param path The path of the Dropbox File or Folder
			 */
			public boolean delete(final String path) {
				try {
					if (operation == DropBoxOperation.DELETE)
						client.files().deleteV2(path);
					else
						client.files().permanentlyDelete(path); // SUPPORTED ONLY ON BUSINESS PLAN

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Delete was successful",
							"Successfully deleted selected files/folders", Duration.millis(2000),
							NotificationType.SIMPLE,
							JavaFXTool.getFontIcon("fa-dropbox", dropBoxViewer.FONT_ICON_COLOR, 64)));

					return true;
				} catch (final DbxException dbxe) {
					dbxe.printStackTrace();

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Failed deleting files",
							"Failed to delete selected files/folders", Duration.millis(2000), NotificationType.ERROR));

					return false;
				}
			}

			/**
			 * Renames the given file or folder from Dropbox Account
			 *
			 * @param oldPath
			 * @param newPath
			 */
			public boolean rename(final String oldPath, final String newPath) {
				try {
					final RelocationResult result = client.files().moveV2(oldPath, newPath);

					// Run on JavaFX Thread
					Platform.runLater(() -> {

						// Show message
						AlertTool.showNotification("Rename Successful",
								"Succesfully renamed file :\n [ " + dropboxFile.getMetadata().getName() + " ] to -> [ "
										+ result.getMetadata().getName() + " ]",
								Duration.millis(2500), NotificationType.SIMPLE,
								JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 64));

						// Return the previous name
						dropboxFile.setMetadata(result.getMetadata());

						// Sort the Table
						dropBoxViewer.getDropboxFilesTableViewer().sortTable();
					});

					return true;
				} catch (final DbxException dbxe) {
					dbxe.printStackTrace();

					// Run on JavaFX Thread
					Platform.runLater(() -> {

						// Show message
						AlertTool.showNotification("Error Message",
								"Failed to rename the File:\n [ " + dropboxFile.getMetadata().getName() + " ] to -> [ "
										+ newPath + " ]",
								Duration.millis(2500), NotificationType.ERROR);

						// Return the previous name
						dropboxFile.titleProperty().set(dropboxFile.getMetadata().getName());

					});

					return false;
				}
			}

			/**
			 * Create a folder from Dropbox Account
			 *
			 * @param path Folder name
			 */
			public boolean createFolder(final String path) {
				try {

					// Create new folder
					final CreateFolderResult result = client.files().createFolderV2(path, true);

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("New folder created",
							"Folder created with name :\n [ " + result.getMetadata().getName() + " ]",
							Duration.millis(2000), NotificationType.SIMPLE,
							JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 64)));

					return true;
				} catch (final DbxException dbxe) {
					dbxe.printStackTrace();

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Failed creating folder",
							"Folder was not created", Duration.millis(2000), NotificationType.ERROR));

					return false;
				}
			}

		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {

				try {

					// REFRESH?
					if (operation == DropBoxOperation.REFRESH) {

						// Create the Client
						if (client == null || previousAccessToken == null
								|| !previousAccessToken.equals(dropBoxViewer.getAccessToken())) {
							previousAccessToken = dropBoxViewer.getAccessToken();
							client = new DbxClientV2(config, dropBoxViewer.getAccessToken());
						}

						// Get current account info
						final FullAccount account = client.users().getCurrentAccount();
						Platform.runLater(() -> dropBoxViewer.getTopMenuButton()
								.setText(" " + account.getName().getDisplayName()));

						// List all the files brooooo!
						final ObservableList<DropboxFile> observableList = FXCollections.observableArrayList();
						listAllFiles(currentPath, observableList, false, true);

						// Check if folder is empty
						Platform.runLater(() -> {
							dropBoxViewer.getSearchResultsLabel().setVisible(false);
							dropBoxViewer.getEmptyFolderLabel().setVisible(observableList.isEmpty());

							// Set the items to TableView
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().clear();
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().addAll(observableList);
							dropBoxViewer.getDropboxFilesTableViewer().updateLabel();

							// Sort the Table
							dropBoxViewer.getDropboxFilesTableViewer().sortTable();

							// Make the CacheService Available to the bro user
							if (searchCacheService.getCachedList().isEmpty() && !searchCacheService.isRunning())
								searchCacheService.prepareCachedSearch(client);
						});
					} else if (operation == DropBoxOperation.DELETE) {

						// Delete all the selected files and folders
						final List<DropboxFile> list = dropBoxViewer.getDropboxFilesTableViewer().getSelectionModel()
								.getSelectedItems().stream().collect(Collectors.toList());

						// Remove from the TreeView one by one
						list.forEach(item -> {
							if (delete(item.getMetadata().getPathLower()))
								Platform.runLater(() -> dropBoxViewer.getDropboxFilesTableViewer().getTableView()
										.getItems().remove(item));
						});

						// Update the bottom label
						Platform.runLater(() -> {

							// Update the Label
							dropBoxViewer.getDropboxFilesTableViewer().updateLabel();

							// Sort the Table
							dropBoxViewer.getDropboxFilesTableViewer().sortTable();
						});

					} else if (operation == DropBoxOperation.CREATE_FOLDER) {

						// Create Folder
						createFolder(folderName);

						// Refresh
						Platform.runLater(() -> refresh(currentPath));

					} else if (operation == DropBoxOperation.RENAME) {

						// Try to rename
						rename(dropboxFile.getMetadata().getPathLower(), newPath);

					} else if (operation == DropBoxOperation.SEARCH) {
						ObservableList<DropboxFile> observableList;

						// CountDown Latch
						final CountDownLatch countDown = new CountDownLatch(1);
						final boolean[] searchCacheServiceIsRunning = { false };
						Platform.runLater(() -> {
							searchCacheServiceIsRunning[0] = searchCacheService.isRunning();
							countDown.countDown();
						});

						// Wait
						countDown.await();

						// Check if cached search is available
						if (!searchCacheService.getCachedList().isEmpty() && !searchCacheServiceIsRunning[0]) {

							System.out.println("Doing ++CACHED SEARCH++");

							// Search based on cachedList
							observableList = cachedSearch(searchCacheService.getCachedList());

						}

						// Do normal global search
						else {

							System.out.println("Doing --NORMAL SEARCH--");
							searchMatchingFilesCounter = 0;

							// Prepare an observableList
							observableList = FXCollections.observableArrayList();

							// Clear Cached Search
							searchCacheService.getCachedList().clear();

							// Start a normal Search
							search("", observableList);

						}

						// Run of JavaFX Thread
						Platform.runLater(() -> {

							// Set Label Visible
							dropBoxViewer.getSearchResultsLabel().setVisible(true);

							// Set the items to TableView
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().clear();
							dropBoxViewer.getDropboxFilesTableViewer().getTableView().getItems().addAll(observableList);

							// Set Label Visible
							dropBoxViewer.getSearchResultsLabel()
									.setText("Total Found -> " + InfoTool.getNumberWithDots(observableList.size()));
							dropBoxViewer.getDropboxFilesTableViewer().updateLabel();

							// Sort the Table
							dropBoxViewer.getDropboxFilesTableViewer().sortTable();
						});

					}
				} catch (final ListFolderErrorException ex) {
					ex.printStackTrace();

					// Show to user about the error
					Platform.runLater(() -> AlertTool.showNotification("Missing Folder",
							"Folder : [ " + currentPath + " ] doesn't exist.", Duration.seconds(2),
							NotificationType.ERROR));

					// Check the Internet Connection
					checkConnection();

				} catch (final Exception ex) {
					ex.printStackTrace();

					// Check the Internet Connection
					checkConnection();

					// Change the Operation so CachedSearch works correctly
					operation = DropBoxOperation.STOPPED;

					return false;
				}

				// Change the Operation so CachedSearch works correctly
				operation = DropBoxOperation.STOPPED;

				return true;
			}

			/**
			 * Check if there is Internet Connection
			 */
			private boolean checkConnection() {

				// Check if there is Internet Connection
				if (!NetworkingTool.isReachableByPing("www.google.com")) {
					Platform.runLater(() -> dropBoxViewer.getErrorVBox().setVisible(true));
					return false;
				}

				return true;
			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @param client
			 * @param path
			 * @param children
			 * @param arrayList
			 * @throws DbxException
			 * @throws ListFolderErrorException
			 */
			public void listAllFiles(final String path, final ObservableList<DropboxFile> children,
					final boolean recursive, final boolean appendToMap) throws DbxException {

				ListFolderResult result = client.files().listFolder(path);

				while (true) {
					for (final Metadata metadata : result.getEntries()) {
						if (metadata instanceof DeletedMetadata) { // Deleted
							// children.remove(metadata.getPathLower())
						} else if (metadata instanceof FolderMetadata) { // Folder
							final String folder = metadata.getPathLower();
							// String parent = new File(metadata.getPathLower()).getParent().replace("\\",
							// "/")
							if (appendToMap)
								children.add(new DropboxFile(metadata));

							// boolean subFileOfCurrentFolder = path.equals(parent)
							// System.out.println( ( subFileOfCurrentFolder ? "" : "\n" ) + "Folder ->" +
							// folder)

							if (recursive)
								listAllFiles(folder, children, recursive, appendToMap);
						} else if (metadata instanceof FileMetadata) { // File
							// String file = metadata.getPathLower()
							// String parent = new File(metadata.getPathLower()).getParent().replace("\\",
							// "/")
							if (appendToMap)
								children.add(new DropboxFile(metadata));

							// boolean subFileOfCurrentFolder = path.equals(parent)
							// System.out.println( ( subFileOfCurrentFolder ? "" : "\n" ) + "File->" + file
							// + " Media Info: " + InfoTool.isAudioSupported(file))
						}
					}

					if (!result.getHasMore())
						break;

					try {
						result = client.files().listFolderContinue(result.getCursor());
						// System.out.println("Entered result next")
					} catch (final ListFolderContinueErrorException ex) {
						ex.printStackTrace();
					}
				}

			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @param client
			 * @param path
			 * @param children
			 * @throws DbxException
			 */
			public void search(final String path, final ObservableList<DropboxFile> children) throws DbxException {

				ListFolderResult result = client.files().listFolder(path);

				while (true) {
					for (final Metadata metadata : result.getEntries()) {
						if (metadata instanceof DeletedMetadata) { // Deleted
							// children.remove(metadata.getPathLower())
						} else if (metadata instanceof FolderMetadata) { // Folder
							final String folder = metadata.getPathLower();
							if (metadata.getName().toLowerCase().contains(searchWord))
								children.add(new DropboxFile(metadata));

							// Run again
							search(folder, children);
						} else if (metadata instanceof FileMetadata) { // File
							if (metadata.getName().toLowerCase().contains(searchWord)) {
								children.add(new DropboxFile(metadata));
								++searchMatchingFilesCounter;

								// Refresh the Search Label
								Platform.runLater(() -> dropBoxViewer.getRefreshLabel()
										.setText("Searching , found [ "
												+ InfoTool.getNumberWithDots(searchMatchingFilesCounter)
												+ " ] matching files"));

								// System.out.println(searchMatchingFilesCounter)
							}

							// Add each and every item to the cached search list
							searchCacheService.getCachedList().add(metadata);

							// System.out.println(searchCacheService.getCachedList().size());
						}
					}

					if (!result.getHasMore())
						break;

					try {
						result = client.files().listFolderContinue(result.getCursor());
						// System.out.println("Entered result next")
					} catch (final ListFolderContinueErrorException ex) {
						ex.printStackTrace();
					}
				}

			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @return
			 *
			 */
			public ObservableList<DropboxFile> cachedSearch(final List<Metadata> cachedList) {

				// Find matching patterns
				return cachedList.stream().filter(metadata -> metadata.getName().toLowerCase().contains(searchWord))
						.map(DropboxFile::new).collect(Collectors.toCollection(FXCollections::observableArrayList));

			}

			/**
			 * Deletes the given file or folder from Dropbox Account
			 *
			 * @param path The path of the Dropbox File or Folder
			 */
			public boolean delete(final String path) {
				try {
					if (operation == DropBoxOperation.DELETE)
						client.files().deleteV2(path);
					else
						client.files().permanentlyDelete(path); // SUPPORTED ONLY ON BUSINESS PLAN

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Delete was successful",
							"Successfully deleted selected files/folders", Duration.millis(2000),
							NotificationType.SIMPLE,
							JavaFXTool.getFontIcon("fa-dropbox", dropBoxViewer.FONT_ICON_COLOR, 64)));

					return true;
				} catch (final DbxException dbxe) {
					dbxe.printStackTrace();

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Failed deleting files",
							"Failed to delete selected files/folders", Duration.millis(2000), NotificationType.ERROR));

					return false;
				}
			}

			/**
			 * Renames the given file or folder from Dropbox Account
			 *
			 * @param oldPath
			 * @param newPath
			 */
			public boolean rename(final String oldPath, final String newPath) {
				try {
					final RelocationResult result = client.files().moveV2(oldPath, newPath);

					// Run on JavaFX Thread
					Platform.runLater(() -> {

						// Show message
						AlertTool.showNotification("Rename Successful",
								"Succesfully renamed file :\n [ " + dropboxFile.getMetadata().getName() + " ] to -> [ "
										+ result.getMetadata().getName() + " ]",
								Duration.millis(2500), NotificationType.SIMPLE,
								JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 64));

						// Return the previous name
						dropboxFile.setMetadata(result.getMetadata());

						// Sort the Table
						dropBoxViewer.getDropboxFilesTableViewer().sortTable();
					});

					return true;
				} catch (final DbxException dbxe) {
					dbxe.printStackTrace();

					// Run on JavaFX Thread
					Platform.runLater(() -> {

						// Show message
						AlertTool.showNotification("Error Message",
								"Failed to rename the File:\n [ " + dropboxFile.getMetadata().getName() + " ] to -> [ "
										+ newPath + " ]",
								Duration.millis(2500), NotificationType.ERROR);

						// Return the previous name
						dropboxFile.titleProperty().set(dropboxFile.getMetadata().getName());

					});

					return false;
				}
			}

			/**
			 * Create a folder from Dropbox Account
			 *
			 * @param path Folder name
			 */
			public boolean createFolder(final String path) {
				try {

					// Create new folder
					final CreateFolderResult result = client.files().createFolderV2(path, true);

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("New folder created",
							"Folder created with name :\n [ " + result.getMetadata().getName() + " ]",
							Duration.millis(2000), NotificationType.SIMPLE,
							JavaFXTool.getFontIcon("fa-dropbox", DropboxViewer.FONT_ICON_COLOR, 64)));

					return true;
				} catch (final DbxException dbxe) {
					dbxe.printStackTrace();

					// Show message to the User
					Platform.runLater(() -> AlertTool.showNotification("Failed creating folder",
							"Folder was not created", Duration.millis(2000), NotificationType.ERROR));

					return false;
				}
			}

		};
	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.dropbox.DropboxService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {

			@Override
			protected Boolean call() throws Exception {
				boolean success = true;

				// Update Indicator Label
				Platform.runLater(
						() -> dropBoxViewer.getCachedSearchIndicator().getTooltip().setText("Preparing Cached Search"));

				try {
					if (cachedList.isEmpty()) // Check if cachedList is empty
						populateCachedList("");
				} catch (Exception ex) {
					ex.printStackTrace();
				}

				// Update progress
				updateProgress(1, 1);

				// Update Indicator Label
				Platform.runLater(() -> dropBoxViewer.getCachedSearchIndicator().getTooltip()
						.setText("Superior Cached Search is Enabled"));

				System.out.println("Search Cache Service Exited");

				return success;
			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @param path The searting path
			 */
			private void populateCachedList(String path) throws DbxException {

				if (this.isCancelled())
					return;

				// System.out.println("Running...");

				// Exit if normal search is on progress , it will populate the
				if (dropBoxViewer.getDropBoxService().getOperation() == DropBoxOperation.SEARCH) {
					// System.out.println("Search Cache Service exiting ....");

					// Cancel the Service and let the DropboxService search
					// to populate the cachedList
					this.cancel();
				} else if (dropBoxViewer.getDropBoxService().getOperation() == DropBoxOperation.REFRESH) {
					// System.out.println("Dropbox Service is running...");

					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

				ListFolderResult result = client.files().listFolder(path);

				// While true
				while (true) {
					for (Metadata metadata : result.getEntries()) {

						// Check if cancelled
						if (this.isCancelled())
							break;

						// Check the metadata
						if (!(metadata instanceof DeletedMetadata))
							if (!(metadata instanceof FolderMetadata)) {
								if (metadata instanceof FileMetadata)
									cachedList.add(metadata);
							} else {
								String folder = metadata.getPathLower();
								cachedList.add(metadata);
								populateCachedList(folder);
							}
					}

					if (!result.getHasMore())
						break;

					try {
						result = client.files().listFolderContinue(result.getCursor());
						// System.out.println("Entered result next")
					} catch (ListFolderContinueErrorException ex) {
						ex.printStackTrace();
					}
				}

			}

		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {

			@Override
			protected Boolean call() throws Exception {
				boolean success = true;

				// Update Indicator Label
				Platform.runLater(
						() -> dropBoxViewer.getCachedSearchIndicator().getTooltip().setText("Preparing Cached Search"));

				try {
					if (cachedList.isEmpty()) // Check if cachedList is empty
						populateCachedList("");
				} catch (Exception ex) {
					ex.printStackTrace();
				}

				// Update progress
				updateProgress(1, 1);

				// Update Indicator Label
				Platform.runLater(() -> dropBoxViewer.getCachedSearchIndicator().getTooltip()
						.setText("Superior Cached Search is Enabled"));

				System.out.println("Search Cache Service Exited");

				return success;
			}

			/**
			 * List all the Files inside DropboxAccount
			 *
			 * @param path The searting path
			 */
			private void populateCachedList(String path) throws DbxException {

				if (this.isCancelled())
					return;

				// System.out.println("Running...");

				// Exit if normal search is on progress , it will populate the
				if (dropBoxViewer.getDropBoxService().getOperation() == DropBoxOperation.SEARCH) {
					// System.out.println("Search Cache Service exiting ....");

					// Cancel the Service and let the DropboxService search
					// to populate the cachedList
					this.cancel();
				} else if (dropBoxViewer.getDropBoxService().getOperation() == DropBoxOperation.REFRESH) {
					// System.out.println("Dropbox Service is running...");

					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

				ListFolderResult result = client.files().listFolder(path);

				// While true
				while (true) {
					for (Metadata metadata : result.getEntries()) {

						// Check if cancelled
						if (this.isCancelled())
							break;

						// Check the metadata
						if (!(metadata instanceof DeletedMetadata))
							if (!(metadata instanceof FolderMetadata)) {
								if (metadata instanceof FileMetadata)
									cachedList.add(metadata);
							} else {
								String folder = metadata.getPathLower();
								cachedList.add(metadata);
								populateCachedList(folder);
							}
					}

					if (!result.getHasMore())
						break;

					try {
						result = client.files().listFolderContinue(result.getCursor());
						// System.out.println("Entered result next")
					} catch (ListFolderContinueErrorException ex) {
						ex.printStackTrace();
					}
				}

			}

		};
	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.dropbox.SearchCacheService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {

				// Title
				updateTitle(category + " Thread");

				try {

					// Check the category
					if (category == StoppableServiceCategory.INTERNET_CHECKER) { // INTERNET_CHECKER
						boolean[] newStatus = {false};

						// Run until Service is cancelled
						while (!isCancelled()) {
							// System.out.println(category + " Thread" + " Running...")

							newStatus[0] = NetworkingTool.isReachableByPing("www.google.com");

							// Try to connect
							if (newStatus[0] != internetPreviousStatus || firstHack)
								Platform.runLater(() -> {
									Main.bottomBar.getInternetConnectionLabel().setDisable(!newStatus[0]);
									Main.bottomBar.getInternetConnectionDescriptionLabel()
											.setText(newStatus[0] ? "Connected" : "Disconnected");
								});

							internetPreviousStatus = newStatus[0];
							firstHack = false;

							// Sleep sometime [ Don't lag the CPU]
							try {
								Thread.sleep(2000);
							} catch (InterruptedException ex) {
								// ex.printStackTrace()
							}

						}
					} else if (category == StoppableServiceCategory.TIMER_CHECKER) { // TIMER_CHECKER
						String[] localTime = {""};

						// Run until Service is cancelled
						while (!isCancelled()) {
							// System.out.println(category + " Thread" + " Running...")

							// Find local time
							localTime[0] = LocalTime.now().format(DateTimeFormatter.ofPattern("h:mm a"));

							// Run on JavaFX Thread
							Platform.runLater(() -> {
								Main.bottomBar.getCurrentTimeLabel().setText(localTime[0]);
								Main.bottomBar.getRunningTimeLabel()
										.setText(minutes + (minutes == 1 ? " minute" : " minutes"));
							});

							// Sleep sometime [ Don't lag the CPU]
							try {
								Thread.sleep(60000);
								++minutes;
							} catch (InterruptedException exx) {
								// e.printStackTrace()
							}

						}

					}
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				return true;
			}

		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {

				// Title
				updateTitle(category + " Thread");

				try {

					// Check the category
					if (category == StoppableServiceCategory.INTERNET_CHECKER) { // INTERNET_CHECKER
						boolean[] newStatus = { false };

						// Run until Service is cancelled
						while (!isCancelled()) {
							// System.out.println(category + " Thread" + " Running...")

							newStatus[0] = NetworkingTool.isReachableByPing("www.google.com");

							// Try to connect
							if (newStatus[0] != internetPreviousStatus || firstHack)
								Platform.runLater(() -> {
									Main.bottomBar.getInternetConnectionLabel().setDisable(!newStatus[0]);
									Main.bottomBar.getInternetConnectionDescriptionLabel()
											.setText(newStatus[0] ? "Connected" : "Disconnected");
								});

							internetPreviousStatus = newStatus[0];
							firstHack = false;

							// Sleep sometime [ Don't lag the CPU]
							try {
								Thread.sleep(2000);
							} catch (InterruptedException ex) {
								// ex.printStackTrace()
							}

						}
					} else if (category == StoppableServiceCategory.TIMER_CHECKER) { // TIMER_CHECKER
						String[] localTime = { "" };

						// Run until Service is cancelled
						while (!isCancelled()) {
							// System.out.println(category + " Thread" + " Running...")

							// Find local time
							localTime[0] = LocalTime.now().format(DateTimeFormatter.ofPattern("h:mm a"));

							// Run on JavaFX Thread
							Platform.runLater(() -> {
								Main.bottomBar.getCurrentTimeLabel().setText(localTime[0]);
								Main.bottomBar.getRunningTimeLabel()
										.setText(minutes + (minutes == 1 ? " minute" : " minutes"));
							});

							// Sleep sometime [ Don't lag the CPU]
							try {
								Thread.sleep(60000);
								++minutes;
							} catch (InterruptedException exx) {
								// e.printStackTrace()
							}

						}

					}
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				return true;
			}

		};
	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.general.StoppableService


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {
				// Variables
				final int[] counter = {0};
				final int totalUsers = Main.loginMode.viewer.getItemsObservableList().size();

				try {

					// -- For every user
					Main.loginMode.viewer.getItemsObservableList().forEach(userr -> {
						final User user = (User) userr;

						// Check if the UserInformation Properties File exist
						if (new File(user.getUserInformationDb().getFileAbsolutePath()).exists()) {
							// System.out.println("UsersInformationDb Exists"); //debugging

							// --------------------Now continue
							// normally----------------------------------------------
							final Properties userInformationSettings = user.getUserInformationDb().loadProperties(); // Load
							// the
							// properties
							// from
							// the
							// File

							// --Total Libraries
							Optional.ofNullable(userInformationSettings.getProperty("Total-Libraries")).ifPresent(s -> {
								final int totalLibraries = Integer.parseInt(s);

								// Refresh the text
								Platform.runLater(() -> {
									// Add Pie Chart Data
									// if (totalLibraries > 0)
									// Main.loginMode.getSeries().getData().add(new
									// XYChart.Data<String,Number>(user.getUserName(), totalLibraries));

									// Update User Label
									user.getTotalLibrariesLabel().setText(Integer.toString(totalLibraries));
								});
							});

							// --User Description
							Optional.ofNullable(userInformationSettings.getProperty("User-Description"))
									.ifPresent(description -> Platform
											.runLater(() -> user.getDescriptionProperty().set(description)));

							// --Drop-Box-Accounts
							Optional.ofNullable(userInformationSettings.getProperty("DropBox-Access-Tokens"))
									.ifPresent(accessTokens -> {

										if (accessTokens.contains("<>:<>")) // Check if we have multiple access tokens
											Platform.runLater(() -> user.getDropBoxLabel().setText(Integer
													.toString(accessTokens.split(Pattern.quote("<>:<>")).length)));
										else if (!accessTokens.isEmpty()) // Check if we have one access token
											Platform.runLater(
													() -> user.getDropBoxLabel().setText(Integer.toString(1)));

									});

						} // If the UserInformation Properties File doesn't exit try to take
						// Total-Libraries information from the actual sqlite.db file
						// this process is slow as fu.ck that's why i am keeping information inside a
						// properties file generally...
						else {
							// System.out.println("UsersInformationDb doesn't Exists"); //debugging

							// Very well create the UsersInformationDb because it doesn't exist so on the
							// next load it will exist
							IOAction.createFileOrFolder(new File(DatabaseTool.getAbsoluteDatabasePathWithSeparator()
									+ user.getName() + File.separator + "settings"), FileType.DIRECTORY);
							IOAction.createFileOrFolder(new File(user.getUserInformationDb().getFileAbsolutePath()),
									FileType.FILE);

							// Check if the database of this user exists
							final String dbFileAbsolutePath = DatabaseTool.getAbsoluteDatabasePathWithSeparator() + user.getName()
									+ File.separator + "dbFile.db";
							if (new File(dbFileAbsolutePath).exists()) {

								// --Create connection and load user information
								try (Connection connection = DriverManager
										.getConnection("jdbc:sqlite:" + dbFileAbsolutePath);
									 ResultSet dbCounter = connection.createStatement()
											 .executeQuery("SELECT COUNT(NAME) FROM LIBRARIES;");) {

									final int[] totalLibraries = {0};
									totalLibraries[0] += dbCounter.getInt(1);
									Thread.sleep(500);

									// Refresh the text
									Platform.runLater(() -> {

										// Add Pie Chart Data
										// if (totalLibraries[0] > 0)
										// Main.loginMode.getSeries().getData().add(new
										// XYChart.Data<String,Number>(user.getUserName(), totalLibraries[0]));

										// Update User Label
										user.getTotalLibrariesLabel().setText(Integer.toString(totalLibraries[0]));

									});

									// Update the UserInformationDb so it is ready for the next time
									user.getUserInformationDb().updateProperty("Total-Libraries",
											String.valueOf(totalLibraries[0]));

									// System.out.println("User:" + user.getUserName() + " contains : " +
									// totalLibraries + " Libraries"); //debugging

									updateProgress(++counter[0], totalUsers);
								} catch (final Exception ex) {
									Main.logger.log(Level.SEVERE, "", ex);
								}

							} else {
								// Refresh the text
								Platform.runLater(() -> user.getTotalLibrariesLabel().setText("0"));

								// Update the UserInformationDb so it is ready for the next time
								user.getUserInformationDb().updateProperty("Total-Libraries", String.valueOf(0));
							}

						}

					});

				} catch (final Exception ex) {
					ex.printStackTrace();
				}

				return true;
			}
		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {
				// Variables
				final int[] counter = { 0 };
				final int totalUsers = Main.loginMode.viewer.getItemsObservableList().size();

				try {

					// -- For every user
					Main.loginMode.viewer.getItemsObservableList().forEach(userr -> {
						final User user = (User) userr;

						// Check if the UserInformation Properties File exist
						if (new File(user.getUserInformationDb().getFileAbsolutePath()).exists()) {
							// System.out.println("UsersInformationDb Exists"); //debugging

							// --------------------Now continue
							// normally----------------------------------------------
							final Properties userInformationSettings = user.getUserInformationDb().loadProperties(); // Load
																												// the
																												// properties
																												// from
																												// the
																												// File

							// --Total Libraries
							Optional.ofNullable(userInformationSettings.getProperty("Total-Libraries")).ifPresent(s -> {
								final int totalLibraries = Integer.parseInt(s);

								// Refresh the text
								Platform.runLater(() -> {
									// Add Pie Chart Data
									// if (totalLibraries > 0)
									// Main.loginMode.getSeries().getData().add(new
									// XYChart.Data<String,Number>(user.getUserName(), totalLibraries));

									// Update User Label
									user.getTotalLibrariesLabel().setText(Integer.toString(totalLibraries));
								});
							});

							// --User Description
							Optional.ofNullable(userInformationSettings.getProperty("User-Description"))
									.ifPresent(description -> Platform
											.runLater(() -> user.getDescriptionProperty().set(description)));

							// --Drop-Box-Accounts
							Optional.ofNullable(userInformationSettings.getProperty("DropBox-Access-Tokens"))
									.ifPresent(accessTokens -> {

										if (accessTokens.contains("<>:<>")) // Check if we have multiple access tokens
											Platform.runLater(() -> user.getDropBoxLabel().setText(Integer
													.toString(accessTokens.split(Pattern.quote("<>:<>")).length)));
										else if (!accessTokens.isEmpty()) // Check if we have one access token
											Platform.runLater(
													() -> user.getDropBoxLabel().setText(Integer.toString(1)));

									});

						} // If the UserInformation Properties File doesn't exit try to take
							// Total-Libraries information from the actual sqlite.db file
							// this process is slow as fu.ck that's why i am keeping information inside a
							// properties file generally...
						else {
							// System.out.println("UsersInformationDb doesn't Exists"); //debugging

							// Very well create the UsersInformationDb because it doesn't exist so on the
							// next load it will exist
							IOAction.createFileOrFolder(new File(DatabaseTool.getAbsoluteDatabasePathWithSeparator()
									+ user.getName() + File.separator + "settings"), FileType.DIRECTORY);
							IOAction.createFileOrFolder(new File(user.getUserInformationDb().getFileAbsolutePath()),
									FileType.FILE);

							// Check if the database of this user exists
							final String dbFileAbsolutePath = DatabaseTool.getAbsoluteDatabasePathWithSeparator() + user.getName()
									+ File.separator + "dbFile.db";
							if (new File(dbFileAbsolutePath).exists()) {

								// --Create connection and load user information
								try (Connection connection = DriverManager
										.getConnection("jdbc:sqlite:" + dbFileAbsolutePath);
										ResultSet dbCounter = connection.createStatement()
												.executeQuery("SELECT COUNT(NAME) FROM LIBRARIES;");) {

									final int[] totalLibraries = { 0 };
									totalLibraries[0] += dbCounter.getInt(1);
									Thread.sleep(500);

									// Refresh the text
									Platform.runLater(() -> {

										// Add Pie Chart Data
										// if (totalLibraries[0] > 0)
										// Main.loginMode.getSeries().getData().add(new
										// XYChart.Data<String,Number>(user.getUserName(), totalLibraries[0]));

										// Update User Label
										user.getTotalLibrariesLabel().setText(Integer.toString(totalLibraries[0]));

									});

									// Update the UserInformationDb so it is ready for the next time
									user.getUserInformationDb().updateProperty("Total-Libraries",
											String.valueOf(totalLibraries[0]));

									// System.out.println("User:" + user.getUserName() + " contains : " +
									// totalLibraries + " Libraries"); //debugging

									updateProgress(++counter[0], totalUsers);
								} catch (final Exception ex) {
									Main.logger.log(Level.SEVERE, "", ex);
								}

							} else {
								// Refresh the text
								Platform.runLater(() -> user.getTotalLibrariesLabel().setText("0"));

								// Update the UserInformationDb so it is ready for the next time
								user.getUserInformationDb().updateProperty("Total-Libraries", String.valueOf(0));
							}

						}

					});

				} catch (final Exception ex) {
					ex.printStackTrace();
				}

				return true;
			}
		};
	}

Replace Generic With Diamond Task<Boolean> with Task<> in method protected createTask() : Task<Boolean> from class com.goxr3plus.xr3player.services.loginmode.UsersLoaderService