diff --git a/src/main/java/org/hbp/mip/MIPApplication.java b/src/main/java/org/hbp/mip/MIPApplication.java
index 37c7473f430094dbe024dba5b2928d058df12a5e..2ba48af629a20704c80c688d091fa424c493d15e 100644
--- a/src/main/java/org/hbp/mip/MIPApplication.java
+++ b/src/main/java/org/hbp/mip/MIPApplication.java
@@ -11,9 +11,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiParam;
 import org.apache.log4j.Logger;
 import org.hbp.mip.model.User;
+import org.hbp.mip.repositories.UserRepository;
 import org.hbp.mip.utils.CORSFilter;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Session;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -84,6 +83,9 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
     @Autowired
     OAuth2ClientContext oauth2ClientContext;
 
+    @Autowired
+    UserRepository userRepository;
+
 
     public static void main(String[] args) {
         SpringApplication.run(MIPApplication.class, args);
@@ -107,26 +109,10 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
      * @return
      */
     public synchronized User getUser() {
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
         User user = new User(getUserInfos());
-        try {
-            session.beginTransaction();
-            Boolean agreeNDA = (Boolean) session
-                    .createQuery("SELECT agreeNDA FROM User WHERE username= :username")
-                    .setString("username", user.getUsername())
-                    .uniqueResult();
-            user.setAgreeNDA(agreeNDA);
-            session.merge(user);
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
+        User foundUser = userRepository.findOne(user.getUsername());
+        user.setAgreeNDA(foundUser.getAgreeNDA());
+        userRepository.save(user);
         return user;
     }
 
@@ -173,28 +159,11 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
     @RequestMapping(path = "/user", method = RequestMethod.POST)
     public ResponseEntity<Void> postUser(@ApiParam(value = "Has the user agreed on the NDA") @RequestParam(value = "agreeNDA", required = true) Boolean agreeNDA) {
         String username = getUser().getUsername();
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        try {
-            session.beginTransaction();
-            User user = (User) session
-                    .createQuery("from User where username= :username")
-                    .setString("username", username)
-                    .uniqueResult();
-            if (user != null) {
-                user.setAgreeNDA(agreeNDA);
-                session.update(user);
-            }
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+        User user = userRepository.findOne(username);
+        if (user != null) {
+            user.setAgreeNDA(agreeNDA);
+            userRepository.save(user);
         }
-
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
 
diff --git a/src/main/java/org/hbp/mip/controllers/AppsApi.java b/src/main/java/org/hbp/mip/controllers/AppsApi.java
index b89ef31b4836ba1e52966ae8a002e341bdb13546..a1f644a93243b362ece5568e3528193c37e68355 100644
--- a/src/main/java/org/hbp/mip/controllers/AppsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/AppsApi.java
@@ -8,12 +8,7 @@ import io.swagger.annotations.*;
 import org.apache.log4j.Logger;
 import org.hbp.mip.MIPApplication;
 import org.hbp.mip.model.App;
-import org.hbp.mip.model.User;
-import org.hbp.mip.model.Vote;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.NonUniqueObjectException;
-import org.hibernate.Query;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.AppRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -22,10 +17,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.validation.ConstraintViolationException;
-import java.util.LinkedList;
-import java.util.List;
-
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 
 @RestController
@@ -38,29 +29,15 @@ public class AppsApi {
     @Autowired
     MIPApplication mipApplication;
 
+    @Autowired
+    AppRepository appRepository;
+
     @ApiOperation(value = "Get apps", response = App.class, responseContainer = "List")
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
     @RequestMapping(method = RequestMethod.GET)
-    public ResponseEntity<List> getApps(
+    public ResponseEntity<Iterable> getApps(
     ) {
-        List apps = new LinkedList<>();
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        try {
-            session.beginTransaction();
-            Query query = session.createQuery("FROM App");
-            apps = query.list();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(apps);
+        return ResponseEntity.ok(appRepository.findAll());
     }
 
     @ApiOperation(value = "Post a vote")
@@ -71,68 +48,38 @@ public class AppsApi {
             @ApiParam(value = "value", required = true) @PathVariable("value") Integer value
     ) {
 
-        User user = mipApplication.getUser();
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        try {
-            session.beginTransaction();
-
-            Vote vote = (Vote) session.createQuery("" +
-                    "SELECT v FROM Vote v, User u, App a " +
-                    "WHERE u=v.user " +
-                    "AND a=v.app " +
-                    "AND u.username= :username " +
-                    "AND a.id= :app_id")
-                    .setString("username", user.getUsername())
-                    .setLong("app_id", id)
-                    .uniqueResult();
-            App app = (App) session.createQuery("FROM App where id= :id").setLong("id", id).uniqueResult();
-
-            if (vote != null) {
-                vote.setValue(value);
-
-                session.update(vote);
-                session.getTransaction().commit();
-                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
-            }
-            else
-            {
-                vote = new Vote();
-                vote.setUser(user);
-                vote.setValue(value);
-                vote.setApp(app);
-
-                session.save(vote);
-                session.getTransaction().commit();
-                return new ResponseEntity<>(HttpStatus.CREATED);
-            }
-        }
-        catch (ConstraintViolationException cve)
-        {
-            LOGGER.trace(cve);
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-            }
-            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
-        }
-        catch (NonUniqueObjectException nuoe)
-        {
-            LOGGER.trace(nuoe);
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-            }
-            return new ResponseEntity<>(HttpStatus.CONFLICT);
+        /*User user = mipApplication.getUser();
+
+        Vote vote = (Vote) session.createQuery("" +
+                "SELECT v FROM Vote v, User u, App a " +
+                "WHERE u=v.user " +
+                "AND a=v.app " +
+                "AND u.username= :username " +
+                "AND a.id= :app_id")
+                .setString("username", user.getUsername())
+                .setLong("app_id", id)
+                .uniqueResult();
+        App app = (App) session.createQuery("FROM App where id= :id").setLong("id", id).uniqueResult();
+
+        if (vote != null) {
+            vote.setValue(value);
+
+            session.update(vote);
+            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
         }
-        catch (Exception e)
+        else
         {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
-        }
+            vote = new Vote();
+            vote.setUser(user);
+            vote.setValue(value);
+            vote.setApp(app);
+
+            session.save(vote);
+            session.getTransaction().commit();
+            return new ResponseEntity<>(HttpStatus.CREATED);
+        }*/
+
+        return new ResponseEntity<>(HttpStatus.CREATED);
+
     }
 }
diff --git a/src/main/java/org/hbp/mip/controllers/ArticlesApi.java b/src/main/java/org/hbp/mip/controllers/ArticlesApi.java
index 99fe8334aef8fa27ba2fde647794b472b1cdb196..6d2f1d96efba6d8f60b59565082acb2defc1be3d 100644
--- a/src/main/java/org/hbp/mip/controllers/ArticlesApi.java
+++ b/src/main/java/org/hbp/mip/controllers/ArticlesApi.java
@@ -11,9 +11,7 @@ import org.apache.log4j.Logger;
 import org.hbp.mip.MIPApplication;
 import org.hbp.mip.model.Article;
 import org.hbp.mip.model.User;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Query;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.ArticleRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -22,8 +20,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 
@@ -37,16 +33,19 @@ public class ArticlesApi {
     @Autowired
     MIPApplication mipApplication;
 
+    @Autowired
+    ArticleRepository articleRepository;
+
     @ApiOperation(value = "Get articles", response = Article.class, responseContainer = "List")
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
     @RequestMapping(method = RequestMethod.GET)
-    public ResponseEntity<List> getArticles(
+    public ResponseEntity<Iterable> getArticles(
             @ApiParam(value = "Only ask own articles") @RequestParam(value = "own", required = false) Boolean own,
             @ApiParam(value = "Only ask results matching status", allowableValues = "{values=[draft, published, closed]}") @RequestParam(value = "status", required = false) String status,
             @ApiParam(value = "Only ask articles from own team") @RequestParam(value = "team", required = false) Boolean team
     ) {
 
-        User user = mipApplication.getUser();
+        /*User user = mipApplication.getUser();
 
         String queryString = "SELECT a FROM Article a, User u WHERE a.createdBy=u.username";
         if(status != null)
@@ -62,28 +61,18 @@ public class ArticlesApi {
             queryString += " AND (status='published' or u.username= :username)";
         }
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
         List articles = new LinkedList<>();
-        try {
-            session.beginTransaction();
-            Query query = session.createQuery(queryString);
-            if (status != null) {
-                query.setString("status", status);
-            }
-            query.setString("username", user.getUsername());
-            articles = query.list();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
+        Query query = session.createQuery(queryString);
+        if (status != null) {
+            query.setString("status", status);
         }
+        query.setString("username", user.getUsername());
+        articles = query.list();
+        session.getTransaction().commit();
 
+        return ResponseEntity.ok(articles);*/
 
-        return ResponseEntity.ok(articles);
+        return ResponseEntity.ok(articleRepository.findAll());
     }
 
 
@@ -103,61 +92,44 @@ public class ArticlesApi {
         article.setCreatedBy(user);
 
         Long count;
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        try{
-            session.beginTransaction();
+        int i = 0;
+        do{
+            i++;
+            count = articleRepository.countByTitle(article.getTitle());
 
-            int i = 0;
-            do{
-                i++;
-                count = (Long) session
-                        .createQuery("select count(*) from Article where title= :title")
-                        .setString("title", article.getTitle())
-                        .uniqueResult();
-
-                if(count > 0)
-                {
-                    String title = article.getTitle();
-                    if(i > 1)
-                    {
-                        title = title.substring(0, title.length()-4);
-                    }
-                    article.setTitle(title + " (" + i + ")");
-                }
-            } while(count > 0);
-
-            String slug = new Slugify().slugify(article.getTitle());
-
-            i = 0;
-            do {
-                i++;
-                count = (Long) session
-                        .createQuery("select count(*) from Article where slug= :slug")
-                        .setString("slug", slug)
-                        .uniqueResult();
-                if(count > 0)
+            if(count > 0)
+            {
+                String title = article.getTitle();
+                if(i > 1)
                 {
-                    if(i > 1)
-                    {
-                        slug = slug.substring(0, slug.length()-2);
-                    }
-                    slug += "-"+i;
+                    title = title.substring(0, title.length()-4);
                 }
-                article.setSlug(slug);
-            } while(count > 0);
+                article.setTitle(title + " (" + i + ")");
+            }
+        } while(count > 0);
 
-            session.save(article);
-            session.getTransaction().commit();
+        String slug = null;
+        try {
+            slug = new Slugify().slugify(article.getTitle());
         } catch (IOException e) {
-        LOGGER.trace(e);
-        } catch (Exception e) {
-            if(session.getTransaction() != null)
+            slug = "";
+            LOGGER.trace(e);
+        }
+
+        i = 0;
+        do {
+            i++;
+            if(articleRepository.exists(slug))
             {
-                session.getTransaction().rollback();
-                throw e;
+                if(i > 1)
+                {
+                    slug = slug.substring(0, slug.length()-2);
+                }
+                slug += "-"+i;
             }
-            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
-        }
+            article.setSlug(slug);
+        } while(count > 0);
+        articleRepository.save(article);
 
         return new ResponseEntity<>(HttpStatus.CREATED);
     }
@@ -171,32 +143,12 @@ public class ArticlesApi {
     ) {
 
         User user = mipApplication.getUser();
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Article article = null;
-        try{
-            session.beginTransaction();
-
-            article = (Article) session
-                    .createQuery("FROM Article WHERE slug= :slug")
-                    .setString("slug", slug)
-                    .uniqueResult();
-
-            session.getTransaction().commit();
-
-            if (!"published".equals(article.getStatus()) && !article.getCreatedBy().getUsername().equals(user.getUsername()))
-            {
-                return new ResponseEntity<>(HttpStatus.FORBIDDEN);
-            }
-        } catch (Exception e)
+        Article article;
+        article = articleRepository.findOne(slug);
+        if (!"published".equals(article.getStatus()) && !article.getCreatedBy().getUsername().equals(user.getUsername()))
         {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
+            return new ResponseEntity<>(HttpStatus.FORBIDDEN);
         }
-
         return ResponseEntity.ok(article);
     }
 
@@ -209,12 +161,8 @@ public class ArticlesApi {
             @RequestBody @ApiParam(value = "Article to update", required = true) @Valid Article article
     ) {
 
-        User user = mipApplication.getUser();
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        /*User user = mipApplication.getUser();
         try{
-            session.beginTransaction();
-
             String author = (String) session
                     .createQuery("select U.username from User U, Article A where A.createdBy = U.username and A.slug = :slug")
                     .setString("slug", slug)
@@ -261,7 +209,7 @@ public class ArticlesApi {
                 session.getTransaction().rollback();
                 throw e;
             }
-        }
+        }*/
 
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/DatasetsApi.java b/src/main/java/org/hbp/mip/controllers/DatasetsApi.java
index 4f3b67bfb063cd6504f7df85cf99c8cc4089a1d7..05fc11d6a8b93a573e0c5ffe149de1e2d2a9a1fc 100644
--- a/src/main/java/org/hbp/mip/controllers/DatasetsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/DatasetsApi.java
@@ -7,8 +7,8 @@ package org.hbp.mip.controllers;
 
 import io.swagger.annotations.*;
 import org.hbp.mip.model.Dataset;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.DatasetRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -22,32 +22,16 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 @Api(value = "/datasets", description = "the datasets API")
 public class DatasetsApi {
 
+    @Autowired
+    DatasetRepository datasetRepository;
+
     @ApiOperation(value = "Get a dataset", response = Dataset.class)
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
     @RequestMapping(value = "/{code}", method = RequestMethod.GET)
     public ResponseEntity<Dataset> getADataset(
             @ApiParam(value = "code", required = true) @PathVariable("code") String code
     )  {
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Dataset dataset = null;
-        try{
-            session.beginTransaction();
-            dataset = (Dataset) session
-                    .createQuery("from Dataset where code= :code")
-                    .setString("code", code)
-                    .uniqueResult();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(dataset);
+        return ResponseEntity.ok(datasetRepository.findOne(code));
     }
 
 }
diff --git a/src/main/java/org/hbp/mip/controllers/ExperimentApi.java b/src/main/java/org/hbp/mip/controllers/ExperimentApi.java
index 5adbdaa35ffd233717ea958b54e6a3cdfc7f78a2..508839d0c809dd8e03e5fb614dec5537f0e4268d 100644
--- a/src/main/java/org/hbp/mip/controllers/ExperimentApi.java
+++ b/src/main/java/org/hbp/mip/controllers/ExperimentApi.java
@@ -5,14 +5,11 @@ import io.swagger.annotations.*;
 import org.apache.log4j.Logger;
 import org.hbp.mip.MIPApplication;
 import org.hbp.mip.model.Experiment;
-import org.hbp.mip.model.Model;
 import org.hbp.mip.model.User;
+import org.hbp.mip.repositories.ExperimentRepository;
+import org.hbp.mip.repositories.ModelRepository;
 import org.hbp.mip.utils.HTTPUtil;
-import org.hbp.mip.utils.HibernateUtil;
 import org.hbp.mip.utils.JSONUtil;
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
@@ -24,8 +21,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.MalformedURLException;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.UUID;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
@@ -63,6 +58,12 @@ public class ExperimentApi {
     @Autowired
     MIPApplication mipApplication;
 
+    @Autowired
+    ModelRepository modelRepository;
+
+    @Autowired
+    ExperimentRepository experimentRepository;
+
 
     @ApiOperation(value = "Send a request to the workflow to run an experiment", response = Experiment.class)
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
@@ -74,33 +75,12 @@ public class ExperimentApi {
         experiment.setUuid(UUID.randomUUID());
         User user = mipApplication.getUser();
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Transaction transaction = session.beginTransaction();
-
-        try {
-
-            experiment.setAlgorithms(incomingQuery.get("algorithms").toString());
-            experiment.setValidations(incomingQuery.get("validations").toString());
-            experiment.setName(incomingQuery.get("name").getAsString());
-            experiment.setCreatedBy(user);
-
-            Query hibernateQuery = session.createQuery("from Model as model where model.slug = :slug");
-            hibernateQuery.setParameter("slug", incomingQuery.get("model").getAsString());
-            experiment.setModel((Model)hibernateQuery.uniqueResult());
-
-            session.save(experiment);
-            transaction.commit();
-
-        } catch (Exception e) {
-            if(transaction != null)
-            {
-                transaction.rollback();
-            }
-            LOGGER.trace(e);
-            LOGGER.warn("Cannot create experiment to run ! This is probably caused by a bad request !");
-            // 400 here probably
-            return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
-        }
+        experiment.setAlgorithms(incomingQuery.get("algorithms").toString());
+        experiment.setValidations(incomingQuery.get("validations").toString());
+        experiment.setName(incomingQuery.get("name").getAsString());
+        experiment.setCreatedBy(user);
+        experiment.setModel(modelRepository.findOne(incomingQuery.get("model").getAsString()));
+        experimentRepository.save(experiment);
 
         try {
             if(isExaremeAlgo(experiment))
@@ -130,23 +110,7 @@ public class ExperimentApi {
             return ResponseEntity.badRequest().body("Invalid Experiment UUID");
         }
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-
-        try {
-            session.beginTransaction();
-
-            Query hibernateQuery = session.createQuery("from Experiment as experiment where experiment.uuid = :uuid");
-            hibernateQuery.setParameter("uuid", experimentUuid);
-            experiment = (Experiment) hibernateQuery.uniqueResult();
-            session.getTransaction().commit();
-        } catch (Exception e) {
-            // 404 here probably
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-            }
-            throw e;
-        }
+        experiment = experimentRepository.findOne(experimentUuid);
 
         if (experiment == null) {
             return new ResponseEntity<>("Not found", HttpStatus.NOT_FOUND);
@@ -170,31 +134,11 @@ public class ExperimentApi {
             return ResponseEntity.badRequest().body("Invalid Experiment UUID");
         }
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Transaction transaction = null;
-        try {
-            transaction = session.beginTransaction();
-
-            Query hibernateQuery = session.createQuery("from Experiment as experiment where experiment.uuid = :uuid");
-            hibernateQuery.setParameter("uuid", experimentUuid);
-            experiment = (Experiment) hibernateQuery.uniqueResult();
-
-            if (!experiment.getCreatedBy().getUsername().equals(user.getUsername()))
-                return new ResponseEntity<>("You're not the owner of this experiment", HttpStatus.BAD_REQUEST);
-
-            experiment.setResultsViewed(true);
-            session.update(experiment);
-
-            transaction.commit();
-        } catch (Exception e) {
-            // 404 here probably
-            if(transaction != null)
-            {
-                transaction.rollback();
-            }
-            throw e;
-        }
-
+        experiment = experimentRepository.findOne(experimentUuid);;
+        if (!experiment.getCreatedBy().getUsername().equals(user.getUsername()))
+            return new ResponseEntity<>("You're not the owner of this experiment", HttpStatus.BAD_REQUEST);
+        experiment.setResultsViewed(true);
+        experimentRepository.save(experiment);
         return new ResponseEntity<>(gson.toJson(experiment), HttpStatus.OK);
     }
 
@@ -265,14 +209,10 @@ public class ExperimentApi {
             int maxResultCount,
             String modelSlug
     ) {
-        List<Experiment> experiments = new LinkedList<>();
+        /*List<Experiment> experiments = new LinkedList<>();
         User user = mipApplication.getUser();
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-
         try {
-            session.beginTransaction();
-
             Query hibernateQuery;
             String baseQuery = "from Experiment as e WHERE ";
 
@@ -313,7 +253,9 @@ public class ExperimentApi {
             }
         }
 
-        return new ResponseEntity<>(gson.toJson(experiments), HttpStatus.OK);
+        return new ResponseEntity<>(gson.toJson(experiments), HttpStatus.OK);*/
+
+        return new ResponseEntity<>("", HttpStatus.OK);
     }
 
     private ResponseEntity<String> doMarkExperimentAsShared(String uuid, boolean shared) {
@@ -328,30 +270,13 @@ public class ExperimentApi {
             return ResponseEntity.badRequest().body("Invalid Experiment UUID");
         }
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Transaction transaction = null;
-        try {
-            transaction = session.beginTransaction();
-
-            Query hibernateQuery = session.createQuery("from Experiment as experiment where experiment.uuid = :uuid");
-            hibernateQuery.setParameter("uuid", experimentUuid);
-            experiment = (Experiment) hibernateQuery.uniqueResult();
-
-            if (!experiment.getCreatedBy().getUsername().equals(user.getUsername()))
-                return new ResponseEntity<>("You're not the owner of this experiment", HttpStatus.BAD_REQUEST);
+        experiment = experimentRepository.findOne(experimentUuid);
 
-            experiment.setShared(shared);
-            session.update(experiment);
+        if (!experiment.getCreatedBy().getUsername().equals(user.getUsername()))
+            return new ResponseEntity<>("You're not the owner of this experiment", HttpStatus.BAD_REQUEST);
 
-            transaction.commit();
-        } catch (Exception e) {
-            // 404 here probably
-            if(transaction != null)
-            {
-                transaction.rollback();
-            }
-            throw e;
-        }
+        experiment.setShared(shared);
+        experimentRepository.save(experiment);
 
         return new ResponseEntity<>(gson.toJson(experiment), HttpStatus.OK);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/GroupsApi.java b/src/main/java/org/hbp/mip/controllers/GroupsApi.java
index 9f23ad3b43b379ceb8c148900aaac129ac3ae0ad..48574e48cec79d8a23005db34c3125521d7f9c7a 100644
--- a/src/main/java/org/hbp/mip/controllers/GroupsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/GroupsApi.java
@@ -9,8 +9,8 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.hbp.mip.model.Group;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.GroupRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -23,32 +23,16 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 @Api(value = "/groups", description = "the groups API")
 public class GroupsApi {
 
+    private static final String ROOT_CODE = "root";
+
+    @Autowired
+    GroupRepository groupRepository;
+
     @ApiOperation(value = "Get the root group (containing all subgroups)", response = Group.class)
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
     @RequestMapping(method = RequestMethod.GET)
     public ResponseEntity<Group> getTheRootGroup()  {
-
-        String rootCode = "root";
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Group group = null;
-        try{
-            session.beginTransaction();
-            group = (Group) session
-                    .createQuery("FROM Group WHERE code= :code")
-                    .setString("code", rootCode)
-                    .uniqueResult();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(group);
+        return ResponseEntity.ok(groupRepository.findOne(ROOT_CODE));
     }
 
 
diff --git a/src/main/java/org/hbp/mip/controllers/ModelsApi.java b/src/main/java/org/hbp/mip/controllers/ModelsApi.java
index 21b102e1858a508f92bff344a4aded93006c10f2..65da841f7adb89f24507d9b63042de0387ce3ef0 100644
--- a/src/main/java/org/hbp/mip/controllers/ModelsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/ModelsApi.java
@@ -9,10 +9,10 @@ import io.swagger.annotations.*;
 import org.apache.log4j.Logger;
 import org.hbp.mip.MIPApplication;
 import org.hbp.mip.model.*;
+import org.hbp.mip.repositories.DatasetRepository;
+import org.hbp.mip.repositories.ModelRepository;
+import org.hbp.mip.repositories.QueryRepository;
 import org.hbp.mip.utils.CSVUtil;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Query;
-import org.hibernate.Session;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -34,19 +34,28 @@ public class ModelsApi {
     @Autowired
     MIPApplication mipApplication;
 
+    @Autowired
+    DatasetRepository datasetRepository;
+
+    @Autowired
+    ModelRepository modelRepository;
+
+    @Autowired
+    QueryRepository queryRepository;
+
     private static final String DATA_FILE = "data/values.csv";
 
     @ApiOperation(value = "Get models", response = Model.class, responseContainer = "List")
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
     @RequestMapping(method = RequestMethod.GET)
-    public ResponseEntity<List<Model>> getModels(
+    public ResponseEntity<Iterable> getModels(
             @ApiParam(value = "Max number of results") @RequestParam(value = "limit", required = false) Integer limit,
             @ApiParam(value = "Only ask own models") @RequestParam(value = "own", required = false) Boolean own,
             @ApiParam(value = "Only ask models from own team") @RequestParam(value = "team", required = false) Boolean team,
             @ApiParam(value = "Only ask published models") @RequestParam(value = "valid", required = false) Boolean valid
     )  {
 
-        User user = mipApplication.getUser();
+        /*User user = mipApplication.getUser();
 
         String queryString = "SELECT m FROM Model m, User u WHERE m.createdBy=u.username";
         if(valid != null && valid)
@@ -64,56 +73,27 @@ public class ModelsApi {
 
         queryString += " ORDER BY m.createdAt DESC";
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
         List<Model> models = new LinkedList<>();
-        try{
-            session.beginTransaction();
-            Query query = session.createQuery(queryString);
-            if(valid != null)
-            {
-                query.setBoolean("valid", valid);
-            }
-            query.setString("username", user.getUsername());
-            if(limit != null)
-            {
-                query.setMaxResults(limit);  // Pagination : Use query.setFirstResult(...) to set begining index
-            }
-            models = query.list();
-            session.getTransaction().commit();
-        } catch (Exception e)
+        Query query = session.createQuery(queryString);
+        if(valid != null)
         {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
+            query.setBoolean("valid", valid);
+        }
+        query.setString("username", user.getUsername());
+        if(limit != null)
+        {
+            query.setMaxResults(limit);  // Pagination : Use query.setFirstResult(...) to set begining index
         }
+        models = query.list();
 
-        for(Model model:models){
-            String dsCode = model.getDataset().getCode();
-
-            session = HibernateUtil.getSessionFactory().getCurrentSession();
-            Dataset dataset = null;
-            try{
-                session.beginTransaction();
-                dataset = (Dataset) session
-                        .createQuery("from Dataset where code= :code")
-                        .setString("code", dsCode)
-                        .uniqueResult();
-                session.getTransaction().commit();
-            } catch (Exception e)
-            {
-                if(session.getTransaction() != null)
-                {
-                    session.getTransaction().rollback();
-                    throw e;
-                }
-            }
 
-            model.setDataset(dataset);
+        for(Model model:models){
+            model.setDataset(datasetRepository.findOne(model.getDataset().getCode()));
         }
 
-        return new ResponseEntity<List<Model>>(HttpStatus.OK).ok(models);
+        return new ResponseEntity<List<Model>>(HttpStatus.OK).ok(models);*/
+
+        return new ResponseEntity<>(HttpStatus.OK).ok(modelRepository.findAll());
     }
 
 
@@ -135,65 +115,51 @@ public class ModelsApi {
         }
 
         Long count;
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        try{
-            session.beginTransaction();
+        int i = 0;
+        do{
+            i++;
+            count = modelRepository.countByTitle(model.getTitle());
 
-            int i = 0;
-            do{
-                i++;
-                count = (Long) session
-                        .createQuery("select count(*) from Model where title= :title")
-                        .setString("title", model.getTitle())
-                        .uniqueResult();
-
-                if(count > 0)
-                {
-                    String title = model.getTitle();
-                    if(i > 1)
-                    {
-                        title = title.substring(0, title.length()-4);
-                    }
-                    model.setTitle(title + " (" + i + ")");
-                }
-            } while(count > 0);
-
-            String slug = new Slugify().slugify(model.getTitle());
-
-            i = 0;
-            do {
-                i++;
-                count = (Long) session
-                        .createQuery("select count(*) from Model where slug= :slug")
-                        .setString("slug", slug)
-                        .uniqueResult();
-                if(count > 0)
+            if(count > 0)
+            {
+                String title = model.getTitle();
+                if(i > 1)
                 {
-                    if(i > 1)
-                    {
-                        slug = slug.substring(0, slug.length()-2);
-                    }
-                    slug += "-"+i;
+                    title = title.substring(0, title.length()-4);
                 }
-                model.setSlug(slug);
-            } while(count > 0);
-
-            Map<String, String> map = new HashMap<>(model.getConfig().getTitle());
-            map.put("text", model.getTitle());
-            model.getConfig().setTitle(map);
+                model.setTitle(title + " (" + i + ")");
+            }
+        } while(count > 0);
 
-            session.save(model);
-            session.getTransaction().commit();
+        String slug = null;
+        try {
+            slug = new Slugify().slugify(model.getTitle());
         } catch (IOException e) {
+            slug = "";
             LOGGER.trace(e);
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
+        }
+
+        i = 0;
+        boolean alreadyExists;
+        do {
+            i++;
+            alreadyExists = modelRepository.exists(slug);
+            if(count > 0)
             {
-                session.getTransaction().rollback();
-                throw e;
+                if(i > 1)
+                {
+                    slug = slug.substring(0, slug.length()-2);
+                }
+                slug += "-"+i;
             }
-        }
+            model.setSlug(slug);
+        } while(alreadyExists);
+
+        Map<String, String> map = new HashMap<>(model.getConfig().getTitle());
+        map.put("text", model.getTitle());
+        model.getConfig().setTitle(map);
+
+        modelRepository.save(model);
 
         return new ResponseEntity<Model>(HttpStatus.CREATED).ok(model);
     }
@@ -207,51 +173,18 @@ public class ModelsApi {
 
         User user = mipApplication.getUser();
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
         Model model = null;
 
-        try {
-            session.beginTransaction();
-            model = (Model) session
-                    .createQuery("FROM Model WHERE slug= :slug")
-                    .setString("slug", slug)
-                    .uniqueResult();
-            session.getTransaction().commit();
-
-            if (!model.getValid() && !model.getCreatedBy().getUsername().equals(user.getUsername()))
-            {
-                return new ResponseEntity<>(HttpStatus.FORBIDDEN);
-            }
-
-        } catch (Exception e)
+        model = modelRepository.findOne(slug);
+        if (!model.getValid() && !model.getCreatedBy().getUsername().equals(user.getUsername()))
         {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
+            return new ResponseEntity<>(HttpStatus.FORBIDDEN);
         }
 
-
         if(model != null) {
-            session = HibernateUtil.getSessionFactory().getCurrentSession();
             org.hbp.mip.model.Query q = null;
 
-            try {
-                session.beginTransaction();
-                q = (org.hbp.mip.model.Query) session
-                        .createQuery("FROM Query WHERE id= :id")
-                        .setLong("id", model.getQuery().getId())
-                        .uniqueResult();
-                session.getTransaction().commit();
-            } catch (Exception e)
-            {
-                if(session.getTransaction() != null)
-                {
-                    session.getTransaction().rollback();
-                    throw e;
-                }
-            }
+            q = queryRepository.findOne(model.getQuery().getId());
 
             if(q != null) {
 
@@ -296,7 +229,7 @@ public class ModelsApi {
                 model.setQuery(myQuery);
             }
 
-            Dataset ds = CSVUtil.parseValues(DATA_FILE, model.getQuery());
+            Dataset ds = new CSVUtil().parseValues(DATA_FILE, model.getQuery());
             model.setDataset(ds);
 
         }
@@ -313,14 +246,11 @@ public class ModelsApi {
             @RequestBody @ApiParam(value = "Model to update", required = true) Model model
     )  {
 
-        User user = mipApplication.getUser();
+        /*User user = mipApplication.getUser();
 
         model.setTitle(model.getConfig().getTitle().get("text"));
 
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
         try{
-            session.beginTransaction();
-
             String author = (String) session
                     .createQuery("select U.username from User U, Model M where M.createdBy = U.username and M.slug = :slug")
                     .setString("slug", slug)
@@ -371,7 +301,7 @@ public class ModelsApi {
                 session.getTransaction().rollback();
                 throw e;
             }
-        }
+        }*/
 
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/RequestsApi.java b/src/main/java/org/hbp/mip/controllers/RequestsApi.java
index b60a53b558a33a205bb07ff404a25bba7e5af2d1..e41da4f755a0a1e471686e1dce1ed2973f6959a7 100644
--- a/src/main/java/org/hbp/mip/controllers/RequestsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/RequestsApi.java
@@ -29,10 +29,7 @@ public class RequestsApi {
     public ResponseEntity<Dataset> postRequests(
             @RequestBody @ApiParam(value = "Query to process", required = true) Query query
     )  {
-
-        Dataset dataset = CSVUtil.parseValues(DATA_FILE, query);
-
-        return ResponseEntity.ok(dataset);
+        return ResponseEntity.ok(new CSVUtil().parseValues(DATA_FILE, query));
     }
 
 }
diff --git a/src/main/java/org/hbp/mip/controllers/StatsApi.java b/src/main/java/org/hbp/mip/controllers/StatsApi.java
index e40a3becf1ee8715ecca6dea068dcc09cb855823..3f6883f28f9d19e7887519105e9a07bd58d5679d 100644
--- a/src/main/java/org/hbp/mip/controllers/StatsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/StatsApi.java
@@ -9,9 +9,10 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.hbp.mip.model.GeneralStats;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Query;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.ArticleRepository;
+import org.hbp.mip.repositories.UserRepository;
+import org.hbp.mip.repositories.VariableRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -24,44 +25,25 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 @Api(value = "/stats", description = "the stats API")
 public class StatsApi {
 
+    @Autowired
+    UserRepository userRepository;
+
+    @Autowired
+    ArticleRepository articleRepository;
+
+    @Autowired
+    VariableRepository variableRepository;
+
     @ApiOperation(value = "Get general statistics", response = GeneralStats.class)
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Found"), @ApiResponse(code = 404, message = "Not found") })
     @RequestMapping(method = RequestMethod.GET)
     public ResponseEntity<GeneralStats> getGeneralStatistics()  {
 
         GeneralStats stats = new GeneralStats();
-        Long nbUsers = 0L;
-        Long nbArticles = 0L;
-        Long nbVariables = 0L;
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-
-        try{
-
-            session.beginTransaction();
-
-            Query countUsersQuery = session.createQuery("SELECT COUNT(*) FROM User");
-            Query countArticlesQuery = session.createQuery("SELECT COUNT(*) FROM Article");
-            Query countVariablesQuery = session.createQuery("SELECT COUNT(*) FROM Variable");
-
-            nbUsers = (Long) countUsersQuery.uniqueResult();
-            nbArticles = (Long) countArticlesQuery.uniqueResult();
-            nbVariables = (Long) countVariablesQuery.uniqueResult();
-
-            session.getTransaction().commit();
-
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
 
-        stats.setUsers(nbUsers);
-        stats.setArticles(nbArticles);
-        stats.setVariables(nbVariables);
+        stats.setUsers(userRepository.count());
+        stats.setArticles(articleRepository.count());
+        stats.setVariables(variableRepository.count());
 
         return ResponseEntity.ok(stats);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/UsersApi.java b/src/main/java/org/hbp/mip/controllers/UsersApi.java
index bdd2e6745173a7fb9362ae31392ca157007d8231..eabeffca1e196a3201a9068b46c1dc395946f2fb 100644
--- a/src/main/java/org/hbp/mip/controllers/UsersApi.java
+++ b/src/main/java/org/hbp/mip/controllers/UsersApi.java
@@ -6,8 +6,8 @@ package org.hbp.mip.controllers;
 
 import io.swagger.annotations.*;
 import org.hbp.mip.model.User;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.UserRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,6 +21,8 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 @Api(value = "/users", description = "the users API")
 public class UsersApi {
 
+    @Autowired
+    UserRepository userRepository;
 
     @ApiOperation(value = "Get a user", response = User.class)
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Found"), @ApiResponse(code = 404, message = "Not found") })
@@ -28,25 +30,6 @@ public class UsersApi {
     public ResponseEntity<User> getAUser(
             @ApiParam(value = "username", required = true) @PathVariable("username") String username
     )  {
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        User user = null;
-        try{
-            session.beginTransaction();
-            user = (User) session
-                    .createQuery("from User where username= :username")
-                    .setString("username", username)
-                    .uniqueResult();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(user);
+        return ResponseEntity.ok(userRepository.findOne(username));
     }
 }
diff --git a/src/main/java/org/hbp/mip/controllers/VariablesApi.java b/src/main/java/org/hbp/mip/controllers/VariablesApi.java
index f69f98dedd82c9eb8707b858e86e27a0fd55a2fb..b5f2d72f2f5ea151070fb2598007f22a49b475f6 100644
--- a/src/main/java/org/hbp/mip/controllers/VariablesApi.java
+++ b/src/main/java/org/hbp/mip/controllers/VariablesApi.java
@@ -8,12 +8,11 @@ package org.hbp.mip.controllers;
 import io.swagger.annotations.*;
 import org.hbp.mip.model.Value;
 import org.hbp.mip.model.Variable;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.VariableRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.LinkedList;
 import java.util.List;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
@@ -23,10 +22,13 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
 @Api(value = "/variables", description = "the variables API")
 public class VariablesApi {
 
+    @Autowired
+    VariableRepository variableRepository;
+
     @ApiOperation(value = "Get variables", response = Variable.class, responseContainer = "List")
     @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") })
     @RequestMapping(method = RequestMethod.GET)
-    public ResponseEntity<List> getVariables(
+    public ResponseEntity<Iterable> getVariables(
             @ApiParam(value = "List of groups formatted like : (\"val1\", \"val2\", ...)") @RequestParam(value = "group", required = false) String group,
             @ApiParam(value = "List of subgroups formatted like : (\"val1\", \"val2\", ...)") @RequestParam(value = "subgroup", required = false) String subgroup,
             @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isVariable", required = false) String isVariable,
@@ -34,25 +36,7 @@ public class VariablesApi {
             @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isCovariable", required = false) String isCovariable,
             @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isFilter", required = false) String isFilter
     )  {
-
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        List variables = new LinkedList<>();
-        try{
-            session.beginTransaction();
-            variables = session
-                    .createQuery("from Variable")
-                    .list();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(variables);
+        return ResponseEntity.ok(variableRepository.findAll());
     }
 
     @ApiOperation(value = "Get a variable", response = Variable.class)
@@ -61,27 +45,7 @@ public class VariablesApi {
     public ResponseEntity<Variable> getAVariable(
             @ApiParam(value = "code of the variable ( multiple codes are allowed, separated by \",\" )", required = true) @PathVariable("code") String code
     )  {
-
-        // Query DB
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        Variable variable = null;
-        try{
-            session.beginTransaction();
-            variable = (Variable) session
-                    .createQuery("from Variable where code= :code")
-                    .setString("code", code)
-                    .uniqueResult();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(variable);
+        return ResponseEntity.ok(variableRepository.findOne(code));
     }
 
 
@@ -92,27 +56,7 @@ public class VariablesApi {
             @ApiParam(value = "code", required = true) @PathVariable("code") String code,
             @ApiParam(value = "Pattern to match") @RequestParam(value = "q", required = false) String q
     )  {
-
-        // Query DB
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        List values = new LinkedList<>();
-        try{
-            session.beginTransaction();
-            values = session
-                    .createQuery("select values from Variable where code= :code")
-                    .setString("code", code)
-                    .list();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
-        return ResponseEntity.ok(values);
+        return ResponseEntity.ok(variableRepository.findOne(code).getValues());
     }
 
 
diff --git a/src/main/java/org/hbp/mip/model/Experiment.java b/src/main/java/org/hbp/mip/model/Experiment.java
index d87949be04dc8da5d7080d4e20ace726e22ff267..53e4c13c818c14d396dee0118a85f3e5cbcbe9ce 100644
--- a/src/main/java/org/hbp/mip/model/Experiment.java
+++ b/src/main/java/org/hbp/mip/model/Experiment.java
@@ -6,15 +6,11 @@ import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.annotations.Expose;
 import org.apache.log4j.Logger;
-import org.hbp.mip.utils.HibernateUtil;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.annotations.*;
-import org.hibernate.exception.DataException;
+import org.hbp.mip.repositories.ExperimentRepository;
+import org.hibernate.annotations.Cascade;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import javax.persistence.*;
-import javax.persistence.Entity;
-import javax.persistence.Table;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
@@ -35,6 +31,9 @@ public class Experiment {
             .excludeFieldsWithoutExposeAnnotation()
             .create();
 
+    @Autowired
+    ExperimentRepository experimentRepository;
+
     @Id
     @Column(columnDefinition = "uuid")
     @org.hibernate.annotations.Type(type="pg-uuid")
@@ -147,17 +146,7 @@ public class Experiment {
 
     public void finish() {
         this.setFinished(new Date());
-
-        try {
-            Session session = HibernateUtil.getSessionFactory().openSession();
-            Transaction transaction = session.beginTransaction();
-            session.update(this);
-            transaction.commit();
-            session.close();
-        } catch (DataException e) {
-            LOGGER.trace(e);
-            throw e;
-        }
+        experimentRepository.save(this);
     }
 
     public String getValidations() {
diff --git a/src/main/java/org/hbp/mip/repositories/AppRepository.java b/src/main/java/org/hbp/mip/repositories/AppRepository.java
index d45a237160fbdb4dfca3be2d98634ad80cce54e3..450837ecbd6aa86b089ce7e7d3c5aef5a05bc673 100644
--- a/src/main/java/org/hbp/mip/repositories/AppRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/AppRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.App;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface AppRepository extends Repository<App, String> {
+public interface AppRepository extends CrudRepository<App, String> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/ArticleRepository.java b/src/main/java/org/hbp/mip/repositories/ArticleRepository.java
index d64979cc255db43218c00844ff35badef860005d..dfbbd1227898ed3721c6e63387786c392fcca04f 100644
--- a/src/main/java/org/hbp/mip/repositories/ArticleRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/ArticleRepository.java
@@ -1,10 +1,11 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Article;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface ArticleRepository extends Repository<Article, String> {
+public interface ArticleRepository extends CrudRepository<Article, String> {
+    Long countByTitle(String title);
 }
diff --git a/src/main/java/org/hbp/mip/repositories/ConfigRepository.java b/src/main/java/org/hbp/mip/repositories/ConfigRepository.java
index e09f83fd58f1a96e0629f0b8286ec34af8dffd90..bb90c48e03637ab505cca3e4f74b14113ea6ebfd 100644
--- a/src/main/java/org/hbp/mip/repositories/ConfigRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/ConfigRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Config;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface ConfigRepository extends Repository<Config, Long> {
+public interface ConfigRepository extends CrudRepository<Config, Long> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/DatasetRepository.java b/src/main/java/org/hbp/mip/repositories/DatasetRepository.java
index 09d2933f796146ba4a9779239b1aa156b021ed7f..4d0a62bb76a2d7ff0a8e503b7e930d53b8c89d0b 100644
--- a/src/main/java/org/hbp/mip/repositories/DatasetRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/DatasetRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Dataset;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface DatasetRepository extends Repository<Dataset, String> {
+public interface DatasetRepository extends CrudRepository<Dataset, String> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/ExperimentRepository.java b/src/main/java/org/hbp/mip/repositories/ExperimentRepository.java
index 14aa1d23a89ea77ac2baff66c671bf8531e4490e..99513acdd08123645adfcd366f8eea8f3ae49dc7 100644
--- a/src/main/java/org/hbp/mip/repositories/ExperimentRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/ExperimentRepository.java
@@ -1,12 +1,12 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Experiment;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 import java.util.UUID;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface ExperimentRepository extends Repository<Experiment, UUID> {
+public interface ExperimentRepository extends CrudRepository<Experiment, UUID> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/FilterRepository.java b/src/main/java/org/hbp/mip/repositories/FilterRepository.java
index 2b5eb3caa261f7cf936684304828064554654919..0c1794243fda1fa6b72542f992d17770d808b9ad 100644
--- a/src/main/java/org/hbp/mip/repositories/FilterRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/FilterRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Filter;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface FilterRepository extends Repository<Filter, Long> {
+public interface FilterRepository extends CrudRepository<Filter, Long> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/GroupRepository.java b/src/main/java/org/hbp/mip/repositories/GroupRepository.java
index 3b2db555f5e386525197ad0da347ec3be91f8073..57f5eee9b84e8e9a03f2657b45928d71d00aec56 100644
--- a/src/main/java/org/hbp/mip/repositories/GroupRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/GroupRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Group;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface GroupRepository extends Repository<Group, String> {
+public interface GroupRepository extends CrudRepository<Group, String> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/ModelRepository.java b/src/main/java/org/hbp/mip/repositories/ModelRepository.java
index 7612e86d378b2d4a6def03a629b1c024011e1ad1..91aaa95dc860f96449c3cb2e04b05f3eba2a04e8 100644
--- a/src/main/java/org/hbp/mip/repositories/ModelRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/ModelRepository.java
@@ -1,10 +1,11 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Model;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface ModelRepository extends Repository<Model, String> {
+public interface ModelRepository extends CrudRepository<Model, String> {
+    Long countByTitle(String Title);
 }
diff --git a/src/main/java/org/hbp/mip/repositories/QueryRepository.java b/src/main/java/org/hbp/mip/repositories/QueryRepository.java
index a690a4f4d676a30cd337cbdb5573fa878029cf77..6d07a73161f9809fbde758c589d67eca39474a2e 100644
--- a/src/main/java/org/hbp/mip/repositories/QueryRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/QueryRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Query;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface QueryRepository extends Repository<Query, Long> {
+public interface QueryRepository extends CrudRepository<Query, Long> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/TagRepository.java b/src/main/java/org/hbp/mip/repositories/TagRepository.java
index e122e500faa528300b93373e41753fabd9eadb36..9b613de352caf443ba6731c498c24e4b9c217213 100644
--- a/src/main/java/org/hbp/mip/repositories/TagRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/TagRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Tag;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface TagRepository extends Repository<Tag, String> {
+public interface TagRepository extends CrudRepository<Tag, String> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/UserRepository.java b/src/main/java/org/hbp/mip/repositories/UserRepository.java
index 750ceafa594744cbe321afb3aafb0d7638375a79..d5e1f126e50b6d53e86c00b388bd5bf055b00565 100644
--- a/src/main/java/org/hbp/mip/repositories/UserRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/UserRepository.java
@@ -1,10 +1,11 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.User;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface UserRepository extends Repository<User, String> {
+public interface UserRepository extends CrudRepository<User, String> {
+
 }
diff --git a/src/main/java/org/hbp/mip/repositories/ValueRepository.java b/src/main/java/org/hbp/mip/repositories/ValueRepository.java
index 02e9df7876ddd4448cfcbc88091ac04623d54892..f17fe13490590c7b211928035dec2c78555ee8f2 100644
--- a/src/main/java/org/hbp/mip/repositories/ValueRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/ValueRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Value;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface ValueRepository extends Repository<Value, String> {
+public interface ValueRepository extends CrudRepository<Value, String> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/VariableRepository.java b/src/main/java/org/hbp/mip/repositories/VariableRepository.java
index 466280b91468314a3d9db6d666acf3148d95ecff..ff6eeb985c4483353b7b864b77049c8c6544c95e 100644
--- a/src/main/java/org/hbp/mip/repositories/VariableRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/VariableRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Variable;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface VariableRepository extends Repository<Variable, String> {
+public interface VariableRepository extends CrudRepository<Variable, String> {
 }
diff --git a/src/main/java/org/hbp/mip/repositories/VoteRepository.java b/src/main/java/org/hbp/mip/repositories/VoteRepository.java
index d652f36a57887c47bbeb6f8762e96aef847522fc..bd858bd3ee961514669849c56be52269f5be6752 100644
--- a/src/main/java/org/hbp/mip/repositories/VoteRepository.java
+++ b/src/main/java/org/hbp/mip/repositories/VoteRepository.java
@@ -1,10 +1,10 @@
 package org.hbp.mip.repositories;
 
 import org.hbp.mip.model.Vote;
-import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.CrudRepository;
 
 /**
  * Created by mirco on 11.07.16.
  */
-public interface VoteRepository extends Repository<Vote, Long> {
+public interface VoteRepository extends CrudRepository<Vote, Long> {
 }
diff --git a/src/main/java/org/hbp/mip/utils/CSVUtil.java b/src/main/java/org/hbp/mip/utils/CSVUtil.java
index b3f6850be795983ec8728624da7dfcf733369dfe..a91d390ce42533abaef1f65f00aab7ca9e57a394 100644
--- a/src/main/java/org/hbp/mip/utils/CSVUtil.java
+++ b/src/main/java/org/hbp/mip/utils/CSVUtil.java
@@ -4,7 +4,8 @@ import org.apache.log4j.Logger;
 import org.hbp.mip.model.Dataset;
 import org.hbp.mip.model.Query;
 import org.hbp.mip.model.Variable;
-import org.hibernate.Session;
+import org.hbp.mip.repositories.VariableRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -24,13 +25,10 @@ public class CSVUtil {
 
     private static final String SEPARATOR = ",";
 
-    private CSVUtil()
-    {
-        /* Hide implicit public constructor */
-        throw new IllegalAccessError("CSVUtil class");
-    }
+    @Autowired
+    VariableRepository variableRepository;
 
-    public static Dataset parseValues(String filename, Query query)
+    public Dataset parseValues(String filename, Query query)
     {
         List<String[]> rows = getRows(filename);
 
@@ -161,7 +159,7 @@ public class CSVUtil {
         return result;
     }
 
-    private static List<String[]> getRows(String filename) {
+    private List<String[]> getRows(String filename) {
         List<String[]> rows = new LinkedList<>();
         try {
             InputStream is = CSVUtil.class.getClassLoader().getResourceAsStream(filename);
@@ -183,7 +181,7 @@ public class CSVUtil {
         return rows;
     }
 
-    private static int find(String code, String[] firstRow) {
+    private int find(String code, String[] firstRow) {
         for (int i = 0; i < firstRow.length; i++) {
             if (firstRow[i].equals(code))
                 return i;
@@ -191,7 +189,7 @@ public class CSVUtil {
         return -1;
     }
 
-    private static String generateDSCode(Query query) {
+    private String generateDSCode(Query query) {
         String prefix = "DS";
         String queryStr = Integer.toString(query.hashCode());
         String memId;
@@ -206,24 +204,9 @@ public class CSVUtil {
         return prefix + memId;
     }
 
-    private static String getTypeFromDB(Variable v)
+    private String getTypeFromDB(Variable v)
     {
-        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        String type = null;
-        try{
-            session.beginTransaction();
-            org.hibernate.Query q = session.createQuery("SELECT type FROM Variable where code= :code").setString("code", v.getCode());
-            type = (String) q.uniqueResult();
-            session.getTransaction().commit();
-        } catch (Exception e)
-        {
-            if(session.getTransaction() != null)
-            {
-                session.getTransaction().rollback();
-                throw e;
-            }
-        }
-
+        String type = variableRepository.findOne(v.getCode()).getType();
         if(type == null)
         {
             type = "unknown";
diff --git a/src/main/java/org/hbp/mip/utils/HibernateUtil.java b/src/main/java/org/hbp/mip/utils/HibernateUtil.java
deleted file mode 100644
index 87cde9618993e4070518b70d2bf6e4d058d54760..0000000000000000000000000000000000000000
--- a/src/main/java/org/hbp/mip/utils/HibernateUtil.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Created by mirco on 07.12.15.
- */
-
-package org.hbp.mip.utils;
-
-import org.apache.log4j.Logger;
-import org.hibernate.SessionFactory;
-import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.service.ServiceRegistry;
-
-public class HibernateUtil {
-
-    private static final Logger LOGGER = Logger.getLogger(CSVUtil.class);
-
-    private static ServiceRegistry serviceRegistry;
-
-    private static SessionFactory sessionFactory = buildSessionFactory();
-
-    private HibernateUtil() {
-        /* Hide implicit public constructor */
-        throw new IllegalAccessError("HibernateUtil class");
-    }
-
-    private static SessionFactory buildSessionFactory() {
-        try {
-            Configuration configuration = new Configuration();
-            configuration.configure();
-            serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
-                    configuration.getProperties()).build();
-            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
-            return sessionFactory;
-        } catch (RuntimeException ex) {
-            LOGGER.error("Initial SessionFactory creation failed." + ex);
-            throw new ExceptionInInitializerError(ex);
-        }
-    }
-
-    public static SessionFactory getSessionFactory() {
-        return sessionFactory;
-    }
-}