diff --git a/src/main/java/de/tudresden/inf/st/pnml/CoreModelParser.java b/src/main/java/de/tudresden/inf/st/pnml/CoreModelParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..f46c448ba1dd7f91238956bf415fe97753fdce0f
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/CoreModelParser.java
@@ -0,0 +1,386 @@
+package de.tudresden.inf.st.pnml;
+
+import de.tudresden.inf.st.pnml.jastadd.model.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class CoreModelParser {
+
+  public static List<PetriNet> getPetriNets(fr.lip6.move.pnml.pnmlcoremodel.hlapi.PetriNetDocHLAPI source) throws PnmlParseException {
+    List<PetriNet> nets = new ArrayList<>();
+    for (fr.lip6.move.pnml.pnmlcoremodel.PetriNet net : source.getNets()) {
+      PetriNet petriNet = getPetriNet(net);
+      petriNet.treeResolveAll();
+      nets.add(petriNet);
+    }
+    return nets;
+  }
+
+  // the get methods
+
+  private static PetriNet getPetriNet(fr.lip6.move.pnml.pnmlcoremodel.PetriNet source) throws PnmlParseException {
+    PetriNet result = new PetriNet();
+    fillPetriNet(source, result);
+    return result;
+  }
+
+  private static Page getPage(fr.lip6.move.pnml.pnmlcoremodel.Page source) throws PnmlParseException {
+    Page result = new Page();
+    fillPage(source, result);
+    return result;
+  }
+
+  private static NodeGraphics getNodeGraphics(fr.lip6.move.pnml.pnmlcoremodel.NodeGraphics source) {
+    NodeGraphics result = new NodeGraphics();
+    fillNodeGraphics(source, result);
+    return result;
+  }
+
+  private static Line getLine(fr.lip6.move.pnml.pnmlcoremodel.Line source) {
+    Line result = new Line();
+    fillLine(source, result);
+    return result;
+  }
+
+  private static Fill getFill(fr.lip6.move.pnml.pnmlcoremodel.Fill source) {
+    Fill result = new Fill();
+    fillFill(source, result);
+    return result;
+  }
+
+  private static Dimension getDimension(fr.lip6.move.pnml.pnmlcoremodel.Dimension source) {
+    Dimension result = new Dimension();
+    fillDimension(source, result);
+    return result;
+  }
+
+  private static Offset getOffset(fr.lip6.move.pnml.pnmlcoremodel.Offset source) {
+    Offset result = new Offset();
+    fillOffset(source, result);
+    return result;
+  }
+
+  private static Position getPosition(fr.lip6.move.pnml.pnmlcoremodel.Position source) {
+    Position result = new Position();
+    fillPosition(source, result);
+    return result;
+  }
+
+  private static Name getName(fr.lip6.move.pnml.pnmlcoremodel.Name source) {
+    Name result = new Name();
+    fillName(source, result);
+    return result;
+  }
+
+  private static AnnotationGraphics getAnnotationGraphics(fr.lip6.move.pnml.pnmlcoremodel.AnnotationGraphics source) {
+    AnnotationGraphics result = new AnnotationGraphics();
+    fillAnnotationGraphics(source, result);
+    return result;
+  }
+
+  private static Font getFont(fr.lip6.move.pnml.pnmlcoremodel.Font source) {
+    Font result = new Font();
+    fillFont(source, result);
+    return result;
+  }
+
+  private static ToolInfo getToolInfo(fr.lip6.move.pnml.pnmlcoremodel.ToolInfo source) {
+    ToolInfo result = new ToolInfo();
+    fillToolInfo(source, result);
+    return result;
+  }
+
+  private static Node getNode(fr.lip6.move.pnml.pnmlcoremodel.Node source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.PlaceNode) {
+      return getPlaceNode((fr.lip6.move.pnml.pnmlcoremodel.PlaceNode) source);
+    } else if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.TransitionNode) {
+      return getTransitionNode((fr.lip6.move.pnml.pnmlcoremodel.TransitionNode) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of Node " + source.getClass().getCanonicalName());
+    }
+  }
+
+  private static PlaceNode getPlaceNode(fr.lip6.move.pnml.pnmlcoremodel.PlaceNode source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.Place) {
+      return getPlace((fr.lip6.move.pnml.pnmlcoremodel.Place) source);
+    } else if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.RefPlace) {
+      return getRefPlace((fr.lip6.move.pnml.pnmlcoremodel.RefPlace) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of PlaceNode " + source.getClass().getCanonicalName());
+    }
+  }
+
+  private static Place getPlace(fr.lip6.move.pnml.pnmlcoremodel.Place source) {
+    Place result = new Place();
+    fillPlace(source, result);
+    return result;
+  }
+
+  private static RefPlace getRefPlace(fr.lip6.move.pnml.pnmlcoremodel.RefPlace source) {
+    RefPlace result = new RefPlace();
+    fillRefPlace(source, result);
+    return result;
+  }
+
+  private static TransitionNode getTransitionNode(fr.lip6.move.pnml.pnmlcoremodel.TransitionNode source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.Transition) {
+      return getTransition((fr.lip6.move.pnml.pnmlcoremodel.Transition) source);
+    } else if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.RefTransition) {
+      return getRefTransition((fr.lip6.move.pnml.pnmlcoremodel.RefTransition) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of TransitionNode " + source.getClass().getCanonicalName());
+    }
+  }
+
+  private static RefTransition getRefTransition(fr.lip6.move.pnml.pnmlcoremodel.RefTransition source) {
+    RefTransition result = new RefTransition();
+    fillRefTransition(source, result);
+    return result;
+  }
+
+  private static Transition getTransition(fr.lip6.move.pnml.pnmlcoremodel.Transition source) {
+    Transition result = new Transition();
+    fillTransition(source, result);
+    return result;
+  }
+
+  private static Arc getArc(fr.lip6.move.pnml.pnmlcoremodel.Arc source) {
+    Arc result = new Arc();
+    fillArc(source, result);
+    return result;
+  }
+
+  private static ArcGraphics getArcGraphics(fr.lip6.move.pnml.pnmlcoremodel.ArcGraphics source) {
+    ArcGraphics result = new ArcGraphics();
+    fillArcGraphics(source, result);
+    return result;
+  }
+
+  private static PnObject getPnObject(fr.lip6.move.pnml.pnmlcoremodel.PnObject source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.Page) {
+      return getPage((fr.lip6.move.pnml.pnmlcoremodel.Page) source);
+    } else if (source instanceof Node) {
+      return getNode((fr.lip6.move.pnml.pnmlcoremodel.Node) source);
+    } else if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.Arc) {
+      return getArc((fr.lip6.move.pnml.pnmlcoremodel.Arc) source);
+    } else if (source instanceof fr.lip6.move.pnml.pnmlcoremodel.Node) {
+      return getNode((fr.lip6.move.pnml.pnmlcoremodel.Node) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of PnObject " + source.getClass().getCanonicalName());
+    }
+  }
+
+  // the fill methods
+
+  private static void fillPetriNet(fr.lip6.move.pnml.pnmlcoremodel.PetriNet source, PetriNet result) throws PnmlParseException {
+    for (fr.lip6.move.pnml.pnmlcoremodel.Page page : source.getPages()) {
+      result.addPage(getPage(page));
+    }
+    if (source.getName() != null) {
+      result.setName(getName(source.getName()));
+    }
+    for (fr.lip6.move.pnml.pnmlcoremodel.ToolInfo toolInfo : source.getToolspecifics()) {
+      result.addToolspecific(getToolInfo(toolInfo));
+    }
+    result.setId(source.getId());
+    if (source.getType() == fr.lip6.move.pnml.pnmlcoremodel.PNType.PTNET) {
+      result.setType(PNType.PTNET);
+    } else {
+      throw new PnmlParseException("Illegal Petri Net type '" + source.getType().getLiteral() + "' encountered.");
+    }
+  }
+
+  private static void fillPage(fr.lip6.move.pnml.pnmlcoremodel.Page source, Page result) throws PnmlParseException {
+    fillPnObject(source, result);
+
+    for (fr.lip6.move.pnml.pnmlcoremodel.PnObject object : source.getObjects()) {
+      result.addObject(getPnObject(object));
+    }
+    if (source.getNodegraphics() != null) {
+      result.setNodeGraphics(getNodeGraphics(source.getNodegraphics()));
+    }
+  }
+
+  private static void fillPnObject(fr.lip6.move.pnml.pnmlcoremodel.PnObject source, PnObject result) {
+    if (source.getName() != null) {
+      result.setName(getName(source.getName()));
+    }
+    for (fr.lip6.move.pnml.pnmlcoremodel.ToolInfo toolInfo : source.getToolspecifics()) {
+      result.addToolspecific(getToolInfo(toolInfo));
+    }
+    result.setId(source.getId());
+  }
+
+  private static void fillNodeGraphics(fr.lip6.move.pnml.pnmlcoremodel.NodeGraphics source, NodeGraphics result) {
+    if (source.getPosition() != null) {
+      result.setPosition(getPosition(source.getPosition()));
+    }
+    if (source.getDimension() != null) {
+      result.setDimension(getDimension(source.getDimension()));
+    }
+    if (source.getFill() != null) {
+      result.setFill(getFill(source.getFill()));
+    }
+    if (source.getLine() != null) {
+      result.setLine(getLine(source.getLine()));
+    }
+  }
+
+  private static void fillLine(fr.lip6.move.pnml.pnmlcoremodel.Line source, Line result) {
+    result.setColor(CSS2Color.valueOf(source.getColor().getName()));
+    result.setShape(LineShape.valueOf(source.getShape().getName()));
+    result.setWidth(source.getWidth());
+    result.setStyle(LineStyle.valueOf(source.getStyle().getName()));
+  }
+
+  private static void fillFill(fr.lip6.move.pnml.pnmlcoremodel.Fill source, Fill result) {
+    result.setColor(CSS2Color.valueOf(source.getColor().getName()));
+    result.setGradientcolor(CSS2Color.valueOf(source.getGradientcolor().getName()));
+    result.setGradientrotation(Gradient.valueOf(source.getGradientrotation().getName()));
+    result.setImage(source.getImage());
+  }
+
+  private static void fillDimension(fr.lip6.move.pnml.pnmlcoremodel.Dimension source, Dimension result) {
+    fillCoordinate(source, result);
+  }
+
+  private static void fillCoordinate(fr.lip6.move.pnml.pnmlcoremodel.Coordinate source, Coordinate result) {
+    result.setX(source.getX());
+    result.setY(source.getY());
+  }
+
+  private static void fillOffset(fr.lip6.move.pnml.pnmlcoremodel.Offset source, Offset result) {
+    fillCoordinate(source, result);
+  }
+
+  private static void fillPosition(fr.lip6.move.pnml.pnmlcoremodel.Position source, Position result) {
+    fillCoordinate(source, result);
+  }
+
+  private static void fillName(fr.lip6.move.pnml.pnmlcoremodel.Name source, Name result) {
+    fillAnnotation(source, result);
+
+    result.setText(source.getText());
+  }
+
+  private static void fillAnnotation(fr.lip6.move.pnml.pnmlcoremodel.Annotation source, Annotation result) {
+    if (source.getAnnotationgraphics() != null) {
+      result.setAnnotationGraphics(getAnnotationGraphics(source.getAnnotationgraphics()));
+    }
+    fillLabel(source, result);
+  }
+
+  private static void fillLabel(fr.lip6.move.pnml.pnmlcoremodel.Annotation source, Annotation result) {
+    for (fr.lip6.move.pnml.pnmlcoremodel.ToolInfo info : source.getToolspecifics()) {
+      result.addToolspecific(getToolInfo(info));
+    }
+  }
+
+  private static void fillAnnotationGraphics(fr.lip6.move.pnml.pnmlcoremodel.AnnotationGraphics source, AnnotationGraphics result) {
+    if (source.getOffset() != null) {
+      result.setOffset(getOffset(source.getOffset()));
+    }
+    if (source.getFill() != null) {
+      result.setFill(getFill(source.getFill()));
+    }
+    if (source.getLine() != null) {
+      result.setLine(getLine(source.getLine()));
+    }
+    if (source.getFont() != null) {
+      result.setFont(getFont(source.getFont()));
+    }
+  }
+
+  private static void fillFont(fr.lip6.move.pnml.pnmlcoremodel.Font source, Font result) {
+    result.setAlign(FontAlign.valueOf(source.getAlign().getName()));
+    result.setDecoration(FontDecoration.valueOf(source.getDecoration().getName()));
+    result.setFamily(CSS2FontFamily.valueOf(source.getFamily().getName()));
+    result.setRotation(source.getRotation());
+    result.setSize(CSS2FontSize.valueOf(source.getSize().getName()));
+    result.setStyle(CSS2FontStyle.valueOf(source.getStyle().getName()));
+    result.setWeight(CSS2FontWeight.valueOf(source.getWeight().getName()));
+  }
+
+  private static void fillToolInfo(fr.lip6.move.pnml.pnmlcoremodel.ToolInfo source, ToolInfo result) {
+    result.setTool(source.getTool());
+    result.setVersion(source.getVersion());
+    result.setFormattedXMLBuffer(source.getFormattedXMLBuffer());
+    result.setToolInfoGrammarURI(source.getToolInfoGrammarURI());
+  }
+
+  private static void fillPlace(fr.lip6.move.pnml.pnmlcoremodel.Place source, Place result) {
+    fillPlaceNode(source, result);
+  }
+
+  private static void fillRefPlace(fr.lip6.move.pnml.pnmlcoremodel.RefPlace source, RefPlace result) {
+    fillPlaceNode(source, result);
+
+    result.setRef(PlaceNode.createRefDirection(source.getRef().getId()));
+  }
+
+  private static void fillPlaceNode(fr.lip6.move.pnml.pnmlcoremodel.PlaceNode source, PlaceNode result) {
+    fillNode(source, result);
+
+    for (fr.lip6.move.pnml.pnmlcoremodel.RefPlace referencingPlace : source.getReferencingPlaces()) {
+      result.addReferencingPlace(RefPlace.createRefDirection(referencingPlace.getId()));
+    }
+  }
+
+  private static void fillRefTransition(fr.lip6.move.pnml.pnmlcoremodel.RefTransition source, RefTransition result) {
+    fillTransitionNode(source, result);
+
+    result.setRef(TransitionNode.createRefDirection(source.getRef().getId()));
+  }
+
+  private static void fillTransitionNode(fr.lip6.move.pnml.pnmlcoremodel.TransitionNode source, TransitionNode result) {
+    fillNode(source, result);
+
+    for (fr.lip6.move.pnml.pnmlcoremodel.RefTransition refTransition : source.getReferencingTransitions()) {
+      result.addReferencingTransition(RefTransition.createRefDirection(refTransition.getId()));
+    }
+  }
+
+  private static void fillTransition(fr.lip6.move.pnml.pnmlcoremodel.Transition source, Transition result) {
+    fillTransitionNode(source, result);
+  }
+
+  private static void fillNode(fr.lip6.move.pnml.pnmlcoremodel.Node source, Node result) {
+
+    fillPnObject(source, result);
+
+    if (source.getNodegraphics() != null) {
+      result.setNodeGraphics(getNodeGraphics(source.getNodegraphics()));
+    }
+
+    for (fr.lip6.move.pnml.pnmlcoremodel.Arc outArc : source.getOutArcs()) {
+      result.addOutArc(Arc.createRefDirection(outArc.getId()));
+    }
+    for (fr.lip6.move.pnml.pnmlcoremodel.Arc inArc : source.getInArcs()) {
+      result.addInArc(Arc.createRefDirection(inArc.getId()));
+    }
+  }
+
+  private static void fillArc(fr.lip6.move.pnml.pnmlcoremodel.Arc source, Arc result) {
+    fillPnObject(source, result);
+
+    if (source.getArcgraphics() != null) {
+      result.setArcGraphics(getArcGraphics(source.getArcgraphics()));
+    }
+
+    result.setSource(Node.createRefDirection(source.getSource().getId()));
+    result.setTarget(Node.createRefDirection(source.getTarget().getId()));
+  }
+
+  private static void fillArcGraphics(fr.lip6.move.pnml.pnmlcoremodel.ArcGraphics source, ArcGraphics result) {
+    for (fr.lip6.move.pnml.pnmlcoremodel.Position position : source.getPositions()) {
+      result.addPosition(getPosition(position));
+    }
+    if (source.getLine() != null) {
+      result.setLine(getLine(source.getLine()));
+    }
+  }
+
+
+}
+
diff --git a/src/main/java/de/tudresden/inf/st/pnml/PTNetParser.java b/src/main/java/de/tudresden/inf/st/pnml/PTNetParser.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd9afe8c811d20b61574fdffcc0a74a616a4f4b3
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/PTNetParser.java
@@ -0,0 +1,418 @@
+package de.tudresden.inf.st.pnml;
+
+import de.tudresden.inf.st.pnml.jastadd.model.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class PTNetParser {
+
+  public static List<PetriNet> getPetriNets(fr.lip6.move.pnml.ptnet.hlapi.PetriNetDocHLAPI source) throws PnmlParseException {
+    List<PetriNet> nets = new ArrayList<>();
+    for (fr.lip6.move.pnml.ptnet.PetriNet net : source.getNets()) {
+      PetriNet petriNet = getPetriNet(net);
+      petriNet.treeResolveAll();
+      nets.add(petriNet);
+    }
+    return nets;
+  }
+
+  // the get methods
+
+  private static PetriNet getPetriNet(fr.lip6.move.pnml.ptnet.PetriNet source) throws PnmlParseException {
+    PetriNet result = new PetriNet();
+    fillPetriNet(source, result);
+    return result;
+  }
+
+  private static Page getPage(fr.lip6.move.pnml.ptnet.Page source) throws PnmlParseException {
+    Page result = new Page();
+    fillPage(source, result);
+    return result;
+  }
+
+  private static NodeGraphics getNodeGraphics(fr.lip6.move.pnml.ptnet.NodeGraphics source) {
+    NodeGraphics result = new NodeGraphics();
+    fillNodeGraphics(source, result);
+    return result;
+  }
+
+  private static Line getLine(fr.lip6.move.pnml.ptnet.Line source) {
+    Line result = new Line();
+    fillLine(source, result);
+    return result;
+  }
+
+  private static Fill getFill(fr.lip6.move.pnml.ptnet.Fill source) {
+    Fill result = new Fill();
+    fillFill(source, result);
+    return result;
+  }
+
+  private static Dimension getDimension(fr.lip6.move.pnml.ptnet.Dimension source) {
+    Dimension result = new Dimension();
+    fillDimension(source, result);
+    return result;
+  }
+
+  private static Offset getOffset(fr.lip6.move.pnml.ptnet.Offset source) {
+    Offset result = new Offset();
+    fillOffset(source, result);
+    return result;
+  }
+
+  private static Position getPosition(fr.lip6.move.pnml.ptnet.Position source) {
+    Position result = new Position();
+    fillPosition(source, result);
+    return result;
+  }
+
+  private static Name getName(fr.lip6.move.pnml.ptnet.Name source) {
+    Name result = new Name();
+    fillName(source, result);
+    return result;
+  }
+
+  private static AnnotationGraphics getAnnotationGraphics(fr.lip6.move.pnml.ptnet.AnnotationGraphics source) {
+    AnnotationGraphics result = new AnnotationGraphics();
+    fillAnnotationGraphics(source, result);
+    return result;
+  }
+
+  private static Font getFont(fr.lip6.move.pnml.ptnet.Font source) {
+    Font result = new Font();
+    fillFont(source, result);
+    return result;
+  }
+
+  private static ToolInfo getToolInfo(fr.lip6.move.pnml.ptnet.ToolInfo source) {
+    ToolInfo result = new ToolInfo();
+    fillToolInfo(source, result);
+    return result;
+  }
+
+  private static Node getNode(fr.lip6.move.pnml.ptnet.Node source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.ptnet.PlaceNode) {
+      return getPlaceNode((fr.lip6.move.pnml.ptnet.PlaceNode) source);
+    } else if (source instanceof fr.lip6.move.pnml.ptnet.TransitionNode) {
+      return getTransitionNode((fr.lip6.move.pnml.ptnet.TransitionNode) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of Node " + source.getClass().getCanonicalName());
+    }
+  }
+
+  private static PlaceNode getPlaceNode(fr.lip6.move.pnml.ptnet.PlaceNode source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.ptnet.Place) {
+      return getPlace((fr.lip6.move.pnml.ptnet.Place) source);
+    } else if (source instanceof fr.lip6.move.pnml.ptnet.RefPlace) {
+      return getRefPlace((fr.lip6.move.pnml.ptnet.RefPlace) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of PlaceNode " + source.getClass().getCanonicalName());
+    }
+  }
+
+  private static Place getPlace(fr.lip6.move.pnml.ptnet.Place source) {
+    Place result = new Place();
+    fillPlace(source, result);
+    return result;
+  }
+
+  private static PTMarking getPTMarking(fr.lip6.move.pnml.ptnet.PTMarking source) {
+    PTMarking result = new PTMarking();
+    fillPTMarking(source, result);
+    return result;
+  }
+
+  private static RefPlace getRefPlace(fr.lip6.move.pnml.ptnet.RefPlace source) {
+    RefPlace result = new RefPlace();
+    fillRefPlace(source, result);
+    return result;
+  }
+
+  private static TransitionNode getTransitionNode(fr.lip6.move.pnml.ptnet.TransitionNode source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.ptnet.Transition) {
+      return getTransition((fr.lip6.move.pnml.ptnet.Transition) source);
+    } else if (source instanceof fr.lip6.move.pnml.ptnet.RefTransition) {
+      return getRefTransition((fr.lip6.move.pnml.ptnet.RefTransition) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of TransitionNode " + source.getClass().getCanonicalName());
+    }
+  }
+
+  private static RefTransition getRefTransition(fr.lip6.move.pnml.ptnet.RefTransition source) {
+    RefTransition result = new RefTransition();
+    fillRefTransition(source, result);
+    return result;
+  }
+
+  private static Transition getTransition(fr.lip6.move.pnml.ptnet.Transition source) {
+    Transition result = new Transition();
+    fillTransition(source, result);
+    return result;
+  }
+
+  private static Arc getArc(fr.lip6.move.pnml.ptnet.Arc source) {
+    Arc result = new Arc();
+    fillArc(source, result);
+    return result;
+  }
+
+  private static PTArcAnnotation getPTArcannotation(fr.lip6.move.pnml.ptnet.PTArcAnnotation source) {
+    PTArcAnnotation result = new PTArcAnnotation();
+    fillPTAnnotation(source, result);
+    return result;
+  }
+
+  private static ArcGraphics getArcGraphics(fr.lip6.move.pnml.ptnet.ArcGraphics source) {
+    ArcGraphics result = new ArcGraphics();
+    fillArcGraphics(source, result);
+    return result;
+  }
+
+  private static PnObject getPnObject(fr.lip6.move.pnml.ptnet.PnObject source) throws PnmlParseException {
+    if (source instanceof fr.lip6.move.pnml.ptnet.Page) {
+      return getPage((fr.lip6.move.pnml.ptnet.Page) source);
+    } else if (source instanceof Node) {
+      return getNode((fr.lip6.move.pnml.ptnet.Node) source);
+    } else if (source instanceof fr.lip6.move.pnml.ptnet.Arc) {
+      return getArc((fr.lip6.move.pnml.ptnet.Arc) source);
+    } else if (source instanceof fr.lip6.move.pnml.ptnet.Node) {
+      return getNode((fr.lip6.move.pnml.ptnet.Node) source);
+    } else {
+      throw new PnmlParseException("Encountered illegal unknown subtype of PnObject " + source.getClass().getCanonicalName());
+    }
+  }
+
+  // the fill methods
+
+  private static void fillPetriNet(fr.lip6.move.pnml.ptnet.PetriNet source, PetriNet result) throws PnmlParseException {
+    for (fr.lip6.move.pnml.ptnet.Page page : source.getPages()) {
+      result.addPage(getPage(page));
+    }
+    if (source.getName() != null) {
+      result.setName(getName(source.getName()));
+    }
+    for (fr.lip6.move.pnml.ptnet.ToolInfo toolInfo : source.getToolspecifics()) {
+      result.addToolspecific(getToolInfo(toolInfo));
+    }
+    result.setId(source.getId());
+    if (source.getType() == fr.lip6.move.pnml.ptnet.PNType.PTNET) {
+      result.setType(PNType.PTNET);
+    } else {
+      throw new PnmlParseException("Illegal Petri Net type '" + source.getType().getLiteral() + "' encountered.");
+    }
+  }
+
+  private static void fillPage(fr.lip6.move.pnml.ptnet.Page source, Page result) throws PnmlParseException {
+    fillPnObject(source, result);
+
+    for (fr.lip6.move.pnml.ptnet.PnObject object : source.getObjects()) {
+      result.addObject(getPnObject(object));
+    }
+    if (source.getNodegraphics() != null) {
+      result.setNodeGraphics(getNodeGraphics(source.getNodegraphics()));
+    }
+  }
+
+  private static void fillPnObject(fr.lip6.move.pnml.ptnet.PnObject source, PnObject result) {
+    if (source.getName() != null) {
+      result.setName(getName(source.getName()));
+    }
+    for (fr.lip6.move.pnml.ptnet.ToolInfo toolInfo : source.getToolspecifics()) {
+      result.addToolspecific(getToolInfo(toolInfo));
+    }
+    result.setId(source.getId());
+  }
+
+  private static void fillNodeGraphics(fr.lip6.move.pnml.ptnet.NodeGraphics source, NodeGraphics result) {
+    if (source.getPosition() != null) {
+      result.setPosition(getPosition(source.getPosition()));
+    }
+    if (source.getDimension() != null) {
+      result.setDimension(getDimension(source.getDimension()));
+    }
+    if (source.getFill() != null) {
+      result.setFill(getFill(source.getFill()));
+    }
+    if (source.getLine() != null) {
+      result.setLine(getLine(source.getLine()));
+    }
+  }
+
+  private static void fillLine(fr.lip6.move.pnml.ptnet.Line source, Line result) {
+    result.setColor(CSS2Color.valueOf(source.getColor().getName()));
+    result.setShape(LineShape.valueOf(source.getShape().getName()));
+    result.setWidth(source.getWidth());
+    result.setStyle(LineStyle.valueOf(source.getStyle().getName()));
+  }
+
+  private static void fillFill(fr.lip6.move.pnml.ptnet.Fill source, Fill result) {
+    result.setColor(CSS2Color.valueOf(source.getColor().getName()));
+    result.setGradientcolor(CSS2Color.valueOf(source.getGradientcolor().getName()));
+    result.setGradientrotation(Gradient.valueOf(source.getGradientrotation().getName()));
+    result.setImage(source.getImage());
+  }
+
+  private static void fillDimension(fr.lip6.move.pnml.ptnet.Dimension source, Dimension result) {
+    fillCoordinate(source, result);
+  }
+
+  private static void fillCoordinate(fr.lip6.move.pnml.ptnet.Coordinate source, Coordinate result) {
+    result.setX(source.getX());
+    result.setY(source.getY());
+  }
+
+  private static void fillOffset(fr.lip6.move.pnml.ptnet.Offset source, Offset result) {
+    fillCoordinate(source, result);
+  }
+
+  private static void fillPosition(fr.lip6.move.pnml.ptnet.Position source, Position result) {
+    fillCoordinate(source, result);
+  }
+
+  private static void fillName(fr.lip6.move.pnml.ptnet.Name source, Name result) {
+    fillAnnotation(source, result);
+
+    result.setText(source.getText());
+  }
+
+  private static void fillAnnotation(fr.lip6.move.pnml.ptnet.Annotation source, Annotation result) {
+    if (source.getAnnotationgraphics() != null) {
+      result.setAnnotationGraphics(getAnnotationGraphics(source.getAnnotationgraphics()));
+    }
+    fillLabel(source, result);
+  }
+
+  private static void fillLabel(fr.lip6.move.pnml.ptnet.Annotation source, Annotation result) {
+    for (fr.lip6.move.pnml.ptnet.ToolInfo info : source.getToolspecifics()) {
+      result.addToolspecific(getToolInfo(info));
+    }
+  }
+
+  private static void fillAnnotationGraphics(fr.lip6.move.pnml.ptnet.AnnotationGraphics source, AnnotationGraphics result) {
+    if (source.getOffset() != null) {
+      result.setOffset(getOffset(source.getOffset()));
+    }
+    if (source.getFill() != null) {
+      result.setFill(getFill(source.getFill()));
+    }
+    if (source.getLine() != null) {
+      result.setLine(getLine(source.getLine()));
+    }
+    if (source.getFont() != null) {
+      result.setFont(getFont(source.getFont()));
+    }
+  }
+
+  private static void fillFont(fr.lip6.move.pnml.ptnet.Font source, Font result) {
+    result.setAlign(FontAlign.valueOf(source.getAlign().getName()));
+    result.setDecoration(FontDecoration.valueOf(source.getDecoration().getName()));
+    result.setFamily(CSS2FontFamily.valueOf(source.getFamily().getName()));
+    result.setRotation(source.getRotation());
+    result.setSize(CSS2FontSize.valueOf(source.getSize().getName()));
+    result.setStyle(CSS2FontStyle.valueOf(source.getStyle().getName()));
+    result.setWeight(CSS2FontWeight.valueOf(source.getWeight().getName()));
+  }
+
+  private static void fillToolInfo(fr.lip6.move.pnml.ptnet.ToolInfo source, ToolInfo result) {
+    result.setTool(source.getTool());
+    result.setVersion(source.getVersion());
+    result.setFormattedXMLBuffer(source.getFormattedXMLBuffer());
+    result.setToolInfoGrammarURI(source.getToolInfoGrammarURI());
+  }
+
+  private static void fillPlace(fr.lip6.move.pnml.ptnet.Place source, Place result) {
+    fillPlaceNode(source, result);
+
+    if (source.getInitialMarking() != null) {
+      result.setInitialMarking(getPTMarking(source.getInitialMarking()));
+    }
+  }
+
+  private static void fillPTMarking(fr.lip6.move.pnml.ptnet.PTMarking source, PTMarking result) {
+    fillAnnotation(source, result);
+
+    // whatever this is supposed to be. they changed the Integer to Long
+    result.setText(Math.toIntExact(source.getText()));
+  }
+
+  private static void fillRefPlace(fr.lip6.move.pnml.ptnet.RefPlace source, RefPlace result) {
+    fillPlaceNode(source, result);
+
+    result.setRef(PlaceNode.createRefDirection(source.getRef().getId()));
+  }
+
+  private static void fillPlaceNode(fr.lip6.move.pnml.ptnet.PlaceNode source, PlaceNode result) {
+    fillNode(source, result);
+
+    for (fr.lip6.move.pnml.ptnet.RefPlace referencingPlace : source.getReferencingPlaces()) {
+      result.addReferencingPlace(RefPlace.createRefDirection(referencingPlace.getId()));
+    }
+  }
+
+  private static void fillRefTransition(fr.lip6.move.pnml.ptnet.RefTransition source, RefTransition result) {
+    fillTransitionNode(source, result);
+
+    result.setRef(TransitionNode.createRefDirection(source.getRef().getId()));
+  }
+
+  private static void fillTransitionNode(fr.lip6.move.pnml.ptnet.TransitionNode source, TransitionNode result) {
+    fillNode(source, result);
+
+    for (fr.lip6.move.pnml.ptnet.RefTransition refTransition : source.getReferencingTransitions()) {
+      result.addReferencingTransition(RefTransition.createRefDirection(refTransition.getId()));
+    }
+  }
+
+  private static void fillTransition(fr.lip6.move.pnml.ptnet.Transition source, Transition result) {
+    fillTransitionNode(source, result);
+  }
+
+  private static void fillNode(fr.lip6.move.pnml.ptnet.Node source, Node result) {
+
+    fillPnObject(source, result);
+
+    if (source.getNodegraphics() != null) {
+      result.setNodeGraphics(getNodeGraphics(source.getNodegraphics()));
+    }
+
+    for (fr.lip6.move.pnml.ptnet.Arc outArc : source.getOutArcs()) {
+      result.addOutArc(Arc.createRefDirection(outArc.getId()));
+    }
+    for (fr.lip6.move.pnml.ptnet.Arc inArc : source.getInArcs()) {
+      result.addInArc(Arc.createRefDirection(inArc.getId()));
+    }
+  }
+
+  private static void fillArc(fr.lip6.move.pnml.ptnet.Arc source, Arc result) {
+    fillPnObject(source, result);
+
+    if (source.getArcgraphics() != null) {
+      result.setArcGraphics(getArcGraphics(source.getArcgraphics()));
+    }
+    if (source.getInscription() != null) {
+      result.setInscription(getPTArcannotation(source.getInscription()));
+    }
+
+    result.setSource(Node.createRefDirection(source.getSource().getId()));
+    result.setTarget(Node.createRefDirection(source.getTarget().getId()));
+  }
+
+  private static void fillPTAnnotation(fr.lip6.move.pnml.ptnet.PTArcAnnotation source, PTArcAnnotation result) {
+    fillAnnotation(source, result);
+
+    // whatever this is supposed to be. they changed the Integer to Long
+    result.setText(Math.toIntExact(source.getText()));
+  }
+
+  private static void fillArcGraphics(fr.lip6.move.pnml.ptnet.ArcGraphics source, ArcGraphics result) {
+    for (fr.lip6.move.pnml.ptnet.Position position : source.getPositions()) {
+      result.addPosition(getPosition(position));
+    }
+    if (source.getLine() != null) {
+      result.setLine(getLine(source.getLine()));
+    }
+  }
+
+
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/PnmlParser.java b/src/main/java/de/tudresden/inf/st/pnml/PnmlParser.java
index 1345498efa6091cbe6f8e065e4c97ab1c227566c..142f7126918a0e93f647ee838659af97f0b9b1a3 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/PnmlParser.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/PnmlParser.java
@@ -1,34 +1,37 @@
 package de.tudresden.inf.st.pnml;
 
-import de.tudresden.inf.st.pnml.jastadd.model.*;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.PnmlParseException;
 import fr.lip6.move.pnml.framework.hlapi.HLAPIRootClass;
 import fr.lip6.move.pnml.framework.utils.ModelRepository;
 import fr.lip6.move.pnml.framework.utils.PNMLUtils;
 import fr.lip6.move.pnml.framework.utils.exception.ImportException;
 import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
-import fr.lip6.move.pnml.ptnet.hlapi.PetriNetDocHLAPI;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.ArrayList;
 import java.util.List;
 
 public class PnmlParser {
 
   private static final Logger logger = LoggerFactory.getLogger(PnmlParser.class);
-  private final PetriNet petriNet;
 
-  /**
-   * Constructor building a JastAdd representation of a Petri net from an EMF PNML representation
-   *
-   * @param source an EMF PNML Petri net
-   * @throws PnmlParseException when the EMF deserialization or the transformation fail
-   */
-  public PnmlParser(fr.lip6.move.pnml.ptnet.PetriNet source) throws PnmlParseException {
-    this.petriNet = getPetriNet(source);
-    petriNet.treeResolveAll();
+  public static List<PetriNet> getPetriNets(HLAPIRootClass source) throws PnmlParseException {
+
+    fr.lip6.move.pnml.framework.general.PNType type = PNMLUtils.determinePNType(source);
+    switch (type) {
+      case PTNET:
+        return PTNetParser.getPetriNets((fr.lip6.move.pnml.ptnet.hlapi.PetriNetDocHLAPI) source);
+      case COREMODEL:
+        return CoreModelParser.getPetriNets((fr.lip6.move.pnml.pnmlcoremodel.hlapi.PetriNetDocHLAPI) source);
+      case SYMNET:
+      case HLPN:
+      case PTHLPN:
+      default:
+        throw new PnmlParseException("Petri net is of unsupported type " + type.getLiteral() + ".");
+    }
   }
 
   /**
@@ -40,7 +43,7 @@ public class PnmlParser {
   public static List<PetriNet> parsePnml(String fileName) throws PnmlParseException {
     Path file = Paths.get(fileName);
 
-    HLAPIRootClass document = null;
+    HLAPIRootClass document;
 
     try {
       document = PNMLUtils.importPnmlDocument(file.toFile(), false);
@@ -51,432 +54,7 @@ public class PnmlParser {
 
     logger.info("Imported document workspace ID: {}", ModelRepository.getInstance().getCurrentDocWSId());
 
-    List<PetriNet> petriNets = new ArrayList<>();
-
-    fr.lip6.move.pnml.framework.general.PNType type = PNMLUtils.determinePNType(document);
-    switch (type) {
-      case PTNET:
-        PetriNetDocHLAPI ptDoc = (PetriNetDocHLAPI) document;
-
-        for (fr.lip6.move.pnml.ptnet.PetriNet pmnlNet : ptDoc.getNets()) {
-          PnmlParser parser;
-          parser = new PnmlParser(pmnlNet);
-          petriNets.add(parser.getPetriNet());
-        }
-
-        break;
-      case COREMODEL:
-      case SYMNET:
-      case HLPN:
-      case PTHLPN:
-      default:
-        throw new PnmlParseException("Petri net is of unsupported type " + type.getLiteral() + ".");
-    }
-    return petriNets;
-  }
-
-  /**
-   * @return the most recently parsed JastAdd representation
-   */
-  public PetriNet getPetriNet() {
-    return petriNet;
-  }
-
-  // the get methods
-
-  private PetriNet getPetriNet(fr.lip6.move.pnml.ptnet.PetriNet source) throws PnmlParseException {
-    PetriNet result = new PetriNet();
-    fillPetriNet(source, result);
-    return result;
-  }
-
-  private Page getPage(fr.lip6.move.pnml.ptnet.Page source) throws PnmlParseException {
-    Page result = new Page();
-    fillPage(source, result);
-    return result;
-  }
-
-  private NodeGraphics getNodeGraphics(fr.lip6.move.pnml.ptnet.NodeGraphics source) {
-    NodeGraphics result = new NodeGraphics();
-    fillNodeGraphics(source, result);
-    return result;
-  }
-
-  private Line getLine(fr.lip6.move.pnml.ptnet.Line source) {
-    Line result = new Line();
-    fillLine(source, result);
-    return result;
-  }
-
-  private Fill getFill(fr.lip6.move.pnml.ptnet.Fill source) {
-    Fill result = new Fill();
-    fillFill(source, result);
-    return result;
-  }
-
-  private Dimension getDimension(fr.lip6.move.pnml.ptnet.Dimension source) {
-    Dimension result = new Dimension();
-    fillDimension(source, result);
-    return result;
-  }
-
-  private Offset getOffset(fr.lip6.move.pnml.ptnet.Offset source) {
-    Offset result = new Offset();
-    fillOffset(source, result);
-    return result;
-  }
-
-  private Position getPosition(fr.lip6.move.pnml.ptnet.Position source) {
-    Position result = new Position();
-    fillPosition(source, result);
-    return result;
-  }
-
-  private Name getName(fr.lip6.move.pnml.ptnet.Name source) {
-    Name result = new Name();
-    fillName(source, result);
-    return result;
-  }
-
-  private AnnotationGraphics getAnnotationGraphics(fr.lip6.move.pnml.ptnet.AnnotationGraphics source) {
-    AnnotationGraphics result = new AnnotationGraphics();
-    fillAnnotationGraphics(source, result);
-    return result;
-  }
-
-  private Font getFont(fr.lip6.move.pnml.ptnet.Font source) {
-    Font result = new Font();
-    fillFont(source, result);
-    return result;
-  }
-
-  private ToolInfo getToolInfo(fr.lip6.move.pnml.ptnet.ToolInfo source) {
-    ToolInfo result = new ToolInfo();
-    fillToolInfo(source, result);
-    return result;
-  }
-
-  private Node getNode(fr.lip6.move.pnml.ptnet.Node source) throws PnmlParseException {
-    if (source instanceof fr.lip6.move.pnml.ptnet.PlaceNode) {
-      return getPlaceNode((fr.lip6.move.pnml.ptnet.PlaceNode) source);
-    } else if (source instanceof fr.lip6.move.pnml.ptnet.TransitionNode) {
-      return getTransitionNode((fr.lip6.move.pnml.ptnet.TransitionNode) source);
-    } else {
-      throw new PnmlParseException("Encountered illegal unknown subtype of Node " + source.getClass().getCanonicalName());
-    }
-  }
-
-  private PlaceNode getPlaceNode(fr.lip6.move.pnml.ptnet.PlaceNode source) throws PnmlParseException {
-    if (source instanceof fr.lip6.move.pnml.ptnet.Place) {
-      return getPlace((fr.lip6.move.pnml.ptnet.Place) source);
-    } else if (source instanceof fr.lip6.move.pnml.ptnet.RefPlace) {
-      return getRefPlace((fr.lip6.move.pnml.ptnet.RefPlace) source);
-    } else {
-      throw new PnmlParseException("Encountered illegal unknown subtype of PlaceNode " + source.getClass().getCanonicalName());
-    }
-  }
-
-  private Place getPlace(fr.lip6.move.pnml.ptnet.Place source) {
-    Place result = new Place();
-    fillPlace(source, result);
-    return result;
-  }
-
-  private PTMarking getPTMarking(fr.lip6.move.pnml.ptnet.PTMarking source) {
-    PTMarking result = new PTMarking();
-    fillPTMarking(source, result);
-    return result;
-  }
-
-  private RefPlace getRefPlace(fr.lip6.move.pnml.ptnet.RefPlace source) {
-    RefPlace result = new RefPlace();
-    fillRefPlace(source, result);
-    return result;
-  }
-
-  private TransitionNode getTransitionNode(fr.lip6.move.pnml.ptnet.TransitionNode source) throws PnmlParseException {
-    if (source instanceof fr.lip6.move.pnml.ptnet.Transition) {
-      return getTransition((fr.lip6.move.pnml.ptnet.Transition) source);
-    } else if (source instanceof fr.lip6.move.pnml.ptnet.RefTransition) {
-      return getRefTransition((fr.lip6.move.pnml.ptnet.RefTransition) source);
-    } else {
-      throw new PnmlParseException("Encountered illegal unknown subtype of TransitionNode " + source.getClass().getCanonicalName());
-    }
-  }
-
-  private RefTransition getRefTransition(fr.lip6.move.pnml.ptnet.RefTransition source) {
-    RefTransition result = new RefTransition();
-    fillRefTransition(source, result);
-    return result;
-  }
-
-  private Transition getTransition(fr.lip6.move.pnml.ptnet.Transition source) {
-    Transition result = new Transition();
-    fillTransition(source, result);
-    return result;
-  }
-
-  private Arc getArc(fr.lip6.move.pnml.ptnet.Arc source) {
-    Arc result = new Arc();
-    fillArc(source, result);
-    return result;
-  }
-
-  private PTArcAnnotation getPTArcannotation(fr.lip6.move.pnml.ptnet.PTArcAnnotation source) {
-    PTArcAnnotation result = new PTArcAnnotation();
-    fillPTAnnotation(source, result);
-    return result;
-  }
-
-  private ArcGraphics getArcGraphics(fr.lip6.move.pnml.ptnet.ArcGraphics source) {
-    ArcGraphics result = new ArcGraphics();
-    fillArcGraphics(source, result);
-    return result;
-  }
-
-  private PnObject getPnObject(fr.lip6.move.pnml.ptnet.PnObject source) throws PnmlParseException {
-    if (source instanceof fr.lip6.move.pnml.ptnet.Page) {
-      return getPage((fr.lip6.move.pnml.ptnet.Page) source);
-    } else if (source instanceof Node) {
-      return getNode((fr.lip6.move.pnml.ptnet.Node) source);
-    } else if (source instanceof fr.lip6.move.pnml.ptnet.Arc) {
-      return getArc((fr.lip6.move.pnml.ptnet.Arc) source);
-    } else if (source instanceof fr.lip6.move.pnml.ptnet.Node) {
-      return getNode((fr.lip6.move.pnml.ptnet.Node) source);
-    } else {
-      throw new PnmlParseException("Encountered illegal unknown subtype of PnObject " + source.getClass().getCanonicalName());
-    }
-  }
-
-  // the fill methods
-
-  private void fillPetriNet(fr.lip6.move.pnml.ptnet.PetriNet source, PetriNet result) throws PnmlParseException {
-    for (fr.lip6.move.pnml.ptnet.Page page : source.getPages()) {
-      result.addPage(getPage(page));
-    }
-    if (source.getName() != null) {
-      result.setName(getName(source.getName()));
-    }
-    for (fr.lip6.move.pnml.ptnet.ToolInfo toolInfo : source.getToolspecifics()) {
-      result.addToolspecific(getToolInfo(toolInfo));
-    }
-    result.setId(source.getId());
-    if (source.getType() == fr.lip6.move.pnml.ptnet.PNType.PTNET) {
-      result.setType(PNType.PTNET);
-    } else {
-      throw new PnmlParseException("Illegal Petri Net type '" + source.getType().getLiteral() + "' encountered.");
-    }
-  }
-
-  private void fillPage(fr.lip6.move.pnml.ptnet.Page source, Page result) throws PnmlParseException {
-    fillPnObject(source, result);
-
-    for (fr.lip6.move.pnml.ptnet.PnObject object : source.getObjects()) {
-      result.addObject(getPnObject(object));
-    }
-    if (source.getNodegraphics() != null) {
-      result.setNodeGraphics(getNodeGraphics(source.getNodegraphics()));
-    }
-  }
-
-  private void fillPnObject(fr.lip6.move.pnml.ptnet.PnObject source, PnObject result) {
-    if (source.getName() != null) {
-      result.setName(getName(source.getName()));
-    }
-    for (fr.lip6.move.pnml.ptnet.ToolInfo toolInfo : source.getToolspecifics()) {
-      result.addToolspecific(getToolInfo(toolInfo));
-    }
-    result.setId(source.getId());
-  }
-
-  private void fillNodeGraphics(fr.lip6.move.pnml.ptnet.NodeGraphics source, NodeGraphics result) {
-    if (source.getPosition() != null) {
-      result.setPosition(getPosition(source.getPosition()));
-    }
-    if (source.getDimension() != null) {
-      result.setDimension(getDimension(source.getDimension()));
-    }
-    if (source.getFill() != null) {
-      result.setFill(getFill(source.getFill()));
-    }
-    if (source.getLine() != null) {
-      result.setLine(getLine(source.getLine()));
-    }
-  }
-
-  private void fillLine(fr.lip6.move.pnml.ptnet.Line source, Line result) {
-    result.setColor(CSS2Color.valueOf(source.getColor().getName()));
-    result.setShape(LineShape.valueOf(source.getShape().getName()));
-    result.setWidth(source.getWidth());
-    result.setStyle(LineStyle.valueOf(source.getStyle().getName()));
-  }
-
-  private void fillFill(fr.lip6.move.pnml.ptnet.Fill source, Fill result) {
-    result.setColor(CSS2Color.valueOf(source.getColor().getName()));
-    result.setGradientcolor(CSS2Color.valueOf(source.getGradientcolor().getName()));
-    result.setGradientrotation(Gradient.valueOf(source.getGradientrotation().getName()));
-    result.setImage(source.getImage());
-  }
-
-  private void fillDimension(fr.lip6.move.pnml.ptnet.Dimension source, Dimension result) {
-    fillCoordinate(source, result);
-  }
-
-  private void fillCoordinate(fr.lip6.move.pnml.ptnet.Coordinate source, Coordinate result) {
-    result.setX(source.getX());
-    result.setY(source.getY());
-  }
-
-  private void fillOffset(fr.lip6.move.pnml.ptnet.Offset source, Offset result) {
-    fillCoordinate(source, result);
-  }
-
-  private void fillPosition(fr.lip6.move.pnml.ptnet.Position source, Position result) {
-    fillCoordinate(source, result);
-  }
-
-  private void fillName(fr.lip6.move.pnml.ptnet.Name source, Name result) {
-    fillAnnotation(source, result);
-
-    result.setText(source.getText());
-  }
-
-  private void fillAnnotation(fr.lip6.move.pnml.ptnet.Annotation source, Annotation result) {
-    if (source.getAnnotationgraphics() != null) {
-      result.setAnnotationGraphics(getAnnotationGraphics(source.getAnnotationgraphics()));
-    }
-    fillLabel(source, result);
-  }
-
-  private void fillLabel(fr.lip6.move.pnml.ptnet.Annotation source, Annotation result) {
-    for (fr.lip6.move.pnml.ptnet.ToolInfo info : source.getToolspecifics()) {
-      result.addToolspecific(getToolInfo(info));
-    }
-  }
-
-  private void fillAnnotationGraphics(fr.lip6.move.pnml.ptnet.AnnotationGraphics source, AnnotationGraphics result) {
-    if (source.getOffset() != null) {
-      result.setOffset(getOffset(source.getOffset()));
-    }
-    if (source.getFill() != null) {
-      result.setFill(getFill(source.getFill()));
-    }
-    if (source.getLine() != null) {
-      result.setLine(getLine(source.getLine()));
-    }
-    if (source.getFont() != null) {
-      result.setFont(getFont(source.getFont()));
-    }
-  }
-
-  private void fillFont(fr.lip6.move.pnml.ptnet.Font source, Font result) {
-    result.setAlign(FontAlign.valueOf(source.getAlign().getName()));
-    result.setDecoration(FontDecoration.valueOf(source.getDecoration().getName()));
-    result.setFamily(CSS2FontFamily.valueOf(source.getFamily().getName()));
-    result.setRotation(source.getRotation());
-    result.setSize(CSS2FontSize.valueOf(source.getSize().getName()));
-    result.setStyle(CSS2FontStyle.valueOf(source.getStyle().getName()));
-    result.setWeight(CSS2FontWeight.valueOf(source.getWeight().getName()));
-  }
-
-  private void fillToolInfo(fr.lip6.move.pnml.ptnet.ToolInfo source, ToolInfo result) {
-    result.setTool(source.getTool());
-    result.setVersion(source.getVersion());
-    result.setFormattedXMLBuffer(source.getFormattedXMLBuffer());
-    result.setToolInfoGrammarURI(source.getToolInfoGrammarURI());
-  }
-
-  private void fillPlace(fr.lip6.move.pnml.ptnet.Place source, Place result) {
-    fillPlaceNode(source, result);
-
-    if (source.getInitialMarking() != null) {
-      result.setInitialMarking(getPTMarking(source.getInitialMarking()));
-    }
-  }
-
-  private void fillPTMarking(fr.lip6.move.pnml.ptnet.PTMarking source, PTMarking result) {
-    fillAnnotation(source, result);
-
-    // whatever this is supposed to be. they changed the Integer to Long
-    result.setText(Math.toIntExact(source.getText()));
-  }
-
-  private void fillRefPlace(fr.lip6.move.pnml.ptnet.RefPlace source, RefPlace result) {
-    fillPlaceNode(source, result);
-
-    result.setRef(PlaceNode.createRefDirection(source.getRef().getId()));
-  }
-
-  private void fillPlaceNode(fr.lip6.move.pnml.ptnet.PlaceNode source, PlaceNode result) {
-    fillNode(source, result);
-
-    for (fr.lip6.move.pnml.ptnet.RefPlace referencingPlace : source.getReferencingPlaces()) {
-      result.addReferencingPlace(RefPlace.createRefDirection(referencingPlace.getId()));
-    }
-  }
-
-  private void fillRefTransition(fr.lip6.move.pnml.ptnet.RefTransition source, RefTransition result) {
-    fillTransitionNode(source, result);
-
-    result.setRef(TransitionNode.createRefDirection(source.getRef().getId()));
-  }
-
-  private void fillTransitionNode(fr.lip6.move.pnml.ptnet.TransitionNode source, TransitionNode result) {
-    fillNode(source, result);
-
-    for (fr.lip6.move.pnml.ptnet.RefTransition refTransition : source.getReferencingTransitions()) {
-      result.addReferencingTransition(RefTransition.createRefDirection(refTransition.getId()));
-    }
-  }
-
-  private void fillTransition(fr.lip6.move.pnml.ptnet.Transition source, Transition result) {
-    fillTransitionNode(source, result);
-  }
-
-  private void fillNode(fr.lip6.move.pnml.ptnet.Node source, Node result) {
-
-    fillPnObject(source, result);
-
-    if (source.getNodegraphics() != null) {
-      result.setNodeGraphics(getNodeGraphics(source.getNodegraphics()));
-    }
-
-    for (fr.lip6.move.pnml.ptnet.Arc outArc : source.getOutArcs()) {
-      result.addOutArc(Arc.createRefDirection(outArc.getId()));
-    }
-    for (fr.lip6.move.pnml.ptnet.Arc inArc : source.getInArcs()) {
-      result.addInArc(Arc.createRefDirection(inArc.getId()));
-    }
-  }
-
-  private void fillArc(fr.lip6.move.pnml.ptnet.Arc source, Arc result) {
-    fillPnObject(source, result);
-
-    if (source.getArcgraphics() != null) {
-      result.setArcGraphics(getArcGraphics(source.getArcgraphics()));
-    }
-    if (source.getInscription() != null) {
-      result.setInscription(getPTArcannotation(source.getInscription()));
-    }
-
-    result.setSource(Node.createRefDirection(source.getSource().getId()));
-    result.setTarget(Node.createRefDirection(source.getTarget().getId()));
-  }
-
-  private void fillPTAnnotation(fr.lip6.move.pnml.ptnet.PTArcAnnotation source, PTArcAnnotation result) {
-    fillAnnotation(source, result);
-
-    // whatever this is supposed to be. they changed the Integer to Long
-    result.setText(Math.toIntExact(source.getText()));
-  }
-
-  private void fillArcGraphics(fr.lip6.move.pnml.ptnet.ArcGraphics source, ArcGraphics result) {
-    for (fr.lip6.move.pnml.ptnet.Position position : source.getPositions()) {
-      result.addPosition(getPosition(position));
-    }
-    if (source.getLine() != null) {
-      result.setLine(getLine(source.getLine()));
-    }
+    return getPetriNets(document);
   }
 
 }
diff --git a/src/main/resources/PnmlRelAstVersion.properties b/src/main/resources/PnmlRelAstVersion.properties
index 1daf2cbb1dba68efb1605ce085e4913c6f56ccc5..35efc4a9e275c292302e1f9af45059db44e96ca7 100644
--- a/src/main/resources/PnmlRelAstVersion.properties
+++ b/src/main/resources/PnmlRelAstVersion.properties
@@ -1,2 +1,2 @@
-#Mon Oct 17 16:25:21 CEST 2022
-version=0.2.0
+#Mon Oct 17 18:45:10 CEST 2022
+version=0.3.0