@Override
	public Result findSimilarTo(Signal signal) throws RemoteException {
		
		boolean finished = false;
		while (!finished) {
			waitForBalacing.acquireAndRelease();
			receivedSignals.incrementAndGet();
					
			if (channel.isConnected()) {
				List<Future<Result>> futureResults = new ArrayList<>();
				List<Result> results = new LinkedList<>();
				for (final Address address : channel.getView().getMembers()) {
					futureResults.add(dispatcher.<Result>send(address, new MyMessage<Signal>(signal, Operation.QUERY)));
				}
							
				for (final Future<Result> future : futureResults) {
					try {
						results.add(future.get());
					} catch (DegradedModeException e) {
						// RETRY
						System.out.println("findSimilar: node down! Retrying...");
						continue;
					} catch (InterruptedException | ExecutionException e) {
						e.printStackTrace();
					}
				}
				
				Result result = results.remove(0);
				for (Result res: results) {
					Iterable<Item> items = res.items();
					for (Item item: items) {
						result = result.include(item);
					}
				}
				return result;
			} else {
				return worker.process(signal);
			}
		}
		return null;
	}