diff --git a/src/main/java/edu/umd/dawn/common/entities/Location.java b/src/main/java/edu/umd/dawn/common/entities/Location.java
new file mode 100644
index 0000000000000000000000000000000000000000..251b47b5edf7face8388806c218ec0f6c9481598
--- /dev/null
+++ b/src/main/java/edu/umd/dawn/common/entities/Location.java
@@ -0,0 +1,34 @@
+package edu.umd.dawn.common.entities;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Builder;
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * Location entity
+ */
+@Data
+@Builder
+@Deprecated
+public class Location {
+
+    @Field("id")
+    @NotEmpty
+    private String id;
+
+    @NotNull
+    private Double latitude;
+
+    @NotNull
+    private Double longitude;
+
+    @NotEmpty
+    private String address;
+
+    @Field("display_name")
+    @JsonProperty("display_name")
+    private String displayName;
+}
diff --git a/src/main/java/edu/umd/dawn/common/entities/User.java b/src/main/java/edu/umd/dawn/common/entities/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a7eedc7a57b8ac42a7983a817e8c1e99391e855
--- /dev/null
+++ b/src/main/java/edu/umd/dawn/common/entities/User.java
@@ -0,0 +1,96 @@
+package edu.umd.dawn.common.entities;
+
+
+import edu.umd.dawn.common.exceptions.DawnException;
+import edu.umd.dawn.common.exceptions.DawnExceptionParameters;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+import org.springframework.data.mongodb.core.mapping.FieldType;
+
+/**
+ * User entity - shared across all services
+ */
+@Data
+@Document("users")
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class User {
+
+    @Id
+    @Field(targetType = FieldType.STRING)
+    private String id;
+
+    private String name;
+
+    private String email;
+
+    private String salt;
+
+    private byte[] hash;
+
+    private String hashVersion;
+
+    private Integer role;
+
+    @Field("newsletter_opt_in")
+    private Boolean newsletterOptIn;
+
+    @Field("last_logged_in")
+    private LocalDateTime lastLoggedIn;
+
+    @Field("last_token_refresh")
+    private LocalDateTime lastTokenRefresh;
+
+    @Field("created_at")
+    private LocalDateTime createdAt;
+
+    @Field("default_location")
+    @Deprecated
+    private Location defaultLocation;
+
+    @Field("favorite_locations")
+    @Deprecated
+    private List<Location> favoriteLocations;
+
+    @Field("locations")
+    private List<String> locations;
+
+    @Field("default_location_v2")
+    private String defaultLocationV2;
+
+    private Set<String> migrations;
+
+    public void addLocation(String locationId) {
+        List<String> aList = new ArrayList<>(locations);
+        aList.add(locationId);
+        setLocations(aList);
+    }
+
+    /**
+     * Will throw if id does not exist
+     * @param id
+     */
+    public String removeFavoriteLocation(String id) {
+        List<String> newList =
+                locations.stream().filter(location -> !location.equals(id)).collect(Collectors.toList());
+
+        if (newList.size() == locations.size()) {
+            throw new DawnException(new DawnExceptionParameters(400, "BAD_REQUEST", "location id provided does not exist", ""));
+        }
+
+        setLocations(newList);
+        return id;
+    }
+}
\ No newline at end of file