diff --git c/acceptor.lisp w/acceptor.lisp
index 9999f49..dc7b887 100644
--- c/acceptor.lisp
+++ w/acceptor.lisp
@@ -29,10 +29,6 @@
 
 (in-package :hunchentoot)
 
-(eval-when (:load-toplevel :compile-toplevel :execute)
-  (defun default-document-directory (&optional sub-directory)
-    (asdf:system-relative-pathname :hunchentoot (format nil "www/~@[~A~]" sub-directory))))
-
 (defclass acceptor ()
   ((port :initarg :port
          :reader acceptor-port
@@ -72,6 +68,11 @@ symbol REPLY.")
 subclass of TASKMASTER) that is responsible for scheduling the work
 for this acceptor.  The default depends on the MP capabilities of the
 underlying Lisp.")
+   (dispatcher :initarg :dispatcher
+               :reader acceptor-dispatcher
+               :documentation "A dispatcher for this acceptor. The
+dispatcher's dispatch-request method is called by the acceptor to
+handle the request.")
    (output-chunking-p :initarg :output-chunking-p
                       :accessor acceptor-output-chunking-p
                       :documentation "A generalized boolean denoting
@@ -158,12 +159,7 @@ stream or to NIL to suppress logging.")
  messages.  Files must be named <return-code>.html with <return-code>
  representing the HTTP return code that the file applies to,
  i.e. 404.html would be used as the content for a HTTP 404 Not found
- response.")
-   (document-root :initarg :document-root
-                  :accessor acceptor-document-root
-                  :documentation "Directory pathname that points to
-files that are served by the acceptor if no more specific
-acceptor-dispatch-request method handles the request."))
+ response."))
   (:default-initargs
    :address nil
    :port 80
@@ -173,6 +169,7 @@ acceptor-dispatch-request method handles the request."))
    :listen-backlog 50
    :taskmaster (make-instance (cond (*supports-threads-p* 'one-thread-per-connection-taskmaster)
                                     (t 'single-threaded-taskmaster)))
+   :dispatcher (make-instance 'dispatcher)
    :output-chunking-p t
    :input-chunking-p t
    :persistent-connections-p t
@@ -180,7 +177,7 @@ acceptor-dispatch-request method handles the request."))
    :write-timeout *default-connection-timeout*
    :access-log-destination *error-output*
    :message-log-destination *error-output*
-   :document-root (load-time-value (default-document-directory))
+   
    :error-template-directory (load-time-value (default-document-directory "errors/")))
   (:documentation "To create a Hunchentoot webserver, you make an
 instance of this class and use the generic function START to start it
@@ -523,16 +520,6 @@ catches during request processing."
   (mp:process-unstop (acceptor-process acceptor))
   nil)
 
-(defmethod acceptor-dispatch-request ((acceptor acceptor) request)
-  "Detault implementation of the request dispatch method, generates a +http-not-found+ error+."
-  (declare (ignore request))
-  (if (acceptor-document-root acceptor)
-      (handle-static-file (merge-pathnames (if (equal (script-name*) "/")
-                                               "index.html"
-                                               (subseq (script-name*) 1))
-                                           (acceptor-document-root acceptor)))
-      (setf (return-code *reply*) +http-not-found+)))
-
 (defmethod handle-request ((*acceptor* acceptor) (*request* request))
   "Standard method for request handling.  Calls the request dispatcher
 of *ACCEPTOR* to determine how the request should be handled.  Also
@@ -553,7 +540,7 @@ handler."
                     (when *log-lisp-warnings-p*
                       (log-message* *lisp-warnings-log-level* "~A" cond)))))
     (with-debugger
-      (acceptor-dispatch-request *acceptor* *request*))))
+      (dispatch-request (acceptor-dispatcher *acceptor*) *request*))))
 
 (defgeneric acceptor-status-message (acceptor http-status-code &key &allow-other-keys)
   (:documentation
diff --git c/dispatcher.lisp w/dispatcher.lisp
new file mode 100644
index 0000000..afe643e
--- /dev/null
+++ w/dispatcher.lisp
@@ -0,0 +1,60 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
+;;; $Header: /usr/local/cvsrep/hunchentoot/server.lisp,v 1.43 2008/04/09 08:17:48 edi Exp $
+
+;;; Copyright (c) 2004-2010, Dr. Edmund Weitz.  All rights reserved.
+;;; Copyright (c) 2011, Cyrus Harmon. All rights reserved.
+
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+
+;;;   * Redistributions of source code must retain the above copyright
+;;;     notice, this list of conditions and the following disclaimer.
+
+;;;   * Redistributions in binary form must reproduce the above
+;;;     copyright notice, this list of conditions and the following
+;;;     disclaimer in the documentation and/or other materials
+;;;     provided with the distribution.
+
+;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
+;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+;;; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(in-package :hunchentoot)
+
+(eval-when (:load-toplevel :compile-toplevel :execute)
+  (defun default-document-directory (&optional sub-directory)
+    (asdf:system-relative-pathname :hunchentoot (format nil "www/~@[~A~]" sub-directory))))
+
+(defclass dispatcher () 
+  ((document-root :initarg :document-root
+                  :accessor dispatcher-document-root
+                  :documentation "Directory pathname that points to
+files that are served by the acceptor if no more specific
+acceptor-dispatch-request method handles the request."))
+  (:default-initargs
+   :document-root (load-time-value (default-document-directory))))
+
+(defgeneric dispatch-request (dispatcher request)
+  (:documentation "Takes a dispatcher and a request as arguments and
+fields the requset. Subclasses of dispatcher can override
+DISPATCH-REQUEST to implement new request handling behaviors."))
+
+(defmethod dispatch-request ((dispatcher dispatcher) request)
+  "Detault implementation of the request dispatch method, generates a
++http-not-found+ error+ if handle-static-file fails."
+  (declare (ignore request))
+  (if (dispatcher-document-root dispatcher)
+      (handle-static-file (merge-pathnames (if (equal (script-name*) "/")
+                                               "index.html"
+                                               (subseq (script-name*) 1))
+                                           (dispatcher-document-root dispatcher)))
+      (setf (return-code *reply*) +http-not-found+)))
diff --git c/easy-handlers.lisp w/easy-handlers.lisp
index 2599262..c404d53 100644
--- c/easy-handlers.lisp
+++ w/easy-handlers.lisp
@@ -29,9 +29,6 @@
 
 (in-package :hunchentoot)
 
-(defvar *dispatch-table* (list 'dispatch-easy-handlers)
-  "A global list of dispatch functions.")
-
 (defvar *easy-handler-alist* nil
   "An alist of \(URI acceptor-names function) lists defined by
 DEFINE-EASY-HANDLER.")
@@ -328,15 +325,20 @@ defined with DEFINE-EASY-HANDLER, if there is one."
                         (t (funcall uri request))))
         do (return easy-handler)))
 
-(defclass easy-acceptor (acceptor)
-  ()
-  (:documentation "This is the acceptor of the ``easy'' Hunchentoot framework."))
+(defclass easy-dispatcher (dispatcher)
+  ((dispatch-table
+    :accessor dispatcher-dispatch-table
+    :initarg :dispatch-table
+    :documentation
+    "A global list of dispatch functions."))
+  (:default-initargs
+   :dispatch-table (list 'dispatch-easy-handlers)))
 
-(defmethod acceptor-dispatch-request ((acceptor easy-acceptor) request)
+(defmethod dispatch-request ((dispatcher easy-dispatcher) request)
   "The easy request dispatcher which selects a request handler
 based on a list of individual request dispatchers all of which can
 either return a handler or neglect by returning NIL."
-  (loop for dispatcher in *dispatch-table*
+  (loop for dispatcher in (dispatcher-dispatch-table dispatcher)
      for action = (funcall dispatcher request)
      when action return (funcall action)
      finally (call-next-method)))
diff --git c/hunchentoot.asd w/hunchentoot.asd
index 04e7413..346ad17 100644
--- c/hunchentoot.asd
+++ w/hunchentoot.asd
@@ -78,6 +78,7 @@ for diagnostic output.")
                (:file "headers")
                (:file "set-timeouts")
                (:file "taskmaster")
+               (:file "dispatcher")
                (:file "acceptor")
                #-:hunchentoot-no-ssl (:file "ssl")))
 
diff --git c/packages.lisp w/packages.lisp
index e0e4ddc..1d9dd41 100644
--- c/packages.lisp
+++ w/packages.lisp
@@ -168,7 +168,7 @@
            #:DELETE-AUX-REQUEST-VALUE
            #:DELETE-SESSION-VALUE
            #:DISPATCH-EASY-HANDLERS
-           #:EASY-ACCEPTOR
+           #:EASY-DISPATCHER
            #:ESCAPE-FOR-HTML
            #:EXECUTE-ACCEPTOR
            #:GET-PARAMETER
