diff --git a/model/src/main/java/lcsb/mapviewer/model/LogMarker.java b/model/src/main/java/lcsb/mapviewer/model/LogMarker.java
index af9310d7d93f4851b220e2b7b07b2bdcd9f7f3d5..23ae2a0d457869bb2b59a287b09455e85aeaa2c8 100644
--- a/model/src/main/java/lcsb/mapviewer/model/LogMarker.java
+++ b/model/src/main/java/lcsb/mapviewer/model/LogMarker.java
@@ -32,6 +32,14 @@ public class LogMarker implements Marker {
     entry = new ProjectLogEntry(marker.getEntry());
   }
 
+  public LogMarker(ProjectLogEntryType type, String objectClass, String objectIdentifier, String mapName) {
+    entry = new ProjectLogEntry();
+    entry.setType(type);
+    entry.setObjectIdentifier(objectIdentifier);
+    entry.setObjectClass(objectClass);
+    entry.setMapName(mapName);
+  }
+
   @Override
   public Marker addParents(Marker... markers) {
     throw new NotImplementedException();
diff --git a/model/src/main/java/lcsb/mapviewer/model/ProjectLogEntryType.java b/model/src/main/java/lcsb/mapviewer/model/ProjectLogEntryType.java
index 42d1186ca6c3e6b5d50d9c543797e5c11bfba02a..a04c2a007b8d6fe16d2fbf550bf3a39b0af1318e 100644
--- a/model/src/main/java/lcsb/mapviewer/model/ProjectLogEntryType.java
+++ b/model/src/main/java/lcsb/mapviewer/model/ProjectLogEntryType.java
@@ -9,5 +9,6 @@ public enum ProjectLogEntryType {
   MISSING_ANNOTATION,
   MISSING_REQUIRED_ANNOTATION,
   OUT_OF_MEMORY,
-  OTHER,
+  OTHER, 
+  PARSING_ISSUE,
 }
diff --git a/pathvisio/pom.xml b/pathvisio/pom.xml
index 30ee0f01455a80296445bc7ed63ace99ae147b74..cb567c594c82f5e67351f3f03b0a6cf8a93a6612 100644
--- a/pathvisio/pom.xml
+++ b/pathvisio/pom.xml
@@ -1,145 +1,57 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>lcsb.mapviewer</groupId>
-    <artifactId>parent</artifactId>
-    <version>1.0</version>
-  </parent>
-  <artifactId>pathvisio</artifactId>
-  <name>Pathvisio plugin</name>
-  
-<!--   <packaging>bundle</packaging>
-  
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.felix</groupId>
-				<artifactId>maven-bundle-plugin</artifactId>
-				<version>4.0.0</version>
-				<extensions>true</extensions>
-				
-				<configuration>
-					<instructions>
-						<Bundle-Activator>lcsb.mapviewer.wikipathway.Activator</Bundle-Activator>
-						<Bundle-Name>CellDesigner plugin v.${svnversion}</Bundle-Name>
-						
-						<Embed-Transitive>true</Embed-Transitive>
-						<Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
-						<Import-Package>!org.relaxng.datatype,
-														!org.slf4j,
-														!org.slf4j.spi,
-														!com.fasterxml.classmate,
- 														!com.fasterxml.classmate.members,
- 														!com.ibm.uvm.tools,
- 														!com.sun.jdi,
- 														!com.sun.jdi.connect,
- 														!com.sun.jdi.event,
- 														!com.sun.jdi.request,
- 														!com.sun.jdmk.comm,
- 														!com.sun.msv.datatype,
- 														!com.sun.msv.datatype.xsd,
- 														!com.google.gson,
- 														!javax.imageio,
- 														!javax.jmdns,
- 														!javax.jms,
- 														!javax.mail,
- 														!javax.mail.internet,
- 														!javax.management,
- 														!javax.naming,
- 														!javax.naming.event,
- 														!javax.naming.spi,
- 														!javax.security.auth,
- 														!javax.security.jacc,
- 														!javax.sql,
- 														!javax.swing,
- 														!javax.swing.border,
- 														!javax.swing.event,
- 														!javax.swing.filechooser,
- 														!javax.swing.plaf,
- 														!javax.swing.table,
- 														!javax.swing.text,
- 														!javax.swing.text.html,
- 														!javax.swing.tree,
- 														!javax.validation,
- 														!javax.validation.constraints,
- 														!javax.validation.groups,
- 														!javax.validation.metadata,
- 														!javax.xml,
- 														!javax.xml.bind,
- 														!javax.xml.bind.annotation,
- 														!javax.xml.bind.annotation.adapters,
- 														!javax.xml.namespace,
- 														!javax.xml.parsers,
- 														!javax.xml.stream,
- 														!javax.xml.stream.events,
- 														!javax.xml.stream.util,
- 														!javax.xml.transform,
- 														!javax.xml.transform.dom,
- 														!javax.xml.transform.sax,
- 														!javax.xml.transform.stream,
- 														!javax.xml.validation,
- 														!oracle.xml.parser,
- 														!oracle.xml.parser.v2,
- 														!org.apache.batik.dom,
- 														!org.apache.batik.svggen,
- 														!org.apache.batik.transcoder,
- 														!org.apache.batik.transcoder.image,
- 														!org.apache.commons.math,
- 														!org.apache.commons.math.stat,
- 														!org.apache.commons.math.stat.inference,
- 														!org.apache.commons.vfs2,
- 														!org.apache.fop.svg,
- 														!org.apache.tools.ant,
- 														!org.apache.tools.ant.taskdefs,
- 														!org.apache.tools.ant.types,
- 														!org.bridgedb,
- 														!org.bridgedb.bio,
- 														!org.bridgedb.gui,
- 														!org.bridgedb.rdb.construct,
- 														!org.gjt.xpp,
- 														!org.jaxen,
-														!org.jaxen.jdom, 														
- 														!org.jaxen.dom4j,
- 														!org.jaxen.pattern,
- 														!org.jaxen.saxpath,
- 														!org.jboss.jandex,
- 														!org.jboss.logmanager,
- 														!org.jdom,
- 														!org.jdom.input,
- 														!org.jdom.output,
- 														!org.pathvisio.data,
- 														!org.w3c.dom,
- 														!org.w3c.dom.events,
- 														!org.w3c.dom.ranges,
- 														!org.w3c.dom.traversal,
- 														!org.xml.sax,
- 														!org.xml.sax.ext,
- 														!org.xml.sax.helpers,
- 														!org.xmlpull.v1,
- 														!sun.io,
- 														!sun.misc,
-														org.osgi.framework;version=1.3.0,*</Import-Package>
-						<Require-Bundle>org.pathvisio.core;bundle-version=3.0.0,
-														org.pathvisio.desktop;bundle-version=3.0.0,
-														org.pathvisio.gui;bundle-version=3.0.0
-						</Require-Bundle>
-					</instructions>
-				</configuration>
-			</plugin>	
-		</plugins>
-	</build>
---> 
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>lcsb.mapviewer</groupId>
+		<artifactId>parent</artifactId>
+		<version>1.0</version>
+	</parent>
+	<artifactId>pathvisio</artifactId>
+	<name>Pathvisio plugin</name>
+
+	<!-- <packaging>bundle</packaging> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> 
+		<artifactId>maven-bundle-plugin</artifactId> <version>4.0.0</version> <extensions>true</extensions> 
+		<configuration> <instructions> <Bundle-Activator>lcsb.mapviewer.wikipathway.Activator</Bundle-Activator> 
+		<Bundle-Name>CellDesigner plugin v.${svnversion}</Bundle-Name> <Embed-Transitive>true</Embed-Transitive> 
+		<Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency> 
+		<Import-Package>!org.relaxng.datatype, !org.slf4j, !org.slf4j.spi, !com.fasterxml.classmate, 
+		!com.fasterxml.classmate.members, !com.ibm.uvm.tools, !com.sun.jdi, !com.sun.jdi.connect, 
+		!com.sun.jdi.event, !com.sun.jdi.request, !com.sun.jdmk.comm, !com.sun.msv.datatype, 
+		!com.sun.msv.datatype.xsd, !com.google.gson, !javax.imageio, !javax.jmdns, 
+		!javax.jms, !javax.mail, !javax.mail.internet, !javax.management, !javax.naming, 
+		!javax.naming.event, !javax.naming.spi, !javax.security.auth, !javax.security.jacc, 
+		!javax.sql, !javax.swing, !javax.swing.border, !javax.swing.event, !javax.swing.filechooser, 
+		!javax.swing.plaf, !javax.swing.table, !javax.swing.text, !javax.swing.text.html, 
+		!javax.swing.tree, !javax.validation, !javax.validation.constraints, !javax.validation.groups, 
+		!javax.validation.metadata, !javax.xml, !javax.xml.bind, !javax.xml.bind.annotation, 
+		!javax.xml.bind.annotation.adapters, !javax.xml.namespace, !javax.xml.parsers, 
+		!javax.xml.stream, !javax.xml.stream.events, !javax.xml.stream.util, !javax.xml.transform, 
+		!javax.xml.transform.dom, !javax.xml.transform.sax, !javax.xml.transform.stream, 
+		!javax.xml.validation, !oracle.xml.parser, !oracle.xml.parser.v2, !org.apache.batik.dom, 
+		!org.apache.batik.svggen, !org.apache.batik.transcoder, !org.apache.batik.transcoder.image, 
+		!org.apache.commons.math, !org.apache.commons.math.stat, !org.apache.commons.math.stat.inference, 
+		!org.apache.commons.vfs2, !org.apache.fop.svg, !org.apache.tools.ant, !org.apache.tools.ant.taskdefs, 
+		!org.apache.tools.ant.types, !org.bridgedb, !org.bridgedb.bio, !org.bridgedb.gui, 
+		!org.bridgedb.rdb.construct, !org.gjt.xpp, !org.jaxen, !org.jaxen.jdom, !org.jaxen.dom4j, 
+		!org.jaxen.pattern, !org.jaxen.saxpath, !org.jboss.jandex, !org.jboss.logmanager, 
+		!org.jdom, !org.jdom.input, !org.jdom.output, !org.pathvisio.data, !org.w3c.dom, 
+		!org.w3c.dom.events, !org.w3c.dom.ranges, !org.w3c.dom.traversal, !org.xml.sax, 
+		!org.xml.sax.ext, !org.xml.sax.helpers, !org.xmlpull.v1, !sun.io, !sun.misc, 
+		org.osgi.framework;version=1.3.0,*</Import-Package> <Require-Bundle>org.pathvisio.core;bundle-version=3.0.0, 
+		org.pathvisio.desktop;bundle-version=3.0.0, org.pathvisio.gui;bundle-version=3.0.0 
+		</Require-Bundle> </instructions> </configuration> </plugin> </plugins> </build> -->
 	<repositories>
 		<repository>
-   		<id>repo</id>
-    	<releases>
-       	<enabled>true</enabled>
-       	<checksumPolicy>ignore</checksumPolicy>
-    	</releases>
-    	<snapshots>
-        <enabled>false</enabled>
-    	</snapshots>
-    	<url>file://${project.basedir}/repo</url>
+			<id>repo</id>
+			<releases>
+				<enabled>true</enabled>
+				<checksumPolicy>ignore</checksumPolicy>
+			</releases>
+			<snapshots>
+				<enabled>false</enabled>
+			</snapshots>
+			<url>file://${project.basedir}/repo</url>
 		</repository>
 	</repositories>
 
@@ -149,39 +61,39 @@
 			<artifactId>core</artifactId>
 			<version>${pathvisio.version}</version>
 		</dependency>
-	
+
 		<dependency>
 			<groupId>org.pathvisio</groupId>
 			<artifactId>desktop</artifactId>
 			<version>${pathvisio.version}</version>
 		</dependency>
-	
+
 		<dependency>
 			<groupId>org.pathvisio</groupId>
 			<artifactId>gui</artifactId>
 			<version>${pathvisio.version}</version>
 		</dependency>
-	
+
 		<dependency>
-    	<groupId>lcsb.mapviewer</groupId>
-      <artifactId>model</artifactId>
-      <version>1.0</version>
-    </dependency>
+			<groupId>lcsb.mapviewer</groupId>
+			<artifactId>model</artifactId>
+			<version>1.0</version>
+		</dependency>
 
 		<dependency>
-    	<groupId>lcsb.mapviewer</groupId>
-      <artifactId>converter-CellDesigner</artifactId>
-      <version>1.0</version>
-    </dependency>
+			<groupId>lcsb.mapviewer</groupId>
+			<artifactId>converter-CellDesigner</artifactId>
+			<version>1.0</version>
+		</dependency>
 
 		<dependency>
-    	<groupId>lcsb.mapviewer</groupId>
-      <artifactId>converter-graphics</artifactId>
-      <scope>test</scope>
-      <version>1.0</version>
-    </dependency>
+			<groupId>lcsb.mapviewer</groupId>
+			<artifactId>converter-graphics</artifactId>
+			<scope>test</scope>
+			<version>1.0</version>
+		</dependency>
 
-		<!-- Log4J2-->
+		<!-- Log4J2 -->
 		<dependency>
 			<groupId>org.apache.logging.log4j</groupId>
 			<artifactId>log4j-api</artifactId>
@@ -193,11 +105,11 @@
 			<version>${log4j2.version}</version>
 		</dependency>
 
-    <dependency>
-    	<groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <version>${osgi.version}</version>
-    </dependency>
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<version>${osgi.version}</version>
+		</dependency>
 
 		<dependency>
 			<groupId>junit</groupId>
@@ -206,5 +118,14 @@
 			<scope>test</scope>
 		</dependency>
 
+		<!-- mockito used for testing -->
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<version>${mockito.version}</version>
+			<scope>test</scope>
+		</dependency>
+
+
 	</dependencies>
 </project>
\ No newline at end of file
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java
index 796d4a006eb3dff90a82508037b8d1b981ca0143..4b0bc2275fbd7273faa2e80deeab52b8e6e650c1 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/GpmlParser.java
@@ -35,7 +35,7 @@ public class GpmlParser extends Converter {
 
   @Override
   public String model2String(Model model) throws InconsistentModelException, ConverterException {
-    ModelToGPML modelToGPML = new ModelToGPML();
+    ModelToGPML modelToGPML = new ModelToGPML(model.getName());
     return modelToGPML.getGPML(model);
   }
 
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/ImportExport.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/ImportExport.java
index f9279eb532056c40d9add52ae74902249666b800..4e7649b14147168487f18e87c88709f408f6242c 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/ImportExport.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/ImportExport.java
@@ -112,7 +112,7 @@ public class ImportExport implements Plugin {
 
         CellDesignerXmlParser parser = new CellDesignerXmlParser();
         Model model = (Model) parser.createModel(new ConverterParams().filename(fileName).sizeAutoAdjust(false));
-        String tmp = new ModelToGPML().getGPML(model);
+        String tmp = new ModelToGPML(model.getName()).getGPML(model);
         InputStream stream = new ByteArrayInputStream(tmp.getBytes(StandardCharsets.UTF_8));
         Boolean validate = false;
         pathway.readFromXml(stream, validate);
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java
index e1a3725b8d2e926e4da1ccfb2d798f3dbfcaa704..7479f5ad1b82b6df6b6e19e946b6f4d860e9cbcd 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/BiopaxParser.java
@@ -8,12 +8,14 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
 import lcsb.mapviewer.common.XmlParser;
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.wikipathway.model.biopax.*;
 
 /**
- * Parser of Biopax data from the gpml file.
+ * Parser of Biopax data from the GPML file.
  * 
  * @author Piotr Gawron
  * 
@@ -34,7 +36,13 @@ public class BiopaxParser {
    * Mapping between {@link MiriamData} and hash value.
    */
   private Map<MiriamData, String> miriamHash = new HashMap<>();
+  
+  private String mapName;
 
+  public BiopaxParser(String mapName) {
+    this.mapName = mapName;
+  }
+  
   /**
    * Creates data structure from BioPax xml node.
    * 
@@ -51,7 +59,7 @@ public class BiopaxParser {
         if ("bp:PublicationXref".equalsIgnoreCase(node.getNodeName())) {
           BiopaxPublication publication = parsePublication(node);
           if (publication.getId() == null || publication.getId().isEmpty()) {
-            logger.warn("No pubmed identifier defined for publication: title: " + publication.getTitle());
+            logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, publication.getId(), "BioPax", mapName), "No pubmed identifier defined for publication: title: " + publication.getTitle());
           }
           result.addPublication(publication);
         } else if ("bp:openControlledVocabulary".equalsIgnoreCase(node.getNodeName())) {
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/CyclicEdgeException.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/CyclicEdgeException.java
index 1d2a3e863e19170b2b0146d0948d721012b21cdd..dd3c892074010c8bfba9a58ea35e166f571a4019 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/CyclicEdgeException.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/CyclicEdgeException.java
@@ -1,6 +1,8 @@
 package lcsb.mapviewer.wikipathway.XML;
 
 import lcsb.mapviewer.converter.ConverterException;
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.wikipathway.model.Edge;
 
 /**
  * Exception that shold be thrown when edges create a cycle. Consider an example
@@ -25,14 +27,24 @@ public class CyclicEdgeException extends ConverterException {
    */
   private static final long serialVersionUID = 1L;
 
+  private Edge edge;
+
   /**
    * Default constructor with message passed in the argument.
    * 
    * @param string
    *          message of this exception
    */
-  public CyclicEdgeException(String string) {
+  public CyclicEdgeException(String string, Edge edge) {
     super(string);
+    this.edge = edge;
+  }
+
+  public LogMarker getLogMarker() {
+    if (edge != null) {
+      return edge.getLogMarker();
+    }
+    return null;
   }
 
 }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java
index 445bf4de09cc6690e7d0baff393d86ae49c8c56b..83c86d3a206194ee4c094f044bca365b6c90ed1c 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java
@@ -24,21 +24,26 @@ import lcsb.mapviewer.wikipathway.model.*;
 public class DataNodeParser extends GraphicalPathwayElementParser<DataNode> {
 
   /**
-   * Default claass logger.
+   * Default class logger.
    */
   private final Logger logger = LogManager.getLogger(DataNodeParser.class);
 
   /**
    * PArser used to process references.
    */
-  private final ReferenceParser referenceParser = new ReferenceParser();
+  private final ReferenceParser referenceParser;
+
+  public DataNodeParser(String mapName) {
+    super(mapName);
+    referenceParser = new ReferenceParser(mapName);
+  }
 
   @Override
   public DataNode parse(Element eElement) throws UnknownTypeException {
     if (!eElement.getNodeName().equals("DataNode")) {
       throw new InvalidArgumentException(ShapeParser.class.getSimpleName() + " can parse only DataNode xml nodes");
     }
-    DataNode node = new DataNode(eElement.getAttribute("GraphId"));
+    DataNode node = new DataNode(eElement.getAttribute("GraphId"), getMapName());
 
     for (Pair<String, String> entry : getAttributes(eElement)) {
       switch (entry.getLeft()) {
@@ -184,12 +189,12 @@ public class DataNodeParser extends GraphicalPathwayElementParser<DataNode> {
     case ("org.pathvisio.model.GenMAPP-Xref"):
       // skip it when it's empty
       if (!value.isEmpty()) {
-        logger.warn(shape.getWarningPrefix() + "Unknown attribute of node. Key: " + key + "; value: " + value);
+        logger.warn(shape.getLogMarker() + "Unknown attribute of node. Key: " + key + "; value: " + value);
         break;
       }
       break;
     default:
-      logger.warn(shape.getWarningPrefix() + "Unknown attribute of node. Key: " + key + "; value: " + value);
+      logger.warn(shape.getLogMarker() + "Unknown attribute of node. Key: " + key + "; value: " + value);
       break;
     }
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java
index 7a534a22728935567f347401b3096394d0dc2c6c..a3553184d0fcb1998a8585156578a2aab225755e 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java
@@ -14,7 +14,7 @@ import lcsb.mapviewer.wikipathway.model.Edge;
 
 /**
  * Parser class that creates {@link Edge} objects from Xml {@link Element node}.
- * However the xml node is not typica edge node , but line node.
+ * However the xml node is not typical edge node , but line node.
  * 
  * @author Piotr Gawron
  *
@@ -24,12 +24,17 @@ public class EdgeLineParser extends ElementGpmlParser<Edge> {
   /**
    * Default class logger.
    */
-  private final Logger logger = LogManager.getLogger(EdgeLineParser.class);
+  private final Logger logger = LogManager.getLogger();
 
   /**
    * Parser used to parse typical {@link Edge} xml nodes.
    */
-  private final EdgeParser edgeParser = new EdgeParser();
+  private final EdgeParser edgeParser;
+
+  public EdgeLineParser(String mapName) {
+    super(mapName);
+    this.edgeParser = new EdgeParser(mapName);
+  }
 
   /**
    * Creates {@link Edge} from xml line node.
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java
index fe9739662e138fa4532dba0e273eff324e196ca1..eec580d9c26ce5bf339d9b8be006200a9536259c 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java
@@ -13,6 +13,7 @@ import lcsb.mapviewer.common.Pair;
 import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.ConverterException;
+import lcsb.mapviewer.model.LogMarker;
 import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.wikipathway.model.*;
 
@@ -29,13 +30,13 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
    */
   private static final int INITIAL_ID_VALUE = 10000;
   /**
-   * This is default lenght of lines when lines are drawn in
-   * {@link GpmlLineConnectorType#ELBOW} mode, but without specifing coordinates.
+   * This is default length of lines when lines are drawn in
+   * {@link GpmlLineConnectorType#ELBOW} mode, but without specifying coordinates.
    */
   private static final double DEFAULT_DISTNACE = 20;
   /**
    * Counter used for generating identifiers if identifiers aren't provided by the
-   * gpml model.
+   * GPML model.
    */
   private static int idCounter = INITIAL_ID_VALUE;
   /**
@@ -46,11 +47,11 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
    * Parser used for extracting {@link lcsb.mapviewer.model.map.MiriamData
    * references} from GPML model.
    */
-  private ReferenceParser referenceParser = new ReferenceParser();
+  private ReferenceParser referenceParser;
   /**
    * Parser used for extracting {@link PointData points} from GPML xml nodes.
    */
-  private PointDataParser pointParser = new PointDataParser();
+  private PointDataParser pointParser;
 
   /**
    * This function get new id for interactions that don't have id.
@@ -62,6 +63,12 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
     return "id" + idCounter;
   }
 
+  public EdgeParser(String mapName) {
+    super(mapName);
+    pointParser = new PointDataParser(mapName);
+    referenceParser = new ReferenceParser(mapName);
+  }
+
   /**
    * Creates {@link Edge} from xml node.
    * 
@@ -76,7 +83,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
     if (graphId == null || graphId.equals("")) {
       graphId = getNewId();
     }
-    Edge edge = new Edge(graphId);
+    Edge edge = new Edge(graphId, getMapName());
 
     for (Pair<String, String> entry : getAttributes(eElement)) {
       switch (entry.getLeft()) {
@@ -120,13 +127,13 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
           parseAttribute(element, edge);
           break;
         default:
-          logger.warn(edge.getWarningPrefix() + "Unknown edge node: " + node.getNodeName() + ".");
+          logger.warn(edge.getLogMarker(), "Unknown edge node: " + node.getNodeName() + ".");
           break;
         }
       }
     }
     if (!graphicsParsed) {
-      throw new ConverterException(edge.getWarningPrefix() + "No Graphics information found for edge.");
+      throw new ConverterException(edge.getLogMarker() + "No Graphics information found for edge.");
     }
     return edge;
   }
@@ -191,7 +198,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
         } else if ("Anchor".equalsIgnoreCase(node.getNodeName())) {
           anchors.add((Element) node);
         } else {
-          logger.warn(edge.getWarningPrefix() + "Unknown graphics edge node: " + node.getNodeName() + ".");
+          logger.warn(edge.getLogMarker(), "Unknown graphics edge node: " + node.getNodeName() + ".");
         }
       }
     }
@@ -216,17 +223,17 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
     }
     edge.setReversibleReaction(pointDataList.get(0).getType() == GpmlInteractionType.ARROW);
 
-    edge.getLine().setPoints(getPoints(edge.getWarningPrefix(), pointDataList, connectorType));
+    edge.getLine().setPoints(getPoints(edge.getLogMarker(), pointDataList, connectorType));
     if (edge.getLine().getPoints().size() < 2) {
       throw new ConverterException(
-          edge.getWarningPrefix() + "Contains too less points. At least two points are required in a line.");
+          edge.getLogMarker() + "Contains too less points. At least two points are required in a line.");
     }
     double lineLength = 0;
     for (Line2D line : edge.getLine().getLines()) {
       lineLength += line.getP1().distance(line.getP2());
     }
     if (lineLength <= Configuration.EPSILON) {
-      throw new ConverterException(edge.getWarningPrefix() + "Line cannot have 0 length.");
+      throw new ConverterException(edge.getLogMarker() + "Line cannot have 0 length.");
     }
 
     // anchors
@@ -268,7 +275,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
    * @throws UnknownTypeException
    *           throw when connector type is invalid
    */
-  List<Point2D> getPoints(String warningPrefix, List<PointData> pointDataList,
+  List<Point2D> getPoints(LogMarker warningPrefix, List<PointData> pointDataList,
       GpmlLineConnectorType connectorType)
       throws InvalidElbowConnectorException, UnknownTypeException {
     List<Point2D> result = new ArrayList<>();
@@ -371,7 +378,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
     // if line is curved then inform user that we don't support it and create
     // a default one
     case CURVED:
-      logger.warn(warningPrefix + "Curved connections are not supported.");
+      logger.warn(warningPrefix, "Curved connections are not supported.");
       for (PointData pointData : pointDataList) {
         result.add(pointData.toPoint());
       }
@@ -397,7 +404,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
    * @throws InvalidElbowConnectorException
    *           thrown when output cannot be computed because input data is invalid
    */
-  private int computeNumberOfPerpendicularSegments(String warningPrefix, PointData start, PointData end)
+  private int computeNumberOfPerpendicularSegments(LogMarker warningPrefix, PointData start, PointData end)
       throws InvalidElbowConnectorException {
     Point2D fromPoint = start.toPoint();
     Point2D toPoint = end.toPoint();
@@ -548,7 +555,7 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
    * @return new {@link Edge} object with unique identifier
    */
   public Edge createEmpty() {
-    return new Edge(getNewId());
+    return new Edge(getNewId(), getMapName());
   }
 
   /**
@@ -564,13 +571,13 @@ public class EdgeParser extends ElementGpmlParser<Edge> {
     String value = eTmp.getAttribute("Value");
     switch (key) {
     case ("org.pathvisio.core.ds"):
-      // skip for now (no idea what des it mean)
+      // skip for now (no idea what does it mean)
       break;
     case ("org.pathvisio.core.id"):
-      // skip for now (no idea what des it mean)
+      // skip for now (no idea what does it mean)
       break;
     default:
-      logger.warn(edge.getWarningPrefix() + "Unknown attribute of node. Key: " + key + "; value: " + value);
+      logger.warn(edge.getLogMarker(), "Unknown attribute of node. Key: " + key + "; value: " + value);
       break;
     }
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java
index d1e6398aaa09d738eebf0b4742a124551c424073..5f98517be9979f31628a3861bc93e579a87afa2b 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java
@@ -1,8 +1,7 @@
 package lcsb.mapviewer.wikipathway.XML;
 
-import java.awt.*;
+import java.awt.Color;
 import java.util.*;
-import java.util.List;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -18,7 +17,7 @@ import lcsb.mapviewer.converter.ConverterException;
  * @author Piotr Gawron
  *
  * @param <T>
- *          class for which this parser aplies
+ *          class for which this parser applies
  */
 public abstract class ElementGpmlParser<T> {
 
@@ -32,6 +31,12 @@ public abstract class ElementGpmlParser<T> {
   @SuppressWarnings("unused")
   private final Logger logger = LogManager.getLogger(ElementGpmlParser.class);
 
+  private String mapName;
+
+  public ElementGpmlParser(String mapName) {
+    this.mapName = mapName;
+  }
+
   /**
    * Creates object from xml node given in parameter.
    * 
@@ -44,7 +49,7 @@ public abstract class ElementGpmlParser<T> {
   public abstract T parse(Element node) throws ConverterException;
 
   /**
-   * Converts object into xml string (in gpml format).
+   * Converts object into xml string (in GPML format).
    * 
    * @param object
    *          object to transform
@@ -55,7 +60,7 @@ public abstract class ElementGpmlParser<T> {
   public abstract String toXml(T object) throws ConverterException;
 
   /**
-   * Converts list of objects into xml string (in gpml format) representing this
+   * Converts list of objects into xml string (in GPML format) representing this
    * list.
    * 
    * @param list
@@ -131,4 +136,7 @@ public abstract class ElementGpmlParser<T> {
     return result;
   }
 
+  public String getMapName() {
+    return mapName;
+  }
 }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GPMLToModel.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GPMLToModel.java
index 8b14d6f2a5bc6c30c5819c56936cb7d9b795a7cb..917c4bb9252a7ab5244686e02cce00da12d0e6c9 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GPMLToModel.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GPMLToModel.java
@@ -15,11 +15,11 @@ import lcsb.mapviewer.wikipathway.model.Graph;
 public class GPMLToModel {
 
   /**
-   * This function creates model from gpml input stream.
+   * This function creates model from GPML input stream.
    * 
    * @param stream
-   *          input stream that contains gpml data
-   * @return {@link Model} created from gpml file
+   *          input stream that contains GPML data
+   * @return {@link Model} created from GPML file
    * @throws IOException
    *           thrown when there is a problem with input file
    * @throws ConverterException
@@ -27,7 +27,7 @@ public class GPMLToModel {
    */
   public Model getModel(InputStream stream) throws IOException, ConverterException {
     Graph graph = new GpmlParser().createGraph(stream);
-    Model model = new ModelContructor().getModel(graph);
+    Model model = new ModelContructor(graph.getMapName()).getModel(graph);
     return model;
   }
 
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java
index 43be3375771c9693b150f15205de2b7df1f839ed..a089df90776080c771fe617d3d12e215a8a848d2 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java
@@ -11,6 +11,7 @@ import org.apache.logging.log4j.Logger;
 import org.w3c.dom.*;
 import org.xml.sax.SAXException;
 
+import lcsb.mapviewer.common.XmlParser;
 import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
 import lcsb.mapviewer.converter.ConverterException;
@@ -30,44 +31,44 @@ public class GpmlParser {
   /**
    * Default class logger.
    */
-  private Logger logger = LogManager.getLogger(GpmlParser.class);
+  private Logger logger = LogManager.getLogger();
 
   /**
    * Parser used for creating {@link Shape shapes}.
    */
-  private ShapeParser shapeParser = new ShapeParser();
+  private ShapeParser shapeParser;
 
   /**
    * Parser used for creating {@link lcsb.mapviewer.wikipathway.model.DataNode
    * data nodes}.
    */
-  private DataNodeParser dataNodeParser = new DataNodeParser();
+  private DataNodeParser dataNodeParser;
 
   /**
    * Parser used for creating {@link Label labels}.
    */
-  private LabelParser labelParser = new LabelParser();
+  private LabelParser labelParser;
 
   /**
    * Parser used for creating {@link Edge edges}.
    */
-  private EdgeParser edgeParser = new EdgeParser();
+  private EdgeParser edgeParser;
 
   /**
    * Parser used for creating {@link lcsb.mapviewer.wikipathway.model.State
    * states}.
    */
-  private StateParser stateParser = new StateParser();
+  private StateParser stateParser;
 
   /**
    * Parser used for creating {@link Edge edges} from line xml nodes.
    */
-  private EdgeLineParser edgeLineParser = new EdgeLineParser();
+  private EdgeLineParser edgeLineParser;
 
   /**
    * Parser used for creating {@link PointData points} from line xml nodes.
    */
-  private PointDataParser pointParser = new PointDataParser();
+  private PointDataParser pointParser;
 
   /**
    * This function returns parent interaction for edge that has anchor at one end.
@@ -98,7 +99,7 @@ public class GpmlParser {
       edge = graph.getEdgeByAnchor(anchor);
       // when we have cycle then return null
       if (processedEdges.contains(edge)) {
-        throw new CyclicEdgeException(edge.getWarningPrefix() + " edge is a part of invalid, cyclic edge");
+        throw new CyclicEdgeException("Edge is a part of invalid, cyclic edge", edge);
       }
       processedEdges.add(edge);
     }
@@ -121,61 +122,62 @@ public class GpmlParser {
     graph.setBoardHeight(Math.ceil(Double.parseDouble(boardHeight)));
   }
 
-	/**
-	 * This function adds groups to graph and nest them.
-	 * 
-	 * @param groups
-	 *          xml nodes
-	 * @param graph
-	 *          object where data is stored
-	 * @throws UnknownAttributeValueException
-	 *           thrown when there is a problem with xml attributes
-	 */
-	protected void addGroups(List<Node> groups, Graph graph) throws UnknownAttributeValueException {
-		// Adding Groups to graph
-		for (Node nNode : groups) {
-			if (nNode.getNodeType() == Node.ELEMENT_NODE) {
-				Element eElement = (Element) nNode;
-				String graphId = eElement.getAttribute("GraphId");
-				String groupId = eElement.getAttribute("GroupId");
-				if (graphId.equals("") || graphId == null) {
-					graphId = groupId;
-				}
-				String style = eElement.getAttribute("Style");
-				if ("".equals(style)) {
-					style = null;
-				}
-				if (style != null &&
-						!"Complex".equalsIgnoreCase(style) &&
-						!"Group".equalsIgnoreCase(style)) {
-					throw new UnknownAttributeValueException(
-							"Unknown value of \"style\" attribute for group node: " + style + ". Only null, Complex, Group are supported.");
-				}
-				Group group = new Group(graphId, groupId);
-				group.setStyle(style);
-
-				String zIndex = eElement.getAttribute("ZOrder");
-				if (zIndex!=null && !zIndex.isEmpty()) {
-				  group.setzOrder(Integer.valueOf(zIndex));
-				}
-				graph.addGroup(group);
-			}
-		}
-		// Handling nested groups
-		Group gr1, gr2;
-		for (Node nNode : groups) {
-			if (nNode.getNodeType() == Node.ELEMENT_NODE) {
-				Element eElement = (Element) nNode;
-				String groupRef = eElement.getAttribute("GroupRef");
-				String groupId = eElement.getAttribute("GroupId");
-				if (groupRef != null && !groupRef.equals("")) {
-					gr1 = graph.getGroupByGroupId(groupRef);
-					gr2 = graph.getGroupByGroupId(groupId);
-					gr1.addNode(gr2);
-				}
-			}
-		}
-	}
+  /**
+   * This function adds groups to graph and nest them.
+   * 
+   * @param groups
+   *          xml nodes
+   * @param graph
+   *          object where data is stored
+   * @throws UnknownAttributeValueException
+   *           thrown when there is a problem with xml attributes
+   */
+  protected void addGroups(List<Node> groups, Graph graph) throws UnknownAttributeValueException {
+    // Adding Groups to graph
+    for (Node nNode : groups) {
+      if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+        Element eElement = (Element) nNode;
+        String graphId = eElement.getAttribute("GraphId");
+        String groupId = eElement.getAttribute("GroupId");
+        if (graphId.equals("") || graphId == null) {
+          graphId = groupId;
+        }
+        String style = eElement.getAttribute("Style");
+        if ("".equals(style)) {
+          style = null;
+        }
+        if (style != null &&
+            !"Complex".equalsIgnoreCase(style) &&
+            !"Group".equalsIgnoreCase(style)) {
+          throw new UnknownAttributeValueException(
+              "Unknown value of \"style\" attribute for group node: " + style
+                  + ". Only null, Complex, Group are supported.");
+        }
+        Group group = new Group(graphId, groupId, graph.getMapName());
+        group.setStyle(style);
+
+        String zIndex = eElement.getAttribute("ZOrder");
+        if (zIndex != null && !zIndex.isEmpty()) {
+          group.setzOrder(Integer.valueOf(zIndex));
+        }
+        graph.addGroup(group);
+      }
+    }
+    // Handling nested groups
+    Group gr1, gr2;
+    for (Node nNode : groups) {
+      if (nNode.getNodeType() == Node.ELEMENT_NODE) {
+        Element eElement = (Element) nNode;
+        String groupRef = eElement.getAttribute("GroupRef");
+        String groupId = eElement.getAttribute("GroupId");
+        if (groupRef != null && !groupRef.equals("")) {
+          gr1 = graph.getGroupByGroupId(groupRef);
+          gr2 = graph.getGroupByGroupId(groupId);
+          gr1.addNode(gr2);
+        }
+      }
+    }
+  }
 
   /**
    * This function adds edges to graph. It ignores edges that have no connection
@@ -184,7 +186,7 @@ public class GpmlParser {
    * @param nodes
    *          xml nodes
    * @param graph
-   *          object where data is sotred
+   *          object where data is sorted
    */
   private void prepareEdges(List<Node> nodes, Graph graph) {
     for (Node nNode : nodes) {
@@ -211,7 +213,7 @@ public class GpmlParser {
             shape.setTreatAsNode(true);
           }
           if (edge.getStart() == null || edge.getEnd() == null) {
-            logger.warn(edge.getWarningPrefix() + "Interaction is not connected");
+            logger.warn(edge.getLogMarker(), "Interaction is not connected");
 
           } else {
             graph.addEdge(edge);
@@ -244,11 +246,11 @@ public class GpmlParser {
         InteractionMapping mapping = InteractionMapping.getInteractionMapping(edge.getType(), edge.getLine().getType());
         if (mapping != null) {
           if (mapping.isInteractionWarning()) {
-            logger.warn(edge.getWarningPrefix() + "Invalid interaction type.");
+            logger.warn(edge.getLogMarker(), "Invalid interaction type.");
           }
         } else {
           throw new InvalidXmlSchemaException(
-              edge.getWarningPrefix() + "Unknown interaction type: " + edge.getType() + " and line type: "
+              edge.getLogMarker() + "Unknown interaction type: " + edge.getType() + " and line type: "
                   + edge.getLine().getType());
         }
       }
@@ -256,7 +258,7 @@ public class GpmlParser {
     for (Edge edge : graph.getEdges()) {
       try {
         if (graph.getEdgeByAnchor(edge.getEnd()) != null && graph.getEdgeByAnchor(edge.getStart()) != null) {
-          logger.warn(edge.getWarningPrefix() + "Interaction can not connect two anchors.");
+          logger.warn(edge.getLogMarker(), "Interaction can not connect two anchors.");
         } else if (graph.getEdgeByAnchor(edge.getEnd()) != null && graph.getNodeByGraphId(edge.getStart()) != null) {
           Interaction tmp = getParentInteraction(graph, edge);
           if (tmp != null) {
@@ -264,7 +266,7 @@ public class GpmlParser {
                 edge.getLine().getType());
             if (mapping != null) {
               if (mapping.isInputWarning()) {
-                logger.warn(edge.getWarningPrefix() + "Invalid interaction type as an input to reaction.");
+                logger.warn(edge.getLogMarker(), "Invalid interaction type as an input to reaction.");
               }
               if (Modifier.class.isAssignableFrom(mapping.getModelInputReactionNodeType())) {
                 tmp.addModifier(edge);
@@ -281,7 +283,7 @@ public class GpmlParser {
               throw new InvalidXmlSchemaException("Unknown interaction type: " + edge.getType());
             }
           } else {
-            logger.warn(edge.getWarningPrefix() + "Interaction is disconnected.");
+            logger.warn(edge.getLogMarker(), "Interaction is disconnected.");
           }
         } else if (graph.getEdgeByAnchor(edge.getStart()) != null && graph.getNodeByGraphId(edge.getEnd()) != null) {
           Interaction tmp = getParentInteraction(graph, edge);
@@ -290,7 +292,7 @@ public class GpmlParser {
                 edge.getLine().getType());
             if (mapping != null) {
               if (mapping.isOutputWarning()) {
-                logger.warn(edge.getWarningPrefix() + "Invalid interaction type \"" + edge.getType()
+                logger.warn(edge.getLogMarker(), "Invalid interaction type \"" + edge.getType()
                     + "\" as an output from reaction.");
               }
               if (Modifier.class.isAssignableFrom(mapping.getModelOutputReactionNodeType())) {
@@ -308,13 +310,13 @@ public class GpmlParser {
               throw new InvalidXmlSchemaException("Unknown interaction type: " + edge.getType());
             }
           } else {
-            logger.warn(edge.getWarningPrefix() + "Interaction is disconnected.");
+            logger.warn(edge.getLogMarker(), "Interaction is disconnected.");
           }
         } else if (graph.getNodeByGraphId(edge.getEnd()) == null || graph.getNodeByGraphId(edge.getStart()) == null) {
-          logger.warn(edge.getWarningPrefix() + "Interaction edge is invalid (one end is not connected).");
+          logger.warn(edge.getLogMarker(), "Interaction edge is invalid (one end is not connected).");
         }
       } catch (CyclicEdgeException e) {
-        logger.warn(e, e);
+        logger.warn(e.getLogMarker(), e.getMessage(), e);
       }
     }
   }
@@ -372,6 +374,15 @@ public class GpmlParser {
       Node biopax = null;
 
       Graph graph = new Graph();
+      graph.setMapName(XmlParser.getNodeAttr("Name", root.item(0)));
+      edgeLineParser = new EdgeLineParser(graph.getMapName());
+      edgeParser = new EdgeParser(graph.getMapName());
+      dataNodeParser = new DataNodeParser(graph.getMapName());
+      labelParser = new LabelParser(graph.getMapName());
+      shapeParser = new ShapeParser(graph.getMapName());
+      stateParser = new StateParser(graph.getMapName());
+      pointParser = new PointDataParser(graph.getMapName());
+
       for (int x = 0; x < nodes.getLength(); x++) {
         Node node = nodes.item(x);
         if (node.getNodeType() == Node.ELEMENT_NODE) {
@@ -432,7 +443,7 @@ public class GpmlParser {
 
       addInteractions(graph);
       if (biopax != null) {
-        graph.setBiopaxData(new BiopaxParser().parse(biopax));
+        graph.setBiopaxData(new BiopaxParser(graph.getMapName()).parse(biopax));
       }
       Map<String, String> attributesMap = new HashMap<String, String>();
       for (Element attribute : attributes) {
@@ -498,7 +509,7 @@ public class GpmlParser {
       }
       List<Edge> howExtend = extendable.get(anchor);
       if (howExtend == null) {
-        logger.warn(edge.getWarningPrefix() + " Should be connected with another element, but nothing found.");
+        logger.warn(edge.getLogMarker(), " Should be connected with another element, but nothing found.");
         if (edge.getStart().equals(anchor)) {
           edge.setStart(null);
         } else if (edge.getEnd().equals(anchor)) {
@@ -514,7 +525,7 @@ public class GpmlParser {
           toRemove.add(edge);
           toRemove.add(howExtend.get(0));
 
-          logger.warn(exception, exception);
+          logger.warn(edge.getLogMarker(), exception.getMessage(), exception);
         }
       }
     }
@@ -549,8 +560,7 @@ public class GpmlParser {
       mapping = MergeMapping.getMergeMappingByInteractions(edge1.getType(), false, edge2.getType(), true);
     }
     if (mapping == null) {
-      String message = edge1.getWarningPrefix() + edge2.getWarningPrefix() + "Don't know how to merge interactions";
-      throw new UnknownMergingMethodException(message);
+      throw new UnknownMergingMethodException("Don't know how to merge interactions");
     }
     Edge first;
     if (mapping.isReversed1()) {
@@ -567,10 +577,9 @@ public class GpmlParser {
     first.extend(second);
 
     if (!first.getLine().getType().equals(second.getLine().getType())) {
-      logger.warn(
-          first.getWarningPrefix() + second.getWarningPrefix() + " merging edges with different line types: "
-              + first.getLine().getType() + ", "
-              + second.getLine().getType());
+      logger.warn(first.getLogMarker(), "Merging edges with different line types: "
+          + first.getLine().getType() + ", "
+          + second.getLine().getType());
     }
     first.setType(mapping.getResultType());
     if (mapping.isResultReversed()) {
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GraphicalPathwayElementParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GraphicalPathwayElementParser.java
index bfb0819c05ac56df547e47e9bbacfec43d82eb91..3d623ba886a4138888e42ae0a18af4b004331e90 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GraphicalPathwayElementParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GraphicalPathwayElementParser.java
@@ -22,7 +22,11 @@ public abstract class GraphicalPathwayElementParser<T extends GraphicalPathwayEl
   /**
    * Default class logger.
    */
-  private final Logger logger = LogManager.getLogger(GraphicalPathwayElementParser.class);
+  private final Logger logger = LogManager.getLogger();
+
+  public GraphicalPathwayElementParser(String mapName) {
+    super(mapName);
+  }
 
   /**
    * Parse font attributes that might appear.
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java
index 383d5a3718c70f9cc009c5b7fbcc0b8425d37940..cf8be530028c2909f6472118f453b50a843062be 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java
@@ -29,14 +29,19 @@ public class LabelParser extends GraphicalPathwayElementParser<Label> {
    */
   private final Logger logger = LogManager.getLogger();
 
-  private ReferenceParser referenceParser = new ReferenceParser();
+  private ReferenceParser referenceParser;
+
+  public LabelParser(String mapName) {
+    super(mapName);
+    referenceParser = new ReferenceParser(mapName);
+  }
 
   @Override
   public Label parse(Element eElement) throws UnknownTypeException {
     if (!eElement.getNodeName().equals("Label")) {
       throw new InvalidArgumentException(ShapeParser.class.getSimpleName() + " can parse only Label xml nodes");
     }
-    Label label = new Label(eElement.getAttribute("GraphId"));
+    Label label = new Label(eElement.getAttribute("GraphId"), getMapName());
 
     for (Pair<String, String> entry : getAttributes(eElement)) {
       switch (entry.getLeft()) {
@@ -176,12 +181,12 @@ public class LabelParser extends GraphicalPathwayElementParser<Label> {
     case ("org.pathvisio.model.GenMAPP-Xref"):
       // skip it when it's empty
       if (!value.isEmpty()) {
-        logger.warn(shape.getWarningPrefix() + "Unknown attribute of node. Key: " + key + "; value: " + value);
+        logger.warn(shape.getLogMarker() + "Unknown attribute of node. Key: " + key + "; value: " + value);
         break;
       }
       break;
     default:
-      logger.warn(shape.getWarningPrefix() + "Unknown attribute of node. Key:" + key + "; value: " + value);
+      logger.warn(shape.getLogMarker() + "Unknown attribute of node. Key:" + key + "; value: " + value);
       break;
     }
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
index b464424687cb37690b025e0cce8339ff67ee7836..2e05f6fa89e7a4fec44b43e00f4f293aea0c83ea 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java
@@ -10,13 +10,16 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import lcsb.mapviewer.common.Configuration;
-import lcsb.mapviewer.common.exception.*;
+import lcsb.mapviewer.common.exception.InvalidArgumentException;
+import lcsb.mapviewer.common.exception.InvalidStateException;
 import lcsb.mapviewer.converter.ConverterException;
 import lcsb.mapviewer.converter.model.celldesigner.geometry.CellDesignerAliasConverter;
 import lcsb.mapviewer.converter.model.celldesigner.geometry.helper.PolylineDataFactory;
 import lcsb.mapviewer.converter.model.celldesigner.reaction.ReactionLineData;
 import lcsb.mapviewer.converter.model.celldesigner.types.ModifierType;
 import lcsb.mapviewer.converter.model.celldesigner.types.ModifierTypeUtils;
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
 import lcsb.mapviewer.model.graphics.PolylineData;
 import lcsb.mapviewer.model.map.Drawable;
 import lcsb.mapviewer.model.map.MiriamData;
@@ -77,11 +80,16 @@ public class ModelContructor {
   /**
    * Default class logger.
    */
-  private Logger logger = LogManager.getLogger(ModelContructor.class);
+  private Logger logger = LogManager.getLogger();
+
   /**
    * Parser used for extracting {@link MiriamData references} from GPML model.
    */
-  private BiopaxFactory biopaxFactory = new BiopaxFactory();
+  private BiopaxFactory biopaxFactory;
+
+  public ModelContructor(String mapName) {
+    biopaxFactory = new BiopaxFactory(mapName);
+  }
 
   /**
    * This function creates Species from DataNode.
@@ -242,7 +250,7 @@ public class ModelContructor {
           ((Gene) species).addModificationSite((ModificationSite) mr);
         } else {
           logger.warn(
-              state.getWarningPrefix() + "state for " + species.getClass().getSimpleName() + " is not supported.");
+              state.getLogMarker(), "state for " + species.getClass().getSimpleName() + " is not supported.");
         }
         if (mr != null) {
           mr.setIdModificationResidue(state.getGraphId());
@@ -259,10 +267,10 @@ public class ModelContructor {
           if (protein.getStructuralState() == null) {
             protein.setStructuralState(createStructuralState(state, protein));
           } else {
-            logger.warn(state.getWarningPrefix() + " tries to override another state: " + protein.getStructuralState());
+            logger.warn(state.getLogMarker(), " tries to override another state: " + protein.getStructuralState());
           }
         } else {
-          logger.warn(state.getWarningPrefix() + "structural state for " + species.getClass().getSimpleName()
+          logger.warn(state.getLogMarker(), "structural state for " + species.getClass().getSimpleName()
               + " is not supported.");
         }
       }
@@ -321,7 +329,7 @@ public class ModelContructor {
   public LayerRect createRectangle(Shape shape) {
     LayerRect rect = new LayerRect();
     Rectangle2D rec;
-    if (shouldRotate90degrees(shape.getRotation())) {
+    if (shouldRotate90degrees(shape)) {
       rec = rotate90degrees(shape.getRectangle());
     } else {
       rec = shape.getRectangle();
@@ -339,7 +347,15 @@ public class ModelContructor {
         rectangle.getCenterY() - rectangle.getWidth() / 2, rectangle.getHeight(), rectangle.getWidth());
   }
 
+  boolean shouldRotate90degrees(Shape shape) {
+    return shouldRotate90degrees(shape.getRotation(), shape);
+  }
+
   boolean shouldRotate90degrees(Double rot) {
+    return shouldRotate90degrees(rot, null);
+  }
+
+  boolean shouldRotate90degrees(Double rot, Shape shape) {
     if (rot == null) {
       return false;
     }
@@ -352,12 +368,20 @@ public class ModelContructor {
     }
     if (Math.abs(rotation) < Math.PI / 4) {
       if (Math.abs(rotation) > Configuration.EPSILON) {
-        logger.warn("Rotation of objects is not supported. Rotation=" + rot);
+        LogMarker marker = null;
+        if (shape != null) {
+          marker = shape.getLogMarker();
+        }
+        logger.warn(marker, "Rotation of objects is not supported. Rotation=" + rot);
       }
       return false;
     }
     if ((Math.PI / 2 - Math.abs(rotation)) > Configuration.EPSILON) {
-      logger.warn("Rotation of objects is not supported. Rotation=" + rot);
+      LogMarker marker = null;
+      if (shape != null) {
+        marker = shape.getLogMarker();
+      }
+      logger.warn(marker, "Rotation of objects is not supported. Rotation=" + rot);
     }
     return true;
   }
@@ -483,7 +507,7 @@ public class ModelContructor {
    * @return {@link Unknown} object created from input {@link Label}
    */
   private Species createSpecies(Label label) {
-    logger.warn(label.getWarningPrefix() + " Label cannot be part of reaction. Tranforming to Unknown");
+    logger.warn(label.getLogMarker(), " Label cannot be part of reaction. Tranforming to Unknown");
 
     Species res = new Unknown(label.getGraphId());
     res.addMiriamData(label.getReferences());
@@ -504,7 +528,7 @@ public class ModelContructor {
    * @return {@link Unknown} object created from input {@link Label}
    */
   private Species createSpecies(Shape shape) {
-    logger.warn(shape.getWarningPrefix() + " Shape can not be part of reaction. Tranforming to Unknown");
+    logger.warn(shape.getLogMarker(), " Shape can not be part of reaction. Tranforming to Unknown");
 
     Species res = new Unknown(shape.getGraphId());
     StringBuilder notes = new StringBuilder();
@@ -550,7 +574,7 @@ public class ModelContructor {
         } else if (graph.getShapeByGraphId(pe.getGraphId()) != null) {
           Shape shape = graph.getShapeByGraphId(pe.getGraphId());
           if (INALID_COMPLEX_SHAPE_CHILDREN.contains(shape.getShape())) {
-            logger.warn(shape.getWarningPrefix() + shape.getShape() + " cannot be part of a complex. Skipping.");
+            logger.warn(shape.getLogMarker(), shape.getShape() + " cannot be part of a complex. Skipping.");
           } else {
             throw new UnknownChildClassException("Unknown class type with id \"" + pe.getGraphId() + "\": "
                 + shape.getShape() + ". Group id: " + group.getGraphId());
@@ -653,7 +677,7 @@ public class ModelContructor {
       reaction.addNode(splitOperator);
     } else {
       PolylineData operatorLine = lines.get(SplitOperator.class);
-      for (int i = 0; i < operatorLine.getPoints().size()-1; i++) {
+      for (int i = 0; i < operatorLine.getPoints().size() - 1; i++) {
         productLine.addPoint(i, operatorLine.getPoints().get(i));
       }
       product.setLine(PolylineDataFactory.removeCollinearPoints(productLine));
@@ -664,12 +688,14 @@ public class ModelContructor {
       reaction.addModifier(mod);
     }
     if (reaction instanceof TwoReactantReactionInterface && reaction.getReactants().size() < 2) {
-      logger.warn("Reaction should contain at least 2 reactants. GraphId: " + interaction.getGraphId());
+      logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, reaction),
+          "Reaction should contain at least 2 reactants. GraphId: " + interaction.getGraphId());
       reaction = new UnknownTransitionReaction(reaction);
     }
     if (reaction instanceof ReducedNotation && ((reaction.getReactants().size() > 1)
         || reaction.getProducts().size() > 1 || reaction.getModifiers().size() > 0)) {
-      logger.warn("Reaction should contain only one reactant and one product. GraphId: " + interaction.getGraphId());
+      logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, reaction),
+          "Reaction should contain only one reactant and one product. GraphId: " + interaction.getGraphId());
       reaction = new UnknownTransitionReaction(reaction);
     }
     ReactionLineData rld = ReactionLineData.getByReactionType(reaction.getClass());
@@ -891,7 +917,7 @@ public class ModelContructor {
         notes = StringEscapeUtils.unescapeHtml4(notes);
       }
       model.setNotes(notes);
-      model.addMiriamData(new BiopaxFactory().getMiriamData(graph.getBiopaxData(), graph.getBiopaxReferences()));
+      model.addMiriamData(biopaxFactory.getMiriamData(graph.getBiopaxData(), graph.getBiopaxReferences()));
 
       data.layer.addLayerLines(createLines(graph));
 
@@ -999,15 +1025,16 @@ public class ModelContructor {
     }
     List<Element> toRemove = new ArrayList<>();
     ElementUtils eu = new ElementUtils();
-    for (Element alias : model.getElements()) {
-      if (alias instanceof Complex) {
-        Complex cAlias = (Complex) alias;
-        if (cAlias.getSize() <= EPSILON && cAlias.getAllChildren().size() == 0) {
-          if (aliasesInReaction.contains(alias)) {
-            logger.warn(eu.getElementTag(alias) + "Empty element is invalid, but it's a part of reaction.");
+    for (Element element : model.getElements()) {
+      if (element instanceof Complex) {
+        Complex complex = (Complex) element;
+        if (complex.getSize() <= EPSILON && complex.getAllChildren().size() == 0) {
+          if (aliasesInReaction.contains(element)) {
+            logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, element),
+                "Empty element is invalid, but it's a part of reaction.");
           } else {
-            toRemove.add(alias);
-            logger.warn(eu.getElementTag(alias) + "Empty element is invalid");
+            toRemove.add(element);
+            logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, element), "Empty element is invalid");
           }
         }
       }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java
index ffc86624258d3625c019e9c343faf3f08215cce0..859d56b2ec650a2c42ff26508bd8309f39fef8ef 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java
@@ -54,22 +54,26 @@ public class ModelToGPML {
   private final Logger logger = LogManager.getLogger(ModelToGPML.class);
   /**
    * Counter used for generating identifiers if identifiers aren't provided by the
-   * gpml model.
+   * GPML model.
    */
   private int idCounter = INITIAL_ID_VALUE;
   /**
    * Parser used to convert from/to xml {@link MiriamData} annotations.
    */
-  private ReferenceParser referenceParser = new ReferenceParser();
+  private ReferenceParser referenceParser;
 
   /**
-   * Parser used to convert from/to xml (in biopax format) {@link MiriamData}
+   * Parser used to convert from/to xml (in BioPAX format) {@link MiriamData}
    * annotations.
    */
-  private BiopaxParser biopaxParser = new BiopaxParser();
+  private BiopaxParser biopaxParser;
 
   private ColorParser colorParser = new ColorParser();
 
+  public ModelToGPML(String mapName) {
+    referenceParser = new ReferenceParser(mapName);
+  }
+
   /**
    * Returns new unique identifier for the model.
    * 
@@ -587,6 +591,8 @@ public class ModelToGPML {
    */
   public String getGPML(Model model) throws ConverterException {
 
+    biopaxParser = new BiopaxParser(model.getName());
+
     StringBuilder gpml = new StringBuilder("");
     gpml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
     gpml.append("<Pathway xmlns=\"http://pathvisio.org/GPML/2013a\" Name=\"Generated\">\n");
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java
index 614829c67033e05d2441c2da4b1ef2ff402baf12..784c707898a596636f9cff136c3b612326879eca 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java
@@ -23,11 +23,15 @@ public class PointDataParser extends ElementGpmlParser<PointData> {
   /**
    * Default class logger.
    */
-  private final Logger logger = LogManager.getLogger(PointDataParser.class);
+  private final Logger logger = LogManager.getLogger();
+
+  public PointDataParser(String mapName) {
+    super(mapName);
+  }
 
   @Override
   public PointData parse(Element element) throws UnknownTypeException {
-    PointData result = new PointData();
+    PointData result = new PointData(getMapName());
     for (Pair<String, String> entry : getAttributes(element)) {
       switch (entry.getLeft()) {
       case ("X"):
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java
index 3439c7fd94af2f96f509d2be4fb996f1ecac68de..4615a3980ff914f4cf2ee6917877b22c870406fc 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java
@@ -28,6 +28,10 @@ public class ReferenceParser extends ElementGpmlParser<MiriamData> {
    */
   private final Logger logger = LogManager.getLogger(ReferenceParser.class);
 
+  public ReferenceParser(String mapName) {
+    super(mapName);
+  }
+
   /**
    * This function creates MiriamData from database name and id.
    * 
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java
index cd1834340f271c4eb07094a2c2b4de658193e6fe..6bade4543815e4943f1ae431d5a73a56623bd95d 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java
@@ -28,14 +28,18 @@ public class ShapeParser extends GraphicalPathwayElementParser<Shape> {
   /**
    * Default class logger.
    */
-  private final Logger logger = LogManager.getLogger(ShapeParser.class);
+  private final Logger logger = LogManager.getLogger();
+
+  public ShapeParser(String mapName) {
+    super(mapName);
+  }
 
   @Override
   public Shape parse(Element eElement) throws ConverterException {
     if (!eElement.getNodeName().equals("Shape")) {
       throw new InvalidArgumentException(ShapeParser.class.getSimpleName() + " can parse only Shape xml nodes");
     }
-    Shape shape = new Shape(eElement.getAttribute("GraphId"));
+    Shape shape = new Shape(eElement.getAttribute("GraphId"), getMapName());
     for (Pair<String, String> entry : getAttributes(eElement)) {
       switch (entry.getLeft()) {
       case ("GraphId"):
@@ -111,12 +115,12 @@ public class ShapeParser extends GraphicalPathwayElementParser<Shape> {
         shape.setCompartment(true);
         break;
       default:
-        logger.warn(shape.getWarningPrefix() + "Unknown line type: " + value);
+        logger.warn(shape.getLogMarker() + "Unknown line type: " + value);
         break;
       }
       break;
     default:
-      logger.warn(shape.getWarningPrefix() + "Unknown attribute of node. Key:" + key + "; value: " + value);
+      logger.warn(shape.getLogMarker() + "Unknown attribute of node. Key:" + key + "; value: " + value);
       break;
     }
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java
index 99deb50bad55b8e2962de3db7e9559d3fbe0614f..7c9d7d7f7addcf77e8177205bc5d37e229097951 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java
@@ -31,14 +31,19 @@ public class StateParser extends ElementGpmlParser<State> {
    * Parser used for extracting {@link lcsb.mapviewer.model.map.MiriamData
    * references} from GPML model.
    */
-  private ReferenceParser referenceParser = new ReferenceParser();
+  private ReferenceParser referenceParser;
+
+  public StateParser(String mapName) {
+    super(mapName);
+    referenceParser = new ReferenceParser(mapName);
+  }
 
   @Override
   public State parse(Element eElement) throws ConverterException {
     if (!eElement.getNodeName().equals("State")) {
       throw new InvalidArgumentException(StateParser.class.getSimpleName() + " can parse only State xml nodes");
     }
-    State state = new State(eElement.getAttribute("GraphId"));
+    State state = new State(eElement.getAttribute("GraphId"), getMapName());
     for (Pair<String, String> entry : getAttributes(eElement)) {
       switch (entry.getLeft()) {
       case ("GraphId"):
@@ -159,7 +164,7 @@ public class StateParser extends ElementGpmlParser<State> {
     String value = eTmp.getAttribute("Value");
     switch (key) {
     default:
-      logger.warn(state.getWarningPrefix() + "Unknown attribute of node. Key:" + key + "; value: " + value);
+      logger.warn(state.getLogMarker() + "Unknown attribute of node. Key:" + key + "; value: " + value);
       break;
     }
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java
index e3262048f1d0cc409965b29382c4f296152de8ff..b0443a560c5b329b48ea777d1eeca9d50b37a998 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java
@@ -60,8 +60,8 @@ public class DataNode extends GraphicalPathwayElement {
    * @param graphId
    *          {@link PathwayElement#graphId}
    */
-  public DataNode(String graphId) {
-    super(graphId);
+  public DataNode(String graphId, String mapName) {
+    super(graphId, mapName);
   }
 
   /**
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java
index 7b9d4d2f11d897d61265afce38ae96254c1bf4f0..73f05db593ef63245e3b42ea54db1c0e46f9d4a6 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Edge.java
@@ -10,6 +10,8 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
 import lcsb.mapviewer.model.graphics.PolylineData;
 import lcsb.mapviewer.model.map.MiriamData;
 
@@ -36,7 +38,7 @@ public class Edge implements Serializable {
   /**
    * Default class logger.
    */
-  private final transient Logger logger = LogManager.getLogger(Edge.class);
+  private final transient Logger logger = LogManager.getLogger();
 
   /**
    * Identifier in GPML model.
@@ -72,7 +74,7 @@ public class Edge implements Serializable {
    * GPML interaction type (arrow).
    */
   private GpmlInteractionType type = GpmlInteractionType.LINE;
-  
+
   private boolean reversibleReaction = false;
 
   /**
@@ -94,7 +96,9 @@ public class Edge implements Serializable {
    * List of identifiers used by BioPax nodes that are inside GPML. These BioPax
    * nodes contain annotations.
    */
-  private List<String> biopaxReferences = new ArrayList<String>();
+  private List<String> biopaxReferences = new ArrayList<>();
+
+  private String mapName;
 
   /**
    * Default constructor.
@@ -102,8 +106,9 @@ public class Edge implements Serializable {
    * @param graphId
    *          {@link #graphId}
    */
-  public Edge(String graphId) {
+  public Edge(String graphId, String mapName) {
     this.graphId = graphId;
+    this.mapName = mapName;
   }
 
   /**
@@ -127,6 +132,7 @@ public class Edge implements Serializable {
     this.biopaxReferences.addAll(original.getBiopaxReferences());
     this.zOrder = original.getzOrder();
     this.reversibleReaction = original.isReversibleReaction();
+    this.mapName = original.getMapName();
   }
 
   /**
@@ -280,8 +286,12 @@ public class Edge implements Serializable {
    * 
    * @return string that identifies element in logs
    */
-  public String getWarningPrefix() {
-    return "[" + getType() + ", id: " + getGraphId() + "]\t";
+  public LogMarker getLogMarker() {
+    return new LogMarker(ProjectLogEntryType.PARSING_ISSUE, getType().toString(), getGraphId(), getMapName());
+  }
+
+  private String getMapName() {
+    return mapName;
   }
 
   /**
@@ -356,16 +366,14 @@ public class Edge implements Serializable {
   public void extend(Edge edge2) {
     // check if extension make sense (they should point to the same identifier)
     if (!getEnd().equals(edge2.getStart())) {
-      throw new InvalidArgumentException(
-          getWarningPrefix() + edge2.getWarningPrefix() + " Cannot merge - anchor points doesn't match: " + getEnd()
-              + "," + edge2.getStart());
+      throw new InvalidArgumentException(" Cannot merge - anchor points doesn't match: " + getEnd()
+          + "," + edge2.getStart());
     }
 
     if (line.getEndPoint().distance(edge2.getLine().getBeginPoint()) > EPSILON) {
-      throw new InvalidArgumentException(
-          getWarningPrefix() + edge2.getWarningPrefix() + " Cannot merge - edges are far from each other: "
-              + line.getEndPoint() + ","
-              + edge2.getLine().getBeginPoint());
+      throw new InvalidArgumentException(" Cannot merge - edges are far from each other: "
+          + line.getEndPoint() + ","
+          + edge2.getLine().getBeginPoint());
     }
 
     // graphId should be the same
@@ -397,8 +405,7 @@ public class Edge implements Serializable {
 
     // color should be skipped
     if (!getColor().equals(edge2.getColor())) {
-      logger
-          .warn(getWarningPrefix() + edge2.getWarningPrefix() + " Problem with merging. Edges have different colors.");
+      logger.warn(getLogMarker(), "Problem with merging. Edges have different colors.");
     }
 
     // add biopax references
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GpmlInteractionType.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GpmlInteractionType.java
index 3775bf5f8ebe4af95f395b592b13d23fd7850aa7..959c12f16fae848de625e27bf38840851877d27f 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GpmlInteractionType.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GpmlInteractionType.java
@@ -104,11 +104,11 @@ public enum GpmlInteractionType {
   }
 
   /**
-   * Returns a type identified by the gpml string.
+   * Returns a type identified by the GPML string.
    *
    * @param gpmlString
-   *          string in GPML represetning type
-   * @return type identified by the gpml string
+   *          string in GPML representing type
+   * @return type identified by the GPML string
    * @throws UnknownTypeException
    *           thrown when type cannot be resolved
    */
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java
index 69efb26c026e0bc9b0e100bb524689d2db250303..2bb964bff65b2cb52cef44ca50b83f98482998d9 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Graph.java
@@ -132,6 +132,8 @@ public class Graph implements Serializable {
    */
   private List<State> states = new ArrayList<State>();
 
+  private String mapName;;
+
   /**
    * Default constructor.
    */
@@ -172,7 +174,7 @@ public class Graph implements Serializable {
     nodes.put(node.getGraphId(), node);
     if (node.getGroupRef() != null && !node.getGroupRef().equals("")) {
       if (groupsByGroupId.get(node.getGroupRef()) == null) {
-        logger.warn(node.getWarningPrefix() + "Missing group: " + node.getGroupRef());
+        logger.warn(node.getLogMarker(), "Missing group: " + node.getGroupRef());
       } else {
         groupsByGroupId.get(node.getGroupRef()).addNode(node);
       }
@@ -580,4 +582,12 @@ public class Graph implements Serializable {
     this.states = states;
   }
 
+  public String getMapName() {
+    return mapName;
+  }
+
+  public void setMapName(String mapName) {
+    this.mapName = mapName;
+  }
+
 }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java
index 76174f80a8b0b4023b599d6b07d7b149671e4ee0..4092a9d744aff442d6a386c1eac76521188c7a15 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/GraphicalPathwayElement.java
@@ -81,8 +81,8 @@ public abstract class GraphicalPathwayElement extends PathwayElement {
    * @param graphId
    *          {@link PathwayElement#graphId}
    */
-  public GraphicalPathwayElement(String graphId) {
-    super(graphId);
+  public GraphicalPathwayElement(String graphId, String mapName) {
+    super(graphId, mapName);
   }
 
   /**
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java
index 16160000c56f46d53e5d2db443bf0d3c01585c68..98050cb259c6957c510c5af8ad755e3e78b5e85a 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java
@@ -46,8 +46,8 @@ public class Group extends PathwayElement {
    * @param groupId
    *          {@link #groupId}
    */
-  public Group(String graphId, String groupId) {
-    super(graphId);
+  public Group(String graphId, String groupId, String mapName) {
+    super(graphId, mapName);
     this.groupId = groupId;
     nodes = new HashSet<PathwayElement>();
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java
index 9a59e192093576db4004662ebea56770d1d1d840..ecd0c164a3304b1836255a59b344b3b7e3a0cc1f 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java
@@ -61,8 +61,8 @@ public class Label extends GraphicalPathwayElement {
    * @param graphId
    *          {@link PathwayElement#graphId}
    */
-  public Label(String graphId) {
-    super(graphId);
+  public Label(String graphId, String mapName) {
+    super(graphId, mapName);
     setTextLabel(null);
     setGroupRef(null);
   }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java
index ad817852bfa0ba1bc8a4a68043ca8105376c6715..ffd1988a00b5b17ccc206d9dce89cdf8b49b99e8 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java
@@ -5,6 +5,9 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
+
 /**
  * Abstract class for pathway elements. It defines common functionalities for
  * all elements in the model. There are two known subclasses:
@@ -45,14 +48,17 @@ public abstract class PathwayElement implements Serializable {
    */
   private List<String> biopaxReferences = new ArrayList<>();
 
+  private String mapName;
+
   /**
    * Default constructor.
    * 
    * @param graphId
    *          {@link #graphId} value
    */
-  public PathwayElement(String graphId) {
+  public PathwayElement(String graphId, String mapName) {
     this.graphId = graphId;
+    this.mapName = mapName;
   }
 
   /**
@@ -93,13 +99,8 @@ public abstract class PathwayElement implements Serializable {
    */
   abstract Rectangle2D getRectangle();
 
-  /**
-   * Returns prefix that should be used in logger for warnings about this element.
-   * 
-   * @return prefix that should be used in logger for warnings about this element
-   */
-  public String getWarningPrefix() {
-    return "[" + this.getClass().getSimpleName() + ", " + getGraphId() + "]\t";
+  public LogMarker getLogMarker() {
+    return new LogMarker(ProjectLogEntryType.PARSING_ISSUE, this.getClass().getSimpleName(), getGraphId(), getMapName());
   }
 
   /**
@@ -162,4 +163,12 @@ public abstract class PathwayElement implements Serializable {
   public void addComment(String comment) {
     this.comments.add(comment);
   }
+
+  public String getMapName() {
+    return mapName;
+  }
+
+  public void setMapName(String mapName) {
+    this.mapName = mapName;
+  }
 }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java
index bff65363b8b948998d165a48faf8826744b669a4..aba876c1253aa9f757628af95bfdf29d5e9af001 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java
@@ -6,6 +6,9 @@ import java.io.Serializable;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
+
 /**
  * Class that defines information about point stored in GPML structures.
  * 
@@ -56,6 +59,12 @@ public class PointData implements Serializable {
    */
   private GpmlInteractionType type;
 
+  private String mapName;
+
+  public PointData(String mapName) {
+    this.mapName = mapName;
+  }
+
   /**
    * @return the x
    * @see #x
@@ -183,7 +192,7 @@ public class PointData implements Serializable {
     } else if (relX.equals("0.0") && relY.equals("0.0")) {
       return Direction.NONE;
     } else {
-      logger.warn("[" + graphRef + "]\t" +
+      logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, null, null, getMapName()),
           "Cannot determine connection direction from values: relX=" + relX + "; relY=" + relY + ". Estimating...");
       double xVal = Double.valueOf(relX);
       double yVal = Double.valueOf(relY);
@@ -208,4 +217,12 @@ public class PointData implements Serializable {
     return "[" + this.getClass().getSimpleName() + " x=" + x + "; y=" + y + "; graphRef=" + graphRef + "; relX=" + relX
         + "; relY=" + relY + "; type=" + type + "]";
   }
+
+  public String getMapName() {
+    return mapName;
+  }
+
+  public void setMapName(String mapName) {
+    this.mapName = mapName;
+  }
 }
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java
index 4f5c2a2e490482e2b0ce2017efd8ca1e2abced72..d54bf0f4eeb06a981c7453a0752078c78ea4bc37 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java
@@ -2,6 +2,9 @@ package lcsb.mapviewer.wikipathway.model;
 
 import java.awt.Color;
 
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
+
 /**
  * Class used to store data from Shape from GPML.
  * 
@@ -61,8 +64,8 @@ public class Shape extends GraphicalPathwayElement {
    * @param graphId
    *          {@link PathwayElement#graphId}
    */
-  public Shape(String graphId) {
-    super(graphId);
+  public Shape(String graphId, String mapName) {
+    super(graphId, mapName);
     setRectangle(null);
     setShape(null);
     setTextLabel(null);
@@ -84,8 +87,8 @@ public class Shape extends GraphicalPathwayElement {
   }
 
   @Override
-  public String getWarningPrefix() {
-    return "[" + getShape() + " " + getGraphId() + "]\t";
+  public LogMarker getLogMarker() {
+    return new LogMarker(ProjectLogEntryType.PARSING_ISSUE, getShape(), getGraphId(), getMapName());
   }
 
   /**
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/State.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/State.java
index 23bdb2e65336694ddc0e3082220901b7cd4df546..610dd36a5e8961ef92d2b04ba7fdd562b421ec79 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/State.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/State.java
@@ -64,7 +64,7 @@ public class State extends GraphicalPathwayElement {
   private Double width;
 
   /**
-   * Heightof the element.
+   * Height of the element.
    */
   private Double height;
 
@@ -74,8 +74,8 @@ public class State extends GraphicalPathwayElement {
    * @param graphId
    *          {@link PathwayElement#graphId}
    */
-  public State(String graphId) {
-    super(graphId);
+  public State(String graphId, String mapName) {
+    super(graphId, mapName);
   }
 
   /**
diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java
index ac63f06475c24a885664eb3b058fd75b6dd80655..50e450d8c5ae6690db5d0760ea314b0929f22075 100644
--- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java
+++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/biopax/BiopaxFactory.java
@@ -6,10 +6,17 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
+import lcsb.mapviewer.model.LogMarker;
+import lcsb.mapviewer.model.ProjectLogEntryType;
 import lcsb.mapviewer.model.map.*;
 
 public class BiopaxFactory {
   private Logger logger = LogManager.getLogger();
+  private String mapName;
+
+  public BiopaxFactory(String mapName) {
+    this.mapName = mapName;
+  }
 
   /**
    * Creates {@link MiriamData annotation} from {@link BiopaxPublication}.
@@ -52,15 +59,26 @@ public class BiopaxFactory {
           if (md != null) {
             result.add(md);
           } else {
-            logger.warn("[" + string + "]\tBiopax publication is invalid.");
+            logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, "BiopaxReference", string, getMapName()),
+                "Publication is invalid.");
           }
         } else {
-          logger.warn("[" + string + "]\tBiopax publication doesn't exist.");
+          logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, "BiopaxReference", string, getMapName()),
+              "Biopax publication doesn't exist.");
         }
       } else {
-        logger.warn("[Biopax, " + string + "]\tInvalid BioPax reference.");
+        logger.warn(new LogMarker(ProjectLogEntryType.PARSING_ISSUE, "BiopaxReference", string, getMapName()),
+            "Invalid BioPax reference.");
       }
     }
     return result;
   }
+
+  public String getMapName() {
+    return mapName;
+  }
+
+  public void setMapName(String mapName) {
+    this.mapName = mapName;
+  }
 }
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java
index c263cc8a5dabcf43a1a001e125cf02256a4007f6..0d6b120a1e87318d319428bba9c3ef9cbe62e31c 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/WikipathwaysTestFunctions.java
@@ -1,5 +1,7 @@
 package lcsb.mapviewer.wikipathway;
 
+import static org.junit.Assert.assertTrue;
+
 import java.awt.Color;
 import java.io.*;
 import java.net.URL;
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/BiopaxParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/BiopaxParserTest.java
index 2b25b91443bca4bea099d22cffea6bcf7e81c6c5..91306b3dbf8e0d50284e0a7de12f865e4373e10e 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/BiopaxParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/BiopaxParserTest.java
@@ -11,8 +11,11 @@ import lcsb.mapviewer.wikipathway.model.biopax.BiopaxPublication;
 
 public class BiopaxParserTest extends WikipathwaysTestFunctions {
 
+  BiopaxParser parser ;
+
   @Before
   public void setUp() throws Exception {
+    parser = new BiopaxParser("mapName");
   }
 
   @After
@@ -21,7 +24,6 @@ public class BiopaxParserTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testParse() throws Exception {
-    BiopaxParser parser = new BiopaxParser();
     Document document = getXmlDocumentFromFile("testFiles/biopax/small.xml");
     BiopaxData data = parser.parse(document.getFirstChild());
     assertNotNull(data);
@@ -38,7 +40,6 @@ public class BiopaxParserTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testIncorrectPumeds() throws Exception {
-    BiopaxParser parser = new BiopaxParser();
     Document document = getXmlDocumentFromFile("testFiles/biopax/invalid_pubmed_reference.xml");
     BiopaxData data = parser.parse(document.getFirstChild());
     assertNotNull(data);
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/DataNodeParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/DataNodeParserTest.java
index 12e619ba5db29888c4e12671be3152c520e7d1e6..98a4ba41923a0d5f0cb7dfbebc667628d60cdda1 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/DataNodeParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/DataNodeParserTest.java
@@ -14,10 +14,11 @@ import lcsb.mapviewer.wikipathway.model.DataNode;
 
 public class DataNodeParserTest extends WikipathwaysTestFunctions {
   Logger logger = LogManager.getLogger(DataNodeParserTest.class);
-  DataNodeParser parser = new DataNodeParser();
+  DataNodeParser parser ;
 
   @Before
   public void setUp() throws Exception {
+    parser = new DataNodeParser("mapName");
   }
 
   @After
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParserTest.java
index 3b51b1f8d9f875a581cbd9c5ede41c6708f7ddc7..3ebefd525ba7f663a90b7b8ded442f0cf2e50b78 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParserTest.java
@@ -12,10 +12,11 @@ import lcsb.mapviewer.wikipathway.model.Edge;
 
 public class EdgeLineParserTest extends WikipathwaysTestFunctions {
 
-  EdgeLineParser parser = new EdgeLineParser();
+  private EdgeLineParser parser;
 
   @Before
   public void setUp() throws Exception {
+    parser = new EdgeLineParser("mapName");
   }
 
   @After
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java
index e59195edd55a88e15401db9d874ad768d3256a44..ef6088f6200f60fa4d378fec062597428567b88d 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/EdgeParserTest.java
@@ -8,6 +8,7 @@ import java.util.List;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.junit.Before;
 import org.junit.Test;
 
 import lcsb.mapviewer.common.Configuration;
@@ -17,12 +18,17 @@ public class EdgeParserTest {
 
   Logger logger = LogManager.getLogger();
 
-  EdgeParser parser = new EdgeParser();
+  EdgeParser parser ;
 
+  @Before
+  public void setUp() {
+    parser = new EdgeParser("mapName");
+  }
+  
   @Test
   public void testGetPointsWithoutTargetDirection() throws Exception {
     List<PointData> gpmlPoints = new ArrayList<>();
-    PointData pointData = new PointData();
+    PointData pointData = new PointData("mapName");
     pointData.setX(370.0);
     pointData.setY(506.9845153753351);
     pointData.setRelX("0.0");
@@ -30,12 +36,12 @@ public class EdgeParserTest {
     pointData.setGraphRef("db29a");
     gpmlPoints.add(pointData);
 
-    pointData = new PointData();
+    pointData = new PointData("mapName");
     pointData.setX(337.9360555506242);
     pointData.setY(558.2089552238806);
     gpmlPoints.add(pointData);
 
-    pointData = new PointData();
+    pointData = new PointData("mapName");
     pointData.setX(305.8721111012484);
     pointData.setY(587.6687409348253);
     pointData.setRelX("0.0");
@@ -59,7 +65,7 @@ public class EdgeParserTest {
   @Test
   public void testGetPointsWithoutSourceDirection() throws Exception {
     List<PointData> gpmlPoints = new ArrayList<>();
-    PointData pointData = new PointData();
+    PointData pointData = new PointData("mapName");
     pointData.setX(418.1490729057133);
     pointData.setY(421.3813636363637);
     pointData.setRelX("0.0");
@@ -67,17 +73,17 @@ public class EdgeParserTest {
     pointData.setGraphRef("f78da");
     gpmlPoints.add(pointData);
 
-    pointData = new PointData();
+    pointData = new PointData("mapName");
     pointData.setX(506.83491062039946);
     pointData.setY(396.35686597839583);
     gpmlPoints.add(pointData);
 
-    pointData = new PointData();
+    pointData = new PointData("mapName");
     pointData.setX(506.83491062039946);
     pointData.setY(369.3819137749735);
     gpmlPoints.add(pointData);
 
-    pointData = new PointData();
+    pointData = new PointData("mapName");
     pointData.setX(718.8015247108307);
     pointData.setY(343.0727655099894);
     pointData.setRelX("0.0");
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParserTest.java
index 2f44e6873d579629891d37edbd8dac912f154412..fb2f8d0e2ba4e518c1935c363c004fe45d7f0690 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParserTest.java
@@ -1,35 +1,18 @@
 package lcsb.mapviewer.wikipathway.XML;
 
 import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
 
-import java.awt.*;
-import java.util.Collection;
+import java.awt.Color;
 
 import org.junit.*;
-import org.w3c.dom.Element;
+import org.mockito.Mockito;
 
-import lcsb.mapviewer.common.exception.NotImplementedException;
-import lcsb.mapviewer.converter.ConverterException;
 import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions;
 
 public class ElementGpmlParserTest extends WikipathwaysTestFunctions {
 
-  ElementGpmlParser<Object> parser = new ElementGpmlParser<Object>() {
-    @Override
-    public Object parse(Element node) throws ConverterException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String toXml(Object object) throws ConverterException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String toXml(Collection<Object> list) throws ConverterException {
-      throw new NotImplementedException();
-    }
-  };
+  ElementGpmlParser<?> parser = Mockito.mock(ElementGpmlParser.class, CALLS_REAL_METHODS);
 
   @Before
   public void setUp() throws Exception {
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java
index aa346f17ef07767653f3a8f4312c37269aea867e..eb9e33368f1fe43b30b89759b9d482e38596f2fa 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/LabelParserTest.java
@@ -11,7 +11,7 @@ import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions;
 import lcsb.mapviewer.wikipathway.model.Label;
 
 public class LabelParserTest extends WikipathwaysTestFunctions {
-  LabelParser parser = new LabelParser();
+  LabelParser parser = new LabelParser("mapName");
 
   @Before
   public void setUp() throws Exception {
@@ -57,7 +57,7 @@ public class LabelParserTest extends WikipathwaysTestFunctions {
   public void testParseGraphics() throws Exception {
     Element node = fileToNode("testFiles/elements/label_graphics.xml");
 
-    Label label = new Label("test");
+    Label label = new Label("test", "mapName");
     parser.parseGraphics(node, label);
     assertNotNull(label);
 
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java
index acb69da6375af10472e03df7a029ac0652ed50ec..a9b43c1bb71d2ba9e0c343b68fb57f8c8ea8cc73 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelContructorTest.java
@@ -19,11 +19,13 @@ public class ModelContructorTest extends WikipathwaysTestFunctions {
   Logger logger = LogManager.getLogger(ModelContructorTest.class);
 
   ModelComparator comparator = new ModelComparator();
+  ModelContructor mc ;
 
   private int elementCounter = 0;
 
   @Before
   public void setUp() throws Exception {
+    mc = new ModelContructor("mapName");
   }
 
   @After
@@ -32,9 +34,9 @@ public class ModelContructorTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testZIndexForElement() throws Exception {
-    ModelToGPML parser = new ModelToGPML();
     Model model = createEmptyModel();
     model.addElement(createProtein());
+    ModelToGPML parser = new ModelToGPML(model.getName());
     String xml = parser.getGPML(model);
     assertNotNull(xml);
 
@@ -61,17 +63,15 @@ public class ModelContructorTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testShouldRotate90degreesWithNoAsAnswer() {
-    ModelContructor mc = new ModelContructor();
     assertFalse(mc.shouldRotate90degrees(0.0));
     assertFalse(mc.shouldRotate90degrees(Math.PI));
     assertFalse(mc.shouldRotate90degrees(15 * Math.PI));
     assertFalse(mc.shouldRotate90degrees(-Math.PI));
-    assertFalse(mc.shouldRotate90degrees(null));
+    assertFalse(mc.shouldRotate90degrees((Double)null));
   }
 
   @Test
   public void testShouldRotate90degrees() {
-    ModelContructor mc = new ModelContructor();
     assertTrue(mc.shouldRotate90degrees(Math.PI / 2));
     assertTrue(mc.shouldRotate90degrees(15 * Math.PI / 2));
     assertTrue(mc.shouldRotate90degrees(-Math.PI / 2));
@@ -79,7 +79,6 @@ public class ModelContructorTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testShouldRotate90degreesWithWarnings() {
-    ModelContructor mc = new ModelContructor();
     assertFalse(mc.shouldRotate90degrees(0.0 + 0.5));
     assertEquals(1, super.getWarnings().size());
     assertFalse(mc.shouldRotate90degrees(Math.PI + 0.5));
@@ -98,7 +97,6 @@ public class ModelContructorTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testRotate90degrees() {
-    ModelContructor mc = new ModelContructor();
     Rectangle2D result = mc.rotate90degrees(new Rectangle2D.Double(10, 20, 30, 40));
     assertEquals(5, result.getX(), Configuration.EPSILON);
     assertEquals(25, result.getY(), Configuration.EPSILON);
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java
index be945f0b5b4667a1cae0de5d5bbb3a79f213df03..a0e8cb5ed09a7e32f2b494baa9b0571fe18c2539 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java
@@ -32,10 +32,10 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions {
 
   @Test
   public void test() throws Exception {
-    ModelToGPML parser = new ModelToGPML();
     CellDesignerXmlParser cellDesignerXmlParser = new CellDesignerXmlParser();
     Model model = cellDesignerXmlParser
         .createModel(new ConverterParams().filename("testFiles/other_full/GSTP1 subnetwork_220214.xml"));
+    ModelToGPML parser = new ModelToGPML(model.getName());
     String xml = parser.getGPML(model);
     assertNotNull(xml);
     assertEquals(10, getWarnings().size());
@@ -46,7 +46,6 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testAnnotations() throws Exception {
-    ModelToGPML parser = new ModelToGPML();
 
     Model model = new ModelFullIndexed(null);
     model.setWidth(1000);
@@ -59,6 +58,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions {
 
     model.addElement(alias);
 
+    ModelToGPML parser = new ModelToGPML(model.getName());
     String xml = parser.getGPML(model);
     assertNotNull(xml);
     assertEquals(0, getWarnings().size());
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java
index 0dc4747db50c4a46497978b09be33d9c4053c452..4f4e364a54c9840a2dee65f5aaad6ab2bf6f0309 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReactionLayoutFinderTest.java
@@ -136,7 +136,7 @@ public class ReactionLayoutFinderTest extends WikipathwaysTestFunctions {
   }
 
   private Edge createEdge(String id, Point2D p1, Point2D p2) {
-    Edge modifierEdge = new Edge(id);
+    Edge modifierEdge = new Edge(id, null);
     modifierEdge.setLine(new PolylineData(p1, p2));
     return modifierEdge;
   }
@@ -204,7 +204,7 @@ public class ReactionLayoutFinderTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testNodeLinesInteractionWithTwoReactants() {
-    Edge edge = new Edge("id");
+    Edge edge = new Edge("id", null);
     PolylineData line = new PolylineData(Arrays.asList(
         new Point2D.Double(0, 0), 
         new Point2D.Double(100, 0),
@@ -220,7 +220,7 @@ public class ReactionLayoutFinderTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testNodeLinesInteractionWithTwoProducts() {
-    Edge edge = new Edge("id");
+    Edge edge = new Edge("id", null);
     PolylineData line = new PolylineData(Arrays.asList(
         new Point2D.Double(0, 0), 
         new Point2D.Double(100, 0),
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java
index 385d524ffe417d5fbdd12f5d3a92b8b740e05c08..2a3d7dfb7aecb2e1fb57151a7f4b1a5a87396750 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java
@@ -16,7 +16,7 @@ import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions;
 public class ReferenceParserTest extends WikipathwaysTestFunctions {
   Logger logger = LogManager.getLogger(ReferenceParserTest.class);
 
-  ReferenceParser mc = new ReferenceParser();
+  ReferenceParser mc = new ReferenceParser("mapName");
 
   @Before
   public void setUp() throws Exception {
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ShapeParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ShapeParserTest.java
index 11c6fb1cf41b174451bca55504b6f1a6c3acf336..5cc4e8f274423756f40502f91ca5ada44e377d0a 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ShapeParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ShapeParserTest.java
@@ -14,7 +14,7 @@ import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions;
 import lcsb.mapviewer.wikipathway.model.Shape;
 
 public class ShapeParserTest extends WikipathwaysTestFunctions {
-  ShapeParser parser = new ShapeParser();
+  ShapeParser parser = new ShapeParser("mapName");
 
   @After
   public void tearDown() throws Exception {
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/StateParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/StateParserTest.java
index 4f8a696a79a1d4ead521e7c4dee63f7fff007a26..cfb051908b9ff7e90cdd33808b526deed90ad6c8 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/StateParserTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/StateParserTest.java
@@ -13,7 +13,7 @@ import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions;
 import lcsb.mapviewer.wikipathway.model.State;
 
 public class StateParserTest extends WikipathwaysTestFunctions {
-  StateParser parser = new StateParser();
+  StateParser parser = new StateParser("mapName");
 
   @After
   public void tearDown() throws Exception {
diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/PointDataTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/PointDataTest.java
index b42102350fcda3b28e7684d87e4977a5c71470b3..9612a7125808af9984f5f060fe449f93090186ee 100644
--- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/PointDataTest.java
+++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/model/PointDataTest.java
@@ -17,7 +17,7 @@ public class PointDataTest extends WikipathwaysTestFunctions {
 
   @Test
   public void testSeialization() {
-    SerializationUtils.serialize(new PointData());
+    SerializationUtils.serialize(new PointData("mapName"));
   }
 
 }