diff --git a/api/endpoints.go b/api/endpoints.go
index e61e525..14b34a4 100644
--- a/api/endpoints.go
+++ b/api/endpoints.go
@@ -199,9 +199,11 @@ func handleSession(w http.ResponseWriter, r *http.Request) {
 		}
 
 		existingSave, err := savedata.GetSession(uuid, slot)
-		if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) {
-			httpError(w, r, fmt.Errorf("failed to retrieve session save data: %s", err), http.StatusInternalServerError)
-			return
+		if err != nil {
+			if !errors.Is(err, savedata.ErrSaveNotExist) {
+				httpError(w, r, fmt.Errorf("failed to retrieve session save data: %s", err), http.StatusInternalServerError)
+				return
+			}
 		} else {
 			if existingSave.Seed == session.Seed && existingSave.WaveIndex > session.WaveIndex {
 				httpError(w, r, fmt.Errorf("session out of date: existing wave index is greater"), http.StatusBadRequest)
@@ -286,8 +288,7 @@ func handleUpdateAll(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	var active bool
-	active, err = db.IsActiveSession(uuid, data.ClientSessionId)
+	active, err := db.IsActiveSession(uuid, data.ClientSessionId)
 	if err != nil {
 		httpError(w, r, fmt.Errorf("failed to check active session: %s", err), http.StatusBadRequest)
 		return
@@ -317,10 +318,12 @@ func handleUpdateAll(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
-	existingPlaytime, err := savedata.GetPlaytime(uuid)
-	if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) {
-		httpError(w, r, fmt.Errorf("failed to retrieve playtime: %s", err), http.StatusInternalServerError)
-		return
+	oldSystem, err := savedata.GetSystem(uuid)
+	if err != nil {
+		if !errors.Is(err, savedata.ErrSaveNotExist) {
+			httpError(w, r, fmt.Errorf("failed to retrieve playtime: %s", err), http.StatusInternalServerError)
+			return
+		}
 	} else {
 		playtime, ok := data.System.GameStats.(map[string]interface{})["playTime"].(float64)
 		if !ok {
@@ -328,16 +331,24 @@ func handleUpdateAll(w http.ResponseWriter, r *http.Request) {
 			return
 		}
 
-		if float64(existingPlaytime) > playtime {
+		oldPlaytime, ok := oldSystem.GameStats.(map[string]interface{})["playTime"].(float64)
+		if !ok {
+			httpError(w, r, fmt.Errorf("no playtime found"), http.StatusBadRequest)
+			return
+		}
+
+		if playtime < oldPlaytime {
 			httpError(w, r, fmt.Errorf("session out of date: existing playtime is greater"), http.StatusBadRequest)
 			return
 		}
 	}
 
 	existingSave, err := savedata.GetSession(uuid, data.SessionSlotId)
-	if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) {
-		httpError(w, r, fmt.Errorf("failed to retrieve session save data: %s", err), http.StatusInternalServerError)
-		return
+	if err != nil {
+		if !errors.Is(err, savedata.ErrSaveNotExist) {
+			httpError(w, r, fmt.Errorf("failed to retrieve session save data: %s", err), http.StatusInternalServerError)
+			return
+		}
 	} else {
 		if existingSave.Seed == data.Session.Seed && existingSave.WaveIndex > data.Session.WaveIndex {
 			httpError(w, r, fmt.Errorf("session out of date: existing wave index is greater"), http.StatusBadRequest)
@@ -372,13 +383,12 @@ func handleSystem(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	var active bool
 	if !r.URL.Query().Has("clientSessionId") {
 		httpError(w, r, fmt.Errorf("missing clientSessionId"), http.StatusBadRequest)
 		return
 	}
 
-	active, err = db.IsActiveSession(uuid, r.URL.Query().Get("clientSessionId"))
+	active, err := db.IsActiveSession(uuid, r.URL.Query().Get("clientSessionId"))
 	if err != nil {
 		httpError(w, r, fmt.Errorf("failed to check active session: %s", err), http.StatusBadRequest)
 		return
@@ -419,10 +429,12 @@ func handleSystem(w http.ResponseWriter, r *http.Request) {
 			return
 		}
 
-		existingPlaytime, err := savedata.GetPlaytime(uuid)
-		if err != nil && !errors.Is(err, savedata.ErrSaveNotExist) {
-			httpError(w, r, fmt.Errorf("failed to retrieve playtime: %s", err), http.StatusInternalServerError)
-			return
+		oldSystem, err := savedata.GetSystem(uuid)
+		if err != nil {
+			if !errors.Is(err, savedata.ErrSaveNotExist) {
+				httpError(w, r, fmt.Errorf("failed to retrieve playtime: %s", err), http.StatusInternalServerError)
+				return
+			}
 		} else {
 			playtime, ok := system.GameStats.(map[string]interface{})["playTime"].(float64)
 			if !ok {
@@ -430,7 +442,13 @@ func handleSystem(w http.ResponseWriter, r *http.Request) {
 				return
 			}
 
-			if float64(existingPlaytime) > playtime {
+			oldPlaytime, ok := oldSystem.GameStats.(map[string]interface{})["playTime"].(float64)
+			if !ok {
+				httpError(w, r, fmt.Errorf("no playtime found"), http.StatusBadRequest)
+				return
+			}
+
+			if playtime < oldPlaytime {
 				httpError(w, r, fmt.Errorf("session out of date: existing playtime is greater"), http.StatusBadRequest)
 				return
 			}
@@ -450,14 +468,13 @@ func handleSystem(w http.ResponseWriter, r *http.Request) {
 
 		// not valid, send server state
 		if !active {
-			err = db.UpdateActiveSession(uuid, r.URL.Query().Get("clientSessionId"))
+			err := db.UpdateActiveSession(uuid, r.URL.Query().Get("clientSessionId"))
 			if err != nil {
 				httpError(w, r, fmt.Errorf("failed to update active session: %s", err), http.StatusBadRequest)
 				return
 			}
 
-			var storedSaveData defs.SystemSaveData
-			storedSaveData, err = db.ReadSystemSaveData(uuid)
+			storedSaveData, err := db.ReadSystemSaveData(uuid)
 			if err != nil {
 				httpError(w, r, fmt.Errorf("failed to read session save data: %s", err), http.StatusInternalServerError)
 				return
diff --git a/api/savedata/system.go b/api/savedata/system.go
index ebde797..25d6b58 100644
--- a/api/savedata/system.go
+++ b/api/savedata/system.go
@@ -83,12 +83,3 @@ func DeleteSystem(uuid []byte) error {
 
 	return nil
 }
-
-func GetPlaytime(uuid []byte) (int, error) {
-	system, err := GetSystem(uuid)
-	if err != nil {
-		return 0, err
-	}
-
-	return int(system.GameStats.(map[string]interface{})["playTime"].(float64)), nil
-}