diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
index 56071ddde9682e481a222acbb34b1021b3363bad..ac78d8b8d3665ee9c2839b91150ed323cc98d978 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/BaseRestImpl.java
@@ -26,6 +26,7 @@ import lcsb.mapviewer.model.map.reaction.Reaction;
 import lcsb.mapviewer.model.map.species.Element;
 import lcsb.mapviewer.services.SecurityException;
 import lcsb.mapviewer.services.interfaces.IModelService;
+import lcsb.mapviewer.services.interfaces.IProjectService;
 import lcsb.mapviewer.services.interfaces.IUserService;
 import lcsb.mapviewer.services.search.ElementMatcher;
 import lcsb.mapviewer.services.search.data.ElementIdentifier.ElementIdentifierType;
@@ -33,7 +34,7 @@ import lcsb.mapviewer.services.view.AnnotationView;
 
 @Transactional(value = "txManager")
 public abstract class BaseRestImpl {
-	
+
 	/**
 	 * Default class logger.
 	 */
@@ -42,6 +43,9 @@ public abstract class BaseRestImpl {
 	@Autowired
 	private IModelService		modelService;
 
+	@Autowired
+	private IProjectService	projectService;
+
 	@Autowired
 	private IUserService		userService;
 
@@ -262,4 +266,20 @@ public abstract class BaseRestImpl {
 		}
 	}
 
+	/**
+	 * @return the projectService
+	 * @see #projectService
+	 */
+	public IProjectService getProjectService() {
+		return projectService;
+	}
+
+	/**
+	 * @param projectService the projectService to set
+	 * @see #projectService
+	 */
+	public void setProjectService(IProjectService projectService) {
+		this.projectService = projectService;
+	}
+
 }
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java
index 8b4e0560e0a125cd69f1b7e2cb29b18c2378e795..58365826a5a547972bb6fe8a927ff2aa6c017c76 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectMetaData.java
@@ -47,10 +47,6 @@ public class ProjectMetaData implements Serializable {
 	 */
 	private String									description;
 
-	private ModelMetaData						map;
-
-	private Integer									publicationCount;
-
 	/**
 	 * List of overview images attached to this model.
 	 */
@@ -169,23 +165,6 @@ public class ProjectMetaData implements Serializable {
 		this.projectId = projectId;
 	}
 
-	/**
-	 * @return the map
-	 * @see #map
-	 */
-	public ModelMetaData getMap() {
-		return map;
-	}
-
-	/**
-	 * @param map
-	 *          the map to set
-	 * @see #map
-	 */
-	public void setMap(ModelMetaData map) {
-		this.map = map;
-	}
-
 	/**
 	 * @return the idObject
 	 * @see #idObject
@@ -236,22 +215,4 @@ public class ProjectMetaData implements Serializable {
 	public void setOrganism(Map<String, Object> organism) {
 		this.organism = organism;
 	}
-
-	/**
-	 * @return the publicationCount
-	 * @see #publicationCount
-	 */
-	public Integer getPublicationCount() {
-		return publicationCount;
-	}
-
-	/**
-	 * @param publicationCount
-	 *          the publicationCount to set
-	 * @see #publicationCount
-	 */
-	public void setPublicationCount(Integer publicationCount) {
-		this.publicationCount = publicationCount;
-	}
-
 }
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
index a64ef7f781d081252867ed3badc89b2f645c2a27..6f4f9a1d17c8a19eb9d1a9963ea161389d02424a 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
@@ -129,7 +129,7 @@ public class ProjectRestImpl extends BaseRestImpl {
 			result.setVersion(model.getMapVersion());
 			result.setDescription(model.getNotes());
 
-			Set<OverviewImage> set = new HashSet<OverviewImage>();
+			Set<OverviewImage> set = new HashSet<>();
 			set.addAll(model.getOverviewImages());
 			for (OverviewImage image : model.getOverviewImages()) {
 				for (OverviewLink ol : image.getLinks()) {
@@ -144,13 +144,6 @@ public class ProjectRestImpl extends BaseRestImpl {
 				logger.warn("Cannot determine top level image. Taking first one. " + model.getOverviewImages().get(0).getFilename());
 				result.setTopOverviewImage(factory.create(model.getOverviewImages().get(0)));
 			}
-			result.setMap(new ModelMetaData(model));
-
-			List<Model> models = new ArrayList<>();
-			models.add(model);
-			models.addAll(model.getSubmodels());
-			result.setPublicationCount(publicationsRestImpl.getPublications(models).size());
-
 		}
 
 		return result;
@@ -434,6 +427,8 @@ public class ProjectRestImpl extends BaseRestImpl {
 		}
 
 		result.put("reactionAnnotations", reactionAnnotations);
+		
+		result.put("publications", publicationsRestImpl.getPublications(models).size());
 
 		return result;
 	}
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
new file mode 100644
index 0000000000000000000000000000000000000000..26d0fb353bce38f7205b4181b194c8ee3555fc47
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelController.java
@@ -0,0 +1,40 @@
+package lcsb.mapviewer.api.projects.models;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.CookieValue;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import lcsb.mapviewer.api.BaseController;
+import lcsb.mapviewer.api.ObjectNotFoundException;
+import lcsb.mapviewer.common.Configuration;
+import lcsb.mapviewer.services.SecurityException;
+
+@RestController
+public class ModelController extends BaseController {
+	@Autowired
+	private ModelRestImpl modelController;
+
+	@RequestMapping(value = "/projects/{projectId:.+}/models/", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+	public List<ModelMetaData> getModels(//
+			@PathVariable(value = "projectId") String projectId, //
+			@CookieValue(value = Configuration.AUTH_TOKEN) String token //
+	) throws SecurityException, ObjectNotFoundException {
+		return modelController.getModels(projectId, token);
+	}
+
+	@RequestMapping(value = "/projects/{projectId:.+}/models/{modelId:.+}", method = { RequestMethod.GET }, produces = { MediaType.APPLICATION_JSON_VALUE })
+	public ModelMetaData getModel(//
+			@PathVariable(value = "modelId") String modelId, //
+			@PathVariable(value = "projectId") String projectId, //
+			@CookieValue(value = Configuration.AUTH_TOKEN) String token //
+	) throws SecurityException, ObjectNotFoundException {
+		return modelController.getModel(projectId, modelId, token);
+	}
+
+}
\ No newline at end of file
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ModelMetaData.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelMetaData.java
similarity index 94%
rename from rest-api/src/main/java/lcsb/mapviewer/api/projects/ModelMetaData.java
rename to rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelMetaData.java
index 273364a57e42d047251b7e1cf358cce2bcb69a54..62181d0b379a22f618a5cb6fa1d51622a282704e 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ModelMetaData.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelMetaData.java
@@ -1,4 +1,4 @@
-package lcsb.mapviewer.api.projects;
+package lcsb.mapviewer.api.projects.models;
 
 import java.awt.geom.Point2D;
 import java.io.Serializable;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2a747e9973f376d5fb3dd2c05c4f6796c3d3045
--- /dev/null
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java
@@ -0,0 +1,58 @@
+package lcsb.mapviewer.api.projects.models;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.springframework.transaction.annotation.Transactional;
+
+import lcsb.mapviewer.api.BaseRestImpl;
+import lcsb.mapviewer.api.ObjectNotFoundException;
+import lcsb.mapviewer.model.Project;
+import lcsb.mapviewer.model.map.model.Model;
+import lcsb.mapviewer.services.SecurityException;
+import lcsb.mapviewer.services.view.AuthenticationToken;
+
+@Transactional(value = "txManager")
+public class ModelRestImpl extends BaseRestImpl {
+
+	/**
+	 * Default class logger.
+	 */
+	@SuppressWarnings("unused")
+	private Logger logger = Logger.getLogger(ModelRestImpl.class);
+
+	public List<ModelMetaData> getModels(String projectId, String token) throws SecurityException, ObjectNotFoundException {
+		AuthenticationToken authenticationToken = getUserService().getToken(token);
+		Project project = getProjectService().getProjectByProjectId(projectId, authenticationToken);
+		if (project == null) {
+			throw new ObjectNotFoundException("Project with given id doesn't exist");
+		}
+		List<ModelMetaData> result = createData(project, authenticationToken);
+		return result;
+	}
+
+	public ModelMetaData getModel(String projectId, String modelId, String token) throws SecurityException, ObjectNotFoundException {
+		AuthenticationToken authenticationToken = getUserService().getToken(token);
+		Model model = getModelService().getLastModelByProjectId(projectId, authenticationToken);
+		Model submodel = model.getSubmodelById(modelId);
+		if (submodel == null) {
+			return null;
+		} else {
+			return new ModelMetaData(submodel);
+		}
+	}
+
+	private List<ModelMetaData> createData(Project project, AuthenticationToken token) {
+		List<ModelMetaData> result = new ArrayList<>();
+		Model model = getModelService().getLastModelByProjectId(project.getProjectId(), token);
+
+		List<Model> models = new ArrayList<>();
+		models.add(model);
+		models.addAll(model.getSubmodels());
+		for (Model model2 : models) {
+			result.add(new ModelMetaData(model2));
+		}
+		return result;
+	}
+}
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
index ace3974815517e448e1de1e8908cd432a6c0854f..0d3e0349126edced91c82d2ad674c564cbd97505 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/publications/PublicationsRestImpl.java
@@ -1,6 +1,7 @@
 package lcsb.mapviewer.api.projects.models.publications;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -56,7 +57,7 @@ public class PublicationsRestImpl extends BaseRestImpl {
 	@Autowired
 	private OverviewImageViewFactory factory;
 
-	public SortedMap<MiriamData, List<BioEntity>> getPublications(List<Model> models) {
+	public SortedMap<MiriamData, List<BioEntity>> getPublications(Collection<Model> models) {
 		SortedMap<MiriamData, List<BioEntity>> publications = new TreeMap<>();
 		for (Model modelData : models) {
 			for (Element element : modelData.getElements()) {
diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java
index 521d3701fe25873c35726f782374abdef87d39f8..243de1dad24d1043b65385b0ad480c7f711c2be0 100644
--- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java
+++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/ModelMetaDataTest.java
@@ -9,7 +9,7 @@ import org.junit.Test;
 
 import com.google.gson.Gson;
 
-import lcsb.mapviewer.api.projects.ModelMetaData;
+import lcsb.mapviewer.api.projects.models.ModelMetaData;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelFullIndexed;