diff --git a/Gemfile b/Gemfile
index 53b050864a6166ed6de4c08b45531420b8359996..bbcc9102369f3a000e593b5a0bf24c9139c69eef 100644
--- a/Gemfile
+++ b/Gemfile
@@ -22,6 +22,7 @@ gem "country_select"
 gem "csl-styles", "~> 2.0"
 gem "curation"#, path: "../../arnaudlevy/curation"
 gem "delayed_job_active_record"
+gem "delayed_job_prevent_duplicate"
 gem "delayed_job_web"
 gem "devise"
 gem "devise-i18n"
diff --git a/Gemfile.lock b/Gemfile.lock
index ec027c15b0cd75e4471a32408df703c6440ba8ad..6657633f9958c0c846ceaeacb6b98f1d49c25265 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -182,6 +182,8 @@ GEM
     delayed_job_active_record (4.1.7)
       activerecord (>= 3.0, < 8.0)
       delayed_job (>= 3.0, < 5)
+    delayed_job_prevent_duplicate (0.1.0)
+      delayed_job (>= 3.0, < 5)
     delayed_job_web (1.4.4)
       activerecord (> 3.0.0)
       delayed_job (> 2.0.3)
@@ -599,6 +601,7 @@ DEPENDENCIES
   csl-styles (~> 2.0)
   curation
   delayed_job_active_record
+  delayed_job_prevent_duplicate
   delayed_job_web
   devise
   devise-i18n
diff --git a/config/initializers/delayed_jobs.rb b/config/initializers/delayed_jobs.rb
index 9fdb383d04cc391fb455713ea5ba6e4b2319ebbc..1ed52dd7cee7bcab61ea136f8506155a929e2cac 100644
--- a/config/initializers/delayed_jobs.rb
+++ b/config/initializers/delayed_jobs.rb
@@ -3,15 +3,3 @@ Delayed::Worker.queue_attributes = {
   low_priority: { priority: 10 },
   imports: { priority: 5 }
 }
-
-# Avoid duplicates
-
-# https://groups.google.com/g/delayed_job/c/gZ9bFCdZrsk#2a05c39a192e630c
-# https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/backend/base.rb
-# https://github.com/ignatiusreza/activejob-trackable
-
-# based on https://gist.github.com/synth/fba7baeffd083a931184
-require 'delayed_duplicate_prevention_plugin'
-
-Delayed::Backend::ActiveRecord::Job.send(:include, DelayedDuplicatePreventionPlugin::SignatureConcern)
-Delayed::Worker.plugins << DelayedDuplicatePreventionPlugin
\ No newline at end of file
diff --git a/db/migrate/20230907085800_add_key_to_delayed_jobs.rb b/db/migrate/20230907152751_add_signature_to_delayed_job.rb
similarity index 53%
rename from db/migrate/20230907085800_add_key_to_delayed_jobs.rb
rename to db/migrate/20230907152751_add_signature_to_delayed_job.rb
index b500645e24c5621f449ee89f6edd0d05157c0300..84df911780393324943d8204e38c04e0f3b945e7 100644
--- a/db/migrate/20230907085800_add_key_to_delayed_jobs.rb
+++ b/db/migrate/20230907152751_add_signature_to_delayed_job.rb
@@ -1,6 +1,8 @@
-class AddKeyToDelayedJobs < ActiveRecord::Migration[7.0]
+# frozen_string_literal: true
+
+class AddSignatureToDelayedJob < ActiveRecord::Migration[7.0]
   def change
     add_column :delayed_jobs, :signature, :string
     add_column :delayed_jobs, :args, :text
   end
-end
+end
\ No newline at end of file
diff --git a/db/schema.rb b/db/schema.rb
index a2aba470bbbadc6e66b397cd3546e9baf4933ded..25f9caafe56d2b1fb91fee772485de56325f5ca4 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema[7.0].define(version: 2023_09_07_085800) do
+ActiveRecord::Schema[7.0].define(version: 2023_09_07_152751) do
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
   enable_extension "plpgsql"
diff --git a/lib/delayed_duplicate_prevention_plugin.rb b/lib/delayed_duplicate_prevention_plugin.rb
deleted file mode 100644
index 43bf45d0b509939160b4be9d258d66efcf368aa0..0000000000000000000000000000000000000000
--- a/lib/delayed_duplicate_prevention_plugin.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-require 'delayed_job'
-class DelayedDuplicatePreventionPlugin < Delayed::Plugin
- 
-  module SignatureConcern
-    extend ActiveSupport::Concern
-
-    included do
-      before_validation :add_signature
-      validate :prevent_duplicate
-    end
-
-    private
-
-    def add_signature
-      self.signature = generate_signature
-      self.args = self.payload_object.args
-    end
-
-    def generate_signature
-      pobj = payload_object
-      if pobj.object.respond_to?(:id) and pobj.object.id.present?
-        sig = "#{pobj.object.class}"
-        sig += ":#{pobj.object.id}" 
-      else
-        sig = "#{pobj.object}"
-      end
-      
-      sig += "##{pobj.method_name}"
-      return sig
-    end    
-
-    def prevent_duplicate
-      if DuplicateChecker.duplicate?(self)
-        Rails.logger.warn "Found duplicate job(#{self.signature}), ignoring..."
-        errors.add(:base, "This is a duplicate") 
-      end
-    end
-  end
-
-  class DuplicateChecker
-    attr_reader :job
-
-    def self.duplicate?(job)
-      new(job).duplicate?
-    end
-
-    def initialize(job)
-      @job = job
-    end
-
-    def duplicate?
-      possible_dupes.any? { |possible_dupe| args_match?(possible_dupe, job) }
-    end
-
-    private
-
-    def possible_dupes
-      possible_dupes = Delayed::Job.where(attempts: 0, locked_at: nil)  # Only jobs not started, otherwise it would never compute a real change if the job is currently running
-                                   .where(signature: job.signature)     # Same signature
-      possible_dupes = possible_dupes.where.not(id: job.id) if job.id.present?
-      possible_dupes
-    end
-
-    def args_match?(job1, job2)
-      # TODO: make this logic robust
-      normalize_args(job1.args) == normalize_args(job2.args)
-    end
-
-    def normalize_args(args)
-      args.kind_of?(String) ? YAML.load(args) : args
-    end
-  end
-end
\ No newline at end of file