MapStruct maps properties between source and target automatically if the names are the same. I used your example and I renamed val on the target to val1 (and the getters and setters).
Currently, we have no support of handling cycles within mapping methods. That can be a problem if, for example, both source and target object structures contain bidirectional associations between ...