diff --git a/src/pretix/control/templates/pretixcontrol/base.html b/src/pretix/control/templates/pretixcontrol/base.html
index 65c4a9235..79d9c5f52 100644
--- a/src/pretix/control/templates/pretixcontrol/base.html
+++ b/src/pretix/control/templates/pretixcontrol/base.html
@@ -61,6 +61,7 @@
+
{% endcompress %}
{{ html_head|safe }}
diff --git a/src/pretix/presale/templates/pretixpresale/fragment_js.html b/src/pretix/presale/templates/pretixpresale/fragment_js.html
index f79c396da..304452adc 100644
--- a/src/pretix/presale/templates/pretixpresale/fragment_js.html
+++ b/src/pretix/presale/templates/pretixpresale/fragment_js.html
@@ -20,4 +20,5 @@
+
{% endcompress %}
diff --git a/src/pretix/static/pretixbase/js/addressform.js b/src/pretix/static/pretixbase/js/addressform.js
new file mode 100644
index 000000000..5468ed9c0
--- /dev/null
+++ b/src/pretix/static/pretixbase/js/addressform.js
@@ -0,0 +1,44 @@
+$(function () {
+ "use strict";
+
+ $("select[name$=state]:not([data-static])").each(function () {
+ var dependent = $(this),
+ counter = 0,
+ dependency = $(this).closest(".panel-body, form").find('select[name$=country]'),
+ update = function (ev) {
+ counter++;
+ var curCounter = counter;
+ dependent.prop("disabled", true);
+ dependency.closest(".form-group").find("label").prepend(" ");
+ $.getJSON('/js_helpers/states/?country=' + dependency.val(), function (data) {
+ if (counter > curCounter) {
+ return; // Lost race
+ }
+ var selected_value = dependent.prop("data-selected-value");
+ dependent.find("option").filter(function (t) {return !!$(this).attr("value")}).remove();
+ if (data.data.length > 0) {
+ $.each(data.data, function (k, s) {
+ var o = $("