public final void fill() {
		if (this.master.isInterrupted()) {
			return;
		}
		Debug.print("Searching for songs at \"" + this.tree.getRoot() + "\".\n");

		final Deserializer sdd = Deserializer.init(this, this.master);
		final Scanner scanner = new Scanner(this.master, sdd, this.tree);
		final Crawler crawler = new Crawler(sdd);
		final Runnable taskDeserial = sdd.getDeserialTask();

		if (taskDeserial == null) {
			this.taskPool.addTaskForAll(crawler, 30);
			this.taskPool.addTaskForAll(scanner);
			try {
				sdd.deserialize();
			} catch (final IOException e) {
				this.master.interrupt();
				e.printStackTrace();
				sdd.abort();
			}
		} else {
			this.taskPool.addTaskForAll(taskDeserial, 75);
			this.taskPool.addTaskForAll(crawler, 25);
			this.taskPool.addTaskForAll(scanner);
			taskDeserial.run();
		}
		crawler.run();
		scanner.run();
		this.taskPool.waitForTasks();
		if (this.master.isInterrupted()) {
			sdd.abort();
			return;
		}
		this.io.startProgress("Creating store for next run", -1);
		sdd.finish();
		this.io.endProgress(sdd.songsFound() + " songs found");
		for (final AbtractEoWInAbc e : AbtractEoWInAbc.getMessages()) {
			this.io.printError(e.printMessage(), true);
		}

		Debug.print("\n----------\n%4d songs found", sdd.songsFound());
	}