diff --git a/edge/PREPARE b/edge/PREPARE
new file mode 100644
index 0000000000000000000000000000000000000000..575ff42b096b6fc1eae4d37210413332be7dba79
--- /dev/null
+++ b/edge/PREPARE
@@ -0,0 +1,4 @@
+for size in 16 32 128 ; do
+    convert -density 256x256 -background transparent "$SHAREDDIR/icon.svg" \
+	    -resize ${size}x${size} "$targetdir/icon${size}x${size}.png"
+done
diff --git a/edge/TARGET b/edge/TARGET
new file mode 100644
index 0000000000000000000000000000000000000000..dbfb8f931b33282ce7d78b6ea117eba71390087d
--- /dev/null
+++ b/edge/TARGET
@@ -0,0 +1 @@
+firefox
diff --git a/edge/manifest.override.json b/edge/manifest.override.json
new file mode 100644
index 0000000000000000000000000000000000000000..8e2830636b450096ade982f6b07c653c2a82da4b
--- /dev/null
+++ b/edge/manifest.override.json
@@ -0,0 +1,7 @@
+{
+    "icons": {
+	"16": "icon16x16.png",
+        "32": "icon32x32.png",
+	"128": "icon128x128.png"
+    }
+}
diff --git a/firefox/manifest.beta.part.json b/firefox/manifest.beta.merge.json
similarity index 100%
rename from firefox/manifest.beta.part.json
rename to firefox/manifest.beta.merge.json
diff --git a/firefox/manifest.part.json b/firefox/manifest.merge.json
similarity index 100%
rename from firefox/manifest.part.json
rename to firefox/manifest.merge.json
diff --git a/scripts/build.sh b/scripts/build.sh
index 00539a35f1cd4c12b0ec00f5da6b3560207c170a..b2c75cd13d9e5316cf860faa281c9c34cef184dd 100644
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -2,6 +2,10 @@
 
 set -eu
 
+TARGETS=(thunderbird firefox edge)
+BASEDIR="$( cd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null 2>&1 && pwd )"
+
+
 usage() {
     cat <<EOF
 Usage: $0 [--beta] [--debug] [--version VERSION]
@@ -56,9 +60,6 @@ done
 [ "$version" ] || usage
 
 
-TARGETS=(thunderbird firefox)
-
-BASEDIR="$( cd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null 2>&1 && pwd )"
 BUILDDIR="$BASEDIR/build"
 SHAREDDIR="$BASEDIR/shared"
 
@@ -74,22 +75,36 @@ else
     version_name="$version"
 fi
 
-declare -a manifests
+declare -a merge
+declare -a override
 
 for target in "${TARGETS[@]}" ; do
     targetdir="$BUILDDIR/$target"
     sourcedir="$BASEDIR/$target"
     xpifile="safelinks-cleaner-$target.xpi"
     outputfile="$BUILDDIR/$xpifile"
+    origdir=
     
-    echo "[+] building target '$target'"
+    echo -n "[+] building target '$target'"
+    if [ -f "$sourcedir/TARGET" ] ; then
+	echo " (alias for $(cat $sourcedir/TARGET))"
+	origdir="$sourcedir"
+	sourcedir="$BASEDIR/$(cat $sourcedir/TARGET)"
+    else
+	echo
+    fi
+
     [ -d "$targetdir" ] && rm -r "$targetdir"
     mkdir -p "$targetdir"
 
+    [ -f "$origdir/PREPARE" ] && source "$origdir/PREPARE"
+
     cp -r "$SHAREDDIR"/* "$targetdir"
     cp -r "$sourcedir"/* "$targetdir"
-    rm -f "$targetdir"/manifest.part.json \
-          "$targetdir"/manifest.beta.part.json \
+    rm -f "$targetdir"/*.merge.json \
+          "$targetdir"/*.override.json \
+	  "$targetdir"/PREPARE \
+	  "$targetdir"/TARGET \
           "$targetdir"/*~ \
           "$targetdir"/#*
 
@@ -99,15 +114,26 @@ for target in "${TARGETS[@]}" ; do
 	done
     fi
 
-    manifests=("$SHAREDDIR/manifest.part.json" 
-	       "$sourcedir/manifest.part.json")
-
-    if [ "$beta" -a -f "$sourcedir/manifest.beta.part.json" ] ; then
-	manifests+=("$sourcedir/manifest.beta.part.json")
-    fi
+    merge=("$SHAREDDIR/manifest.merge.json")
+    [ -f "$sourcedir/manifest.merge.json" ] && \
+	merge+=("$sourcedir/manifest.merge.json")
+    [ "$origdir" -a -f "$origdir/manifest.merge.json" ] && \
+	merge+=("$origdir/manifest.merge.json")
+    [ "$beta" -a "$sourcedir/manifest.beta.merge.json" ] && \
+	merge+=("$sourcedir/manifest.beta.merge.json")
+    [ "$origdir" -a "$beta" -a "$sourcedir/manifest.beta.merge.json" ] && \
+	merge+=("$origdir/manifest.beta.merge.json")
+
+    override=()
+    [ "$origdir" -a -f "$origdir/manifest.override.json" ] && \
+	override+=("$origdir/manifest.override.json")
+    [ "$beta" -a "$sourcedir/manifest.beta.override.json" ] && \
+	override+=("$sourcedir/manifest.beta.override.json")
+    [ "$origdir" -a "$beta" -a "$origdir/manifest.beta.override.json" ] && \
+	override+=("$origdir/manifest.beta.override.json")
 
     python3 "$BASEDIR/scripts/makemanifest.py" \
-	    "${manifests[@]}" \
+	    --merge "${merge[@]}" --override "${override[@]}" \
 	    > "$targetdir/manifest.json"
 
     sed -i -e "s|%XPIFILE%|$xpifile|g" "$targetdir/manifest.json"
diff --git a/scripts/makemanifest.py b/scripts/makemanifest.py
index 4b4a2945804e726eb620cc81f7cc42244f9245af..57faca838a377d49a9907664b2d630e44a085352 100644
--- a/scripts/makemanifest.py
+++ b/scripts/makemanifest.py
@@ -33,13 +33,13 @@ def deepmerge(data_a, data_b, *, path=""):
 def main():
     """Main function."""
     parser = argparse.ArgumentParser("Merge fragments of manifest.json files.")
-#    parser.add_argument('--output', required=True, help='path to output file')
-    parser.add_argument('files', nargs='+', help='input files')
+    parser.add_argument('--merge', nargs='+', help='input files to merge')
+    parser.add_argument('--override', nargs='*', default=[], help='override files')
     opts = parser.parse_args()
 
     result = {}
     errors = False
-    for path in opts.files:
+    for path in opts.merge:
         with open(path, 'r') as fp:
             try:
                 data = json.load(fp)
@@ -51,6 +51,16 @@ def main():
 
     if errors:
         sys.exit(1)
+
+    for path in opts.override:
+        with open(path, 'r') as fp:
+            try:
+                data = json.load(fp)
+            except json.decoder.JSONDecodeError as exc:
+                print('%s: %s' % (path, str(exc)), file=sys.stderr)
+                errors = True
+        if not errors:
+            result.update(data)
         
     print(json.dumps(result, indent=4))
 
diff --git a/scripts/update-version.py b/scripts/update-version.py
index 6129dbefb6a32c964b22883c44a69e29b4dd33bd..c64c1082bd1355ee1aec5edf852ea3a2699c9fde 100644
--- a/scripts/update-version.py
+++ b/scripts/update-version.py
@@ -272,10 +272,12 @@ def main():
             print(new_version)
     else:
         if increment:
-            print(f'git tag {new_version} {commit_ref}')
-            print(f'git push origin')
+            verbose(f'git tag {new_version} {commit_ref}')
+            verbose(f'git push origin')
         if opts.output:
-            print(f'echo "$new_version" > {opts.output}')
+            verbose(f'echo "{new_version}" > {opts.output}')
+        if not opts.verbose:
+            print(f"{new_version}")
 
     return 0
 
diff --git a/shared/manifest.part.json b/shared/manifest.merge.json
similarity index 100%
rename from shared/manifest.part.json
rename to shared/manifest.merge.json
diff --git a/thunderbird/manifest.beta.part.json b/thunderbird/manifest.beta.merge.json
similarity index 100%
rename from thunderbird/manifest.beta.part.json
rename to thunderbird/manifest.beta.merge.json
diff --git a/thunderbird/manifest.part.json b/thunderbird/manifest.merge.json
similarity index 100%
rename from thunderbird/manifest.part.json
rename to thunderbird/manifest.merge.json