diff --git a/achievements.module b/achievements.module
index 177911d..42dddda 100755
--- a/achievements.module
+++ b/achievements.module
@@ -343,17 +343,35 @@ function achievements_totals_user($uid = NULL) {
 }
 
 /**
- * Relocks (or "takes away") an achievement from a user.
+ * Completely resets an achievement for a user.
  *
  * @param $achievement_id
  *   The achievement this request applies against.
  * @param $uid
+ *   The user to reset an achievement for (defaults to current user).
+ */
+function achievements_reset($achievement_id, $uid = NULL) {
+  if (achievements_relock($achievement_id, $uid)){
+    // Remove any storage associated with this achievement.
+    // This means ALL progress for this achievement will be reset!
+    achievements_storage_del($achievement->id(), $uid);
+    \Drupal::moduleHandler()->invokeAll('achievements_locked', [$achievement, $uid]);
+  }
+}
+
+/**
+ * Relocks an achievement for a user.
+ * To be used when a condition is no longer met BUYT you don't want to lose progress.
+ * 
+ * @param $achievement_id
+ *   The achievement this request applies against.
+ * @param $uid
  *   The user to relock an achievement for (defaults to current user).
  */
 function achievements_locked($achievement_id, $uid = NULL) {
   list($uid, $access) = achievements_user_is_achiever($uid);
   if (!$access) {
-    return;
+    return false;
   }
 
   // Only remove the achievement if the user has unlocked it.
@@ -362,7 +380,7 @@ function achievements_locked($achievement_id, $uid = NULL) {
     // We need the full thing so we know how many points to take away.
     $achievement = achievements_load($achievement_id);
     $connection->delete('achievement_unlocks')
-      ->condition('achievement_id', $achievement['id'])
+      ->condition('achievement_id', $achievement->id())
       ->condition('uid', $uid)
       ->execute();
 
@@ -379,7 +397,7 @@ function achievements_locked($achievement_id, $uid = NULL) {
       // Subtract points and set the previous unlock as their latest.
       $connection->update('achievement_totals')
         ->fields(['uid' => $uid, 'timestamp' => REQUEST_TIME, 'achievement_id' => $previous_unlock])
-        ->expression('points', 'points - :points', [':points' => $achievement['points']])
+        ->expression('points', 'points - :points', [':points' => $achievement->getPoints()])
         ->expression('unlocks', 'unlocks - :decrement', [':decrement' => 1])
         ->condition('uid', $uid)
         ->execute();
@@ -390,11 +408,9 @@ function achievements_locked($achievement_id, $uid = NULL) {
         ->condition('uid', $uid)
         ->execute();
     }
-
-    // Remove any storage associated with this achievement.
-    achievements_storage_del($achievement['id'], $uid);
-    \Drupal::moduleHandler()->invokeAll('achievements_locked', [$achievement, $uid]);
+    return true;
   }
+  return false;
 }
 
 /**
@@ -463,7 +479,7 @@ function achievements_storage_del($achievement_id = NULL, $uid = NULL) {
   }
 
   $achievement = achievements_load($achievement_id);
-  $storage = isset($achievement['storage']) ? $achievement['storage'] : $achievement['id'];
+  $storage = $achievement->getStorage() ? $achievement->getStorage() : $achievement->id();
   $connection = \Drupal::database();
   $connection->delete('achievement_storage')
     ->condition('achievement_id', $storage)
diff --git a/src/Entity/AchievementEntity.php b/src/Entity/AchievementEntity.php
index 50866ad..caaef4a 100755
--- a/src/Entity/AchievementEntity.php
+++ b/src/Entity/AchievementEntity.php
@@ -127,6 +127,13 @@ class AchievementEntity extends ConfigEntityBase implements AchievementEntityInt
   }
 
   /**
+   * @return string
+   */
+  public function getStorage() {
+    return $this->storage;
+  }
+
+  /**
    * @return bool
    */
   public function isSecret() {
