code: @Override
  	public void removeActions(String nodeID) {
  
  		// Stop local services
  		if (this.nodeID.equals(nodeID)) {
  			stopAllLocalServices();
  		}
  
  		// Remove actions
  		final long stamp = lock.writeLock();
  		try {
  			Iterator<Strategy<ActionEndpoint>> endpoints = strategies.values().iterator();
  			while (endpoints.hasNext()) {
  				Strategy<ActionEndpoint> strategy = endpoints.next();
  				strategy.remove(nodeID);
  				if (strategy.isEmpty()) {
  					endpoints.remove();
  				}
  			}
  
  			// Update service names
  			names.clear();
  			names.addAll(strategies.keySet());
  
  			// Delete cached node descriptor
  			if (this.nodeID.equals(nodeID)) {
  				clearDescriptorCache();
  			}
  
  		} finally {
  			lock.unlockWrite(stamp);
  		}
  
  		// Reject promises
  		Iterator<PendingPromise> pendingPromises = promises.values().iterator();
  		boolean removed = false;
  		while (pendingPromises.hasNext()) {
  			PendingPromise pending = pendingPromises.next();
  			if (pending.nodeID.equals(nodeID)) {
  				removed = true;
  				pendingPromises.remove();
  				executor.execute(() -> {
  					try {
  						pending.promise.complete(new RequestRejectedError(nodeID, pending.action));
  					} catch (Throwable cause) {
  						logger.warn("Unable to reject action \"" + pending.action + "\"!", cause);
  					}
  				});
  			}
  		}
  
  		// Reschedule timeout checker
  		if (removed) {
  			scheduler.execute(() -> {
  				reschedule(Long.MAX_VALUE);
  			});
  		}
  
  		// Notify listeners
  		if (this.nodeID.equals(nodeID)) {
  
  			// Notify local listeners (LOCAL services changed)
  			broadcastServicesChanged(true);
  		} else {
  
  			// Notify local listeners (REMOTE services changed)
  			broadcastServicesChanged(false);
  		}
  	}
docs: --- REMOVE ALL REMOTE SERVICES/ACTIONS OF A NODE ---