@Override
	public void run() {
		cleanUpMapping();

		for (int i = 0; i < mapping.size(); i++) {
			final LinkedHashSet<Integer> set = mapping.get(i);
			final IBank.BankTab sortingTab = BANK_TABS[i];
			final HashSet<Integer> alreadyHave = new HashSet<Integer>();

			for (Item item : ctx.bank.getItemsInTab(sortingTab)) {
				alreadyHave.add(item.id());
			}

			if (sortingTab != IBank.BankTab.ONE) {
				for (Integer integer : alreadyHave) {
					if (!set.contains(script.itemCategoriser.id(integer))) {
						// Remove
						final Item item = ctx.bank.getItemsInTab(sortingTab).id(integer).poll();
						if (item.valid()) {
							//System.out.println("Remove from tab");
							script.status = "Remove '" + item.name() + "' from tab";
							move(item, IBank.BankTab.ONE);
							Condition.sleep(100);
							return;
						}
					}
				}
			}

			for (Item item : ctx.bank.select().select(new Filter<Item>() {
				@Override
				public boolean accept(Item item) {
					return set.contains(script.itemCategoriser.id(item.id())) && !alreadyHave.contains(item.id());
				}
			}).sort(script.itemCategoriser.getSorter())) {
				move(item, sortingTab);
				Condition.sleep(66);
				return;
			}
		}
	}