code: @Override
  	public void addActions(String nodeID, Tree config) {
  		Tree actions = config.get("actions");
  		String serviceName = config.get("name", "");
  		int actionCounter = 0;
  
  		final long stamp = lock.writeLock();
  		try {
  			if (actions != null && actions.isMap()) {
  				for (Tree actionConfig : actions) {
  					actionConfig = actionConfig.clone();
  					actionConfig.putObject("nodeID", nodeID, true);
  					String actionName = actionConfig.get("name", "");
  
  					// Register remote action
  					RemoteActionEndpoint endpoint = new RemoteActionEndpoint(this, transporter, nodeID, actionConfig,
  							actionName);
  					Strategy<ActionEndpoint> actionStrategy = strategies.get(actionName);
  					if (actionStrategy == null) {
  						actionStrategy = strategyFactory.create();
  						strategies.put(actionName, actionStrategy);
  					}
  					actionStrategy.addEndpoint(endpoint);
  
  					// Apply middlewares
  					for (Middleware middleware : middlewares) {
  						endpoint.use(middleware);
  					}
  
  					// Write log about this action
  					logger.info("Action \"" + actionName + "\" on node \"" + nodeID + "\" registered.");
  					actionCounter++;
  				}
  			}
  			names.add(serviceName);
  		} finally {
  			lock.unlockWrite(stamp);
  		}
  
  		// Write log about this service
  		StringBuilder msg = new StringBuilder(64);
  		msg.append("Remote service \"");
  		msg.append(serviceName);
  		msg.append("\" registered ");
  		if (actionCounter == 0) {
  			msg.append("without any actions");
  		} else if (actionCounter == 1) {
  			msg.append("with 1 action");
  		} else {
  			msg.append("with ");
  			msg.append(actionCounter);
  			msg.append(" actions");
  		}
  		msg.append(" on node \"");
  		msg.append(nodeID);
  		msg.append("\".");
  		logger.info(msg.toString());
  
  		// Notify local listeners about the new REMOTE service
  		broadcastServicesChanged(false);
  	}
docs: --- ADD A REMOTE SERVICE ---