diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java
index 738c7c320fa36f243bce05b94d48798d8641863a..f4de25d36f87f08e71355b932978b6c871fcd1be 100644
--- a/mozen/src/main/java/mozen/business/IModelManager.java
+++ b/mozen/src/main/java/mozen/business/IModelManager.java
@@ -7,6 +7,7 @@ import org.springframework.web.multipart.MultipartFile;
 import mozen.messages.ModelMessage;
 import mozen.messages.TagMessage;
 import mozen.model.Model;
+import mozen.messages.SearchResult;
 import mozen.model.TagCategory;
 import mozen.model.User;
 
@@ -23,5 +24,7 @@ public interface IModelManager {
 
   Model getModel(long id);
   Collection<TagCategory> getTags();
-  Collection<Model> findModel(String name);
+  SearchResult findModel(String name, int page, int size, String sort);
+
+  SearchResult findModelWithTags(String name, int page, int size, String sort, Collection<String> tags);
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/ModelManager.java b/mozen/src/main/java/mozen/business/ModelManager.java
index 6d68263cf9a2915feba58f87c25466e9ad35867f..718f383d435aea15b42c2f7058225be004355f5a 100644
--- a/mozen/src/main/java/mozen/business/ModelManager.java
+++ b/mozen/src/main/java/mozen/business/ModelManager.java
@@ -1,12 +1,15 @@
 package mozen.business;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -14,13 +17,14 @@ import mozen.messages.ModelMessage;
 import mozen.messages.TagMessage;
 import mozen.model.CustomLayer;
 import mozen.model.Model;
+import mozen.messages.SearchResult;
 import mozen.model.Tag;
 import mozen.model.TagCategory;
 import mozen.model.User;
 
 @Service
 public class ModelManager implements IModelManager {
-  
+
   @Autowired
   private ModelRepository modelRepo;
 
@@ -111,31 +115,27 @@ public class ModelManager implements IModelManager {
   }
 
   @Override
-  public Collection<Model> findModel(String name) {
-    Collection<Model> result = modelRepo.findByName(name);
-
+  public SearchResult findModel(String name, int page, int size, String sort) {
+    System.err.println("[MODEL MANAGER] search n:"+name+" p:"+page+" si:"+size+" so:"+sort);
+    Pageable paging = PageRequest.of(page-1, size, Sort.by(sort));
+    Page<Model> resultPage = modelRepo.findByNameContainingIgnoreCase(name, paging);
+
+    System.err.println("[MODEL MANAGER] search result "+resultPage.getTotalElements());
+
+    SearchResult result = new SearchResult();
+    if (resultPage.hasContent()) {
+      result.setTotalResult((int) resultPage.getTotalElements());
+      result.setTotalPage((int) resultPage.getTotalPages());
+      result.setPage(resultPage.getNumber()+1);
+      result.setModels(resultPage.getContent());
+    } else {
+      result.setPage(0);
+      result.setTotalResult(0);
+      result.setTotalPage(0);
+    }
     return result;
   }
 
-  @Override
-  public Collection<TagCategory> getTags() {
-    Collection<TagCategory> categories = new ArrayList<TagCategory>();
-    tagCategoryRepo.findAll().forEach(categories::add);
-    return categories;
-  }
-
-  @Override
-  public void removeLayer(long id, User user) throws Exception {
-    CustomLayer layer = layerRepo.findById(id).get();
-
-    if (layer == null)
-      throw new Exception("Unknown layer");
-    if (!isLayerAuthor(layer, user))
-      throw new Exception("Not the author");
-
-    layerRepo.deleteById(id);
-  }
-
   @Override
   public void addLayerFile(MultipartFile file, long modelId, String name, User user) throws Exception {
     Model model = modelRepo.findById(modelId).get();
@@ -155,12 +155,16 @@ public class ModelManager implements IModelManager {
     modelRepo.save(model);
   }
 
-  private boolean isLayerAuthor(CustomLayer layer, User user) {
-    return layer.getModel().getAuthor() == user;
-  }
+  @Override
+  public void removeLayer(long id, User user) throws Exception {
+    CustomLayer layer = layerRepo.findById(id).get();
 
-  private boolean isModelAuthor(Model model, User user) {
-    return model.getAuthor() == user;
+    if (layer == null)
+      throw new Exception("Unknown layer");
+    if (!isLayerAuthor(layer, user))
+      throw new Exception("Not the author");
+
+    layerRepo.deleteById(id);
   }
 
   @Override
@@ -176,4 +180,42 @@ public class ModelManager implements IModelManager {
     tagRepo.save(tag);
   }
 
+  @Override
+  public Collection<TagCategory> getTags() {
+    // Collection<TagCategory> categories = new ArrayList<TagCategory>();
+    // tagCategoryRepo.findAll().forEach(categories::add);
+    return tagCategoryRepo.findAll();
+  }
+
+  private boolean isLayerAuthor(CustomLayer layer, User user) {
+    return layer.getModel().getAuthor() == user;
+  }
+
+  private boolean isModelAuthor(Model model, User user) {
+    return model.getAuthor() == user;
+  }
+
+  @Override
+  public SearchResult findModelWithTags(String name, int page, int size, String sort, Collection<String> tagsName) {
+    System.err.println("[MODEL MANAGER] search with tags n:"+name+" p:"+page+" si:"+size+" so:"+sort+" t:"+tagsName);
+    Pageable paging = PageRequest.of(page-1, size, Sort.by(sort));
+    Collection<Tag> tags = tagRepo.findByNameIn(tagsName);
+    Page<Model> resultPage = modelRepo.findByNameContainingIgnoreCaseAndTagsIn(name, tags, paging);
+
+    System.err.println("[MODEL MANAGER] search result "+resultPage.getTotalElements());
+
+    SearchResult result = new SearchResult();
+    if (resultPage.hasContent()) {
+      result.setTotalResult((int) resultPage.getTotalElements());
+      result.setTotalPage((int) resultPage.getTotalPages());
+      result.setPage(resultPage.getNumber()+1);
+      result.setModels(resultPage.getContent());
+    } else {
+      result.setPage(0);
+      result.setTotalResult(0);
+      result.setTotalPage(0);
+    }
+    return result;
+  }
+
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/ModelRepository.java b/mozen/src/main/java/mozen/business/ModelRepository.java
index ec6ef5295acdc9abb22b3134bb92a243784efdbe..18120e02b03d1c6e3dc2abeb978fa870665d881b 100644
--- a/mozen/src/main/java/mozen/business/ModelRepository.java
+++ b/mozen/src/main/java/mozen/business/ModelRepository.java
@@ -1,11 +1,19 @@
 package mozen.business;
 
-import java.util.List;
+import java.util.Collection;
 
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
 import mozen.model.Model;
+import mozen.model.Tag;
 
 public interface ModelRepository extends PagingAndSortingRepository<Model, Long> {
-  List<Model> findByName(String name);
+  Page<Model> findByNameContainingIgnoreCase(String name, Pageable pageable);
+
+  Page<Model> findByNameContainingIgnoreCaseAndTagsIn(String name, Collection<Tag> tags, Pageable pageable);
+
+  // @Query("SELECT m FROM Model m WHERE m.name LIKE :name AND m.tags CONTAINS (SELECT t FROM Tag WHERE t.name IN :tags)") <- horrible et c'est même pas complet
+  // Page<Model> findByNameContainingIgnoreCaseTags(@Param("name") String name, @Param("tags") Collection<String> tags, Pageable pageable);
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/TagCategoryRepository.java b/mozen/src/main/java/mozen/business/TagCategoryRepository.java
index 9d36c4e563620cd50bac8a4ffdb0579bc7dc4c6f..dcf49ea02dad1bd72d9573973cf53cc4703cc6af 100644
--- a/mozen/src/main/java/mozen/business/TagCategoryRepository.java
+++ b/mozen/src/main/java/mozen/business/TagCategoryRepository.java
@@ -1,9 +1,11 @@
 package mozen.business;
 
+import java.util.List;
+
 import org.springframework.data.repository.CrudRepository;
 
 import mozen.model.TagCategory;
 
 public interface TagCategoryRepository extends CrudRepository<TagCategory, Long>{
-  
+  List<TagCategory> findAll();
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/business/TagRepository.java b/mozen/src/main/java/mozen/business/TagRepository.java
index 5fa98e360f7634ebdcfcbc750dece13db5dc5ad6..219a5797e2deaae9a8fed42c45b3a32e87a3975c 100644
--- a/mozen/src/main/java/mozen/business/TagRepository.java
+++ b/mozen/src/main/java/mozen/business/TagRepository.java
@@ -1,5 +1,6 @@
 package mozen.business;
 
+import java.util.Collection;
 import java.util.List;
 
 import org.springframework.data.repository.CrudRepository;
@@ -7,5 +8,6 @@ import org.springframework.data.repository.CrudRepository;
 import mozen.model.Tag;
 
 public interface TagRepository extends CrudRepository<Tag, Long>{
-  List<Tag> findByName(String name);  
+  List<Tag> findByName(String name);
+  List<Tag> findByNameIn(Collection<String> name);
 }
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/model/SearchResult.java b/mozen/src/main/java/mozen/messages/SearchResult.java
similarity index 51%
rename from mozen/src/main/java/mozen/model/SearchResult.java
rename to mozen/src/main/java/mozen/messages/SearchResult.java
index d8c81f519325d8eb8346f73830dcee891abc44a4..cd67bb010d2e2e85f68905992a7278c97ed93465 100644
--- a/mozen/src/main/java/mozen/model/SearchResult.java
+++ b/mozen/src/main/java/mozen/messages/SearchResult.java
@@ -1,33 +1,28 @@
-package mozen.model;
+package mozen.messages;
 
 import java.io.Serializable;
 import java.util.Collection;
 
+import mozen.model.Model;
+
 public class SearchResult implements Serializable {
   private static final long serialVersionUID = 1L;
 
-  private int total;
   private int page;
+  private int totalResult;
+  private int totalPage;
   private Collection<Model> models;
 
-
   public SearchResult() {
   }
 
-  public SearchResult(int total, int page, Collection<Model> models) {
-    this.total = total;
+  public SearchResult(int page, int totalResult, int totalPage, Collection<Model> models) {
     this.page = page;
+    this.totalResult = totalResult;
+    this.totalPage = totalPage;
     this.models = models;
   }
 
-  public int getTotal() {
-    return this.total;
-  }
-
-  public void setTotal(int total) {
-    this.total = total;
-  }
-
   public int getPage() {
     return this.page;
   }
@@ -36,6 +31,22 @@ public class SearchResult implements Serializable {
     this.page = page;
   }
 
+  public int getTotalResult() {
+    return this.totalResult;
+  }
+
+  public void setTotalResult(int totalResult) {
+    this.totalResult = totalResult;
+  }
+
+  public int getTotalPage() {
+    return this.totalPage;
+  }
+
+  public void setTotalPage(int totalPage) {
+    this.totalPage = totalPage;
+  }
+
   public Collection<Model> getModels() {
     return this.models;
   }
diff --git a/mozen/src/main/java/mozen/web/AdminController.java b/mozen/src/main/java/mozen/web/AdminController.java
new file mode 100644
index 0000000000000000000000000000000000000000..8136b1c98851c20d6fcb4ac6a7927a3d2149e320
--- /dev/null
+++ b/mozen/src/main/java/mozen/web/AdminController.java
@@ -0,0 +1,20 @@
+package mozen.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import mozen.business.IModelManager;
+import mozen.business.IUserManager;
+
+@RestController
+@RequestMapping("/admin")
+@CrossOrigin
+public class AdminController {
+  @Autowired
+  IModelManager modelManager;
+
+  @Autowired
+  IUserManager userManager;
+}
\ No newline at end of file
diff --git a/mozen/src/main/java/mozen/web/SearchController.java b/mozen/src/main/java/mozen/web/SearchController.java
index 1a8db21145582e34151439ba95d9aaa1ee10f6c3..49ccb20f4c6d8d11467795ecb25c44ba60eb1850 100644
--- a/mozen/src/main/java/mozen/web/SearchController.java
+++ b/mozen/src/main/java/mozen/web/SearchController.java
@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import mozen.business.IModelManager;
-import mozen.model.SearchResult;
+import mozen.messages.SearchResult;
 
 @RestController
 @RequestMapping("/search")
@@ -21,18 +21,19 @@ public class SearchController {
   
   @GetMapping("")
   public SearchResult search(
-      @RequestParam(value = "name", required = false) String name,
-      @RequestParam(value = "tag", required = false) Collection<String> tag,
+      @RequestParam(value = "name", required = false, defaultValue = "") String name,
+      @RequestParam(value = "tags", required = false) Collection<String> tags,
       @RequestParam(value = "param", required = false) Integer param,
       @RequestParam(value = "size", required = true) Integer size,
       @RequestParam(value = "page", required = true) Integer page,
-      @RequestParam(value = "sort", required = false) String sort
+      @RequestParam(value = "sort", required = false, defaultValue = "votes") String sort
     ) 
   {
-    SearchResult result = new SearchResult();
-    result.setModels(modelManager.findModel(name));
-    result.setTotal(result.getModels().size());
-    result.setPage(page);
+    SearchResult result;
+
+    if (tags.isEmpty()) result = modelManager.findModel(name, page, size, sort);
+    else result = modelManager.findModelWithTags(name, page, size, sort, tags);
+   
     return result;
   }
 }
\ No newline at end of file