diff --git a/djangorestframework/generics.py b/djangorestframework/generics.py
new file mode 100644
index 000000000..87a2a4b89
--- /dev/null
+++ b/djangorestframework/generics.py
@@ -0,0 +1,112 @@
+"""
+Generic views that provide commmonly needed behaviour.
+"""
+
+from djangorestframework import views, mixins
+from django.views.generic.detail import SingleObjectMixin
+from django.views.generic.list import MultipleObjectMixin
+
+
+### Base classes for the generic views ###
+
+class BaseView(views.APIView):
+    """
+    Base class for all other generic views.
+    """
+    serializer_class = None
+
+    def get_serializer(self, data=None, files=None, instance=None):
+        # TODO: add support for files
+        # TODO: add support for seperate serializer/deserializer
+        context = {
+            'request': self.request,
+            'format': self.kwargs.get('format', None)
+        }
+        return self.serializer_class(data, instance=instance, context=context)
+
+
+class MultipleObjectBaseView(MultipleObjectMixin, BaseView):
+    """
+    Base class for generic views onto a queryset.
+    """
+    pass
+
+
+class SingleObjectBaseView(SingleObjectMixin, BaseView):
+    """
+    Base class for generic views onto a model instance.
+    """
+
+    def get_object(self):
+        """
+        Override default to add support for object-level permissions.
+        """
+        super(self, SingleObjectBaseView).get_object()
+        self.check_permissions(self.request, self.object)
+
+
+### Concrete view classes that provide method handlers ###
+### by composing the mixin classes with a base view.   ###
+
+class ListAPIView(mixins.ListModelMixin,
+                  mixins.MetadataMixin,
+                  MultipleObjectBaseView):
+    """
+    Concrete view for listing a queryset.
+    """
+    def get(self, request, *args, **kwargs):
+        return self.list(request, *args, **kwargs)
+
+    def options(self, request, *args, **kwargs):
+        return self.metadata(request, *args, **kwargs)
+
+
+class RootAPIView(mixins.ListModelMixin,
+                  mixins.CreateModelMixin,
+                  mixins.MetadataMixin,
+                  MultipleObjectBaseView):
+    """
+    Concrete view for listing a queryset or creating a model instance.
+    """
+    def get(self, request, *args, **kwargs):
+        return self.list(request, *args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        return self.create(request, *args, **kwargs)
+
+    def options(self, request, *args, **kwargs):
+        return self.metadata(request, *args, **kwargs)
+
+
+class DetailAPIView(mixins.RetrieveModelMixin,
+                    mixins.MetadataMixin,
+                    SingleObjectBaseView):
+    """
+    Concrete view for retrieving a model instance.
+    """
+    def get(self, request, *args, **kwargs):
+        return self.retrieve(request, *args, **kwargs)
+
+    def options(self, request, *args, **kwargs):
+        return self.metadata(request, *args, **kwargs)
+
+
+class InstanceAPIView(mixins.RetrieveModelMixin,
+                      mixins.UpdateModelMixin,
+                      mixins.DestroyModelMixin,
+                      mixins.MetadataMixin,
+                      SingleObjectBaseView):
+    """
+    Concrete view for retrieving, updating or deleting a model instance.
+    """
+    def get(self, request, *args, **kwargs):
+        return self.retrieve(request, *args, **kwargs)
+
+    def put(self, request, *args, **kwargs):
+        return self.update(request, *args, **kwargs)
+
+    def delete(self, request, *args, **kwargs):
+        return self.destroy(request, *args, **kwargs)
+
+    def options(self, request, *args, **kwargs):
+        return self.metadata(request, *args, **kwargs)
diff --git a/djangorestframework/views.py b/djangorestframework/views.py
index e4d47a31e..43feee9cd 100644
--- a/djangorestframework/views.py
+++ b/djangorestframework/views.py
@@ -11,14 +11,12 @@ from django.http import Http404
 from django.utils.html import escape
 from django.utils.safestring import mark_safe
 from django.views.decorators.csrf import csrf_exempt
-from django.views.generic.detail import SingleObjectMixin
-from django.views.generic.list import MultipleObjectMixin
 
 from djangorestframework.compat import View as _View, apply_markdown
 from djangorestframework.response import Response
 from djangorestframework.request import Request
 from djangorestframework.settings import api_settings
-from djangorestframework import parsers, authentication, status, exceptions, mixins
+from djangorestframework import status, exceptions
 
 
 def _remove_trailing_string(content, trailing):
@@ -57,30 +55,10 @@ def _camelcase_to_spaces(content):
 
 class APIView(_View):
     renderers = api_settings.DEFAULT_RENDERERS
-    """
-    List of renderer classes the view can serialize the response with, ordered by preference.
-    """
-
-    parsers = parsers.DEFAULT_PARSERS
-    """
-    List of parser classes the view can parse the request with.
-    """
-
-    authentication = (authentication.SessionAuthentication,
-                      authentication.UserBasicAuthentication)
-    """
-    List of all authenticating methods to attempt.
-    """
-
-    throttle_classes = ()
-    """
-    List of all throttles to check.
-    """
-
-    permission_classes = ()
-    """
-    List of all permissions that must be checked.
-    """
+    parsers = api_settings.DEFAULT_PARSERS
+    authentication = api_settings.DEFAULT_AUTHENTICATION
+    throttle_classes = api_settings.DEFAULT_THROTTLES
+    permission_classes = api_settings.DEFAULT_PERMISSIONS
 
     @classmethod
     def as_view(cls, **initkwargs):
@@ -300,108 +278,3 @@ class APIView(_View):
 
         self.response = self.finalize_response(request, response, *args, **kwargs)
         return self.response
-
-
-# Abstract view classes that do not provide any method handlers,
-# but which provide required behaviour for concrete views to build on.
-
-class BaseView(APIView):
-    """
-    Base class for all generic views.
-    """
-    serializer_class = None
-
-    def get_serializer(self, data=None, files=None, instance=None):
-        # TODO: add support for files
-        context = {
-            'request': self.request,
-            'format': self.kwargs.get('format', None)
-        }
-        return self.serializer_class(data, instance=instance, context=context)
-
-
-class MultipleObjectBaseView(MultipleObjectMixin, BaseView):
-    """
-    Base class for generic views onto a queryset.
-    """
-    pass
-
-
-class SingleObjectBaseView(SingleObjectMixin, BaseView):
-    """
-    Base class for generic views onto a model instance.
-    """
-
-    def get_object(self):
-        """
-        Override default to add support for object-level permissions.
-        """
-        super(self, SingleObjectBaseView).get_object()
-        self.check_permissions(self.request, self.object)
-
-
-# Concrete view classes that provide method handlers
-# by composing the mixin classes with a base view.
-
-class ListAPIView(mixins.ListModelMixin,
-                  mixins.MetadataMixin,
-                  MultipleObjectBaseView):
-    """
-    Concrete view for listing a queryset.
-    """
-    def get(self, request, *args, **kwargs):
-        return self.list(request, *args, **kwargs)
-
-    def options(self, request, *args, **kwargs):
-        return self.metadata(request, *args, **kwargs)
-
-
-class RootAPIView(mixins.ListModelMixin,
-                  mixins.CreateModelMixin,
-                  mixins.MetadataMixin,
-                  MultipleObjectBaseView):
-    """
-    Concrete view for listing a queryset or creating a model instance.
-    """
-    def get(self, request, *args, **kwargs):
-        return self.list(request, *args, **kwargs)
-
-    def post(self, request, *args, **kwargs):
-        return self.create(request, *args, **kwargs)
-
-    def options(self, request, *args, **kwargs):
-        return self.metadata(request, *args, **kwargs)
-
-
-class DetailAPIView(mixins.RetrieveModelMixin,
-                    mixins.MetadataMixin,
-                    SingleObjectBaseView):
-    """
-    Concrete view for retrieving a model instance.
-    """
-    def get(self, request, *args, **kwargs):
-        return self.retrieve(request, *args, **kwargs)
-
-    def options(self, request, *args, **kwargs):
-        return self.metadata(request, *args, **kwargs)
-
-
-class InstanceAPIView(mixins.RetrieveModelMixin,
-                      mixins.UpdateModelMixin,
-                      mixins.DestroyModelMixin,
-                      mixins.MetadataMixin,
-                      SingleObjectBaseView):
-    """
-    Concrete view for retrieving, updating or deleting a model instance.
-    """
-    def get(self, request, *args, **kwargs):
-        return self.retrieve(request, *args, **kwargs)
-
-    def put(self, request, *args, **kwargs):
-        return self.update(request, *args, **kwargs)
-
-    def delete(self, request, *args, **kwargs):
-        return self.destroy(request, *args, **kwargs)
-
-    def options(self, request, *args, **kwargs):
-        return self.metadata(request, *args, **kwargs)