diff --git a/django/contrib/localflavor/at/__init__.py b/django/contrib/localflavor/at/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/django/contrib/localflavor/at/at_provinces.py b/django/contrib/localflavor/at/at_provinces.py
new file mode 100644
index 0000000..da51b0a
--- /dev/null
+++ b/django/contrib/localflavor/at/at_provinces.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+"""
+A list of all nine provinces in Austria, see also: 
+http://en.wikipedia.org/wiki/ISO_3166-2:AT . Vienna is moved to the top, 
+because it's the capital of Austria
+"""
+
+from django.utils.translation import ugettext_lazy as _
+
+# ISO_3166-2
+PROVINCE_CHOICES = (
+	('9', _(u'Vienna')),
+	('1', _(u'Burgenland')),
+	('2', _(u'Carinthia')),
+	('3', _(u'Lower Austria')),
+	('4', _(u'Upper Austria')),
+	('5', _(u'Salzburg')),
+	('6', _(u'Styria')),
+	('7', _(u'Tyrol')),
+	('8', _(u'Vorarlberg')),
+)
\ No newline at end of file
diff --git a/django/contrib/localflavor/at/forms.py b/django/contrib/localflavor/at/forms.py
new file mode 100644
index 0000000..9a2f5f5
--- /dev/null
+++ b/django/contrib/localflavor/at/forms.py
@@ -0,0 +1,65 @@
+"""
+AT-specific Form helpers
+"""
+
+from django.newforms.fields import RegexField, Select, Field
+from django.newforms import ValidationError
+from django.utils.translation import ugettext
+import re
+
+re_ssn = re.compile(r'^\d{4} \d{6}')
+
+class ATZipCodeField(RegexField):
+    """
+    A simple input field that validates 4-digit zip codes as used in Austria.
+    """
+    
+    default_error_messages = {
+        'invalid': ugettext('Enter a zip code in the format XXXX.'),
+    }
+
+    def __init__(self, *args, **kwargs):
+        super(ATZipCodeField, self).__init__(r'^[1-9]\d{3}$',
+            max_length=None, min_length=None, *args, **kwargs)
+
+class ATProvinceSelect(Select):
+    """
+    A simple select box for all nine provinces of Austria.
+    """
+    
+    def __init__(self, attrs=None):
+        from django.contrib.localflavor.at.at_provinces import PROVINCE_CHOICES
+        super(ATProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES)
+
+class ATSocialSecurityNumberField(Field):
+    """
+    Austrian Social Security numbers are composed of a 4 digits and 6 digits
+    field. The latter represents in most cases the person's birthdate while
+    the first 4 digits represent a 3-digits-counter and a one-digit checksum.
+    
+    The 6-digits-field can also differ from the person's birthdate if the
+    3-digits counter suffered an overflow.
+    
+    This code is based on information available on
+    http://de.wikipedia.org/wiki/Sozialversicherungsnummer#.C3.96sterreich
+    """
+    
+    default_error_messages = {
+        'invalid': ugettext(u'Enter a valid Austrian Social Security Number in XXXX XXXXXX format.'),
+    }
+    
+    def clean(self, value):
+        if not re_ssn.search(value):
+            raise ValidationError(self.error_messages['invalid'])
+        sqnr, date = value.split(" ")
+        sqnr, check = (sqnr[:3], (sqnr[3]))
+        if int(sqnr) < 100:
+           raise ValidationError(self.error_messages['invalid'])
+        res = int(sqnr[0])*3 + int(sqnr[1])*7 + int(sqnr[2])*9 \
+           + int(date[0])*5 + int(date[1])*8 + int(date[2])*4 \
+           + int(date[3])*2 + int(date[4])*1 + int(date[5])*6 
+        res = res % 11
+        if res != int(check):
+           raise ValidationError(self.error_messages['invalid'])
+        return u'%s%s %s'%(sqnr, check, date,)
+        
diff --git a/tests/regressiontests/forms/localflavor/at.py b/tests/regressiontests/forms/localflavor/at.py
new file mode 100644
index 0000000..b230329
--- /dev/null
+++ b/tests/regressiontests/forms/localflavor/at.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+# Tests for contrib/localflavor/at form fields
+
+tests = r"""
+# ATZipCodeField ############################################################
+
+>>> from django.contrib.localflavor.at.forms import ATZipCodeField
+>>> f = ATZipCodeField()
+>>> f.clean('9073')
+u'9073'
+>>> f.clean('90730')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXX.']
+>>> f.clean('0073')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a zip code in the format XXXX.']
+
+# ATProvinceSelect ##########################################################
+
+>>> from django.contrib.localflavor.at.forms import ATProvinceSelect
+>>> w = ATProvinceSelect()
+>>> w.render('provinces', '2')
+u'<select name="provinces">\n<option value="9">Vienna</option>\n<option value="1">Burgenland</option>\n<option value="2" selected="selected">Carinthia</option>\n<option value="3">Lower Austria</option>\n<option value="4">Upper Austria</option>\n<option value="5">Salzburg</option>\n<option value="6">Styria</option>\n<option value="7">Tyrol</option>\n<option value="8">Vorarlberg</option>\n</select>'
+
+# ATSocialSecurityNumberField ###############################################
+
+>>> from django.contrib.localflavor.at.forms import ATSocialSecurityNumberField
+>>> f = ATSocialSecurityNumberField()
+>>> f.clean('1237 010180')
+u'1237 010180'
+>>> f.clean('1237 010181')
+Traceback (most recent call last):
+...
+ValidationError: [u'Enter a valid Austrian Social Security Number in XXXX XXXXXX format.']
+"""
diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py
index bb0e30b..0891c1b 100644
--- a/tests/regressiontests/forms/tests.py
+++ b/tests/regressiontests/forms/tests.py
@@ -4,6 +4,7 @@ from fields import tests as fields_tests
 from forms import tests as form_tests
 from error_messages import tests as custom_error_message_tests
 from localflavor.ar import tests as localflavor_ar_tests
+from localflavor.at import tests as localflavor_at_tests
 from localflavor.au import tests as localflavor_au_tests
 from localflavor.br import tests as localflavor_br_tests
 from localflavor.ca import tests as localflavor_ca_tests
@@ -33,6 +34,7 @@ __test__ = {
     'form_tests': form_tests,
     'custom_error_message_tests': custom_error_message_tests,
     'localflavor_ar_tests': localflavor_ar_tests,
+    'localflavor_at_tests': localflavor_at_tests,
     'localflavor_au_tests': localflavor_au_tests,
     'localflavor_br_tests': localflavor_br_tests,
     'localflavor_ca_tests': localflavor_ca_tests,
