diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/DbSearchService.java b/service/src/main/java/lcsb/mapviewer/services/search/db/DbSearchService.java
new file mode 100644
index 0000000000000000000000000000000000000000..43bdc10b273b2dae5058ab2cf180b02bac634abf
--- /dev/null
+++ b/service/src/main/java/lcsb/mapviewer/services/search/db/DbSearchService.java
@@ -0,0 +1,48 @@
+package lcsb.mapviewer.services.search.db;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import lcsb.mapviewer.annotation.data.Target;
+import lcsb.mapviewer.annotation.data.TargettingStructure;
+import lcsb.mapviewer.annotation.services.PubmedParser;
+import lcsb.mapviewer.annotation.services.PubmedSearchException;
+import lcsb.mapviewer.annotation.services.annotators.AnnotatorException;
+import lcsb.mapviewer.model.map.MiriamData;
+import lcsb.mapviewer.model.map.MiriamType;
+
+@Transactional(value = "txManager")
+public abstract class DbSearchService {
+
+	/**
+	 * Service accessing
+	 * <a href="http://europepmc.org/RestfulWebService">pubmed</a>.
+	 */
+	@Autowired
+	private PubmedParser														 pubmedParser;
+
+	protected void cacheMiriamData(TargettingStructure targettingStructure) throws AnnotatorException {
+		Set<MiriamData> result = new HashSet<>();
+		result.addAll(targettingStructure.getSources());
+		for (Target target : targettingStructure.getTargets()) {
+			result.addAll(target.getGenes());
+			result.addAll(target.getReferences());
+
+		}
+		
+		for (MiriamData miriamData : result) {
+			if (MiriamType.PUBMED.equals(miriamData.getDataType())) {
+				try {
+					pubmedParser.getPubmedArticleById(Integer.valueOf(miriamData.getResource()));
+				} catch (NumberFormatException | PubmedSearchException e) {
+					throw new AnnotatorException(e);
+				}
+			}
+		}
+		
+	}
+
+}
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java b/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java
index 7ada8d540a60128a2b971d5fbdf54f7d30ac57ff..94eaaef9c453f396703f1b202b8d475d9a936906 100644
--- a/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/search/db/chemical/ChemicalService.java
@@ -17,12 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.annotation.data.Chemical;
-import lcsb.mapviewer.annotation.data.Target;
-import lcsb.mapviewer.annotation.data.TargettingStructure;
 import lcsb.mapviewer.annotation.services.ChemicalParser;
 import lcsb.mapviewer.annotation.services.ChemicalSearchException;
-import lcsb.mapviewer.annotation.services.PubmedParser;
-import lcsb.mapviewer.annotation.services.PubmedSearchException;
 import lcsb.mapviewer.annotation.services.annotators.AnnotatorException;
 import lcsb.mapviewer.annotation.services.annotators.HgncAnnotator;
 import lcsb.mapviewer.common.IProgressUpdater;
@@ -38,6 +34,7 @@ import lcsb.mapviewer.model.map.species.Rna;
 import lcsb.mapviewer.model.map.statistics.SearchType;
 import lcsb.mapviewer.services.interfaces.ISearchHistoryService;
 import lcsb.mapviewer.services.search.db.DbSearchCriteria;
+import lcsb.mapviewer.services.search.db.DbSearchService;
 
 /**
  * Implementation of the service that allows access information about chemicals.
@@ -46,7 +43,7 @@ import lcsb.mapviewer.services.search.db.DbSearchCriteria;
  * 
  */
 @Transactional(value = "txManager")
-public class ChemicalService implements IChemicalService {
+public class ChemicalService extends DbSearchService implements IChemicalService {
 
 	/**
 	 * Default class logger.
@@ -70,13 +67,6 @@ public class ChemicalService implements IChemicalService {
 	@Autowired
 	private HgncAnnotator														 hgncAnnotator;
 
-	/**
-	 * Service accessing
-	 * <a href="http://europepmc.org/RestfulWebService">pubmed</a>.
-	 */
-	@Autowired
-	private PubmedParser														 pubmedParser;
-
 	/**
 	 * Service that manages search history.
 	 */
@@ -323,25 +313,4 @@ public class ChemicalService implements IChemicalService {
 		}
 	}
 
-	private void cacheMiriamData(TargettingStructure targettingStructure) throws AnnotatorException {
-		Set<MiriamData> result = new HashSet<>();
-		result.addAll(targettingStructure.getSources());
-		for (Target target : targettingStructure.getTargets()) {
-			result.addAll(target.getGenes());
-			result.addAll(target.getReferences());
-
-		}
-		
-		for (MiriamData miriamData : result) {
-			if (miriamData.getDataType().equals(MiriamType.PUBMED)) {
-				try {
-					pubmedParser.getPubmedArticleById(Integer.valueOf(miriamData.getResource()));
-				} catch (NumberFormatException | PubmedSearchException e) {
-					throw new AnnotatorException(e);
-				}
-			}
-		}
-		
-	}
-
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/drug/DrugService.java b/service/src/main/java/lcsb/mapviewer/services/search/db/drug/DrugService.java
index 584dfa0811af34460401f681e91418800cd9bf05..c220c2a4c102b82ea351dadb4c272f68aaad35e0 100644
--- a/service/src/main/java/lcsb/mapviewer/services/search/db/drug/DrugService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/search/db/drug/DrugService.java
@@ -13,12 +13,9 @@ import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.annotation.data.Drug;
 import lcsb.mapviewer.annotation.data.Target;
-import lcsb.mapviewer.annotation.data.TargettingStructure;
 import lcsb.mapviewer.annotation.services.ChEMBLParser;
 import lcsb.mapviewer.annotation.services.DrugSearchException;
 import lcsb.mapviewer.annotation.services.DrugbankHTMLParser;
-import lcsb.mapviewer.annotation.services.PubmedParser;
-import lcsb.mapviewer.annotation.services.PubmedSearchException;
 import lcsb.mapviewer.annotation.services.annotators.AnnotatorException;
 import lcsb.mapviewer.annotation.services.annotators.HgncAnnotator;
 import lcsb.mapviewer.common.IProgressUpdater;
@@ -33,6 +30,7 @@ import lcsb.mapviewer.model.map.species.Rna;
 import lcsb.mapviewer.model.map.statistics.SearchType;
 import lcsb.mapviewer.services.interfaces.ISearchHistoryService;
 import lcsb.mapviewer.services.search.db.DbSearchCriteria;
+import lcsb.mapviewer.services.search.db.DbSearchService;
 
 /**
  * Implementation of the service that allows access information about drugs.
@@ -41,7 +39,7 @@ import lcsb.mapviewer.services.search.db.DbSearchCriteria;
  * 
  */
 @Transactional(value = "txManager")
-public class DrugService implements IDrugService {
+public class DrugService extends DbSearchService implements IDrugService {
 
 	/**
 	 * Default class logger.
@@ -67,13 +65,6 @@ public class DrugService implements IDrugService {
 	@Autowired
 	private HgncAnnotator					hgncAnnotator;
 
-	/**
-	 * Service accessing
-	 * <a href="http://europepmc.org/RestfulWebService">pubmed</a>.
-	 */
-	@Autowired
-	private PubmedParser					pubmedParser;
-
 	/**
 	 * Service that manages search history.
 	 */
@@ -348,23 +339,6 @@ public class DrugService implements IDrugService {
 		this.searchHistoryService = searchHistoryService;
 	}
 
-	/**
-	 * @return the pubmedParser
-	 * @see #pubmedParser
-	 */
-	public PubmedParser getPubmedParser() {
-		return pubmedParser;
-	}
-
-	/**
-	 * @param pubmedParser
-	 *          the pubmedParser to set
-	 * @see #pubmedParser
-	 */
-	public void setPubmedParser(PubmedParser pubmedParser) {
-		this.pubmedParser = pubmedParser;
-	}
-
 	@Override
 	public void cacheDataForModel(Model originalModel, IProgressUpdater iProgressUpdater) {
 		logger.debug("Caching drug queries...");
@@ -410,26 +384,4 @@ public class DrugService implements IDrugService {
 			}
 		}
 	}
-
-	private void cacheMiriamData(TargettingStructure targettingStructure) throws AnnotatorException {
-		Set<MiriamData> result = new HashSet<>();
-		result.addAll(targettingStructure.getSources());
-		for (Target target : targettingStructure.getTargets()) {
-			result.addAll(target.getGenes());
-			result.addAll(target.getReferences());
-
-		}
-
-		for (MiriamData miriamData : result) {
-			if (miriamData.getDataType().equals(MiriamType.PUBMED)) {
-				try {
-					pubmedParser.getPubmedArticleById(Integer.valueOf(miriamData.getResource()));
-				} catch (NumberFormatException | PubmedSearchException e) {
-					throw new AnnotatorException(e);
-				}
-			}
-		}
-
-	}
-
 }
diff --git a/service/src/main/java/lcsb/mapviewer/services/search/db/mirna/MiRNAService.java b/service/src/main/java/lcsb/mapviewer/services/search/db/mirna/MiRNAService.java
index 57ccbb24e684aa05fd347e39cc442cfdd3125d8a..136a1022424a2a323b18978ef40fa64aca9b8645 100644
--- a/service/src/main/java/lcsb/mapviewer/services/search/db/mirna/MiRNAService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/search/db/mirna/MiRNAService.java
@@ -15,11 +15,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import lcsb.mapviewer.annotation.data.MiRNA;
 import lcsb.mapviewer.annotation.data.Target;
-import lcsb.mapviewer.annotation.data.TargettingStructure;
 import lcsb.mapviewer.annotation.services.MiRNAParser;
 import lcsb.mapviewer.annotation.services.MiRNASearchException;
-import lcsb.mapviewer.annotation.services.PubmedParser;
-import lcsb.mapviewer.annotation.services.PubmedSearchException;
 import lcsb.mapviewer.annotation.services.annotators.AnnotatorException;
 import lcsb.mapviewer.annotation.services.annotators.HgncAnnotator;
 import lcsb.mapviewer.common.IProgressUpdater;
@@ -34,6 +31,7 @@ import lcsb.mapviewer.model.map.species.Rna;
 import lcsb.mapviewer.model.map.statistics.SearchType;
 import lcsb.mapviewer.services.interfaces.ISearchHistoryService;
 import lcsb.mapviewer.services.search.db.DbSearchCriteria;
+import lcsb.mapviewer.services.search.db.DbSearchService;
 
 /**
  * Implementation of the service that allows access information about che.
@@ -42,7 +40,7 @@ import lcsb.mapviewer.services.search.db.DbSearchCriteria;
  * 
  */
 @Transactional(value = "txManager")
-public class MiRNAService implements IMiRNAService {
+public class MiRNAService extends DbSearchService implements IMiRNAService {
 
 	/**
 	 * Default class logger.
@@ -68,13 +66,6 @@ public class MiRNAService implements IMiRNAService {
 	@Autowired
 	private ISearchHistoryService	searchHistoryService;
 
-	/**
-	 * Service accessing
-	 * <a href="http://europepmc.org/RestfulWebService">pubmed</a>.
-	 */
-	@Autowired
-	private PubmedParser					pubmedParser;
-
 	/**
 	 * Default constructor.
 	 */
@@ -243,25 +234,4 @@ public class MiRNAService implements IMiRNAService {
 		}
 	}
 
-	private void cacheMiriamData(TargettingStructure targettingStructure) throws AnnotatorException {
-		Set<MiriamData> result = new HashSet<>();
-		result.addAll(targettingStructure.getSources());
-		for (Target target : targettingStructure.getTargets()) {
-			result.addAll(target.getGenes());
-			result.addAll(target.getReferences());
-
-		}
-
-		for (MiriamData miriamData : result) {
-			if (miriamData.getDataType().equals(MiriamType.PUBMED)) {
-				try {
-					pubmedParser.getPubmedArticleById(Integer.valueOf(miriamData.getResource()));
-				} catch (NumberFormatException | PubmedSearchException e) {
-					throw new AnnotatorException(e);
-				}
-			}
-		}
-
-	}
-
 }