diff --git a/app.js b/app.js
index 05b7432fda8d3ba7229af67043d5ec1b6dde4443..cefda175dc9efece25b3bbc13f7cb0e1d547f424 100644
--- a/app.js
+++ b/app.js
@@ -248,26 +248,51 @@ var firmwarewizard = function() {
     }
   }
 
-  function parseFilePath(device, match, path, href, branch) {
+  function parseFilePath(match, basePath, filename, branch) {
+    var location = basePath + filename;
+
+    var devices = vendormodels_reverse[match];
+    if (!(devices instanceof Array) || devices.length != 1) {
+      console.log("Error: vendormodels_reverse did not contain", match);
+      return;
+    }
+    var device = devices[0];
+
     if (device.model == '--ignore--' || device.revision == '--ignore--') {
       return;
     }
 
-    var location = path + href;
-    var type = findType(href);
-    var version = findVersion(href);
-    var region = findRegion(href);
-    var revision = device.revision;
-    var size = findSize(href);
+    var strippedFilename = filename;
+    strippedFilename = strippedFilename.replace(config.community_prefix, '-');
 
-    if (revision.length === 0) {
-      revision = findRevision(href.replace(match, ''));
-    }
+    var version = findVersion(strippedFilename);
+    strippedFilename = strippedFilename.replace(version, '');
+
+    strippedFilename = strippedFilename.replace(match, '');
+
+    var revision = device.revision || findRevision(strippedFilename);
+    strippedFilename = strippedFilename.replace(revision, '');
+
+    var region = findRegion(strippedFilename);
+    strippedFilename = strippedFilename.replace(region, '');
 
     if (region.length) {
       revision += '-' + region;
     }
 
+    var size = findSize(strippedFilename);
+    strippedFilename = strippedFilename.replace(size, '');
+
+    var type = findType(strippedFilename);
+    strippedFilename = strippedFilename.replace(type, '');
+
+    strippedFilename = strippedFilename.replace(/.(bin|img.gz|img|tar|vdi|vmdk)/, '');
+    strippedFilename = strippedFilename.replace(/-/g, '');
+
+    if (strippedFilename !== '') {
+      console.log("Match for file", filename, "was not exhaustive.");
+    }
+
     // collect branch versions
     app.currentVersions[branch] = version;
 
@@ -701,8 +726,6 @@ var firmwarewizard = function() {
 
   // parse the contents of the given directories
   function loadDirectories() {
-    var vendormodels_reverse = buildVendorModelsReverse();
-
     // sort by length to get the longest match
     var matches = Object.keys(vendormodels_reverse).sort(function(a, b) {
       if (a.length < b.length) return 1;
@@ -725,10 +748,7 @@ var firmwarewizard = function() {
           }
           var match = reMatch.exec(href);
           if (match) {
-            var devices = vendormodels_reverse[match[1]];
-            for (var i in devices) {
-              parseFilePath(devices[i], match[1], basePath, href, branch);
-            }
+            parseFilePath(match[1], basePath, href, branch);
           } else if (config.listMissingImages) {
             console.log("No rule for firmware image:", href);
           }
@@ -761,6 +781,7 @@ var firmwarewizard = function() {
     }
   }
 
+  var vendormodels_reverse = buildVendorModelsReverse();
   loadDirectories();
 
   // set link to firmware source directory
diff --git a/config_template.js b/config_template.js
index 866895977f29e6e759c8497571a926a9e7cb6fa2..444dccf9d7c31ccbfc82c9adbf3a9a400e46d429 100644
--- a/config_template.js
+++ b/config_template.js
@@ -18,6 +18,8 @@ var config = {
   listMissingImages: false,
   // see devices.js for different vendor model maps
   vendormodels: vendormodels,
+  // community prefix of the firmware images
+  community_prefix: 'gluon-ffda-',
   // relative image paths and branch
   directories: {
     // some demo sources
diff --git a/devices.js b/devices.js
index b1d679bf5077cc49e4f8d021a79c5c2b8db56898..e6a1c1010e84d2c71f47cb86b679beb8faf967b5 100644
--- a/devices.js
+++ b/devices.js
@@ -1,56 +1,58 @@
 var vendormodels = {
   "8devices": {
-    "Carambola Board 2": "carambola2"
+    "Carambola Board 2": "8devices-carambola2-board"
   },
 
   "Alfa": {
-    "AP121": "ap121",
-    "AP121U": "ap121u",
-    "Hornet-UB": "hornet-ub",
-    "Tube2H": "tube2h",
-    "N2 / N5": "n2-n5"
+    "AP121": {"alfa-ap121": "", "alfa-network-ap121": ""},
+    "AP121U": {"alfa-ap121u": "", "alfa-network-ap121u": ""},
+    "Hornet-UB": {"alfa-hornet-ub": "", "alfa-network-hornet-ub": ""},
+    "Tube2H": {"alfa-tube2h": "", "alfa-network-tube2h": ""},
+    "N2 / N5": {"alfa-n2-n5": "", "alfa-network-n2-n5": ""},
   },
 
   "Allnet": {
-    "ALL0315N": "all0315n"
+    "ALL0315N": "allnet-all0315n"
   },
 
   "Buffalo": {
-    "WZR-600DHP": {"wzr-600dhp": "v2"},
-    "WZR-HP-AG300H": "wzr-hp-ag300h",
-    "WZR-HP-G300H": "wzr-hp-g300h",
-    "WZR-HP-G300NH": {"wzr-hp-g300nh": "v1", "wzr-hp-g300nh2": "v2"},
-    "WZR-HP-G450H": "wzr-hp-g450h",
+    "WZR-600DHP": {"buffalo-wzr-600dhp": "v2"},
+    "WZR-HP-AG300H": {"buffalo-wzr-hp-ag300h": "", "buffalo-wzr-hp-ag300h-wzr-600dhp": ""},
+    "WZR-HP-G300H": {"buffalo-wzr-hp-g300h": ""},
+    "WZR-HP-G300NH": {"buffalo-wzr-hp-g300nh": "v1", "buffalo-wzr-hp-g300nh2": "v2"},
+    "WZR-HP-G450H": {"buffalo-wzr-hp-g450h": ""},
   },
 
   "D-Link": {
-    "DIR-505": "dir-505",
-    "DIR-615": {"dir-615-c1": "c1/c2", "dir-615-rev-c1": "c1/c2", "dir-615-d": "d1-d4", "dir-615-e1": "e1/e2", "dir-615-e4": "e3-e5", "dir-615-h1": "h1/h2"},
-    "DIR-825": "dir-825",
-    "DIR-860L": "dir-860l"
+    "DIR-505": "d-link-dir-505-rev",
+    "DIR-615": {"d-link-dir-615-c1": "c1/c2", "d-link-dir-615-rev-c1": "c1/c2",
+                "d-link-dir-615-d": "d1-d4", "d-link-dir-615-e1": "e1/e2",
+                "d-link-dir-615-e4": "e3-e5", "d-link-dir-615-h1": "h1/h2"},
+    "DIR-825": "d-link-dir-825-rev",
+    "DIR-860L": "d-link-dir-860l"
   },
 
   "GL Innovations": {
-    "AR150": "ar150",
-    "iNet 6408a": "inet-6408a",
-    "iNet 6416a": "inet-6416a"
+    "AR150": "gl-ar150",
+    "iNet 6408a": "gl-inet-6408a",
+    "iNet 6416a": "gl-inet-6416a"
   },
 
   "LeMaker": {
-    "Banana Pi": "banana-pi",
-    "Banana Pro": "banana-pro",
+    "Banana Pi": "lemaker-banana-pi",
+    "Banana Pro": "lemaker-banana-pro",
     "Lamobo": "lamobo"
   },
 
   "Linksys": {
-    "WRT160NL": "wrt160nl"
+    "WRT160NL": "linksys-wrt160nl"
   },
 
   "Meraki": {
-    "MR12": "mr12",
-    "MR16": "mr16",
-    "MR62": "mr62",
-    "MR66": "mr66"
+    "MR12": "meraki-mr12",
+    "MR16": "meraki-mr16",
+    "MR62": "meraki-mr62",
+    "MR66": "meraki-mr66"
   },
 
   "Mikrotik": {
@@ -59,27 +61,27 @@ var vendormodels = {
   },
 
   "Netgear": {
-    "WNR2200": "wnr2200",
-    "WNDR3700": {"wndr3700": "v1", "wndr3700v2": "v2", "wndr3700v3": "v3", "wndr3700v4": "v4"},
-    "WNDR3800": "wndr3800",
-    "WNDR4300": "wndr4300",
-    "WNDRMAC": {"wndrmac": "v1", "wndrmacv2": "v2"},
+    "WNR2200": "netgear-wnr2200",
+    "WNDR3700": {"netgear-wndr3700": "v1", "netgear-wndr3700v2": "v2", "netgear-wndr3700v3": "v3", "netgear-wndr3700v4": "v4"},
+    "WNDR3800": "netgear-wndr3800",
+    "WNDR4300": "netgear-wndr4300",
+    "WNDRMAC": {"netgear-wndrmac": "v1", "netgear-wndrmacv2": "v2"},
   },
 
   "Onion": {
-    "Omega": "omega"
+    "Omega": "onion-omega"
   },
 
   "Open-Mesh": {
-    "MR1750": {"mr1750": "v1", "mr1750v2": "v2"},
-    "MR600": {"mr600": "v1", "mr600v2": "v2"},
-    "MR900": {"mr900": "v1", "mr900v2": "v2"},
-    "OM2P HS": {"om2p-hs": "v1", "om2p-hsv3": "v3"},
-    "OM2P LC": "om2p-lc",
-    "OM2P": {"openmesh-om2p": "v1", "om2pv2": "v2"},
+    "MR1750": {"openmesh-mr1750": "v1", "openmesh-mr1750v2": "v2"},
+    "MR600": {"openmesh-mr600": "v1", "openmesh-mr600v2": "v2"},
+    "MR900": {"openmesh-mr900": "v1", "openmesh-mr900v2": "v2"},
+    "OM2P HS": {"openmesh-om2p-hs": "v1", "openmesh-om2p-hsv3": "v3"},
+    "OM2P LC": "openmesh-om2p-lc",
+    "OM2P": {"openmesh-om2p": "v1", "openmesh-om2pv2": "v2"},
     "OM5P-AC": {"openmesh-om5p-ac": "v1", "openmesh-om5p-acv2": "v2"},
-    "OM5P-AN": "om5p-an",
-    "OM5P": "om5p"
+    "OM5P-AN": "openmesh-om5p-an",
+    "OM5P": "openmesh-om5p"
   },
 
   "PC Engines": {
@@ -92,63 +94,68 @@ var vendormodels = {
   },
 
   "TP-Link": {
-    "Archer C5": {"archer-c5": "v1"},
-    "Archer C7": "archer-c7",
-    "CPE 210": {"cpe210": "", "cpe210-220": ""},
-    "CPE 220": {"cpe220": "", "cpe210-220": ""},
-    "CPE 510": {"cpe510": "", "cpe510-520": ""},
-    "CPE 520": {"cpe520": "", "cpe510-520": ""},
-    "WBS 210": "wbs210",
-    "WBS 510": "wbs510",
-    "TL-MR13U": "tl-mr13u",
-    "TL-MR3020": "tl-mr3020",
-    "TL-MR3040": "tl-mr3040",
-    "TL-MR3220": "tl-mr3220",
-    "TL-MR3420": "tl-mr3420",
-    "TL-WA701N-ND": {"tl-wa701n": "", "tl-wa701nd": ""},
-    "TL-WA750RE": "tl-wa750re",
-    "TL-WA7510N": "tl-wa7510n",
-    "TL-WA801N-ND": {"tl-wa801n": "", "wa801nd": ""},
-    "TL-WA830RE": "tl-wa830re",
-    "TL-WA850RE": "tl-wa850re",
-    "TL-WA860RE": "tl-wa860re",
-    "TL-WA901N-ND": {"tl-wa901n": "", "tl-wa901nd": ""},
-    "TL-WDR3500": "tl-wdr3500",
-    "TL-WDR3600": "tl-wdr3600",
-    "TL-WDR4300": "tl-wdr4300",
-    "TL-WDR4900": "tl-wdr4900",
-    "TL-WR1043N-ND": {"tl-wr1043n": "", "tl-wr1043nd": ""},
-    "TL-WR2543N-ND": {"tl-wr2543": "", "tl-wr2543n": ""},
-    "TL-WR703N": "tl-wr703n",
-    "TL-WR710N": "tl-wr710n",
-    "TL-WR740N-ND": "tl-wr740n",
-    "TL-WR741N-ND": "tl-wr741n",
-    "TL-WR743N-ND": "tl-wr743n",
-    "TL-WR841N-ND": {"tl-wr841n":  "", "tl-wr841nd": ""},
-    "TL-WR842N-ND": "tl-wr842n",
-    "TL-WR843N-ND": "tl-wr843n",
-    "TL-WR940N-ND": {"tl-wr940n": "", "tl-wr941nd-v4": "v1", "tl-wr941nd-v5": "v2", "tl-wr941nd-v6": "v3"},
-    "TL-WR941N-ND": {"wr941n-nd": "", "tl-wr941nd": "", "tl-wr941nd-v4": "v4", "tl-wr941nd-v5": "v5", "tl-wr941nd-v6": "v6"}
+    "Archer C5": {"tp-link-archer-c5": "v1"},
+    "Archer C7": "tp-link-archer-c7",
+    "CPE 210": {"tp-link-cpe210": "", "tp-link-cpe210-220": ""},
+    "CPE 220": {"tp-link-cpe220": "", "tp-link-cpe210-220": ""},
+    "CPE 510": {"tp-link-cpe510": "", "tp-link-cpe510-520": ""},
+    "CPE 520": {"tp-link-cpe520": "", "tp-link-cpe510-520": ""},
+    "WBS 210": "tp-link-wbs210",
+    "WBS 510": "tp-link-wbs510",
+    "TL-MR13U": "tp-link-tl-mr13u",
+    "TL-MR3020": "tp-link-tl-mr3020",
+    "TL-MR3040": "tp-link-tl-mr3040",
+    "TL-MR3220": "tp-link-tl-mr3220",
+    "TL-MR3420": "tp-link-tl-mr3420",
+    "TL-WA701N-ND": {"tp-link-tl-wa701nd": "", "tp-link-tl-wa701n-nd": ""},
+    "TL-WA750RE": "tp-link-tl-wa750re",
+    "TL-WA7510N": "tp-link-tl-wa7510n",
+    "TL-WA801N-ND": {"tp-link-tl-wa801n": "", "tp-link-tl-wa801n-nd": ""},
+    "TL-WA830RE": "tp-link-tl-wa830re",
+    "TL-WA850RE": "tp-link-tl-wa850re",
+    "TL-WA860RE": "tp-link-tl-wa860re",
+    "TL-WA901N-ND": {"tp-link-tl-wa901nd": "", "tp-link-tl-wa901n-nd": ""},
+    "TL-WDR3500": "tp-link-tl-wdr3500",
+    "TL-WDR3600": "tp-link-tl-wdr3600",
+    "TL-WDR4300": "tp-link-tl-wdr4300",
+    "TL-WDR4900": "tp-link-tl-wdr4900",
+    "TL-WR1043N-ND": {"tp-link-tl-wr1043n-nd": ""},
+    "TL-WR2543N-ND": {"tp-link-tl-wr2543n-nd": ""},
+    "TL-WR703N": "tp-link-tl-wr703n",
+    "TL-WR710N": "tp-link-tl-wr710n",
+    "TL-WR740N-ND": "tp-link-tl-wr740n-nd",
+    "TL-WR741N-ND": "tp-link-tl-wr741n-nd",
+    "TL-WR743N-ND": "tp-link-tl-wr743n-nd",
+    "TL-WR841N-ND": {"tp-link-tl-wr841n-nd": "", "tp-link-tl-wr841nd": ""},
+    "TL-WR842N-ND": {"tp-link-tl-wr842n-nd": ""},
+    "TL-WR843N-ND": {"tp-link-tl-wr843n-nd": ""},
+    "TL-WR940N-ND": {"tp-link-tl-wr940n": "", "tp-link-tl-wr940n-nd": "", "tp-link-tl-wr941nd-v4": "v1", "tp-link-tl-wr941nd-v5": "v2", "tp-link-tl-wr941nd-v6": "v3"},
+    "TL-WR941N-ND": {"tp-link-tl-wr941nd": "", "tp-link-tl-wr941n-nd": "", "tp-link-tl-wr941nd-v4": "v4", "tp-link-tl-wr941nd-v5": "v5", "tp-link-tl-wr941nd-v6": "v6"}
   },
 
   "Ubiquiti": {
     "AirGateway": {"ubnt-air-gateway": "", "ubiquiti-airgateway": ""},
     "AirRouter": {"ubnt-air-router": "", "ubiquiti-airrouter": ""},
-    "Bullet": {"bullet-m2": "M2", "bullet-m5": "M5", "bullet-m": "--ignore--"},
-    "Litestation SR71": "ls-sr71",
-    "NanoStation Loco": {"loco-m-xw": "--ignore--", "loco-m2": "M2 XM", "loco-m5": "M5 XM", "loco-m2-xw": "M2 XW", "loco-m5-xw": "M5 XW"},
-    "NanoStation": {"nanostation-m": "--ignore--", "nano-m": "--ignore--", "nanostation-m-xw": "--ignore--", "nano-m-xw": "--ignore--",
-                    "nanostation-m2": "M2 XM", "nano-m2": "M2 XM", "nanostation-m2-xw": "M2 XW", "nano-m2-xw": "M2 XW",
-                    "nanostation-m5": "M5 XM", "nano-m5": "M5 XM", "nanostation-m5-xw": "M5 XW", "nano-m5-xw": "M5 XW"},
-    "PicoStation": "picostation",
-    "Rocket": {"rocket-m-xw": "M XW", "rocket": ""},
-    "UniFi AP": "unifi",
-    "UniFi AP LR": "unifi-ap-lr",
-    "UniFi AP Pro": "unifi-ap-pro",
-    "UniFi AP AC Pro": "unifi-ac-pro",
-    "UniFi AP AC Lite": "unifi-ac-lite",
-    "UniFi AP Outdoor": {"unifi-outdoor": "", "unifiap-outdoor": ""},
-    "UniFi AP Outdoor+": {"unifi-outdoor-plus": "", "ubiquiti-unifiap-outdoor\\\+": "", "ubiquiti-unifiap-outdoor%2B": ""}
+    "Bullet": {"ubiquiti-bullet-m2": "M2", "ubiquiti-bullet-m5": "M5", "bullet-m": "--ignore--"},
+    "Litestation SR71": "ubiquiti-ls-sr71",
+    "NanoStation Loco": {"ubiquiti-loco-m-xw": "--ignore--",
+                         "ubiquiti-nanostation-loco-m2": "M2 XM", "ubiquiti-nanostation-loco-m2-xw": "M2 XW",
+                         "ubiquiti-nanostation-loco-m5": "M5 XM", "ubiquiti-nanostation-loco-m5-xw": "M5 XW"},
+    "NanoStation": {"ubiquiti-nanostation-m": "--ignore--", "ubiquiti-nano-m": "--ignore--", "ubiquiti-nanostation-m-xw": "--ignore--", "ubiquiti-nano-m-xw": "--ignore--",
+                    "ubiquiti-nanostation-m2": "M2 XM", "ubiquiti-nano-m2": "M2 XM", "ubiquiti-nanostation-m2-xw": "M2 XW", "ubiquiti-nano-m2-xw": "M2 XW",
+                    "ubiquiti-nanostation-m5": "M5 XM", "ubiquiti-nano-m5": "M5 XM", "ubiquiti-nanostation-m5-xw": "M5 XW", "ubiquiti-nano-m5-xw": "M5 XW"},
+    "PicoStation": {"ubiquiti-picostation-m": "M",
+                    "ubiquiti-picostation-m2": "M2"},
+    "Rocket": {"ubiquiti-rocket-m": "M", "ubiquiti-rocket-m-xw": "M XW",
+               "ubiquiti-rocket-m2": "M2", "ubiquiti-rocket-m2-xw": "M2 XW",
+               "ubiquiti-rocket-m5": "M5", "ubiquiti-rocket-m5-xw": "M5 XW"},
+    "UniFi AP": {"ubiquiti-unifi": "--ignore--", "ubiquiti-unifi-ap": ""},
+    "UniFi AP LR": "ubiquiti-unifi-ap-lr",
+    "UniFi AP Pro": "ubiquiti-unifi-ap-pro",
+    "UniFi AP AC Pro": "ubiquiti-unifi-ac-pro",
+    "UniFi AP AC Lite": "ubiquiti-unifi-ac-lite",
+    "UniFi AP Outdoor": {"ubiquiti-unifi-outdoor": "", "ubiquiti-unifiap-outdoor": ""},
+    "UniFi AP Outdoor+": {"ubiquiti-unifi-outdoor-plus": "", "ubiquiti-unifiap-outdoor\\\+": "", "ubiquiti-unifiap-outdoor%2B": ""}
   },
 
   "VoCore": {
@@ -156,8 +163,8 @@ var vendormodels = {
   },
 
   "Western Digital": {
-    "My Net N600": "my-net-n600",
-    "My Net N750": "my-net-n750"
+    "My Net N600": {"wd-my-net-n600": ""},
+    "My Net N750": {"wd-my-net-n750": ""}
   },
 
   "x86": {