diff --git a/django/core/management/commands/runserver.py b/django/core/management/commands/runserver.py
index 49e270d..618fa4d 100644
--- a/django/core/management/commands/runserver.py
+++ b/django/core/management/commands/runserver.py
@@ -1,12 +1,19 @@
 from optparse import make_option
 import os
+import socket
 import sys
 import warnings
+import re
 
 from django.core.management.base import BaseCommand, CommandError
 
+naiveip_re = r'^(?:(?P<addr>\d{1,3}(?:\.\d{1,3}){3}|\[[a-fA-F0-9:]+\]):)?(?P<port>\d+)$'
+DEFAULT_PORT = "8000"
+
 class Command(BaseCommand):
     option_list = BaseCommand.option_list + (
+        make_option('--ipv6', '-6', action='store_true', dest='enable_ipv6', default=False,
+            help='Force the use of IPv6 address.'),
         make_option('--noreload', action='store_false', dest='use_reloader', default=True,
             help='Tells Django to NOT use the auto-reloader.'),
         make_option('--nostatic', action="store_false", dest='use_static_handler', default=True,
@@ -27,22 +34,30 @@ class Command(BaseCommand):
         from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException
         from django.core.handlers.wsgi import WSGIHandler
         from django.contrib.staticfiles.handlers import StaticFilesHandler
+        enable_ipv6 = options.get('enable_ipv6')
+        if enable_ipv6 and not hasattr(socket, 'AF_INET6'):
+            raise CommandError("Your Python does not support IPv6.")
+
         if args:
             raise CommandError('Usage is runserver %s' % self.args)
         if not addrport:
             addr = ''
-            port = '8000'
+            port = DEFAULT_PORT
         else:
-            try:
-                addr, port = addrport.split(':')
-            except ValueError:
-                addr, port = '', addrport
+            m = re.match(naiveip_re, addrport)
+            if m is None:
+                raise CommandError("%r is not a valid port number or address:port pair." % addrport)
+            addr, port = m.groups()
+            if not port.isdigit():
+                raise CommandError("%r is not a valid port number." % port)
+            if addr:
+                if addr[0] == '[' and addr[-1] == ']':
+                    enable_ipv6 = True
+                    addr = addr[1:-1]
+                elif enable_ipv6:
+                    raise CommandError("IPv6 addresses must be surrounded with brackets")
         if not addr:
-            addr = '127.0.0.1'
-
-        if not port.isdigit():
-            raise CommandError("%r is not a valid port number." % port)
-
+            addr = (enable_ipv6 and '::1') or '127.0.0.1'
         use_reloader = options.get('use_reloader', True)
         admin_media_path = options.get('admin_media_path', '')
         shutdown_message = options.get('shutdown_message', '')
@@ -56,7 +71,8 @@ class Command(BaseCommand):
             print "Validating models..."
             self.validate(display_num_errors=True)
             print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
-            print "Development server is running at http://%s:%s/" % (addr, port)
+            fmt_addr = (enable_ipv6 and '[%s]' % addr) or addr
+            print "Development server is running at http://%s:%s/" % (fmt_addr, port)
             print "Quit the server with %s." % quit_command
 
             # django.core.management.base forces the locale to en-us. We should
@@ -73,7 +89,7 @@ class Command(BaseCommand):
                     handler = StaticFilesHandler(handler)
                 # serve admin media like old-school (deprecation pending)
                 handler = AdminMediaHandler(handler, admin_media_path)
-                run(addr, int(port), handler)
+                run(addr, int(port), handler, enable_ipv6=enable_ipv6)
             except WSGIServerException, e:
                 # Use helpful error messages instead of ugly tracebacks.
                 ERRORS = {
diff --git a/django/core/management/commands/testserver.py b/django/core/management/commands/testserver.py
index d3d9698..be5b9ea 100644
--- a/django/core/management/commands/testserver.py
+++ b/django/core/management/commands/testserver.py
@@ -9,6 +9,8 @@ class Command(BaseCommand):
         make_option('--addrport', action='store', dest='addrport',
             type='string', default='',
             help='port number or ipaddr:port to run the server on'),
+        make_option('--ipv6', '-6', action='store_true', dest='enable_ipv6', default=False,
+            help='Forces IPv6 support.'),
     )
     help = 'Runs a development server with data from the given fixture(s).'
     args = '[fixture ...]'
@@ -33,4 +35,4 @@ class Command(BaseCommand):
         # a strange error -- it causes this handle() method to be called
         # multiple times.
         shutdown_message = '\nServer stopped.\nNote that the test database, %r, has not been deleted. You can explore it on your own.' % db_name
-        call_command('runserver', addrport=addrport, shutdown_message=shutdown_message, use_reloader=False)
+        call_command('runserver', addrport=addrport, shutdown_message=shutdown_message, use_reloader=False, enable_ipv6=options['enable_ipv6'])
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index 9c92a88..35bb990 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -10,6 +10,7 @@ been reviewed for security issues. Don't use it for production use.
 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
 import os
 import re
+import socket
 import sys
 import urllib
 import warnings
@@ -678,9 +679,12 @@ class AdminMediaHandler(StaticFilesHandler):
         """
         return path.startswith(self.media_url[2]) and not self.media_url[1]
 
+class WSGIServerV6(WSGIServer):
+    address_family = socket.AF_INET6
 
-def run(addr, port, wsgi_handler):
+def run(addr, port, wsgi_handler, enable_ipv6=False):
     server_address = (addr, port)
-    httpd = WSGIServer(server_address, WSGIRequestHandler)
+    server_class = (enable_ipv6 and WSGIServerV6) or WSGIServer
+    httpd = server_class(server_address, WSGIRequestHandler)
     httpd.set_app(wsgi_handler)
     httpd.serve_forever()
diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt
index 14fc69f..0570fcb 100644
--- a/docs/ref/django-admin.txt
+++ b/docs/ref/django-admin.txt
@@ -630,7 +630,7 @@ runserver [port or ipaddr:port]
 .. django-admin:: runserver
 
 Starts a lightweight development Web server on the local machine. By default,
-the server runs on port 8000 on the IP address 127.0.0.1. You can pass in an
+the server runs on port 8000 on the IP address ``127.0.0.1``. You can pass in an
 IP address and port number explicitly.
 
 If you run this script as a user with normal privileges (recommended), you
@@ -654,10 +654,15 @@ them to standard output, but it won't stop the server.
 You can run as many servers as you want, as long as they're on separate ports.
 Just execute ``django-admin.py runserver`` more than once.
 
-Note that the default IP address, 127.0.0.1, is not accessible from other
+Note that the default IP address, ``127.0.0.1``, is not accessible from other
 machines on your network. To make your development server viewable to other
 machines on the network, use its own IP address (e.g. ``192.168.2.1``) or
-``0.0.0.0``.
+``0.0.0.0`` or ``::`` (with IPv6 enabled).
+
+.. versionchanged:: 1.3
+
+You can also provide an IPv6 address surrounded by brackets
+(eg. ``[200a::1]:8000``). This will automaticaly enable IPv6 support.
 
 .. django-admin-option:: --adminmedia
 
@@ -706,25 +711,49 @@ Example usage::
 
     django-admin.py runserver --insecure
 
+.. django-admin-option:: --ipv6, -6
+
+.. versionadded:: 1.3
+
+Use the ``--ipv6`` (or shorter ``-6``) option to tell Django to use IPv6 for
+the development server. This changes the default IP address from
+``127.0.0.1`` to ``::1``.
+
+Example usage::
+
+    django-admin.py runserver --ipv6
+
 Examples of using different ports and addresses
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-Port 8000 on IP address 127.0.0.1::
+Port 8000 on IP address ``127.0.0.1``::
 
-	django-admin.py runserver
+    django-admin.py runserver
 
-Port 8000 on IP address 1.2.3.4::
+Port 8000 on IP address ``1.2.3.4``::
 
-	django-admin.py runserver 1.2.3.4:8000
+    django-admin.py runserver 1.2.3.4:8000
 
-Port 7000 on IP address 127.0.0.1::
+Port 7000 on IP address ``127.0.0.1``::
 
     django-admin.py runserver 7000
 
-Port 7000 on IP address 1.2.3.4::
+Port 7000 on IP address ``1.2.3.4``::
 
     django-admin.py runserver 1.2.3.4:7000
 
+Port 8000 on IPv6 address ``::1``::
+
+    django-admin.py runserver -6
+
+Port 7000 on IPv6 address ``::1``::
+
+    django-admin.py runserver -6 7000
+
+Port 7000 on IPv6 address ``2001:0db8:1234:5678::9``::
+
+    django-admin.py runserver [2001:0db8:1234:5678::9]:7000
+
 Serving static files with the development server
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -988,7 +1017,7 @@ templates.
 .. django-admin-option:: --addrport [port number or ipaddr:port]
 
 Use ``--addrport`` to specify a different port, or IP address and port, from
-the default of 127.0.0.1:8000. This value follows exactly the same format and
+the default of ``127.0.0.1:8000``. This value follows exactly the same format and
 serves exactly the same function as the argument to the ``runserver`` command.
 
 Examples:
