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

				// For each given target directory
				targetDirectories.forEach(targetDirectory -> {
					if (isCancelled())
						return;

					// Update SmartController Description Label
					Platform.runLater(() -> smartController.getDescriptionLabel()
							.setText("Producing : " + IOInfo.getFileName(targetDirectory.getAbsolutePath())));

					try {

						// Create the targetDirectory
						if (fileType == FileType.DIRECTORY)
							targetDirectory.mkdir();

						// Keep a counter for the process
						count = 0;

						// ================Prepare based on the Files User want to Export=============

						if (filesToExport == FilesMode.CURRENT_PAGE) { // CURRENT_PAGE

							// Count total files that will be exported
							total = smartController.getItemsObservableList().size();
							Platform.runLater(() -> smartController.getDescriptionArea()
									.setText("\n Exporting Media.... \n\t Total -> [ " + total + " ]\n"));

							// Stream
							final Stream<String> stream =
									// Is Filter Mode Selected?
									!smartController.getFiltersModeTab().isSelected()
											? smartController.getItemsObservableList().stream().map(Media::getFilePath)
											: smartController.getFiltersMode().getMediaTableViewer().getTableView()
											.getItems().stream().map(Media::getFilePath);

							// Step 2
							proceedStream(stream, targetDirectory);

						} else if (filesToExport == FilesMode.SELECTED_MEDIA) { // SELECTED_FROM_CURRENT_PAGE

							// Count total files that will be exported
							total = smartController.getNormalModeMediaTableViewer().getSelectionModel()
									.getSelectedItems().size();
							Platform.runLater(() -> smartController.getDescriptionArea()
									.setText("\n Exporting Media.... \n\t Total -> [ " + total + " ]\n"));

							// Stream
							final Stream<String> stream =
									// Is Filter Mode Selected?
									(!smartController.getFiltersModeTab().isSelected())
											? smartController.getNormalModeMediaTableViewer().getSelectionModel()
											.getSelectedItems().stream().map(Media::getFilePath)
											: smartController.getFiltersMode().getMediaTableViewer().getTableView()
											.getSelectionModel().getSelectedItems().stream()
											.map(Media::getFilePath);

							// Step 2
							proceedStream(stream, targetDirectory);

						} else if (filesToExport == FilesMode.EVERYTHING_ON_PLAYLIST
								&& smartController.getGenre() != Genre.SEARCHWINDOW) { // EVERYTHING_ON_PLAYLIST

							// Count total files that will be exported
							total = smartController.getTotalInDataBase();
							Platform.runLater(() -> smartController.getDescriptionArea()
									.setText("\n Exporting Media.... \n\t Total -> [ " + total + " ]\n"));

							// Stream
							try (ResultSet resultSet = Main.dbManager.getConnection().createStatement()
									.executeQuery("SELECT* FROM '" + smartController.getDataBaseTableName() + "'");) {

								// Make a list of all the items
								final List<String> list = new ArrayList<>();

								// Fetch the items from the database
								while (resultSet.next())
									if (isCancelled())
										break;
									else {
										list.add(resultSet.getString("PATH"));
									}

								// Step 2
								proceedStream(list.stream(), targetDirectory);

							} catch (final Exception ex) {
								Main.logger.log(Level.WARNING, "", ex);
							}

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

				// Check if cancelled
				if (isCancelled())
					return false;
				else
					return true;
			}

			/**
			 * Proceed futher to complete the Service
			 *
			 * @param stream
			 */
			private void proceedStream(final Stream<String> stream, final File targetDirectory) {
				// DIRECTORY?
				if (fileType == FileType.DIRECTORY) {
					// For each item on stream
					stream.forEach(filePath -> {
						if (isCancelled())
							stream.close();
						else {
							passItem(filePath, targetDirectory);

							// Update the progress
							updateProgress(++count, total);
						}
					});
				} else if (fileType == FileType.ZIP) {
					try {
						ZipUtil.packEntries(stream.map(File::new).toArray(File[]::new), targetDirectory, fileName -> {
							if (isCancelled())
								return null;

							// Append Text to Description Area
							Platform.runLater(() -> smartController.getDescriptionArea()
									.appendText("\n Compressing ->" + fileName));

							// Update the progress
							updateProgress(++count, total);

							return fileName;
						});
					} catch (final Exception ex) {
						// Check if access is denied
						if (ex.getMessage().contains(
								"(The process cannot access the file because it is being used by another process)"))
							AlertTool.showNotification("Error Message", "[ "
											+ IOInfo.getFileName(targetDirectory.getAbsolutePath()) + " ]\n"
											+ "The process cannot access the file because it is being used by another process",
									Duration.seconds(4), NotificationType.ERROR);
						ex.printStackTrace();
					}
				}
			}

			/**
			 * Pass current File absolute Path
			 *
			 * @param sourceFilePath [ The Source File Absolute Path]
			 */
			private void passItem(final String sourceFilePath, final File destinationFolder) {
				if (!new File(sourceFilePath).exists())
					return;

				// Useful
				final String fileName = IOInfo.getFileName(sourceFilePath);
				final String destination = destinationFolder + File.separator + fileName;

				// Go
				if (operation == Operation.COPY) {
					Platform.runLater(
							() -> smartController.getDescriptionArea().appendText("\n Copying ->" + fileName));
					IOAction.copy(sourceFilePath, destination);
				} else {
					Platform.runLater(() -> smartController.getDescriptionArea().appendText("\n Moving ->" + fileName));
					IOAction.move(sourceFilePath, destination);
				}
			}
		};
	}

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

				// For each given target directory
				targetDirectories.forEach(targetDirectory -> {
					if (isCancelled())
						return;

					// Update SmartController Description Label
					Platform.runLater(() -> smartController.getDescriptionLabel()
							.setText("Producing : " + IOInfo.getFileName(targetDirectory.getAbsolutePath())));

					try {

						// Create the targetDirectory
						if (fileType == FileType.DIRECTORY)
							targetDirectory.mkdir();

						// Keep a counter for the process
						count = 0;

						// ================Prepare based on the Files User want to Export=============

						if (filesToExport == FilesMode.CURRENT_PAGE) { // CURRENT_PAGE

							// Count total files that will be exported
							total = smartController.getItemsObservableList().size();
							Platform.runLater(() -> smartController.getDescriptionArea()
									.setText("\n Exporting Media.... \n\t Total -> [ " + total + " ]\n"));

							// Stream
							final Stream<String> stream =
									// Is Filter Mode Selected?
									!smartController.getFiltersModeTab().isSelected()
											? smartController.getItemsObservableList().stream().map(Media::getFilePath)
											: smartController.getFiltersMode().getMediaTableViewer().getTableView()
													.getItems().stream().map(Media::getFilePath);

							// Step 2
							proceedStream(stream, targetDirectory);

						} else if (filesToExport == FilesMode.SELECTED_MEDIA) { // SELECTED_FROM_CURRENT_PAGE

							// Count total files that will be exported
							total = smartController.getNormalModeMediaTableViewer().getSelectionModel()
									.getSelectedItems().size();
							Platform.runLater(() -> smartController.getDescriptionArea()
									.setText("\n Exporting Media.... \n\t Total -> [ " + total + " ]\n"));

							// Stream
							final Stream<String> stream =
									// Is Filter Mode Selected?
									(!smartController.getFiltersModeTab().isSelected())
											? smartController.getNormalModeMediaTableViewer().getSelectionModel()
													.getSelectedItems().stream().map(Media::getFilePath)
											: smartController.getFiltersMode().getMediaTableViewer().getTableView()
													.getSelectionModel().getSelectedItems().stream()
													.map(Media::getFilePath);

							// Step 2
							proceedStream(stream, targetDirectory);

						} else if (filesToExport == FilesMode.EVERYTHING_ON_PLAYLIST
								&& smartController.getGenre() != Genre.SEARCHWINDOW) { // EVERYTHING_ON_PLAYLIST

							// Count total files that will be exported
							total = smartController.getTotalInDataBase();
							Platform.runLater(() -> smartController.getDescriptionArea()
									.setText("\n Exporting Media.... \n\t Total -> [ " + total + " ]\n"));

							// Stream
							try (ResultSet resultSet = Main.dbManager.getConnection().createStatement()
									.executeQuery("SELECT* FROM '" + smartController.getDataBaseTableName() + "'");) {

								// Make a list of all the items
								final List<String> list = new ArrayList<>();

								// Fetch the items from the database
								while (resultSet.next())
									if (isCancelled())
										break;
									else {
										list.add(resultSet.getString("PATH"));
									}

								// Step 2
								proceedStream(list.stream(), targetDirectory);

							} catch (final Exception ex) {
								Main.logger.log(Level.WARNING, "", ex);
							}

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

				// Check if cancelled
				if (isCancelled())
					return false;
				else
					return true;
			}

			/**
			 * Proceed futher to complete the Service
			 *
			 * @param stream
			 */
			private void proceedStream(final Stream<String> stream, final File targetDirectory) {
				// DIRECTORY?
				if (fileType == FileType.DIRECTORY) {
					// For each item on stream
					stream.forEach(filePath -> {
						if (isCancelled())
							stream.close();
						else {
							passItem(filePath, targetDirectory);

							// Update the progress
							updateProgress(++count, total);
						}
					});
				} else if (fileType == FileType.ZIP) {
					try {
						ZipUtil.packEntries(stream.map(File::new).toArray(File[]::new), targetDirectory, fileName -> {
							if (isCancelled())
								return null;

							// Append Text to Description Area
							Platform.runLater(() -> smartController.getDescriptionArea()
									.appendText("\n Compressing ->" + fileName));

							// Update the progress
							updateProgress(++count, total);

							return fileName;
						});
					} catch (final Exception ex) {
						// Check if access is denied
						if (ex.getMessage().contains(
								"(The process cannot access the file because it is being used by another process)"))
							AlertTool.showNotification("Error Message", "[ "
									+ IOInfo.getFileName(targetDirectory.getAbsolutePath()) + " ]\n"
									+ "The process cannot access the file because it is being used by another process",
									Duration.seconds(4), NotificationType.ERROR);
						ex.printStackTrace();
					}
				}
			}

			/**
			 * Pass current File absolute Path
			 *
			 * @param sourceFilePath [ The Source File Absolute Path]
			 */
			private void passItem(final String sourceFilePath, final File destinationFolder) {
				if (!new File(sourceFilePath).exists())
					return;

				// Useful
				final String fileName = IOInfo.getFileName(sourceFilePath);
				final String destination = destinationFolder + File.separator + fileName;

				// Go
				if (operation == Operation.COPY) {
					Platform.runLater(
							() -> smartController.getDescriptionArea().appendText("\n Copying ->" + fileName));
					IOAction.copy(sourceFilePath, destination);
				} else {
					Platform.runLater(() -> smartController.getDescriptionArea().appendText("\n Moving ->" + fileName));
					IOAction.move(sourceFilePath, destination);
				}
			}
		};
	}

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


	@Override
	protected Task<Void> createTask() {
		return new Task<>() {
			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Void call() throws Exception {

				// Create a new LinkedHashSet
				Set<String> set = new HashSet<>();
				List<Media> matchingMediaList = new ArrayList<>();

				try {

					// Total and Count = 0
					progress = totalProgress = 0;

					// ================Prepare based on the Files User want to Export=============
					if (smartControllerArtistsMode.getSmartController().getGenre() == Genre.SEARCHWINDOW) { // CURRENT_PAGE
						// System.out.println("Entered for Search Window");

						// Count total files that will be exported
						totalProgress = smartControllerArtistsMode.getSmartController().getItemsObservableList().size();

						// Stream
						Stream<Media> stream = smartControllerArtistsMode.getSmartController().getItemsObservableList()
								.stream();
						stream.forEach(media -> {
							if (!smartController.filtersModeSelected || isCancelled())
								stream.close();
							else {

								if (operation == Operation.REFRESH)

									// Add the artist
									set.add(findTagFromAudioFile(new File(media.getFilePath()), media));

								else {

									// Find the artist Name
									String filterVal = findTagFromAudioFile(new File(media.getFilePath()), media);

									// If it equals
									if (filterVal.equals(filterValue))
										matchingMediaList.add(media);

								}

								// Update the progress
								updateProgress(++progress, totalProgress);

							}
						});

					} else if (smartControllerArtistsMode.getSmartController().getGenre() != Genre.SEARCHWINDOW) { // EVERYTHING_ON_PLAYLIST

						// Count total files that will be exported
						totalProgress = smartControllerArtistsMode.getSmartController().getTotalInDataBase();

						// Stream
						String query = "SELECT" + (operation == Operation.UPDATE_TABLE_VIEW ? "*" : "(PATH)") + "FROM '"
								+ smartControllerArtistsMode.getSmartController().getDataBaseTableName() + "'";
						try (ResultSet resultSet = Main.dbManager.getConnection().createStatement()
								.executeQuery(query);) {

							int counter = 0;
							// Fetch the items from the database
							while (resultSet.next()) {
								// System.out.println("Is cancelled :?" + isCancelled());
								if (!smartController.filtersModeSelected || isCancelled())
									break;
								else {

									if (operation == Operation.REFRESH)

										// Add the artist
										set.add(findTagFromAudioFile(new File(resultSet.getString("PATH")), null));

									else {

										// Find the artist Name
										String filterVal = findTagFromAudioFile(new File(resultSet.getString("PATH")),
												null);

										// If it equals
										if (filterVal.equals(filterValue))
											// Add the Media
											matchingMediaList.add(new Audio(resultSet.getString("PATH"),
													resultSet.getDouble("STARS"), resultSet.getInt("TIMESPLAYED"),
													resultSet.getString("DATE"), resultSet.getString("HOUR"),
													smartControllerArtistsMode.getSmartController().getGenre(),
													++counter));

									}

									// Update the progress
									updateProgress(++progress, totalProgress);
								}
							}
						} catch (Exception ex) {
							Main.logger.log(Level.WARNING, "", ex);
						}

					}

					// Security check
					if (smartController.filtersModeSelected && !isCancelled()) {
						if (operation == Operation.REFRESH) {
							// For each item on set
							set.remove("");
							ObservableList<String> observableList = set.stream()
									.collect(Collectors.toCollection(FXCollections::observableArrayList));
							Platform.runLater(() -> {

								// Details Label text
								if (smartControllerArtistsMode.getSmartController().getTotalInDataBase() == 0) {
									smartControllerArtistsMode.getDetailsLabel().setText("Playlist has no songs");
									smartControllerArtistsMode.getDetailsLabel().setVisible(true);
								} else if (observableList.isEmpty()) {
									smartControllerArtistsMode.getNothingFoundLabel().setVisible(true);
								} else {
									smartControllerArtistsMode.getDetailsLabel().setVisible(false);
									smartControllerArtistsMode.getNothingFoundLabel().setVisible(false);
								}

								// Set list view items
								smartControllerArtistsMode.getListView().setItems(observableList);
								if (!observableList.isEmpty())
									smartControllerArtistsMode.getListView().getSelectionModel().select(0);
								else
									// Empty the TableView
									smartControllerArtistsMode.getMediaTableViewer().getTableView().getItems().clear();
							});
						} else if (operation == Operation.UPDATE_TABLE_VIEW) {
							// For each item on set
							ObservableList<Media> observableList = matchingMediaList.stream()
									.collect(Collectors.toCollection(FXCollections::observableArrayList));
							Platform.runLater(() -> {

								// Details Label text
								if (smartControllerArtistsMode.getSmartController().getTotalInDataBase() == 0) {
									smartControllerArtistsMode.getDetailsLabel().setText("Playlist has no songs");
									smartControllerArtistsMode.getDetailsLabel().setVisible(true);
									// } else if (smartControllerArtistsMode.getListView().getItems().isEmpty()) {
									// smartControllerArtistsMode.getDetailsLabel().setText("No artists found");
									// smartControllerArtistsMode.getDetailsLabel().setVisible(true);
								} else {
									smartControllerArtistsMode.getDetailsLabel().setVisible(false);
								}

								// Check if any songs are containing this artist
								if (!observableList.isEmpty()) {

									// Set list view items
									smartControllerArtistsMode.getMediaTableViewer().getTableView()
											.setItems(observableList);
									smartControllerArtistsMode.getSmartController().updateLabel();

									// Populate Media Information
									allDetailsService.restartService(smartControllerArtistsMode.getMediaTableViewer());
								} else {

									// Remove the artist from the List
									smartControllerArtistsMode.getListView().getItems().remove(filterValue);

									// Empty the TableView
									smartControllerArtistsMode.getMediaTableViewer().getTableView().getItems().clear();
								}

							});
						}
					}

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

				return null;

			}

			/**
			 * Return the artist of the given audio file (mp3) actually
			 *
			 * @param file  The audio File
			 * @param media The audio File in case it is already a Media Class File
			 * @return Return the artist of the given audio file (mp3) actually
			 */
			private String findTagFromAudioFile(File file, Media media) {
				// System.out.println(file.getName());

				// Check file existence , length and extension
				if (file.exists()
						&& "mp3".equals(
						media != null ? media.getFileType() : IOInfo.getFileExtension(file.getAbsolutePath()))
						&& file.length() != 0) {

					// MP3File
					MP3File mp3File;
					try {
						mp3File = new MP3File(file);
					} catch (IOException | TagException | ReadOnlyFileException | CannotReadException
							| InvalidAudioFrameException e) {
						// e.printStackTrace()
						return "";
					}

					// Does it have artist
					if (mp3File.hasID3v2Tag()) {

						ID3v24Tag tag = mp3File.getID3v2TagAsv24();

						if (filter == Filter.ARTIST)
							return tag.getFirst(ID3v24FieldKey.ARTIST);
						else if (filter == Filter.ALBUM)
							return tag.getFirst(ID3v24FieldKey.ALBUM);
						else if (filter == Filter.GENRE)
							return tag.getFirst(ID3v24FieldKey.GENRE);
						else if (filter == Filter.YEAR)
							return tag.getFirst(ID3v24FieldKey.YEAR);
						else if (filter == Filter.BPM)
							return tag.getFirst(ID3v24FieldKey.BPM);
						else if (filter == Filter.KEY)
							return tag.getFirst(ID3v24FieldKey.KEY);
						else if (filter == Filter.COMPOSER)
							return tag.getFirst(ID3v24FieldKey.COMPOSER);
						else if (filter == Filter.BIT_RATE)
							return mp3File.getMP3AudioHeader().getBitRate();

						// System.out.println("Artist : " + artist);// + " , Album Artist : " +
						// tag.getFirst(ID3v24FieldKey.ALBUM_ARTIST))

					} else if (mp3File.hasID3v1Tag()) {

						ID3v1Tag tag = mp3File.getID3v1Tag();

						if (filter == Filter.ARTIST)
							return tag.getFirst(ID3v1FieldKey.ARTIST.toString());
						else if (filter == Filter.ALBUM)
							return tag.getFirst(ID3v1FieldKey.ALBUM.toString());
						else if (filter == Filter.GENRE)
							return tag.getFirst(ID3v1FieldKey.GENRE.toString());
						else if (filter == Filter.YEAR)
							return tag.getFirst(ID3v1FieldKey.YEAR.toString());
					}

				}

				return "";
			}

		};
	}

	@Override
	protected Task<Void> createTask() {
		return new Task<Void>() {
			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Void call() throws Exception {

				// Create a new LinkedHashSet
				Set<String> set = new HashSet<>();
				List<Media> matchingMediaList = new ArrayList<>();

				try {

					// Total and Count = 0
					progress = totalProgress = 0;

					// ================Prepare based on the Files User want to Export=============
					if (smartControllerArtistsMode.getSmartController().getGenre() == Genre.SEARCHWINDOW) { // CURRENT_PAGE
						// System.out.println("Entered for Search Window");

						// Count total files that will be exported
						totalProgress = smartControllerArtistsMode.getSmartController().getItemsObservableList().size();

						// Stream
						Stream<Media> stream = smartControllerArtistsMode.getSmartController().getItemsObservableList()
								.stream();
						stream.forEach(media -> {
							if (!smartController.filtersModeSelected || isCancelled())
								stream.close();
							else {

								if (operation == Operation.REFRESH)

									// Add the artist
									set.add(findTagFromAudioFile(new File(media.getFilePath()), media));

								else {

									// Find the artist Name
									String filterVal = findTagFromAudioFile(new File(media.getFilePath()), media);

									// If it equals
									if (filterVal.equals(filterValue))
										matchingMediaList.add(media);

								}

								// Update the progress
								updateProgress(++progress, totalProgress);

							}
						});

					} else if (smartControllerArtistsMode.getSmartController().getGenre() != Genre.SEARCHWINDOW) { // EVERYTHING_ON_PLAYLIST

						// Count total files that will be exported
						totalProgress = smartControllerArtistsMode.getSmartController().getTotalInDataBase();

						// Stream
						String query = "SELECT" + (operation == Operation.UPDATE_TABLE_VIEW ? "*" : "(PATH)") + "FROM '"
								+ smartControllerArtistsMode.getSmartController().getDataBaseTableName() + "'";
						try (ResultSet resultSet = Main.dbManager.getConnection().createStatement()
								.executeQuery(query);) {

							int counter = 0;
							// Fetch the items from the database
							while (resultSet.next()) {
								// System.out.println("Is cancelled :?" + isCancelled());
								if (!smartController.filtersModeSelected || isCancelled())
									break;
								else {

									if (operation == Operation.REFRESH)

										// Add the artist
										set.add(findTagFromAudioFile(new File(resultSet.getString("PATH")), null));

									else {

										// Find the artist Name
										String filterVal = findTagFromAudioFile(new File(resultSet.getString("PATH")),
												null);

										// If it equals
										if (filterVal.equals(filterValue))
											// Add the Media
											matchingMediaList.add(new Audio(resultSet.getString("PATH"),
													resultSet.getDouble("STARS"), resultSet.getInt("TIMESPLAYED"),
													resultSet.getString("DATE"), resultSet.getString("HOUR"),
													smartControllerArtistsMode.getSmartController().getGenre(),
													++counter));

									}

									// Update the progress
									updateProgress(++progress, totalProgress);
								}
							}
						} catch (Exception ex) {
							Main.logger.log(Level.WARNING, "", ex);
						}

					}

					// Security check
					if (smartController.filtersModeSelected && !isCancelled()) {
						if (operation == Operation.REFRESH) {
							// For each item on set
							set.remove("");
							ObservableList<String> observableList = set.stream()
									.collect(Collectors.toCollection(FXCollections::observableArrayList));
							Platform.runLater(() -> {

								// Details Label text
								if (smartControllerArtistsMode.getSmartController().getTotalInDataBase() == 0) {
									smartControllerArtistsMode.getDetailsLabel().setText("Playlist has no songs");
									smartControllerArtistsMode.getDetailsLabel().setVisible(true);
								} else if (observableList.isEmpty()) {
									smartControllerArtistsMode.getNothingFoundLabel().setVisible(true);
								} else {
									smartControllerArtistsMode.getDetailsLabel().setVisible(false);
									smartControllerArtistsMode.getNothingFoundLabel().setVisible(false);
								}

								// Set list view items
								smartControllerArtistsMode.getListView().setItems(observableList);
								if (!observableList.isEmpty())
									smartControllerArtistsMode.getListView().getSelectionModel().select(0);
								else
									// Empty the TableView
									smartControllerArtistsMode.getMediaTableViewer().getTableView().getItems().clear();
							});
						} else if (operation == Operation.UPDATE_TABLE_VIEW) {
							// For each item on set
							ObservableList<Media> observableList = matchingMediaList.stream()
									.collect(Collectors.toCollection(FXCollections::observableArrayList));
							Platform.runLater(() -> {

								// Details Label text
								if (smartControllerArtistsMode.getSmartController().getTotalInDataBase() == 0) {
									smartControllerArtistsMode.getDetailsLabel().setText("Playlist has no songs");
									smartControllerArtistsMode.getDetailsLabel().setVisible(true);
									// } else if (smartControllerArtistsMode.getListView().getItems().isEmpty()) {
									// smartControllerArtistsMode.getDetailsLabel().setText("No artists found");
									// smartControllerArtistsMode.getDetailsLabel().setVisible(true);
								} else {
									smartControllerArtistsMode.getDetailsLabel().setVisible(false);
								}

								// Check if any songs are containing this artist
								if (!observableList.isEmpty()) {

									// Set list view items
									smartControllerArtistsMode.getMediaTableViewer().getTableView()
											.setItems(observableList);
									smartControllerArtistsMode.getSmartController().updateLabel();

									// Populate Media Information
									allDetailsService.restartService(smartControllerArtistsMode.getMediaTableViewer());
								} else {

									// Remove the artist from the List
									smartControllerArtistsMode.getListView().getItems().remove(filterValue);

									// Empty the TableView
									smartControllerArtistsMode.getMediaTableViewer().getTableView().getItems().clear();
								}

							});
						}
					}

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

				return null;

			}

			/**
			 * Return the artist of the given audio file (mp3) actually
			 *
			 * @param file  The audio File
			 * @param media The audio File in case it is already a Media Class File
			 * @return Return the artist of the given audio file (mp3) actually
			 */
			private String findTagFromAudioFile(File file, Media media) {
				// System.out.println(file.getName());

				// Check file existence , length and extension
				if (file.exists()
						&& "mp3".equals(
								media != null ? media.getFileType() : IOInfo.getFileExtension(file.getAbsolutePath()))
						&& file.length() != 0) {

					// MP3File
					MP3File mp3File;
					try {
						mp3File = new MP3File(file);
					} catch (IOException | TagException | ReadOnlyFileException | CannotReadException
							| InvalidAudioFrameException e) {
						// e.printStackTrace()
						return "";
					}

					// Does it have artist
					if (mp3File.hasID3v2Tag()) {

						ID3v24Tag tag = mp3File.getID3v2TagAsv24();

						if (filter == Filter.ARTIST)
							return tag.getFirst(ID3v24FieldKey.ARTIST);
						else if (filter == Filter.ALBUM)
							return tag.getFirst(ID3v24FieldKey.ALBUM);
						else if (filter == Filter.GENRE)
							return tag.getFirst(ID3v24FieldKey.GENRE);
						else if (filter == Filter.YEAR)
							return tag.getFirst(ID3v24FieldKey.YEAR);
						else if (filter == Filter.BPM)
							return tag.getFirst(ID3v24FieldKey.BPM);
						else if (filter == Filter.KEY)
							return tag.getFirst(ID3v24FieldKey.KEY);
						else if (filter == Filter.COMPOSER)
							return tag.getFirst(ID3v24FieldKey.COMPOSER);
						else if (filter == Filter.BIT_RATE)
							return mp3File.getMP3AudioHeader().getBitRate();

						// System.out.println("Artist : " + artist);// + " , Album Artist : " +
						// tag.getFirst(ID3v24FieldKey.ALBUM_ARTIST))

					} else if (mp3File.hasID3v1Tag()) {

						ID3v1Tag tag = mp3File.getID3v1Tag();

						if (filter == Filter.ARTIST)
							return tag.getFirst(ID3v1FieldKey.ARTIST.toString());
						else if (filter == Filter.ALBUM)
							return tag.getFirst(ID3v1FieldKey.ALBUM.toString());
						else if (filter == Filter.GENRE)
							return tag.getFirst(ID3v1FieldKey.GENRE.toString());
						else if (filter == Filter.YEAR)
							return tag.getFirst(ID3v1FieldKey.YEAR.toString());
					}

				}

				return "";
			}

		};
	}

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


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

				// Create a new LinkedHashSet
				Set<String> set = new LinkedHashSet<>();

				// Determine filesMode
				switch (((Control) Main.settingsWindow.getPlayListsSettingsController().getWhichFilesToShowGenerally()
						.getSelectedToggle()).getTooltip().getText()) {
					case "1":
						filesMode = FilesMode.SELECTED_MEDIA;
						break;
					case "2":
						filesMode = FilesMode.CURRENT_PAGE;
						break;
					case "3":
						filesMode = FilesMode.EVERYTHING_ON_PLAYLIST;
						break;
					default:
						filesMode = FilesMode.EVERYTHING_ON_PLAYLIST;
				}

				// Change Top Label Text
				Platform.runLater(() -> smartControllerFoldersMode.getTopLabel()
						.setText("Associated Folders Explorer -> " + filesMode.toString()));

				// Change Details Label Text
				Platform.runLater(() -> smartControllerFoldersMode.getDetailsLabel()
						.setText("No associated Folders found -> " + filesMode.toString()));

				try {

					// Total and Count = 0
					progress = totalProgress = 0;

					// ================Prepare based on the Files User want to Export=============

					if (filesMode == FilesMode.SELECTED_MEDIA) { // SELECTED_FROM_CURRENT_PAGE

						// Count total files that will be exported
						totalProgress = smartControllerFoldersMode.getSmartController().getNormalModeMediaTableViewer()
								.getSelectionModel().getSelectedItems().size();

						// Stream
						Stream<Media> stream = smartControllerFoldersMode.getSmartController()
								.getNormalModeMediaTableViewer().getSelectionModel().getSelectedItems().stream();
						stream.forEach(media -> {
							if (isCancelled())
								stream.close();
							else {
								// Add all the items to set
								set.add(new File(media.getFilePath()).getParentFile().getAbsolutePath());

								// Update the progress
								updateProgress(++progress, totalProgress);
							}
						});

					} else if (filesMode == FilesMode.CURRENT_PAGE
							|| smartControllerFoldersMode.getSmartController().getGenre() == Genre.SEARCHWINDOW) { // CURRENT_PAGE
						System.out.println("Entered for Search Window");

						// Count total files that will be exported
						totalProgress = smartControllerFoldersMode.getSmartController().getItemsObservableList().size();

						// Stream
						Stream<Media> stream = smartControllerFoldersMode.getSmartController().getItemsObservableList()
								.stream();
						stream.forEach(media -> {
							if (isCancelled())
								stream.close();
							else {
								// Add item path to the set
								set.add(new File(media.getFilePath()).getParentFile().getAbsolutePath());

								// Update the progress
								updateProgress(++progress, totalProgress);
							}
						});

					} else if (filesMode == FilesMode.EVERYTHING_ON_PLAYLIST
							&& smartControllerFoldersMode.getSmartController().getGenre() != Genre.SEARCHWINDOW) { // EVERYTHING_ON_PLAYLIST

						// Count total files that will be exported
						totalProgress = smartControllerFoldersMode.getSmartController().getTotalInDataBase();

						// Stream
						String query = "SELECT(PATH) FROM '"
								+ smartControllerFoldersMode.getSmartController().getDataBaseTableName() + "'";
						try (ResultSet resultSet = Main.dbManager.getConnection().createStatement()
								.executeQuery(query);) {

							// Fetch the items from the database
							while (resultSet.next())
								if (isCancelled())
									break;
								else {
									// Add all the items to set
									set.add(new File(resultSet.getString("PATH")).getParentFile().getAbsolutePath());

									// Update the progress
									updateProgress(++progress, totalProgress);
								}

						} catch (Exception ex) {
							Main.logger.log(Level.WARNING, "", ex);
						}

					}

					// For each item on set
					Platform.runLater(() -> {

						// Add all the items
						set.forEach(filePath -> {
							FileTreeItem treeItem = new FileTreeItem(filePath);
							treeItem.setValue(treeItem.getValue());

							// Add the item to the TreeView
							smartControllerFoldersMode.getRoot().getChildren().add(treeItem);

						});

						// Define if details label will be visible or not
						smartControllerFoldersMode.getDetailsLabel().setVisible(set.isEmpty());

						// Start FilesCounterService
						filesCounterService.restart();
					});

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

				return null;
			}

		};
	}

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

				// Create a new LinkedHashSet
				Set<String> set = new LinkedHashSet<>();

				// Determine filesMode
				switch (((Control) Main.settingsWindow.getPlayListsSettingsController().getWhichFilesToShowGenerally()
						.getSelectedToggle()).getTooltip().getText()) {
				case "1":
					filesMode = FilesMode.SELECTED_MEDIA;
					break;
				case "2":
					filesMode = FilesMode.CURRENT_PAGE;
					break;
				case "3":
					filesMode = FilesMode.EVERYTHING_ON_PLAYLIST;
					break;
				default:
					filesMode = FilesMode.EVERYTHING_ON_PLAYLIST;
				}

				// Change Top Label Text
				Platform.runLater(() -> smartControllerFoldersMode.getTopLabel()
						.setText("Associated Folders Explorer -> " + filesMode.toString()));

				// Change Details Label Text
				Platform.runLater(() -> smartControllerFoldersMode.getDetailsLabel()
						.setText("No associated Folders found -> " + filesMode.toString()));

				try {

					// Total and Count = 0
					progress = totalProgress = 0;

					// ================Prepare based on the Files User want to Export=============

					if (filesMode == FilesMode.SELECTED_MEDIA) { // SELECTED_FROM_CURRENT_PAGE

						// Count total files that will be exported
						totalProgress = smartControllerFoldersMode.getSmartController().getNormalModeMediaTableViewer()
								.getSelectionModel().getSelectedItems().size();

						// Stream
						Stream<Media> stream = smartControllerFoldersMode.getSmartController()
								.getNormalModeMediaTableViewer().getSelectionModel().getSelectedItems().stream();
						stream.forEach(media -> {
							if (isCancelled())
								stream.close();
							else {
								// Add all the items to set
								set.add(new File(media.getFilePath()).getParentFile().getAbsolutePath());

								// Update the progress
								updateProgress(++progress, totalProgress);
							}
						});

					} else if (filesMode == FilesMode.CURRENT_PAGE
							|| smartControllerFoldersMode.getSmartController().getGenre() == Genre.SEARCHWINDOW) { // CURRENT_PAGE
						System.out.println("Entered for Search Window");

						// Count total files that will be exported
						totalProgress = smartControllerFoldersMode.getSmartController().getItemsObservableList().size();

						// Stream
						Stream<Media> stream = smartControllerFoldersMode.getSmartController().getItemsObservableList()
								.stream();
						stream.forEach(media -> {
							if (isCancelled())
								stream.close();
							else {
								// Add item path to the set
								set.add(new File(media.getFilePath()).getParentFile().getAbsolutePath());

								// Update the progress
								updateProgress(++progress, totalProgress);
							}
						});

					} else if (filesMode == FilesMode.EVERYTHING_ON_PLAYLIST
							&& smartControllerFoldersMode.getSmartController().getGenre() != Genre.SEARCHWINDOW) { // EVERYTHING_ON_PLAYLIST

						// Count total files that will be exported
						totalProgress = smartControllerFoldersMode.getSmartController().getTotalInDataBase();

						// Stream
						String query = "SELECT(PATH) FROM '"
								+ smartControllerFoldersMode.getSmartController().getDataBaseTableName() + "'";
						try (ResultSet resultSet = Main.dbManager.getConnection().createStatement()
								.executeQuery(query);) {

							// Fetch the items from the database
							while (resultSet.next())
								if (isCancelled())
									break;
								else {
									// Add all the items to set
									set.add(new File(resultSet.getString("PATH")).getParentFile().getAbsolutePath());

									// Update the progress
									updateProgress(++progress, totalProgress);
								}

						} catch (Exception ex) {
							Main.logger.log(Level.WARNING, "", ex);
						}

					}

					// For each item on set
					Platform.runLater(() -> {

						// Add all the items
						set.forEach(filePath -> {
							FileTreeItem treeItem = new FileTreeItem(filePath);
							treeItem.setValue(treeItem.getValue());

							// Add the item to the TreeView
							smartControllerFoldersMode.getRoot().getChildren().add(treeItem);

						});

						// Define if details label will be visible or not
						smartControllerFoldersMode.getDetailsLabel().setVisible(set.isEmpty());

						// Start FilesCounterService
						filesCounterService.restart();
					});

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

				return null;
			}

		};
	}

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


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

			@Override
			protected Void call() throws Exception {

				// counter
				int counter = 0;

				// // calculate the total entries
				smartController.calculateTotalEntries();

				// when the final list is deleted then the controller
				// has to go to the previous list automatically
				if (smartController.getTotalInDataBase() != 0
						&& smartController.currentPageProperty().get() > smartController.getMaximumList())
					smartController.currentPageProperty().set(smartController.currentPageProperty().get() - 1);

				// Select the available Media Files
				String query = "SELECT* FROM '" + smartController.getDataBaseTableName() + "' LIMIT "
						+ smartController.getMaximumPerPage() + " OFFSET "
						+ smartController.currentPageProperty().get() * smartController.getMaximumPerPage();
				try (ResultSet resultSet = Main.dbManager.getConnection().createStatement().executeQuery(query);
					 ResultSet dbCounter = Main.dbManager.getConnection().createStatement().executeQuery(query)) {

					// Count how many items the result returned...
					int currentMaximumPerList = 0;
					while (dbCounter.next())
						++currentMaximumPerList;

					// Fetch the items from the database
					List<Media> array = new ArrayList<>();
					for (Audio song = null; resultSet.next(); ) {
						song = new Audio(resultSet.getString("PATH"), resultSet.getDouble("STARS"),
								resultSet.getInt("TIMESPLAYED"), resultSet.getString("DATE"),
								resultSet.getString("HOUR"), smartController.getGenre(), array.size() + 1);
						array.add(song);
						// Update the progress
						updateProgress(++counter, currentMaximumPerList);
					}

					// Add the the items to the observable list
					CountDownLatch countDown = new CountDownLatch(1);
					Platform.runLater(() -> {
						smartController.getItemsObservableList().addAll(array);
						countDown.countDown();
					});
					countDown.await();
					// }

					// commit?
					if (commit)
						Main.dbManager.commit();
				} catch (Exception ex) {
					Main.logger.log(Level.WARNING, "", ex);
				}

				return null;

			}
		};
	}

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

			@Override
			protected Void call() throws Exception {

				// counter
				int counter = 0;

				// // calculate the total entries
				smartController.calculateTotalEntries();

				// when the final list is deleted then the controller
				// has to go to the previous list automatically
				if (smartController.getTotalInDataBase() != 0
						&& smartController.currentPageProperty().get() > smartController.getMaximumList())
					smartController.currentPageProperty().set(smartController.currentPageProperty().get() - 1);

				// Select the available Media Files
				String query = "SELECT* FROM '" + smartController.getDataBaseTableName() + "' LIMIT "
						+ smartController.getMaximumPerPage() + " OFFSET "
						+ smartController.currentPageProperty().get() * smartController.getMaximumPerPage();
				try (ResultSet resultSet = Main.dbManager.getConnection().createStatement().executeQuery(query);
						ResultSet dbCounter = Main.dbManager.getConnection().createStatement().executeQuery(query)) {

					// Count how many items the result returned...
					int currentMaximumPerList = 0;
					while (dbCounter.next())
						++currentMaximumPerList;

					// Fetch the items from the database
					List<Media> array = new ArrayList<>();
					for (Audio song = null; resultSet.next();) {
						song = new Audio(resultSet.getString("PATH"), resultSet.getDouble("STARS"),
								resultSet.getInt("TIMESPLAYED"), resultSet.getString("DATE"),
								resultSet.getString("HOUR"), smartController.getGenre(), array.size() + 1);
						array.add(song);
						// Update the progress
						updateProgress(++counter, currentMaximumPerList);
					}

					// Add the the items to the observable list
					CountDownLatch countDown = new CountDownLatch(1);
					Platform.runLater(() -> {
						smartController.getItemsObservableList().addAll(array);
						countDown.countDown();
					});
					countDown.await();
					// }

					// commit?
					if (commit)
						Main.dbManager.commit();
				} catch (Exception ex) {
					Main.logger.log(Level.WARNING, "", ex);
				}

				return null;

			}
		};
	}

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


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

			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Boolean call() throws Exception {

				boolean[] success = {true};
				int[] counter = {0};
				int[] total = {mediaTableViewer.getSmartController().getItemsObservableList().size()};
				if (operation == AllDetailsServiceOperation.ALL)
					total[0] *= 2;

				// Add all the Tags to the Media
				if (operation == AllDetailsServiceOperation.ALL || operation == AllDetailsServiceOperation.TAGS) {
					// System.out.println("Refreshing Tags")

					// Try to do it
					mediaTableViewer.getTableView().getItems().stream().forEach(media -> {
						if (this.isCancelled())
							return;

						// Check file
						File file = new File(media.getFilePath());
						if (!file.exists())
							return;

						// Fields
						int bitrate = -1;
						String bpm = "";
						String artist = "";
						String mood = "";
						String album = "";
						String composer = "";
						String comment = "";
						String tempo = "";
						String genre = "";
						String year = "";
						String key = "";
						String copyright = "";
						String track = "";
						String trackTotal = "";
						String remixer = "";
						String djMixer = "";
						String rating = "";
						String producer = "";
						String performer = "";
						String orchestra = "";
						String country = "";
						String lyricist = "";
						String conductor = "";
						String amazonID = "";
						String encoder = "";

						try {

							// --------------------MP3--------------------------------
							if ("mp3".equals(media.getFileType())) {

								MP3File mp3File = new MP3File(file);

								// -- BitRate
								bitrate = (int) mp3File.getMP3AudioHeader().getBitRateAsNumber();

								// --------------Check if it has ID3V2Tag-------------------
								if (mp3File.hasID3v2Tag()) {

									// Keep it
									ID3v24Tag tag = mp3File.getID3v2TagAsv24();

									// -- BPM
									bpm = tag.getFirst(ID3v24FieldKey.BPM).trim();
									media.bpmProperty().set(bpm.isEmpty() ? -1 : (int) Double.parseDouble(bpm));

									// -- Artist
									artist = tag.getFirst(ID3v24FieldKey.ARTIST).trim();

									// -- Mood
									mood = tag.getFirst(ID3v24FieldKey.MOOD).trim();

									// -- Album
									album = tag.getFirst(ID3v24FieldKey.ALBUM).trim();

									// -- Composer
									composer = tag.getFirst(ID3v24FieldKey.COMPOSER).trim();

									// -- Comment
									comment = tag.getFirst(ID3v24FieldKey.COMMENT).trim();

									// -- Genre
									genre = tag.getFirst(ID3v24FieldKey.GENRE).trim();

									// -- Tempo
									tempo = tag.getFirst(ID3v24FieldKey.TEMPO).trim();

									// -- Key
									key = tag.getFirst(ID3v24FieldKey.KEY).trim();

									// -- Year
									year = tag.getFirst(ID3v24FieldKey.YEAR).trim();

									//

									// -- COPYRIGHT
									copyright = tag.getFirst(ID3v24FieldKey.COPYRIGHT).trim();

									// -- TRACK
									track = tag.getFirst(ID3v24FieldKey.TRACK).trim();

									// -- TRACK_TOTAL
									trackTotal = tag.getFirst(ID3v24FieldKey.TRACK_TOTAL).trim();

									// -- REMIXER
									remixer = tag.getFirst(ID3v24FieldKey.REMIXER).trim();

									// -- DJMIXER
									djMixer = tag.getFirst(ID3v24FieldKey.DJMIXER).trim();

									// -- RATING
									rating = tag.getFirst(ID3v24FieldKey.RATING).trim();

									// -- PRODUCER
									producer = tag.getFirst(ID3v24FieldKey.PRODUCER).trim();

									// -- PERFORMER
									performer = tag.getFirst(ID3v24FieldKey.PERFORMER).trim();

									// -- ORCHESTRA
									orchestra = tag.getFirst(ID3v24FieldKey.ORCHESTRA).trim();

									// -- COUNTRY
									country = tag.getFirst(ID3v24FieldKey.COUNTRY).trim();

									// -- LYRICIST
									lyricist = tag.getFirst(ID3v24FieldKey.LYRICIST).trim();

									// -- CONDUCTOR
									conductor = tag.getFirst(ID3v24FieldKey.CONDUCTOR).trim();

									// -- AMAZON_ID
									amazonID = tag.getFirst(ID3v24FieldKey.AMAZON_ID).trim();

									// -- ENCODER
									encoder = tag.getFirst(ID3v24FieldKey.ENCODER).trim();

								}

								// --------------Check if it has ID3V1Tag-------------------
								else if (mp3File.hasID3v1Tag()) {

									ID3v1Tag tag = mp3File.getID3v1Tag();

									// -- Artist
									artist = tag.getFirst(ID3v1FieldKey.ARTIST.toString()).trim();

									// -- Album
									album = tag.getFirst(ID3v1FieldKey.ALBUM.toString()).trim();

									// -- Comment
									comment = tag.getFirst(ID3v1FieldKey.COMMENT.toString()).trim();

									// -- Genre
									genre = tag.getFirst(ID3v1FieldKey.GENRE.toString()).trim();

									// -- Year
									year = tag.getFirst(ID3v1FieldKey.YEAR.toString()).trim();

								}

							}

						} catch (Exception e) {
							System.err.println("MediaTagsService problem : " + e.getMessage());
							success[0] = false;
						}

						// ----------------------Now fill all the
						// Properties------------------------------
						String emptyWord = "-";

						// -- BitRate
						media.bitRateProperty().set(bitrate);

						// -- BPM
						media.bpmProperty().set(bpm.isEmpty() ? -1 : (int) Double.parseDouble(bpm));

						// -- Artist
						media.artistProperty().set(artist.isEmpty() ? emptyWord : artist);

						// -- Mood
						media.moodProperty().set(mood.isEmpty() ? emptyWord : mood);

						// -- Album
						media.albumProperty().set(album.isEmpty() ? emptyWord : album);

						// -- Composer
						media.composerProperty().set(composer.isEmpty() ? emptyWord : composer);

						// -- Comment
						media.commentProperty().set(comment.isEmpty() ? emptyWord : comment);

						// -- Genre
						media.genreProperty().set(genre.isEmpty() ? emptyWord : genre);

						// -- Tempo
						media.tempoProperty().set(tempo.isEmpty() ? emptyWord : tempo);

						// -- Key
						media.keyProperty().set(key.isEmpty() ? emptyWord : key);

						// -- Year
						media.yearProperty().set(year.isEmpty() ? emptyWord : year);

						// -- COPYRIGHT
						media.copyrightProperty().set(copyright.isEmpty() ? emptyWord : copyright);

						// -- TRACK
						media.trackProperty().set(track.isEmpty() ? emptyWord : track);

						// -- TRACK_TOTAL
						media.track_totalProperty().set(trackTotal.isEmpty() ? emptyWord : trackTotal);

						// -- REMIXER
						media.remixerProperty().set(remixer.isEmpty() ? emptyWord : remixer);

						// -- DJMIXER
						media.djMixerProperty().set(djMixer.isEmpty() ? emptyWord : djMixer);

						// -- RATING
						media.ratingProperty().set(rating.isEmpty() ? emptyWord : rating);

						// -- PRODUCER
						media.producerProperty().set(producer.isEmpty() ? emptyWord : producer);

						// -- PERFORMER
						media.performerProperty().set(performer.isEmpty() ? emptyWord : performer);

						// -- ORCHESTRA
						media.orchestraProperty().set(orchestra.isEmpty() ? emptyWord : orchestra);

						// -- COUNTRY
						media.countryProperty().set(country.isEmpty() ? emptyWord : country);

						// -- LYRICIST
						media.lyricistProperty().set(lyricist.isEmpty() ? emptyWord : lyricist);

						// -- CONDUCTOR
						media.conductorProperty().set(conductor.isEmpty() ? emptyWord : conductor);

						// -- AMAZON_ID
						media.amazonIDProperty().set(amazonID.isEmpty() ? emptyWord : amazonID);

						// -- ENCODER
						media.encoderProperty().set(encoder.isEmpty() ? emptyWord : encoder);

						// Update the progress
						updateProgress(++counter[0], total[0]);
					});

				}

				// Try to do it for art work this time
				if (operation == AllDetailsServiceOperation.ALL
						|| operation == AllDetailsServiceOperation.ARTWORK_COLUMN) {
					Platform.runLater(() -> mediaTableViewer.getSmartController().getDescriptionLabel()
							.setText("Finding album artwork..."));

					// For each
					mediaTableViewer.getTableView().getItems().stream().forEach(media -> {
						if (this.isCancelled())
							return;

						// Update Progress
						updateProgress(++counter[0], total[0]);

						// Check file
						File file = new File(media.getFilePath());
						if (!file.exists())
							return;

						try {
							// Image can be null , remember.
							Image image = media.getAlbumImage();

							((ImageView) media.artworkProperty().get().getChildren().get(1)).setImage(image);
						} catch (Exception ex) {
							ex.printStackTrace();
						}

					});
				}

				return success[0];
			}

		};
	}

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

			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Boolean call() throws Exception {

				boolean[] success = { true };
				int[] counter = { 0 };
				int[] total = { mediaTableViewer.getSmartController().getItemsObservableList().size() };
				if (operation == AllDetailsServiceOperation.ALL)
					total[0] *= 2;

				// Add all the Tags to the Media
				if (operation == AllDetailsServiceOperation.ALL || operation == AllDetailsServiceOperation.TAGS) {
					// System.out.println("Refreshing Tags")

					// Try to do it
					mediaTableViewer.getTableView().getItems().stream().forEach(media -> {
						if (this.isCancelled())
							return;

						// Check file
						File file = new File(media.getFilePath());
						if (!file.exists())
							return;

						// Fields
						int bitrate = -1;
						String bpm = "";
						String artist = "";
						String mood = "";
						String album = "";
						String composer = "";
						String comment = "";
						String tempo = "";
						String genre = "";
						String year = "";
						String key = "";
						String copyright = "";
						String track = "";
						String trackTotal = "";
						String remixer = "";
						String djMixer = "";
						String rating = "";
						String producer = "";
						String performer = "";
						String orchestra = "";
						String country = "";
						String lyricist = "";
						String conductor = "";
						String amazonID = "";
						String encoder = "";

						try {

							// --------------------MP3--------------------------------
							if ("mp3".equals(media.getFileType())) {

								MP3File mp3File = new MP3File(file);

								// -- BitRate
								bitrate = (int) mp3File.getMP3AudioHeader().getBitRateAsNumber();

								// --------------Check if it has ID3V2Tag-------------------
								if (mp3File.hasID3v2Tag()) {

									// Keep it
									ID3v24Tag tag = mp3File.getID3v2TagAsv24();

									// -- BPM
									bpm = tag.getFirst(ID3v24FieldKey.BPM).trim();
									media.bpmProperty().set(bpm.isEmpty() ? -1 : (int) Double.parseDouble(bpm));

									// -- Artist
									artist = tag.getFirst(ID3v24FieldKey.ARTIST).trim();

									// -- Mood
									mood = tag.getFirst(ID3v24FieldKey.MOOD).trim();

									// -- Album
									album = tag.getFirst(ID3v24FieldKey.ALBUM).trim();

									// -- Composer
									composer = tag.getFirst(ID3v24FieldKey.COMPOSER).trim();

									// -- Comment
									comment = tag.getFirst(ID3v24FieldKey.COMMENT).trim();

									// -- Genre
									genre = tag.getFirst(ID3v24FieldKey.GENRE).trim();

									// -- Tempo
									tempo = tag.getFirst(ID3v24FieldKey.TEMPO).trim();

									// -- Key
									key = tag.getFirst(ID3v24FieldKey.KEY).trim();

									// -- Year
									year = tag.getFirst(ID3v24FieldKey.YEAR).trim();

									//

									// -- COPYRIGHT
									copyright = tag.getFirst(ID3v24FieldKey.COPYRIGHT).trim();

									// -- TRACK
									track = tag.getFirst(ID3v24FieldKey.TRACK).trim();

									// -- TRACK_TOTAL
									trackTotal = tag.getFirst(ID3v24FieldKey.TRACK_TOTAL).trim();

									// -- REMIXER
									remixer = tag.getFirst(ID3v24FieldKey.REMIXER).trim();

									// -- DJMIXER
									djMixer = tag.getFirst(ID3v24FieldKey.DJMIXER).trim();

									// -- RATING
									rating = tag.getFirst(ID3v24FieldKey.RATING).trim();

									// -- PRODUCER
									producer = tag.getFirst(ID3v24FieldKey.PRODUCER).trim();

									// -- PERFORMER
									performer = tag.getFirst(ID3v24FieldKey.PERFORMER).trim();

									// -- ORCHESTRA
									orchestra = tag.getFirst(ID3v24FieldKey.ORCHESTRA).trim();

									// -- COUNTRY
									country = tag.getFirst(ID3v24FieldKey.COUNTRY).trim();

									// -- LYRICIST
									lyricist = tag.getFirst(ID3v24FieldKey.LYRICIST).trim();

									// -- CONDUCTOR
									conductor = tag.getFirst(ID3v24FieldKey.CONDUCTOR).trim();

									// -- AMAZON_ID
									amazonID = tag.getFirst(ID3v24FieldKey.AMAZON_ID).trim();

									// -- ENCODER
									encoder = tag.getFirst(ID3v24FieldKey.ENCODER).trim();

								}

								// --------------Check if it has ID3V1Tag-------------------
								else if (mp3File.hasID3v1Tag()) {

									ID3v1Tag tag = mp3File.getID3v1Tag();

									// -- Artist
									artist = tag.getFirst(ID3v1FieldKey.ARTIST.toString()).trim();

									// -- Album
									album = tag.getFirst(ID3v1FieldKey.ALBUM.toString()).trim();

									// -- Comment
									comment = tag.getFirst(ID3v1FieldKey.COMMENT.toString()).trim();

									// -- Genre
									genre = tag.getFirst(ID3v1FieldKey.GENRE.toString()).trim();

									// -- Year
									year = tag.getFirst(ID3v1FieldKey.YEAR.toString()).trim();

								}

							}

						} catch (Exception e) {
							System.err.println("MediaTagsService problem : " + e.getMessage());
							success[0] = false;
						}

						// ----------------------Now fill all the
						// Properties------------------------------
						String emptyWord = "-";

						// -- BitRate
						media.bitRateProperty().set(bitrate);

						// -- BPM
						media.bpmProperty().set(bpm.isEmpty() ? -1 : (int) Double.parseDouble(bpm));

						// -- Artist
						media.artistProperty().set(artist.isEmpty() ? emptyWord : artist);

						// -- Mood
						media.moodProperty().set(mood.isEmpty() ? emptyWord : mood);

						// -- Album
						media.albumProperty().set(album.isEmpty() ? emptyWord : album);

						// -- Composer
						media.composerProperty().set(composer.isEmpty() ? emptyWord : composer);

						// -- Comment
						media.commentProperty().set(comment.isEmpty() ? emptyWord : comment);

						// -- Genre
						media.genreProperty().set(genre.isEmpty() ? emptyWord : genre);

						// -- Tempo
						media.tempoProperty().set(tempo.isEmpty() ? emptyWord : tempo);

						// -- Key
						media.keyProperty().set(key.isEmpty() ? emptyWord : key);

						// -- Year
						media.yearProperty().set(year.isEmpty() ? emptyWord : year);

						// -- COPYRIGHT
						media.copyrightProperty().set(copyright.isEmpty() ? emptyWord : copyright);

						// -- TRACK
						media.trackProperty().set(track.isEmpty() ? emptyWord : track);

						// -- TRACK_TOTAL
						media.track_totalProperty().set(trackTotal.isEmpty() ? emptyWord : trackTotal);

						// -- REMIXER
						media.remixerProperty().set(remixer.isEmpty() ? emptyWord : remixer);

						// -- DJMIXER
						media.djMixerProperty().set(djMixer.isEmpty() ? emptyWord : djMixer);

						// -- RATING
						media.ratingProperty().set(rating.isEmpty() ? emptyWord : rating);

						// -- PRODUCER
						media.producerProperty().set(producer.isEmpty() ? emptyWord : producer);

						// -- PERFORMER
						media.performerProperty().set(performer.isEmpty() ? emptyWord : performer);

						// -- ORCHESTRA
						media.orchestraProperty().set(orchestra.isEmpty() ? emptyWord : orchestra);

						// -- COUNTRY
						media.countryProperty().set(country.isEmpty() ? emptyWord : country);

						// -- LYRICIST
						media.lyricistProperty().set(lyricist.isEmpty() ? emptyWord : lyricist);

						// -- CONDUCTOR
						media.conductorProperty().set(conductor.isEmpty() ? emptyWord : conductor);

						// -- AMAZON_ID
						media.amazonIDProperty().set(amazonID.isEmpty() ? emptyWord : amazonID);

						// -- ENCODER
						media.encoderProperty().set(encoder.isEmpty() ? emptyWord : encoder);

						// Update the progress
						updateProgress(++counter[0], total[0]);
					});

				}

				// Try to do it for art work this time
				if (operation == AllDetailsServiceOperation.ALL
						|| operation == AllDetailsServiceOperation.ARTWORK_COLUMN) {
					Platform.runLater(() -> mediaTableViewer.getSmartController().getDescriptionLabel()
							.setText("Finding album artwork..."));

					// For each
					mediaTableViewer.getTableView().getItems().stream().forEach(media -> {
						if (this.isCancelled())
							return;

						// Update Progress
						updateProgress(++counter[0], total[0]);

						// Check file
						File file = new File(media.getFilePath());
						if (!file.exists())
							return;

						try {
							// Image can be null , remember.
							Image image = media.getAlbumImage();

							((ImageView) media.artworkProperty().get().getChildren().get(1)).setImage(image);
						} catch (Exception ex) {
							ex.printStackTrace();
						}

					});
				}

				return success[0];
			}

		};
	}

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


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

			@Override
			protected Void call() throws Exception {

				// counter
				int[] counter = {0};
				int total = smartController.getItemsObservableList().size();

				// Update Message
				updateMessage("Generating album views");

				// Update the Viewer
				List<Node> mediaList = smartController.getItemsObservableList().stream().map(media -> {

					// Update Progress
					updateProgress(++counter[0], total);

					// Create MediViewer
					MediaViewer mediaViewer = new MediaViewer(media);

					try {
						// Image can be null , remember.
						Image image = media.getAlbumImage();

						// Image exists?
						if (image != null) {
							mediaViewer.getImageView().setImage(image);
							mediaViewer.getNameLabel().setVisible(false);
						} else {
							mediaViewer.getNameLabel().setText(media.getTitle());
							mediaViewer.getNameLabel().setVisible(true);
						}

						// --Drag Detected
						mediaViewer.setOnDragDetected(event -> {

							/* allow copy transfer mode */
							Dragboard db = mediaViewer.startDragAndDrop(TransferMode.COPY, TransferMode.LINK);

							/* put a string on drag board */
							ClipboardContent content = new ClipboardContent();

							// PutFiles
							content.putFiles(Arrays.asList(new File(media.getFilePath())));

							// Set DragView
							DragViewTool.setDragView(db, media);

							// Set Content
							db.setContent(content);

							event.consume();
						});
					} catch (Exception ex) {
						ex.printStackTrace();
					}

					return mediaViewer;
				}).collect(Collectors.toList());

				// Run on JavaFX Thread
				Platform.runLater(() -> smartController.getMediaViewer().addMultipleItems(mediaList));

				return null;
			}
		};
	}

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

			@Override
			protected Void call() throws Exception {

				// counter
				int[] counter = { 0 };
				int total = smartController.getItemsObservableList().size();

				// Update Message
				updateMessage("Generating album views");

				// Update the Viewer
				List<Node> mediaList = smartController.getItemsObservableList().stream().map(media -> {

					// Update Progress
					updateProgress(++counter[0], total);

					// Create MediViewer
					MediaViewer mediaViewer = new MediaViewer(media);

					try {
						// Image can be null , remember.
						Image image = media.getAlbumImage();

						// Image exists?
						if (image != null) {
							mediaViewer.getImageView().setImage(image);
							mediaViewer.getNameLabel().setVisible(false);
						} else {
							mediaViewer.getNameLabel().setText(media.getTitle());
							mediaViewer.getNameLabel().setVisible(true);
						}

						// --Drag Detected
						mediaViewer.setOnDragDetected(event -> {

							/* allow copy transfer mode */
							Dragboard db = mediaViewer.startDragAndDrop(TransferMode.COPY, TransferMode.LINK);

							/* put a string on drag board */
							ClipboardContent content = new ClipboardContent();

							// PutFiles
							content.putFiles(Arrays.asList(new File(media.getFilePath())));

							// Set DragView
							DragViewTool.setDragView(db, media);

							// Set Content
							db.setContent(content);

							event.consume();
						});
					} catch (Exception ex) {
						ex.printStackTrace();
					}

					return mediaViewer;
				}).collect(Collectors.toList());

				// Run on JavaFX Thread
				Platform.runLater(() -> smartController.getMediaViewer().addMultipleItems(mediaList));

				return null;
			}
		};
	}

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


	@Override
	protected Task<Void> createTask() {
		return new Task<>() {
			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Void call() throws Exception {

				// Counter
				counter = 0;

				// if (word.isEmpty())
				// word = "";

				// Given Work
				System.out.println("Searching for word:[" + word + "]");
				String query = "";

				// --------------SEARCH WINDOW SPECIAL SEARCH----------------------------

				if (smartController.getGenre() == Genre.SEARCHWINDOW) {

					// Let's create the UNION
					ArrayList<String> queryArray = new ArrayList<>();
					ObservableList<Node> observableList = Main.libraryMode.viewer.getItemsObservableList();
					smartController.setTotalInDataBase(
							observableList.stream().mapToInt(library -> ((Library) library).getTotalEntries()).sum());

					// Check if any PlayLists exist
					if (observableList.isEmpty()) {
						return null;
					}

					queryArray.add("SELECT * FROM (");

					// For Each
					Main.libraryMode.viewer.getItemsObservableList().forEach(lib -> {
						if (observableList.indexOf(lib) != observableList.size() - 1)
							queryArray
									.add(" SELECT * FROM '" + ((Library) lib).getDataBaseTableName() + "' UNION ALL ");
						else
							queryArray.add(" SELECT * FROM '" + ((Library) lib).getDataBaseTableName() + "' ");
					});

					// Choose the correct query based on the settings of the user
					if (Main.settingsWindow.getPlayListsSettingsController().getFileSearchGroup().getToggles().get(0)
							.isSelected())
						queryArray.add(" ) WHERE PATH LIKE '%" + word + "%' GROUP BY PATH LIMIT "
								+ smartController.getMaximumPerPage() + " ");
					else
						queryArray.add(" ) WHERE replace(path, rtrim(path, replace(path,'" + File.separator
								+ "','')),'') LIKE '%" + word + "%' GROUP BY PATH LIMIT "
								+ smartController.getMaximumPerPage() + " ");

					query = String.join("", queryArray);
					// System.out.println(query)

				}

				// --------------NORMAL PLAYLISTS SEARCH----------------------------

				else {
					query = "SELECT * FROM '" + smartController.getDataBaseTableName() + "' ";

					String wordQuery = smartController.getAlphabetBar().isLetterPressed() ? word + "%"
							: ("%" + word + "%");

					// Choose the correct query based on the settings of the user
					if (Main.settingsWindow.getPlayListsSettingsController().getFileSearchGroup().getToggles().get(0)
							.isSelected())
						query = query + " WHERE PATH LIKE '" + wordQuery + "' LIMIT "
								+ smartController.getMaximumPerPage();
					else
						query = query + " WHERE replace(path, rtrim(path, replace(path, '" + File.separator
								+ "', '')), '') LIKE '" + wordQuery + "' LIMIT " + smartController.getMaximumPerPage();
				}

				// System.out.println(query);

				// Continue
				try (ResultSet resultSet = Main.dbManager.getConnection().createStatement().executeQuery(query)) {
					// try (ResultSet resultSet =
					// Main.dbManager.connection1.createStatement().executeQuery(query)) {

					// Fetch the items from the database
					Platform.runLater(() -> smartController.getCancelButton().setText("Adding data..."));
					List<Media> arrayList = new ArrayList<>();
					while (resultSet.next()) {
						// Add the Audio to the ArrayList
						arrayList.add(new Audio(resultSet.getString("PATH"), resultSet.getDouble("STARS"),
								resultSet.getInt("TIMESPLAYED"), resultSet.getString("DATE"),
								resultSet.getString("HOUR"), smartController.getGenre(), arrayList.size() + 1));

						updateProgress(++counter, smartController.getMaximumPerPage());
					}

					// Show 100%
					updateProgress(smartController.getMaximumPerPage(), smartController.getMaximumPerPage());

					// Add the the items to the observable list
					CountDownLatch countDown = new CountDownLatch(1);
					Platform.runLater(() -> {
						smartController.getItemsObservableList().addAll(arrayList);
						smartController.getNormalModeMediaTableViewer().getAllDetailsService()
								.restartService(smartController.getNormalModeMediaTableViewer());
						countDown.countDown();
					});
					countDown.await();

				} catch (Exception ex) {
					Main.logger.log(Level.WARNING, "", ex);
				}

				return null;
			}

		};
	}

	@Override
	protected Task<Void> createTask() {
		return new Task<Void>() {
			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Void call() throws Exception {

				// Counter
				counter = 0;

				// if (word.isEmpty())
				// word = "";

				// Given Work
				System.out.println("Searching for word:[" + word + "]");
				String query = "";

				// --------------SEARCH WINDOW SPECIAL SEARCH----------------------------

				if (smartController.getGenre() == Genre.SEARCHWINDOW) {

					// Let's create the UNION
					ArrayList<String> queryArray = new ArrayList<>();
					ObservableList<Node> observableList = Main.libraryMode.viewer.getItemsObservableList();
					smartController.setTotalInDataBase(
							observableList.stream().mapToInt(library -> ((Library) library).getTotalEntries()).sum());

					// Check if any PlayLists exist
					if (observableList.isEmpty()) {
						return null;
					}

					queryArray.add("SELECT * FROM (");

					// For Each
					Main.libraryMode.viewer.getItemsObservableList().forEach(lib -> {
						if (observableList.indexOf(lib) != observableList.size() - 1)
							queryArray
									.add(" SELECT * FROM '" + ((Library) lib).getDataBaseTableName() + "' UNION ALL ");
						else
							queryArray.add(" SELECT * FROM '" + ((Library) lib).getDataBaseTableName() + "' ");
					});

					// Choose the correct query based on the settings of the user
					if (Main.settingsWindow.getPlayListsSettingsController().getFileSearchGroup().getToggles().get(0)
							.isSelected())
						queryArray.add(" ) WHERE PATH LIKE '%" + word + "%' GROUP BY PATH LIMIT "
								+ smartController.getMaximumPerPage() + " ");
					else
						queryArray.add(" ) WHERE replace(path, rtrim(path, replace(path,'" + File.separator
								+ "','')),'') LIKE '%" + word + "%' GROUP BY PATH LIMIT "
								+ smartController.getMaximumPerPage() + " ");

					query = String.join("", queryArray);
					// System.out.println(query)

				}

				// --------------NORMAL PLAYLISTS SEARCH----------------------------

				else {
					query = "SELECT * FROM '" + smartController.getDataBaseTableName() + "' ";

					String wordQuery = smartController.getAlphabetBar().isLetterPressed() ? word + "%"
							: ("%" + word + "%");

					// Choose the correct query based on the settings of the user
					if (Main.settingsWindow.getPlayListsSettingsController().getFileSearchGroup().getToggles().get(0)
							.isSelected())
						query = query + " WHERE PATH LIKE '" + wordQuery + "' LIMIT "
								+ smartController.getMaximumPerPage();
					else
						query = query + " WHERE replace(path, rtrim(path, replace(path, '" + File.separator
								+ "', '')), '') LIKE '" + wordQuery + "' LIMIT " + smartController.getMaximumPerPage();
				}

				// System.out.println(query);

				// Continue
				try (ResultSet resultSet = Main.dbManager.getConnection().createStatement().executeQuery(query)) {
					// try (ResultSet resultSet =
					// Main.dbManager.connection1.createStatement().executeQuery(query)) {

					// Fetch the items from the database
					Platform.runLater(() -> smartController.getCancelButton().setText("Adding data..."));
					List<Media> arrayList = new ArrayList<>();
					while (resultSet.next()) {
						// Add the Audio to the ArrayList
						arrayList.add(new Audio(resultSet.getString("PATH"), resultSet.getDouble("STARS"),
								resultSet.getInt("TIMESPLAYED"), resultSet.getString("DATE"),
								resultSet.getString("HOUR"), smartController.getGenre(), arrayList.size() + 1));

						updateProgress(++counter, smartController.getMaximumPerPage());
					}

					// Show 100%
					updateProgress(smartController.getMaximumPerPage(), smartController.getMaximumPerPage());

					// Add the the items to the observable list
					CountDownLatch countDown = new CountDownLatch(1);
					Platform.runLater(() -> {
						smartController.getItemsObservableList().addAll(arrayList);
						smartController.getNormalModeMediaTableViewer().getAllDetailsService()
								.restartService(smartController.getNormalModeMediaTableViewer());
						countDown.countDown();
					});
					countDown.await();

				} catch (Exception ex) {
					Main.logger.log(Level.WARNING, "", ex);
				}

				return null;
			}

		};
	}

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


	@Override
	protected Task<Void> createTask() {
		return new Task<>() {
			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Void call() throws Exception {

				if (operation == Operation.SEARCH) { // Operation.SEARCH

					// Go
					Optional.ofNullable(findElementMatching(treeViewManager.getRoot(), searchText))
							.ifPresent(item -> Platform.runLater(() -> {

								// Select an item
								treeViewManager.getTreeView().getSelectionModel().clearSelection();
								treeViewManager.getTreeView().getSelectionModel().select(item);

								// Scroll To
								treeViewManager.getTreeView().scrollTo(treeViewManager.getTreeView().getRow(item));
							}));

				} else if (operation == Operation.RENAME) {// Operation.RENAME

					// Search for it if exists in the Tree
					Optional.ofNullable(findElementMatching2(treeViewManager.getRoot(), oldFilePath)).ifPresent(
							// If present
							item -> Platform.runLater(() -> ((FileTreeItem) item).setAbsoluteFilePath(newFilePath)));

				}

				return null;
			}

			/**
			 * Run all the children of given TreeItem and return back the one matching the
			 * value if any
			 *
			 * @param item
			 * @param value
			 * @return
			 */
			private TreeItem<String> findElementMatching(TreeItem<String> item, String value) {
				if (item != null && item.getValue().toLowerCase().contains(value))
					return item;

				// Loop
				for (TreeItem<String> child : item.getChildren()) {
					TreeItem<String> s = findElementMatching(child, value);
					if (s != null)
						return s;

				}
				return null;
			}

			/**
			 * This method is the same with the above though i am using it for file renaming
			 *
			 * @param item
			 * @param fileAbsolutePath
			 * @return
			 */
			private TreeItem<String> findElementMatching2(TreeItem<String> item, String fileAbsolutePath) {
				if (item != null && ((FileTreeItem) item).getAbsoluteFilePath().equals(fileAbsolutePath))
					return item;

				// Loop
				for (TreeItem<String> child : item.getChildren()) {
					TreeItem<String> s = findElementMatching2(child, fileAbsolutePath);
					if (s != null)
						return s;

				}
				return null;
			}

		};
	}

	@Override
	protected Task<Void> createTask() {
		return new Task<Void>() {
			/**
			 * [[SuppressWarningsSpartan]]
			 */
			@Override
			protected Void call() throws Exception {

				if (operation == Operation.SEARCH) { // Operation.SEARCH

					// Go
					Optional.ofNullable(findElementMatching(treeViewManager.getRoot(), searchText))
							.ifPresent(item -> Platform.runLater(() -> {

								// Select an item
								treeViewManager.getTreeView().getSelectionModel().clearSelection();
								treeViewManager.getTreeView().getSelectionModel().select(item);

								// Scroll To
								treeViewManager.getTreeView().scrollTo(treeViewManager.getTreeView().getRow(item));
							}));

				} else if (operation == Operation.RENAME) {// Operation.RENAME

					// Search for it if exists in the Tree
					Optional.ofNullable(findElementMatching2(treeViewManager.getRoot(), oldFilePath)).ifPresent(
							// If present
							item -> Platform.runLater(() -> ((FileTreeItem) item).setAbsoluteFilePath(newFilePath)));

				}

				return null;
			}

			/**
			 * Run all the children of given TreeItem and return back the one matching the
			 * value if any
			 *
			 * @param item
			 * @param value
			 * @return
			 */
			private TreeItem<String> findElementMatching(TreeItem<String> item, String value) {
				if (item != null && item.getValue().toLowerCase().contains(value))
					return item;

				// Loop
				for (TreeItem<String> child : item.getChildren()) {
					TreeItem<String> s = findElementMatching(child, value);
					if (s != null)
						return s;

				}
				return null;
			}

			/**
			 * This method is the same with the above though i am using it for file renaming
			 *
			 * @param item
			 * @param fileAbsolutePath
			 * @return
			 */
			private TreeItem<String> findElementMatching2(TreeItem<String> item, String fileAbsolutePath) {
				if (item != null && ((FileTreeItem) item).getAbsoluteFilePath().equals(fileAbsolutePath))
					return item;

				// Loop
				for (TreeItem<String> child : item.getChildren()) {
					TreeItem<String> s = findElementMatching2(child, fileAbsolutePath);
					if (s != null)
						return s;

				}
				return null;
			}

		};
	}

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


	@Override
	protected Task<Boolean> createTask() {
		return new Task<>() {
			@Override
			protected Boolean call() throws Exception {
				boolean succeeded = true;

				try {

					// Stop the previous audio
					updateMessage("Stop previous...");
					xPlayerController.xPlayer.stop();

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

				// Set Message
				updateMessage("Converting ( " + IOInfo.getFileExtension(fileAbsolutePath) + " ) to ( mp3 )");

				// Create the media folder if not existing
				final String folderName = DatabaseTool.getAbsoluteDatabaseParentFolderPathWithSeparator() + "Media";
				if (!IOAction.createFileOrFolder(folderName, FileType.DIRECTORY)) {
					AlertTool.showNotification("Internal Error", "Can't create Media Folder for converted files",
							Duration.seconds(4), NotificationType.WARNING);
					succeeded = false;
				}

				// Check if it is already .mp3
				if (!"mp3".equals(IOInfo.getFileExtension(fileAbsolutePath))) {
					newFileAsbolutePath = folderName + File.separator + IOInfo.getFileTitle(fileAbsolutePath) + ".mp3";

					// Convert any audio format to .mp3
					try {

						// Files
						final File source = new File(fileAbsolutePath);
						final File target = new File(newFileAsbolutePath);

						// Audio Attributes
						final AudioAttributes audio = new AudioAttributes();
						audio.setCodec("libmp3lame");
						audio.setBitRate(128000);
						audio.setChannels(2);
						audio.setSamplingRate(44100);

						// Encoding attributes
						final EncodingAttributes attrs = new EncodingAttributes();
						attrs.setFormat("mp3");
						attrs.setAudioAttributes(audio);

						// Encode
						if (encoder != null)
							encoder.abortEncoding();
						encoder = encoder != null ? encoder : new Encoder();
						encoder.encode(new MultimediaObject(source), target, attrs, listener);

					} catch (final Exception ex) {
						ex.printStackTrace();
						succeeded = false;
					}
				} else
					newFileAsbolutePath = fileAbsolutePath;

				// Set Message
				super.updateMessage("Convert finished...");

				// System.out.println("After the error")

				// Check if succeeded
				if (succeeded)
					Platform.runLater(() -> xPlayerController.playSong(newFileAsbolutePath));
				else
					AlertTool.showNotification("Convert failed", "Couldn't convert given media to .mp3 ",
							Duration.seconds(4), NotificationType.WARNING);

				return true;
			}
		};
	}

	@Override
	protected Task<Boolean> createTask() {
		return new Task<Boolean>() {
			@Override
			protected Boolean call() throws Exception {
				boolean succeeded = true;

				try {

					// Stop the previous audio
					updateMessage("Stop previous...");
					xPlayerController.xPlayer.stop();

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

				// Set Message
				updateMessage("Converting ( " + IOInfo.getFileExtension(fileAbsolutePath) + " ) to ( mp3 )");

				// Create the media folder if not existing
				final String folderName = DatabaseTool.getAbsoluteDatabaseParentFolderPathWithSeparator() + "Media";
				if (!IOAction.createFileOrFolder(folderName, FileType.DIRECTORY)) {
					AlertTool.showNotification("Internal Error", "Can't create Media Folder for converted files",
							Duration.seconds(4), NotificationType.WARNING);
					succeeded = false;
				}

				// Check if it is already .mp3
				if (!"mp3".equals(IOInfo.getFileExtension(fileAbsolutePath))) {
					newFileAsbolutePath = folderName + File.separator + IOInfo.getFileTitle(fileAbsolutePath) + ".mp3";

					// Convert any audio format to .mp3
					try {

						// Files
						final File source = new File(fileAbsolutePath);
						final File target = new File(newFileAsbolutePath);

						// Audio Attributes
						final AudioAttributes audio = new AudioAttributes();
						audio.setCodec("libmp3lame");
						audio.setBitRate(128000);
						audio.setChannels(2);
						audio.setSamplingRate(44100);

						// Encoding attributes
						final EncodingAttributes attrs = new EncodingAttributes();
						attrs.setFormat("mp3");
						attrs.setAudioAttributes(audio);

						// Encode
						if (encoder != null)
							encoder.abortEncoding();
						encoder = encoder != null ? encoder : new Encoder();
						encoder.encode(new MultimediaObject(source), target, attrs, listener);

					} catch (final Exception ex) {
						ex.printStackTrace();
						succeeded = false;
					}
				} else
					newFileAsbolutePath = fileAbsolutePath;

				// Set Message
				super.updateMessage("Convert finished...");

				// System.out.println("After the error")

				// Check if succeeded
				if (succeeded)
					Platform.runLater(() -> xPlayerController.playSong(newFileAsbolutePath));
				else
					AlertTool.showNotification("Convert failed", "Couldn't convert given media to .mp3 ",
							Duration.seconds(4), NotificationType.WARNING);

				return true;
			}
		};
	}

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


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

				final AudioType[] audioType = {null};
				String audioFullPath = null;

				try {

					// Stop the previous audio
					updateMessage("Stop previous...");
					xPlayerController.xPlayer.stop();

					// ---------------------- Load the File
					updateMessage("File Configuration ...");

					// duration
					audioFullPath = xPlayerController.xPlayerModel.songPathProperty().get();
					audioType[0] = checkAudioTypeAndUpdateXPlayerModel(audioFullPath);
					xPlayerController.xPlayerModel
							.setDuration(TimeTool.durationInSeconds(audioFullPath, audioType[0]));

					// extension
					xPlayerController.xPlayerModel.songExtensionProperty()
							.set(IOInfo.getFileExtension(audioFullPath));

					// == TotalTimeLabel
					Platform.runLater(() -> xPlayerController.getTotalTimeLabel()
							.setText(TimeTool.getTimeEdited(xPlayerController.xPlayerModel.getDuration())));

					// ----------------------- Load the Album Image
					image = AudioImageTool.getAudioAlbumImage(audioFullPath, -1, -1);

					// ---------------------- Open the Audio
					updateMessage("Opening ...");
					xPlayerController.xPlayer.open(xPlayerController.xPlayerModel.songObjectProperty().get());

					// ----------------------- Play the Audio
					updateMessage("Starting ...");
					xPlayerController.xPlayer.play();
					xPlayerController.xPlayer.pause();

					// So the user wants to start from a position better than 0
					if (secondsToSkip > 0) {
						xPlayerController.xPlayer
								.seekBytes((long) ((secondsToSkip) * (xPlayerController.xPlayer.getTotalBytes()
										/ (float) xPlayerController.xPlayerModel.getDuration())));

						// Update XPlayer Model
						xPlayerController.xPlayerModel.setCurrentTime(secondsToSkip);
						xPlayerController.xPlayerModel.setCurrentAngleTime(secondsToSkip);

						// Update the disc Angle
						xPlayerController.disc.calculateAngleByValue(secondsToSkip,
								xPlayerController.xPlayerModel.getDuration(), true);
					}

					// ....well let's go
				} catch (final Exception ex) {
					xPlayerController.logger.log(Level.WARNING, "", ex);
					Platform.runLater(() -> {
						final String audioPath = xPlayerController.xPlayerModel.songPathProperty().get();

						// Media not existing any more?
						if (audioType[0] != null && audioPath != null && !new File(audioPath).exists())
							AlertTool.showNotification("Media doesn't exist",
									"Current Media File doesn't exist anymore...", Duration.seconds(2),
									NotificationType.ERROR);

							// Not available Audio Devices?
						else if (xPlayerController.xPlayer.getMixers().isEmpty())
							AlertTool.showNotification("No Audio Devices",
									"We can’t find an audio device.\nMake sure that headphones or speakers are connected.\n For more info, search your device for “Manage audio devices”",
									Duration.millis(10000), NotificationType.ERROR);

							// Audio Corrupted?
						else
							AlertTool.showNotification("Can't play current Audio",
									"Can't play \n["
											+ InfoTool.getMinString(
											xPlayerController.xPlayerModel.songPathProperty().get(), 30, "...")
											+ "]\nIt is corrupted or maybe unsupported",
									Duration.millis(1500), NotificationType.ERROR);

					});
					return false;
				} finally {

					// Print the current audio file path
					System.out.println("Current audio path is ...:"
							+ xPlayerController.xPlayerModel.songPathProperty().get());

				}

				return true;
			}

		};
	}

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

				final AudioType[] audioType = { null };
				String audioFullPath = null;

				try {

					// Stop the previous audio
					updateMessage("Stop previous...");
					xPlayerController.xPlayer.stop();

					// ---------------------- Load the File
					updateMessage("File Configuration ...");

					// duration
					audioFullPath = xPlayerController.xPlayerModel.songPathProperty().get();
					audioType[0] = checkAudioTypeAndUpdateXPlayerModel(audioFullPath);
					xPlayerController.xPlayerModel
							.setDuration(TimeTool.durationInSeconds(audioFullPath, audioType[0]));

					// extension
					xPlayerController.xPlayerModel.songExtensionProperty()
							.set(IOInfo.getFileExtension(audioFullPath));

					// == TotalTimeLabel
					Platform.runLater(() -> xPlayerController.getTotalTimeLabel()
							.setText(TimeTool.getTimeEdited(xPlayerController.xPlayerModel.getDuration())));

					// ----------------------- Load the Album Image
					image = AudioImageTool.getAudioAlbumImage(audioFullPath, -1, -1);

					// ---------------------- Open the Audio
					updateMessage("Opening ...");
					xPlayerController.xPlayer.open(xPlayerController.xPlayerModel.songObjectProperty().get());

					// ----------------------- Play the Audio
					updateMessage("Starting ...");
					xPlayerController.xPlayer.play();
					xPlayerController.xPlayer.pause();

					// So the user wants to start from a position better than 0
					if (secondsToSkip > 0) {
						xPlayerController.xPlayer
								.seekBytes((long) ((secondsToSkip) * (xPlayerController.xPlayer.getTotalBytes()
										/ (float) xPlayerController.xPlayerModel.getDuration())));

						// Update XPlayer Model
						xPlayerController.xPlayerModel.setCurrentTime(secondsToSkip);
						xPlayerController.xPlayerModel.setCurrentAngleTime(secondsToSkip);

						// Update the disc Angle
						xPlayerController.disc.calculateAngleByValue(secondsToSkip,
								xPlayerController.xPlayerModel.getDuration(), true);
					}

					// ....well let's go
				} catch (final Exception ex) {
					xPlayerController.logger.log(Level.WARNING, "", ex);
					Platform.runLater(() -> {
						final String audioPath = xPlayerController.xPlayerModel.songPathProperty().get();

						// Media not existing any more?
						if (audioType[0] != null && audioPath != null && !new File(audioPath).exists())
							AlertTool.showNotification("Media doesn't exist",
									"Current Media File doesn't exist anymore...", Duration.seconds(2),
									NotificationType.ERROR);

						// Not available Audio Devices?
						else if (xPlayerController.xPlayer.getMixers().isEmpty())
							AlertTool.showNotification("No Audio Devices",
									"We can’t find an audio device.\nMake sure that headphones or speakers are connected.\n For more info, search your device for “Manage audio devices”",
									Duration.millis(10000), NotificationType.ERROR);

						// Audio Corrupted?
						else
							AlertTool.showNotification("Can't play current Audio",
									"Can't play \n["
											+ InfoTool.getMinString(
													xPlayerController.xPlayerModel.songPathProperty().get(), 30,"...")
											+ "]\nIt is corrupted or maybe unsupported",
									Duration.millis(1500), NotificationType.ERROR);

					});
					return false;
				} finally {

					// Print the current audio file path
					System.out.println("Current audio path is ...:"
							+ xPlayerController.xPlayerModel.songPathProperty().get());

				}

				return true;
			}

		};
	}

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


	@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);
				final byte[] buffer = new byte[1024];

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

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

					// Start
					for (final 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 (final IOException ex) {
							ex.printStackTrace();
							exception = ex.getMessage();
						}

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

					}

					// Close the motherFuckers
					zos.closeEntry();

				} catch (final 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);
				final byte[] buffer = new byte[1024];

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

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

					// Start
					for (final 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 (final IOException ex) {
							ex.printStackTrace();
							exception = ex.getMessage();
						}

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

					}

					// Close the motherFuckers
					zos.closeEntry();

				} catch (final 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.zipping.PackZipService