def _garbage_collector():
     logging.debug('running garbage collector for mjpg clients...')
-    
+
+    io_loop = ioloop.IOLoop.instance()
+    io_loop.add_timeout(datetime.timedelta(seconds=settings.MJPG_CLIENT_TIMEOUT), _garbage_collector)
+
     now = datetime.datetime.utcnow()
     for client in MjpgClient.clients.values():
         camera_id = client._camera_id
 
             continue
         
-    io_loop = ioloop.IOLoop.instance()
-    io_loop.add_timeout(datetime.timedelta(seconds=settings.MJPG_CLIENT_TIMEOUT), _garbage_collector)
-
 
 def get_jpg(camera_id):
     if camera_id not in MjpgClient.clients:
         MjpgClient.last_erroneous_close_time = 0
 
 
-# schedule the garbage collector
-io_loop = ioloop.IOLoop.instance()
-io_loop.add_timeout(datetime.timedelta(seconds=settings.MJPG_CLIENT_TIMEOUT), _garbage_collector)
+def start_gc():
+    # schedule the garbage collector
+    io_loop = ioloop.IOLoop.instance()
+    io_loop.add_timeout(datetime.timedelta(seconds=settings.MJPG_CLIENT_TIMEOUT), _garbage_collector)
 
     logging.info('thumbnailer started')
 
 
+def start_mjpg_client_gc():
+    import mjpgclient
+
+    mjpgclient.start_gc()
+    logging.info('mjpg client garbage collector started')
+
+
 def parse_options(parser, args):
     parser.add_argument('-b', help='start the server in background (daemonize)',
             action='store_true', dest='background', default=False)
     else:
         start_motion()
 
-    start_cleanup()
+    if settings.CLEANUP_INTERVAL:
+        start_cleanup()
+        
     start_wsswitch()
 
     if settings.THUMBNAILER_INTERVAL:
         start_thumbnailer()
 
+    if settings.MJPG_CLIENT_TIMEOUT:
+        start_mjpg_client_gc()
+
     template.add_context('static_path', settings.BASE_PATH + '/static/')
     
     application = Application(handler_mapping, debug=False, log_function=_log_request,