diff --git a/client/djrandom_client/client.py b/client/djrandom_client/client.py
index 0baee71c3ee486df81479e705b0cdbf2eb6a137c..4686e52a03c1439f24e588b9f41d146b0110dc71 100644
--- a/client/djrandom_client/client.py
+++ b/client/djrandom_client/client.py
@@ -60,6 +60,8 @@ def run_client(server_url, music_dir, api_key, run_once, bwlimit, enable_watcher
         enable_watcher = False
 
     upl = upload.Uploader(server_url.rstrip('/'), api_key)
+    upl.setDaemon(True)
+    upl.start()
 
     # Start the full filesystem scan in the background.
     if enable_watcher:
@@ -92,7 +94,7 @@ def run_client(server_url, music_dir, api_key, run_once, bwlimit, enable_watcher
         signal.signal(signal.SIGINT, _cleanup)
         signal.signal(signal.SIGTERM, _cleanup)
 
-    upl.run()
+    upl.join()
 
 
 def main():
diff --git a/client/djrandom_client/upload.py b/client/djrandom_client/upload.py
index 38c6628a4bd20b4ed02fcb5cbf9b3df1dcc0f751..f52bedd460c6073b7dba38fa510c229164ea8eb6 100644
--- a/client/djrandom_client/upload.py
+++ b/client/djrandom_client/upload.py
@@ -58,9 +58,10 @@ class FileDatabase(object):
         self.conn.commit()
 
 
-class Uploader(object):
+class Uploader(threading.Thread):
 
     def __init__(self, server_url, api_key, db=None):
+        threading.Thread.__init__(self)
         self.api_key = api_key
         self.server_url = server_url
         self.queue = Queue.Queue(100)
@@ -133,8 +134,6 @@ class Uploader(object):
             self.db.close()
 
     def stop(self):
-        # We can't put 'None' in the queue and exit cleanly because the
-        # signal handler might run in the same thread as the 'run()' method,
-        # causing a deadlock.
+        # This runs in a different thread.
         self.db.close()