diff --git a/src/main/java/NTNU/IDATT1002/models/GeoLocation.java b/src/main/java/NTNU/IDATT1002/models/GeoLocation.java
new file mode 100644
index 0000000000000000000000000000000000000000..23c75bd08f256fe9c8e6a8bf7cdcfe8cd09cc019
--- /dev/null
+++ b/src/main/java/NTNU/IDATT1002/models/GeoLocation.java
@@ -0,0 +1,84 @@
+package NTNU.IDATT1002.models;
+
+
+import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Creates table Geolocation
+ */
+
+@Entity
+@Table(name = "Geolocation")
+public class GeoLocation {
+
+    /**
+     * Defines geolocationId, this may not be blank
+     */
+
+    @Id @NotBlank(message = "Geolocation-Id may not be blank")
+    private int geoLocationId;
+
+    /**
+     * One to one relation between geolocationId in table Geolocation
+     * Joins column geolocation_id in metadata
+     */
+
+    @OneToOne
+    @JoinColumn(name = "metadata_id")
+    private Metadata metadata;
+
+    @NotBlank (message = "Altitude may not be blank")
+    private String altitude;
+
+    @NotBlank (message = "Longditude may not be blank")
+    private String longditude;
+
+    /**
+     * Creates constructor for geolocation that takes in each parameter
+     * @param geoLocationId
+     * @param altitude
+     * @param longditude
+     */
+
+    public GeoLocation(int geoLocationId, String altitude, String longditude){
+        this.geoLocationId = geoLocationId;
+        this.altitude = altitude;
+        this.longditude = longditude;
+    }
+
+    /**
+     *  Another constructor that takes in one geolocation, and uses get-methods to define parameters
+     * @param geoLocation
+     */
+
+    public GeoLocation(GeoLocation geoLocation){
+        this(geoLocation.getGeoLocationId(),
+               geoLocation.getAltitude(),
+                geoLocation.getLongditude());
+    }
+
+    public int getGeoLocationId() {
+        return geoLocationId;
+    }
+
+    public String getAltitude() {
+        return altitude;
+    }
+
+    public String getLongditude() {
+        return longditude;
+    }
+
+    public void setGeoLocationId(int geoLocationId) {
+        this.geoLocationId = geoLocationId;
+    }
+
+    public void setAltitude(String altitude) {
+        this.altitude = altitude;
+    }
+
+    public void setLongditude(String longditude) {
+        this.longditude = longditude;
+    }
+}
diff --git a/src/main/java/NTNU/IDATT1002/models/Histogram.java b/src/main/java/NTNU/IDATT1002/models/Histogram.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e84bdc9f0d7cc7e898200a721025e25bf49ce8b
--- /dev/null
+++ b/src/main/java/NTNU/IDATT1002/models/Histogram.java
@@ -0,0 +1,79 @@
+package NTNU.IDATT1002.models;
+
+
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Creates histogram table
+ */
+
+@Entity
+@Table(name = "Histogram")
+public class Histogram {
+
+    /**
+     * Defines id, may not be blank
+     */
+
+    @Id @NotBlank(message = "HistogramId may not be blank")
+    private int histogramId;
+
+    /**
+     * One to one relations, joins histogramId
+     * On columns histogram_id in metadata
+     */
+
+    @OneToOne
+    @JoinColumn(name = "metadata_id")
+    private Metadata metadata;
+
+    @NotBlank (message = "Data may not be blank")
+    private String data;
+
+    /**
+     * Constrtuctor for Histogram, taking in both histogramId and data
+     * @param histogramId
+     * @param data
+     */
+
+
+    public Histogram(int histogramId , String data){
+        this.histogramId = histogramId;
+        this.data = data;
+    }
+
+    /**
+     * Constructor taking in a histogram object as parameter
+     * @param histogram
+     */
+
+    public Histogram(Histogram histogram){
+        this(histogram.getHistogramId(),
+               histogram.getData());
+    }
+
+    public int getHistogramId() {
+        return histogramId;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setHistogramId(int histogramId) {
+        this.histogramId = histogramId;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+}
diff --git a/src/main/java/NTNU/IDATT1002/models/Metadata.java b/src/main/java/NTNU/IDATT1002/models/Metadata.java
new file mode 100644
index 0000000000000000000000000000000000000000..25e442f19c342298a2bc141ea6d24290f155ee4f
--- /dev/null
+++ b/src/main/java/NTNU/IDATT1002/models/Metadata.java
@@ -0,0 +1,72 @@
+package NTNU.IDATT1002.models;
+
+
+import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+
+/**
+ * Creates Metadata table
+ */
+
+@Entity
+@Table(name = "Metadata")
+public class Metadata {
+
+    /**
+     * Defines metadataId, may not be blank
+     */
+
+    @Id @NotBlank(message = "Metadata-Id may not be blank")
+    private int metadataId;
+
+    /**
+     * One to one relation joining imageId
+     * on image_id column in image
+     */
+
+    @OneToOne
+    @JoinColumn(name = "image_id")
+    private Image image;
+
+    @NotBlank (message = "GeolocationId may not be blank")
+    private int geoLocationId;
+
+    @NotBlank (message = "HistogramId may not be blank")
+    private int histogramId;
+
+    public Metadata(int metadataId, int geoLocationId, int histogramId){
+        this.metadataId = metadataId;
+        this.geoLocationId = geoLocationId;
+        this.histogramId = histogramId;
+    }
+
+    public Metadata(Metadata metadata){
+        this(metadata.getMetadataId(),
+                metadata.getGeoLocationId(),
+                metadata.getHistogramId());
+    }
+
+    public int getMetadataId() {
+        return metadataId;
+    }
+
+    public int getGeoLocationId() {
+        return geoLocationId;
+    }
+
+    public int getHistogramId() {
+        return histogramId;
+    }
+
+    public void setGeoLocationId(int geoLocationId) {
+        this.geoLocationId = geoLocationId;
+    }
+
+    public void setMetadataId(int metadataId) {
+        this.metadataId = metadataId;
+    }
+
+    public void setHistogramId(int histogramId) {
+        this.histogramId = histogramId;
+    }
+}
diff --git a/src/main/java/NTNU/IDATT1002/models/Tag.java b/src/main/java/NTNU/IDATT1002/models/Tag.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a3dd0cfdbcfc7140e8e451299e64eb9ef2f91c9
--- /dev/null
+++ b/src/main/java/NTNU/IDATT1002/models/Tag.java
@@ -0,0 +1,81 @@
+package NTNU.IDATT1002.models;
+
+
+import javax.persistence.*;
+import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Creates table named tag
+ */
+
+@Entity
+@Table(name = "Tag")
+public class Tag {
+
+    /**
+     * Defines the tag-id, this cannot be blank
+     */
+
+
+    @Id @NotBlank(message = "Tag-Id may not be blank")
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private int tagId;
+
+
+    /**
+     * Creates a many to many relations between tag and image
+     * on table ImageTags, joining column tagId and imageId
+     */
+
+    @ManyToMany(cascade = {CascadeType.ALL})
+    @JoinTable(
+            name = "ImageTags",
+            joinColumns = { @JoinColumn(name = "tagId")},
+            inverseJoinColumns = {@JoinColumn(name = "imageId")}
+    )
+    Set<Image> image = new HashSet<>();
+
+    @NotBlank (message = "Tag title may not be blank")
+    private String title;
+
+    /**
+     * Constructor with tagId and title as parameters
+     * @param tagId
+     * @param title
+     */
+
+    public Tag(int tagId, String title){
+        this.tagId = tagId;
+        this.title = title;
+    }
+
+    /**
+     * Constructor thar takes in a tag object
+     * @param tag
+     */
+
+    public Tag(Tag tag){
+        this(tag.getTagId(),
+                tag.getTitle());
+    }
+
+    public int getTagId() {
+        return tagId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTagId(int tagId) {
+        this.tagId = tagId;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+}
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
index e920adae25251e23bdcc426728ef9b1a07c3e349..98274f00820aad0e8077e05c49b1b5bf6a12718f 100644
--- a/src/main/resources/META-INF/persistence.xml
+++ b/src/main/resources/META-INF/persistence.xml
@@ -11,6 +11,10 @@
         <class>NTNU.IDATT1002.models.User</class>
         <class>NTNU.IDATT1002.models.Image</class>
         <class>NTNU.IDATT1002.models.ImageAlbum</class>
+        <class>NTNU.IDATT1002.models.Tag</class>
+        <class>NTNU.IDATT1002.models.Metadata</class>
+        <class>NTNU.IDATT1002.models.Histogram</class>
+        <class>NTNU.IDATT1002.models.GeoLocation</class>
 
         <properties>
             <!-- Configuring JDBC properties -->