diff --git a/pinaxcon/registrasion/forms.py b/pinaxcon/registrasion/forms.py
index 17ef9ef2..7bb21f1e 100644
--- a/pinaxcon/registrasion/forms.py
+++ b/pinaxcon/registrasion/forms.py
@@ -28,5 +28,4 @@ class ProfileForm(forms.ModelForm):
         }
         field_classes = {
             "of_legal_age": YesNoField,
-            "agreement": YesNoField,
         }
diff --git a/pinaxcon/registrasion/management/commands/populate_inventory.py b/pinaxcon/registrasion/management/commands/populate_inventory.py
index 77a43795..0607cc04 100644
--- a/pinaxcon/registrasion/management/commands/populate_inventory.py
+++ b/pinaxcon/registrasion/management/commands/populate_inventory.py
@@ -67,6 +67,20 @@ class Command(BaseCommand):
             limit_per_user=1,
             order=1,
         )
+        self.terms = self.find_or_make(
+            inv.Category,
+            ("name",),
+            name="Terms, Conditions, and Code of Conduct Acceptance",
+            description="I agree to the "
+                        "<a href=\"https://linux.conf.au/attend/terms-and-conditions\"> "
+                        "terms and conditions of attendance</a>, and I have read, "
+                        "understood, and agree to act according to the standards set "
+                        "forth in our <a href=\"https://linux.conf.au/attend/code-of-conduct\">"
+                        "Code of Conduct</a>.",
+            required=True,
+            render_type=inv.Category.RENDER_TYPE_CHECKBOX,
+            order=10,
+        )
         self.penguin_dinner = self.find_or_make(
             inv.Category,
             ("name",),
@@ -78,7 +92,7 @@ class Command(BaseCommand):
             required=False,
             render_type=inv.Category.RENDER_TYPE_QUANTITY,
             limit_per_user=10,
-            order=10,
+            order=20,
         )
         self.speakers_dinner_ticket = self.find_or_make(
             inv.Category,
@@ -91,7 +105,7 @@ class Command(BaseCommand):
             required=False,
             render_type=inv.Category.RENDER_TYPE_QUANTITY,
             limit_per_user=5,
-            order=20,
+            order=30,
         )
         self.pdns_category = self.find_or_make(
             inv.Category,
@@ -105,7 +119,7 @@ class Command(BaseCommand):
             required=False,
             render_type=inv.Category.RENDER_TYPE_RADIO,
             limit_per_user=1,
-            order=30,
+            order=40,
         )
         self.t_shirt = self.find_or_make(
             inv.Category,
@@ -115,7 +129,7 @@ class Command(BaseCommand):
                         "linux.conf.au 2018 artwork.",
             required=False,
             render_type=inv.Category.RENDER_TYPE_ITEM_QUANTITY,
-            order=40,
+            order=50,
         )
         # self.accommodation = self.find_or_make(
         #     inv.Category,
@@ -258,6 +272,17 @@ class Command(BaseCommand):
             order=90,
         )
 
+        # Agreements
+        self.accept_terms = self.find_or_make(
+            inv.Product,
+            ("name","category",),
+            category = self.terms,
+            name="I Accept",
+            price=Decimal("00.00"),
+            reservation_duration=hours(24),
+            order=10,
+            limit_per_user=1,
+        )
         # Penguin dinner
 
         self.penguin_adult = self.find_or_make(
@@ -637,7 +662,23 @@ class Command(BaseCommand):
             self.extras,
             self.t_shirt,
             self.penguin_dinner,
+            self.pdns_category,
         ])
+        # Require attendees to accept the T&Cs and Code of Conduct
+        needs_agreement = self.find_or_make(
+            cond.CategoryFlag,
+            ("description", ),
+            description="Must Accept Terms",
+            condition=cond.FlagBase.DISABLE_IF_FALSE,
+            enabling_category = self.terms,
+        )
+        needs_agreement.categories.set([
+            self.extras,
+            self.t_shirt,
+            self.penguin_dinner,
+            self.pdns_category,
+        ])
+
 
     def populate_discounts(self):
 
diff --git a/pinaxcon/registrasion/migrations/0008_remove_attendeeprofile_agreement.py b/pinaxcon/registrasion/migrations/0008_remove_attendeeprofile_agreement.py
new file mode 100644
index 00000000..d35526fe
--- /dev/null
+++ b/pinaxcon/registrasion/migrations/0008_remove_attendeeprofile_agreement.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.5 on 2017-10-01 08:14
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('pinaxcon_registrasion', '0007_auto_20170930_1610'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='attendeeprofile',
+            name='agreement',
+        ),
+    ]
diff --git a/pinaxcon/registrasion/models.py b/pinaxcon/registrasion/models.py
index db28ba26..91a05382 100644
--- a/pinaxcon/registrasion/models.py
+++ b/pinaxcon/registrasion/models.py
@@ -66,12 +66,6 @@ class AttendeeProfile(rego.AttendeeProfileBase):
                 "Please fill in line 1 before filling line 2",
             ))
 
-        if not self.agreement:
-            errors.append((
-                "agreement",
-                "Agreement to the terms and conditions and to the Code of Conduct is required.",
-            ))
-
         if errors:
             raise ValidationError(dict(errors))
 
@@ -201,18 +195,6 @@ class AttendeeProfile(rego.AttendeeProfileBase):
         blank=True,
     )
 
-    agreement = models.BooleanField(
-        blank=False,
-        help_text="I agree to the "
-                  "<a href=\"https://linux.conf.au/attend/terms-and-conditions\"> "
-                  "terms and conditions of attendance</a>, and I have read, "
-                  "understood, and agree to act according to the standards set "
-                  "forth in our "
-                  "<a href=\"https://linux.conf.au/attend/code-of-conduct\">"
-                  "Code of Conduct</a>."
-    )
-
-
     past_lca = models.ManyToManyField(
         PastEvent,
         verbose_name="Which past linux.conf.au events have you attended?",