diff --git a/src/main/java/frc/robot/subsystems/lift/LiftSubsystem.java b/src/main/java/frc/robot/subsystems/lift/LiftSubsystem.java
index bbc2c19..5664c9e 100644
--- a/src/main/java/frc/robot/subsystems/lift/LiftSubsystem.java
+++ b/src/main/java/frc/robot/subsystems/lift/LiftSubsystem.java
@@ -1,5 +1,6 @@
 package frc.robot.subsystems.lift;
 
+import static edu.wpi.first.units.Units.Centimeters;
 import static edu.wpi.first.units.Units.Degrees;
 import static edu.wpi.first.units.Units.Inches;
 import static edu.wpi.first.units.Units.Meters;
@@ -43,6 +44,12 @@ public static enum USER_INPUT {
   static final DutyCycleOut HOMING_SPEED = new DutyCycleOut(-0.05);
   static final Distance HOMING_EPSILON = Millimeters.of(5);
 
+  // Tolerance in cm of top and bottom minimum clearance
+  static final Distance ELEVATOR_TOLERANCE = Centimeters.of(0.5);
+
+  // Tolerance in degrees of arm
+  static final Angle ARM_TOLERANCE = Degrees.of(0.5);
+
   static final Angle SCORING_L1_ANGLE = Degrees.of(0);
   static final Angle SCORING_L2_ANGLE = Degrees.of(0);
   static final Angle SCORING_L3_ANGLE = Degrees.of(0);
@@ -96,6 +103,7 @@ public LiftStates nextState() {
       @Override
       public void initialize() {
         s_liftinstance.setElevatorHeight(STOW_HEIGHT);
+        s_liftinstance.setArmAngle(STOW_ANGLE);
       }
 
       @Override
@@ -165,7 +173,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle().gte(SAFE_INTAKE_ANGLE)) {
+        if (s_liftinstance.getArmAngle().lte(SAFE_INTAKE_ANGLE)) {
           return STOW_L4_S1;
         }
         return this;
@@ -302,22 +310,21 @@ public void initialize() {
         s_liftinstance.setElevatorHeight(L4_HEIGHT);
       }
 
-      @Override
-      public void execute() {
-        if (s_liftinstance.getElevatorHeight() == CLEAR_HEIGHT && s_liftinstance.getArmAngle() == STOW_ANGLE) {
-          s_liftinstance.setArmAngle(SCORING_L4_ANGLE);
-        }
-      }
-
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getElevatorHeight() == L4_HEIGHT && s_liftinstance.getArmAngle() == SCORING_L4_ANGLE) {
+        if (s_liftinstance.getElevatorHeight().gte(CLEAR_HEIGHT)) {
           return L4;
         }
         return this;
       }
     },
     L4 {
+      @Override
+      public void initialize() {
+        s_liftinstance.setElevatorHeight(L4_HEIGHT);
+        s_liftinstance.setArmAngle(SCORING_L4_ANGLE);
+      }
+
       @Override
       public SystemState nextState() {
         if (getUserInput() == USER_INPUT.STOW) {
@@ -343,7 +350,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == STOW_ANGLE) {
+        if (s_liftinstance.getArmAngle().gte(STOW_ANGLE)) {
           return STOW;
         }
         return this;
@@ -357,7 +364,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == STOW_ANGLE) {
+        if (s_liftinstance.getArmAngle().gte(STOW_ANGLE)) {
           return STOW;
         }
         return this;
@@ -371,7 +378,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getElevatorHeight() == CLEAR_HEIGHT) {
+        if (s_liftinstance.getElevatorHeight().gte(CLEAR_HEIGHT)) {
           return L3_STOW_S2;
         }
         return this;
@@ -385,7 +392,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == STOW_ANGLE) {
+        if (s_liftinstance.getArmAngle().gte(STOW_ANGLE)) {
           return STOW;
         }
         return this;
@@ -399,7 +406,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == STOW_ANGLE) {
+        if (s_liftinstance.getArmAngle().gte(STOW_ANGLE)) {
           return STOW;
         }
         return this;
@@ -413,7 +420,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == SAFE_REEF_ANGLE_BOTTOM) {
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_BOTTOM)) {
           return STOW_L3_S1;
         }
         return this;
@@ -427,7 +434,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == SAFE_REEF_ANGLE_BOTTOM) {
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_BOTTOM)) {
           return STOW_L4_S1;
         }
         return this;
@@ -441,7 +448,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == SAFE_REEF_ANGLE_BOTTOM) {
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_BOTTOM)) {
           return STOW_L1_S1;
         }
         return this;
@@ -455,7 +462,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == SAFE_REEF_ANGLE_BOTTOM) {
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_BOTTOM)) {
           return STOW_L3_S1;
         }
         return this;
@@ -469,7 +476,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == SAFE_REEF_ANGLE_BOTTOM) {
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_BOTTOM)) {
           return STOW_L4_S1;
         }
         return this;
@@ -483,7 +490,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getArmAngle() == SAFE_REEF_ANGLE_TOP) {
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_TOP)) {
           return L3_L1_S2;
         }
         return this;
@@ -497,7 +504,7 @@ public void initialize() {
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getElevatorHeight() == CLEAR_HEIGHT) {
+        if (s_liftinstance.getElevatorHeight().gte(CLEAR_HEIGHT)) {
           return L3_L1_S3;
         }
         return this;
@@ -506,17 +513,31 @@ public SystemState nextState() {
     L3_L1_S3 {
       @Override
       public void initialize() {
-        s_liftinstance.setElevatorHeight(CLEAR_HEIGHT);
+        s_liftinstance.setArmAngle(SAFE_REEF_ANGLE_BOTTOM);
       }
 
       @Override
       public SystemState nextState() {
-        if (s_liftinstance.getElevatorHeight() == CLEAR_HEIGHT) {
-          return L3_L1_S3;
+        if (s_liftinstance.getArmAngle().gte(SAFE_REEF_ANGLE_BOTTOM)) {
+          return L3_L1_S4;
         }
         return this;
       }
-    };
+    },
+    L3_L1_S4 {
+      @Override
+      public void initialize() {
+        s_liftinstance.setElevatorHeight(L1_HEIGHT);
+      }
+
+      @Override
+      public SystemState nextState() {
+        if (s_liftinstance.getElevatorHeight().lte(L1_HEIGHT)) {
+          return L1;
+        }
+        return this;
+      }
+    },
   }
 
   private static LiftSubsystem s_liftinstance;
@@ -705,4 +726,22 @@ public void close() {
     m_pivotMotor.close();
     s_liftinstance = null;
   }
+
+  /**
+   * Return whether the elevator is at a target height or not
+   * @return Boolean of if elevator is at target height
+   */
+  public boolean elevatorAt(Distance targetHeight) {
+    Distance currentHeight = getElevatorHeight();
+    return (currentHeight.isNear(currentHeight, ELEVATOR_TOLERANCE));
+  }
+
+  /**
+   * Return whether the arm is at a target angle or not
+   * @return Boolean of if arm is at target angle
+   */
+  public boolean armAt(Angle targetAngle) {
+    Angle currentAngle = getArmAngle();
+    return (currentAngle.isNear(targetAngle, ARM_TOLERANCE));
+  }
 }