diff --git a/server/djrandom/fingerprint/dedup.py b/server/djrandom/fingerprint/dedup.py
index 02830519e6ae78d8c8d2d7614ccf0fef0d7947fd..ab7c3eea7296880b827625b4cd653f35f5cf502f 100644
--- a/server/djrandom/fingerprint/dedup.py
+++ b/server/djrandom/fingerprint/dedup.py
@@ -51,10 +51,11 @@ class DeDuper(object):
         if title: data["track"] = title
         return data
 
-    def dedupe(self):
+    def dedupe(self, dry_run=True):
         self._ingest()
         self._scan_for_dupes()
-        self._cleanup()
+        if not dry_run:
+            self._cleanup()
 
     def _ingest(self):
         self.codes = {}
@@ -220,15 +221,16 @@ class DeDuper(object):
         Session.commit()
 
 
-def run_deduper(db_url):
+def run_deduper(db_url, dry_run):
     init_db(db_url)
     dup = DeDuper()
-    dup.dedupe()
+    dup.dedupe(dry_run)
 
 
 def main():
     parser = optparse.OptionParser()
     parser.add_option('--db_url')
+    parser.add_option('--apply', action='store_true')
     daemonize.add_standard_options(parser)
     utils.read_config_defaults(
         parser, os.getenv('DJRANDOM_CONF', '/etc/djrandom.conf'))
@@ -239,7 +241,7 @@ def main():
         parser.error('Too many arguments')
 
     daemonize.daemonize(opts, run_deduper,
-                        (opts.db_url,))
+                        (opts.db_url, not opts.apply))
 
 
 if __name__ == '__main__':