Index: django/conf/project_template/settings.py
===================================================================
--- django/conf/project_template/settings.py	(revision 8168)
+++ django/conf/project_template/settings.py	(working copy)
@@ -57,12 +57,22 @@
 #     'django.template.loaders.eggs.load_template_source',
 )
 
-MIDDLEWARE_CLASSES = (
-    'django.middleware.common.CommonMiddleware',
-    'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.contrib.auth.middleware.AuthenticationMiddleware',
-    'django.middleware.doc.XViewMiddleware',
-)
+MIDDLEWARE_CLASSES = {
+    'request': (
+        'django.middleware.common.CommonMiddleware',
+        'django.contrib.sessions.middleware.SessionMiddleware',
+        'django.contrib.auth.middleware.AuthenticationMiddleware',
+    ),
+    'response': (
+        'django.contrib.sessions.middleware.SessionMiddleware',
+#        'django.middleware.http.ConditionalGetMiddleware',
+#        'django.middleware.gzip.GZipMiddleware',
+        'django.middleware.common.CommonMiddleware',
+    ),
+    'view': (
+        'django.middleware.doc.XViewMiddleware',
+    ),
+}
 
 ROOT_URLCONF = '{{ project_name }}.urls'
 
Index: django/conf/global_settings.py
===================================================================
--- django/conf/global_settings.py	(revision 8168)
+++ django/conf/global_settings.py	(working copy)
@@ -288,17 +288,24 @@
 # MIDDLEWARE #
 ##############
 
-# List of middleware classes to use.  Order is important; in the request phase,
-# this middleware classes will be applied in the order given, and in the
-# response phase the middleware will be applied in reverse order.
-MIDDLEWARE_CLASSES = (
-    'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.contrib.auth.middleware.AuthenticationMiddleware',
-#     'django.middleware.http.ConditionalGetMiddleware',
-#     'django.middleware.gzip.GZipMiddleware',
-    'django.middleware.common.CommonMiddleware',
-    'django.middleware.doc.XViewMiddleware',
-)
+# List of middleware classes to use.  Order is important; all middleware types
+# will be applied in the order given.
+MIDDLEWARE_CLASSES = {
+    'request': (
+        'django.middleware.common.CommonMiddleware',
+        'django.contrib.sessions.middleware.SessionMiddleware',
+        'django.contrib.auth.middleware.AuthenticationMiddleware',
+    ),
+    'response': (
+        'django.contrib.sessions.middleware.SessionMiddleware',
+#        'django.middleware.http.ConditionalGetMiddleware',
+#        'django.middleware.gzip.GZipMiddleware',
+        'django.middleware.common.CommonMiddleware',
+    ),
+    'view': (
+        'django.middleware.doc.XViewMiddleware',
+    ),
+}
 
 ############
 # SESSIONS #
Index: django/core/handlers/base.py
===================================================================
--- django/core/handlers/base.py	(revision 8168)
+++ django/core/handlers/base.py	(working copy)
@@ -1,6 +1,7 @@
 import sys
 
 from django import http
+from django.core import exceptions
 from django.core import signals
 from django.dispatch import dispatcher
 from django.utils.encoding import force_unicode
@@ -17,38 +18,39 @@
     def __init__(self):
         self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None
 
-    def load_middleware(self):
-        """
-        Populate middleware lists from settings.MIDDLEWARE_CLASSES.
+    def middleware_class_from_path(self, middleware_path):
+        try:
+            dot = middleware_path.rindex('.')
+        except ValueError:
+            raise exceptions.ImproperlyConfigured, '%s isn\'t a middleware module' % middleware_path
+        mw_module, mw_classname = middleware_path[:dot], middleware_path[dot+1:]
+        try:
+            mod = __import__(mw_module, {}, {}, [''])
+        except ImportError, e:
+            raise exceptions.ImproperlyConfigured, 'Error importing middleware %s: "%s"' % (mw_module, e)
+        try:
+            mw_class = getattr(mod, mw_classname)
+        except AttributeError:
+            raise exceptions.ImproperlyConfigured, 'Middleware module "%s" does not define a "%s" class' % (mw_module, mw_classname)
+        return mw_class 
 
-        Must be called after the environment is fixed (see __call__).
-        """
-        from django.conf import settings
-        from django.core import exceptions
-        self._request_middleware = []
-        self._view_middleware = []
-        self._response_middleware = []
-        self._exception_middleware = []
-        for middleware_path in settings.MIDDLEWARE_CLASSES:
-            try:
-                dot = middleware_path.rindex('.')
-            except ValueError:
-                raise exceptions.ImproperlyConfigured, '%s isn\'t a middleware module' % middleware_path
-            mw_module, mw_classname = middleware_path[:dot], middleware_path[dot+1:]
-            try:
-                mod = __import__(mw_module, {}, {}, [''])
-            except ImportError, e:
-                raise exceptions.ImproperlyConfigured, 'Error importing middleware %s: "%s"' % (mw_module, e)
-            try:
-                mw_class = getattr(mod, mw_classname)
-            except AttributeError:
-                raise exceptions.ImproperlyConfigured, 'Middleware module "%s" does not define a "%s" class' % (mw_module, mw_classname)
+    def middleware_from_list(self, middleware_classes):
+        mw_list = []
+        for middleware_path in middleware_classes:
+            mw_class = self.middleware_class_from_path(middleware_path)
 
             try:
                 mw_instance = mw_class()
             except exceptions.MiddlewareNotUsed:
                 continue
+            else:
+                mw_list.append(mw_instance)
+        return mw_list
 
+    def _load_middleware_legacy(self, mw_class_list):
+        mw_list = self.middleware_from_list(mw_class_list)
+
+        for mw_instance in mw_list:
             if hasattr(mw_instance, 'process_request'):
                 self._request_middleware.append(mw_instance.process_request)
             if hasattr(mw_instance, 'process_view'):
@@ -58,9 +60,31 @@
             if hasattr(mw_instance, 'process_exception'):
                 self._exception_middleware.insert(0, mw_instance.process_exception)
 
+    def load_middleware(self):
+        """
+        Populate middleware lists from settings.MIDDLEWARE_CLASSES.
+
+        Must be called after the environment is fixed (see __call__).
+        """
+        from django.conf import settings
+        self._request_middleware = []
+        self._view_middleware = []
+        self._response_middleware = []
+        self._exception_middleware = []
+
+        MIDDLEWARE_CLASSES = settings.MIDDLEWARE_CLASSES
+
+        if isinstance(MIDDLEWARE_CLASSES, (tuple, list)):
+            self._load_middleware_legacy(MIDDLEWARE_CLASSES)
+        else:
+            self._request_middleware = self.middleware_from_list(MIDDLEWARE_CLASSES.get('request', []))
+            self._view_middleware = self.middleware_from_list(MIDDLEWARE_CLASSES.get('view', []))
+            self._response_middleware = self.middleware_from_list(MIDDLEWARE_CLASSES.get('response', []))
+            self._exception_middleware = self.middleware_from_list(MIDDLEWARE_CLASSES.get('exception', []))
+
     def get_response(self, request):
         "Returns an HttpResponse object for the given HttpRequest"
-        from django.core import exceptions, urlresolvers
+        from django.core import urlresolvers
         from django.conf import settings
 
         # Apply request middleware
