diff --git a/app/helpers/service_helper.py b/app/helpers/service_helper.py
index cfae641..589ade6 100644
--- a/app/helpers/service_helper.py
+++ b/app/helpers/service_helper.py
@@ -105,6 +105,8 @@ def key_to_uuid(key):
 
 def solution_items(variables: list, solver_run: SolverRun) -> Tuple[list]:
     form_items = []
+    form_bundles = []
+    final_items = []
     solver_variables = []
 
     for v in variables:
@@ -120,11 +122,18 @@ def solution_items(variables: list, solver_run: SolverRun) -> Tuple[list]:
                 bundle_id = v.name.replace('Bundle_', '')
                 bundle = solver_run.get_bundle(int(bundle_id))
 
-                if bundle:
-                    for item in bundle.items:
-                        if item: form_items.append(item)
+                if bundle: form_bundles.append(bundle)
 
-    return form_items, solver_variables
+    for bundle in form_bundles:
+        items = bundle.ordered_items(
+        ) if solver_run.bundle_first_ordering else bundle.items
+        for item in items:
+            final_items.append(item)
+
+    for item in form_items:
+        final_items.append(item)
+
+    return final_items, solver_variables
 
 def print_problem_variables(problem):
     # Uncomment this as needed in local dev
diff --git a/app/main.py b/app/main.py
index 1459f59..b2dfc00 100644
--- a/app/main.py
+++ b/app/main.py
@@ -25,7 +25,7 @@ class ServiceListener(Consumer):
 
 
 def main():
-    logging.info('Starting Solver Service: Tokyo Drift (v1.2)...')
+    logging.info('Starting Solver Service: Tokyo Drift (v1.3.1)...')
 
     # ToDo: Figure out a much better way of doing this.
     # LocalStack wants 'endpoint_url', while prod doesnt :(
diff --git a/app/models/bundle.py b/app/models/bundle.py
index 82fb127..475d710 100644
--- a/app/models/bundle.py
+++ b/app/models/bundle.py
@@ -46,3 +46,6 @@ class Bundle(BaseModel):
             total += self.trf(solver_run.irt_model, target.theta)
 
         return total
+
+    def ordered_items(self) -> List[Item]:
+        return sorted(self.items, key=lambda item: item.position)
diff --git a/app/models/item.py b/app/models/item.py
index 260d612..f9f0a65 100644
--- a/app/models/item.py
+++ b/app/models/item.py
@@ -8,6 +8,7 @@ from lib.irt.item_information_function import ItemInformationFunction
 
 class Item(BaseModel):
     id: int
+    position: Optional[int]
     passage_id: Optional[int]
     workflow_state: Optional[str]
     attributes: List[Attribute]
diff --git a/app/models/solver_run.py b/app/models/solver_run.py
index ad54659..79eb9ed 100644
--- a/app/models/solver_run.py
+++ b/app/models/solver_run.py
@@ -14,7 +14,8 @@ from models.advanced_options import AdvancedOptions
 
 class SolverRun(BaseModel):
     items: List[Item] = []
-    bundles: list[Bundle] = []
+    bundles: List[Bundle] = []
+    bundle_first_ordering: bool = True
     constraints: List[Constraint]
     irt_model: IRTModel
     objective_function: ObjectiveFunction
@@ -40,7 +41,7 @@ class SolverRun(BaseModel):
             if type == constraint.reference_attribute.type:
                 return constraint
 
-    def remove_items(self, items: list[Item]) -> bool:
+    def remove_items(self, items: List[Item]) -> bool:
         self.items = [item for item in self.items if item not in items]
         return True
 
@@ -100,7 +101,7 @@ class SolverRun(BaseModel):
         return next((constraint for constraint in self.constraints
                      if constraint.reference_attribute.id == name), None)
 
-    def unbundled_items(self) -> list:
+    def unbundled_items(self) -> List[Item]:
         # since the only bundles are based on passage id currently
         # in the future when we have more than just passage based bundles
         # we'll need to develop a more sophisticated way of handling this concern
@@ -113,7 +114,7 @@ class SolverRun(BaseModel):
         else:
             return self.items
 
-    def select_items_by_percent(self, percent: int) -> list[Item]:
+    def select_items_by_percent(self, percent: int) -> List[Item]:
         items = self.unbundled_items()
         total_items = len(items)
         selected_items_amount = round(total_items - (total_items *
@@ -121,7 +122,7 @@ class SolverRun(BaseModel):
 
         return random.sample(items, selected_items_amount)
 
-    def select_bundles_by_percent(self, percent: int) -> list[Bundle]:
+    def select_bundles_by_percent(self, percent: int) -> List[Bundle]:
         total_bundles = len(self.bundles)
         selected_bundles_amount = round(total_bundles - (total_bundles *
                                                          (percent / 100)))
diff --git a/app/services/loft_service.py b/app/services/loft_service.py
index d854291..0174158 100644
--- a/app/services/loft_service.py
+++ b/app/services/loft_service.py
@@ -83,11 +83,11 @@ class LoftService(Base):
                                      lowBound=0,
                                      upBound=1,
                                      cat='Binary')
-            bundles = LpVariable.dicts(
-                "Bundle", [bundle.id for bundle in selected_bundles],
-                lowBound=0,
-                upBound=1,
-                cat='Binary')
+            bundles = LpVariable.dicts("Bundle",
+                                       [bundle.id for bundle in selected_bundles],
+                                       lowBound=0,
+                                       upBound=1,
+                                       cat='Binary')
 
             logging.info(f'Generating Solution for Form {form_number}')