diff --git a/src/main/java/org/hbp/mip/data/Database.java b/src/main/java/org/hbp/mip/data/Database.java
index 3942c9cbef8eea7bd4525ef18624cb2dd7e22aca..89794187327ed39e2072a23933aa34118eb810d6 100644
--- a/src/main/java/org/hbp/mip/data/Database.java
+++ b/src/main/java/org/hbp/mip/data/Database.java
@@ -1,13 +1,19 @@
 package org.hbp.mip.data;
 
 import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import org.hbp.mip.controllers.HibernateUtil;
 import org.hbp.mip.model.Group;
+import org.hbp.mip.model.Value;
+import org.hbp.mip.model.Variable;
 import org.hibernate.Session;
 
-import java.io.*;
+import java.io.IOException;
+import java.lang.reflect.Type;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * Created by mirco on 11.01.16.
@@ -19,17 +25,9 @@ public class Database {
 
     public static void loadGroups() {
         // Read data from file
-        String inputFile = GROUPS_SRC;
-        File f = new File(inputFile);
-        FileReader fr;
-        BufferedReader br;
         String data = "";
         try {
-            fr = new FileReader(f);
-            br = new BufferedReader(fr);
             data = new String(Files.readAllBytes(Paths.get(GROUPS_SRC)));
-            br.close();
-            fr.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -46,22 +44,70 @@ public class Database {
     }
 
     public static void loadVariables() {
+        // Read data from file
+        String data = "";
+        try {
+            data = new String(Files.readAllBytes(Paths.get(VARIABLES_SRC)));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
 
-        String inputFile = VARIABLES_SRC;
+        // Parse JSON
+        Gson gson = new Gson();
+        Type listVariablesType = new TypeToken<LinkedList<Variable>>(){}.getType();
+        List<Variable> variables = gson.fromJson(data, listVariablesType);
 
-        File f = new File(inputFile);
-        FileReader fr;
-        BufferedReader br;
+        // Sync groups and values with DB
+        for(Variable v : variables)
+        {
+            Group g = v.getGroup();
+            if(g != null)
+            {
+                v.setGroup(readGroupFromDB(g.getCode()));
+            }
+            List<Value> newValues = new LinkedList<>();
+            for(Value val : v.getValues())
+            {
+                Value existingVal = readValueFromDB(val.getCode());
+                if(existingVal == null)
+                {
+                    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+                    session.beginTransaction();
+                    session.save(val);
+                    session.getTransaction().commit();
+                    existingVal = val;
+                }
+                newValues.add(existingVal);
+            }
+            v.setValues(newValues);
+        }
 
-        try {
-            fr = new FileReader(f);
-            br = new BufferedReader(fr);
+        // Insert into DB
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        variables.forEach(session::save);
+        session.getTransaction().commit();
+    }
 
-            br.close();
-            fr.close();
+    private static Group readGroupFromDB(String code)
+    {
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        org.hibernate.Query query = session.createQuery("from Group where code= :code");
+        query.setString("code", code);
+        Group group = (Group) query.uniqueResult();
+        session.getTransaction().commit();
+        return group;
+    }
 
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+    private static Value readValueFromDB(String code)
+    {
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        org.hibernate.Query query = session.createQuery("from Value where code= :code");
+        query.setString("code", code);
+        Value value = (Value) query.uniqueResult();
+        session.getTransaction().commit();
+        return value;
     }
 }
diff --git a/src/main/java/org/hbp/mip/model/Article.java b/src/main/java/org/hbp/mip/model/Article.java
index 49b8bb3bfc2eb5afbcf8c318d1af21d4e345cbb4..1556239706bc07240be0e834675ae2f17505d1aa 100644
--- a/src/main/java/org/hbp/mip/model/Article.java
+++ b/src/main/java/org/hbp/mip/model/Article.java
@@ -37,7 +37,7 @@ public class Article {
     private User createdBy = null;
     @ManyToOne
     private User updatedBy = null;
-    @ManyToMany(fetch = FetchType.EAGER)
+    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
     private List<Tag> tags = new LinkedList<Tag>();
 
     public Article() {
diff --git a/src/main/java/org/hbp/mip/model/Variable.java b/src/main/java/org/hbp/mip/model/Variable.java
index 267bedbcd4cb1d388ac9b4e29c38da8296060a4c..08c8d97ff4c8ee4b43fd5182182bbdd2705bc53b 100644
--- a/src/main/java/org/hbp/mip/model/Variable.java
+++ b/src/main/java/org/hbp/mip/model/Variable.java
@@ -22,7 +22,7 @@ public class Variable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id = null;
-    @ManyToOne
+    @ManyToOne(fetch = FetchType.EAGER)
     private Group group = null;
     @Column(unique = true)
     private String code = null;
@@ -32,7 +32,7 @@ public class Variable {
     private Boolean isVariable = null;
     private Boolean isGrouping = null;
     private Boolean isFilter = null;
-    @ManyToMany
+    @ManyToMany(fetch = FetchType.EAGER)
     private List<Value> values = new LinkedList<Value>();
 
     public Variable() {