diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py
index 1c11aff..d391560 100755
--- a/basicswap/bin/prepare.py
+++ b/basicswap/bin/prepare.py
@@ -473,7 +473,27 @@ def downloadBytes(url) -> None:
         popConnectionParameters()
 
 
-def importPubkeyFromUrls(gpg, pubkeyurls):
+def getBasePath():
+    base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+    if os.path.exists(os.path.join(base_path, "basicswap", "pgp")):
+        base_path = os.path.join(base_path, "basicswap")
+    return base_path
+
+
+def importPubkey(gpg, pubkey_filename, pubkeyurls):
+    base_path = getBasePath()
+    local_path = os.path.join(base_path, "pgp", "keys", pubkey_filename)
+    if os.path.exists(local_path):
+        logger.info("Importing public key from file: " + pubkey_filename)
+        try:
+            with open(local_path, "rb") as fp:
+                rv = gpg.import_keys(fp.read())
+            for key in rv.fingerprints:
+                gpg.trust_keys(key, "TRUST_FULLY")
+            return
+        except Exception as e:
+            logging.warning(f"Import from file failed: {e}")
+
     for url in pubkeyurls:
         try:
             logger.info("Importing public key from url: " + url)
@@ -482,7 +502,7 @@ def importPubkeyFromUrls(gpg, pubkeyurls):
                 gpg.trust_keys(key, "TRUST_FULLY")
             break
         except Exception as e:
-            logging.warning("Import from url failed: %s", str(e))
+            logging.warning(f"Import from url failed: {e}")
 
 
 def testTorConnection():
@@ -1042,11 +1062,7 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}):
         pubkey_filename = "particl_{}.pgp".format(signing_key_name)
     else:
         pubkey_filename = "{}_{}.pgp".format(coin, signing_key_name)
-    pubkeyurls = [
-        "https://raw.githubusercontent.com/basicswap/basicswap/master/pgp/keys/"
-        + pubkey_filename,
-        "https://gitlab.com/particl/basicswap/-/raw/master/pgp/keys/" + pubkey_filename,
-    ]
+    pubkeyurls = []
     if coin == "dash":
         pubkeyurls.append(
             "https://raw.githubusercontent.com/dashpay/dash/master/contrib/gitian-keys/pasta.pgp"
@@ -1080,7 +1096,7 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}):
 
         if not isValidSignature(verified) and verified.username is None:
             logger.warning("Signature made by unknown key.")
-            importPubkeyFromUrls(gpg, pubkeyurls)
+            importPubkey(gpg, pubkey_filename, pubkeyurls)
             with open(assert_path, "rb") as fp:
                 verified = gpg.verify_file(fp)
     elif coin in ("navcoin"):
@@ -1089,7 +1105,7 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}):
 
         if not isValidSignature(verified) and verified.username is None:
             logger.warning("Signature made by unknown key.")
-            importPubkeyFromUrls(gpg, pubkeyurls)
+            importPubkey(gpg, pubkey_filename, pubkeyurls)
             with open(assert_sig_path, "rb") as fp:
                 verified = gpg.verify_file(fp)
 
@@ -1101,10 +1117,9 @@ def prepareCore(coin, version_data, settings, data_dir, extra_opts={}):
     else:
         with open(assert_sig_path, "rb") as fp:
             verified = gpg.verify_file(fp, assert_path)
-
         if not isValidSignature(verified) and verified.username is None:
             logger.warning("Signature made by unknown key.")
-            importPubkeyFromUrls(gpg, pubkeyurls)
+            importPubkey(gpg, pubkey_filename, pubkeyurls)
             with open(assert_sig_path, "rb") as fp:
                 verified = gpg.verify_file(fp, assert_path)
 
@@ -2013,34 +2028,32 @@ def signal_handler(sig, frame):
 def check_btc_fastsync_data(base_dir, sync_filename):
     logger.info("Validating signature for: " + sync_filename)
 
-    github_pgp_url = "https://raw.githubusercontent.com/basicswap/basicswap/master/pgp"
-    gitlab_pgp_url = "https://gitlab.com/particl/basicswap/-/raw/master/pgp"
     asc_filename = sync_filename + ".asc"
     asc_file_path = os.path.join(base_dir, asc_filename)
     sync_file_path = os.path.join(base_dir, sync_filename)
     if not os.path.exists(asc_file_path):
-        asc_file_urls = [
-            github_pgp_url + "/sigs/" + asc_filename,
-            gitlab_pgp_url + "/sigs/" + asc_filename,
-        ]
+        base_path = getBasePath()
+        local_path = os.path.join(base_path, "pgp", "sigs", asc_filename)
+        if os.path.exists(local_path):
+            shutil.copyfile(local_path, asc_file_path)
+
+    if not os.path.exists(asc_file_path):
+        asc_file_urls = []
         if BITCOIN_FASTSYNC_SIG_URL:
-            asc_file_urls.append("/".join([BITCOIN_FASTSYNC_SIG_URL, asc_filename]))
+            asc_file_urls.append(BITCOIN_FASTSYNC_SIG_URL)
         for url in asc_file_urls:
             try:
                 downloadFile(url, asc_file_path)
                 break
             except Exception as e:
-                logging.warning("Download failed: %s", str(e))
+                logging.warning(f"Download failed: {e}")
     if not os.path.exists(asc_file_path):
         raise ValueError("Unable to find snapshot signature file.")
     gpg = gnupg.GPG()
     pubkey_filename = "{}_{}.pgp".format("particl", "tecnovert")
-    pubkeyurls = [
-        github_pgp_url + "/keys/" + pubkey_filename,
-        gitlab_pgp_url + "/keys/" + pubkey_filename,
-    ]
+    pubkeyurls = []
     if not havePubkey(gpg, expected_key_ids["tecnovert"][0]):
-        importPubkeyFromUrls(gpg, pubkeyurls)
+        importPubkey(gpg, pubkey_filename, pubkeyurls)
     with open(asc_file_path, "rb") as fp:
         verified = gpg.verify_file(fp, sync_file_path)
 
diff --git a/pgp/keys/bitcoin_laanwj.pgp b/basicswap/pgp/keys/bitcoin_laanwj.pgp
similarity index 100%
rename from pgp/keys/bitcoin_laanwj.pgp
rename to basicswap/pgp/keys/bitcoin_laanwj.pgp
diff --git a/pgp/keys/dash_pasta.pgp b/basicswap/pgp/keys/dash_pasta.pgp
similarity index 100%
rename from pgp/keys/dash_pasta.pgp
rename to basicswap/pgp/keys/dash_pasta.pgp
diff --git a/pgp/keys/decred_release.pgp b/basicswap/pgp/keys/decred_release.pgp
similarity index 100%
rename from pgp/keys/decred_release.pgp
rename to basicswap/pgp/keys/decred_release.pgp
diff --git a/pgp/keys/dogecoin_patricklodder.pgp b/basicswap/pgp/keys/dogecoin_patricklodder.pgp
similarity index 100%
rename from pgp/keys/dogecoin_patricklodder.pgp
rename to basicswap/pgp/keys/dogecoin_patricklodder.pgp
diff --git a/pgp/keys/dogecoin_xanimo.pgp b/basicswap/pgp/keys/dogecoin_xanimo.pgp
similarity index 100%
rename from pgp/keys/dogecoin_xanimo.pgp
rename to basicswap/pgp/keys/dogecoin_xanimo.pgp
diff --git a/pgp/keys/firo_reuben.pgp b/basicswap/pgp/keys/firo_reuben.pgp
similarity index 100%
rename from pgp/keys/firo_reuben.pgp
rename to basicswap/pgp/keys/firo_reuben.pgp
diff --git a/pgp/keys/litecoin_davidburkett38.pgp b/basicswap/pgp/keys/litecoin_davidburkett38.pgp
similarity index 100%
rename from pgp/keys/litecoin_davidburkett38.pgp
rename to basicswap/pgp/keys/litecoin_davidburkett38.pgp
diff --git a/pgp/keys/litecoin_thrasher.pgp b/basicswap/pgp/keys/litecoin_thrasher.pgp
similarity index 100%
rename from pgp/keys/litecoin_thrasher.pgp
rename to basicswap/pgp/keys/litecoin_thrasher.pgp
diff --git a/pgp/keys/monero_binaryfate.pgp b/basicswap/pgp/keys/monero_binaryfate.pgp
similarity index 100%
rename from pgp/keys/monero_binaryfate.pgp
rename to basicswap/pgp/keys/monero_binaryfate.pgp
diff --git a/pgp/keys/namecoin_JeremyRand.pgp b/basicswap/pgp/keys/namecoin_JeremyRand.pgp
similarity index 100%
rename from pgp/keys/namecoin_JeremyRand.pgp
rename to basicswap/pgp/keys/namecoin_JeremyRand.pgp
diff --git a/pgp/keys/navcoin_builder.pgp b/basicswap/pgp/keys/navcoin_builder.pgp
similarity index 100%
rename from pgp/keys/navcoin_builder.pgp
rename to basicswap/pgp/keys/navcoin_builder.pgp
diff --git a/pgp/keys/particl_tecnovert.pgp b/basicswap/pgp/keys/particl_tecnovert.pgp
similarity index 100%
rename from pgp/keys/particl_tecnovert.pgp
rename to basicswap/pgp/keys/particl_tecnovert.pgp
diff --git a/pgp/keys/pivx_fuzzbawls.pgp b/basicswap/pgp/keys/pivx_fuzzbawls.pgp
similarity index 100%
rename from pgp/keys/pivx_fuzzbawls.pgp
rename to basicswap/pgp/keys/pivx_fuzzbawls.pgp
diff --git a/pgp/sigs/utxo-snapshot-bitcoin-mainnet-720179.tar.asc b/basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-720179.tar.asc
similarity index 100%
rename from pgp/sigs/utxo-snapshot-bitcoin-mainnet-720179.tar.asc
rename to basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-720179.tar.asc
diff --git a/pgp/sigs/utxo-snapshot-bitcoin-mainnet-769818.tar.asc b/basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-769818.tar.asc
similarity index 100%
rename from pgp/sigs/utxo-snapshot-bitcoin-mainnet-769818.tar.asc
rename to basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-769818.tar.asc
diff --git a/pgp/sigs/utxo-snapshot-bitcoin-mainnet-820852.tar.asc b/basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-820852.tar.asc
similarity index 100%
rename from pgp/sigs/utxo-snapshot-bitcoin-mainnet-820852.tar.asc
rename to basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-820852.tar.asc
diff --git a/pgp/sigs/utxo-snapshot-bitcoin-mainnet-867690.tar.asc b/basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-867690.tar.asc
similarity index 100%
rename from pgp/sigs/utxo-snapshot-bitcoin-mainnet-867690.tar.asc
rename to basicswap/pgp/sigs/utxo-snapshot-bitcoin-mainnet-867690.tar.asc