Index: tests/regressiontests/forms/tests/__init__.py
===================================================================
--- tests/regressiontests/forms/tests/__init__.py	(revision 16150)
+++ tests/regressiontests/forms/tests/__init__.py	(working copy)
@@ -33,6 +33,7 @@
     IELocalFlavorTests,
     ILLocalFlavorTests,
     ISLocalFlavorTests,
+    INLocalFlavorTests,
     ITLocalFlavorTests,
     JPLocalFlavorTests,
     KWLocalFlavorTests,
Index: tests/regressiontests/forms/localflavor/in_.py
===================================================================
--- tests/regressiontests/forms/localflavor/in_.py	(revision 0)
+++ tests/regressiontests/forms/localflavor/in_.py	(revision 0)
@@ -0,0 +1,159 @@
+import warnings
+
+from django.contrib.localflavor.in_.forms import (INZipCodeField,
+                                                  INStateField, INStateSelect)
+
+from utils import LocalFlavorTestCase
+
+
+class INLocalFlavorTests(LocalFlavorTestCase):
+    def test_INPStateSelect(self):
+        f = INStateSelect()
+        out = u'''<select name="state">
+<option value="KA">Karnataka</option>
+<option value="AP" selected="selected">Andhra Pradesh</option>
+<option value="KL">Kerala</option>
+<option value="TN">Tamil Nadu</option>
+<option value="MH">Maharashtra</option>
+<option value="UP">Uttar Pradesh</option>
+<option value="GA">Goa</option>
+<option value="GJ">Gujarat</option>
+<option value="RJ">Rajasthan</option>
+<option value="HP">Himachal Pradesh</option>
+<option value="JK">Jammu and Kashmir</option>
+<option value="AR">Arunachal Pradesh</option>
+<option value="AS">Assam</option>
+<option value="BR">Bihar</option>
+<option value="CG">Chattisgarh</option>
+<option value="HR">Haryana</option>
+<option value="JH">Jharkhand</option>
+<option value="MP">Madhya Pradesh</option>
+<option value="MN">Manipur</option>
+<option value="ML">Meghalaya</option>
+<option value="MZ">Mizoram</option>
+<option value="NL">Nagaland</option>
+<option value="OR">Orissa</option>
+<option value="PB">Punjab</option>
+<option value="SK">Sikkim</option>
+<option value="TR">Tripura</option>
+<option value="UA">Uttarakhand</option>
+<option value="WB">West Bengal</option>
+<option value="AN">Andaman and Nicobar</option>
+<option value="CH">Chandigarh</option>
+<option value="DN">Dadra and Nagar Haveli</option>
+<option value="DD">Daman and Diu</option>
+<option value="DL">Delhi</option>
+<option value="LD">Lakshadweep</option>
+<option value="PY">Pondicherry</option>
+</select>'''
+        self.assertEqual(f.render('state', 'AP'), out)
+
+    def test_INZipCodeField(self):
+        error_format = [u'Enter a zip code in the format XXXXXXX.']
+        valid = {
+            '360311': '360311',
+            '360 311': '360311',
+
+        }
+        invalid = {
+            '36 0311': error_format,
+            '3603111': error_format,
+            '360 31': error_format,
+            '36031': error_format,
+            'O2B 2R3': error_format
+        }
+        self.assertFieldOutput(INZipCodeField, valid, invalid)
+
+    def test_INStateField(self):
+        error_format = [u'Enter an Indian state or territory.']
+        valid = {
+            'an': 'AN',
+            'AN': 'AN',
+            'andaman and nicobar': 'AN',
+            'andra pradesh': 'AP',
+            'andrapradesh': 'AP',
+            'andhrapradesh': 'AP',
+            'ap': 'AP',
+            'andhra pradesh': 'AP',
+            'ar': 'AR',
+            'arunachal pradesh': 'AR',
+            'assam': 'AS',
+            'as': 'AS',
+            'bihar': 'BR',
+            'br': 'BR',
+            'cg': 'CG',
+            'chattisgarh': 'CG',
+            'ch': 'CH',
+            'chandigarh': 'CH',
+            'daman and diu': 'DD',
+            'dd': 'DD',
+            'dl': 'DL',
+            'delhi': 'DL',
+            'dn': 'DN',
+            'dadra and nagar haveli': 'DN',
+            'ga': 'GA',
+            'goa': 'GA',
+            'gj': 'GJ',
+            'gujarat': 'GJ',
+            'himachal pradesh': 'HP',
+            'hp': 'HP',
+            'hr': 'HR',
+            'haryana': 'HR',
+            'jharkhand': 'JH',
+            'jh': 'JH',
+            'jammu and kashmir': 'JK',
+            'jk': 'JK',
+            'karnataka': 'KA',
+            'karnatka': 'KA',
+            'ka': 'KA',
+            'kerala': 'KL',
+            'kl': 'KL',
+            'ld': 'LD',
+            'lakshadweep': 'LD',
+            'maharastra': 'MH',
+            'mh': 'MH',
+            'maharashtra': 'MH',
+            'meghalaya': 'ML',
+            'ml': 'ML',
+            'mn': 'MN',
+            'manipur': 'MN',
+            'madhya pradesh': 'MP',
+            'mp': 'MP',
+            'mizoram': 'MZ',
+            'mizo': 'MZ',
+            'mz': 'MZ',
+            'nl': 'NL',
+            'nagaland': 'NL',
+            'orissa': 'OR',
+            'odisa': 'OR',
+            'orisa': 'OR',
+            'or': 'OR',
+            'pb': 'PB',
+            'punjab': 'PB',
+            'py': 'PY',
+            'pondicherry': 'PY',
+            'rajasthan': 'RJ',
+            'rajastan': 'RJ',
+            'rj': 'RJ',
+            'sikkim': 'SK',
+            'sk': 'SK',
+            'tamil nadu': 'TN',
+            'tn': 'TN',
+            'tamilnadu': 'TN',
+            'tamilnad': 'TN',
+            'tr': 'TR',
+            'tripura': 'TR',
+            'ua': 'UA',
+            'uttarakhand': 'UA',
+            'up': 'UP',
+            'uttar pradesh': 'UP',
+            'westbengal': 'WB',
+            'bengal': 'WB',
+            'wb': 'WB',
+            'west bengal': 'WB'
+        }
+        invalid = {
+            'florida': error_format,
+            'FL': error_format,
+        }
+        self.assertFieldOutput(INStateField, valid, invalid)
Index: tests/regressiontests/forms/localflavor/us.py
===================================================================
--- tests/regressiontests/forms/localflavor/us.py	(revision 16150)
+++ tests/regressiontests/forms/localflavor/us.py	(working copy)
@@ -104,7 +104,7 @@
         self.assertFieldOutput(USPhoneNumberField, valid, invalid)
 
     def test_USStateField(self):
-        error_invalid = [u'Enter a U.S. state or territory.']
+        error_invalid = [u'Enter an U.S. state or territory.']
         valid = {
             'il': 'IL',
             'IL': 'IL',
Index: tests/regressiontests/forms/localflavortests.py
===================================================================
--- tests/regressiontests/forms/localflavortests.py	(revision 16150)
+++ tests/regressiontests/forms/localflavortests.py	(working copy)
@@ -19,6 +19,7 @@
 from localflavor.ie import IELocalFlavorTests
 from localflavor.il import ILLocalFlavorTests
 from localflavor.is_ import ISLocalFlavorTests
+from localflavor.in_ import INLocalFlavorTests
 from localflavor.it import ITLocalFlavorTests
 from localflavor.jp import JPLocalFlavorTests
 from localflavor.kw import KWLocalFlavorTests
Index: django/contrib/localflavor/in_/in_states.py
===================================================================
--- django/contrib/localflavor/in_/in_states.py	(revision 16150)
+++ django/contrib/localflavor/in_/in_states.py	(working copy)
@@ -47,38 +47,88 @@
 )
 
 STATES_NORMALIZED = {
-    'ka': 'KA',
-    'karnatka': 'KA',
-    'tn': 'TN',
-    'tamilnad': 'TN',
-    'tamilnadu': 'TN',
+    'an': 'AN',
+    'andaman and nicobar': 'AN',
     'andra pradesh': 'AP',
     'andrapradesh': 'AP',
     'andhrapradesh': 'AP',
-    'maharastra': 'MH',
-    'mh': 'MH',
     'ap': 'AP',
+    'andhra pradesh': 'AP',
+    'ar': 'AR',
+    'arunachal pradesh': 'AR',
+    'assam': 'AS',
+    'as': 'AS',
+    'bihar': 'BR',
+    'br': 'BR',
+    'cg': 'CG',
+    'chattisgarh': 'CG',
+    'ch': 'CH',
+    'chandigarh': 'CH',
+    'daman and diu': 'DD',
+    'dd': 'DD',
     'dl': 'DL',
-    'dd': 'DD',
-    'br': 'BR',
-    'ar': 'AR',
-    'sk': 'SK',
-    'kl': 'KL',
+    'delhi': 'DL',
+    'dn': 'DN',
+    'dadra and nagar haveli': 'DN',
     'ga': 'GA',
-    'rj': 'RJ',
-    'rajastan': 'RJ',
-    'rajasthan': 'RJ',
+    'goa': 'GA',
+    'gj': 'GJ',
+    'gujarat': 'GJ',
+    'himachal pradesh': 'HP',
     'hp': 'HP',
-    'ua': 'UA',
-    'up': 'UP',
+    'hr': 'HR',
+    'haryana': 'HR',
+    'jharkhand': 'JH',
+    'jh': 'JH',
+    'jammu and kashmir': 'JK',
+    'jk': 'JK',
+    'karnataka': 'KA',
+    'karnatka': 'KA',
+    'ka': 'KA',
+    'kerala': 'KL',
+    'kl': 'KL',
+    'ld': 'LD',
+    'lakshadweep': 'LD',
+    'maharastra': 'MH',
+    'mh': 'MH',
+    'maharashtra': 'MH',
+    'meghalaya': 'ML',
+    'ml': 'ML',
+    'mn': 'MN',
+    'manipur': 'MN',
+    'madhya pradesh': 'MP',
     'mp': 'MP',
+    'mizoram': 'MZ',
+    'mizo': 'MZ',
     'mz': 'MZ',
-    'bengal': 'WB',
-    'westbengal': 'WB',
-    'mizo': 'MZ',
+    'nl': 'NL',
+    'nagaland': 'NL',
+    'orissa': 'OR',
+    'odisa': 'OR',
     'orisa': 'OR',
-    'odisa': 'OR',
     'or': 'OR',
-    'ar': 'AR',
+    'pb': 'PB',
+    'punjab': 'PB',
+    'py': 'PY',
+    'pondicherry': 'PY',
+    'rajasthan': 'RJ',
+    'rajastan': 'RJ',
+    'rj': 'RJ',
+    'sikkim': 'SK',
+    'sk': 'SK',
+    'tamil nadu': 'TN',
+    'tn': 'TN',
+    'tamilnadu': 'TN',
+    'tamilnad': 'TN',
+    'tr': 'TR',
+    'tripura': 'TR',
+    'ua': 'UA',
+    'uttarakhand': 'UA',
+    'up': 'UP',
+    'uttar pradesh': 'UP',
+    'westbengal': 'WB',
+    'bengal': 'WB',
+    'wb': 'WB',
+    'west bengal': 'WB'
 }
 
Index: django/contrib/localflavor/in_/forms.py
===================================================================
--- django/contrib/localflavor/in_/forms.py	(revision 16150)
+++ django/contrib/localflavor/in_/forms.py	(working copy)
@@ -16,8 +16,16 @@
     }
 
     def __init__(self, max_length=None, min_length=None, *args, **kwargs):
-        super(INZipCodeField, self).__init__(r'^\d{6}$',
+        super(INZipCodeField, self).__init__(r'^\d{3}\s?\d{3}$',
             max_length, min_length, *args, **kwargs)
+    
+    def clean(self, value):
+        super(INZipCodeField, self).clean(value)
+        if value in EMPTY_VALUES:
+            return u''
+        # Convert to "NNNNNN" if "NNN NNN" given
+        value = re.sub(r'^(\d{3})\s(\d{3})$', r'\1\2', value)
+        return value
 
 class INStateField(Field):
     """
@@ -26,7 +34,7 @@
     registration abbreviation for the given state or union territory
     """
     default_error_messages = {
-        'invalid': u'Enter a Indian state or territory.',
+        'invalid': u'Enter an Indian state or territory.',
     }
 
     def clean(self, value):
