@Override
	public boolean subscribeToDataOutputPort(String portName, LockPolicy lockPolicy, Observer observer, int periodMs) throws WrongPortTypeException{
		final OrocosDataPort port = getPort(portName);
		if(port.getPortType() == PortType.INPUT_PORT){
			throw new WrongPortTypeException(port.getPortType());
		}
		if(outputPortConnectionsMap.containsKey(portName) && 
				outputPortConnectionsMap.get(portName).containsKey(observer)){
			return true;
		}else{
			try {
				AbstractOrocosConnection connection = CorbaOrocosConnection.createDataConnection(port, lockPolicy);
				HashMap<Observer, AbstractOrocosConnection> map;
				if(outputPortConnectionsMap.containsKey(portName)){
					map = outputPortConnectionsMap.get(portName);
					outputPortConnectionsMap.remove(portName);
				}else{
					map = new HashMap<Observer, AbstractOrocosConnection>();
				}
				map.put(observer, connection);
				outputPortConnectionsMap.put(portName, map);
				connection.addObserver(observer);
				connection.initPublishSubscriber(periodMs);
				return true;
			} catch (CNoCorbaTransport e) {
				logger.error("Error on the Corba Transport. See the exception stack trace.");
				e.printStackTrace();
				return false;
			} catch (CNoSuchPortException e) {
				logger.error("The port you required does not exist");
				e.printStackTrace();
				return false;
			} 
		}
	}