Index: modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/VocabularyRetriever.java
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/VocabularyRetriever.java	(revision 56034)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/VocabularyRetriever.java	(revision 56035)
@@ -1,9 +1,15 @@
 package eu.dnetlib.vocabularies.publisher;
 
+import java.io.StringReader;
 import java.util.List;
 
+import eu.dnetlib.vocabularies.publisher.model.Synonym;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 
@@ -31,7 +37,7 @@
 
 	@Cacheable(value = "terms", key = "#id")
 	public Vocabulary getVocabulary(final String id) throws VocabularyNotFoundException {
-		log.debug("getVocabulary(): not using cache");
+		log.warn(String.format("getVocabulary(%s): not using cache", id));
 		// get the vocabulary info:
 		String queryVoc = "let $x := /*[.//RESOURCE_IDENTIFIER/@value='"
 				+ id
@@ -45,7 +51,7 @@
 
 	@Cacheable(value = "termsByCode", key = "#code")
 	public Vocabulary getVocabularyByCode(final String code) throws VocabularyNotFoundException {
-		log.debug("getVocabularyByCode(): not using cache");
+		log.warn(String.format("getVocabularyByCode(%s): not using cache", code));
 		String queryVoc = "let $x := //RESOURCE_PROFILE[.//VOCABULARY_NAME/@code='"
 				+ code
 				+ "']"
@@ -55,6 +61,25 @@
 		else return voc;
 	}
 
+	@Cacheable(value = "synonymsByCode", key = "#termCode")
+	public VocabularyTerm getTermSynonyms(final String vocabularyCode, final String termCode) throws VocabularyNotFoundException {
+		log.warn(String.format("getTermSynonyms(%s, %s): not using cache", vocabularyCode, termCode));
+		final Vocabulary voc = getVocabularyByCode(vocabularyCode);
+
+		final VocabularyTerm vt = voc.getTerms().stream()
+				.filter(t -> t.getCode().equalsIgnoreCase(termCode))
+				.findFirst()
+				.get();
+
+		String querySynonyms =
+				String.format("for $x in /*[.//RESOURCE_IDENTIFIER/@value='%s']//TERM[./@code = '%s']//SYNONYM " +
+						"return concat ($x/@term,':-:',$x/@encoding)", voc.getId(), termCode);
+
+		vt.setSynonyms(Lists.newArrayList(queryExecutor.query(Synonym.class, querySynonyms)));
+
+		return vt;
+	}
+
 	private Vocabulary getVocabularyByQuery(final String query) {
 		Iterable<Vocabulary> vocs = this.queryExecutor.query(Vocabulary.class, query);
 		if (vocs.iterator().hasNext()) {
@@ -69,4 +94,49 @@
 		} else return null;
 	}
 
+
+	/*
+	private Vocabulary getTermByQuery(final String query) throws DocumentException {
+		Iterable<Vocabulary> vocs = this.queryExecutor.query(Vocabulary.class, query);
+		if (vocs.iterator().hasNext()) {
+			Vocabulary vocabulary = vocs.iterator().next();
+			if (vocabulary.getId() == null) return null;
+			// now the terms
+			String queryTerms = String.format(
+					"for $x in collection('/db/DRIVER/VocabularyDSResources/VocabularyDSResourceType') \n" +
+							"where $x[./RESOURCE_PROFILE/HEADER/RESOURCE_IDENTIFIER/@value/string() = '%s']\n" +
+							"return $x/RESOURCE_PROFILE/BODY/CONFIGURATION", vocabulary.getId());
+
+			List<String> vocabProfiles = queryExecutor.performQuery(queryTerms);
+			if (vocabProfiles != null && vocabProfiles.size() == 1) {
+				final String termsXml = vocabProfiles.get(0);
+				log.debug("got terms: " + termsXml);
+
+				final Document doc = new SAXReader().read(new StringReader(termsXml));
+
+				final List<VocabularyTerm> terms = Lists.newArrayList();
+				for(Object t : doc.selectNodes("//TERM")) {
+					final Element term = (Element) t;
+					final List<Synonym> synonyms = Lists.newArrayList();
+					for(Object s : term.selectNodes("//SYNONYM")) {
+						Element syn = (Element) s;
+						synonyms.add(new Synonym(syn.valueOf("./@term"), syn.valueOf("./@encoding")));
+					}
+					terms.add(new VocabularyTerm(
+							term.valueOf("./@english_name"),
+							term.valueOf("./@native_name"),
+							term.valueOf("./@encoding"),
+							term.valueOf("./@code"),
+							synonyms));
+				}
+				vocabulary.setTerms(terms);
+				return vocabulary;
+			} else {
+				throw new IllegalStateException(String.format("found more than one Vocabulary with id '%s'", vocabulary.getId()));
+			}
+
+		} else return null;
+	}
+	*/
+
 }
Index: modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/model/VocabularyTerm.java
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/model/VocabularyTerm.java	(revision 56034)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/model/VocabularyTerm.java	(revision 56035)
@@ -1,6 +1,7 @@
 package eu.dnetlib.vocabularies.publisher.model;
 
 import java.io.Serializable;
+import java.util.List;
 
 public class VocabularyTerm implements Serializable {
 
@@ -9,6 +10,7 @@
 	private String nativeName;
 	private String encoding;
 	private String code;
+	private List<Synonym> synonyms;
 
 	public String getEnglishName() {
 		return englishName;
@@ -46,6 +48,14 @@
 		super();
 	}
 
+	public List<Synonym> getSynonyms() {
+		return synonyms;
+	}
+
+	public void setSynonyms(List<Synonym> synonyms) {
+		this.synonyms = synonyms;
+	}
+
 	/**
 	 * This constructor is used by the SplittedQueryExecutor for the retrieval of terms from the IS when called by Vocabularyretriever.
 	 * 
@@ -64,7 +74,7 @@
 
 	@Override
 	public String toString() {
-		return "VocabularyTerm [englishName=" + englishName + ", nativeName=" + nativeName + ", encoding=" + encoding + ", code=" + code + "]";
+		return "VocabularyTerm [englishName=" + englishName + ", nativeName=" + nativeName + ", encoding=" + encoding + ", code=" + code + ", synonyms=" + synonyms + "]";
 	}
 
 }
Index: modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/model/Synonym.java
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/model/Synonym.java	(nonexistent)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/model/Synonym.java	(revision 56035)
@@ -0,0 +1,36 @@
+package eu.dnetlib.vocabularies.publisher.model;
+
+import java.io.Serializable;
+
+public class Synonym implements Serializable {
+
+    private static final long serialVersionUID = -1661921400669796428L;
+
+    private String term;
+    private String encoding;
+
+    public Synonym() {
+
+    }
+
+    public Synonym(String term, String encoding) {
+        this.term = term;
+        this.encoding = encoding;
+    }
+
+    public String getTerm() {
+        return term;
+    }
+
+    public void setTerm(String term) {
+        this.term = term;
+    }
+
+    public String getEncoding() {
+        return encoding;
+    }
+
+    public void setEncoding(String encoding) {
+        this.encoding = encoding;
+    }
+}
Index: modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/controller/VocabularyPublisherController.java
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/controller/VocabularyPublisherController.java	(revision 56034)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/java/eu/dnetlib/vocabularies/publisher/controller/VocabularyPublisherController.java	(revision 56035)
@@ -7,8 +7,10 @@
 import eu.dnetlib.vocabularies.publisher.VocabularyNotFoundException;
 import eu.dnetlib.vocabularies.publisher.VocabularyRetriever;
 import eu.dnetlib.vocabularies.publisher.model.Vocabulary;
+import eu.dnetlib.vocabularies.publisher.model.VocabularyTerm;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.dom4j.DocumentException;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
@@ -44,6 +46,14 @@
 		return this.vocabularyRetriever.getVocabularyByCode(code);
 	}
 
+	@RequestMapping(value = "/vocabularies/{code}/{term}", method = RequestMethod.GET, produces = { "application/json" })
+	public @ResponseBody
+	VocabularyTerm getTermSynonyms(@PathVariable("code") final String code,
+									 @PathVariable("term") final String term) throws VocabularyNotFoundException {
+		log.debug(String.format("getVocabulary with code = %s, term = %s", code, term));
+		return this.vocabularyRetriever.getTermSynonyms(code, term);
+	}
+
 	// View-based methods for html responses
 	@RequestMapping(value = "/vocabularies", method = RequestMethod.GET, produces = { "text/html" })
 	public void listVocabularies(final ModelMap map) {
@@ -61,4 +71,18 @@
 		return "displayVocabulary";
 	}
 
+	@RequestMapping(value = "/vocabularies/{code}/{term}", method = RequestMethod.GET, produces = { "text/html" })
+	public String getTermSynonyms(
+			@PathVariable("code") final String code,
+			@PathVariable("term") final String term,
+			final ModelMap map) throws VocabularyNotFoundException {
+		log.debug(String.format("getVocabulary with code = %s, term = %s", code, term));
+
+		map.addAttribute("vocabulary", getVocabulary(code));
+		map.addAttribute("term", getTermSynonyms(code, term));
+		map.addAttribute("baseURL", baseURL);
+		map.addAttribute("context", context);
+		return "displaySynonyms";
+	}
+
 }
Index: modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/publisher/cache/ehcache.xml
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/publisher/cache/ehcache.xml	(revision 56034)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/publisher/cache/ehcache.xml	(revision 56035)
@@ -37,5 +37,8 @@
 	<cache name="termsByCode" maxElementsInMemory="300" eternal="false"
 		timeToIdleSeconds="1800" timeToLiveSeconds="1800" overflowToDisk="false" />
 
+	<cache name="synonymsByCode" maxElementsInMemory="1500" eternal="false"
+		   timeToIdleSeconds="1800" timeToLiveSeconds="1800" overflowToDisk="false" />
+
 </ehcache>
 
Index: modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/views/displayVocabulary.st
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/views/displayVocabulary.st	(revision 56034)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/views/displayVocabulary.st	(revision 56035)
@@ -14,7 +14,9 @@
 			</thead>
 			<tbody>
 			$vocabulary.terms:{ term | 
-				<tr><td>$term.englishName$</td><td>$term.code$</td></tr>
+				<tr>
+				    <td>$term.englishName$</td><td><a class="btn btn-link" href="$baseURL$/$vocabulary.code$/$term.code$" role="button">$term.code$</a></td>
+				</tr>
 			}$
 			</tbody>
 		</table>
Index: modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/views/displaySynonyms.st
===================================================================
--- modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/views/displaySynonyms.st	(nonexistent)
+++ modules/dnet-vocabulary-publisher/trunk/src/main/resources/eu/dnetlib/vocabularies/views/displaySynonyms.st	(revision 56035)
@@ -0,0 +1,26 @@
+$master( title={$vocabulary.name$},
+navbars={
+	<a class="navbar-brand" href="$baseURL$/$vocabulary.code$">$vocabulary.name$/$term.englishName$/$term.code$ </a>
+	},
+	content = {
+	<div><h4>Term: $term.englishName$</h4></div>
+	<div><h4>Code: $term.code$</h4></div>
+
+		<hr>
+		<div class="table-responsive">
+		<table class="table table-condensed">
+    		<thead>
+				<tr><th>Synonym</th><th>Encoding</th></tr>
+			</thead>
+			<tbody>
+			$term.synonyms:{ syn |
+				<tr>
+				    <td>$syn.term$</td><td>$syn.encoding$</td>
+				</tr>
+			}$
+			</tbody>
+		</table>
+		</div>
+ 		<hr>
+	})$
+
