diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py
index 113b308..921205d 100644
--- a/Lib/test/test_ssl.py
+++ b/Lib/test/test_ssl.py
@@ -442,7 +442,7 @@
             threading.Thread.start(self)
 
         def run (self):
-            self.sock.settimeout(0.5)
+            self.sock.settimeout(0.05)
             self.sock.listen(5)
             self.active = True
             if self.flag:
@@ -496,49 +496,6 @@
                                           certfile=self.certfile)
                 return sslconn, addr
 
-            # The methods overridden below this are mainly so that we
-            # can run it in a thread and be able to stop it from another
-            # You probably wouldn't need them in other uses.
-
-            def server_activate(self):
-                # We want to run this in a thread for testing purposes,
-                # so we override this to set timeout, so that we get
-                # a chance to stop the server
-                self.socket.settimeout(0.5)
-                HTTPServer.server_activate(self)
-
-            def serve_forever(self):
-                # We want this to run in a thread, so we use a slightly
-                # modified version of "forever".
-                self.active = True
-                while 1:
-                    try:
-                        # We need to lock while handling the request.
-                        # Another thread can close the socket after self.active
-                        # has been checked and before the request is handled.
-                        # This causes an exception when using the closed socket.
-                        with self.active_lock:
-                            if not self.active:
-                                break
-                            self.handle_request()
-                    except socket.timeout:
-                        pass
-                    except KeyboardInterrupt:
-                        self.server_close()
-                        return
-                    except:
-                        sys.stdout.write(''.join(traceback.format_exception(*sys.exc_info())))
-                        break
-                    time.sleep(0.1)
-
-            def server_close(self):
-                # Again, we want this to run in a thread, so we need to override
-                # close to clear the "active" flag, so that serve_forever() will
-                # terminate.
-                with self.active_lock:
-                    HTTPServer.server_close(self)
-                    self.active = False
-
         class RootedHTTPRequestHandler(SimpleHTTPRequestHandler):
 
             # need to override translate_path to get a known root,
@@ -604,12 +561,12 @@
             self.active = True
             if self.flag:
                 self.flag.set()
-            self.server.serve_forever()
+            self.server.serve_forever(0.05)
             self.active = False
 
         def stop (self):
             self.active = False
-            self.server.server_close()
+            self.server.shutdown()
 
 
     class AsyncoreEchoServer(threading.Thread):
