diff --git a/Dockerfile b/Dockerfile
index f7927e2fff38f5af18dfb8145f2f7bd4017ecc85..1d24297ed36ea5281519e7b6e6a33b628c37d4df 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,6 +5,10 @@ FROM maven:3-jdk-8
 
 COPY ./src/docker/init/build-in-docker.sh /build-in-docker.sh
 
-VOLUME /portal/
+CMD mkdir /opt/portal/
+
+VOLUME /opt/portal/
+
+WORKDIR /opt/portal/
 
 CMD ["/build-in-docker.sh"]
diff --git a/src/test/docker/application.yml b/config/application.yml
similarity index 96%
rename from src/test/docker/application.yml
rename to config/application.yml
index 0e58f67673ccd6af7cd396083a7e64ce4d29ea77..1108bc61f157515755bbb6fc1b18f38056a63afa 100644
--- a/src/test/docker/application.yml
+++ b/config/application.yml
@@ -33,4 +33,6 @@ server:
   contextPath: /services
   port: 8080
   use-forward-headers: true
+  session:
+    timeout: 2592000
 
diff --git a/src/docker/build/mip.sh b/src/docker/build/mip.sh
deleted file mode 100644
index cfae68474c42a1e66b80edb0ea849911ddd8eef4..0000000000000000000000000000000000000000
--- a/src/docker/build/mip.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-/usr/bin/java -DconfigFile=/opt/portal/config/application.yml -jar /opt/portal/lib/mip.jar
diff --git a/src/docker/init/build-in-docker.sh b/src/docker/init/build-in-docker.sh
old mode 100755
new mode 100644
diff --git a/src/main/java/org/hbp/mip/MIPApplication.java b/src/main/java/org/hbp/mip/MIPApplication.java
index c2d8558ef04f42a569bb4f90b3cd96164dd47642..8d05e4ceec255e45ed776cbf3d8cd26cc78de319 100644
--- a/src/main/java/org/hbp/mip/MIPApplication.java
+++ b/src/main/java/org/hbp/mip/MIPApplication.java
@@ -39,6 +39,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.oauth2.client.OAuth2ClientContext;
 import org.springframework.security.oauth2.client.OAuth2RestTemplate;
@@ -149,7 +150,7 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
             String userJSON = mapper.writeValueAsString(getUser(principal));
             Cookie cookie = new Cookie("user", URLEncoder.encode(userJSON, "UTF-8"));
             cookie.setPath("/");
-            cookie.setMaxAge(3600);
+            cookie.setMaxAge(2592000);
             response.addCookie(cookie);
         } catch (JsonProcessingException e) {
             e.printStackTrace();
@@ -167,7 +168,7 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
                 .authorizeRequests()
                 .antMatchers("/", "/frontend/**", "/webjars/**").permitAll()
                 .anyRequest().authenticated()
-                .and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login/hbp"))
+                .and().exceptionHandling().authenticationEntryPoint(new CustomLoginUrlAuthenticationEntryPoint("/login/hbp"))
                 .and().logout().logoutSuccessUrl("/login/hbp").permitAll()
                 .and().csrf().csrfTokenRepository(csrfTokenRepository())
                 .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
@@ -186,7 +187,7 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
     private Filter ssoFilter() {
         OAuth2ClientAuthenticationProcessingFilter hbpFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/hbp");
         OAuth2RestTemplate hbpTemplate = new OAuth2RestTemplate(hbp(), oauth2ClientContext);
-        hbpFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("http://localhost:7800/#/home"));
+        hbpFilter.setAuthenticationSuccessHandler(new SimpleUrlAuthenticationSuccessHandler("http://frontend/#/home"));
         hbpFilter.setRestTemplate(hbpTemplate);
         hbpFilter.setTokenServices(new UserInfoTokenServices(hbpResource().getUserInfoUri(), hbp().getClientId()));
         return hbpFilter;
@@ -231,3 +232,15 @@ public class MIPApplication extends WebSecurityConfigurerAdapter {
     }
 
 }
+
+class CustomLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
+
+    public CustomLoginUrlAuthenticationEntryPoint(String url) {
+        super(url);
+    }
+
+    @Override
+    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
+        response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+    }
+}
diff --git a/src/main/java/org/hbp/mip/controllers/ArticlesApi.java b/src/main/java/org/hbp/mip/controllers/ArticlesApi.java
index 291b5272eeecf58b9b8213c89b8db207a5d126ba..4bee0ec61f144e9af569b2ae83baa4943cac9142 100644
--- a/src/main/java/org/hbp/mip/controllers/ArticlesApi.java
+++ b/src/main/java/org/hbp/mip/controllers/ArticlesApi.java
@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.security.Principal;
 import java.util.Date;
+import java.util.LinkedList;
 import java.util.List;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
@@ -60,27 +61,36 @@ public class ArticlesApi {
             }
         }
 
-        // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        Query query = session.createQuery(queryString);
-        if(status != null)
-        {
-            query.setString("status", status);
-        }
-        if(own != null && own)
-        {
-            query.setString("username", user.getUsername());
-        }
-        else
-        {
-            if(team != null && team)
+        List<Article> articles = new LinkedList<>();
+        // Query DB
+        try{
+            session.beginTransaction();
+            Query query = session.createQuery(queryString);
+            if(status != null)
             {
-                query.setString("team", user.getTeam());
+                query.setString("status", status);
             }
-        }
-        List<Article> articles = query.list();
-        session.getTransaction().commit();
+            if(own != null && own)
+            {
+                query.setString("username", user.getUsername());
+            }
+            else
+            {
+                if(team != null && team)
+                {
+                    query.setString("team", user.getTeam());
+                }
+            }
+            articles = query.list();
+            session.getTransaction().commit();
+
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<List<Article>>(HttpStatus.OK).ok(articles);
     }
@@ -107,9 +117,16 @@ public class ArticlesApi {
 
         // Save article into DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        session.save(article);
-        session.getTransaction().commit();
+        try{
+            session.beginTransaction();
+            session.save(article);
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Void>(HttpStatus.OK);
     }
@@ -124,11 +141,19 @@ public class ArticlesApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        Query query = session.createQuery("from Article where slug= :slug");
-        query.setString("slug", slug);
-        Article article = (Article) query.uniqueResult();
-        session.getTransaction().commit();
+        Article article = null;
+        try{
+            session.beginTransaction();
+            Query query = session.createQuery("from Article where slug= :slug");
+            query.setString("slug", slug);
+            article = (Article) query.uniqueResult();
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Article>(HttpStatus.OK).ok(article);
     }
@@ -148,9 +173,16 @@ public class ArticlesApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        session.update(article);
-        session.getTransaction().commit();
+        try{
+            session.beginTransaction();
+            session.update(article);
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Void>(HttpStatus.OK);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/DatasetsApi.java b/src/main/java/org/hbp/mip/controllers/DatasetsApi.java
index 6050b1b4e360babe9c3e9949e5bfe4173530df65..7f6b3ceda7e85a3c40a5e8f7dec94487c121c808 100644
--- a/src/main/java/org/hbp/mip/controllers/DatasetsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/DatasetsApi.java
@@ -34,11 +34,19 @@ public class DatasetsApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        Query query = session.createQuery("from Dataset where code= :code");
-        query.setString("code", code);
-        Dataset dataset = (Dataset) query.uniqueResult();
-        session.getTransaction().commit();
+        Dataset dataset = null;
+        try{
+            session.beginTransaction();
+            Query query = session.createQuery("from Dataset where code= :code");
+            query.setString("code", code);
+            dataset = (Dataset) query.uniqueResult();
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Dataset>(HttpStatus.OK).ok(dataset);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/GroupsApi.java b/src/main/java/org/hbp/mip/controllers/GroupsApi.java
index db971ebc1ca3414b82f51dac7919c85d3f5918ac..0ba437d444019a1de02252d414378b5ad8f8c8bb 100644
--- a/src/main/java/org/hbp/mip/controllers/GroupsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/GroupsApi.java
@@ -32,11 +32,19 @@ public class GroupsApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        org.hibernate.Query query = session.createQuery("from Group where code= :code");
-        query.setString("code", rootCode);
-        Group group = (Group) query.uniqueResult();
-        session.getTransaction().commit();
+        Group group = null;
+        try{
+            session.beginTransaction();
+            org.hibernate.Query query = session.createQuery("from Group where code= :code");
+            query.setString("code", rootCode);
+            group = (Group) query.uniqueResult();
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Group>(HttpStatus.OK).ok(group);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/ModelsApi.java b/src/main/java/org/hbp/mip/controllers/ModelsApi.java
index 0c7b8e975a580b921b955890c40d9caf5b0b0ef0..102661c22db18b6fbb0ea7a51b78d1da7faac02a 100644
--- a/src/main/java/org/hbp/mip/controllers/ModelsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/ModelsApi.java
@@ -61,25 +61,33 @@ public class ModelsApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        Query query = session.createQuery(queryString);
-        if(own != null && own)
-        {
-            query.setString("username", user.getUsername());
-        }
-        else
-        {
-            if(team != null && team)
+        List<Model> models = new LinkedList<>();
+        try{
+            session.beginTransaction();
+            Query query = session.createQuery(queryString);
+            if(own != null && own)
             {
-                query.setString("team", user.getTeam());
+                query.setString("username", user.getUsername());
             }
-        }
-        if(limit != null)
+            else
+            {
+                if(team != null && team)
+                {
+                    query.setString("team", user.getTeam());
+                }
+            }
+            if(limit != null)
+            {
+                query.setMaxResults(limit);  // Pagination : Use query.setFirstResult(...) to set begining index
+            }
+            models = query.list();
+            session.getTransaction().commit();
+        } catch (Exception e)
         {
-            query.setMaxResults(limit);  // Pagination : Use query.setFirstResult(...) to set begining index
-        }
-        List<Model> models = query.list();
-        session.getTransaction().commit();
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<List<Model>>(HttpStatus.OK).ok(models);
     }
@@ -104,9 +112,16 @@ public class ModelsApi {
 
         // Save model into DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        session.save(model);
-        session.getTransaction().commit();
+        try{
+            session.beginTransaction();
+            session.save(model);
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Void>(HttpStatus.OK);
     }
@@ -120,11 +135,19 @@ public class ModelsApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        org.hibernate.Query query = session.createQuery("from Model where slug= :slug");
-        query.setString("slug", slug);
-        Model model = (Model) query.uniqueResult();
-        session.getTransaction().commit();
+        Model model = null;
+        try{
+            session.beginTransaction();
+            org.hibernate.Query query = session.createQuery("from Model where slug= :slug");
+            query.setString("slug", slug);
+            model = (Model) query.uniqueResult();
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<String>(HttpStatus.OK).ok(model.getChart().getSvg());
     }
@@ -146,54 +169,61 @@ public class ModelsApi {
 
         if(model != null) {
             session = HibernateUtil.getSessionFactory().getCurrentSession();
-            session.beginTransaction();
-            query = session.createQuery("from Query where id= :id");
-            query.setLong("id", model.getQuery().getId());
-            org.hbp.mip.model.Query q = (org.hbp.mip.model.Query) query.uniqueResult();
-            session.getTransaction().commit();
-
-            List<Variable> vars = new LinkedList<>();
-            for (Variable var : q.getVariables()) {
-                Variable v = new Variable();
-                v.setCode(var.getCode());
-                vars.add(v);
-            }
-
-            List<Variable> covs = new LinkedList<>();
-            for (Variable cov : q.getCovariables()) {
-                Variable v = new Variable();
-                v.setCode(cov.getCode());
-                covs.add(v);
-            }
-
-            List<Variable> grps = new LinkedList<>();
-            for (Variable grp : q.getGrouping()) {
-                Variable v = new Variable();
-                v.setCode(grp.getCode());
-                grps.add(v);
-            }
-
-            List<Filter> fltrs = new LinkedList<>();
-            for (Filter fltr : q.getFilters()) {
-                Filter f = new Filter();
-                f.setId(fltr.getId());
-                f.setOperator(fltr.getOperator());
-                f.setValues(fltr.getValues());
-                f.setVariable(fltr.getVariable());
-                fltrs.add(f);
-            }
-
-            org.hbp.mip.model.Query myQuery = new org.hbp.mip.model.Query();
-            myQuery.setId(q.getId());
-            myQuery.setVariables(vars);
-            myQuery.setCovariables(covs);
-            myQuery.setGrouping(grps);
-            myQuery.setFilters(fltrs);
-
-            model.setQuery(myQuery);
-
-            Dataset ds = CSVUtil.parseValues(DATA_FILE, model.getQuery());
-            model.setDataset(ds);
+            try{
+                session.beginTransaction();
+                query = session.createQuery("from Query where id= :id");
+                query.setLong("id", model.getQuery().getId());
+                org.hbp.mip.model.Query q = (org.hbp.mip.model.Query) query.uniqueResult();
+                session.getTransaction().commit();
+
+                List<Variable> vars = new LinkedList<>();
+                for (Variable var : q.getVariables()) {
+                    Variable v = new Variable();
+                    v.setCode(var.getCode());
+                    vars.add(v);
+                }
+
+                List<Variable> covs = new LinkedList<>();
+                for (Variable cov : q.getCovariables()) {
+                    Variable v = new Variable();
+                    v.setCode(cov.getCode());
+                    covs.add(v);
+                }
+
+                List<Variable> grps = new LinkedList<>();
+                for (Variable grp : q.getGrouping()) {
+                    Variable v = new Variable();
+                    v.setCode(grp.getCode());
+                    grps.add(v);
+                }
+
+                List<Filter> fltrs = new LinkedList<>();
+                for (Filter fltr : q.getFilters()) {
+                    Filter f = new Filter();
+                    f.setId(fltr.getId());
+                    f.setOperator(fltr.getOperator());
+                    f.setValues(fltr.getValues());
+                    f.setVariable(fltr.getVariable());
+                    fltrs.add(f);
+                }
+
+                org.hbp.mip.model.Query myQuery = new org.hbp.mip.model.Query();
+                myQuery.setId(q.getId());
+                myQuery.setVariables(vars);
+                myQuery.setCovariables(covs);
+                myQuery.setGrouping(grps);
+                myQuery.setFilters(fltrs);
+
+                model.setQuery(myQuery);
+
+                Dataset ds = CSVUtil.parseValues(DATA_FILE, model.getQuery());
+                model.setDataset(ds);
+            } catch (Exception e)
+            {
+                if(session.getTransaction() != null)
+                {
+                    session.getTransaction().rollback();
+                }            }
         }
 
         return new ResponseEntity<Model>(HttpStatus.OK).ok(model);
@@ -214,9 +244,16 @@ public class ModelsApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        session.update(model);
-        session.getTransaction().commit();
+        try{
+            session.beginTransaction();
+            session.update(model);
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<Void>(HttpStatus.OK);
     }
@@ -242,9 +279,17 @@ public class ModelsApi {
 
         // Save model into DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        session.save(model);
-        session.getTransaction().commit();
+        try{
+            session.beginTransaction();
+            session.save(model);
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }
+        }
 
         return new ResponseEntity<Model>(HttpStatus.OK).ok(model);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/StatsApi.java b/src/main/java/org/hbp/mip/controllers/StatsApi.java
index 7138675522f8a0a27db614249ca8d7c6fa199392..e19a548a9b0ea300c8c7872a41f403a806282785 100644
--- a/src/main/java/org/hbp/mip/controllers/StatsApi.java
+++ b/src/main/java/org/hbp/mip/controllers/StatsApi.java
@@ -28,15 +28,27 @@ public class StatsApi {
     public ResponseEntity<GeneralStats> getGeneralStatistics()  {
         GeneralStats stats = new GeneralStats();
 
+
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        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");
-        Long nbUsers = (Long) countUsersQuery.uniqueResult();
-        Long nbArticles = (Long) countArticlesQuery.uniqueResult();
-        Long nbVariables = (Long) countVariablesQuery.uniqueResult();
-        session.getTransaction().commit();
+        Long nbUsers = 0L;
+        Long nbArticles = 0L;
+        Long nbVariables = 0L;
+        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();
+            }
+        }
 
         stats.setUsers(nbUsers);
         stats.setArticles(nbArticles);
diff --git a/src/main/java/org/hbp/mip/controllers/UsersApi.java b/src/main/java/org/hbp/mip/controllers/UsersApi.java
index 63110bc83a27920ca76f48fa593dfee84572b430..c57bf39ee90a2ab3feb6132b25ba0eb563f824bc 100644
--- a/src/main/java/org/hbp/mip/controllers/UsersApi.java
+++ b/src/main/java/org/hbp/mip/controllers/UsersApi.java
@@ -31,11 +31,20 @@ public class UsersApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        org.hibernate.Query query = session.createQuery("from User where username= :username");
-        query.setString("username", username);
-        User user = (User) query.uniqueResult();
-        session.getTransaction().commit();
+        User user = null;
+        try{
+            session.beginTransaction();
+            org.hibernate.Query query = session.createQuery("from User where username= :username");
+            query.setString("username", username);
+            user = (User) query.uniqueResult();
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }
+        }
 
         return new ResponseEntity<User>(HttpStatus.OK).ok(user);
     }
diff --git a/src/main/java/org/hbp/mip/controllers/VariablesApi.java b/src/main/java/org/hbp/mip/controllers/VariablesApi.java
index a6d76a0f529e62a15d195b8fa4451074bdd82ede..e42f75144a21264df7f080abd4de64747e3013c9 100644
--- a/src/main/java/org/hbp/mip/controllers/VariablesApi.java
+++ b/src/main/java/org/hbp/mip/controllers/VariablesApi.java
@@ -6,7 +6,6 @@ package org.hbp.mip.controllers;
 
 
 import io.swagger.annotations.*;
-import org.hbp.mip.model.Group;
 import org.hbp.mip.model.Value;
 import org.hbp.mip.model.Variable;
 import org.hbp.mip.utils.HibernateUtil;
@@ -38,33 +37,19 @@ public class VariablesApi {
             @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isFilter", required = false) String isFilter
     )  {
 
-        // Get variales from DB
+        // Get variables from DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        List<Variable> variables = session.createQuery("from Variable").list();
-        session.getTransaction().commit();
-
-        // Get groups matching grpPath
-        for(Variable v : variables)
+        List<Variable> variables = new LinkedList<>();
+        try{
+            session.beginTransaction();
+            variables = session.createQuery("from Variable").list();
+            session.getTransaction().commit();
+        } catch (Exception e)
         {
-            Group g;
-            Group child = null;
-            for(int i=v.getGrpPath().size()-1; i >= 0; i--) {
-                session = HibernateUtil.getSessionFactory().getCurrentSession();
-                session.beginTransaction();
-                org.hibernate.Query query = session.createQuery("from Group where code= :code");
-                query.setString("code", v.getGrpPath().get(i));
-                g = (Group) query.uniqueResult();
-                session.getTransaction().commit();
-                g.setGroups(new LinkedList<>());
-                if(child != null)
-                {
-                    g.addGroup(child);
-                }
-                child = g.clone();
-            }
-            v.setGroup(child);
-        }
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }        }
 
         return new ResponseEntity<List<Variable>>(HttpStatus.OK).ok(variables);
     }
@@ -78,11 +63,20 @@ public class VariablesApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        org.hibernate.Query query = session.createQuery("from Variable where code= :code");
-        query.setString("code", code);
-        Variable variable = (Variable) query.uniqueResult();
-        session.getTransaction().commit();
+        Variable variable = null;
+        try{
+            session.beginTransaction();
+            org.hibernate.Query query = session.createQuery("from Variable where code= :code");
+            query.setString("code", code);
+            variable = (Variable) query.uniqueResult();
+            session.getTransaction().commit();
+        } catch (Exception e)
+        {
+            if(session.getTransaction() != null)
+            {
+                session.getTransaction().rollback();
+            }
+        }
 
         return new ResponseEntity<Variable>(HttpStatus.OK).ok(variable);
     }
@@ -98,9 +92,18 @@ public class VariablesApi {
 
         // Query DB
         Session session = HibernateUtil.getSessionFactory().getCurrentSession();
-        session.beginTransaction();
-        List<Value> values = session.createQuery("select values from Variable where code= :code").setString("code", code).list();
-        session.getTransaction().commit();
+        List<Value> 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();
+            }
+        }
 
         return new ResponseEntity<List<Value>>(HttpStatus.OK).ok(values);
     }
diff --git a/src/main/java/org/hbp/mip/model/Group.java b/src/main/java/org/hbp/mip/model/Group.java
index d5d61c435b82e3227a50b53f1f180dde597c8806..972b2432952588175df8dd33bee44914482e99b1 100644
--- a/src/main/java/org/hbp/mip/model/Group.java
+++ b/src/main/java/org/hbp/mip/model/Group.java
@@ -4,6 +4,7 @@
 
 package org.hbp.mip.model;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
@@ -16,11 +17,14 @@ import java.util.List;
 @Entity
 @Table(name = "`group`")
 @ApiModel(description = "")
+@JsonIgnoreProperties(value = { "parent" })
 @JsonInclude(JsonInclude.Include.NON_NULL)
 public class Group {
     @Id
     private String code = null;
     private String label = null;
+    @ManyToOne(fetch = FetchType.EAGER)
+    private Group parent = null;
     @OneToMany(fetch = FetchType.EAGER)
     private List<Group> groups = new LinkedList<Group>();
 
@@ -53,6 +57,16 @@ public class Group {
         this.label = label;
     }
 
+    public Group getParent() {
+        return parent;
+    }
+
+    @ApiModelProperty(value = "Parent")
+    @JsonProperty("parent")
+    public void setParent(Group parent) {
+        this.parent = parent;
+    }
+
     /**
      * Groups
      **/
@@ -73,6 +87,7 @@ public class Group {
 
         sb.append("  code: ").append(code).append("\n");
         sb.append("  label: ").append(label).append("\n");
+        sb.append("  parent: ").append(parent).append("\n");
         sb.append("  groups: ").append(groups).append("\n");
         sb.append("}\n");
         return sb.toString();
@@ -87,6 +102,7 @@ public class Group {
         Group g = new Group();
         g.setCode(this.getCode());
         g.setLabel(this.getLabel());
+        g.setParent(this.getParent());
         g.setGroups(this.getGroups());
         return g;
     }
diff --git a/src/main/java/org/hbp/mip/model/Variable.java b/src/main/java/org/hbp/mip/model/Variable.java
index 6cec0b56b1fd09ff30f0d41d164b02e6eec95923..4134988d2ab678908ddc38d97c3b8aa6ad96e81a 100644
--- a/src/main/java/org/hbp/mip/model/Variable.java
+++ b/src/main/java/org/hbp/mip/model/Variable.java
@@ -17,7 +17,7 @@ import java.util.List;
 @Entity
 @Table(name = "`variable`")
 @ApiModel(description = "")
-@JsonIgnoreProperties(value = { "grpPath", "queries" })
+@JsonIgnoreProperties(value = { "queries" })
 @JsonInclude(JsonInclude.Include.NON_NULL)
 public class Variable {
 
@@ -33,8 +33,6 @@ public class Variable {
     private Boolean isGrouping = null;
     private Boolean isCovariable = null;
     private Boolean isFilter = null;
-    @ElementCollection(fetch = FetchType.EAGER)
-    private List<String> grpPath = new LinkedList<>();
     @ManyToOne(fetch = FetchType.EAGER)
     private Group group = null;
     @ManyToMany(fetch = FetchType.EAGER)
@@ -213,19 +211,6 @@ public class Variable {
         this.units = units;
     }
 
-    /**
-     * Group path
-     **/
-    @ApiModelProperty(value = "Group path")
-    @JsonProperty("grpPath")
-    public List<String> getGrpPath() {
-        return grpPath;
-    }
-
-    public void setGrpPath(List<String> grpPath) {
-        this.grpPath = grpPath;
-    }
-
     public List<Query> getQueries() {
         return queries;
     }
diff --git a/src/test/db b/src/test/db
index f7196ec2fe8a16006fd990f58a0bba5219c0b89f..f14bdeddf4e4c3a7af9271e8637ee064282da6a0 160000
--- a/src/test/db
+++ b/src/test/db
@@ -1 +1 @@
-Subproject commit f7196ec2fe8a16006fd990f58a0bba5219c0b89f
+Subproject commit f14bdeddf4e4c3a7af9271e8637ee064282da6a0