diff --git a/django/views/base.py b/django/views/base.py
new file mode 100644
index 0000000..924e0d4
--- /dev/null
+++ b/django/views/base.py
@@ -0,0 +1,80 @@
+from functools import update_wrapper
+
+from django import http
+from django.utils.decorators import classonlymethod
+from django.utils.log import getLogger
+
+logger = getLogger('django.request')
+
+class View(object):
+    """
+    Intentionally simple parent class for all class-based views. Only
+    implements dispatch-by-method and simple sanity checking.
+    """
+
+    http_method_names = ['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
+
+    def __init__(self, **kwargs):
+        """
+        Constructor. Called in the URLconf; can contain helpful extra
+        keyword arguments, and other things.
+        """
+        # Go through keyword arguments, and either save their values to our
+        # instance, or raise an error.
+        for key, value in kwargs.iteritems():
+            setattr(self, key, value)
+
+    @classonlymethod
+    def as_view(cls, **initkwargs):
+        """
+        Main entry point for a request-response process.
+        """
+        # sanitize keyword arguments
+        for key in initkwargs:
+            if key in cls.http_method_names:
+                raise TypeError(u"You tried to pass in the %s method name as a "
+                                u"keyword argument to %s(). Don't do that."
+                                % (key, cls.__name__))
+            if not hasattr(cls, key):
+                raise TypeError(u"%s() received an invalid keyword %r" % (
+                    cls.__name__, key))
+
+        def view(request, *args, **kwargs):
+            self = cls(**initkwargs)
+            return self.dispatch(request, *args, **kwargs)
+
+        # take name and docstring from class
+        update_wrapper(view, cls, updated=())
+
+        # and possible attributes set by decorators
+        # like csrf_exempt from dispatch
+        update_wrapper(view, cls.dispatch, assigned=())
+        return view
+
+    def dispatch(self, request, *args, **kwargs):
+        # Try to dispatch to the right method; if a method doesn't exist,
+        # defer to the error handler. Also defer to the error handler if the
+        # request method isn't on the approved list.
+        if request.method.lower() in self.http_method_names:
+            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
+        else:
+            handler = self.http_method_not_allowed
+        self.request = request
+        self.args = args
+        self.kwargs = kwargs
+        return handler(request, *args, **kwargs)
+
+    def http_method_not_allowed(self, request, *args, **kwargs):
+        allowed_methods = [m for m in self.http_method_names if hasattr(self, m)]
+        logger.warning('Method Not Allowed (%s): %s' % (request.method, request.path),
+            extra={
+                'status_code': 405,
+                'request': self.request
+            }
+        )
+        return http.HttpResponseNotAllowed(allowed_methods)
+
+    def head(self, *args, **kwargs):
+        return self.get(*args, **kwargs)
+
+
diff --git a/django/views/generic/__init__.py b/django/views/generic/__init__.py
index 1a98067..900d039 100644
--- a/django/views/generic/__init__.py
+++ b/django/views/generic/__init__.py
@@ -1,4 +1,5 @@
-from django.views.generic.base import View, TemplateView, RedirectView
+from django.views.base import View
+from django.views.generic.base import TemplateView, RedirectView
 from django.views.generic.dates import (ArchiveIndexView, YearArchiveView, MonthArchiveView,
                                      WeekArchiveView, DayArchiveView, TodayArchiveView,
                                      DateDetailView)
diff --git a/django/views/generic/base.py b/django/views/generic/base.py
index f2d4950..90e321d 100644
--- a/django/views/generic/base.py
+++ b/django/views/generic/base.py
@@ -1,85 +1,12 @@
-from functools import update_wrapper
 from django import http
 from django.core.exceptions import ImproperlyConfigured
 from django.template.response import TemplateResponse
 from django.utils.log import getLogger
-from django.utils.decorators import classonlymethod
+from django.views.base import View
 
 logger = getLogger('django.request')
 
 
-class View(object):
-    """
-    Intentionally simple parent class for all views. Only implements
-    dispatch-by-method and simple sanity checking.
-    """
-
-    http_method_names = ['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
-
-    def __init__(self, **kwargs):
-        """
-        Constructor. Called in the URLconf; can contain helpful extra
-        keyword arguments, and other things.
-        """
-        # Go through keyword arguments, and either save their values to our
-        # instance, or raise an error.
-        for key, value in kwargs.iteritems():
-            setattr(self, key, value)
-
-    @classonlymethod
-    def as_view(cls, **initkwargs):
-        """
-        Main entry point for a request-response process.
-        """
-        # sanitize keyword arguments
-        for key in initkwargs:
-            if key in cls.http_method_names:
-                raise TypeError(u"You tried to pass in the %s method name as a "
-                                u"keyword argument to %s(). Don't do that."
-                                % (key, cls.__name__))
-            if not hasattr(cls, key):
-                raise TypeError(u"%s() received an invalid keyword %r" % (
-                    cls.__name__, key))
-
-        def view(request, *args, **kwargs):
-            self = cls(**initkwargs)
-            return self.dispatch(request, *args, **kwargs)
-
-        # take name and docstring from class
-        update_wrapper(view, cls, updated=())
-
-        # and possible attributes set by decorators
-        # like csrf_exempt from dispatch
-        update_wrapper(view, cls.dispatch, assigned=())
-        return view
-
-    def dispatch(self, request, *args, **kwargs):
-        # Try to dispatch to the right method; if a method doesn't exist,
-        # defer to the error handler. Also defer to the error handler if the
-        # request method isn't on the approved list.
-        if request.method.lower() in self.http_method_names:
-            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
-        else:
-            handler = self.http_method_not_allowed
-        self.request = request
-        self.args = args
-        self.kwargs = kwargs
-        return handler(request, *args, **kwargs)
-
-    def http_method_not_allowed(self, request, *args, **kwargs):
-        allowed_methods = [m for m in self.http_method_names if hasattr(self, m)]
-        logger.warning('Method Not Allowed (%s): %s' % (request.method, request.path),
-            extra={
-                'status_code': 405,
-                'request': self.request
-            }
-        )
-        return http.HttpResponseNotAllowed(allowed_methods)
-
-    def head(self, *args, **kwargs):
-        return self.get(*args, **kwargs)
-
-
 class TemplateResponseMixin(object):
     """
     A mixin that can be used to render a template.
diff --git a/django/views/generic/dates.py b/django/views/generic/dates.py
index c10db30..b9661fa 100644
--- a/django/views/generic/dates.py
+++ b/django/views/generic/dates.py
@@ -4,7 +4,7 @@ from django.core.exceptions import ImproperlyConfigured
 from django.http import Http404
 from django.utils.encoding import force_unicode
 from django.utils.translation import ugettext as _
-from django.views.generic.base import View
+from django.views.base import View
 from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResponseMixin
 from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin
 
diff --git a/django/views/generic/detail.py b/django/views/generic/detail.py
index ab21573..eccbf2e 100644
--- a/django/views/generic/detail.py
+++ b/django/views/generic/detail.py
@@ -2,7 +2,8 @@ from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
 from django.http import Http404
 from django.utils.encoding import smart_str
 from django.utils.translation import ugettext as _
-from django.views.generic.base import TemplateResponseMixin, View
+from django.views.base import View
+from django.views.generic.base import TemplateResponseMixin
 
 
 class SingleObjectMixin(object):
diff --git a/django/views/generic/edit.py b/django/views/generic/edit.py
index 3cade52..4ab01d0 100644
--- a/django/views/generic/edit.py
+++ b/django/views/generic/edit.py
@@ -1,7 +1,8 @@
 from django.forms import models as model_forms
 from django.core.exceptions import ImproperlyConfigured
 from django.http import HttpResponseRedirect
-from django.views.generic.base import TemplateResponseMixin, View
+from django.views.base import View
+from django.views.generic.base import TemplateResponseMixin
 from django.views.generic.detail import (SingleObjectMixin,
                         SingleObjectTemplateResponseMixin, BaseDetailView)
 
diff --git a/django/views/generic/list.py b/django/views/generic/list.py
index 9797356..6d04ac2 100644
--- a/django/views/generic/list.py
+++ b/django/views/generic/list.py
@@ -3,7 +3,8 @@ from django.core.exceptions import ImproperlyConfigured
 from django.http import Http404
 from django.utils.encoding import smart_str
 from django.utils.translation import ugettext as _
-from django.views.generic.base import TemplateResponseMixin, View
+from django.views.base import View
+from django.views.generic.base import TemplateResponseMixin
 
 
 class MultipleObjectMixin(object):
diff --git a/tests/regressiontests/generic_views/base.py b/tests/regressiontests/generic_views/base.py
index 40490a4..58241e3 100644
--- a/tests/regressiontests/generic_views/base.py
+++ b/tests/regressiontests/generic_views/base.py
@@ -4,7 +4,8 @@ import unittest
 from django.core.exceptions import ImproperlyConfigured
 from django.http import HttpResponse
 from django.test import TestCase, RequestFactory
-from django.views.generic import View, TemplateView, RedirectView
+from django.views.base import View
+from django.views.generic import TemplateView, RedirectView
 
 
 class SimpleView(View):
diff --git a/tests/regressiontests/special_headers/views.py b/tests/regressiontests/special_headers/views.py
index ce94036..91a8b5b 100644
--- a/tests/regressiontests/special_headers/views.py
+++ b/tests/regressiontests/special_headers/views.py
@@ -1,7 +1,7 @@
 # -*- coding:utf-8 -*-
 from django.http import HttpResponse
 from django.utils.decorators import decorator_from_middleware
-from django.views.generic import View
+from django.views.base import View
 from django.middleware.doc import XViewMiddleware
 
 xview_dec = decorator_from_middleware(XViewMiddleware)
