diff --git c/acceptor.lisp w/acceptor.lisp
index 9999f49..2997973 100644
--- c/acceptor.lisp
+++ w/acceptor.lisp
@@ -72,6 +72,13 @@ 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.")
+   (socket-connector :initarg :socket-connector
+                     :reader acceptor-socket-connector
+                     :documentation "The socket-connector for this
+acceptor. Instances of SOCKET-CONNECTOR are used to create a stream
+for a socket. The reason for abstracting this away in its own class is
+so that different types of streams can be used, plain streams, SSL
+encrypted streams, etc...")
    (output-chunking-p :initarg :output-chunking-p
                       :accessor acceptor-output-chunking-p
                       :documentation "A generalized boolean denoting
@@ -173,6 +180,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)))
+   :socket-connector (make-instance 'socket-connector)
    :output-chunking-p t
    :input-chunking-p t
    :persistent-connections-p t
@@ -222,13 +230,6 @@ HANDLE-INCOMING-CONNECTION.  On LispWorks, this function returns
 immediately, on other Lisps it retusn only once the acceptor has been
 stopped."))
 
-(defgeneric initialize-connection-stream (acceptor stream)
- (:documentation "Can be used to modify the stream which is used to
-communicate between client and server before the request is read.  The
-default method of ACCEPTOR does nothing, but see for example the
-method defined for SSL-ACCEPTOR.  All methods of this generic function
-must return the stream to use."))
-
 (defgeneric reset-connection-stream (acceptor stream)
   (:documentation "Resets the stream which is used to communicate
 between client and server after one request has been served so that it
@@ -268,6 +269,9 @@ they're using secure connections - see the SSL-ACCEPTOR class."))
 (defmethod start ((acceptor acceptor))
   (setf (acceptor-shutdown-p acceptor) nil)
   (start-listening acceptor)
+  (let ((socket-connector (acceptor-socket-connector acceptor)))
+    (setf (socket-connector-acceptor socket-connector)
+          acceptor))
   (let ((taskmaster (acceptor-taskmaster acceptor)))
     (setf (taskmaster-acceptor taskmaster) acceptor)
     (execute-acceptor taskmaster))
@@ -287,11 +291,6 @@ they're using secure connections - see the SSL-ACCEPTOR class."))
   (setf (acceptor-listen-socket acceptor) nil)
   acceptor)
 
-(defmethod initialize-connection-stream ((acceptor acceptor) stream)
- (declare (ignore acceptor))
- ;; default method does nothing
- stream)
-
 (defmethod reset-connection-stream ((acceptor acceptor) stream)
   (declare (ignore acceptor))
   ;; turn chunking off at this point
@@ -342,7 +341,7 @@ they're using secure connections - see the SSL-ACCEPTOR class."))
 
 (defmethod process-connection ((*acceptor* acceptor) (socket t))
   (let ((*hunchentoot-stream*
-         (initialize-connection-stream *acceptor* (make-socket-stream socket *acceptor*))))
+         (make-socket-connection (acceptor-socket-connector *acceptor*) socket)))
     (unwind-protect
         ;; process requests until either the acceptor is shut down,
         ;; *CLOSE-HUNCHENTOOT-STREAM* has been set to T by the
@@ -398,7 +397,7 @@ chunked encoding, but acceptor is configured to not use it.")))))
   
 (defmethod acceptor-ssl-p ((acceptor t))
   ;; the default is to always answer "no"
-  nil)
+  (socket-connector-ssl-p (acceptor-socket-connector acceptor)))
 
 (defgeneric acceptor-log-access (acceptor &key return-code)
   (:documentation
diff --git c/hunchentoot.asd w/hunchentoot.asd
index 04e7413..0a222fb 100644
--- c/hunchentoot.asd
+++ w/hunchentoot.asd
@@ -78,6 +78,7 @@ for diagnostic output.")
                (:file "headers")
                (:file "set-timeouts")
                (:file "taskmaster")
+               (:file "socket-connector")
                (:file "acceptor")
                #-:hunchentoot-no-ssl (:file "ssl")))
 
diff --git c/packages.lisp w/packages.lisp
index e0e4ddc..d914f68 100644
--- c/packages.lisp
+++ w/packages.lisp
@@ -190,8 +190,8 @@
            #:HUNCHENTOOT-CONDITION
            #:HUNCHENTOOT-ERROR
            #:HUNCHENTOOT-WARNING
-           #:INITIALIZE-CONNECTION-STREAM
            #:LOG-MESSAGE*
+           #:MAKE-SOCKET-CONNECTION
            #:MAYBE-INVOKE-DEBUGGER
            #:MIME-TYPE
            #:NEXT-SESSION-ID
@@ -257,7 +257,8 @@
            #:SET-COOKIE*
            #:SHUTDOWN
            #:SINGLE-THREADED-TASKMASTER
-           #-:hunchentoot-no-ssl #:SSL-ACCEPTOR
+           #:SOCKET-CONNECTOR
+           #-:hunchentoot-no-ssl #:SSL-SOCKET-CONNECTOR
            #:SSL-P
            #:START
            #:START-LISTENING
@@ -273,4 +274,4 @@
 (defpackage :simple-hunchentoot
   (:use #:cl)
   (:export #:start-server
-           #:stop-server))
\ No newline at end of file
+           #:stop-server))
diff --git c/socket-connector.lisp w/socket-connector.lisp
new file mode 100644
index 0000000..632c224
--- /dev/null
+++ w/socket-connector.lisp
@@ -0,0 +1,50 @@
+;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*-
+
+;;; 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.
+
+(cl:in-package :hunchentoot)
+
+(defclass socket-connector ()
+  ((acceptor :initarg :acceptor
+             :accessor socket-connector-acceptor
+             :documentation "The ACCEPTOR for this socket connector.")))
+
+(defgeneric make-socket-connection (socket-connector socket)
+  (:documentation "Creates a stream for the given socket and suitably
+  initializes the stream for use by the hunchentoot ACCEPTOR."))
+
+(defgeneric socket-connector-ssl-p (socket-connector)
+  (:documentation "Returns T if this socket connector returns an SSL
+  stream."))
+
+(defmethod make-socket-connection ((socket-connector socket-connector) socket)
+  (make-socket-stream socket (socket-connector-acceptor socket-connector)))
+
+(defmethod socket-connector-ssl-p ((socket-connector socket-connector))
+  nil)
+
diff --git c/ssl.lisp w/ssl.lisp
index 0c2a44c..a3af375 100644
--- c/ssl.lisp
+++ w/ssl.lisp
@@ -29,68 +29,67 @@
 
 (in-package :hunchentoot)
 
-(defclass ssl-acceptor (acceptor)
+(defclass ssl-socket-connector (socket-connector)
   ((ssl-certificate-file :initarg :ssl-certificate-file
-                         :reader acceptor-ssl-certificate-file
+                         :reader socket-connector-ssl-certificate-file
                          :documentation "A pathname designator for a
 certificate file in PEM format.")
    (ssl-privatekey-file :initarg :ssl-privatekey-file
-                        :reader acceptor-ssl-privatekey-file
+                        :reader socket-connector-ssl-privatekey-file
                         :documentation "A pathname designator for a
 private key file in PEM format, or \(only on LispWorks) NIL if the
 certificate file contains the private key.")
    (ssl-privatekey-password :initform nil
                             :initarg :ssl-privatekey-password
-                            :reader acceptor-ssl-privatekey-password
+                            :reader socket-connector-ssl-privatekey-password
                             :documentation "The password for the
 private key file or NIL for no password."))
-  (:default-initargs
-   :port 443)
-  (:documentation "Create and START an instance of this class
-\(instead of ACCEPTOR) if you want an https server.  There are two
-required initargs, :SSL-CERTIFICATE-FILE and :SSL-PRIVATEKEY-FILE, for
-pathname designators denoting the certificate file and the key file in
-PEM format.  On LispWorks, you can have both in one file in which case
-the second initarg is optional.  You can also use the
+  (:documentation "Create an SSL-SOCKET-CONNECTOR and pass this as
+the :socket-connector to ACCEPTOR if you want an https server.  There
+are two required initargs, :SSL-CERTIFICATE-FILE
+and :SSL-PRIVATEKEY-FILE, for pathname designators denoting the
+certificate file and the key file in PEM format.  On LispWorks, you
+can have both in one file in which case the second initarg is
+optional.  You can also use the
 :SSL-PRIVATEKEY-PASSWORD initarg to provide a password \(as a string)
-for the key file \(or NIL, the default, for no password).
+for the key file \(or NIL, the default, for no password)."))
 
-The default port for SSL-ACCEPTOR instances is 443 instead of 80"))
-
-;; general implementation
-
-(defmethod acceptor-ssl-p ((acceptor ssl-acceptor))
+(defmethod socket-connector-ssl-p ((socket-connector ssl-socket-connector))
   t)
 
-(defmethod initialize-instance :after ((acceptor ssl-acceptor) &rest initargs)
+;; usocket implementation
+
+#-:lispworks
+(defmethod initialize-instance :after ((socket-connector ssl-socket-connector)
+                                       &rest initargs)
   (declare (ignore initargs))
   ;; LispWorks can read both from the same file, so we can default one
   #+:lispworks
-  (unless (slot-boundp acceptor 'ssl-privatekey-file)
-    (setf (slot-value acceptor 'ssl-privatekey-file)
-          (acceptor-ssl-certificate-file acceptor)))
+  (unless (slot-boundp socket-connector 'ssl-privatekey-file)
+    (setf (slot-value socket-connector 'ssl-privatekey-file)
+          (socket-connector-ssl-certificate-file socket-connector)))
   ;; OpenSSL doesn't know much about Lisp pathnames...
-  (setf (slot-value acceptor 'ssl-privatekey-file)
-        (namestring (truename (acceptor-ssl-privatekey-file acceptor)))
-        (slot-value acceptor 'ssl-certificate-file)
-        (namestring (truename (acceptor-ssl-certificate-file acceptor)))))
-
-;; usocket implementation
+  (setf (slot-value socket-connector 'ssl-privatekey-file)
+        (namestring (truename
+                     (socket-connector-ssl-privatekey-file socket-connector)))
+        (slot-value socket-connector 'ssl-certificate-file)
+        (namestring (truename
+                     (socket-connector-ssl-certificate-file socket-connector)))))
 
 #-:lispworks
-(defmethod initialize-connection-stream ((acceptor ssl-acceptor) stream)
+(defmethod make-socket-connection ((socket-connector ssl-socket-connector) socket)
   ;; attach SSL to the stream if necessary
-  (call-next-method acceptor
-                    (cl+ssl:make-ssl-server-stream stream
-                                                   :certificate (acceptor-ssl-certificate-file acceptor)
-                                                   :key (acceptor-ssl-privatekey-file acceptor)
-                                                   :password (acceptor-ssl-privatekey-password acceptor))))
-
-;; LispWorks implementation
+  (cl+ssl:make-ssl-server-stream (call-next-method)
+                                 :certificate (socket-connector-ssl-certificate-file
+                                               socket-connector)
+                                 :key (socket-connector-ssl-privatekey-file
+                                       socket-connector)
+                                 :password (socket-connector-ssl-privatekey-password
+                                            socket-connector)))
 
 #+:lispworks
 (defun make-ssl-server-stream (socket-stream &key certificate-file privatekey-file privatekey-password)
-  "Given the acceptor socket stream SOCKET-STREAM attaches SSL to the
+  "Given the socket stream SOCKET-STREAM attaches SSL to the
 stream using the certificate file CERTIFICATE-FILE and the private key
 file PRIVATEKEY-FILE.  Both of these values must be namestrings
 denoting the location of the files and will be fed directly to
@@ -111,10 +110,13 @@ stream."
     socket-stream))
 
 #+:lispworks
-(defmethod initialize-connection-stream ((acceptor ssl-acceptor) stream)
+(defmethod make-socket-connection ((socket-connector ssl-socket-connector) stream)
   ;; attach SSL to the stream if necessary
-  (call-next-method acceptor
-                    (make-ssl-server-stream stream
-                                            :certificate-file (acceptor-ssl-certificate-file acceptor)
-                                            :privatekey-file (acceptor-ssl-privatekey-file acceptor)
-                                            :privatekey-password (acceptor-ssl-privatekey-password acceptor))))
+  (make-ssl-server-stream (call-next-method)
+                          :certificate-file (socket-connector-ssl-certificate-file
+                                             socket-connector)
+                          :privatekey-file (socket-connector-ssl-privatekey-file
+                                            socket-connector)
+                          :privatekey-password (socket-connector-ssl-privatekey-password
+                                                socket-connector)))
+
diff --git c/taskmaster.lisp w/taskmaster.lisp
index 532218b..62d5275 100644
--- c/taskmaster.lisp
+++ w/taskmaster.lisp
@@ -320,7 +320,7 @@ implementations."))
 is set up via PROCESS-REQUEST."
   (let ((acceptor (taskmaster-acceptor taskmaster)))
     (send-response acceptor
-                   (initialize-connection-stream acceptor (make-socket-stream socket acceptor))
+                   (make-socket-connection (acceptor-socket-connector acceptor) socket)
                    +http-service-unavailable+
                    :content (acceptor-status-message acceptor +http-service-unavailable+))))
 
