Index: django/contrib/localflavor/ro/forms.py
===================================================================
--- django/contrib/localflavor/ro/forms.py	(revision 10844)
+++ django/contrib/localflavor/ro/forms.py	(working copy)
@@ -8,6 +8,7 @@
 from django.forms import ValidationError, Field, RegexField, Select
 from django.forms.fields import EMPTY_VALUES
 from django.utils.translation import ugettext_lazy as _
+from django.contrib.localflavor.generic.util import validate_iban
 
 class ROCIFField(RegexField):
     """
@@ -150,20 +151,10 @@
         Strips - and spaces, performs country code and checksum validation
         """
         value = super(ROIBANField, self).clean(value)
-        value = value.replace('-','')
-        value = value.replace(' ','')
-        value = value.upper()
-        if value[0:2] != 'RO':
+        if validate_iban(value, 20):
+            return value
+        else:
             raise ValidationError(self.error_messages['invalid'])
-        numeric_format = ''
-        for char in value[4:] + value[0:4]:
-            if char.isalpha():
-                numeric_format += str(ord(char) - 55)
-            else:
-                numeric_format += char
-        if int(numeric_format) % 97 != 1:
-            raise ValidationError(self.error_messages['invalid'])
-        return value
 
 class ROPhoneNumberField(RegexField):
     """Romanian phone number field"""
Index: django/contrib/localflavor/generic/util.py
===================================================================
--- django/contrib/localflavor/generic/util.py	(revision 0)
+++ django/contrib/localflavor/generic/util.py	(revision 0)
@@ -0,0 +1,25 @@
+def validate_iban(value, length):
+    '''
+    Validate an International Bank Account Number (IBAN)
+    
+    Based on 
+    * http://en.wikipedia.org/wiki/International_Bank_Account_Number#Calculating_and_validating_IBAN_checksums
+    * and django.contrib.localflavor.ro.ROIBANField
+    
+    @param value: the value to check
+    @param length: the length of the BBAN specific to each country 
+    '''
+    value = value.replace('-', '')
+    value = value.replace('', '')
+    if not len(value) == length:
+        return False
+    
+    value = value.upper()
+    for char in value[4:] + value[0:4]:
+        if char.isalpha():
+            numeric_format += str(ord(char) - 55)
+        else:
+            numeric_format += char
+    if int(numeric_format) % 97 != 1:
+        return False
+    return value
\ No newline at end of file
Index: django/contrib/localflavor/hu/__init__.py
===================================================================
Index: django/contrib/localflavor/hu/forms.py
===================================================================
--- django/contrib/localflavor/hu/forms.py	(revision 0)
+++ django/contrib/localflavor/hu/forms.py	(revision 0)
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*
+"""
+IT-specific Form helpers
+"""
+
+from django.forms import ValidationError
+from django.forms.fields import Field, RegexField, Select, EMPTY_VALUES
+from django.utils.translation import ugettext_lazy as _
+from django.utils.encoding import smart_unicode
+from django.contrib.localflavor.generic.util import validate_iban
+import re
+
+class HUZipCodeField(RegexField):
+    default_error_messages = {
+        'invalid': _('Enter a valid zip code.'),
+    }
+    def __init__(self, *args, **kwargs):
+        super(HUZipCodeField, self).__init__(r'^\d{4}$',
+        max_length=None, min_length=None, *args, **kwargs)
+
+class HUVatNumberField(Field):
+    """
+    A form field that validates Hungarian VAT numbers (adószám).
+    """
+    default_error_messages = {
+        'invalid': _(u'Enter a valid VAT number.'),
+    }
+
+    def clean(self, value):
+        value = super(HUVatNumberField, self).clean(value)
+        if value == u'':
+            return value
+        try:
+            vat_number = int(value)
+        except ValueError:
+            raise ValidationError(self.error_messages['invalid'])
+        
+        if not len(vat_number) == 11:
+            raise ValidationError(self.error_messages['invalid'])
+        elif not vat_number[9] in (1,2,3):
+            raise ValidationError(self.error_messages['invalid'])
+        return smart_unicode(vat_number)
+    
+class HUIBANField(RegexField):
+    '''
+    A form field that validates Hungarian IBAN codes
+    
+    Format: HUkk BBBB BBBC CCCC CCCC CCCC CCCC
+        B = bank code, C = account No.
+    '''
+    default_error_messages = {
+          'invalid': _('Enter a valid IBAN number in the format HUkk XXXX XXXX XXXX XXXX XXXX XXXX'),
+      }
+    def __init__(self, *args, **kwargs):
+        super(HUIBANField, self).__init__(r'^HU[0-9-\s]{26,30}$',
+            max_length=32, min_length=28, *args, **kwargs)
+
+    def clean(self, value):
+        '''
+        Strips unnecessary values, and perform checksum validation
+        '''
+        value = super(HUIBANField, self).clean(value)
+        if validate_iban(value, 24):
+            return value
+        else:
+            raise ValidationError(self.error_messages['invalid'])
+
+class HUPhoneNumberField(RegexField):
+    '''
+    A form field to represent Hungarian phone numbers
+    '''
+    default_error_messages = {
+      'invalid': _('Enter a valid phone number. E.g. 1/234-5678')
+      }
+    def __init__(self, *args, **kwargs):
+        super(HUPhoneNumberField, self).__init__(r'^\d{8,15}$',
+             max_length=16, min_length=7, *args, **kwargs)
+        
+    def clean(self, value):
+        '''
+        Strip 06, whitespaces, dashes
+        '''
+        value = super(HUPhoneNumberField, self).clean(value)
+        value = value.replace(' ', '')
+        value = value.replace('-', '')
+        value = value.replace('/', '')
+        value = value[:2] == '06' and value[2:] or value
+        # mobile phone numbers might have 8 digits
+        if not len(value) == 8: # Bp: 1+7, other: 2+6
+            raise ValidationError(self.error_messages['invalid'])
+        elif len(value) == 10 and value[:2] not in (20, 30, 70, 71):
+            raise ValidationError(self.error_messages['invalid'])
+        return value
Index: docs/ref/contrib/localflavor.txt
===================================================================
--- docs/ref/contrib/localflavor.txt	(revision 10844)
+++ docs/ref/contrib/localflavor.txt	(working copy)
@@ -48,6 +48,7 @@
     * Finland_
     * France_
     * Germany_
+    * Hungary_
     * Iceland_
     * India_
     * Italy_
@@ -88,6 +89,7 @@
 .. _Finland: `Finland (fi)`_
 .. _France: `France (fr)`_
 .. _Germany: `Germany (de)`_
+.. _Hungary: `Hungary (hu`_
 .. _The Netherlands: `The Netherlands (nl)`_
 .. _Iceland: `Iceland (is\_)`_
 .. _India: `India (in\_)`_
@@ -308,7 +310,26 @@
 .. class:: de.forms.DEStateSelect
 
     A ``Select`` widget that uses a list of German states as its choices.
+    
+Hungary (``hu``)
+================
 
+.. class:: hu.forms.HUZipCodeField
+
+	A form field to check Hungarian ZIP codes. They should be 4 digits long.
+	
+.. class:: hu.forms.HUVatNumberField
+
+	A form field to check Hungarian VAT numbers (adószám).
+	
+.. class:: hu.forms.HUIBANField
+
+	A form field to check Hungarian IBAN numbers.
+	
+.. class:: hu.forms.HUPhoneNumberField
+
+	A form field to check Hungarian phone numbers.
+
 The Netherlands (``nl``)
 ========================
 
