diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/cache/PermanentDatabaseLevelCache.java b/annotation/src/main/java/lcsb/mapviewer/annotation/cache/PermanentDatabaseLevelCache.java
index f01300330495637f235777329ddac6edc8b15930..92d56f5401d9deed0a13ded1cd7aad46187b8b24 100644
--- a/annotation/src/main/java/lcsb/mapviewer/annotation/cache/PermanentDatabaseLevelCache.java
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/cache/PermanentDatabaseLevelCache.java
@@ -44,7 +44,7 @@ public class PermanentDatabaseLevelCache extends XmlParser
     implements PermanentDatabaseLevelCacheInterface, ApplicationContextAware {
 
   /**
-   * This class represents new thread task for quering database.
+   * This class represents new thread task for querying database.
    *
    * @author Piotr Gawron
    *
@@ -433,8 +433,8 @@ public class PermanentDatabaseLevelCache extends XmlParser
       }
     });
 
-    // put in the queue empty task to make sure that everything was initializedd
-    // (additional managing thread was createed)
+    // put in the queue empty task to make sure that everything was initialized
+    // (additional managing thread was created)
     service.submit(new Callable<Object>() {
       @Override
       public Object call() throws Exception {
diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/ModelAnnotator.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/ModelAnnotator.java
index 414f01a803a455b0c81fd04c244e77936e16df44..e1b8afd2d4efedbb1b486fe3327b8ecfbc70ffeb 100644
--- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/ModelAnnotator.java
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/ModelAnnotator.java
@@ -419,7 +419,7 @@ public class ModelAnnotator {
    * @param m
    *          model
    * @param updater
-   *          updater call back function that updat information about progress of
+   *          updater call back function that update information about progress of
    *          the function
    * @param validAnnotations
    *          map that contains information which {@link MiriamType miriam types}
diff --git a/annotation/src/main/java/lcsb/mapviewer/annotation/services/PubmedParser.java b/annotation/src/main/java/lcsb/mapviewer/annotation/services/PubmedParser.java
index 0fbcd7a00e507a8d95cb43a2491c02a565fc1610..465bc8b992ab6f71e1143af666efb28cb88e2d20 100644
--- a/annotation/src/main/java/lcsb/mapviewer/annotation/services/PubmedParser.java
+++ b/annotation/src/main/java/lcsb/mapviewer/annotation/services/PubmedParser.java
@@ -28,7 +28,7 @@ import lcsb.mapviewer.model.map.MiriamData;
 import lcsb.mapviewer.model.map.MiriamType;
 
 /**
- * This class is a backend to publically available pubmed API in
+ * This class is a backend to publicly available pubmed API in
  * <a href="https://europepmc.org/RestfulWebService">Europe PubMed Central </a>.
  * 
  * @author Piotr Gawron
@@ -36,340 +36,348 @@ import lcsb.mapviewer.model.map.MiriamType;
  */
 public class PubmedParser extends CachableInterface implements IExternalService {
 
-	/**
-	 * Pubmed identifier used to check the status of service (functionality from
-	 * {@link IExternalService}).
-	 */
-	static final int							 SERVICE_STATUS_PUBMED_ID	= 12345;
-
-	/**
-	 * Prefix used for caching elements with pubmed identifier as a key.
-	 */
-	static final String						 PUBMED_PREFIX						= "pubmed: ";
-
-	/**
-	 * Length of {@link #PUBMED_PREFIX} string.
-	 */
-	private static final int			 PUBMED_PREFIX_LENGTH			= PUBMED_PREFIX.length();
-
-	/**
-	 * Version of the remote API thnat is supported by this connecting class.
-	 */
-	static final String						 SUPPORTED_VERSION				= "5.2.2";
-
-    static final String API_URL = "https://www.ebi.ac.uk/europepmc/webservices/rest/";
-
-	/**
-	 * Connector used for accessing data from miriam registry.
-	 */
-	@Autowired
-	private MiriamConnector				 miriamConnector;
-
-	/**
-	 * Default class logger.
-	 */
-	private Logger								 logger										= Logger.getLogger(PubmedParser.class);
-
-	/**
-	 * Object that allows to serialize {@link Article} elements into xml string
-	 * and deserialize xml into {@link Article} objects.
-	 */
-	private XmlSerializer<Article> articleSerializer;
-
-	@Override
-	public String refreshCacheQuery(Object query) throws SourceNotAvailable {
-		String result = null;
-		try {
-			if (query instanceof String) {
-				String name = (String) query;
-				if (name.startsWith(PUBMED_PREFIX)) {
-					Integer id = Integer.valueOf(name.substring(PUBMED_PREFIX_LENGTH));
-					result = articleSerializer.objectToString(getPubmedArticleById(id));
-				} else {
-					throw new InvalidArgumentException("Don't know what to do with string \"" + query + "\"");
-				}
-			} else {
-				throw new InvalidArgumentException("Don't know what to do with class: " + query.getClass());
-			}
-		} catch (PubmedSearchException e) {
-			throw new SourceNotAvailable(e);
-		}
-
-		return result;
-	}
-
-	/**
-	 * Default constructor. Initializes structures used for transforming
-	 * {@link Article} from/to xml.
-	 */
-	public PubmedParser() {
-		super(PubmedParser.class);
-		articleSerializer = new XmlSerializer<>(Article.class);
-	}
-
-	/**
-	 * Returns article data for given pubmed identifier.
-	 * 
-	 * @param id
-	 *          pubmed identifier
-	 * @return article data
-	 * @throws PubmedSearchException
-	 *           thrown when there is a problem with accessing information about
-	 *           pubmed
-	 */
-	public Article getPubmedArticleById(Integer id) throws PubmedSearchException {
-		String queryString = "pubmed: " + id;
-		Article result = null;
-		try {
-			result = articleSerializer.xmlToObject(getCacheNode(queryString));
-		} catch (SerializationException e) {
-			logger.warn("Problem with deserialization of the string: " + queryString);
-		}
-		if (result != null && result.getTitle() != null) {
-			return result;
-		} else {
-			logger.debug("Pubmed article (id=" + id + ") not found in cache. Accessing WebService...");
-		}
-
-		result = new Article();
-		try {
-			String url = API_URL+"search/resulttype=core&query="
-					+ java.net.URLEncoder.encode("src:med ext_id:" + id, "UTF-8");
-
-			String content = getWebPageContent(url);
-
-			Document mainDoc = super.getXmlDocumentFromString(content);
-			// Document citationDoc = dBuilder.parse(citationStream);
-			mainDoc.getDocumentElement().normalize();
-			// citationDoc.getDocumentElement().normalize();
-			XPathFactory xPathFactory = XPathFactory.newInstance();
-			XPath xpath = xPathFactory.newXPath();
-			NodeList nodeList = null;
-			// Hit Count
-			nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/citedByCount").evaluate(mainDoc, XPathConstants.NODESET);
-			if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
-				try {
-					result.setCitationCount(Integer.valueOf(nodeList.item(0).getFirstChild().getNodeValue()));
-				} catch (Exception e) {
-				}
-			}
-			// Title
-			nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/title").evaluate(mainDoc, XPathConstants.NODESET);
-			if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
-				result.setTitle(nodeList.item(0).getFirstChild().getNodeValue());
-			}
-			// Year
-			nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/journalInfo/yearOfPublication").evaluate(mainDoc, XPathConstants.NODESET);
-			if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
-				try {
-					result.setYear(Integer.valueOf(nodeList.item(0).getFirstChild().getNodeValue()));
-				} catch (Exception e) {
-				}
-			}
-			// Journal
-			nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/journalInfo/journal/title").evaluate(mainDoc, XPathConstants.NODESET);
-			if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
-				result.setJournal(nodeList.item(0).getFirstChild().getNodeValue());
-			}
-			// Authors
-			nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/authorString").evaluate(mainDoc, XPathConstants.NODESET);
-			if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
-				List<String> authors = new ArrayList<String>();
-				String value = nodeList.item(0).getFirstChild().getNodeValue();
-				if (value != null && !value.isEmpty()) {
-					authors = Arrays.asList(value.split(","));
-				}
-				result.setAuthors(authors);
-			}
-			result.setLink(miriamConnector.getUrlString(new MiriamData(MiriamType.PUBMED, id + "")));
-			result.setId(id + "");
-
-			if (result.getTitle() != null && !result.getTitle().trim().isEmpty()) {
-				try {
-					setCacheValue(queryString, articleSerializer.objectToString(result));
-				} catch (SerializationException e) {
-					logger.warn("Problem with serialization of the string: " + queryString);
-				}
-			} else {
-				result = null;
-			}
-
-		} catch (Exception e) {
-			throw new PubmedSearchException(e);
-		}
-		return result;
-	}
-
-	/**
-	 * This method return html \< a\ > tag with link for pubmed id (with some
-	 * additional information).
-	 * 
-	 * @param id
-	 *          pubmed identifier
-	 * @param withTextPrefix
-	 *          should prefix be added to the tag
-	 * @return link to webpage with pubmed article
-	 * @throws PubmedSearchException
-	 *           thrown when there is a problem with accessing information about
-	 *           pubmed
-	 */
-	public String getHtmlFullLinkForId(Integer id, boolean withTextPrefix) throws PubmedSearchException {
-		String result = "";
-		Article article = getPubmedArticleById(id);
-		result += "<div style=\"float:left;\" title=\"" + article.getTitle() + ", ";
-		result += article.getStringAuthors() + ", ";
-		result += article.getYear() + ", ";
-		result += article.getJournal() + "\">";
-		if (withTextPrefix) {
-			result += "pubmed: ";
-		}
-		result += "<a target=\"_blank\" href = \"" + article.getLink() + "\">" + id + "</a>&nbsp;</div>";
-		return result;
-	}
-
-	/**
-	 * This method return html \< a\ > tag with link for pubmed id (with some
-	 * additional information).
-	 * 
-	 * @param id
-	 *          pubmed identifier
-	 * @return link to webpage with pubmed article
-	 * @throws PubmedSearchException
-	 *           thrown when there is a problem with accessing information about
-	 *           pubmed
-	 */
-	public String getHtmlFullLinkForId(Integer id) throws PubmedSearchException {
-		return getHtmlFullLinkForId(id, true);
-	}
-
-	/**
-	 * Get the summary of the article.
-	 * 
-	 * @param id
-	 *          pubmed identifier
-	 * @return summary of the article.
-	 * @throws PubmedSearchException
-	 *           thrown when there is a problem with accessing information about
-	 *           pubmed
-	 */
-	public String getSummary(Integer id) throws PubmedSearchException {
-		Article article = getPubmedArticleById(id);
-		if (article == null) {
-			return null;
-		}
-		String result = article.getTitle() + ", " + article.getStringAuthors() + ", " + article.getYear() + ", " + article.getJournal();
-		return result;
-	}
-
-	@Override
-	public ExternalServiceStatus getServiceStatus() {
-		ExternalServiceStatus status = new ExternalServiceStatus("Europe PubMed Central", "https://europepmc.org/RestfulWebService");
-		GeneralCacheInterface cacheCopy = getCache();
-		this.setCache(null);
-
-		try {
-			Article art = getPubmedArticleById(SERVICE_STATUS_PUBMED_ID);
-			if (!getApiVersion().equals(SUPPORTED_VERSION)) {
-				logger.debug("New europepmc API version: " + getApiVersion());
-				status.setStatus(ExternalServiceStatusType.CHANGED);
-			} else if (art == null) {
-				status.setStatus(ExternalServiceStatusType.DOWN);
-			} else {
-				status.setStatus(ExternalServiceStatusType.OK);
-			}
-		} catch (Exception e) {
-			logger.error(status.getName() + " is down", e);
-			status.setStatus(ExternalServiceStatusType.DOWN);
-		}
-		this.setCache(cacheCopy);
-		return status;
-	}
-
-	/**
-	 * Returns current version of the pmc API.
-	 * 
-	 * @return version of the api to which this class is connected
-	 * @throws PubmedSearchException
-	 *           thrown when there is a problem with accessing external databes
-	 */
-	public String getApiVersion() throws PubmedSearchException {
-		try {
-			String url = API_URL+"search/resulttype=core&query=src%3Amed+ext_id%3A23644949";
-
-			String content = getWebPageContent(url);
-
-			Document mainDoc = super.getXmlDocumentFromString(content);
-			mainDoc.getDocumentElement().normalize();
-			XPathFactory xPathFactory = XPathFactory.newInstance();
-			XPath xpath = xPathFactory.newXPath();
-			NodeList nodeList = (NodeList) xpath.compile("/responseWrapper/version").evaluate(mainDoc, XPathConstants.NODESET);
-			if (nodeList.getLength() > 0) {
-				return nodeList.item(0).getTextContent();
-			}
-			return null;
-		} catch (IOException e) {
-			throw new PubmedSearchException("Problem with accessing pubmed db", e);
-		} catch (InvalidXmlSchemaException | XPathExpressionException e) {
-			throw new PubmedSearchException("Invalid response from pubmed db", e);
-		}
-	}
-
-	/**
-	 * Get the summary of the article.
-	 * 
-	 * @param id
-	 *          pubmed identifier
-	 * @return summary of the article.
-	 * @throws PubmedSearchException
-	 *           thrown when there is a problem with accessing information about
-	 *           pubmed
-	 */
-	public String getSummary(String id) throws PubmedSearchException {
-		return getSummary(Integer.valueOf(id));
-	}
-
-	/**
-	 * @return the miriamConnector
-	 * @see #miriamConnector
-	 */
-	public MiriamConnector getMiriamConnector() {
-		return miriamConnector;
-	}
-
-	/**
-	 * @param miriamConnector
-	 *          the miriamConnector to set
-	 * @see #miriamConnector
-	 */
-	public void setMiriamConnector(MiriamConnector miriamConnector) {
-		this.miriamConnector = miriamConnector;
-	}
-
-	/**
-	 * @return the articleSerializer
-	 * @see #articleSerializer
-	 */
-	protected XmlSerializer<Article> getArticleSerializer() {
-		return articleSerializer;
-	}
-
-	/**
-	 * @param articleSerializer
-	 *          the articleSerializer to set
-	 * @see #articleSerializer
-	 */
-	protected void setArticleSerializer(XmlSerializer<Article> articleSerializer) {
-		this.articleSerializer = articleSerializer;
-	}
-
-	@Override
-	protected WebPageDownloader getWebPageDownloader() {
-		return super.getWebPageDownloader();
-	}
-
-	@Override
-	protected void setWebPageDownloader(WebPageDownloader webPageDownloader) {
-		super.setWebPageDownloader(webPageDownloader);
-	}
+  /**
+   * Pubmed identifier used to check the status of service (functionality from
+   * {@link IExternalService}).
+   */
+  static final int SERVICE_STATUS_PUBMED_ID = 12345;
+
+  /**
+   * Prefix used for caching elements with pubmed identifier as a key.
+   */
+  static final String PUBMED_PREFIX = "pubmed: ";
+
+  /**
+   * Length of {@link #PUBMED_PREFIX} string.
+   */
+  private static final int PUBMED_PREFIX_LENGTH = PUBMED_PREFIX.length();
+
+  /**
+   * Version of the remote API that is supported by this connecting class.
+   */
+  static final String SUPPORTED_VERSION = "5.2.2";
+
+  static final String API_URL = "https://www.ebi.ac.uk/europepmc/webservices/rest/";
+
+  /**
+   * Connector used for accessing data from miriam registry.
+   */
+  @Autowired
+  private MiriamConnector miriamConnector;
+
+  /**
+   * Default class logger.
+   */
+  private Logger logger = Logger.getLogger(PubmedParser.class);
+
+  /**
+   * Object that allows to serialize {@link Article} elements into xml string and
+   * deserialize xml into {@link Article} objects.
+   */
+  private XmlSerializer<Article> articleSerializer;
+
+  @Override
+  public Object refreshCacheQuery(Object query) throws SourceNotAvailable {
+    Object result = null;
+    try {
+      if (query instanceof String) {
+        String name = (String) query;
+        if (name.startsWith(PUBMED_PREFIX)) {
+          Integer id = Integer.valueOf(name.substring(PUBMED_PREFIX_LENGTH));
+          result = articleSerializer.objectToString(getPubmedArticleById(id));
+        } else {
+          result = super.refreshCacheQuery(query);
+        }
+      } else {
+        result = super.refreshCacheQuery(query);
+      }
+    } catch (PubmedSearchException e) {
+      throw new SourceNotAvailable(e);
+    }
+
+    return result;
+  }
+
+  /**
+   * Default constructor. Initializes structures used for transforming
+   * {@link Article} from/to xml.
+   */
+  public PubmedParser() {
+    super(PubmedParser.class);
+    articleSerializer = new XmlSerializer<>(Article.class);
+  }
+
+  /**
+   * Returns article data for given pubmed identifier.
+   * 
+   * @param id
+   *          pubmed identifier
+   * @return article data
+   * @throws PubmedSearchException
+   *           thrown when there is a problem with accessing information about
+   *           pubmed
+   */
+  public Article getPubmedArticleById(Integer id) throws PubmedSearchException {
+    String queryString = "pubmed: " + id;
+    Article result = null;
+    try {
+      result = articleSerializer.xmlToObject(getCacheNode(queryString));
+    } catch (SerializationException e) {
+      logger.warn("Problem with deserialization of the string: " + queryString);
+    }
+    if (result != null && result.getTitle() != null) {
+      return result;
+    } else {
+      logger.debug("Pubmed article (id=" + id + ") not found in cache. Accessing WebService...");
+    }
+
+    result = new Article();
+    try {
+      String url = API_URL + "search/resulttype=core&query="
+          + java.net.URLEncoder.encode("src:med ext_id:" + id, "UTF-8");
+
+      String content = getWebPageContent(url);
+
+      Document mainDoc = super.getXmlDocumentFromString(content);
+      // Document citationDoc = dBuilder.parse(citationStream);
+      mainDoc.getDocumentElement().normalize();
+      // citationDoc.getDocumentElement().normalize();
+      XPathFactory xPathFactory = XPathFactory.newInstance();
+      XPath xpath = xPathFactory.newXPath();
+      NodeList nodeList = null;
+      // Hit Count
+      nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/citedByCount").evaluate(mainDoc,
+          XPathConstants.NODESET);
+      if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
+        try {
+          result.setCitationCount(Integer.valueOf(nodeList.item(0).getFirstChild().getNodeValue()));
+        } catch (Exception e) {
+        }
+      }
+      // Title
+      nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/title").evaluate(mainDoc,
+          XPathConstants.NODESET);
+      if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
+        result.setTitle(nodeList.item(0).getFirstChild().getNodeValue());
+      }
+      // Year
+      nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/journalInfo/yearOfPublication")
+          .evaluate(mainDoc, XPathConstants.NODESET);
+      if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
+        try {
+          result.setYear(Integer.valueOf(nodeList.item(0).getFirstChild().getNodeValue()));
+        } catch (Exception e) {
+        }
+      }
+      // Journal
+      nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/journalInfo/journal/title")
+          .evaluate(mainDoc, XPathConstants.NODESET);
+      if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
+        result.setJournal(nodeList.item(0).getFirstChild().getNodeValue());
+      }
+      // Authors
+      nodeList = (NodeList) xpath.compile("/responseWrapper/resultList/result/authorString").evaluate(mainDoc,
+          XPathConstants.NODESET);
+      if (nodeList != null && nodeList.getLength() > 0 && nodeList.item(0).getFirstChild() != null) {
+        List<String> authors = new ArrayList<String>();
+        String value = nodeList.item(0).getFirstChild().getNodeValue();
+        if (value != null && !value.isEmpty()) {
+          authors = Arrays.asList(value.split(","));
+        }
+        result.setAuthors(authors);
+      }
+      result.setLink(miriamConnector.getUrlString(new MiriamData(MiriamType.PUBMED, id + "")));
+      result.setId(id + "");
+
+      if (result.getTitle() != null && !result.getTitle().trim().isEmpty()) {
+        try {
+          setCacheValue(queryString, articleSerializer.objectToString(result));
+        } catch (SerializationException e) {
+          logger.warn("Problem with serialization of the string: " + queryString);
+        }
+      } else {
+        result = null;
+      }
+
+    } catch (Exception e) {
+      throw new PubmedSearchException(e);
+    }
+    return result;
+  }
+
+  /**
+   * This method return html \< a\ > tag with link for pubmed id (with some
+   * additional information).
+   * 
+   * @param id
+   *          pubmed identifier
+   * @param withTextPrefix
+   *          should prefix be added to the tag
+   * @return link to webpage with pubmed article
+   * @throws PubmedSearchException
+   *           thrown when there is a problem with accessing information about
+   *           pubmed
+   */
+  public String getHtmlFullLinkForId(Integer id, boolean withTextPrefix) throws PubmedSearchException {
+    String result = "";
+    Article article = getPubmedArticleById(id);
+    result += "<div style=\"float:left;\" title=\"" + article.getTitle() + ", ";
+    result += article.getStringAuthors() + ", ";
+    result += article.getYear() + ", ";
+    result += article.getJournal() + "\">";
+    if (withTextPrefix) {
+      result += "pubmed: ";
+    }
+    result += "<a target=\"_blank\" href = \"" + article.getLink() + "\">" + id + "</a>&nbsp;</div>";
+    return result;
+  }
+
+  /**
+   * This method return html \< a\ > tag with link for pubmed id (with some
+   * additional information).
+   * 
+   * @param id
+   *          pubmed identifier
+   * @return link to webpage with pubmed article
+   * @throws PubmedSearchException
+   *           thrown when there is a problem with accessing information about
+   *           pubmed
+   */
+  public String getHtmlFullLinkForId(Integer id) throws PubmedSearchException {
+    return getHtmlFullLinkForId(id, true);
+  }
+
+  /**
+   * Get the summary of the article.
+   * 
+   * @param id
+   *          pubmed identifier
+   * @return summary of the article.
+   * @throws PubmedSearchException
+   *           thrown when there is a problem with accessing information about
+   *           pubmed
+   */
+  public String getSummary(Integer id) throws PubmedSearchException {
+    Article article = getPubmedArticleById(id);
+    if (article == null) {
+      return null;
+    }
+    String result = article.getTitle() + ", " + article.getStringAuthors() + ", " + article.getYear() + ", "
+        + article.getJournal();
+    return result;
+  }
+
+  @Override
+  public ExternalServiceStatus getServiceStatus() {
+    ExternalServiceStatus status = new ExternalServiceStatus("Europe PubMed Central",
+        "https://europepmc.org/RestfulWebService");
+    GeneralCacheInterface cacheCopy = getCache();
+    this.setCache(null);
+
+    try {
+      Article art = getPubmedArticleById(SERVICE_STATUS_PUBMED_ID);
+      if (!getApiVersion().equals(SUPPORTED_VERSION)) {
+        logger.debug("New europepmc API version: " + getApiVersion());
+        status.setStatus(ExternalServiceStatusType.CHANGED);
+      } else if (art == null) {
+        status.setStatus(ExternalServiceStatusType.DOWN);
+      } else {
+        status.setStatus(ExternalServiceStatusType.OK);
+      }
+    } catch (Exception e) {
+      logger.error(status.getName() + " is down", e);
+      status.setStatus(ExternalServiceStatusType.DOWN);
+    }
+    this.setCache(cacheCopy);
+    return status;
+  }
+
+  /**
+   * Returns current version of the pmc API.
+   * 
+   * @return version of the api to which this class is connected
+   * @throws PubmedSearchException
+   *           thrown when there is a problem with accessing external databes
+   */
+  public String getApiVersion() throws PubmedSearchException {
+    try {
+      String url = API_URL + "search/resulttype=core&query=src%3Amed+ext_id%3A23644949";
+
+      String content = getWebPageContent(url);
+
+      Document mainDoc = super.getXmlDocumentFromString(content);
+      mainDoc.getDocumentElement().normalize();
+      XPathFactory xPathFactory = XPathFactory.newInstance();
+      XPath xpath = xPathFactory.newXPath();
+      NodeList nodeList = (NodeList) xpath.compile("/responseWrapper/version").evaluate(mainDoc,
+          XPathConstants.NODESET);
+      if (nodeList.getLength() > 0) {
+        return nodeList.item(0).getTextContent();
+      }
+      return null;
+    } catch (IOException e) {
+      throw new PubmedSearchException("Problem with accessing pubmed db", e);
+    } catch (InvalidXmlSchemaException | XPathExpressionException e) {
+      throw new PubmedSearchException("Invalid response from pubmed db", e);
+    }
+  }
+
+  /**
+   * Get the summary of the article.
+   * 
+   * @param id
+   *          pubmed identifier
+   * @return summary of the article.
+   * @throws PubmedSearchException
+   *           thrown when there is a problem with accessing information about
+   *           pubmed
+   */
+  public String getSummary(String id) throws PubmedSearchException {
+    return getSummary(Integer.valueOf(id));
+  }
+
+  /**
+   * @return the miriamConnector
+   * @see #miriamConnector
+   */
+  public MiriamConnector getMiriamConnector() {
+    return miriamConnector;
+  }
+
+  /**
+   * @param miriamConnector
+   *          the miriamConnector to set
+   * @see #miriamConnector
+   */
+  public void setMiriamConnector(MiriamConnector miriamConnector) {
+    this.miriamConnector = miriamConnector;
+  }
+
+  /**
+   * @return the articleSerializer
+   * @see #articleSerializer
+   */
+  protected XmlSerializer<Article> getArticleSerializer() {
+    return articleSerializer;
+  }
+
+  /**
+   * @param articleSerializer
+   *          the articleSerializer to set
+   * @see #articleSerializer
+   */
+  protected void setArticleSerializer(XmlSerializer<Article> articleSerializer) {
+    this.articleSerializer = articleSerializer;
+  }
+
+  @Override
+  protected WebPageDownloader getWebPageDownloader() {
+    return super.getWebPageDownloader();
+  }
+
+  @Override
+  protected void setWebPageDownloader(WebPageDownloader webPageDownloader) {
+    super.setWebPageDownloader(webPageDownloader);
+  }
 
 }
diff --git a/frontend-js/package-lock.json b/frontend-js/package-lock.json
index 378ebd38856bbe27a33730663ce7dda52de9c70f..29898ad842e00b3eb7c8dd24e29d521cd5cf3cef 100644
--- a/frontend-js/package-lock.json
+++ b/frontend-js/package-lock.json
@@ -45,38 +45,30 @@
         "litemol": "github:dsehnal/LiteMol#a5419c696faa84530dd93acd55b747cf8136902b"
       },
       "dependencies": {
-        "ProtVista": {
-          "version": "git://github.com/davidhoksza/protvista.git#4e4bb737ba1e183291505bd25f8bae2e651ce21e",
-          "dev": true,
-          "requires": {
-            "d3": "3.5.17",
-            "file-saver": "1.3.3",
-            "jquery": "2.2.4",
-            "jszip": "3.1.4",
-            "underscore": "1.8.3"
-          },
-          "dependencies": {
-            "jquery": {
-              "version": "2.2.4",
-              "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz",
-              "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=",
-              "dev": true
-            }
-          }
-        },
         "jquery": {
           "version": "3.3.1",
           "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
           "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==",
           "dev": true
-        },
-        "litemol": {
-          "version": "github:dsehnal/LiteMol#a5419c696faa84530dd93acd55b747cf8136902b",
-          "dev": true,
-          "requires": {
-            "@types/react": "15.6.14",
-            "@types/react-dom": "15.5.7"
-          }
+        }
+      }
+    },
+    "ProtVista": {
+      "version": "git://github.com/davidhoksza/protvista.git#4e4bb737ba1e183291505bd25f8bae2e651ce21e",
+      "dev": true,
+      "requires": {
+        "d3": "3.5.17",
+        "file-saver": "1.3.3",
+        "jquery": "2.2.4",
+        "jszip": "3.1.4",
+        "underscore": "1.8.3"
+      },
+      "dependencies": {
+        "jquery": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz",
+          "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=",
+          "dev": true
         }
       }
     },
@@ -2058,6 +2050,14 @@
         "immediate": "3.0.6"
       }
     },
+    "litemol": {
+      "version": "github:dsehnal/LiteMol#a5419c696faa84530dd93acd55b747cf8136902b",
+      "dev": true,
+      "requires": {
+        "@types/react": "15.6.14",
+        "@types/react-dom": "15.5.7"
+      }
+    },
     "lodash": {
       "version": "4.17.4",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",