@Override
		public void viewAccepted(final View newView) {
			
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					if (currentView == null) {
						waitForBalacing.drainPermits();
						currentView = newView;
						workerThread = new Thread(worker);
						workerThread.start();		
						
						if (newView.size() > 1) {
							
							try {
								worker.phaseEnd(newView.size());
								worker.phaseEnd(newView.size());
								worker.phaseEnd(newView.size());
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						degradedMode.set(false);
						waitForBalacing.release();
						return;
					}
					
					for (Address member: newView.getMembers()) {
						if (!currentView.containsMember(member)) {
							// member is NEW NODE
							degradedMode.set(true);
							waitForBalacing.drainPermits();
							
							Tuple<Address, List<Address>> tuple = new Tuple<>(member, newView.getMembers());
							MyMessage<Tuple<Address, List<Address>>> myMsg = new MyMessage<>(tuple, Operation.NODEUP);
							msgQueue.add(new Message(channel.getAddress(), myMsg));
							currentView = newView;
							return;
						}
					}
					
					for (Address currMember: currentView.getMembers()) {
						if (!newView.containsMember(currMember)) {
							//currMember is DOWN
							degradedMode.set(true);
							waitForBalacing.drainPermits();
							dispatcher.nodeDisconnected(currMember);
							
							Tuple<Address, List<Address>> tuple = new Tuple<>(currMember, newView.getMembers());
							MyMessage<Tuple<Address, List<Address>>> myMsg = new MyMessage<>(tuple, Operation.NODEDOWN);
							msgQueue.add(new Message(channel.getAddress(), myMsg));
							currentView = newView;
							return;
						}
					}
				}
			}).start();
		}