private void balanceReplicas() throws Exception {

		int formerSize = replicas.size();
		int numMembers = members.size();
		List<Future<Object>> futureResponses = new ArrayList<>();
		while (replicas.size() > (formerSize +1) * (numMembers - 1) / numMembers) {

			SignalInfo sInfo2;
			BlockingQueue<SignalInfo> list;
			Address chosen;
			while (true) {
				Tuple<Address, Address> tuple2 = Utils.chooseRandomMember(members);
				
				if (!tuple2.getFirst().equals(newMember)) {
					 list = replicas.get(tuple2.getFirst());
					if (list != null) {
						chosen = tuple2.getFirst();
						break;
					}
				}
				
				if (!tuple2.getSecond().equals(newMember)) {
					list = replicas.get(tuple2.getSecond());
					if (list != null) {
						chosen = tuple2.getSecond();
						break;
					}
				}
			}

			sInfo2 = replicas.pollList(chosen);
			if (sInfo2 == null) {
				continue;
			}

			MyMessage<Signal> myMessage = new MyMessage<Signal>(sInfo2.getSignal(), Operation.MOVE, true, sInfo2.getCopyAddress());
			NotifyingFuture<Object> f = dispatcher.send(newMember, myMessage);
			futureResponses.add(f);
		}

		Utils.waitForResponses(futureResponses);
		
		worker.phaseEnd(members.size());
	}