diff --git a/core/src/org/sbml/jsbml/AbstractTreeNode.java b/core/src/org/sbml/jsbml/AbstractTreeNode.java index 63bc6c716..c049c8cc4 100644 --- a/core/src/org/sbml/jsbml/AbstractTreeNode.java +++ b/core/src/org/sbml/jsbml/AbstractTreeNode.java @@ -167,9 +167,10 @@ public AbstractTreeNode(TreeNode node) { AbstractTreeNode anode = (AbstractTreeNode) node; // Do not clone listeners! // this.listOfListeners.addAll(anode.listOfListeners); - if (anode.isSetUserObjects()) { - userObjects = new HashMap(); - userObjects.putAll(anode.userObjects); + // Copy userObjects if present. We must not rely on isSetUserObjects(), + // because subclasses may override it with different semantics. + if (anode.userObjects != null && !anode.userObjects.isEmpty()) { + userObjects = new HashMap(anode.userObjects); } // TODO - add this for all objects when we start using the checkAttribute method for other classes than Compartment.