diff --git a/opentech/public/projects/models.py b/opentech/public/projects/models.py
index 9dc4f6dac0c4d65d81d35b48e6a3dd4b00e6f7fe..e2a2b83074a88ad42b4523fb08e00e467eaa8cd9 100644
--- a/opentech/public/projects/models.py
+++ b/opentech/public/projects/models.py
@@ -135,7 +135,7 @@ class ProjectPage(FundingMixin, BasePage):
     def category_options(self):
         categories = json.loads(self.categories)
         options = [int(id) for options in categories.values() for id in options]
-        return Option.objects.select_related().filter(id__in=options).order_by('category')
+        return Option.objects.select_related().filter(id__in=options).order_by('category_id', 'sort_order')
 
 
 class ProjectIndexPage(BasePage):
diff --git a/opentech/public/projects/widgets.py b/opentech/public/projects/widgets.py
index b91bfcbe29519ced17fbcff63fbcc4ce8526a037..8b0b2c2b17fb83cbce281da77f8530bcae68f39e 100644
--- a/opentech/public/projects/widgets.py
+++ b/opentech/public/projects/widgets.py
@@ -21,7 +21,7 @@ class LazyWidgets:
         self.widget = widget
 
     def __iter__(self):
-        for obj in self.model.objects.all():
+        for obj in self.model.objects.order_by('id'):
             yield self.widget(
                 attrs={'id': obj.id, 'label_tag': obj.name},
                 choices=LazyChoices(obj.options, ['id', 'value']),