Index: django/core/handlers/base.py
===================================================================
--- django/core/handlers/base.py	(revision 8166)
+++ django/core/handlers/base.py	(working copy)
@@ -17,6 +17,25 @@
     def __init__(self):
         self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None
 
+    def middleware_class_from_path(middleware_path):
+        from django.core import exceptions
+        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
+    middleware_class_from_path = staticmethod(middleware_class_from_path)
+
+
     def load_middleware(self):
         """
         Populate middleware lists from settings.MIDDLEWARE_CLASSES.
@@ -29,34 +48,42 @@
         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)
+       
 
+        # Get incoming and outgoing middleware orders and make sure they contain the same paths
+        incoming_middleware_order = settings.MIDDLEWARE_CLASSES
+        outgoing_middleware_order = getattr(settings, 'OUTBOUND_MIDDLEWARE_ORDER', None)
+        if outgoing_middleware_order:
+            if not len(incoming_middleware_order) == len(outgoing_middleware_order):
+                raise exceptions.ImproperlyConfigured, 'OUTBOUND_MIDDLEWARE_ORDER must contain the same middleware as MIDDLEWARE_CLASSES'
+            for middleware_path in incoming_middleware_order:
+                if not middleware_path in outgoing_middleware_order:
+                    raise exceptions.ImproperlyConfigured, 'OUTBOUND_MIDDLEWARE_ORDER does not contain %s MIDDLEWARE_CLASSES' % middleware_path
+        else:
+            outgoing_middleware_order = list(incoming_middleware_order)
+            outgoing_middleware_order.reverse()
+        
+        instances = {}
+        for middleware_path in incoming_middleware_order:
+            mw_class = self.middleware_class_from_path(middleware_path)
             try:
                 mw_instance = mw_class()
             except exceptions.MiddlewareNotUsed:
                 continue
-
+            instances[middleware_path] = mw_instance
             if hasattr(mw_instance, 'process_request'):
                 self._request_middleware.append(mw_instance.process_request)
             if hasattr(mw_instance, 'process_view'):
                 self._view_middleware.append(mw_instance.process_view)
+                
+        for middleware_path in outgoing_middleware_order:
+            if not middleware_path in instances: # If it MiddlewareNotUsed
+                continue
+            mw_instance = instances[middleware_path]
             if hasattr(mw_instance, 'process_response'):
-                self._response_middleware.insert(0, mw_instance.process_response)
+                self._response_middleware.append(mw_instance.process_response)
             if hasattr(mw_instance, 'process_exception'):
-                self._exception_middleware.insert(0, mw_instance.process_exception)
+                self._exception_middleware.append(mw_instance.process_exception)
 
     def get_response(self, request):
         "Returns an HttpResponse object for the given HttpRequest"
