diff --git a/.gitignore b/.gitignore
index 39744ba452acdf35cfd6316836a0611b4c1bcd65..240a234c67bd834019d85ee7ac27333447500a99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,6 @@
 
 target/
 .idea/
-*.properties
 *.iml
 bin/
 .settings/
diff --git a/Album.pdf b/Album.pdf
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/import.sql.gz b/import.sql.gz
new file mode 100644
index 0000000000000000000000000000000000000000..2c41c2ac96e5fbf1dd76445483ac3b601e3b96d9
Binary files /dev/null and b/import.sql.gz differ
diff --git a/src/main/java/NTNU/IDATT1002/App.java b/src/main/java/NTNU/IDATT1002/App.java
index 6441e9b91663087bc2fe7587c770008003f41b96..fb11cd8b0cecf4eba770e6b36b59facc550e194b 100644
--- a/src/main/java/NTNU/IDATT1002/App.java
+++ b/src/main/java/NTNU/IDATT1002/App.java
@@ -1,8 +1,8 @@
 package NTNU.IDATT1002;
 
 import NTNU.IDATT1002.controllers.DataExchange;
+import NTNU.IDATT1002.database.EntityManagerConfig;
 import javafx.application.Application;
-import javafx.application.HostServices;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
@@ -14,13 +14,14 @@ import java.io.IOException;
 public class App extends Application {
 
     public static DataExchange ex;
-    public static HostServices hostServices;
     private static Scene scene;
 
     @Override
     public void start(Stage stage) throws IOException {
         ex = new DataExchange();
         ex.setHostServices(getHostServices());
+        ex.setEntityManager(EntityManagerConfig.getEntityManager());
+
         scene = new Scene(loadFXML("login"));
         stage.setMaximized(true);
         stage.setScene(scene);
diff --git a/src/main/java/NTNU/IDATT1002/ApplicationState.java b/src/main/java/NTNU/IDATT1002/ApplicationState.java
index 1b65e202df36017b0564711d806e4af00f0b8767..cc727dcaa48d7e397c8ece1723e2e3f5fff2be11 100644
--- a/src/main/java/NTNU/IDATT1002/ApplicationState.java
+++ b/src/main/java/NTNU/IDATT1002/ApplicationState.java
@@ -1,12 +1,11 @@
 package NTNU.IDATT1002;
 
 
+import NTNU.IDATT1002.database.EntityManagerConfig;
 import NTNU.IDATT1002.models.User;
 import NTNU.IDATT1002.repository.UserRepository;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
 
 /**
  * Class Application State. Keeps a record of the global application state, such as the current logged in user.
@@ -29,8 +28,7 @@ public final class ApplicationState {
      * Initiate properties and save an anonymous user once.
      */
     static {
-        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication");
-        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        EntityManager entityManager = EntityManagerConfig.getEntityManager();
 
         userRepository = new UserRepository(entityManager);
     }
diff --git a/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java b/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java
index 09681920fe8fa585550f9b92092830c71b54b209..54ef33fa2a52e51325520715a59f84b2c1c6eef8 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java
@@ -13,6 +13,7 @@ import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.GridPane;
 import javafx.scene.layout.Pane;
 
+import javax.persistence.EntityManager;
 import java.io.IOException;
 
 /**
@@ -39,7 +40,8 @@ public class CreateAlbum {
     private ImageAlbumService imageAlbumService;
 
     public CreateAlbum() {
-        imageAlbumService = new ImageAlbumService();
+        EntityManager entityManager = App.ex.getEntityManager();
+        imageAlbumService = new ImageAlbumService(entityManager);
     }
 
     /**
diff --git a/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java b/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java
index 8e3f78d487b29e9842af7930125bce080542b77e..3a44807b958285650c2141748d414c7fc76769d2 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java
@@ -2,6 +2,7 @@ package NTNU.IDATT1002.controllers;
 
 import javafx.application.HostServices;
 
+import javax.persistence.EntityManager;
 import java.io.File;
 import java.util.List;
 
@@ -12,6 +13,7 @@ import java.util.List;
  */
 public class DataExchange {
 
+    private EntityManager entityManager;
     public HostServices hostServices;
     private String searchField;
     private List<File> uploadedFiles;
@@ -22,6 +24,10 @@ public class DataExchange {
         searchField = "";
     }
 
+    public EntityManager getEntityManager() {
+        return entityManager;
+    }
+
     public HostServices getHostServices() {
         return hostServices;
     }
@@ -42,6 +48,10 @@ public class DataExchange {
         return chosenImg;
     }
 
+    public void setEntityManager(EntityManager entityManager) {
+        this.entityManager = entityManager;
+    }
+
     public void setHostServices(HostServices hostServices) {
         this.hostServices = hostServices;
     }
diff --git a/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java b/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java
index a545a48ed548dbe5acd247dbaa2a6834de17770f..4ad548577cef5327884738d1db06f9ac67e519da 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java
@@ -21,6 +21,7 @@ import javafx.scene.shape.StrokeType;
 import javafx.scene.text.Font;
 import javafx.scene.text.Text;
 
+import javax.persistence.EntityManager;
 import java.io.IOException;
 import java.net.URL;
 import java.util.List;
@@ -64,7 +65,8 @@ public class ExploreAlbums implements Initializable {
     private ImageAlbumService imageAlbumService;
 
     public ExploreAlbums() {
-        imageAlbumService = new ImageAlbumService();
+        EntityManager entityManager = App.ex.getEntityManager();
+        imageAlbumService = new ImageAlbumService(entityManager);
     }
 
     /**
diff --git a/src/main/java/NTNU/IDATT1002/controllers/Login.java b/src/main/java/NTNU/IDATT1002/controllers/Login.java
index 0e3aa8cfcbf3bc691447dc1f6d7aab785ffa7fd7..58c331dd1209c0661fded156c6548c36baf01987 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/Login.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/Login.java
@@ -1,17 +1,14 @@
 package NTNU.IDATT1002.controllers;
 
-import java.io.IOException;
-
 import NTNU.IDATT1002.App;
-import NTNU.IDATT1002.ApplicationState;
-import NTNU.IDATT1002.models.User;
 import NTNU.IDATT1002.service.UserService;
 import javafx.event.ActionEvent;
 import javafx.scene.control.Button;
 import javafx.scene.control.PasswordField;
 import javafx.scene.control.TextField;
 
-import javax.security.auth.login.FailedLoginException;
+import javax.persistence.EntityManager;
+import java.io.IOException;
 
 /**
  * Controls the buttons and changeable elements on login.fxml,
@@ -27,6 +24,11 @@ public class Login {
     public Button login;
     private UserService userService;
 
+    public Login() {
+        EntityManager entityManager = App.ex.getEntityManager();
+        userService = new UserService(entityManager);
+    }
+
     /**
      * Method that changes scene to Sign Up page
      * @param actionEvent
@@ -42,7 +44,6 @@ public class Login {
      * @throws IOException
      */
     public void login(ActionEvent actionEvent) throws IOException {
-        userService = new UserService();
         String username = Username.getText();
         String password = Password.getText();
         if(userService.logIn(username, password)) {
diff --git a/src/main/java/NTNU/IDATT1002/controllers/SignUp.java b/src/main/java/NTNU/IDATT1002/controllers/SignUp.java
index 2b8cc0eafd54ed287139a02d5e3db0cf0b19b1be..f1b932ef9a554afcb779bcdd811a14d603f77b08 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/SignUp.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/SignUp.java
@@ -1,11 +1,6 @@
 package NTNU.IDATT1002.controllers;
 
-import java.io.IOException;
-import java.util.Date;
-import java.util.Optional;
-
 import NTNU.IDATT1002.App;
-import NTNU.IDATT1002.models.User;
 import NTNU.IDATT1002.service.UserService;
 import javafx.event.ActionEvent;
 import javafx.scene.control.Button;
@@ -14,6 +9,10 @@ import javafx.scene.control.PasswordField;
 import javafx.scene.control.TextField;
 import javafx.scene.layout.GridPane;
 
+import javax.persistence.EntityManager;
+import java.io.IOException;
+import java.util.Date;
+
 /**
  * Controls the buttons and changeable elements on signup.fxml,
  * a page where you create a new user for the application
@@ -30,10 +29,16 @@ public class SignUp {
     public TextField signup_phoneCode;
     public TextField signup_phoneNr;
     public DatePicker signup_birthDate;
-    public UserService userService = new UserService();
+
+    public UserService userService;
 
     public Button signup_btn;
 
+    public SignUp() {
+        EntityManager entityManager = App.ex.getEntityManager();
+        userService = new UserService(entityManager);
+    }
+
     /**
      * Method that changes scene to Login
      * @param actionEvent
diff --git a/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java b/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java
index 52ac87342708a859fb86c3491ed52e0a9de1864d..63ab9e2616b8cbdc4b22e2434027f02b845d8ec8 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java
@@ -13,6 +13,7 @@ import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.input.MouseEvent;
 
+import javax.persistence.EntityManager;
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
@@ -55,8 +56,13 @@ public class UploadedSingle implements Initializable {
    * @param resources
    */
   public void initialize(URL location, ResourceBundle resources) {
-    photo_image.setImage(new Image(App.ex.getUploadedFiles().get(0).toURI().toString()));
-    imageService = new ImageService();
+    photo_image.setImage(new Image(App.ex.getUploadedFiles()
+            .get(0)
+            .toURI()
+            .toString()));
+
+    EntityManager entityManager = App.ex.getEntityManager();
+    imageService = new ImageService(entityManager);
   }
 
   /**
diff --git a/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java b/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java
index 9003f14bb5c5a74124f1c7c463ee29e75e60aa95..ce82b27642124178a59f9bd90619ca99a2de4d31 100644
--- a/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java
+++ b/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java
@@ -21,6 +21,7 @@ import javafx.scene.text.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.persistence.EntityManager;
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
@@ -70,9 +71,13 @@ public class ViewAlbum implements Initializable {
     private ImageAlbumService imageAlbumService;
     private Long currentAlbumId;
 
+    private Logger logger;
+
     public ViewAlbum() {
-        imageAlbumService = new ImageAlbumService();
+        EntityManager entityManager = App.ex.getEntityManager();
+        this.imageAlbumService =  new ImageAlbumService(entityManager);
         currentAlbumId = App.ex.getChosenAlbumId();
+        logger = LoggerFactory.getLogger("ImageApplicationLogger");
     }
 
     /**
diff --git a/src/main/java/NTNU/IDATT1002/database/EntityManagerConfig.java b/src/main/java/NTNU/IDATT1002/database/EntityManagerConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..22d6059a579179ba1945809e05bb7c9fab33a5cc
--- /dev/null
+++ b/src/main/java/NTNU/IDATT1002/database/EntityManagerConfig.java
@@ -0,0 +1,97 @@
+package NTNU.IDATT1002.database;
+
+import org.hibernate.cfg.Environment;
+
+import javax.persistence.*;
+import java.util.*;
+
+
+/**
+ * Entity Manager Configuration Singleton for overriding hibernate persistence properties.
+ * Provides a single global access point to the applications entity manager.
+ */
+public class EntityManagerConfig {
+
+    private static EntityManager entityManager;
+    private static Map<String, Object> configOverrides = new HashMap<>();
+    private static Properties properties = Environment.getProperties();
+
+
+    private EntityManagerConfig() {
+    }
+
+    /**
+     * Retrieve the entity manager instance.
+     * An entity manager is not created until it is requested.
+     *
+     * @return an entity manager instance
+     */
+    public static EntityManager getEntityManager() {
+        if (entityManager == null)
+            configureEntityManager();
+
+        return entityManager;
+    }
+
+    /**
+     * Parse properties and create the entity manager
+     */
+    private static void configureEntityManager() {
+        if (shouldOverrideConfig())
+            parseConfigProperties();
+
+        createEntityManager();
+    }
+
+    private static boolean shouldOverrideConfig() {
+        return Boolean.parseBoolean((String) properties.get("OVERRIDE_DEFAULT_DB_CONFIG"));
+    }
+
+    /**
+     * Parse properties from resources/hibernate.properties and overrides found values.
+     */
+    private static void parseConfigProperties() {
+        Set<Object> envKeys = properties.keySet();
+
+        for (Object key : envKeys)
+            parseProperty(key);
+    }
+
+    /**
+     * Parse desired values from given key in properties and add them to the configuration overrides.
+     *
+     * @param key the key to parse
+     */
+    private static void parseProperty(Object key) {
+        switch ((String) key) {
+            case "DB_DRIVER":
+                configOverrides.put("javax.persistence.jdbc.driver", properties.get(key));
+                break;
+            case "DB_URL":
+                configOverrides.put("javax.persistence.jdbc.url", properties.get(key));
+                break;
+            case "DB_USER":
+                configOverrides.put("javax.persistence.jdbc.user", properties.get(key));
+                break;
+            case "DB_PASSWORD":
+                configOverrides.put("javax.persistence.jdbc.password", properties.get(key));
+                break;
+            case "DB_DIALECT":
+                configOverrides.put("hibernate.dialect", properties.get(key));
+                break;
+            case "DB_HBM2DDL":
+                configOverrides.put("hibernate.hbm2ddl.auto", properties.get(key));
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Create an entity manager with configurations overrides.
+     */
+    private static void createEntityManager() {
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory("ImageApplication", configOverrides);
+        entityManager = emf.createEntityManager();
+    }
+}
diff --git a/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java b/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java
index 769283e4e9c78a4c7f2dd6b84e64b170789720ad..ed1ac5a4bbe33a204296b331385a5c4f25ac0822 100644
--- a/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java
+++ b/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java
@@ -7,6 +7,7 @@ import NTNU.IDATT1002.service.ImageAlbumService;
 import NTNU.IDATT1002.service.ImageService;
 import NTNU.IDATT1002.service.UserService;
 
+import javax.persistence.EntityManager;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -23,9 +24,11 @@ public class LoadDatabase {
     private static ImageService imageService;
 
     static {
-        userService = new UserService();
-        imageAlbumService = new ImageAlbumService();
-        imageService = new ImageService();
+        EntityManager entityManager = EntityManagerConfig.getEntityManager();
+
+        userService = new UserService(entityManager);
+        imageAlbumService = new ImageAlbumService(entityManager);
+        imageService = new ImageService(entityManager);
     }
 
     public static void load() {
diff --git a/src/main/java/NTNU/IDATT1002/models/GeoLocation.java b/src/main/java/NTNU/IDATT1002/models/GeoLocation.java
index 39e282c8e1c35e86aeff26124d0c469d8cca7beb..b5404e32ba77710c6ac413cd3b754783edacfb1c 100644
--- a/src/main/java/NTNU/IDATT1002/models/GeoLocation.java
+++ b/src/main/java/NTNU/IDATT1002/models/GeoLocation.java
@@ -23,7 +23,7 @@ public class GeoLocation {
      * One to one relation between geolocationId in table Geolocation
      * Joins column geolocation_id in metadata
      */
-    @OneToOne(mappedBy = "geolocation")
+    @OneToOne(mappedBy = "geolocation", fetch = FetchType.LAZY)
     private Metadata metadata;
 
     @NotBlank (message = "Altitude may not be blank")
diff --git a/src/main/java/NTNU/IDATT1002/models/Histogram.java b/src/main/java/NTNU/IDATT1002/models/Histogram.java
index c6e74f902a261f81dd9d208b4a1e6635b4424c2d..770a6aa48f8bc9a533f927893b2ba10d8f5eac22 100644
--- a/src/main/java/NTNU/IDATT1002/models/Histogram.java
+++ b/src/main/java/NTNU/IDATT1002/models/Histogram.java
@@ -23,7 +23,7 @@ public class Histogram {
      * One to one relations, joins histogramId
      * On columns histogramId in metadata
      */
-    @OneToOne(mappedBy = "histogram")
+    @OneToOne(mappedBy = "histogram", fetch = FetchType.LAZY)
     private Metadata metadata;
 
     @Lob
diff --git a/src/main/java/NTNU/IDATT1002/models/Image.java b/src/main/java/NTNU/IDATT1002/models/Image.java
index 4b025ee3e42db5fc7c613556ddcb409b32e0a4bb..3559ee784c8b51f0e053a0ec7402243e518663a0 100644
--- a/src/main/java/NTNU/IDATT1002/models/Image.java
+++ b/src/main/java/NTNU/IDATT1002/models/Image.java
@@ -24,13 +24,13 @@ public class Image {
   @GeneratedValue
   private Long id;
 
-  @ManyToMany
+  @ManyToMany(fetch = FetchType.LAZY)
   private List<ImageAlbum> imageAlbums = new ArrayList<>();
 
-  @ManyToMany
+  @ManyToMany(fetch = FetchType.LAZY)
   private List<Tag> tags = new ArrayList<>();
 
-  @ManyToOne
+  @ManyToOne(fetch = FetchType.LAZY)
   private User user;
 
   @Lob
@@ -38,7 +38,7 @@ public class Image {
   @NotEmpty
   private byte[] rawImage;
 
-  @OneToOne(cascade = CascadeType.ALL)
+  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   private Metadata metadata;
 
   @NotBlank
diff --git a/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java b/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java
index 8607b3448154adc7dade24062a54c172acba0463..21ac9a4c7157ee12198fa9e1827831d2c0a2eb48 100644
--- a/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java
+++ b/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java
@@ -32,13 +32,13 @@ public class ImageAlbum {
     @NotBlank(message = "Title may not be blank")
     private String title;
 
-    @ManyToOne
+    @ManyToOne(fetch = FetchType.LAZY)
     private User user;
 
-    @ManyToMany
+    @ManyToMany(fetch = FetchType.LAZY)
     private List<Image> images = new ArrayList<>();;
 
-    @ManyToMany
+    @ManyToMany(fetch = FetchType.LAZY)
     private List<Tag> tags = new ArrayList<>();;
 
     private String description;
diff --git a/src/main/java/NTNU/IDATT1002/models/Login.java b/src/main/java/NTNU/IDATT1002/models/Login.java
index 00e7c3f03ed5e51c7a0023d27062e97586bd81eb..2f3af4129a63c6a49c257ca3618bc3a32e16291e 100644
--- a/src/main/java/NTNU/IDATT1002/models/Login.java
+++ b/src/main/java/NTNU/IDATT1002/models/Login.java
@@ -1,10 +1,7 @@
 package NTNU.IDATT1002.models;
 
-import org.hibernate.annotations.NaturalId;
-
 import javax.persistence.*;
 import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
 
 @Entity
 @Table(name = "login")
@@ -16,7 +13,7 @@ public class Login {
     private String username;
 
 
-    @OneToOne(cascade = {CascadeType.ALL})
+    @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
     private User user;
 
     @NotBlank(message = "Hash salt may not be blank")
diff --git a/src/main/java/NTNU/IDATT1002/models/Metadata.java b/src/main/java/NTNU/IDATT1002/models/Metadata.java
index 45adbc7280f159fc52edd64f3e0b1621caed7c1d..b28d6e58c50d4d96c71e8e8cbcb87e8a7c69d967 100644
--- a/src/main/java/NTNU/IDATT1002/models/Metadata.java
+++ b/src/main/java/NTNU/IDATT1002/models/Metadata.java
@@ -22,13 +22,13 @@ public class Metadata {
      * One to one relation joining imageId
      * on image_id column in image
      */
-    @OneToOne(mappedBy = "metadata")
+    @OneToOne(mappedBy = "metadata", fetch = FetchType.LAZY)
     private Image image;
 
-    @OneToOne(cascade = CascadeType.ALL)
+    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     private GeoLocation geolocation;
 
-    @OneToOne(cascade = CascadeType.ALL)
+    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     private Histogram histogram;
 
     public Metadata() {
diff --git a/src/main/java/NTNU/IDATT1002/models/Tag.java b/src/main/java/NTNU/IDATT1002/models/Tag.java
index ccde4ddbab3aa873bfbb0d6a97a4a04360d3fa61..3545e6c38b0173e5bc2894c309700bce649d7f47 100644
--- a/src/main/java/NTNU/IDATT1002/models/Tag.java
+++ b/src/main/java/NTNU/IDATT1002/models/Tag.java
@@ -33,7 +33,7 @@ public class Tag {
      * Creates a many to many relations between tag and image
      * on table ImageTags, joining column tagId and imageId
      */
-    @ManyToMany(cascade = {CascadeType.ALL})
+    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
     @JoinTable(
             name = "image_tag",
             joinColumns = {@JoinColumn(name = "tag_id")},
@@ -44,7 +44,7 @@ public class Tag {
     /**
      * Creates a many to many relations between tag and image album
      */
-    @ManyToMany(cascade = {CascadeType.ALL})
+    @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
     @JoinTable(
             name = "image_album_tags",
             joinColumns = {@JoinColumn(name = "tag_id")},
diff --git a/src/main/java/NTNU/IDATT1002/models/User.java b/src/main/java/NTNU/IDATT1002/models/User.java
index 256ad9b1703f86925a620e666f77992cb96be4ae..9e055b5721c4efe5edfc107fc5f43b3552aa9fea 100644
--- a/src/main/java/NTNU/IDATT1002/models/User.java
+++ b/src/main/java/NTNU/IDATT1002/models/User.java
@@ -41,14 +41,16 @@ public class User {
     @OneToMany(
             mappedBy = "user",
             cascade = CascadeType.ALL,
-            orphanRemoval = true
+            orphanRemoval = true,
+            fetch = FetchType.LAZY
     )
     private List<ImageAlbum> imageAlbums = new ArrayList<>();
 
     @OneToMany(
             mappedBy = "user",
             cascade = CascadeType.ALL,
-            orphanRemoval = true
+            orphanRemoval = true,
+            fetch = FetchType.LAZY
     )
     private List<Image> images = new ArrayList<>();
 
diff --git a/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java b/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java
index 3ea88d385972e72c6fb54d3e79708ddfeb7cb0d9..d5b5cd0ee9bb746561cc8ea71038769a64393dfc 100644
--- a/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java
+++ b/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java
@@ -1,16 +1,14 @@
 package NTNU.IDATT1002.service;
 
+import NTNU.IDATT1002.filters.ImageAlbumFilter;
 import NTNU.IDATT1002.models.Image;
 import NTNU.IDATT1002.models.ImageAlbum;
 import NTNU.IDATT1002.models.Tag;
 import NTNU.IDATT1002.models.User;
 import NTNU.IDATT1002.repository.ImageAlbumRepository;
 import NTNU.IDATT1002.repository.TagRepository;
-import NTNU.IDATT1002.filters.ImageAlbumFilter;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -36,10 +34,7 @@ public class ImageAlbumService {
     /**
      * Inject entity manager instance to the repositories.
      */
-    public ImageAlbumService() {
-        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication");
-        EntityManager entityManager = entityManagerFactory.createEntityManager();
-
+    public ImageAlbumService(EntityManager entityManager) {
         this.imageAlbumRepository = new ImageAlbumRepository(entityManager);
         this.tagRepository = new TagRepository(entityManager);
     }
diff --git a/src/main/java/NTNU/IDATT1002/service/ImageService.java b/src/main/java/NTNU/IDATT1002/service/ImageService.java
index 1bd1dd7e84ac05ed76030bac69a831800f6329dc..dfcc355f5ca1e3eae211b396191deacbf7e3b437 100644
--- a/src/main/java/NTNU/IDATT1002/service/ImageService.java
+++ b/src/main/java/NTNU/IDATT1002/service/ImageService.java
@@ -1,13 +1,11 @@
 package NTNU.IDATT1002.service;
+import NTNU.IDATT1002.filters.ImageFilter;
 import NTNU.IDATT1002.models.*;
 import NTNU.IDATT1002.repository.*;
-import NTNU.IDATT1002.filters.ImageFilter;
 import NTNU.IDATT1002.utils.ImageUtil;
 import NTNU.IDATT1002.utils.MetaDataExtractor;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -32,17 +30,13 @@ public class ImageService {
     /**
      * Inject entity manager instance to the repositories.
      */
-    public ImageService() {
-        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication");
-        EntityManager entityManager = entityManagerFactory.createEntityManager();
-
+    public ImageService(EntityManager entityManager) {
         this.imageRepository = new ImageRepository(entityManager);
         this.metadataRepository = new MetadataRepository(entityManager);
         this.tagRepository = new TagRepository(entityManager);
         this.historgramRepository = new HistorgramRepository(entityManager);
         this.geoLocatioRepository = new GeoLocatioRepository(entityManager);
         this.metaDataExtractor = new MetaDataExtractor();
-
     }
 
     /**
diff --git a/src/main/java/NTNU/IDATT1002/service/UserService.java b/src/main/java/NTNU/IDATT1002/service/UserService.java
index e14166e242b46f8ff208914ec753f484743da50b..0a5046fbbe68d113c89d8810ac6d90b9767c6f19 100644
--- a/src/main/java/NTNU/IDATT1002/service/UserService.java
+++ b/src/main/java/NTNU/IDATT1002/service/UserService.java
@@ -1,17 +1,13 @@
 package NTNU.IDATT1002.service;
 
-import NTNU.IDATT1002.App;
 import NTNU.IDATT1002.ApplicationState;
 import NTNU.IDATT1002.models.Login;
 import NTNU.IDATT1002.models.User;
 import NTNU.IDATT1002.repository.LoginRepository;
 import NTNU.IDATT1002.repository.UserRepository;
 import NTNU.IDATT1002.utils.Authentication;
-import org.apache.log4j.helpers.AbsoluteTimeDateFormat;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Optional;
@@ -30,10 +26,7 @@ public class UserService {
     /**
      * Inject entity manager instance to the repositories
      */
-    public UserService() {
-        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication");
-        EntityManager entityManager = entityManagerFactory.createEntityManager();
-
+    public UserService(EntityManager entityManager) {
         this.loginRepository = new LoginRepository(entityManager);
         this.userRepository = new UserRepository(entityManager);
     }
diff --git a/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java b/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java
index 04236251eef235d91de98c707b13d61e68c1f7a7..7f87611d7bf3ee460178f424398576dd6ccf39b4 100644
--- a/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java
+++ b/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java
@@ -1,5 +1,6 @@
 package NTNU.IDATT1002.utils;
 
+import NTNU.IDATT1002.database.EntityManagerConfig;
 import NTNU.IDATT1002.models.GeoLocation;
 import NTNU.IDATT1002.models.Histogram;
 import NTNU.IDATT1002.repository.GeoLocatioRepository;
@@ -11,8 +12,6 @@ import com.drew.metadata.MetadataException;
 import com.drew.metadata.exif.GpsDirectory;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
 import java.io.File;
 import java.io.IOException;
 
@@ -26,8 +25,7 @@ public class MetaDataExtractor {
     private HistorgramRepository historgramRepository;
 
     public MetaDataExtractor() {
-        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication");
-        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        EntityManager entityManager = EntityManagerConfig.getEntityManager();
 
         this.historgramRepository = new HistorgramRepository(entityManager);
         this.geoLocationRepository = new GeoLocatioRepository(entityManager);
diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1c3c5a0e157d86a48cb83f91363d52030ca119a5
--- /dev/null
+++ b/src/main/resources/hibernate.properties
@@ -0,0 +1,10 @@
+# Set this value to true if you want to configure another connection
+OVERRIDE_DEFAULT_DB_CONFIG=false
+
+# These values correspond to database hosted on https://www.digitalocean.com/
+DB_DRIVER=com.mysql.cj.jdbc.Driver
+DB_URL=jdbc:mysql://db-mysql-lon1-07155-do-user-7212587-0.a.db.ondigitalocean.com:25060/image_application
+DB_USER=doadmin
+DB_PASSWORD=s4oxtqu20e8r7tx5
+DB_DIALECT=org.hibernate.dialect.MySQL8Dialect
+DB_HBM2DDL=update
\ No newline at end of file
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f45db84340e0458b08c7bafb5d8bc369d6d6954b
--- /dev/null
+++ b/src/main/resources/log4j.properties
@@ -0,0 +1,14 @@
+# Direct to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+# Root logger option
+log4j.rootLogger=INFO, stdout
+
+# Good for troubleshooting
+log4j.logger.org.hibernate=INFO
+
+# Log JDBC parameters
+log4j.logger.org.hibernate.type=ALL
diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml
index faa2397fdab90f715b0a4a2f4249fa0e45d454dc..96f44517573251e8b589872d07e3b378481394dc 100644
--- a/src/test/resources/META-INF/persistence.xml
+++ b/src/test/resources/META-INF/persistence.xml
@@ -30,7 +30,7 @@
             <property name="hibernate.use_sql_comments" value="true"/>
 
             <!-- Create tables on startup -->
-            <property name="hibernate.hbm2ddl.auto" value="create" />
+            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
         </properties>
     </persistence-unit>
 </persistence>
\ No newline at end of file