diff --git a/mix.exs b/mix.exs
index dae50ea535e22d8c5bb9032fe1c72bf6a6fc4455..0b7e667520b0b61b258a2d79c73f3dc63c13fbe8 100644
--- a/mix.exs
+++ b/mix.exs
@@ -65,7 +65,7 @@ defmodule Plausible.MixProject do
       {:postgrex, ">= 0.0.0"},
       {:ref_inspector, "~> 1.3"},
       {:timex, "~> 3.6"},
-      {:ua_inspector, "~> 2.2"},
+      {:ua_inspector, "~> 3.0"},
       {:bamboo, "~> 2.2"},
       {:hackney, "~> 1.8"},
       {:bamboo_phoenix, "~> 1.0.0"},
diff --git a/mix.lock b/mix.lock
index a556a16ed1423ac31cbdd9f73e05654a047be802..2ce2bd6c043b9531cf648d9b103316acfe3fe6bb 100644
--- a/mix.lock
+++ b/mix.lock
@@ -7,7 +7,7 @@
   "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.3.0", "6cb662d5c1b0a8858801cf20997bd006e7016aa8c52959c9ef80e0f34fb60b7a", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "2c81d61d4f6ed0e5cf7bf27a9109b791ff216a1034b3d541327484f46dd43769"},
   "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
   "cachex": {:hex, :cachex, "3.4.0", "868b2959ea4aeb328c6b60ff66c8d5123c083466ad3c33d3d8b5f142e13101fb", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "370123b1ab4fba4d2965fb18f87fd758325709787c8c5fce35b3fe80645ccbe5"},
-  "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"},
+  "certifi": {:hex, :certifi, "2.9.0", "6f2a475689dd47f19fb74334859d460a2dc4e3252a3324bd2111b8f0429e7e21", [:rebar3], [], "hexpm", "266da46bdb06d6c6d35fde799bcb28d36d985d424ad7c08b5bb48f5b5cdd4641"},
   "chatterbox": {:hex, :ts_chatterbox, "0.11.0", "b8f372c706023eb0de5bf2976764edb27c70fe67052c88c1f6a66b3a5626847f", [:rebar3], [{:hpack, "~>0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}], "hexpm", "722fe2bad52913ab7e87d849fc6370375f0c961ffb2f0b5e6d647c9170c382a6"},
   "clickhouse_ecto": {:git, "https://github.com/plausible/clickhouse_ecto.git", "7bc94cce111d3e9dbd8534fe96bd5195181826a2", []},
   "clickhousex": {:git, "https://github.com/plausible/clickhousex", "f030155234ad045a08a9fdc263f471dd4cfea350", []},
@@ -44,7 +44,7 @@
   "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"},
   "gproc": {:hex, :gproc, "0.8.0", "cea02c578589c61e5341fce149ea36ccef236cc2ecac8691fba408e7ea77ec2f", [:rebar3], [], "hexpm", "580adafa56463b75263ef5a5df4c86af321f68694e7786cb057fd805d1e2a7de"},
   "grpcbox": {:hex, :grpcbox, "0.14.0", "3eb321bcd2275baf8b54cf381feb7b0559a50c02544de28fda039c7f2f9d1a7a", [:rebar3], [{:acceptor_pool, "~>1.0.0", [hex: :acceptor_pool, repo: "hexpm", optional: false]}, {:chatterbox, "~>0.11.0", [hex: :ts_chatterbox, repo: "hexpm", optional: false]}, {:ctx, "~>0.6.0", [hex: :ctx, repo: "hexpm", optional: false]}, {:gproc, "~>0.8.0", [hex: :gproc, repo: "hexpm", optional: false]}], "hexpm", "e24159b7b6d3f9869bbe528845c0125fed2259366ba908fd04a1f45fe81d0660"},
-  "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"},
+  "hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"},
   "hammer": {:hex, :hammer, "6.0.0", "72ec6fff10e9d63856968988a22ee04c4d6d5248071ddccfbda50aa6c455c1d7", [:mix], [{:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm", "d8e1ec2e534c4aae508b906759e077c3c1eb3e2b9425235d4b7bbab0b016210a"},
   "hpack": {:hex, :hpack_erl, "0.2.3", "17670f83ff984ae6cd74b1c456edde906d27ff013740ee4d9efaa4f1bf999633", [:rebar3], [], "hexpm", "06f580167c4b8b8a6429040df36cc93bba6d571faeaec1b28816523379cbb23a"},
   "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
@@ -89,8 +89,8 @@
   "telemetry_registry": {:hex, :telemetry_registry, "0.3.0", "6768f151ea53fc0fbca70dbff5b20a8d663ee4e0c0b2ae589590e08658e76f1e", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "492e2adbc609f3e79ece7f29fec363a97a2c484ac78a83098535d6564781e917"},
   "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"},
   "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"},
-  "ua_inspector": {:hex, :ua_inspector, "2.2.0", "7b737d7668a10c6a380c949e3d93acc992df51f77cc2659a6352dafc8b6fb09c", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "1701dcfd81c00d5ec1322a0f609b93260f5de85317ed1afb2e11917a52748958"},
+  "ua_inspector": {:hex, :ua_inspector, "3.0.1", "649e68e31296a7bc39204e84b13a14c245b61df43fde0dd91ef784a98ecb04d4", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "b510ce5a5fd70a37bf5eab8008a25fc57388ea240b95bb4d98fc892648f9b916"},
   "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
   "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},
-  "yamerl": {:hex, :yamerl, "0.8.1", "07da13ffa1d8e13948943789665c62ccd679dfa7b324a4a2ed3149df17f453a4", [:rebar3], [], "hexpm", "96cb30f9d64344fed0ef8a92e9f16f207de6c04dfff4f366752ca79f5bceb23f"},
+  "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"},
 }
diff --git a/priv/ua_inspector/bot.bots.yml b/priv/ua_inspector/bot.bots.yml
index d27a15da498e893f758d0f7dd496e5b56ae6664f..1df529db991d2aee3a86e974b21daa2867d44e50 100644
--- a/priv/ua_inspector/bot.bots.yml
+++ b/priv/ua_inspector/bot.bots.yml
@@ -5,10 +5,10 @@
 # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
 ###############
 
-- regex: '360Spider(-Image|-Video)?'
+- regex: '360Spider'
   name: '360Spider'
   category: 'Search bot'
-  url: 'http://www.so.com/help/help_3_2.html'
+  url: 'https://www.so.com/help/help_3_2.html'
   producer:
     name: 'Online Media Group, Inc.'
     url: ''
@@ -40,26 +40,42 @@
 - regex: 'AhrefsBot'
   name: 'aHrefs Bot'
   category: 'Crawler'
-  url: 'http://ahrefs.com/robot'
+  url: 'https://ahrefs.com/robot'
   producer:
     name: 'Ahrefs Pte Ltd'
-    url: 'http://ahrefs.com/robot'
+    url: 'https://ahrefs.com/robot'
+
+- regex: 'AhrefsSiteAudit/([\d+.]+)'
+  name: 'AhrefsSiteAudit'
+  category: 'Site Monitor'
+  url: 'https://ahrefs.com/robot/site-audit'
+  producer:
+    name: 'Ahrefs Pte Ltd'
+    url: 'https://ahrefs.com/'
 
 - regex: 'ia_archiver|alexabot|verifybot'
   name: 'Alexa Crawler'
   category: 'Search bot'
-  url: 'https://alexa.zendesk.com/hc/en-us/sections/200100794-Crawlers'
+  url: 'https://support.alexa.com/hc/en-us/sections/200100794-Crawlers'
   producer:
     name: 'Alexa Internet'
-    url: 'http://www.alexa.com'
+    url: 'https://www.alexa.com'
 
 - regex: 'alexa site audit'
   name: 'Alexa Site Audit'
   category: 'Site Monitor'
-  url: 'http://www.alexa.com/help/webmasters'
+  url: 'https://support.alexa.com/hc/en-us/articles/200450194'
   producer:
     name: 'Alexa Internet'
-    url: 'http://www.alexa.com'
+    url: 'https://www.alexa.com'
+
+- regex: 'Amazonbot'
+  name: 'Amazon Bot'
+  category: 'Crawler'
+  url: 'https://developer.amazon.com/support/amazonbot'
+  producer:
+    name: 'Amazon.com, Inc.'
+    url: 'https://www.amazon.com/'
 
 - regex: 'Amazon[ -]Route ?53[ -]Health[ -]Check[ -]Service'
   name: 'Amazon Route53 Health Check'
@@ -82,23 +98,31 @@
   url: 'https://httpd.apache.org/docs/2.4/programs/ab.html'
   producer:
     name: 'The Apache Software Foundation'
-    url: 'http://www.apache.org/foundation/'
+    url: 'https://www.apache.org/foundation/'
 
 - regex: 'Applebot'
   name: 'Applebot'
   category: 'Crawler'
-  url: 'http://www.apple.com/go/applebot'
+  url: 'https://support.apple.com/en-us/HT204683'
   producer:
     name: 'Apple Inc'
-    url: 'http://www.apple.com'
+    url: 'https://www.apple.com'
+
+- regex: "AppSignalBot"
+  name: "AppSignalBot"
+  category: "Site Monitor"
+  url: "https://docs.appsignal.com/uptime-monitoring/"
+  producer:
+    name: "AppSignal"
+    url: "https://appsignal.com/"
 
 - regex: 'Arachni'
   name: 'Arachni'
   category: 'Security Checker'
-  url: 'http://www.arachni-scanner.com'
+  url: 'https://www.arachni-scanner.com/'
   producer:
     name: 'Sarosys LLC'
-    url: 'http://www.sarosys.com/'
+    url: 'https://www.sarosys.com/'
 
 - regex: 'AspiegelBot'
   name: 'AspiegelBot'
@@ -112,7 +136,7 @@
   name: 'Castro 2'
   category: 'Service Agent'
   url: 'http://supertop.co/castro/'
-  producer: 
+  producer:
     name: 'Supertop'
     url: 'http://supertop.co'
 
@@ -127,10 +151,10 @@
 - regex: 'archive\.org_bot|special_archiver'
   name: 'archive.org bot'
   category: 'Crawler'
-  url: 'http://www.archive.org/details/archive.org_bot'
+  url: 'https://archive.org/details/archive.org_bot'
   producer:
     name: 'The Internet Archive'
-    url: 'http://www.archive.org'
+    url: 'https://archive.org'
 
 - regex: 'Ask Jeeves/Teoma'
   name: 'Ask Jeeves'
@@ -156,7 +180,7 @@
     name: '2.0Promotion GbR'
     url: 'http://www.backlinktest.com'
 
-- regex: 'baiduspider(-image)?|baidu Transcoder|baidu.*spider'
+- regex: 'Baidu.*spider|baidu Transcoder'
   name: 'Baidu Spider'
   category: 'Search bot'
   url: 'http://www.baidu.com/search/spider.htm'
@@ -172,6 +196,14 @@
     name: ''
     url: ''
 
+- regex: 'Better Uptime Bot'
+  name: 'Better Uptime Bot'
+  category: 'Site Monitor'
+  url: 'https://betteruptime.com/faq'
+  producer:
+    name: 'Better Uptime'
+    url: 'https://betteruptime.com/'
+
 - regex: 'MSNBot|msrbot|bingbot|BingPreview|msnbot-(UDiscovery|NewsBlogs)|adidxbot'
   name: 'BingBot'
   category: 'Search bot'
@@ -188,7 +220,7 @@
     name: 'Blekko'
     url: 'http://blekko.com'
 
-- regex: 'BLEXBot(Test)?'
+- regex: 'BLEXBot'
   name: 'BLEXBot Crawler'
   category: 'Crawler'
   url: 'http://webmeup-crawler.com'
@@ -217,7 +249,7 @@
   category: 'Crawler'
   producer:
     name: 'BoardReader'
-    url: 'http://boardreader.com/'
+    url: 'https://boardreader.com/'
 
 - regex: 'BountiiBot'
   name: 'Bountii Bot'
@@ -283,6 +315,14 @@
     name: 'CloudFlare'
     url: 'http://www.cloudflare.com'
 
+- regex: 'CloudflareDiagnostics'
+  name: 'Cloudflare Diagnostics'
+  category: 'Site Monitor'
+  url: 'https://www.cloudflare.com/'
+  producer:
+    name: 'Cloudflare'
+    url: 'https://www.cloudflare.com'
+
 - regex: 'CloudFlare-AlwaysOnline'
   name: 'CloudFlare Always Online'
   category: 'Site Monitor'
@@ -291,7 +331,7 @@
     name: 'CloudFlare'
     url: 'http://www.cloudflare.com'
 
-- regex: 'coccoc|coccocbot(-ads|-fast|-image|-shopping|-web)?'
+- regex: 'coccoc.com'
   name: 'Cốc Cốc Bot'
   url: 'https://help.coccoc.com/en/search-engine/coccoc-robots'
   category: 'Search bot'
@@ -339,7 +379,6 @@
     name: 'Datanyze'
     url: 'https://www.datanyze.com'
 
-
 - regex: 'Dataprovider'
   name: 'Dataprovider'
   category: 'Crawler'
@@ -364,7 +403,7 @@
     name: 'DAZOO.FR'
     url: 'http://dazoo.fr'
 
-- regex: 'discobot(-news)?'
+- regex: 'discobot'
   name: 'Discobot'
   category: 'Search bot'
   url: 'http://discoveryengine.com/discobot.html'
@@ -427,7 +466,7 @@
     name: 'eVenture Capital Partners II, LLC'
     url: 'http://www.eventures.vc/'
 
-- regex: 'Exabot(-Thumbnails|-Images)?|ExaleadCloudview'
+- regex: 'Exabot|ExaleadCloudview'
   name: 'ExaBot'
   category: 'Crawler'
   url: 'http://www.exabot.com/go/robot'
@@ -451,7 +490,7 @@
     name: 'SEOmoz, Inc.'
     url: 'http://moz.com/'
 
-- regex: 'facebookexternalhit|facebookplatform|facebookexternalua'
+- regex: 'facebookexternalhit|facebookplatform|facebookexternalua|facebookcatalog'
   name: 'Facebook External Hit'
   category: 'Social Media Agent'
   url: 'https://www.facebook.com/externalhit_uatext.php'
@@ -483,7 +522,7 @@
     name: 'David Smith & Developing Perspective, LLC'
     url: 'https://david-smith.org'
 
-- regex: '(Meta)?Feedly(Bot|App)?'
+- regex: 'Feedly'
   name: 'Feedly'
   url: 'http://www.feedly.com'
   category: 'Feed Fetcher'
@@ -549,6 +588,10 @@
     name: ''
     url: ''
 
+- regex: 'gobuster'
+  name: 'Gobuster'
+  url: 'https://github.com/OJ/gobuster'
+
 - regex: 'ichiro/mobile goo'
   name: 'Goo'
   category: 'Search bot'
@@ -557,6 +600,10 @@
     name: 'NTT Resonant'
     url: 'http://goo.ne.jp'
 
+- regex: 'Storebot-Google'
+  name: 'Google StoreBot'
+  category: 'Crawler'
+
 - regex: 'Google Favicon'
   name: 'Google Favicon'
   category: 'Crawler'
@@ -649,7 +696,7 @@
     name: 'Visual Meta'
     url: 'https://www.shopalike.cz/'
 
-- regex: 'AdsBot-Google(-Mobile)?|Adwords-(DisplayAds|Express|Instant)|Google Web Preview|Google[ -]Publisher[ -]Plugin|Google-(Adwords|AMPHTML|Assess|HotelAdsVerifier|Read-Aloud|Shopping-Quality|Site-Verification|speakr|Test|Youtube-Links)|(APIs|DuplexWeb|Feedfetcher|Mediapartners)-Google|Googlebot(-Mobile|-Image|-Video|-News)?|GoogleProducer|Google.*/\+/web/snippet'
+- regex: 'AdsBot-Google|Adwords-(DisplayAds|Express|Instant)|Google Web Preview|Google[ -]Publisher[ -]Plugin|Google-(Ads-Conversions|Ads-Qualify|Adwords|AMPHTML|Assess|HotelAdsVerifier|Read-Aloud|Shopping-Quality|Site-Verification|speakr|Stale-Content-Probe|Test|Youtube-Links)|(APIs|DuplexWeb|Feedfetcher|Mediapartners)-Google|Googlebot|Google(?:AssociationService|Producer)|Google.*/\+/web/snippet'
   name: 'Googlebot'
   category: 'Search bot'
   url: 'http://www.google.com/bot.html'
@@ -663,7 +710,7 @@
   url: 'https://webarchive.jira.com/wiki/display/Heritrix/Heritrix'
   producer:
     name: 'The Internet Archive'
-    url: 'http://www.archive.org'
+    url: 'https://archive.org'
 
 - regex: 'HubSpot '
   name: 'HubSpot'
@@ -672,7 +719,6 @@
     name: 'HubSpot Inc.'
     url: 'https://www.hubspot.com'
 
-
 - regex: 'HTTPMon'
   name: 'HTTPMon'
   category: 'Site Monitor'
@@ -704,7 +750,7 @@
 
 - regex: 'ips-agent'
   name: 'IPS Agent'
-  category: 'crawler'
+  category: 'Crawler'
   producer:
     name: 'VeriSign, Inc'
     url: 'http://www.verisign.com/'
@@ -717,6 +763,10 @@
     name: ''
     url: 'https://ip-guide.com'
 
+- regex: 'k6/[0-9\.]+'
+  name: 'K6'
+  url: 'https://k6.io/'
+
 - regex: 'kouio'
   name: 'Kouio'
   url: 'http://kouio.com/'
@@ -741,7 +791,7 @@
     name: 'Lighthouse'
     url: 'https://developers.google.com/web/tools/lighthouse'
 
-- regex: 'linkdexbot(-mobile)?|linkdex\.com'
+- regex: 'linkdexbot|linkdex\.com'
   name: 'Linkdex Bot'
   category: 'Search bot'
   url: 'http://www.linkdex.com/bots'
@@ -764,7 +814,7 @@
     name: ''
     url: ''
 
-- regex: 'Mail\.RU(_Bot)?'
+- regex: 'Mail\.RU'
   name: 'Mail.Ru Bot'
   category: 'Search bot'
   url: 'http://help.mail.ru/webmaster/indexing/robots/types_robots'
@@ -788,7 +838,7 @@
     name: ''
     url: ''
 
-- regex : 'masscan'
+- regex: 'masscan'
   name: 'masscan'
   url: 'https://github.com/robertdavidgraham/masscan'
   category: 'Crawler'
@@ -941,12 +991,12 @@
   category: 'Crawler'
   producer:
     name: 'Nuzzel'
-    url: https://www.nuzzel.com/ 
+    url: 'https://www.nuzzel.com/'
 
 - regex: 'Octopus [0-9]'
   name: 'Octopus'
 
-- regex: 'omgili(?:bot)?'
+- regex: 'omgili'
   name: 'Omgili bot'
   category: 'Search bot'
   url: 'http://www.omgili.com/Crawler.html'
@@ -1031,7 +1081,7 @@
     name: 'Paessler AG'
     url: 'https://www.paessler.com'
 
-- regex: 'psbot(-page)?'
+- regex: 'psbot'
   name: 'Picsearch bot'
   category: 'Search bot'
   url: 'http://www.picsearch.com/bot.html'
@@ -1039,7 +1089,7 @@
     name: 'Picsearch'
     url: 'http://www.picsearch.com'
 
-- regex: 'Pingdom\.com'
+- regex: 'Pingdom(?:\.com|TMS)'
   name: 'Pingdom Bot'
   category: 'Site Monitor'
   url: ''
@@ -1055,6 +1105,14 @@
     name: 'Quora'
     url: 'http://www.quora.com'
 
+- regex: 'Quora-Bot'
+  name: 'Quora Bot'
+  category: 'Crawler'
+  url: ''
+  producer:
+    name: 'Quora'
+    url: 'https://www.quora.com/'
+
 - regex: 'RamblerMail'
   name: 'RamblerMail Image Proxy'
   category: 'Crawler'
@@ -1283,6 +1341,14 @@
     name: 'Tencent Holdings'
     url: 'http://www.soso.com'
 
+- regex: 'Sprinklr'
+  name: 'Sprinklr'
+  category: 'Crawler'
+  url: ''
+  producer:
+    name: 'Sprinklr, Inc.'
+    url: 'https://www.sprinklr.com/'
+
 - regex: 'sqlmap/'
   name: 'sqlmap'
   category: 'Security Checker'
@@ -1328,13 +1394,20 @@
     name: 'Tailrank Inc'
     url: 'http://spinn3r.com'
 
-- regex: 'Sputnik(Image)?Bot'
+- regex: 'SputnikBot'
   name: 'Sputnik Bot'
-  category: ''
+  category: 'Crawler'
+  url: ''
+
+- regex: 'SputnikFaviconBot'
+  name: 'Sputnik Favicon Bot'
+  category: 'Crawler'
+  url: ''
+
+- regex: 'SputnikImageBot'
+  name: 'Sputnik Image Bot'
+  category: 'Crawler'
   url: ''
-  producer:
-    name: ''
-    url: ''
 
 - regex: 'SurveyBot'
   name: 'Survey Bot'
@@ -1553,7 +1626,7 @@
   category: 'Site Monitor'
   url: 'https://www.webpagetest.org'
 
-- regex: 'WeSEE(:Search)?'
+- regex: 'WeSEE'
   name: 'WeSEE:Search'
   category: 'Search bot'
   url: 'http://www.wesee.com/bot'
@@ -1625,6 +1698,14 @@
     name: 'Yahoo! Inc.'
     url: 'http://www.yahoo.com'
 
+- regex: 'YahooMailProxy'
+  name: 'Yahoo! Mail Proxy'
+  category: 'Service Agent'
+  url: 'https://help.yahoo.com/kb/yahoo-mail-proxy-SLN28749.html'
+  producer:
+    name: 'Yahoo! Inc.'
+    url: 'http://www.yahoo.com'
+
 - regex: 'YahooCacheSystem'
   name: 'Yahoo! Cache System'
   category: 'Crawler'
@@ -1641,7 +1722,7 @@
     name: 'Yahoo! Japan Corp.'
     url: 'https://www.yahoo.co.jp/'
 
-- regex: 'Yandex(SpravBot|ScreenshotBot|MobileBot|AccessibilityBot|ForDomain|Vertis|Market|Catalog|Calendar|Sitelinks|AdNet|Pagechecker|Webmaster|Media|Video|Bot|Images|Antivirus|Direct|Blogs|Favicons|ImageResizer|Verticals|News(links)?|Metrika|\.Gazeta Bot)|YaDirectFetcher|YandexTurbo|YandexTracker|YandexSearchShop|YandexRCA|YandexPartner|YandexOntoDBAPI|YandexOntoDB|YandexMobileScreenShotBot'
+- regex: 'Yandex(SpravBot|ScreenshotBot|MobileBot|AccessibilityBot|ForDomain|Vertis|Market|Catalog|Calendar|Sitelinks|AdNet|Pagechecker|Webmaster|Media|Video|Bot|Images|Antivirus|Direct|Blogs|Favicons|ImageResizer|Verticals|News|Metrika|\.Gazeta Bot)|YaDirectFetcher|YandexTurbo|YandexTracker|YandexSearchShop|YandexRCA|YandexPartner|YandexOntoDBAPI|YandexOntoDB|YandexMobileScreenShotBot'
   name: 'Yandex Bot'
   category: 'Search bot'
   url: 'http://www.yandex.com/bots'
@@ -1649,7 +1730,7 @@
     name: 'Yandex LLC'
     url: 'http://company.yandex.com'
 
-- regex: 'Yeti|NaverJapan'
+- regex: 'Yeti|NaverJapan|AdsBot-Naver'
   name: 'Yeti/Naverbot'
   category: 'Search bot'
   url: 'http://help.naver.com/robots/'
@@ -1726,18 +1807,18 @@
 - regex: 'HubPages.*crawlingpolicy'
   name: 'HubPages'
   category: 'Crawler'
-  url: 'http://hubpages.com/help/crawlingpolicy'
+  url: 'https://hubpages.com/help/crawlingpolicy'
   producer:
-    name: 'HubPages'
-    url: 'http://hubpages.com/'
+    name: 'HubPages, Inc.'
+    url: 'https://discover.hubpages.com/'
 
 - regex: 'Pinterest(bot)?/\d\.\d.*www\.pinterest\.com.*'
   name: 'Pinterest'
-  url: 'http://www.pinterest.com/bot.html'
+  url: 'https://help.pinterest.com/en/business/article/pinterest-crawler'
   category: 'Crawler'
   producer:
     name: 'Pinterest'
-    url: 'http://www.pinterest.com/'
+    url: 'https://www.pinterest.com/'
 
 - regex: 'Site24x7'
   name: 'Site24x7 Website Monitoring'
@@ -1755,6 +1836,14 @@
     name: 'Snapchat Inc.'
     url: 'https://www.snapchat.com'
 
+- regex: 'Snap URL Preview Service'
+  name: 'Snap URL Preview Service'
+  category: 'Service Agent'
+  url: 'https://developers.snap.com/robots'
+  producer:
+    name: 'Snapchat Inc.'
+    url: 'https://www.snapchat.com/'
+
 - regex: "Let's Encrypt validation server"
   name: "Let's Encrypt Validation"
   category: 'Service Agent'
@@ -1779,13 +1868,13 @@
     name: 'Monitor.Us'
     url: 'http://www.monitor.us'
 
-- regex: 'Catchpoint( bot)?'
+- regex: 'Catchpoint'
   name: 'Catchpoint'
   category: 'Site Monitor'
-  url: ''
+  url: 'https://www.catchpoint.com/'
   producer:
     name: 'Catchpoint Systems'
-    url: 'http://www.catchpoint.com/'
+    url: 'https://www.catchpoint.com/'
 
 - regex: 'bitlybot'
   name: 'BitlyBot'
@@ -1853,7 +1942,7 @@
 - regex: 'RSSRadio \(Push Notification Scanner;support@dorada\.co\.uk\)'
   name: 'RSSRadio Bot'
 
-- regex: '(A6-Indexer|nuhk|TsolCrawler|Yammybot|Openbot|Gulper Web Bot|grub-client|Download Demon|SearchExpress|Microsoft URL Control|borg|altavista|dataminr.com|tweetedtimes.com|TrendsmapResolver|teoma|blitzbot|oegp|furlbot|http%20client|polybot|htdig|mogimogi|larbin|scrubby|searchsight|seekbot|semanticdiscovery|snappy|vortex(?! Build)|zeal|fast-webcrawler|converacrawler|dataparksearch|findlinks|BrowserMob|HttpMonitor|ThumbShotsBot|URL2PNG|ZooShot|GomezA|Google SketchUp|Read%20Later|RackspaceBot|robots|SeopultContentAnalyzer|7Siters|centuryb.o.t9)'
+- regex: '(A6-Indexer|nuhk|TsolCrawler|Yammybot|Openbot|Gulper Web Bot|grub-client|Download Demon|SearchExpress|Microsoft URL Control|borg|altavista|dataminr.com|tweetedtimes.com|TrendsmapResolver|teoma|blitzbot|oegp|furlbot|http%20client|polybot|htdig|mogimogi|larbin|scrubby|searchsight|seekbot|semanticdiscovery|snappy|vortex(?!(?: Build|Plus))|zeal|fast-webcrawler|converacrawler|dataparksearch|findlinks|BrowserMob|HttpMonitor|ThumbShotsBot|URL2PNG|ZooShot|GomezA|Google SketchUp|Read%20Later|RackspaceBot|robots|SeopultContentAnalyzer|7Siters|centuryb.o.t9|InterNaetBoten|EasyBib AutoCite|Bidtellect|tomnomnom/meg|My User Agent|cortex|CF-UC User Agent|Re-re Studio|adreview|AHC/|NameOfAgent|Request-Promise)'
   name: 'Generic Bot'
 
 - regex: '^sentry'
@@ -1963,10 +2052,10 @@
 - regex: 'BoardReader Favicon Fetcher'
   name: 'BoardReader'
   category: 'Search bot'
-  url: 'http://boardreader.com/'
+  url: 'https://boardreader.com/'
   producer:
     name: 'Effyis Inc'
-    url: 'http://boardreader.com/'
+    url: 'https://boardreader.com/'
 
 - regex: 'IDG/IT'
   name: 'IDG/IT'
@@ -2011,7 +2100,7 @@
 - regex: 'oBot'
   name: 'oBot'
   category: 'Search bot'
-  url: 'http://www.xforce-security.com/crawler/'
+  url: 'https://www.xforce-security.com/crawler/'
   producer:
     name: 'IBM Germany Research & Development GmbH'
     url: 'https://exchange.xforce.ibmcloud.com/'
@@ -2054,7 +2143,7 @@
   url: 'https://nutch.apache.org'
   producer:
     name: 'The Apache Software Foundation'
-    url: 'http://www.apache.org/foundation/'
+    url: 'https://www.apache.org/foundation/'
 
 - regex: 'Seobility'
   name: 'Seobility'
@@ -2069,7 +2158,7 @@
 - regex: 'Grammarly'
   name: 'Grammarly'
   category: 'Service bot'
-  url: 'http://www.grammarly.com'
+  url: 'https://www.grammarly.com'
 
 - regex: 'Robozilla'
   name: 'Robozilla'
@@ -2088,7 +2177,7 @@
 - regex: 'SerendeputyBot'
   name: 'Serendeputy Bot'
   category: 'Crawler'
-  url: 'http://serendeputy.com/about/serendeputy-bot'
+  url: 'https://serendeputy.com/about/serendeputy-bot'
 
 - regex: 'ias-va.*admantx.*service-fetcher'
   name: 'ADmantX Service Fetcher'
@@ -2110,7 +2199,512 @@
   category: 'Crawler'
   url: 'http://www.exensa.com/crawl'
 
-# Generic detections
+- regex: 'BDCbot'
+  name: 'BDCbot'
+  category: 'Crawler'
+  url: 'https://bigweb.bigdatacorp.com.br/pages/faq.aspx'
+  producer:
+    name: 'BIG Data Solucoes Em Tecnologia de Informatica LTDA'
+    url: 'https://bigdatacorp.com.br/'
+
+- regex: 'adbeat'
+  name: 'Adbeat'
+  category: 'Crawler'
+  url: 'https://www.adbeat.com/operation_policy'
+  producer:
+    name: 'PPC Labs LLC'
+    url: 'https://www.adbeat.com/'
+
+- regex: 'BW/(?:(\d+[\.\d]+))'
+  name: 'BuiltWith'
+  category: 'Crawler'
+  url: 'https://builtwith.com/biup'
+  producer:
+    name: 'BuiltWith Pty Ltd'
+    url: 'https://builtwith.com/'
+
+- regex: 'https://whatis.contentkingapp.com'
+  name: 'ContentKing'
+  category: 'Site Monitor'
+  url: 'https://whatis.contentkingapp.com/'
+  producer:
+    name: 'ContentKing BV'
+    url: 'https://www.contentkingapp.com/'
+
+- regex: 'MicroAdBot'
+  name: 'MicroAdBot'
+  category: 'Crawler'
+  url: 'https://www.microad.co.jp/'
+  producer:
+    name: 'MicroAd, Inc.'
+    url: 'https://www.microad.co.jp/'
+
+- regex: 'PingAdmin.Ru'
+  name: 'PingAdmin.Ru'
+  category: 'Site Monitor'
+  url: 'https://ping-admin.ru/'
+
+- regex: 'notifyninja.+monitoring'
+  name: 'Notify Ninja'
+  category: 'Site Monitor'
+  url: 'http://notifyninja.com'
+
+- regex: 'WebDataStats'
+  name: 'WebDataStats'
+  category: 'Crawler'
+  url: 'https://webdatastats.com/policy.html'
+  producer:
+    name: 'WebTehRazrabotka LLC'
+    url: 'https://webdatastats.com/'
+
+- regex: 'parse.ly scraper'
+  name: 'parse.ly'
+  category: 'Crawler'
+  url: 'https://www.parse.ly/help/integration/crawler'
+  producer:
+    name: 'Parsely, Inc.'
+    url: 'https://www.parse.ly/'
+
+- regex: 'Nimbostratus-Bot'
+  name: 'Nimbostratus Bot'
+  category: 'Site Monitor'
+  url: 'http://cloudsystemnetworks.com'
+
+- regex: 'HeartRails_Capture/\d'
+  name: 'Heart Rails Capture'
+  category: 'Service Agent'
+  url: 'http://capture.heartrails.com'
+
+- regex: 'Project-Resonance'
+  name: 'Project Resonance'
+  category: 'Crawler'
+  url: 'http://project-resonance.com'
+
+- regex: 'DataXu/\d'
+  name: 'DataXu'
+  category: 'Service Agent'
+  url: 'https://advertising.roku.com/dataxu'
+  producer:
+    name: 'Roku, Inc.'
+    url: 'https://roku.com'
+
+- regex: 'Cocolyzebot'
+  name: 'Cocolyzebot'
+  category: 'Crawler'
+  url: 'https://cocolyze.com/en/cocolyzebot'
+  producer:
+    name: 'VSI INNOVATION SAS'
+    url: 'https://vsi-innovation.com/'
+
+- regex: 'veryhip'
+  name: 'VeryHip'
+  category: 'Crawler'
+  url: 'https://veryhip.com/'
+  producer:
+    name: 'VeryHip'
+    url: 'https://veryhip.com/'
+
+- regex: 'LinkpadBot'
+  name: 'LinkpadBot'
+  category: 'Crawler'
+  url: 'https://www.linkpad.org/'
+  producer:
+    name: 'Solomono LLC'
+    url: 'https://www.linkpad.org/'
 
-- regex: '[a-z0-9\-_]*((?<!cu|power[ _]|m[ _])bot(?![ _]TAB|[ _]?5[0-9])|crawler|crawl|checker|archiver|transcoder|spider)([^a-z]|$)'
+- regex: 'MuscatFerret'
+  name: 'MuscatFerret'
+  category: 'Crawler'
+  url: 'http://www.webtop.com/'
+
+- regex: 'PageThing.com'
+  name: 'PageThing'
+  category: 'Crawler'
+  url: 'https://www.pagething.com/'
+  producer:
+    name: 'SPECIALNOISE LTD'
+    url: 'https://www.specialnoise.com/'
+
+- regex: 'ArchiveBox'
+  name: 'ArchiveBox'
+  url: 'https://archivebox.io/'
+  category: 'Crawler'
+  producer:
+    name: ''
+    url: ''
+
+- regex: 'Choosito'
+  name: 'Choosito'
+  url: 'https://www.choosito.com/'
+  category: 'Crawler'
+  producer:
+    name: 'Choosito! Inc.'
+    url: 'https://www.choosito.com/'
+
+- regex: 'datagnionbot'
+  name: 'datagnionbot'
+  url: 'https://www.datagnion.com/bot.html'
+  category: 'Crawler'
+  producer:
+    name: 'DATAGNION GMBH'
+    url: 'https://www.datagnion.com/'
+
+- regex: 'WhatCMS'
+  name: 'WhatCMS'
+  url: 'https://whatcms.org/'
+  category: 'Crawler'
+  producer:
+    name: 'Nineteen Ten LLC'
+    url: 'https://whatcms.org/'
+
+- regex: 'httpx'
+  name: 'httpx'
+  url: 'https://github.com/projectdiscovery/httpx'
+  category: 'Crawler'
+  producer:
+    name: ''
+    url: ''
+
+- regex: 'scaninfo@expanseinc.com'
+  name: 'Expanse'
+  category: 'Security Checker'
+  url: 'https://expanse.co/'
+  producer:
+    name: 'Expanse Inc.'
+    url: 'https://expanse.co/'
+
+- regex: 'HuaweiWebCatBot'
+  name: 'HuaweiWebCatBot'
+  category: 'Crawler'
+  url: 'https://isecurity.huawei.com'
+  producer:
+    name: 'Huawei Technologies Co., Ltd.'
+    url: 'https://huawei.com'
+
+- regex: 'Hatena-Favicon'
+  name: 'Hatena Favicon'
+  category: 'Crawler'
+  url: 'https://www.hatena.ne.jp/faq/'
+  producer:
+    name: 'Hatena Co., Ltd.'
+    url: 'https://www.hatena.ne.jp'
+
+- regex: 'RyowlEngine/(\d+)'
+  name: 'Ryowl'
+  category: 'Crawler'
+  url: 'https://ryowl.org'
+
+- regex: 'OdklBot/(\d+)'
+  name: 'Odnoklassniki Bot'
+  category: 'Crawler'
+  url: 'https://odnoklassniki.ru'
+
+- regex: 'Mediatoolkitbot'
+  name: 'Mediatoolkit Bot'
+  category: 'Crawler'
+  url: 'https://mediatoolkit.com'
+
+- regex: 'ZoominfoBot'
+  name: 'ZoominfoBot'
+  category: 'Crawler'
+  url: 'https://www.zoominfo.com'
+
+- regex: 'WeViKaBot/([\d+\.])'
+  name: 'WeViKaBot'
+  category: 'Crawler'
+  url: 'http://www.wevika.de'
+
+- regex: 'SEOkicks'
+  name: 'SEOkicks'
+  category: 'Crawler'
+  url: 'https://www.seokicks.de/robot.html'
+
+- regex: 'Plukkie/([\d+\.])'
+  name: 'Plukkie'
+  category: 'Crawler'
+  url: 'http://www.botje.com/plukkie.htm'
+
+- regex: 'proximic;'
+  name: 'Comscore'
+  category: 'Crawler'
+  url: 'https://www.comscore.com/Web-Crawler'
+
+- regex: 'SurdotlyBot/([\d+\.])'
+  name: 'SurdotlyBot'
+  category: 'Crawler'
+  url: 'http://sur.ly/bot.html'
+
+- regex: 'Gowikibot/([\d+\.])'
+  name: 'Gowikibot'
+  category: 'Crawler'
+  url: 'http:/www.gowikibot.com'
+
+- regex: 'SabsimBot/([\d+\.])'
+  name: 'SabsimBot'
+  category: 'Crawler'
+  url: 'https://sabsim.com'
+
+- regex: 'LumtelBot/([\d+\.])'
+  name: 'LumtelBot'
+  category: 'Crawler'
+  url: 'https://umtel.com'
+
+- regex: 'PiplBot'
+  name: 'PiplBot'
+  category: 'Crawler'
+  url: 'http://www.pipl.com/bot'
+
+- regex: 'woobot/([\d+\.])'
+  name: 'WooRank'
+  category: 'Crawler'
+  url: 'https://www.woorank.com/bot'
+
+- regex: 'Cookiebot/([\d+\.])'
+  name: 'Cookiebot'
+  category: 'Crawler'
+  url: 'https://support.cookiebot.com/hc/en-us/articles/360014264140-Scanner-User-Agent'
+  producer:
+    name: 'Cybot A/S'
+    url: 'https://www.cybot.com/'
+
+- regex: 'NetSystemsResearch'
+  name: 'NetSystemsResearch'
+  category: 'Security Checker'
+  url: 'https://www.netsystemsresearch.com/'
+  producer:
+    name: 'NET SYSTEMS RESEARCH LLC'
+    url: 'https://www.netsystemsresearch.com/'
+
+- regex: 'CensysInspect/([\d+\.])'
+  name: 'CensysInspect'
+  category: 'Security Checker'
+  url: 'https://about.censys.io/'
+  producer:
+    name: 'Censys, Inc.'
+    url: 'https://censys.io/'
+
+- regex: 'gdnplus.com'
+  name: 'GDNP'
+  category: 'Crawler'
+  url: 'https://gdnplus.com/'
+  producer:
+    name: 'Global Digital Network Plus, LLC'
+    url: 'https://gdnplus.com/'
+
+- regex: 'WellKnownBot/([\d+\.])'
+  name: 'WellKnownBot'
+  category: 'Crawler'
+  url: 'https://well-known.dev'
+
+- regex: 'Adsbot/([\d+\.])'
+  name: 'Adsbot'
+  category: 'Crawler'
+  url: 'https://seostar.co/robot/'
+
+- regex: 'MTRobot/([\d+\.])'
+  name: 'MTRobot'
+  category: 'Crawler'
+  url: 'https://metrics-tools.de/robot.html'
+  producer:
+    name: 'Metrics Tools'
+    url: 'https://metrics-tools.de/'
+
+- regex: 'serpstatbot/([\d+\.])'
+  name: 'serpstatbot'
+  category: 'Crawler'
+  url: 'http://serpstatbot.com/'
+  producer:
+    name: 'Netpeak Ltd'
+    url: 'https://netpeak.net/'
+
+- regex: 'colly'
+  name: 'colly'
+  category: 'Crawler'
+  url: 'https://github.com/gocolly/colly/'
+
+- regex: 'l9tcpid/v([\d+\.])'
+  name: 'l9tcpid'
+  category: 'Security Checker'
+  url: 'https://github.com/LeakIX/l9tcpid'
+
+- regex: 'MegaIndex.ru/([\d+\.])'
+  name: 'MegaIndex'
+  category: 'Crawler'
+  url: 'https://megaindex.com/crawler'
+
+- regex: 'Seekport'
+  name: 'Seekport'
+  category: 'Crawler'
+  url: 'http://www.seekport.com/'
+  producer:
+    name: 'SISTRIX GmbH'
+    url: 'https://www.sistrix.de/'
+
+- regex: 'seolyt/([\d+\.])'
+  name: 'seolyt'
+  category: 'Crawler'
+  url: 'https://seolyt.com/'
+
+- regex: 'YaK/([\d+\.])'
+  name: 'YaK'
+  category: 'Crawler'
+  url: 'https://www.linkfluence.com/'
+  producer:
+    name: 'Linkfluence SAS'
+    url: 'https://www.linkfluence.com/'
+
+- regex: 'KomodiaBot/([\d+\.])'
+  name: 'KomodiaBot'
+  category: 'Crawler'
+  url: 'http://www.komodia.com/newwiki/index.php/URL_server_crawler'
+  producer:
+    name: 'Komodia Inc.'
+    url: 'https://www.komodia.com/'
+
+- regex: 'Neevabot/([\d+\.])'
+  name: 'Neevabot'
+  category: 'Search bot'
+  url: 'https://neeva.com/neevabot'
+  producer:
+    name: 'Neeva Inc.'
+    url: 'https://neeva.com/'
+
+- regex: 'LinkPreview/([\d+\.])'
+  name: 'LinkPreview'
+  category: 'Service Agent'
+  url: 'https://www.linkpreview.net/'
+
+- regex: 'JungleKeyThumbnail/([\d+\.])'
+  name: 'JungleKeyThumbnail'
+  category: 'Crawler'
+  url: 'https://junglekey.com/'
+
+- regex: 'rocketmonitor(?: |bot/)([\d+\.])'
+  name: 'RocketMonitorBot'
+  category: 'Site Monitor'
+  url: 'https://www.radiomast.io/docs/stream-monitoring/technical_details.html'
+  producer:
+    name: 'Radio Mast, Inc.'
+    url: 'https://www.radiomast.io/'
+
+- regex: 'SitemapParser-VIPnytt/([\d+\.])'
+  name: 'SitemapParser-VIPnytt'
+  category: 'Crawler'
+  url: 'https://github.com/VIPnytt/SitemapParser/'
+
+- regex: '^Turnitin'
+  name: 'Turnitin'
+  category: 'Crawler'
+  url: 'https://turnitin.com/robot/crawlerinfo.html'
+
+- regex: 'DMBrowser/\d+|DMBrowser-[UB]V'
+  name: 'Dotcom Monitor'
+  category: 'Site Monitor'
+  url: 'https://www.dotcom-monitor.com'
+
+- regex: 'ThinkChaos/'
+  name: 'ThinkChaos'
+  category: 'Crawler'
+
+- regex: 'DataForSeoBot'
+  name: 'DataForSeoBot'
+  category: 'Crawler'
+  url: 'https://dataforseo.com/dataforseo-bot'
+
+- regex: 'Discordbot/([\d+.]+)'
+  name: 'Discord Bot'
+  category: 'Service Agent'
+  url: 'https://discordapp.com'
+
+- regex: 'Linespider/([\d+.]+)'
+  name: 'Linespider'
+  category: 'Crawler'
+  url: 'https://lin.ee/4dwXkTH'
+
+- regex: 'Cincraw/([\d+.]+)'
+  name: 'Cincraw'
+  category: 'Crawler'
+  url: 'http://cincrawdata.net/bot/'
+
+- regex: 'CISPA Web Analyzer'
+  name: 'CISPA Web Analyzer'
+  category: 'Crawler'
+  url: 'https://notify.cispa.de/'
+  producer:
+    name: 'CISPA - Helmholtz-Zentrum für Informationssicherheit gGmbH'
+    url: 'https://cispa.de/en'
+
+- regex: 'IonCrawl'
+  name: 'IONOS Crawler'
+  category: 'Crawler'
+  url: 'https://www.ionos.de/terms-gtc/faq-crawler-en/'
+  producer:
+    name: 'IONOS SE'
+    url: 'https://www.ionos.de/'
+
+- regex: 'Crawldad'
+  name: 'Crawldad'
+  category: 'Crawler'
+  url: 'https://gist.github.com/jayhardee9/2f2a2c4dba26564ee040ae32e0dd0972'
+
+- regex: 'https://securitytxt-scan.cs.hm.edu/'
+  name: 'security.txt scanserver'
+  category: 'Security Checker'
+  url: 'https://securitytxt-scan.cs.hm.edu/'
+  producer:
+    name: 'Hochschule für angewandte Wissenschaften München'
+    url: 'https://www.hm.edu/'
+
+- regex: 'TigerBot/([\d+.]+)'
+  name: 'TigerBot'
+  category: 'Crawler'
+  url: 'https://tiger.ch/'
+
+- regex: 'TestCrawler/([\d+.]+)'
+  name: 'TestCrawler'
+  category: 'Crawler'
+  url: 'https://www.comcepta.com/'
+
+- regex: 'CrowdTanglebot/([\d+.]+)'
+  name: 'CrowdTangle'
+  category: 'Crawler'
+  url: 'https://help.crowdtangle.com/en/articles/3009319-crowdtangle-bot'
+  producer:
+    name: 'CrowdTangle, Inc.'
+    url: 'https://www.crowdtangle.com/'
+
+- regex: 'Sellers.Guide Crawler by Primis'
+  name: 'Sellers.Guide'
+  category: 'Crawler'
+  url: 'https://sellers.guide/'
+  producer:
+    name: 'McCann Disciplines, Ltd.'
+    url: 'https://www.primis.tech/'
+
+- regex: 'OnalyticaBot'
+  name: 'Onalytica'
+  category: 'Crawler'
+  url: 'https://www.airslate.com/bot/explore/onalytica-bot'
+  producer:
+    name: 'airSlate, Inc.'
+    url: 'https://www.airslate.com/'
+
+- regex: 'deepnoc'
+  name: 'deepnoc'
+  category: 'Crawler'
+  url: 'https://deepnoc.com/bot'
+  producer:
+    name: 'deepnoc, GmbH'
+    url: 'https://deepnoc.com/'
+
+- regex: 'Newslitbot/([\d+.]+)'
+  name: 'Newslitbot'
+  category: 'Crawler'
+  url: 'https://www.newslit.co/'
+  producer:
+    name: 'Newslit, LLC.'
+    url: 'https://www.newslit.co/'
+
+# Generic detections
+- regex: '[a-z0-9\-_]*((?<!cu|power[ _]|m[ _])bot(?![ _]TAB|[ _]?5[0-9]|[ _]Senior|[ _]Junior)|crawler|crawl|checker|archiver|transcoder|spider)([^a-z]|$)'
   name: 'Generic Bot'
diff --git a/priv/ua_inspector/browser_engine.browser_engine.yml b/priv/ua_inspector/browser_engine.browser_engine.yml
index a4770deb498ee2a4df09a1043a8b2fafcaa43feb..270db656cd0db4ff972a9be7fdb8d98d87206bd0 100644
--- a/priv/ua_inspector/browser_engine.browser_engine.yml
+++ b/priv/ua_inspector/browser_engine.browser_engine.yml
@@ -14,7 +14,7 @@
 - regex: 'Trident'
   name: 'Trident'
 
-- regex: 'Blink'
+- regex: '(?<!SmartHu)Blink'
   name: 'Blink'
 
 - regex: '(?:Apple)?WebKit'
@@ -23,6 +23,9 @@
 - regex: 'Presto'
   name: 'Presto'
 
+- regex: 'Goanna'
+  name: 'Goanna'
+
 - regex: '(?<!like )Gecko'
   name: 'Gecko'
 
@@ -37,3 +40,6 @@
 
 - regex: 'Goanna'
   name: 'Goanna'
+
+- regex: 'Ekioh(?:Flow)?'
+  name: 'EkiohFlow'
diff --git a/priv/ua_inspector/client.browsers.yml b/priv/ua_inspector/client.browsers.yml
index 27f76f678d4829b6868076ec5ab2d87fe6137cc3..ecf4922f2abf2059e9a5c93e7973ea9c514806ef 100644
--- a/priv/ua_inspector/client.browsers.yml
+++ b/priv/ua_inspector/client.browsers.yml
@@ -5,6 +5,558 @@
 # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
 ###############
 
+# Decentr (https://decentr.net/)
+- regex: 'Decentr'
+  name: 'Decentr'
+  version: ''
+  engine:
+    default: 'Blink'
+
+# YouCare (https://play.google.com/store/apps/details?id=com.youcare.browser)
+- regex: 'youcare-android-app'
+  name: 'YouCare'
+  version: ''
+  engine:
+    default: 'Blink'
+- regex: 'youcare-ios-app'
+  name: 'YouCare'
+  version: ''
+  engine:
+    default: 'WebKit'
+
+# AdBlock Browser (https://play.google.com/store/apps/details?id=org.adblockplus.browser)
+- regex: 'ABB/(\d+[\.\d]+)'
+  name: 'AdBlock Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Navegador
+- regex: 'Navegador'
+  name: 'Navegador'
+  version: ''
+  engine:
+    default: 'Blink'
+
+# Hi Browser (https://play.google.com/store/apps/details?id=com.talpa.hibrowser)
+- regex: 'HiBrowser/(\d+[\.\d]+)'
+  name: 'Hi Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# CYBrowser (https://www.cgl.ucsf.edu/cytoscape/utilities3/cybrowser.shtml)
+- regex: 'CYBrowser/(\d+[\.\d]+)'
+  name: 'CyBrowser'
+  version: '$1'
+
+# SiteKiosk (https://www.sitekiosk.com/)
+- regex: 'Chrome/.+ SiteKiosk (\d+[\.\d]+)'
+  name: 'SiteKiosk'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'SiteKiosk (\d+[\.\d]+)'
+  name: 'SiteKiosk'
+  version: '$1'
+
+# Reqwireless WebViewer
+- regex: 'ReqwirelessWeb/(\d+[\.\d]+)'
+  name: 'Reqwireless WebViewer'
+  version: '$1'
+
+# T+Browser (https://t.chanjet.com/tplus/view/login/downloadBrowser.html | https://dad.chanapp.chanjet.com/tplusapp/TPlusBrowser.exe)
+- regex: 'T\+Browser/(\d+[\.\d]+)'
+  name: 'T+Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# ChanjetCloud (https://dad.chanapp.chanjet.com/tplusapp/HsySetup.exe)
+- regex: 'ChanjetCloud/(\d+[\.\d]+)'
+  name: 'ChanjetCloud'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Sushi Browser (https://sushi-browser.com/)
+- regex: 'SushiBrowser/(\d+[\.\d]+)'
+  name: 'Sushi Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Peeps dBrowser (https://peepsx.com/dbrowser.html)
+- regex: 'dBrowser/(\d+[\.\d]+)'
+  name: 'Peeps dBrowser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# LT Browser (https://www.lambdatest.com/lt-browser)
+- regex: 'LTBrowser/(\d+[\.\d]+)'
+  name: 'LT Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Lagatos Browser (https://lagatos.com/)
+- regex: 'lagatos-browser/(\d+[\.\d]+)'
+  name: 'Lagatos Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# PSI Secure Browser (https://tca.psiexams.com/portal/testdelivery/sb_rpnow_download.jsp?)
+- regex: 'psi-secure-browser/(\d+[\.\d]+)'
+  name: 'PSI Secure Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Harman Browser (https://www.harman.com/)
+- regex: 'Harman_Browser/(\d+[\.\d]+)'
+  name: 'Harman Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Bonsai (https://bonsaibrowser.com/)
+- regex: 'bonsai-browser/(\d+[\.\d]+)'
+  name: 'Bonsai'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Spectre Browser (https://spectrebots.com/products/spectre-desktop-browser)
+- regex: 'spectre-browser/(\d+[\.\d]+)'
+  name: 'Spectre Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Flash Browser (https://github.com/asteroid-dev/FlashBrowser or https://github.com/radubirsan/FlashBrowser)
+- regex: 'FlashBrowser/(\d+[\.\d]+)'
+  name: 'Flash Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Secure Browser (https://safertechnologies.io/)
+- regex: 'Secure/(?:(\d+[\.\d]+))?'
+  name: 'Secure Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Arvin (https://play.google.com/store/apps/details?id=com.browser.arvin.anti.blokir&hl=sv&gl=US)
+- regex: 'Arvin/(\d+[\.\d]+)'
+  name: 'Arvin'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Edge Webview (https://docs.microsoft.com/en-us/microsoft-edge/webview2/)
+- regex: 'Version/.+Chrome/.+EdgW/(\d+[\.\d]+)'
+  name: 'Edge WebView'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# Mandarin (https://mandarin-browser.com/)
+- regex: 'Mandarin Browser/(\d+[\.\d]+)'
+  name: 'Mandarin'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Maelstrom (https://www.bittorrent.com/)
+- regex: 'Torrent/(\d+[\.\d]+)'
+  name: 'Maelstrom'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Helio (https://developer.magicleap.com/en-us/learn/guides/lumin-os-release-notes-summary)
+- regex: 'Helio/(\d+[\.\d]+)'
+  name: 'Helio'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# 7654 Browser (http://7654browser.shzhanmeng.com/)
+- regex: '7654Browser/(\d+[\.\d]+)'
+  name: '7654 Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Qazweb (http://www.qazweb.com/)
+- regex: 'Qazweb/(\d+[\.\d]+)'
+  name: 'Qazweb'
+  version: '$1'
+  engine:
+    default: 'Gecko'
+
+# deg-degan (https://degdegan.com/)
+- regex: 'Degdegan/(\d+[\.\d]+)'
+  name: 'deg-degan'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# JavaFX (https://docs.oracle.com/javase/8/javafx/embedded-browser-tutorial/overview.htm)
+- regex: 'JavaFX/(\d+[\.\d]+)'
+  name: 'JavaFX'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# Chedot (https://landing.chedot.com/)
+- regex: 'Chedot/(\d+[\.\d]+)'
+  name: 'Chedot'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Chromium GOST (https://github.com/deemru/chromium-gost)
+- regex: 'Chrome/(\d+[\.\d]+).+\(Chromium GOST\)'
+  name: 'Chromium GOST'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      28: 'Blink'
+
+# Deledao (https://www.deledao.com/)
+- regex: '(?:DeledaoPersonal|DeledaoFamily)/(\d+[\.\d]+)'
+  name: 'Deledao'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# HasBrowser (https://browser.hascoding.com)
+- regex: 'HasBrowser/(\d+[\.\d]+)'
+  name: 'HasBrowser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Byffox (https://byffox.sourceforge.io/index.php)
+- regex: 'Byffox/(\d+[\.\d]+)'
+  name: 'Byffox'
+  version: '$1'
+  engine:
+    default: 'Gecko'
+
+# CoolBrowser (https://play.google.com/store/apps/details?id=com.easybrowser.browser.coolbrowser)
+- regex: 'Chrome/(\d+[\.\d]+).+AgentWeb.+UCBrowser'
+  name: 'CoolBrowser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Dot Browser (https://dothq.co/)
+- regex: 'DotBrowser/(\d+[\.\d]+)'
+  name: 'Dot Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Craving Explorer (https://www.crav-ing.com/)
+- regex: 'CravingExplorer/(\d+[\.\d]+)'
+  name: 'Craving Explorer'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# DeskBrowse (https://web.archive.org/web/20170614060014/http://deskbrowse.org/)
+- regex: 'DeskBrowse/(\d+[\.\d]+)'
+  name: 'DeskBrowse'
+  version: '$1'
+
+# Lolifox
+- regex: 'Lolifox/(\d+[\.\d]+)'
+  name: 'Lolifox'
+  version: '$1'
+
+# Qutebrowser (https://qutebrowser.org/)
+- regex: 'qutebrowser/(\d+[\.\d]+).+Chrome'
+  name: 'Qutebrowser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'qutebrowser(?:/(\d+[\.\d]+))?'
+  name: 'Qutebrowser'
+  version: '$1'
+
+# Flast (https://github.com/FascodeNet/Flast)
+- regex: 'flast/(\d+[\.\d]+)'
+  name: 'Flast'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# PolyBrowser (https://github.com/PolySuite/PolyBrowser)
+- regex: 'PolyBrowser/(\d+[\.\d]+)'
+  name: 'PolyBrowser'
+  version: '$1'
+  engine:
+    default: 'Gecko'
+
+# BriskBard (https://www.briskbard.com/)
+- regex: 'Chrome.+BriskBard/(\d+[\.\d]+)'
+  name: 'BriskBard'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'BriskBard(?:/(\d+[\.\d]+))?'
+  name: 'BriskBard'
+  version: '$1'
+
+# GinxDroid Browser (https://play.google.com/store/apps/details?id=ginxdroid.gdm)
+- regex: 'GinxDroidBrowser/(\d+[\.\d]+)'
+  name: 'GinxDroid Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Avira Scout (http://www.avira.com/en/avira-scout)
+- regex: 'AviraScout/(\d+[\.\d]+)'
+  name: 'Avira Scout'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Venus Browser (https://play.google.com/store/apps/details?id=com.venus.browser)
+- regex: 'VenusBrowser/(\d+[\.\d]+)'
+  name: 'Venus Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Otter Browser (https://github.com/OtterBrowser/otter-browser)
+- regex: 'Chrome.+Otter(?:[ /](\d+[\.\d]+))?'
+  name: 'Otter Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'Otter(?:[ /](\d+[\.\d]+))?'
+  name: 'Otter Browser'
+  version: '$1'
+
+# Smooz (https://smoozapp.com/)
+- regex: 'Chrome.+Smooz/(\d+[\.\d]+)'
+  name: 'Smooz'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'Smooz/(\d+[\.\d]+)'
+  name: 'Smooz'
+  version: '$1'
+
+# Cornowser (https://github.com/xdevs23/Cornowser)
+- regex: 'Cornowser/(\d+[\.\d]+)'
+  name: 'Cornowser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Orca (http://www.orcabrowser.com)
+- regex: 'Orca/(\d+[\.\d]+)'
+  name: 'Orca'
+  version: '$1'
+
+# Flow (https://www.ekioh.com/)
+- regex: 'Flow/(?:(\d+[\.\d]+))'
+  name: 'Flow'
+  version: '$1'
+  engine:
+    default: 'EkiohFlow'
+- regex: 'Ekioh/(?:(\d+[\.\d]+))'
+  name: 'Flow'
+  version: '$1'
+  engine:
+    default: 'EkiohFlow'
+
+# xStand (https://www.adnx.com/)
+- regex: 'xStand/(\d+[\.\d]+)'
+  name: 'xStand'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# Biyubi (http://www.biyubi.com/)
+- regex: 'Biyubi/(\d+[\.\d]+)'
+  name: 'Biyubi'
+  version: '$1'
+
+# Perfect Browser (http://www.perfectbrowser.com/)
+- regex: '(?:Perfect%20Browser(?:-iPad)?|Perfect(?:BrowserPro)?)/(\d+[\.\d]+)'
+  name: 'Perfect Browser'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# Phantom Browser (https://www.lg.com/)
+- regex: 'Browser/Phantom/V(\d+[\.\d]+)'
+  name: 'Phantom Browser'
+  version: '$1'
+
+# AwoX (https://www.awox.com.tr/)
+- regex: 'AwoX(?:/(\d+[\.\d]+))? Browser'
+  name: 'AwoX'
+  version: '$1'
+
+# Zetakey (https://www.zetakey.com/)
+- regex: 'Zetakey/(\d+[\.\d]+)'
+  name: 'Zetakey'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# PlayFree Browser
+- regex: 'PlayFreeBrowser/(?:(\d+[\.\d]+))?'
+  name: 'PlayFree Browser'
+  version: '$1'
+
+# Chim Lac (https://chimlac.com.vn/)
+- regex: '(?:chimlac_browser|chimlac)/(?:(\d+[\.\d]+))'
+  name: 'Chim Lac'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Odin (https://www.hisense.com/)
+- regex: 'Odin/(?:(\d+[\.\d]+))'
+  name: 'Odin'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# T-Browser (https://play.google.com/store/apps/details?id=com.tcl.browser)
+- regex: 'Tbrowser/(\d+[\.\d]+)'
+  name: 'T-Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# SFive (https://sfive.vn/)
+- regex: 'SFive(?:_Android)?/.+ Chrome/(\d+[\.\d]+)'
+  name: 'SFive'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'SFive_IOS/(\d+[\.\d]+)'
+  name: 'SFive'
+  version: '$1'
+
+# Navigateur Web
+- regex: 'Navigateur web/(?:(\d+[\.\d]+))?'
+  name: 'Navigateur Web'
+  version: '$1'
+
+#Seraphic Sraf (https://www.seraphic-corp.com/)
+- regex: 'Sraf(?:[/ ](\d+[\.\d]+))?'
+  name: 'Seraphic Sraf'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Seewo Browser (http://e.seewo.com/)
+- regex: 'SeewoBrowser/(?:(\d+[\.\d]+))?'
+  name: 'Seewo Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Kode Browser (https://www.kodebrowser.com/ | https://play.google.com/store/apps/details?id=com.app.downloadmanager | https://apps.apple.com/us/app/kode-browser-fast-private/id625458492)
+- regex: '(?:Kode(?:iOS)?/(?:(\d+[\.\d]+))?|TansoDL)'
+  name: 'Kode Browser'
+  version: '$1'
+
+# UR Browser (https://www.ur-browser.com/)
+- regex: 'UR/(?:(\d+[\.\d]+))'
+  name: 'UR Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# OceanHero (https://oceanhero.today)
+- regex: 'OceanHero/([\.\d]+)'
+  name: 'OceanHero'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Smart Lenovo Browser (https://www.lenovo.com.cn/)
+- regex: 'Chrome/.+ SLBrowser/(?:(\d+[\.\d]+))?'
+  name: 'Smart Lenovo Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'SLBrowser/(?:(\d+[\.\d]+))?'
+  name: 'Smart Lenovo Browser'
+  version: '$1'
+
+# Browzar (https://www.browzar.com/)
+- regex: 'Browzar'
+  name: 'Browzar'
+  version: ''
+
+# Stargon (http://www.stargon.org/ | https://play.google.com/store/apps/details?id=net.onecook.browser)
+- regex: 'Stargon/(?:(\d+[\.\d]+))?'
+  name: 'Stargon'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# NFS Browser (https://github.com/nfschina/nfs-browser)
+- regex: 'NFSBrowser/(?:(\d+[\.\d]+))?'
+  name: 'NFS Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Borealis Navigator (https://binaryoutcast.com/projects/borealis/)
+- regex: 'Borealis/(\d+[\.\d]+)'
+  name: 'Borealis Navigator'
+  version: '$1'
+
+# Yolo Browser
+- regex: 'YoloBrowser/(?:(\d+[\.\d]+))?'
+  name: 'Yolo Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Phoenix Browser (http://phoenix-browser.com/ | https://play.google.com/store/apps/details?id=com.transsion.phoenix)
+- regex: 'PHX/(?:(\d+[\.\d]+))?'
+  name: 'Phoenix Browser'
+  version: '$1'
+
+# PrivacyWall (https://play.google.com/store/apps/details?id=org.privacywall.browser)
+- regex: 'PrivacyWall/(?:(\d+[\.\d]+))?'
+  name: 'PrivacyWall'
+  version: '$1'
+
+# Ghostery Privacy Browser (https://play.google.com/store/apps/details?id=com.ghostery.android.ghostery | https://apps.apple.com/us/app/ghostery-privacy-browser/id472789016)
+- regex: 'Ghostery:?(\d+[\.\d]+)?'
+  name: 'Ghostery Privacy Browser'
+  version: '$1'
+
+# Yaani Browser
+- regex: 'Firefox/.*(?:Turkcell-)?YaaniBrowser(?:/(\d+[\.\d]+))?'
+  name: 'Yaani Browser'
+  version: '$1'
+  engine:
+    default: 'Gecko'
+- regex: '(?:Turkcell-)?YaaniBrowser(?:/(\d+[\.\d]+))?'
+  name: 'Yaani Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
 # Safe Exam Browser (https://safeexambrowser.org/)
 - regex: 'SEB/(?:(\d+[\.\d]+))?'
   name: 'Safe Exam Browser'
@@ -36,10 +588,22 @@
   version: '$1'
 
 # Lunascape Lite (https://www.lunascape.tv/)
-- regex: 'iLunascapeLite/(?:(\d+[\.\d]+))?'
+- regex: 'iLunascapeLite/(?:(\d+\.[.\d]+))?'
   name: 'Lunascape Lite'
   version: '$1'
 
+# Lunascape
+- regex: 'Chrome/.+ i?Lunascape(?:[/ ](\d+\.[.\d]+))?'
+  name: 'Lunascape'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: 'i?Lunascape(?:[/ ](\d+\.[.\d]+))?'
+  name: 'Lunascape'
+  version: '$1'
+  engine:
+    default: '' # multi engine
+
 # Polypane (https://polypane.app/)
 - regex: 'Polypane/(?:(\d+[\.\d]+))?'
   name: 'Polypane'
@@ -64,6 +628,10 @@
 - regex: 'ToGate/(?:(\d+[\.\d]+))?'
   name: 'ToGate'
   version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      28: 'Blink'
 
 # VMware AirWatch (https://www.air-watch.com/)
 - regex: 'AirWatch Browser v(?:(\d+[\.\d]+))?'
@@ -109,6 +677,10 @@
 - regex: 'AVG(?:/(\d+[\.\d]+))?'
   name: 'AVG Secure Browser'
   version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      28: 'Blink'
 
 # START Internet Browser (https://play.google.com/store/apps/details?id=fyi.start.web.browser)
 - regex: 'Start/(?:(\d+[\.\d]+))?'
@@ -134,11 +706,17 @@
 - regex: 'CCleaner(?:/(\d+[\.\d]+))?'
   name: 'CCleaner'
   version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      28: 'Blink'
 
 # Aloha Browser Lite (https://play.google.com/store/apps/details?id=com.alohamobile.browser.lite)
 - regex: 'AlohaLite(?:/(\d+[\.\d]+))?'
   name: 'Aloha Browser Lite'
   version: '$1'
+  engine:
+    default: 'Blink'
 
 # Tao Browser (https://browser.taobao.com/)
 - regex: 'TaoBrowser(?:/(\d+[\.\d]+))?'
@@ -189,6 +767,10 @@
 - regex: 'Beamrise(?:/(\d+[\.\d]+))?'
   name: 'Beamrise'
   version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      28: 'Blink'
 
 # Faux Browser (https://apps.apple.com/us/app/faux-browser/id472250940)
 - regex: 'Faux(?:/(\d+[\.\d]+))?'
@@ -222,6 +804,13 @@
   engine:
     default: 'Blink'
 
+# Hawk Quick Browser
+- regex: 'Hawk/QuickBrowser(?:/v?(\d+[\.\d]+))?'
+  name: 'Hawk Quick Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
 # FreeU (https://freeu.online/)
 - regex: 'FreeU(?:/(\d+[\.\d]+))?'
   name: 'FreeU'
@@ -263,12 +852,19 @@
   version: '$1'
 
 # Jio Browser (https://play.google.com/store/apps/details?id=com.jio.web)
-- regex: 'JioBrowser(?:/(\d+[\.\d]+))?'
+- regex: 'Jio(?:Browser|Pages)(?:/(\d+[\.\d]+))?'
   name: 'Jio Browser'
   version: '$1'
   engine:
     default: 'Blink'
 
+# https://play.google.com/store/apps/details?id=app.stampy.browser
+- regex: 'SY/(\d+[\.\d]+) Chrome/'
+  name: 'Stampy Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
 # hola! Browser (https://hola.org/browser)
 - regex: 'Chrome/.+ Hola(?:/(\d+[\.\d]+))?'
   name: 'hola! Browser'
@@ -276,10 +872,40 @@
   engine:
     default: 'Blink'
 
-# Huawei Browser
+# Slimjet (https://slimjet.com)
+- regex: 'Slimjet/(?:(\d+[\.\d]+))'
+  name: 'Slimjet'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# 7Star
+- regex: '7Star/(?:(\d+[\.\d]+))'
+  name: '7Star'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# MxNitro
+- regex: 'MxNitro/(?:(\d+[\.\d]+))'
+  name: 'MxNitro'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Huawei Browser Mobile
 - regex: 'HuaweiBrowser(?:/(\d+[\.\d]+))?'
+  name: 'Huawei Browser Mobile'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# Huawei Browser
+- regex: 'HBPC/(\d+[\.\d]+)'
   name: 'Huawei Browser'
   version: '$1'
+  engine:
+    default: 'Blink'
 
 # vivo Browser
 - regex: 'VivoBrowser(?:/(\d+[\.\d]+))?'
@@ -299,6 +925,11 @@
     default: 'Blink'
 
 # Qwant Mobile
+- regex: 'QwantiOS/(\d+[\.\d]+)'
+  name: 'Qwant Mobile'
+  version: '$1'
+  engine:
+    default: 'WebKit'
 - regex: 'QwantMobile(?:/(\d+[\.\d]+))?'
   name: 'Qwant Mobile'
   version: '$1'
@@ -325,7 +956,7 @@
     default: 'Gecko'
 
 # Microsoft Edge (Spartan Edge)
-- regex: 'Edge[ /](\d+[\.\d]+)'
+- regex: '(?<!motorola )Edge[ /](\d+[\.\d]+)'
   name: 'Microsoft Edge'
   version: '$1'
   engine:
@@ -400,14 +1031,29 @@
     default: 'Gecko'
 
 #AlohaBrowser
+- regex: 'Chrome/.+ AlohaBrowser(?:/(\d+[\.\d]+))?'
+  name: 'Aloha Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
 - regex: 'AlohaBrowser(?:/(\d+[\.\d]+))?'
   name: 'Aloha Browser'
   version: '$1'
+- regex: 'Aloha/'
+  name: 'Aloha Browser'
+  version: ''
 
 # Avast Secure Browser | Avast SafeZone Browser (https://www.avast.com/)
-- regex: '(?:Avast|ASW|Safer)(?:/(\d+[\.\d]+))?'
+- regex: 'Chrome.+(?:Avast(?:SecureBrowser)?|ASW|Safer)(?:/(\d+[\.\d]+))?'
+  name: 'Avast Secure Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
+- regex: '(?:Avast(?:SecureBrowser)?|ASW|Safer)(?:/(\d+[\.\d]+))?'
   name: 'Avast Secure Browser'
   version: '$1'
+  engine:
+    default: 'WebKit'
 
 #Epic
 - regex: 'Epic(?:/(\d+[\.\d]+))'
@@ -442,7 +1088,7 @@
 
 
 #Avant Browser
-- regex: 'Avant Browser'
+- regex: 'Avant ?Browser'
   name: 'Avant Browser'
   version: ''
   engine:
@@ -460,7 +1106,7 @@
   engine:
     default: 'WebKit'
     versions:
-      28: 'Blink'
+      '28': 'Blink'
 
 #Atomic Web Browser
 - regex: 'AtomicBrowser(?:/(\d+[\.\d]+))?'
@@ -532,7 +1178,7 @@
   engine:
     default: 'Gecko'
     versions:
-      3: 'WebKit'
+      '3': 'WebKit'
 
 # Jig Browser Plus (https://jig.jp/)
 - regex: 'JigBrowserPlus/(?:(\d+[\.\d]+))?'
@@ -569,7 +1215,7 @@
   version: '$1'
 
 # t-online.de Browser (https://www.t-online.de/computer/browser/)
-- regex: 'TO-Browser(?:/TOB(\d+[\.\d]+))?'
+- regex: '(?:TO-Browser/TOB|DT-Browser/DTB)(\d+[\.\d]+)'
   name: 't-online.de Browser'
   version: '$1'
 
@@ -602,7 +1248,7 @@
     default: 'Goanna'
 
 #Firefox Focus / Firefox Klar
-- regex: '(?:Focus|Klar)(?:/(\d+[\.\d]+))?'
+- regex: '(?:Focus|Klar)(?:/(\d+[\.\d]+))'
   name: 'Firefox Focus'
   version: '$1'
 
@@ -723,6 +1369,11 @@
   name: 'Obigo'
   version: ''
 
+# UC Browser HD
+- regex: 'UCBrowserHD/(\d[\d\.]+)'
+  name: 'UC Browser HD'
+  version: '$1'
+
 #UC Browser Mini
 - regex: 'UCMini(?:[ /]?(\d+[\.\d]+))?'
   name: 'UC Browser Mini'
@@ -730,6 +1381,11 @@
 - regex: 'UC[ ]?Browser.* \(UCMini\)'
   name: 'UC Browser Mini'
   version: ''
+- regex: 'Chrome.+uc mini browser(\d+[\.\d]+)?'
+  name: 'UC Browser Mini'
+  version: '$1'
+  engine:
+    default: 'Blink'
 
 # UC Browser Turbo
 - regex: 'UCTurbo(?:[ /]?(\d+[\.\d]+))?'
@@ -740,12 +1396,18 @@
   version: ''
 
 # Opera GX (https://www.opera.com/gx#start | http://ftp.opera.com/pub/opera_gx/)
-- regex: 'OPRGX(?:/(\d+[\.\d]+))?'
+- regex: 'Chrome/.+ OP(?:RG)?X(?:/(\d+[\.\d]+))?'
   name: 'Opera GX'
   version: '$1'
   engine:
     default: 'Blink'
 
+- regex: 'OP(?:RG)?X(?:/(\d+[\.\d]+))?'
+  name: 'Opera GX'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
 #Opera
 - regex: '(?:Opera Tablet.*Version|Opera/.+Opera Mobi.+Version|Mobile.+OPR)/(\d+[\.\d]+)'
   name: 'Opera Mobile'
@@ -764,6 +1426,16 @@
   version: '$1'
   engine:
     default: 'Blink'
+- regex: 'Opera%20Touch/(\d+[\.\d]+)? CFNetwork/.+Darwin/.+(?!.*x86_64)'
+  name: 'Opera Touch'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+- regex: 'Opera%20Touch/.+CFNetwork/.+Darwin/.+(?!.*x86_64)'
+  name: 'Opera Touch'
+  version: ''
+  engine:
+    default: 'WebKit'
 - regex: 'OPT/(\d+[\.\d]+)'
   name: 'Opera Touch'
   version: '$1'
@@ -791,6 +1463,12 @@
   version: '$1'
   engine:
     default: 'WebKit'
+- regex: 'Opera%20Mini/(\d+[\.\d]+) CFNetwork'
+  name: 'Opera Mini iOS'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
 - regex: 'Opera.+Edition Next.+Version/(\d+[\.\d]+)'
   name: 'Opera Next'
   version: '$1'
@@ -812,8 +1490,18 @@
     default: ''
     versions:
       '3.5': 'Elektra'
-      7: 'Presto'
-      15: 'Blink'
+      '7': 'Presto'
+      '15': 'Blink'
+- regex: 'Opera/.+CFNetwork'
+  name: 'Opera'
+  version: ''
+  engine:
+    default: 'WebKit'
+- regex: 'Chrome.+Opera/'
+  name: 'Opera'
+  version: ''
+  engine:
+    default: 'Blink'
 
 #Rekonq
 - regex: 'rekonq(?:/(\d+[\.\d]+))?'
@@ -836,7 +1524,7 @@
   engine:
     default: 'WebKit'
     versions:
-      28: 'Blink'
+      '28': 'Blink'
 
 #ChromePlus
 - regex: 'ChromePlus(?:/(\d+[\.\d]+))?'
@@ -862,15 +1550,12 @@
       4: '' # multiple (KHTML or WebKit)
 
 #Baidu Browser
-- regex: '(?:baidubrowser|bdbrowser_i18n|bdbrowser)(?:[/ ](\d+[\.\d]*))?'
-  name: 'Baidu Browser'
-  version: '$1'
-- regex: 'FlyFlow(?:[/ ](\d+[\.\d]*))?'
+- regex: '(?:baidubrowser|bdbrowser(?:(?:hd)?_i18n)?|FlyFlow|BaiduHD)(?:[/ ](\d+[\.\d]*))?'
   name: 'Baidu Browser'
   version: '$1'
 
 #Baidu Spark
-- regex: '(?:(?:BD)?Spark|BIDUBrowser)[/ ](\d+[\.\d]*)'
+- regex: '(?:(?:BD)?Spark(?:Safe)?|BIDUBrowser)[/ ](\d+[\.\d]*)'
   name: 'Baidu Spark'
   version: '$1'
 
@@ -880,17 +1565,15 @@
   version: '$1'
   engine:
     default: 'Blink'
-
 #Yandex Browser
 - regex: 'YaBrowser(?:/(\d+[\.\d]*))(?: \((alpha|beta)\))?'
   name: 'Yandex Browser'
   version: '$1 $2'
   engine:
     default: 'Blink'
-
-# Yaani Browser
-- regex: 'YaaniBrowser(?:/(\d+[\.\d]+))?'
-  name: 'Yaani Browser'
+# Yandex Browser + voice assistant alisa
+- regex: 'Ya(?:ndex)?SearchBrowser(?:/(\d+[\.\d]*))'
+  name: 'Yandex Browser'
   version: '$1'
   engine:
     default: 'Blink'
@@ -910,6 +1593,11 @@
     default: 'Blink'
 
 #Midori
+- regex: 'Chrome.+Midori Browser/(\d+[\.\d]+)'
+  name: 'Midori'
+  version: '$1'
+  engine:
+    default: 'Blink'
 - regex: 'Midori(?:/(\d+[\.\d]+))?'
   name: 'Midori'
   version: '$1'
@@ -917,12 +1605,19 @@
     default: 'WebKit'
 
 #Mercury
-- regex: 'Mercury(?:/(\d+[\.\d]+))?'
+- regex: 'Mercury/(?:(\d+[\.\d]+))?'
   name: 'Mercury'
   version: '$1'
 
 #Maxthon
-- regex: '(?:Maxthon|MxBrowser)[ /](\d+[\.\d]+)'
+- regex: 'Chrome.+Maxthon(?:.+\(portable\))?/(\d+[\.\d]+)'
+  name: 'Maxthon'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      '5.2': 'Blink'
+- regex: '(?:Maxthon(?:%20Browser)?|MxBrowser(?:-inhouse|-iPhone)?|MXiOS)[ /](\d+[\.\d]+)?'
   name: 'Maxthon'
   version: '$1'
   engine:
@@ -954,6 +1649,8 @@
   version: '$1'
   engine:
     default: 'WebKit'
+    versions:
+      28: 'Blink'
 
 - regex: 'Iron(?:/(\d+[\.\d]+))?'
   name: 'Iron'
@@ -988,6 +1685,11 @@
   name: 'Sogou Explorer'
   version: '$1'
 
+# QQ Browser Lite
+- regex: 'QQBrowserLite/([\d\.]+)'
+  name: 'QQ Browser Lite'
+  version: '$1'
+
 # QQ Browser Mini
 - regex: 'M?QQBrowser/Mini([\.\d]+)?'
   name: 'QQ Browser Mini'
@@ -1013,8 +1715,8 @@
 # This browser (http://coccoc.vn/) is built on top of Chromium with
 # additional features for Vietnamese users. Its regex has to be placed
 # before generic Chrome regex, or Chrome regex will match first and
-# the browser is mistaken as "Chrome".
-- regex: 'coc_coc_browser(?:/(\d+[\.\d]+))?'
+# the browser is mistaken as 'Chrome".
+- regex: '(?:coc_coc_browser|coccocbrowser|CocCoc)(?:/(\d+[\.\d]+))?'
   name: 'Coc Coc'
   version: '$1'
   engine:
@@ -1034,7 +1736,10 @@
   version: '$1'
 
 # Super Fast Browser (https://play.google.com/store/apps/details?id=com.browser.tssomas)
-- regex: '(?:SFBrowser|com.browser.tssomas)(?:/(\d+[\.\d]+))?'
+- regex: '(?:SFB(?:rowser)?)/(\d+[\.\d]+)'
+  name: 'Super Fast Browser'
+  version: '$1'
+- regex: 'com.browser.tssomas(?:/(\d+[\.\d]+))?'
   name: 'Super Fast Browser'
   version: '$1'
 
@@ -1047,6 +1752,8 @@
 - regex: 'UBrowser(?:/(\d+[\.\d]+))?'
   name: 'UBrowser'
   version: '$1'
+  engine:
+    default: 'Blink'
 
 #Streamy (Chromium based)
 - regex: 'Streamy(?:/(\d+[\.\d]+))?'
@@ -1072,28 +1779,49 @@
 - regex: 'UC AppleWebKit'
   name: 'UC Browser'
   version: ''
+- regex: 'UC%20Browser/(\d+[\.\d]+)? CFNetwork/.+Darwin/.+(?!.*x86_64)'
+  name: 'UC Browser'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+- regex: 'Chrome.+UC Browser(\d+[\.\d]+)'
+  name: 'UC Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
 
-#Tenta Browser
 #It should be checked before Chrome since the UA contains the Chrome
+
+#Tenta Browser (https://play.google.com/store/apps/details?id=com.tenta.android)
+- regex: 'Chrome/.+Tenta/(\d+[\.\d]+)'
+  name: 'Tenta Browser'
+  version: '$1'
+  engine:
+    default: 'Blink'
 - regex: 'Tenta/(\d+[\.\d]+)'
   name: 'Tenta Browser'
   version: '$1'
   engine:
-    default: 'Webkit'
+    default: 'WebKit'
 
 # Firefox Rocket
 - regex: 'Rocket/(\d+[\.\d]+)'
   name: 'Firefox Rocket'
   version: '$1'
   engine:
-    default: 'Webkit'
+    default: 'WebKit'
 
 # Web Explorer
 - regex: 'Web Explorer/(\d+[\.\d]+).*Chrome'
   name: 'Web Explorer'
   version: '$1'
   engine:
-    default: 'Webkit'
+    default: 'WebKit'
+- regex: 'webexplorer/(\d+)'
+  name: 'Web Explorer'
+  version: '$1'
+  engine:
+    default: 'WebKit'
 
 # Seznam Browser
 - regex: 'SznProhlizec/(\d+[\.\d]+)'
@@ -1144,13 +1872,6 @@
   engine:
     default: '' # multi engine -- WebKit or Blink
 
-# QtWebEngine
-- regex: 'QtWebEngine/(\d+[\.\d]+)'
-  name: 'QtWebEngine'
-  version: '$1'
-  engine:
-    default: '' # multi engine -- WebKit or Blink
-
 #Mobile Silk
 - regex: 'Silk/(\d+[\.\d]+) like Chrome'
   name: 'Mobile Silk'
@@ -1163,6 +1884,16 @@
   engine:
     default: 'WebKit'
 
+# iBrowser Mini
+- regex: 'iBrowser/Mini(\d+\.\d+)'
+  name: 'iBrowser Mini'
+  version: '$1'
+
+# iBrowser
+- regex: 'iBrowser/(\d+\.[.\d]+)?'
+  name: 'iBrowser'
+  version: '$1'
+
 #IBrowse
 - regex: 'IBrowse(?:[ /](\d+[\.\d]+))?'
   name: 'IBrowse'
@@ -1183,6 +1914,11 @@
   engine:
     default: 'WebKit'
 
+# GoBrowser
+- regex: 'GoBrowser(?:/(\d+[\.\d]+))?'
+  name: 'GoBrowser'
+  version: '$1'
+
 #Nokia Browser
 - regex: '(?:NokiaBrowser|BrowserNG)(?:/(\d+[\.\d]+))?'
   name: 'Nokia Browser'
@@ -1201,7 +1937,7 @@
   version: ''
 
 #Sleipnir
-- regex: 'Sleipnir(?:[ /](\d+[\.\d]+))?'
+- regex: 'Sleipnir(?:(?:%20Browser)?[ /](\d+[\.\d]+))?'
   name: 'Sleipnir'
   version: '$1'
   engine:
@@ -1224,12 +1960,54 @@
   engine:
     default: 'WebKit'
 
+# Monument Browser
+- regex: 'MonumentBrowser(?:/(\d+[\.\d]+))?'
+  name: 'Monument Browser'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# Blue Browser
 - regex: 'BlueBrowser(?:/(\d+[\.\d]+))?'
   name: 'Blue Browser'
   version: '$1'
   engine:
     default: 'WebKit'
 
+# Japan Browser (https://play.google.com/store/apps/details?id=com.japan.browser.anti.blokir)
+- regex: 'JAPAN Browser(?:/(\d+[\.\d]+))?'
+  name: 'Japan Browser'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+- regex: 'OpenFin/(?:(\d+[\.\d]+))'
+  name: 'OpenFin'
+  version: '$1'
+  engine:
+    default: 'Blink'
+
+# SuperBird
+- regex: 'SuperBird(?:/(\d+[\.\d]+))?'
+  name: 'SuperBird'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      28: 'Blink'
+
+# LG Browser
+- regex: 'LG Browser(?:/(\d+[\.\d]+))'
+  name: 'LG Browser'
+  version: '$1'
+
+# QtWebEngine should be placed after LG Browser
+- regex: 'QtWebEngine/(\d+[\.\d]+)'
+  name: 'QtWebEngine'
+  version: '$1'
+  engine:
+    default: '' # multi engine -- WebKit or Blink
+
 # Chrome Webview
 - regex: 'Version/.* Chrome(?:/(\d+[\.\d]+))?'
   name: 'Chrome Webview'
@@ -1284,10 +2062,24 @@
     versions:
       28: 'Blink'
 
+# PocketBook Browser
+- regex: 'PocketBook/'
+  name: 'PocketBook Browser'
+  version: ''
+  engine:
+    default: 'WebKit'
+
 #Tizen Browser
-- regex: '(?:Tizen|SLP) Browser(?:/(\d+[\.\d]+))?'
+- regex: '(?:Tizen|SLP) ?Browser(?:/(\d+[\.\d]+))?'
   name: 'Tizen Browser'
   version: '$1'
+- regex: 'Tizen (?:\d+[\.\d]+).+ Version/(\d+[\.\d]+) (?:TV|Mobile|like)'
+  name: 'Tizen Browser'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+    versions:
+      '4': 'Blink'
 
 #Palm Blazer
 - regex: 'Blazer(?:/(\d+[\.\d]+))?'
@@ -1444,8 +2236,20 @@
   engine:
     default: 'Gecko'
 
-#Google Earth
-- regex: 'Google Earth(?:/(\d+[\.\d]+))?'
+# Google Earth Pro (https://www.google.se/intl/en/earth/versions/)
+- regex: '(?:Google Earth Pro|Google%20Earth%20Pro)(?:/(\d+[\.\d]+))?'
+  name: 'Google Earth Pro'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+- regex: 'GoogleEarth/(\d+[\.\d]+).+client:(?:Plus|Pro)'
+  name: 'Google Earth Pro'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
+# Google Earth (https://www.google.se/intl/en/earth/versions/)
+- regex: 'Google ?Earth(?:/v?(\d+[\.\d]+))?'
   name: 'Google Earth'
   version: '$1'
   engine:
@@ -1461,7 +2265,7 @@
   name: 'iCab Mobile'
   version: '$1'
   engine:
-     default: 'WebKit'
+    default: 'WebKit'
 
 #iCab
 - regex: 'iCab(?:[ /](\d+[\.\d]+))?'
@@ -1472,12 +2276,12 @@
     versions:
       4: 'WebKit'
 
-#Lunascape
-- regex: 'i?Lunascape(?:[/ ](\d+[\.\d]+))?'
-  name: 'Lunascape'
+# Crazy Browser
+- regex: 'Crazy Browser (\d+[\.\d]+)'
+  name: 'Crazy Browser'
   version: '$1'
   engine:
-    default: '' # multi engine
+    default: 'Trident'
 
 #Internet Explorer
 - regex: 'IEMobile[ /](\d+[\.\d]+)'
@@ -1492,22 +2296,22 @@
     default: 'Trident'
 - regex: 'MSIE.*Trident/4.0'
   name: 'Internet Explorer'
-  version: 8.0
+  version: '8.0'
   engine:
     default: 'Trident'
 - regex: 'MSIE.*Trident/5.0'
   name: 'Internet Explorer'
-  version: 9.0
+  version: '9.0'
   engine:
     default: 'Trident'
 - regex: 'MSIE.*Trident/6.0'
   name: 'Internet Explorer'
-  version: 10.0
+  version: '10.0'
   engine:
     default: 'Trident'
 - regex: 'Trident/[78].0'
   name: 'Internet Explorer'
-  version: 11.0
+  version: '11.0'
   engine:
     default: 'Trident'
 - regex: 'MSIE (\d+[\.\d]+)'
@@ -1540,11 +2344,6 @@
   engine:
     default: 'Text-based'
 
-# LG Browser
-- regex: 'LG Browser(?:/(\d+[\.\d]+))'
-  name: 'LG Browser'
-  version: '$1'
-
 # LuaKit
 - regex: 'LuaKit(?:/(\d+[\.\d]+))?'
   name: 'LuaKit'
@@ -1592,16 +2391,11 @@
   name: 'Off By One'
   version: ''
 
-#Oregano
-- regex: 'Oregano(?:[ /](\d+[\.\d]+))?'
+#Oregano (https://oregan.net/)
+- regex: '(?:Oregano|OreganMediaBrowser)(?:[ /](\d+[\.\d]+))?'
   name: 'Oregano'
   version: '$1'
 
-#Otter Browser
-- regex: 'Otter(?:[ /](\d+[\.\d]+))?'
-  name: 'Otter Browser'
-  version: '$1'
-
 #Polaris
 - regex: '(?:Polaris|Embider)(?:[/ ](\d+[\.\d]+))?'
   name: 'Polaris'
@@ -1612,13 +2406,6 @@
   name: 'SEMC-Browser'
   version: '$1'
 
-#Seraphic Sraf
-- regex: 'Sraf(?:[/ ](\d+[\.\d]+))?'
-  name: 'Seraphic Sraf'
-  version: '$1'
-  engine:
-    default: 'Blink'
-
 #Shiira
 - regex: 'Shiira(?:[/ ](\d+[\.\d]+))?'
   name: 'Shiira'
@@ -1643,11 +2430,6 @@
   name: 'Sunrise'
   version: '$1'
 
-#SuperBird
-- regex: 'SuperBird(?:/(\d+[\.\d]+))?'
-  name: 'SuperBird'
-  version: '$1'
-
 #Vision Mobile Browser
 - regex: 'Vision-Browser(?:/(\d+[\.\d]+))'
   name: 'Vision Mobile Browser'
@@ -1668,13 +2450,8 @@
   name: 'BlackBerry Browser'
   version: ''
 
-#BriskBard
-- regex: 'BriskBard(?:/(\d+[\.\d]+))?'
-  name: 'BriskBard'
-  version: '$1'
-
 #Android Browser
-- regex: 'Android'
+- regex: '(?<! like )Android'
   name: 'Android Browser'
   version: ''
   engine:
@@ -1684,11 +2461,11 @@
 - regex: 'Coast(?:/(\d+[\.\d]+))?'
   name: 'Coast'
   version: '$1'
-
-#Qutebrowser
-- regex: 'qutebrowser(?:/(\d+[\.\d]+))?'
-  name: 'Qutebrowser'
+- regex: 'Opera%20Coast/(\d+[\.\d]+)? CFNetwork/.+Darwin/.+(?!.*x86_64)'
+  name: 'Coast'
   version: '$1'
+  engine:
+    default: 'WebKit'
 
 # surf (https://surf.suckless.org/)
 - regex: 'Surf(?:/(\d+[\.\d]+))?'
@@ -1697,6 +2474,13 @@
   engine:
     default: 'WebKit'
 
+# Safari Technology Preview (https://developer.apple.com/safari/technology-preview/)
+- regex: 'Safari%20Technology%20Preview/(\d+[\.\d]+)'
+  name: 'Safari Technology Preview'
+  version: '$1'
+  engine:
+    default: 'WebKit'
+
 #Safari
 - regex: '(?:(?:iPod|iPad|iPhone).+Version|MobileSafari)/(\d+[\.\d]+)'
   name: 'Mobile Safari'
@@ -1708,23 +2492,23 @@
   version: '$1'
   engine:
     default: 'WebKit'
-- regex: '(?:iPod|iPhone|iPad)'
+- regex: '(?:iPod|(?<!Apple TV; U; CPU )iPhone|iPad)'
   name: 'Mobile Safari'
   version: ''
   engine:
     default: 'WebKit'
-- regex: 'Version/(\d+[\.\d]+).*Safari/|Safari/\d+'
+- regex: 'Version/(\d+[\.\d]+).*Safari/|(?:Safari|Safari(?:%20)?%E6%B5%8F%E8%A7%88%E5%99%A8)/?\d+'
   name: 'Safari'
   version: '$1'
   engine:
     default: 'WebKit'
-    
-#Dorado
-- regex: 'Dorado WAP-Browser[/ ](\d+[\.\d]+)'
+
+# Dorado
+- regex: 'Dorado WAP-Browser(?:[/ ](\d+[\.\d]+))?'
   name: 'Dorado'
   version: '$1'
 
-#NetSurf
+# NetSurf
 - regex: 'NetSurf(?:/(\d+[\.\d]+))?'
   name: 'NetSurf'
   version: '$1'
@@ -1749,7 +2533,18 @@
     default: 'Gecko'
 
 # GOG Galaxy
-- regex: 'GOGGalaxyClient/(?:(\d+[\.\d]+))?'
+- regex: 'GOGGalaxyClient/(\d+[\.\d]+)?'
   name: 'GOG Galaxy'
   version: '$1'
-  
\ No newline at end of file
+
+# MAUI Wap Browser
+- regex: 'WAP Browser/MAUI|(?:\w*)Maui Wap Browser|MAUI[- ]Browser'
+  name: 'MAUI WAP Browser'
+  version: ''
+
+# SP Browser
+- regex: 'SP%20Browser/(\d+[\.\d]+)'
+  name: 'SP Browser'
+  version: '$1'
+  engine:
+    default: 'WebKit'
diff --git a/priv/ua_inspector/client.feed_readers.yml b/priv/ua_inspector/client.feed_readers.yml
index 96f02bb97a932114dcbc7ce33ae397a0d94f34e3..69c7242e2992b94195e02a8a97187114b962fd5a 100644
--- a/priv/ua_inspector/client.feed_readers.yml
+++ b/priv/ua_inspector/client.feed_readers.yml
@@ -22,19 +22,13 @@
   version: ''
   url: 'http://lincgeek.org/bashpodder/'
   type: 'Feed Reader'
-  
+
 - regex: 'Breaker/v([\d\.]+)'
   name: 'Breaker'
   version: '$1'
   url: 'https://www.breaker.audio/'
   type: 'Feed Reader App'
 
-- regex: 'Downcast/([\d\.]+)'
-  name: 'Downcast'
-  version: '$1'
-  url: 'http://downcastapp.com/'
-  type: 'Feed Reader App'
-
 - regex: 'FeedDemon(?:/(\d+[\.\d]+))?'
   name: 'FeedDemon'
   version: '$1'
@@ -50,7 +44,7 @@
 - regex: 'QuiteRSS(?:[/ ](\d+[\.\d]+))?'
   name: 'QuiteRSS'
   version: '$1'
-  url: https://quiterss.org
+  url: 'https://quiterss.org'
   type: 'Feed Reader App'
 
 - regex: 'gPodder/([\d\.]+)'
@@ -71,7 +65,7 @@
   url: 'http://liferea.sf.net/'
   type: 'Feed Reader'
 
-- regex: 'NetNewsWire(?:[/ ](\d+[\.\d]+))?'
+- regex: '(?:NetNewsWire|Evergreen.+MacOS)(?:[/ ](\d+[\.\d]+))?'
   name: 'NetNewsWire'
   version: '$1'
   url: 'http://netnewswireapp.com/'
@@ -113,7 +107,7 @@
   url: 'http://readkitapp.com/'
   type: 'Feed Reader App'
 
-- regex: 'Reeder(?:[/ ](\d+[\.\d]+))?'
+- regex: 'Reeder[/ ](\d+[\.\d]+)'
   name: 'Reeder'
   version: '$1'
   url: 'http://reederapp.com/'
diff --git a/priv/ua_inspector/client.libraries.yml b/priv/ua_inspector/client.libraries.yml
index 2f40d469f47bf565bc845083935bf1caa6881215..3f18ffdd696f388fcd2df4acad68846022dcf2bf 100644
--- a/priv/ua_inspector/client.libraries.yml
+++ b/priv/ua_inspector/client.libraries.yml
@@ -5,11 +5,21 @@
 # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
 ###############
 
+# AnyEvent HTTP (http://software.schmorp.de/pkg/AnyEvent)
+- regex: 'AnyEvent-HTTP(?:/(\d+[\.\d]+))?'
+  name: 'AnyEvent HTTP'
+  version: '$1'
+
+# SlimerJS (https://www.slimerjs.org/)
+- regex: 'SlimerJS/(\d+[\.\d]+)'
+  name: 'SlimerJS'
+  version: '$1'
+
 - regex: 'Wget(?:/(\d+[\.\d]+))?'
   name: 'Wget'
   version: '$1'
 
-- regex: 'Guzzle(?:/(\d+[\.\d]+))?'
+- regex: 'Guzzle(?:Http)?(?:/(\d+[\.\d]+))?'
   name: 'Guzzle (PHP HTTP Client)'
   version: '$1'
 
@@ -25,6 +35,14 @@
   name: 'Python urllib'
   version: '$1'
 
+- regex: 'Apache-HttpClient(?:/?(\d+[\.\d]+))?'
+  name: 'Apache HTTP Client'
+  version: '$1'
+
+- regex: 'Java-http-client(?:/?(\d+[\.\d]+))?'
+  name: 'Java HTTP Client'
+  version: '$1'
+
 - regex: 'Java(?:/?(\d+[\.\d]+))?'
   name: 'Java'
   version: '$1'
@@ -55,7 +73,7 @@
   name: 'aiohttp'
   version: '$1'
 
-- regex: 'Google-HTTP-Java-Client(?:/(\d+[\.\d\w-]+))?'
+- regex: 'Google-HTTP-Java-Client(?:/(\d+[\.\w-]+))?'
   name: 'Google HTTP Java Client'
   version: '$1'
 
@@ -104,10 +122,83 @@
 
 - regex: 'node-fetch/(\d+[\.\d]+)'
   name: 'Node Fetch'
-  version: $1
+  version: '$1'
   url: 'https://github.com/node-fetch/node-fetch'
 
 - regex: 'ReactorNetty/(\d+[\.\d]+)'
   name: 'ReactorNetty'
-  version: $1
+  version: '$1'
   url: 'https://github.com/reactor/reactor-netty'
+
+- regex: 'PostmanRuntime(?:/(\d+[\.\d]+))?'
+  name: 'Postman Desktop'
+  version: '$1'
+  url: 'https://github.com/postmanlabs/postman-runtime'
+
+- regex: 'Jakarta Commons-HttpClient/([\.\d]+)'
+  name: 'Jakarta Commons HttpClient'
+  version: '$1'
+  url: 'https://hc.apache.org/httpclient-3.x'
+
+- regex: 'WinHttp.WinHttpRequest.+([\.\d]+)'
+  name: 'WinHttp WinHttpRequest'
+  version: '$1'
+
+- regex: 'WinHTTP'
+  name: 'Windows HTTP'
+  version: ''
+
+# THTTPClient in delphi 10+ default useragent
+- regex: 'Embarcadero URI Client/([\.\d]+)'
+  name: 'Embarcadero URI Client'
+  version: '$1'
+
+- regex: 'Mikrotik/([\.\d]+)'
+  name: 'Mikrotik Fetch'
+  version: '$1'
+
+- regex: 'GRequests(?:/(\d+[\.\d]+))?'
+  name: 'GRequests'
+  version: '$1'
+
+# https://doc.akka.io/
+- regex: 'akka-http/([\.\d]+)'
+  name: 'Akka HTTP'
+  version: '$1'
+
+# this added need added tests
+- regex: 'aria2(?:/(\d+[\.\d]+))?'
+  name: 'Aria2'
+  version: '$1'
+
+- regex: 'BTWebClient/'
+  name: 'uTorrent'
+  version: ''
+
+- regex: 'gvfs/(?:(\d+[\.\d]+))?'
+  name: 'gvfs'
+  version: '$1'
+
+# https://openwrt.org/packages/pkgdata/uclient-fetch
+- regex: 'uclient-fetch'
+  name: 'uclient-fetch'
+  version: ''
+
+# https://github.com/microsoft/cpprestsdk
+- regex: 'cpprestsdk/([\.\d]+)'
+  name: 'C++ REST SDK'
+  version: '$1'
+
+- regex: 'lua-resty-http/([\.\d]+).+ngx_'
+  name: 'LUA OpenResty NGINX'
+  version: '$1'
+
+# https://github.com/Kong/unirest-java
+- regex: 'unirest-java/([\.\d]+)'
+  name: 'Unirest for Java'
+  version: '$1'
+
+# jsdom (https://github.com/jsdom/jsdom)
+- regex: 'jsdom/([\.\d]+)'
+  name: 'jsdom'
+  version: '$1'
diff --git a/priv/ua_inspector/client.mediaplayers.yml b/priv/ua_inspector/client.mediaplayers.yml
index 51e284b235aba56cb83b1e1a13f7e16e4409996e..e60eaa85fdfb40021cd3f76b8414dd65821380be 100644
--- a/priv/ua_inspector/client.mediaplayers.yml
+++ b/priv/ua_inspector/client.mediaplayers.yml
@@ -32,7 +32,7 @@
 - regex: 'FlyCast(?:/([\d\.]+))?'
   name: 'FlyCast'
   version: '$1'
-  
+
 - regex: 'foobar2000(?:/([\d\.]+))?'
   name: 'Foobar2000'
   version: '$1'
@@ -65,6 +65,10 @@
   name: 'SubStream'
   version: '$1'
 
+- regex: 'Sonos/([\d\.]+)?'
+  name: 'SONOS'
+  version: '$1'
+
 - regex: '(?:Lib)?VLC(?:/([\d\.]+))?'
   name: 'VLC'
   version: '$1'
@@ -100,3 +104,23 @@
 - regex: 'mpv (?:(\d+[\.\d]+))?'
   name: 'mpv'
   version: '$1'
+
+- regex: 'foobar2000(?:/([\w\.]+))?'
+  name: 'foobar2000'
+  version: '$1'
+
+- regex: 'HTC Streaming Player'
+  name: 'HTC Streaming Player'
+  version: ''
+
+- regex: 'MediaGo(?:/([\w\.]+))?'
+  name: 'Sony Media Go'
+  version: '$1'
+
+- regex: 'MPlayer[ /](\d+\.[\d\.])'
+  name: 'MPlayer'
+  version: '$1'
+
+- regex: 'Downcast/(\d+\.[\d\.]+)?'
+  name: 'Downcast'
+  version: '$1'
diff --git a/priv/ua_inspector/client.mobile_apps.yml b/priv/ua_inspector/client.mobile_apps.yml
index 6a20292e46c5908f0a76689c280220562b4142af..5b2e5a8f67e7795c82829afd999320e2f623bd21 100644
--- a/priv/ua_inspector/client.mobile_apps.yml
+++ b/priv/ua_inspector/client.mobile_apps.yml
@@ -19,11 +19,36 @@
   name: 'bPod'
   version: ''
 
-# Facebook Messenger
-- regex: '(?:MessengerForiOS|MESSENGER).(?:FBAV)(?:[ /]([\d\.]+))?'
+# Facebook Audience Network
+- regex: 'AudienceNetworkForAndroid.+(?:FBAV)(?:[ /]([\d\.]+))?'
+  name: 'Facebook Audience Network'
+  version: '$1'
+
+# Facebook Messenger (https://play.google.com/store/apps/details?id=com.facebook.orca)
+- regex: '(?:MessengerForiOS|MESSENGER|FB_IAB/Orca-Android).(?:FBAV)(?:[ /]([\d\.]+))?'
   name: 'Facebook Messenger'
   version: '$1'
 
+# Facebook Messenger Lite
+- regex: '(?:mLite|MessengerLite(?:ForiOS)?).(?:FBAV)(?:[ /]([\d\.]+))?'
+  name: 'Facebook Messenger Lite'
+  version: '$1'
+
+# Facebook Groups
+- regex: '(?:GroupsForiOS).(?:FBAV)(?:[ /]([\d\.]+))?'
+  name: 'Facebook Groups'
+  version: '$1'
+
+# Facebook Lite (https://play.google.com/store/apps/details?id=com.facebook.lite)
+- regex: 'FBAN/EMA.+FBAV(?:[ /]([\d\.]+))?'
+  name: 'Facebook Lite'
+  version: '$1'
+
+# Meta Business Suite (https://apps.apple.com/us/app/facebook-business-suite/id514643583)
+- regex: 'FBAN/FBPageAdmin.+FBAV(?:[ /]([\d\.]+))?'
+  name: 'Meta Business Suite'
+  version: '$1'
+
 # Facebook
 - regex: '(?:FBAV|com.facebook.katana)(?:[ /]([\d\.]+))?'
   name: 'Facebook'
@@ -52,10 +77,21 @@
   name: 'Google Plus'
   version: ''
 
+# Google Drive (https://apps.apple.com/us/app/google-drive/id507874739)
+- regex: 'Google.DriveExtension(?:/([\d\.]+))?'
+  name: 'Google Drive'
+  version: '$1'
+
 # WeChat
-- regex: 'MicroMessenger/([^ ]+)'
+- regex: 'MicroMessenger/([\d\.]+)'
   name: 'WeChat'
   version: '$1'
+- regex: 'WeChat/([\d\.]+)'
+  name: 'WeChat'
+  version: '$1'
+- regex: 'WeChatShareExtensionNew/([\d\.]+)'
+  name: 'WeChat Share Extension'
+  version: '$1'
 
 # DingTalk
 - regex: 'DingTalk/([0-9\.]+)'
@@ -68,7 +104,7 @@
   version: '$1'
 
 # Pinterest
-- regex: 'Pinterest(?:/([\d\.]+))?'
+- regex: 'Pinterest(?: for (?:Android(?: Tablet)?|iOS))?(?:/([\d\.]+))?'
   name: 'Pinterest'
   version: '$1'
 
@@ -82,6 +118,25 @@
   name: 'YouTube'
   version: '$1'
 
+# Netflix (https://play.google.com/store/apps/details?id=com.netflix.mediaclient)
+- regex: 'com.netflix.mediaclient(?:/(\d+\.[\d\.]+))?'
+  name: 'Netflix'
+  version: '$1'
+
+# Downcast (www.downcastapp.com | https://apps.apple.com/us/app/downcast/id393858566)
+- regex: 'Downcast/(\d+\.[\d\.]+)?(?:.+(?:!Mac)|$)'
+  name: 'Downcast'
+  version: '$1'
+
+# Flipp (https://apps.apple.com/us/app/flipp-weekly-shopping/id725097967)
+- regex: 'Flipp-iOS/.+CFNetwork'
+  name: 'Flipp'
+  version: ''
+
+- regex: 'Flipp-iOS/(\d+[\.\d]+)'
+  name: 'Flipp'
+  version: '$1'
+
 # AFNetworking generic
 - regex: '([^/]+)/(\d+(?:\.\d+)+) \((?:iPhone|iPad); iOS [0-9\.]+; Scale/[0-9\.]+\)'
   name: '$1'
@@ -101,148 +156,131 @@
 - regex: 'Instacast(?:HD)?/(\d\.[\d\.abc]+) CFNetwork/([\d\.]+) Darwin/([\d\.]+)'
   name: 'Instacast'
   version: '$1'
--
-  regex: 'Podcasts/([\d\.]+)'
+- regex: 'Podcasts/([\d\.]+)'
   name: 'Podcasts'
   version: '$1'
--
-  regex: 'Pocket Casts(?:, (?:Android|iOS) v([\d\.]+))?'
+- regex: 'Pocket Casts(?:, (?:Android|iOS) v([\d\.]+))?'
   name: 'Pocket Casts'
   version: '$1'
--
-  regex: 'Podcat/([\d\.]+)'
+- regex: 'Podcat/([\d\.]+)'
   name: 'Podcat'
   version: '$1'
-
--
-  regex: 'BeyondPod'
+- regex: 'BeyondPod'
   name: 'BeyondPod'
   version:
--
-  regex: 'AntennaPod/?([\d\.]+)?'
+- regex: 'AntennaPod/?([\d\.]+)?'
   name: 'AntennaPod'
   version: '$1'
--
-  regex: 'Overcast/([\d\.]+)'
+- regex: 'Overcast/([\d\.]+)'
   name: 'Overcast'
   version: '$1'
--
-  regex: '(?:CastBox|fm.castbox.audiobook.radio.podcast)/?([\d\.]+)?'
+- regex: '(?:CastBox|fm.castbox.audiobook.radio.podcast)/?([\d\.]+)?'
   name: 'CastBox'
   version: '$1'
--
-  regex: 'Player FM'
+- regex: 'Player FM'
   name: 'Player FM'
   version: ''
--
-  regex: 'Podkicker(?: Pro)?/([\d\.]+)'
-  name: 'Podkicker'
-  version: '$1'
--
-  regex: 'PodcastRepublic/([\d\.]+)'
+- regex: 'Podkicker( (?:Pro|Classic))?/([\d\.]+)'
+  name: 'Podkicker$1'
+  version: '$2'
+- regex: 'PodcastRepublic/([\d\.]+)'
   name: 'Podcast Republic'
   version: '$1'
--
-  regex: 'Castro/(\d+)'
+- regex: 'Castro/(\d+)'
   name: 'Castro'
   version: '$1'
--
-  regex: 'Castro 2 ([\d\.]+)/[\d]+ Like iTunes'
+- regex: 'Castro 2 ([\d\.]+)/[\d]+ Like iTunes'
   name: 'Castro 2'
   version: '$1'
--
-  regex: 'Castro 2'
+- regex: 'Castro 2'
   name: 'Castro 2'
   version: ''
--
-  regex: 'DoggCatcher'
+- regex: 'DoggCatcher'
   name: 'DoggCatcher'
   version:
--
-  regex: 'PodcastAddict/v([\d]+)'
+- regex: 'PodcastAddict/v([\d]+)'
   name: 'Podcast & Radio Addict'
   version: '$1'
--
-  regex: 'Podcat/([\d]+) CFNetwork/([\d\.]+) Darwin/([\d\.]+)'
+- regex: 'Podcat(?:%202)?/([\d]+) CFNetwork'
   name: 'Podcat'
   version: '$1'
--
-  regex: 'i[cC]atcher[^\d]+([\d\.]+)'
+- regex: 'iCatcher[^\d]+([\d\.]+)'
   name: 'iCatcher'
   version: '$1'
--
-  regex: 'YelpApp/([\d\.]+)'
+- regex: 'YelpApp/([\d\.]+)'
   name: 'Yelp Mobile'
   version: '$1'
--
-  regex: 'jp.co.yahoo.android.yjtop/([\d\.]+)'
+- regex: 'jp.co.yahoo.android.yjtop/([\d\.]+)'
   name: 'Yahoo! Japan'
   version: '$1'
--
-  regex: 'RSSRadio/([\d]+)?'
+- regex: 'RSSRadio/([\d]+)?'
   name: 'RSSRadio'
   version: '$1'
--
-  regex: 'SogouSearch Android[\d\.]+ version([\d\.]+)?'
+- regex: 'SogouSearch Android[\d\.]+ version([\d\.]+)?'
   name: 'SogouSearch App'
   version: '$1'
--
-  regex: 'NewsArticle/([\d\.]+)?'
+- regex: 'NewsArticle/([\d\.]+)?'
   name: 'NewsArticle App'
   version: '$1'
--
-  regex: 'tieba/([\d\.]+)?'
+- regex: 'tieba/([\d\.]+)?'
   name: 'tieba'
   version: '$1'
--
-  regex: 'com\.douban\.group/([\d\.]+)?'
+- regex: 'com\.douban\.group/([\d\.]+)?'
   name: 'douban App'
   version: '$1'
--
-  regex: 'BingWeb/([\d\.]+)?'
+- regex: 'BingWeb/([\d\.]+)?'
   name: 'BingWebApp'
   version: '$1'
--
-  regex: 'GSA/([\d\.]+)?'
+- regex: '(?:com.google.GoogleMobile|GSA)/([\d\.]+)?'
   name: 'Google Search App'
   version: '$1'
--
-  regex: 'Flipboard/([\d\.]+)?'
+- regex: 'Flipboard/([\d\.]+)?'
   name: 'Flipboard App'
   version: '$1'
--
-  regex: 'Instagram[ /]([\d\.]+)?'
+- regex: 'Instagram[ /]([\d\.]+)?'
   name: 'Instagram App'
   version: '$1'
--
-  regex: 'baiduboxapp/([\d\.]+)?'
+- regex: 'baiduboxapp/([\d\.]+)?'
   name: 'Baidu Box App'
   version: '$1'
--
-  regex: 'Crosswalk(?!.*(?:Streamy|QwantMobile))/([\d\.]+)?'
+- regex: 'Crosswalk(?!.*(?:Streamy|QwantMobile))/([\d\.]+)?'
   name: 'CrosswalkApp'
   version: '$1'
--
-  regex: 'Twitter for iPhone[/]?([\d\.]+)?'
+- regex: 'Twitter for iPhone[/]?([\d\.]+)?'
   name: 'Twitter'
   version: '$1'
--
-  regex: 'Twitter/([\d\.]+)'
+- regex: 'Twitter/([\d\.]+)'
   name: 'Twitter'
   version: '$1'
--
-  regex: 'TwitterAndroid[/]?([\d\.]+)?'
+- regex: 'TwitterAndroid[/]?([\d\.]+)?'
   name: 'Twitter'
   version: '$1'
-
--
-  regex: 'TopBuzz/([\d\.]+)'
+# Pocket Casts (https://pocketcasts.com)
+- regex: '^Pocket Casts'
+  name: 'Pocket Casts'
+  version: ''
+# Gaana (https://gaana.com)
+- regex: '^GaanaAndroid-([\d\.]+)'
+  name: 'Gaana'
+  version: '$1'
+- regex: 'TopBuzz/([\d\.]+)'
   name: 'TopBuzz'
   version: '$1'
--
-  regex: 'Snapchat/([\d\.]+)'
+- regex: 'Snapchat/([\d\.]+)'
   name: 'Snapchat'
   version: '$1'
+- regex: 'AhaRadio2/([\d\.]+)'
+  name: 'Aha Radio 2'
+  version: '$1'
+# Unibox (https://apps.apple.com/app/id933879046)
+- regex: 'Unibox/([\d\.]+)'
+  name: 'Unibox'
+  version: ''
+
+# Strimio (https://www.strimio.com/)
+- regex: 'strimio(?:-desktop)/(\d+\.(?:[\.\d]+))?'
+  name: 'Strimio'
+  version: '$1'
 
 # UnityPlayer
 - regex: 'UnityPlayer/([\d\.]+)'
@@ -272,6 +310,884 @@
   name: 'Siri'
   version: '1.0'
 
-- regex: 'LinkedIn/([\d\.]+)'
+- regex: 'LinkedIn(?:App)?(?:/([\d\.]+))?'
   name: 'LinkedIn'
   version: '$1'
+
+# https://apps.apple.com/ru/app/instapaper/id288545208
+- regex: 'Instapaper/([\d\.]+)'
+  name: 'Instapaper'
+  version: '$1'
+
+# https://apps.apple.com/us/app/keeper-password-manager/id287170072
+- regex: 'Keeper/([\d\.]+)'
+  name: 'Keeper Password Manager'
+  version: '$1'
+
+# https://apps.apple.com/us/app/skyeng-teachers/id1483049537
+- regex: 'Skyeng Teachers/([\d\.]+)'
+  name: 'Skyeng Teachers'
+  version: '$1'
+
+- regex: 'Kik/([\d\.]+) \(Android'
+  name: 'Kik'
+  version: '$1'
+
+- regex: 'Procast/?([\d\.]+)?'
+  name: 'Procast'
+  version: '$1'
+
+# DeviantArt (https://apps.apple.com/us/app/deviantart/id925219396)
+- regex: 'DeviantArt/([\d\.]+)'
+  name: 'DeviantArt'
+  version: ''
+
+# Discord (https://apps.apple.com/us/app/discord-talk-chat-hang-out/id985746746)
+- regex: 'discord/([\d\.]+).+Electron'
+  name: 'Discord'
+  version: '$1'
+
+- regex: 'discord(?:-Updater)?/([\d\.]+)'
+  name: 'Discord'
+  version: ''
+
+# Covenant Eyes (https://apps.apple.com/us/app/covenant-eyes/id335318146)
+- regex: 'Covenant%20Eyes/([\d\.]+)'
+  name: 'Covenant Eyes'
+  version: '$1'
+
+# HP Smart (https://apps.apple.com/us/app/hp-smart/id469284907)
+- regex: 'HP%20Smart/([\d\.]+)'
+  name: 'HP Smart'
+  version: ''
+
+# Bitsboard (https://apps.apple.com/us/app/bitsboard-flashcards-games/id516842210)
+- regex: 'Bitsboard/([\d\.]+)'
+  name: 'Bitsboard'
+  version: '$1'
+
+# BetBull (https://apps.apple.com/us/app/betbull-sport-tips-casino/id1032680895)
+- regex: 'Betbull/([\d\.]+)'
+  name: 'BetBull'
+  version: ''
+
+# U-Cursos (https://apps.apple.com/us/app/u-cursos/id834515435)
+- regex: 'U-Cursos/([\d\.]+)'
+  name: 'U-Cursos'
+  version: ''
+
+# https://apps.apple.com/mt/app/1password-password-manager/id568903335
+- regex: '1PasswordThumbs/([\d\.]+)'
+  name: '1Password'
+  version: '$1'
+
+- regex: '(?:Microsoft Office )?(Access|Excel|OneDrive for Business|OneNote|PowerPoint|Project|Publisher|Visio|Word)[ /]([\d\.]+)'
+  name: 'Microsoft Office $1'
+  version: '$2'
+
+# https://apps.apple.com/us/app/microsoft-onedrive/id477537958
+- regex: 'OneDriveiOSApp/([\d\.]+)'
+  name: 'Microsoft OneDrive'
+  version: '$1'
+
+- regex: 'Microsoft Office Mobile/([\d\.]+)'
+  name: 'Microsoft Office Mobile'
+  version: '$1'
+
+# Skype
+- regex: 'Skype/([\d\.]+)'
+  name: 'Skype'
+  version: '$1'
+
+- regex: 'OC/([\d\.]+) \(Skype for Business\)'
+  name: 'Skype for Business'
+  version: '$1'
+
+# https://apps.apple.com/us/app/skype-for-business/id605841731
+- regex: 'iPhoneLync/([\d\.]+)'
+  name: 'Skype for Business'
+  version: '$1'
+
+# GroupMe (https://apps.apple.com/us/app/groupme/id392796698)
+- regex: 'GroupMe/([\d\.]+)'
+  name: 'GroupMe'
+  version: '$1'
+
+# TikTok (https://apps.apple.com/app/id835599320 | https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically)
+- regex: '(?:TikTok[/ ]|musical_ly_|AppName/musical_ly app_version/)(\d+\.(?:[\.\d]+))?'
+  name: 'TikTok'
+  version: '$1'
+
+# https://apps.apple.com/app/id393499958
+- regex: 'NAVER/(\d+[\.\d]+) CFNetwork'
+  name: 'Naver'
+  version: '$1'
+
+# https://apps.apple.com/app/id1026349850
+- regex: 'Copied/(\d+[\.\d]+) CFNetwork'
+  name: 'Copied'
+  version: ''
+
+# https://apps.apple.com/app/id448639966
+- regex: 'Pic%20Collage/(\d+[\.\d]+) CFNetwork'
+  name: 'Pic Collage'
+  version: '$1'
+
+# https://apps.apple.com/app/id506003812
+- regex: 'Papers/(\d+[\.\d]+) CFNetwork'
+  name: 'Papers'
+  version: '$1'
+
+# https://apps.apple.com/app/id331787573
+- regex: 'RoboForm/(\d+[\.\d]+) CFNetwork'
+  name: 'RoboForm'
+  version: ''
+
+# https://apps.apple.com/app/id618783545
+- regex: 'Slack/(\d+[\.\d]+) CFNetwork'
+  name: 'Slack'
+  version: ''
+- regex: 'com.tinyspeck.chatlyio/(\d+[\.\d]+)'
+  name: 'Slack'
+  version: '$1'
+
+# https://apps.apple.com/us/app/id362057947
+- regex: 'KAKAOTALK (\d+\.(?:[\.\d]+))?'
+  name: 'KakaoTalk'
+  version: '$1'
+
+# https://apps.apple.com/us/app/shopee-t%E1%BA%BFt-sale-27-01/id959841449
+- regex: 'ShopeeVN/([\d\.]+)'
+  name: 'Shopee'
+  version: '$1'
+
+# https://apps.apple.com/us/app/sport1/id1185932089
+- regex: 'SPORT1/([\d\.]+)'
+  name: 'SPORT1'
+  version: ''
+
+# https://apps.apple.com/us/app/clovia-lingerie-shopping-app/id1243996857
+- regex: 'Clovia/([\d\.]+)'
+  name: 'Clovia'
+  version: '$1'
+
+# https://apps.apple.com/us/app/showme-interactive-whiteboard/id445066279
+- regex: 'ShowMe/([\d\.]+)'
+  name: 'ShowMe'
+  version: '$1'
+
+# https://apps.apple.com/us/app/wattpad-read-write-stories/id306310789
+- regex: 'Wattpad/([\d\.]+)'
+  name: 'Wattpad'
+  version: '$1'
+
+# https://apps.apple.com/us/app/the-wall-street-journal/id364387007
+- regex: 'WSJ/([\d\.]+)'
+  name: 'The Wall Street Journal'
+  version: ''
+
+# https://apps.apple.com/us/app/wh-question-cards-pro-who-what-when-where-why/id544870563
+- regex: 'WH%20Questions/([\d\.]+)'
+  name: 'WH Questions'
+  version: '$1'
+
+# https://apps.apple.com/us/app/whisper-share-express-meet/id506141837
+- regex: 'whisper/([\d\.]+)'
+  name: 'Whisper'
+  version: ''
+
+# https://apps.apple.com/us/app/opal-travel/id941006607
+- regex: 'Opal/([\d\.]+)'
+  name: 'Opal Travel'
+  version: '$1'
+
+# https://apps.apple.com/us/app/zalo/id579523206
+- regex: 'Zalo/([\d\.]+)'
+  name: 'Zalo'
+  version: '$1'
+
+# https://apps.apple.com/us/app/%D1%8F%D0%BD%D0%B4%D0%B5%D0%BA%D1%81/id1050704155
+- regex: 'Yandex/([\d\.]+)'
+  name: 'Yandex'
+  version: ''
+
+- regex: 'Zoho%20Chat/([\d\.]+)'
+  name: 'Zoho Chat'
+  version: '$1'
+
+# Thunder (https://xl11.xunlei.com/)
+- regex: 'Thunder/(\d+[\.\d]+)'
+  name: 'Thunder'
+  version: '$1'
+
+# CGN (https://www.cgn.it/)
+- regex: 'CGNBrowser/(\d+[\.\d]+)'
+  name: 'CGN'
+  version: '$1'
+
+# Podbean (http://podbean.com | https://play.google.com/store/apps/details?id=com.podbean.app.podcast)
+- regex: 'Podbean/.+App (\d+[\.\d]+)'
+  name: 'Podbean'
+  version: '$1'
+
+# Alexa Media Player
+- regex: 'AlexaMediaPlayer/(\d+[\.\d]+)'
+  name: 'Alexa Media Player'
+  version: '$1'
+
+# TuneIn Radio Pro
+- regex: 'TuneIn Radio Pro(?:[^/]*)/(\d+[\.\d]+)'
+  name: 'TuneIn Radio Pro'
+  version: '$1'
+- regex: 'TuneIn(?: Radio(?:[^/]*))?/(\d+[\.\d]+)'
+  name: 'TuneIn Radio'
+  version: '$1'
+
+# Podcaster
+- regex: 'Podcaster/(\d+[\.\d]+)'
+  name: 'Podcaster'
+  version: '$1'
+
+# DevCasts (https://apps.apple.com/app/id1481596184)
+- regex: 'devcasts/(\d+[\.\d]+)'
+  name: 'DevCasts'
+  version: '$1'
+
+# Swoot
+- regex: 'Swoot/(\d+[\.\d]+)'
+  name: 'Swoot'
+  version: '$1'
+
+# RadioPublic (https://play.google.com/store/apps/details?id=com.radiopublic.android)
+- regex: 'RadioPublic/android-(\d+[\.\d]+)'
+  name: 'RadioPublic'
+  version: '$1'
+
+# Podimo (https://play.google.com/store/apps/details?id=com.podimo)
+- regex: 'Podimo/(\d+[\.\d]+)'
+  name: 'Podimo'
+  version: '$1'
+
+# Evolve Podcast (https://apps.apple.com/us/app/id1199070742)
+- regex: 'com.evolve.podcast/(\d+[\.\d]+)'
+  name: 'Evolve Podcast'
+  version: '$1'
+
+- regex: ' Rocket.Chat\+?/(\d+[\.\d]+)'
+  name: 'Rocket Chat'
+  version: '$1'
+
+# Pandora
+- regex: '^Pandora Audio.+Android'
+  name: 'Pandora'
+  version: ''
+
+# NPR One https://play.google.com/store/apps/details?id=org.npr.one
+- regex: '^NPROneAndroid'
+  name: 'NPR One'
+  version: ''
+
+# Wirtschafts Woche Nachrichte https://apps.apple.com/de/app/wirtschaftswoche-nachrichten/id1339187646
+- regex: '^WirtschaftsWoche-iOS-(\d+[\.\d]+)'
+  name: 'Wirtschafts Woche'
+  version: '$1'
+
+- regex: '^TVirl/(\d+[\.\d]+)'
+  name: 'TVirl'
+  version: '$1'
+
+# ChMate https://play.google.com/store/apps/details?id=jp.co.airfront.android.a2chMate
+- regex: '2?chMate/(\d+[\.\d]+)'
+  name: 'ChMate'
+  version: '$1'
+
+# 2tch https://apps.apple.com/jp/app/2tch/id305982914
+- regex: '2tch/(\d+[\.\d]+)'
+  name: '2tch'
+  version: '$1'
+
+# Ciisaa https://play.google.com/store/apps/details?id=com.gmail.aosoan.ciisaa
+- regex: 'Ciisaa/(\d+[\.\d]+)'
+  name: 'Ciisaa'
+  version: '$1'
+
+# BB2C https://itunes.apple.com/us/app/bb2c/id298820042?mt=8
+- regex: 'BB2C (\d+[\.\d]+)'
+  name: 'BB2C'
+  version: '$1'
+
+# twinkle https://itunes.apple.com/app/twinkle/id463142843
+- regex: 'twinkle/(\d+[\.\d]+)'
+  name: 'twinkle'
+  version: '$1'
+
+# JaneStyle https://apps.apple.com/app/id1157926535
+- regex: 'JaneStyle_iOS/(\d+[\.\d]+)'
+  name: 'JaneStyle'
+  version: '$1'
+
+# Binance https://play.google.com/store/apps/details?id=com.binance.dev
+- regex: 'BNC/.+\(Android (\d+[\.\d]+)\)'
+  name: 'Binance'
+  version: '$1'
+
+# Binance (https://www.binance.com/en/desktop-download)
+- regex: 'Binance/(\d+[\.\d]+)'
+  name: 'Binance'
+  version: '$1'
+
+# My World https://apps.apple.com/app/id598556821
+- regex: 'ru\.mail\.my/(\d+[\.\d]+)'
+  name: 'My World'
+  version: '$1'
+
+# Odnoklassniki https://play.google.com/store/apps/details?id=ru.ok.android https://apps.apple.com/app/id398465290
+- regex: 'OK(?:Android|iOS)/([\d\.]+)'
+  name: 'Odnoklassniki'
+  version: '$1'
+
+# YakYak https://github.com/yakyak/yakyak
+- regex: 'yakyak/(\d+[\.\d]+)'
+  name: 'YakYak'
+  version: '$1'
+
+# Microsoft Teams (https://www.microsoft.com/en/microsoft-teams/group-chat-software)
+- regex: 'Teams/(\d+[\.\d]+)'
+  name: 'Teams'
+  version: '$1'
+
+- regex: 'TeamsMobile-(?:Android|iOS)'
+  name: 'Teams'
+  version: ''
+
+# Streamlabs OBS (https://streamlabs.com/)
+- regex: 'StreamlabsOBS/(\d+[\.\d]+)'
+  name: 'Streamlabs OBS'
+  version: '$1'
+
+# Blitz (https://blitz.gg/)
+- regex: 'Blitz/([\d\.]+)'
+  name: 'Blitz'
+  version: '$1'
+
+# OfferUp (https://play.google.com/store/apps/details?id=com.offerup)
+- regex: 'OfferUp/([\d\.]+)'
+  name: 'OfferUp'
+  version: '$1'
+
+# Vuhuv (https://play.google.com/store/apps/details?id=com.vuhuv)
+- regex: 'Vuhuv/([\d\.]+)'
+  name: 'Vuhuv'
+  version: '$1'
+
+- regex: '.+/(?:gfibertv|gftv200)-([\d]+)-'
+  name: 'Google Fiber TV'
+  version: '$1'
+
+# QuickCast (https://play.google.com/store/apps/details?id=com.wukongtv.wkcast.intl)
+- regex: 'QuickCast$'
+  name: 'QuickCast'
+  version: ''
+
+# AliExpress (https://play.google.com/store/apps/details?id=com.alibaba.aliexpresshd)
+- regex: 'Aliexpress(?:Android)?/([\d\.]+)'
+  name: 'AliExpress'
+  version: '$1'
+
+# Blue Proxy (https://play.google.com/store/apps/details?id=com.udicorn.proxy)
+- regex: 'Blue Proxy/([\d\.]+)'
+  name: 'Blue Proxy'
+  version: '$1'
+
+# https://www.n-tv.de/
+- regex: 'ntvmobil/'
+  name: 'NTV Mobil'
+  version: ''
+
+# COAF SMART Citizen (https://apps.apple.com/app/id1478339047)
+- regex: 'COAF%20SMART%20Citizen/'
+  name: 'COAF SMART Citizen'
+  version: ''
+
+# GitHub Desktop (https://desktop.github.com/)
+- regex: 'GitHubDesktop/([\d\.]+)'
+  name: 'GitHub Desktop'
+  version: '$1'
+
+# Logi Options+ (https://www.logitech.com/en-us/software/logi-options-plus.html)
+- regex: 'logioptionsplus/([\d\.]+)'
+  name: 'Logi Options+'
+  version: '$1'
+
+# Emby Theater (https://emby.media/emby-theater.html)
+- regex: 'EmbyTheater/([\d\.]+)'
+  name: 'Emby Theater'
+  version: '$1'
+
+# Y8 Browser (https://www.y8.com/)
+- regex: 'y8-browser/([\d\.]+)'
+  name: 'Y8 Browser'
+  version: '$1'
+
+# NuMuKi Browser (https://www.numuki.com/app-download/)
+- regex: 'NuMuKiBrowser/([\d\.]+)'
+  name: 'NuMuKi Browser'
+  version: '$1'
+
+# Landis+Gyr AIM Browser (https://www.landisgyr.eu/product/gridstream-aim/)
+- regex: 'LandisGyrAIMbrowser/(\d+[\.\d]+)'
+  name: 'Landis+Gyr AIM Browser'
+  version: '$1'
+
+# Visual Studio Code (https://code.visualstudio.com/)
+- regex: 'Code/(\d+[\.\d]+)'
+  name: 'Visual Studio Code'
+  version: '$1'
+
+# Wireshark (https://www.wireshark.org)
+- regex: 'Wireshark/(\d+[\.\d]+)'
+  name: 'Wireshark'
+  version: '$1'
+
+# Samsung Magician (https://www.samsung.com/semiconductor/minisite/ssd/product/consumer/magician/)
+- regex: 'Magician'
+  name: 'Samsung Magician'
+  version: ''
+
+# Razer Synapse (https://www.razer.com/synapse-3)
+- regex: 'Razer Central PC'
+  name: 'Razer Synapse'
+  version: ''
+
+# Git (https://git-scm.com/download/win)
+- regex: 'git/(\d+[\.\d]+)'
+  name: 'Git'
+  version: '$1'
+
+# Google Podcasts (https://apps.apple.com/us/app/google-podcasts/id1398000105)
+- regex: 'GooglePodcasts/(\d+[\.\d]+)'
+  name: 'Google Podcasts'
+  version: '$1'
+
+# Windows CryptoAPI (https://www.microsoft.com/en-us/)
+- regex: 'Microsoft-CryptoAPI/(\d+[\.\d]+)'
+  name: 'Windows CryptoAPI'
+  version: ''
+
+# Windows Delivery Optimization (https://www.microsoft.com/en-us/)
+- regex: 'Microsoft-Delivery-Optimization'
+  name: 'Windows Delivery Optimization'
+  version: ''
+
+# Windows Update Agent (https://www.microsoft.com/en-us/)
+- regex: 'Windows-Update-Agent'
+  name: 'Windows Update Agent'
+  version: ''
+
+# Dr. Watson (https://www.microsoft.com/en-us/)
+- regex: '^MSDW'
+  name: 'Dr. Watson'
+  version: ''
+
+# qBittorrent (https://www.qbittorrent.org/)
+- regex: 'qBittorrent/(\d+[\.\d]+)'
+  name: 'qBittorrent'
+  version: '$1'
+
+# CPU-Z (https://www.cpuid.com/)
+- regex: '^CPUID'
+  name: 'CPU-Z'
+  version: ''
+
+# AIDA64 (https://www.aida64.com/)
+- regex: 'AIDA64'
+  name: 'AIDA64'
+  version: ''
+
+# HandBrake (https://handbrake.fr/)
+- regex: 'HandBrake Win Upd (\d+[\.\d]+)'
+  name: 'HandBrake'
+  version: '$1'
+
+# CCleaner (https://www.ccleaner.com/)
+- regex: 'CCleaner, (\d+[\.\d]+)'
+  name: 'CCleaner'
+  version: '$1'
+
+# Edge Update (https://www.microsoft.com/en-us/)
+- regex: 'Microsoft Edge Update/(\d+[\.\d]+)'
+  name: 'Edge Update'
+  version: '$1'
+
+# Chrome Update (https://www.google.com/chrome/)
+- regex: 'Google(?:Software| )Update/(\d+[\.\d]+)'
+  name: 'Chrome Update'
+  version: '$1'
+
+# Bose Music (https://apps.apple.com/us/app/bose-music/id1364986984)
+- regex: 'Bose Music'
+  name: 'Bose Music'
+  version: ''
+
+# HikConnect (https://apps.apple.com/us/app/hik-connect-for-end-user/id1087803190)
+- regex: 'HikConnect'
+  name: 'Hik-Connect'
+  version: ''
+
+# Cortana (https://www.microsoft.com/en-us/)
+- regex: 'Cortana (\d+[\.\d]+)'
+  name: 'Cortana'
+  version: '$1'
+
+# Opera News (https://play.google.com/store/apps/details?id=com.opera.app.news)
+- regex: 'Opera News/(\d+[\.\d]+)'
+  name: 'Opera News'
+  version: '$1'
+
+# Adobe Creative Cloud (https://apps.apple.com/us/app/adobe-creative-cloud/id852473028)
+- regex: 'CreativeCloud/(\d+[\.\d]+)'
+  name: 'Adobe Creative Cloud'
+  version: '$1'
+
+# rekordbox (https://rekordbox.com/en/)
+- regex: 'rekordbox/(\d+[\.\d]+)'
+  name: 'rekordbox'
+  version: '$1'
+
+# Windows Push Notification Services (https://www.microsoft.com/en-us/)
+- regex: 'Microsoft-WNS/(\d+[\.\d]+)'
+  name: 'Windows Push Notification Services'
+  version: '$1'
+
+# Background Intelligent Transfer Service (https://www.microsoft.com/en-us/)
+- regex: 'Microsoft BITS/(\d+[\.\d]+)'
+  name: 'Background Intelligent Transfer Service'
+  version: '$1'
+
+# ESET Remote Administrator (https://www.eset.com/me/business/remote-management/remote-administrator/)
+- regex: 'ERA Agent Update'
+  name: 'ESET Remote Administrator'
+  version: ''
+
+# Epic Games Launcher (https://www.epicgames.com/store/en-US/download)
+- regex: 'EpicGamesLauncher/(\d+[\.\d]+)'
+  name: 'Epic Games Launcher'
+  version: '$1'
+
+# WebDAV (https://www.microsoft.com/en-us/)
+- regex: 'Microsoft-WebDAV-MiniRedir'
+  name: 'WebDAV'
+  version: ''
+
+# Battle.net  (https://eu.shop.battle.net/en-us)
+- regex: 'Battle.net/(\d+[\.\d]+)'
+  name: 'Battle.net'
+  version: '$1'
+
+# Bookshelf (https://play.google.com/store/apps/details?id=com.vitalsource.bookshelf)
+- regex: 'Bookshelf-Android/(\d+[\.\d]+)'
+  name: 'Bookshelf'
+  version: '$1'
+
+# Rave Social (https://www.ravesocial.com/)
+- regex: 'RaveSocial/(\d+[\.\d]+)'
+  name: 'Rave Social'
+  version: '$1'
+
+# Word Cookies! (https://apps.apple.com/us/app/word-cookies/id1153883316)
+- regex: 'wordcookies/(\d+[\.\d]+)'
+  name: 'Word Cookies!'
+  version: '$1'
+
+# Bible KJV (https://apps.apple.com/us/app/bible-kjv/id544098932)
+- regex: 'com.meevii.bibleKJV/(\d+[\.\d]+)'
+  name: 'Bible KJV'
+  version: '$1'
+
+# MetaTrader (https://www.metatrader5.com/)
+- regex: 'MetaTrader 5 Terminal/(\d+[\.\d]+)'
+  name: 'MetaTrader'
+  version: '$1'
+
+# Paint by Number (https://apps.apple.com/us/app/paint-by-number-coloring-games/id1420058690)
+- regex: 'com.paint.bynumber/(\d+[\.\d]+)'
+  name: 'Paint by Number'
+  version: '$1'
+
+# ZEPETO (https://apps.apple.com/app/id1350301428)
+- regex: 'zepeto_global/(\d+[\.\d]+)'
+  name: 'ZEPETO'
+  version: '$1'
+
+# Jungle Disk (https://www.jungledisk.com/)
+- regex: 'Jungle Disk Workgroup HTTP'
+  name: 'Jungle Disk'
+  version: ''
+
+# Nextcloud (https://play.google.com/store/apps/details?id=com.nextcloud.client)
+- regex: '(?:mirall|Nextcloud-android)/(\d+[\.\d]+)'
+  name: 'Nextcloud'
+  version: '$1'
+
+# GoNative (https://gonative.io/)
+- regex: 'GoNativeIOS/(\d+[\.\d]+)'
+  name: 'GoNative'
+  version: '$1'
+
+# Pandora (https://apps.apple.com/us/app/pandora-music-podcasts/id284035177)
+- regex: 'Pandora/(\d+[\.\d]+)'
+  name: 'Pandora'
+  version: '$1'
+
+# Blackboard (https://apps.apple.com/us/app/blackboard/id950424861)
+- regex: 'Blackboard/(\d+[\.\d]+)'
+  name: 'Blackboard'
+  version: '$1'
+
+- regex: 'Blackboard/unspecified'
+  name: 'Blackboard'
+  version: ''
+
+# QQMusic (https://apps.apple.com/cn/app/qq%E9%9F%B3%E4%B9%90-%E5%90%AC%E6%88%91%E6%83%B3%E5%90%AC/id414603431)
+- regex: 'QQMusic/(\d+[\.\d]+)'
+  name: 'QQMusic'
+  version: '$1'
+
+# eToro (https://www.etoro.com/)
+- regex: 'etoro-cordova-app'
+  name: 'eToro'
+  version: ''
+
+# Avid Link (https://www.avid.com/products/avid-link)
+- regex: 'Avid Link Desktop App/(\d+[\.\d]+)'
+  name: 'Avid Link'
+  version: '$1'
+
+# Netflix (https://www.netflix.com/)
+- regex: 'Netflix/(\d+[\.\d]+)'
+  name: 'Netflix'
+  version: '$1'
+
+# Google Tag Manager (https://www.google.com/)
+- regex: 'GoogleTagManager/(\d+[\.\d]+)'
+  name: 'Google Tag Manager'
+  version: '$1'
+
+# Adobe Synchronizer (https://www.adobe.com/)
+- regex: 'Adobe Synchronizer (\d+[\.\d]+)'
+  name: 'Adobe Synchronizer'
+  version: '$1'
+
+# BlueStacks (https://www.bluestacks.com/)
+- regex: 'BlueStacks(?: 5)?/(\d+[\.\d]+)'
+  name: 'BlueStacks'
+  version: '$1'
+
+# PowerShell (https://www.microsoft.com/en-us/)
+- regex: 'WindowsPowerShell/(\d+[\.\d]+)'
+  name: 'PowerShell'
+  version: '$1'
+
+# GlobalProtect (https://www.paloaltonetworks.com/products/globalprotect)
+- regex: 'PAN GlobalProtect/(\d+[\.\d]+)'
+  name: 'GlobalProtect'
+  version: '$1'
+
+# Theyub
+- regex: 'Theyub v(\d+[\.\d]+)'
+  name: 'Theyub'
+  version: '$1'
+
+# BBC News
+- regex: 'BBCNewsUKWatchApp/(\d+[\.\d]+)'
+  name: 'BBC News'
+  version: '$1'
+
+# TradingView (https://www.tradingview.com/)
+- regex: 'TradingView/(\d+[\.\d]+)'
+  name: 'TradingView'
+  version: '$1'
+
+# Instabridge (https://instabridge.com/en/)
+- regex: 'Instabridge'
+  name: 'Instabridge'
+  version: ''
+
+# Be Focused (https://apps.apple.com/app/id973130201)
+- regex: 'Be Focused/(\d+\.[\.\d]+)?'
+  name: 'Be Focused'
+  version: '$1'
+
+# Focus Matrix (https://apps.apple.com/app/id1087284172)
+- regex: 'Focus Matrix/(\d+\.[\.\d]+)?'
+  name: 'Focus Matrix'
+  version: '$1'
+
+# Focus Keeper (https://apps.apple.com/app/id867374917)
+- regex: 'Focuskeeper/(\d+\.[\.\d]+)?'
+  name: 'Focus Keeper'
+  version: '$1'
+
+# Quick Search TV (https://play.google.com/store/apps/details?id=com.aospstudio.tvsearch)
+- regex: 'Quick Search TV/(\d+\.[\.\d]+)'
+  name: 'Quick Search TV'
+  version: '$1'
+
+# Microsoft Store (https://www.microsoft.com/en-us/store/apps/windows)
+- regex: 'WindowsStoreSDK'
+  name: 'Microsoft Store'
+  version: ''
+
+# ASUS Updater (https://www.asus.com/)
+- regex: 'Asus Update/(\d+\.[\.\d]+)'
+  name: 'ASUS Updater'
+  version: '$1'
+
+# IMO.IM HD Version https://play.google.com/store/apps/details?id=com.imo.android.imoimhd
+- regex: 'imoAndroid/(20\d{2}.[\.\d]+)'
+  name: 'IMO HD Video Calls & Chat'
+  version: '$1'
+
+# IMO.IM https://play.google.com/store/apps/details?id=com.imo.android.imoim
+- regex: 'imoAndroid/(\d+\.[\.\d]+)'
+  name: 'IMO International Calls & Chat'
+  version: '$1'
+
+# Microsoft Bing Search (https://play.google.com/store/apps/details?id=com.microsoft.bing | https://apps.apple.com/us/app/microsoft-bing-search/id345323231)
+- regex: 'BingSapphire/(\d+\.[\.\d]+)'
+  name: 'Microsoft Bing Search'
+  version: '$1'
+
+# HiSearch
+- regex: '.+HiSearch/(\d+\.[\.\d]+)'
+  name: 'HiSearch'
+  version: '$1'
+
+# RDDocuments (https://apps.apple.com/app/id364901807)
+- regex: 'RDDocuments/(\d+\.[\.\d]+)'
+  name: 'RDDocuments'
+  version: '$1'
+
+# F-Secure SAFE (https://apps.apple.com/app/f-secure-safe/id572847748)
+- regex: 'FSCDCSafe (\d+\.[\.\d]+)'
+  name: 'F-Secure SAFE'
+  version: '$1'
+
+# Twitterrific (https://apps.apple.com/us/app/twitterrific-tweet-your-way/id580311103)
+- regex: 'Twitterrific'
+  name: 'Twitterrific'
+  version: ''
+
+# Uconnect LIVE (https://apps.apple.com/it/app/uconnect-live/id881830261?l=en)
+- regex: 'UconnectLive'
+  name: 'Uconnect LIVE'
+  version: ''
+
+# Wayback Machine (https://apps.apple.com/us/app/wayback-machine/id1472432422)
+- regex: 'Wayback%20Machine%20Extension'
+  name: 'Wayback Machine'
+  version: ''
+
+# Q-municate (https://www.qmunicateh10.com | https://apps.apple.com/gb/app/q-municate/id909698517)
+- regex: 'com.Nanoteq.QmunicateH10p.+/(\d+\.[\.\d]+) \('
+  name: 'Q-municate'
+  version: '$1'
+
+# NET.mede (https://apps.apple.com/us/app/net-mede/id597007101)
+- regex: 'NET.mede'
+  name: 'NET.mede'
+  version: ''
+
+# My Bentley (https://apps.apple.com/us/app/my-bentley/id1008052243)
+- regex: 'My%20Bentley'
+  name: 'My Bentley'
+  version: ''
+
+# Skyeng (https://apps.apple.com/us/app/skyeng-english-online/id1065290732)
+- regex: 'Skyeng%20App'
+  name: 'Skyeng'
+  version: ''
+
+# Skyeng Teachers (https://apps.apple.com/us/app/skyeng-teachers/id1483049537)
+- regex: 'Skyeng%20Teachers'
+  name: 'Skyeng Teachers'
+  version: ''
+
+# Bank Millenium (https://apps.apple.com/us/app/bank-millennium/id412646128)
+- regex: '(Millennium/|Millennium%20Corp)'
+  name: 'Bank Millenium'
+  version: ''
+
+# MBolsa (https://apps.apple.com/us/app/mbolsa/id1533621499)
+- regex: 'MBolsa'
+  name: 'MBolsa'
+  version: ''
+
+# MEmpresas (https://apps.apple.com/us/app/mempresas/id669516182)
+- regex: '(MEmpresas|Millennium%20Empresas)'
+  name: 'MEmpresas'
+  version: ''
+
+# Orange Radio (https://apps.apple.com/fr/app/orange-radio/id1201284975?l=en)
+- regex: 'OrangeRadio/(\d+\.[\.\d]+)'
+  name: 'Orange Radio'
+  version: '$1'
+
+# Radio Italiane https://apps.apple.com/us/app/radio-italiane-radio-it/id1390350146)
+- regex: 'Radio%20Italiane/(\d+\.[\.\d]+)'
+  name: 'Radio Italiane'
+  version: '$1'
+
+# Safari Search Helper
+- regex: 'com.apple.Safari.SearchHelper/(\d+\.[\.\d]+)'
+  name: 'Safari Search Helper'
+  version: '$1'
+
+# Citrix Workspace (https://apps.apple.com/us/app/citrix-workspace/id363501921)
+- regex: 'Citrix%20Viewer'
+  name: 'Citrix Workspace'
+  version: ''
+
+# Mercantile Bank of Michigan (https://apps.apple.com/us/app/mercantile-bank-of-michigan/id428982831)
+- regex: 'com.mercbank.s1mobileipad'
+  name: 'Mercantile Bank of Michigan'
+  version: ''
+
+# DStream Air (https://apps.apple.com/us/app/dstream-air/id1214400521)
+- regex: 'D-Stream%20Air'
+  name: 'DStream Air'
+  version: ''
+
+# Expedia (https://apps.apple.com/us/app/expedia-hotels-flights-car/id427916203)
+- regex: 'ExpediaBookings'
+  name: 'Expedia'
+  version: ''
+
+# Windows Antivirus
+- regex: 'Windows Antivirus (\d+\.[\.\d]+)'
+  name: 'Windows Antivirus'
+  version: '$1'
+
+# Macrium Reflect (https://www.macrium.com/reflectfree)
+- regex: '^Reflect'
+  name: 'Macrium Reflect'
+  version: ''
+
+- regex: 'Opera autoupdate agent'
+  name: 'Opera Updater'
+  version: ''
+
+# Ballz (https://apps.apple.com/us/app/ballz/id1139609950)
+- regex: 'Ballz/(\d+\.[\.\d]+)'
+  name: 'Ballz'
+  version: '$1'
+
+# RNPS Action Cards
+- regex: 'rnps-action-cards/(\d+\.[\.\d]+)'
+  name: 'RNPS Action Cards'
+  version: '$1'
+
+# Plex Media Server (https://www.plex.tv/sv/media-server-downloads/)
+- regex: 'PlexMediaServer/(\d+\.[\.\d]+)'
+  name: 'Plex Media Server'
+  version: '$1'
diff --git a/priv/ua_inspector/client.pim.yml b/priv/ua_inspector/client.pim.yml
index 7a16a557d1a5236563342b81718ec83e2e8aa790..4ee4421d31c2320f4a31010cd54b8d12e44fa8cd 100644
--- a/priv/ua_inspector/client.pim.yml
+++ b/priv/ua_inspector/client.pim.yml
@@ -9,10 +9,20 @@
   name: 'Outlook Express'
   version: '$1'
 
-- regex: 'Microsoft Outlook(?:[/ ](\d+[\.\d]+))?'
+# Outlook https://apps.apple.com/ru/app/microsoft-outlook/id951937596
+- regex: '^Outlook-iOS/(?:.+\((\d+[\.\d]+)\)$)?'
   name: 'Microsoft Outlook'
   version: '$1'
 
+- regex: '(?:(?:Microsoft )?Outlook|MacOutlook)(?:[/ ](\d+[\.\d]+))?'
+  name: 'Microsoft Outlook'
+  version: '$1'
+
+# Default Mail Client for Windows
+- regex: 'WindowsMail(?:/(\d+[\.\d]+))'
+  name: 'Windows Mail'
+  version: '$1'
+
 - regex: '(?:Thunderbird|Icedove|Shredder)(?:/(\d+[\.\d]+))?'
   name: 'Thunderbird'
   version: '$1'
@@ -48,4 +58,67 @@
 # SeaMonkey
 - regex: '(?:SeaMonkey|Iceape)(?:/(\d+[\.\d]+))?'
   name: 'SeaMonkey'
-  version: '$1'
\ No newline at end of file
+  version: '$1'
+
+# Live5ch
+- regex: 'Live5ch/(\d+[\.\d]+)'
+  name: 'Live5ch'
+  version: '$1'
+
+- regex: 'JaneView/'
+  name: 'JaneView'
+  version: ''
+
+- regex: 'BathyScaphe/'
+  name: 'BathyScaphe'
+  version: ''
+
+# Raindrop.io (https://raindrop.io/)
+- regex: 'Raindrop.io/(\d+[\.\d]+)'
+  name: 'Raindrop.io'
+  version: '$1'
+
+# Franz (https://meetfranz.com/)
+- regex: 'Franz/(\d+[\.\d]+)'
+  name: 'Franz'
+  version: '$1'
+
+# Mailspring (https://www.electronjs.org/apps/mailspring)
+- regex: 'Mailspring/(\d+[\.\d]+)'
+  name: 'Mailspring'
+  version: '$1'
+
+# Notion (https://www.notion.so/)
+- regex: 'Notion/(\d+[\.\d]+)'
+  name: 'Notion'
+  version: '$1'
+
+# Basecamp (https://basecamp.com/)
+- regex: 'Basecamp[0-9]/?(\d+[\.\d]+)'
+  name: 'Basecamp'
+  version: '$1'
+
+# Evernote (https://evernote.com/)
+- regex: 'Evernote/?(\d+[\.\d]+)'
+  name: 'Evernote'
+  version: '$1'
+
+# Rambox Pro (https://rambox.app/)
+- regex: 'ramboxpro/(\d+\.[\.\d]+)?'
+  name: 'Rambox Pro'
+  version: '$1'
+
+# Mailbird (https://www.getmailbird.com/)
+- regex: 'Mailbird/(\d+\.[\.\d]+)/'
+  name: 'Mailbird'
+  version: '$1'
+
+# Yahoo Mail (https://apps.apple.com/us/app/yahoo-mail-organised-email/id577586159)
+- regex: 'Yahoo%20Mail'
+  name: 'Yahoo Mail'
+  version: ''
+
+# eM Client (https://emclient.com/)
+- regex: 'eM Client/(\d+\.[\.\d]+)'
+  name: 'eM Client'
+  version: '$1'
diff --git a/priv/ua_inspector/device.cameras.yml b/priv/ua_inspector/device.cameras.yml
index 904423b7da91f7607678de81d4097aed5feddd12..bf9676df3f515d22e384ba7c18bafe524c3a509f 100644
--- a/priv/ua_inspector/device.cameras.yml
+++ b/priv/ua_inspector/device.cameras.yml
@@ -17,12 +17,12 @@ Samsung:
   device: 'camera'
   models:
     - regex: 'EK-GN120'
-      model: 'GALAXY NX'
+      model: 'Galaxy NX'
     - regex: 'EK-GC100'
-      model: 'GALAXY Camera'
+      model: 'Galaxy Camera'
     - regex: 'EK-GC110'
-      model: 'GALAXY Camera WiFi only'
+      model: 'Galaxy Camera WiFi only'
     - regex: 'EK-GC200'
-      model: 'GALAXY Camera 2'
+      model: 'Galaxy Camera 2'
     - regex: 'EK-GC([0-9]{3})'
-      model: 'GALAXY Camera $1'
\ No newline at end of file
+      model: 'Galaxy Camera $1'
diff --git a/priv/ua_inspector/device.car_browsers.yml b/priv/ua_inspector/device.car_browsers.yml
index c5446b4b826c00bfd625d79bbc3e100c460e6130..f334fdd2838c4c675df53021a5059bb11dde2a75 100644
--- a/priv/ua_inspector/device.car_browsers.yml
+++ b/priv/ua_inspector/device.car_browsers.yml
@@ -14,3 +14,19 @@ Tesla:
       model: 'Model S'
     - regex: 'Tesla/[0-9.]+'
       model: ''
+
+# Mac Audio
+MAC AUDIO:
+  regex: 'Mac Audio Spro'
+  device: 'car browser'
+  models:
+    - regex: 'Spro'
+      model: 'S Pro'
+
+# Topway
+Topway:
+  regex: 'sp9853i_1h10_vmm'
+  device: 'car browser'
+  models:
+    - regex: 'sp9853i_1h10_vmm'
+      model: 'TS9'
diff --git a/priv/ua_inspector/device.consoles.yml b/priv/ua_inspector/device.consoles.yml
index 60047a3fbc7d117a78e2bf60e1539c364493405c..758f95f41d06f6257c5f19859d7d80f3aa38b457 100644
--- a/priv/ua_inspector/device.consoles.yml
+++ b/priv/ua_inspector/device.consoles.yml
@@ -14,8 +14,14 @@ Microsoft:
   regex: 'Xbox'
   device: 'console'
   models:
+    - regex: 'Xbox Series X'
+      model: 'Xbox Series X'
+    - regex: 'Xbox One X'
+      model: 'Xbox One X'
     - regex: 'Xbox One'
       model: 'Xbox One'
+    - regex: 'XBOX_ONE_ED'
+      model: 'Xbox One S'
     - regex: 'Xbox'
       model: 'Xbox 360'
 
@@ -35,6 +41,12 @@ Sega:
   model: 'Dreamcast'
 
 Sony:
-  regex: 'PlayStation (3|4 Pro|4|Portable|Vita)'
+  regex: 'PlayStation ?(2|3|4 Pro|4|5|Portable|Vita)'
   device: 'console'
   model: 'PlayStation $1'
+
+# Retroid Pocket (www.goretroid.com)
+Retroid Pocket:
+  regex: 'Retroid Pocket 2Plus'
+  device: 'console'
+  model: '2 Plus'
diff --git a/priv/ua_inspector/device.mobiles.yml b/priv/ua_inspector/device.mobiles.yml
index a0a964e4ba6dd14baf3bc8e398eec6c9a05d28d8..2825702dc5f9740e144fbf650771e645e34a1553 100644
--- a/priv/ua_inspector/device.mobiles.yml
+++ b/priv/ua_inspector/device.mobiles.yml
@@ -5,15 +5,23 @@
 # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
 ###############
 
-# Ace (https://www.acemobile.fr/)
+# Ace or ACE France (www.acemobile.fr)
 Ace:
-  regex: 'BUZZ 1 (?:Lite|Plus)'
-  device: 'smartphone'
-  models:
-    - regex: 'BUZZ 1 Lite'
-      model: 'Buzz 1 Lite'
-    - regex: 'BUZZ 1 Plus'
-      model: 'Buzz 1 Plus'
+  regex: '(?:BUZZ [12]|BUZZ 2|CLEVER 1|URBAN 1(?: Pro)?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'BUZZ ([12]) Lite'
+      model: 'Buzz $1 Lite'
+    - regex: 'BUZZ ([12]) Plus'
+      model: 'Buzz $1 Plus'
+    - regex: 'BUZZ ([12])'
+      model: 'Buzz $1'
+    - regex: 'CLEVER 1'
+      model: 'Clever 1'
+    - regex: 'URBAN 1 Pro'
+      model: 'Urban 1 Pro'
+    - regex: 'URBAN 1'
+      model: 'Urban 1'
 
 'Tunisie Telecom':
   regex: 'StarTrail TT(?:[);/ ]|$)'
@@ -25,16 +33,23 @@ SFR:
   regex: 'StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem|StarTab'
   device: 'smartphone'
   models:
+    - regex: 'StarXtrem II(?:[);/ ]|$)'
+      model: 'StarXtrem 2'
+    - regex: 'StarXtrem ?([3-6])(?:[);/ ]|$)'
+      model: 'StarXtrem $1'
     - regex: 'StarXtrem(?:[);/ ]|$)'
       model: 'StarXtrem' # ZTE
-    - regex: 'StarTrail ?4(?:[);/ ]|$)'
-      model: 'StarTrail 4' # ZTE Blade Q
     - regex: 'StarTrail III(?:[);/ ]|$)'
-      model: 'StarTrail 3' # ZTE
+      model: 'StarTrail 3'
     - regex: 'StarTrail II(?:[);/ ]|$)'
       model: 'StarTrail 2' # Huawei Ascend Y200
+    - regex: 'StarTrail[ _]?([1-9])[ _]([34])G(?:[);/ ]|$)' # ZTE
+      model: 'StarTrail $1 $2G'
+    - regex: 'StarTrail[ _]?([1-9])(?:[);/ ]|$)'
+      model: 'StarTrail $1'
     - regex: 'StarTrail(?:[);/ ]|$)'
       model: 'StarTrail' # ZTE
+
     - regex: 'StarShine II(?:[);/ ]|$)'
       model: 'StarShine 2' # ZTE
     - regex: 'StarShine(?:[);/ ]|$)'
@@ -55,6 +70,8 @@ SFR:
       model: 'StarText' # ZTE
     - regex: 'StarNaute II(?:[);/ ]|$)'
       model: 'StarNaute 2' # ZTE
+    - regex: 'STARNAUTE ?4(?:[);/ ]|$)'
+      model: 'StarNaute 4'
     - regex: 'StarNaute(?:[);/ ]|$)'
       model: 'StarNaute' # ZTE Amigo
     - regex: 'StarTab'
@@ -64,40 +81,92 @@ SFR:
     - regex: '((?:StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem)[^;/]*) Build'
       model: '$1'
 
-# HTC
+# Adronix
+Adronix:
+  regex: 'Adronix[ _]?(?:MT[0-9]+|X1001|Mini ?Tab ?7 ?3G)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'Adronix ?Mini ?Tab ?7 ?3G'
+      model: 'Mini Tab 7 3G'
+    - regex: 'Adronix[ _]?(MT[0-9]+|X1001)(?:[);/ ]|$)'
+      model: '$1'
+
+# HTC (htc.com)
 HTC:
-  regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV32|2PQ93|X2-HT)(?:[);/ ]|$)'
+  regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|(?<!BLU LIFE |ZOPO )One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|One Mini 2|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PS64|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV3[12]|2PQ93|X2-HT|EXODUS 1|ISW13HT|710C|U Ultra)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
-    - regex: '2PZC5(?:[);/ ]|$)'
-      model: 'U11'
+    - regex: '(?:2PZF1|U Ultra)(?:[);/ ]|$)'
+      model: 'U Ultra'
+    - regex: 'HTC[_ ](?:U-2u|U Play|2PZM3)(?:[);/ ]|$)'
+      model: 'U Play'
+    - regex: '(?:U11 plus|(?:HTC_)?2Q4D[12]00)(?:[);/ ]|$)'
+      model: 'U11 Plus'
+    - regex: 'HTC (?:U12\+|2Q55[13]00)(?:[);/ ]|$)'
+      model: 'U12 Plus'
+    - regex: 'U(1[12]) life(?:[);/ ]|$)'
+      model: 'U$1 Life'
+    - regex: '(?:U11 Eyes|2Q4R100)(?:[);/ ]|$)'
+      model: 'U11 Eyes'
     - regex: 'XV6975(?:[);/ ]|$)'
       model: 'Imagio'
     - regex: 'PG86100(?:[);/ ]|$)'
       model: 'Evo 3G'
     - regex: 'PC36100(?:[);/ ]|$)'
       model: 'Evo 4G'
-    - regex: '(?:HTV33|601HT)(?:[);/ ]|$)'
+    - regex: '(?:HTC[_ ])?(?:HTV33|601HT|2PZC100|2PZC5|U-3[uw])(?:[);/ ]|$)'
       model: 'U11'
     - regex: '(?:801e|802[wdt])'
       model: 'One'
     - regex: 'PJ83100(?:[);/ ]|$)'
       model: 'One X'
+    - regex: '(?:HTC)?One ?Mini ?2(?:[);/ ]|$)'
+      model: 'One Mini 2'
     - regex: 'X2-HT(?:[);/ ]|$)'
       model: 'One X2'
+    - regex: 'HTC 2PXH3(?:[);/ ]|$)'
+      model: 'One X10'
+    - regex: 'ISW13HT(?:[);/ ]|$)'
+      model: 'J'
     - regex: 'HTL22(?:[);/ ]|$)'
       model: 'J One'
-    - regex: 'HTL23(?:[);/ ]|$)'
+    - regex: '(?:HTL23|HTV31)(?:[);/ ]|$)'
       model: 'J Butterfly'
-    - regex: '(?:0PJA2|0PJA10)(?:[);/ ]|$)'
+    - regex: 'HTCButterflys901s(?:[);/ ]|$)'
+      model: 'Butterfly S'
+    - regex: 'One M9_Prime Camera Edition'
+      model: 'One M9 Prime Camera Edition'
+    - regex: '(?:HTC[_ ])?(?:M9pw|One M9 ?PLUS)(?:[);/ ]|$)'
+      model: 'One M9 Plus'
+    - regex: '(?:HTC[_ ]M9u|0PJA2|0PJA10|HTC One M9|HTC6535LVW)(?:[);/ ]|$)'
       model: 'One M9'
+    - regex: 'One[ _](X9|[EM]8) dual sim(?:[);/ ]|$)'
+      model: 'One $1 Dual SIM'
+    - regex: 'Desire[ _](.+) dual sim(?:[);/ ]|$)'
+      model: 'Desire $1 Dual SIM'
+    - regex: 'HTC(?: One m7|6500LVW|PN071)(?:[);/ ]|$)'
+      model: 'One M7'
+    - regex: '(?:One M8|HTC6525LVW|HTC[_ ]M8[xd]|HTC[_ ]0P6B)(?:[);/ ]|$)'
+      model: 'One M8'
+    - regex: '0PAJ5(?:[);/ ]|$)'
+      model: 'One E8'
+    - regex: 'HTC[_ ]E9x(?:[);/ ]|$)'
+      model: 'One E9'
+    - regex: 'HTC[_ ]E9pw(?:[);/ ]|$)'
+      model: 'One E9 Plus'
+    - regex: 'HTC_S9u(?:[);/ ]|$)'
+      model: 'One S9'
+    - regex: 'HTC6515LVW(?:[);/ ]|$)'
+      model: 'One Remix'
     - regex: 'X525a(?:[);/ ]|$)'
       model: 'One X+'
-    - regex: '2PQ93(?:[);/ ]|$)'
+    - regex: '(?:2PQ9(?:3|10)|HTC[_ ]A9u)(?:[);/ ]|$)'
       model: 'One A9'
     - regex: 'ADR6300'
       model: 'Droid Incredible'
+    - regex: 'HTC6435LVW'
+      model: 'Droid DNA'
     - regex: 'ADR6400L'
       model: 'ThunderBolt'
     - regex: 'ADR6410LRA'
@@ -108,27 +177,63 @@ HTC:
       model: 'Vox'
     - regex: '2PYB2'
       model: 'Bolt'
+    - regex: '2PS64|HTC6545LVW'
+      model: '10'
+    - regex: '(710C)(?:[);/ ]|$)'
+      model: 'Desire $1'
     - regex: '0PM92(?:[);/ ]|$)'
       model: 'Desire 626S'
     - regex: '0PCV1(?:[);/ ]|$)'
       model: 'Desire 510'
+    - regex: 'HTC ?D160LVW(?:PP)?(?:[);/ ]|$)'
+      model: 'Desire 530'
+    - regex: 'HTC[_ ]D310n(?:[);/ ]|$)'
+      model: 'Desire 310'
     - regex: '608t(?:[);/ ]|$)'
       model: 'Desire 608t'
+    - regex: 'HTC_(?:0P9O2|D610x)(?:[);/ ]|$)'
+      model: 'Desire 610'
+    - regex: 'HTC[_ ]?(0P4E[12])(?:[);/ ]|$)'
+      model: 'Desire 601'
+    - regex: 'HTC_?D620h(?:[);/ ]|$)'
+      model: 'Desire 620'
+    - regex: 'HTC[_ ]?(?:D626ph|D200LVWPP)(?:[);/ ]|$)'
+      model: 'Desire 626'
+    - regex: 'HTC_?(?:0P9C2|D816[xd]?)(?:[);/ ]|$)'
+      model: 'Desire 816'
+    - regex: 'HTC_?D526h(?:[);/ ]|$)'
+      model: 'Desire 526'
+    - regex: 'EXODUS 1(?:[);/ ]|$)'
+      model: 'Exodus 1'
+    - regex: 'HTC 2Q7A100(?:[);/ ]|$)'
+      model: 'U19e'
+    - regex: 'HTC Desire 10 compact(?:[);/ ]|$)'
+      model: 'Desire 10 Compact'
+    - regex: 'HTC_D10i(?:[);/ ]|$)'
+      model: 'Desire 10 Pro'
+    - regex: 'HTC[ _]10[ _]evo(?:[);/ ]|$)'
+      model: '10 Evo'
+    - regex: 'HTC Desire (.+) pro 5G(?:[);/ ]|$)'
+      model: 'Desire $1 Pro 5G'
+    - regex: 'HTC Desire (.+) pro(?:[);/ ]|$)'
+      model: 'Desire $1 Pro'
+    - regex: 'Desire 10 lifestyle(?:[);/ ]|$)'
+      model: 'Desire 10 Life Style'
 
     - regex: 'NexusHD2' # custom rom for hd2
       model: 'HD2'
-    - regex: 'HTC[ _\-]P715a'
+    - regex: 'HTC[ _-]P715a'
       device: 'tablet'
       model: 'P715a'
-    - regex: 'HTC[ _\-]Flyer Build'
+    - regex: 'HTC[ _-]Flyer Build'
       device: 'tablet'
       model: 'Flyer'
-    - regex: 'HTC[ _\-]Flyer[ _\-]([\w]{1,5})'
+    - regex: 'HTC[ _-]Flyer[ _\-]([\w]{1,5})'
       device: 'tablet'
       model: 'Flyer $1'
-    - regex: 'HTC[ _\-]One[ _\-]max(?:[);/ ]|$)'
+    - regex: 'HTC(?:[ _-])?(?:One[ _\-]max|6600LVW|0P3P7)(?:[);/ ]|$)'
       device: 'phablet'
-      model: 'One max'
+      model: 'One Max'
     - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
       model: '$1'
     - regex: 'HTC[ _]([^/;]+) Build'
@@ -142,7 +247,7 @@ HTC:
       model: '$1 (Sprint)'
     - regex: 'Sprint (APA.*) Build'
       model: '$1 (Sprint)'
-    - regex: 'HTC(?:[\-/ ])?([a-z0-9\-_]+)'
+    - regex: '(?:HTC-)?HTC(?:[\-/ ])?([a-z0-9\-_]+)'
       model: '$1'
     - regex: 'HTC;(?: )?([a-z0-9 ]+)'
       model: '$1'
@@ -154,16 +259,12 @@ HTC:
       model: '$1'
     - regex: '(ADR[a-z0-9]+)'
       model: '$1'
-    - regex: '(One M8)'
-      model: '$1'
-    - regex: '0PAJ5(?:[);/ ]|$)'
-      model: 'One E8'
     - regex: 'HTV32(?:[);/ ]|$)'
       model: '10'
 
 # microsoft
 Microsoft:
-  regex: 'KIN\.(One|Two)|RM-(?:1010|1031|106[57]|107[23467]|1089|109[02]|1096|1099|1109|111[34]|1127|1141|115[24]|994)|Microsoft; Lumia|Lumia (?:1530|1320|950|850|650|640|550|535|435)'
+  regex: 'KIN\.(One|Two)|RM-(?:1010|1031|106[57]|107[23467]|1089|109[02]|1096|1099|1109|111[348]|1127|1141|115[24]|994)|Microsoft; Lumia|Lumia (?:1530|1320|950|850|650|640|550|535|435)|Corporation/Surface|Surface Duo'
   device: 'smartphone'
   models:
     - regex: 'KIN\.(One|Two)'
@@ -176,6 +277,8 @@ Microsoft:
       model: 'Lumia 435'
     - regex: 'RM-1031|Lumia 532'
       model: 'Lumia 532'
+    - regex: 'Lumia 535 Dual SIM'
+      model: 'Lumia 535 Dual SIM'
     - regex: 'RM-109[02]|RM-1089|Lumia 535'
       model: 'Lumia 535'
     - regex: 'RM-1141|Lumia 540'
@@ -184,9 +287,18 @@ Microsoft:
       model: 'Lumia 550'
     - regex: 'RM-1010'
       model: 'Lumia 638'
+    - regex: 'Lumia 640 XL LTE'
+      model: 'Lumia 640 XL LTE'
+      device: 'phablet'
     - regex: 'RM-106[57]|RM-1096|Lumia 640 XL'
       model: 'Lumia 640 XL'
       device: 'phablet'
+    - regex: 'Lumia 640 LTE Dual SIM'
+      model: 'Lumia 640 LTE Dual SIM'
+    - regex: 'Lumia 640 LTE'
+      model: 'Lumia 640 LTE'
+    - regex: 'Lumia 640 Dual SIM'
+      model: 'Lumia 640 Dual SIM'
     - regex: 'RM-1109|RM-1113|RM-107[23467]|Lumia 640'
       model: 'Lumia 640'
     - regex: 'RM-1154|Lumia 650'
@@ -195,26 +307,43 @@ Microsoft:
       model: 'Lumia 650 SS'
     - regex: 'Lumia 850'
       model: 'Lumia 850'
+    - regex: 'Lumia 950 XL Dual SIM'
+      model: 'Lumia 950 XL Dual SIM'
+      device: 'phablet'
     - regex: 'Lumia 950 XL'
       model: 'Lumia 950 XL'
       device: 'phablet'
-    - regex: 'Lumia 950'
+    - regex: 'Lumia 950 Dual SIM'
+      model: 'Lumia 950 Dual SIM'
+    - regex: 'Lumia 950|RM-1118'
       model: 'Lumia 950'
     - regex: 'RM-994|Lumia 1320'
       model: 'Lumia 1320'
     - regex: 'Lumia 1530'
       model: 'Lumia 1530'
+    - regex: 'Surface Book 3'
+      device: 'desktop'
+      model: 'Surface Book 3'
+    - regex: 'Surface Pro( [34])?'
+      device: 'desktop'
+      model: 'Surface Pro$1'
+
+    - regex: 'Surface Duo 2'
+      device: 'tablet'
+      model: 'Surface Duo 2'
+    - regex: 'Surface Duo'
+      device: 'tablet'
+      model: 'Surface Duo'
 
     - regex: 'Microsoft; Lumia ([^;/)]+)(?:[;/)]|$)'
       model: 'Lumia $1'
 
-# NOKIA
+# NOKIA (www.nokia.com)
 Nokia:
   regex: 'Nokia(?!Browser|Webview|; GT-I8750)|Lumia|Maemo RX|portalmmm/2\.0 N7|portalmmm/2\.0 NK|nok[0-9]+|Symbian.*\s([a-z0-9]+)$|RX-51 N900|TA-[0-9]{4}|ARM; 909'
   device: 'smartphone'
   models:
     # Nokia branded phones by HMD Global
-    # 2017 Models
     - regex: 'TA-10(07|23|29|35)'
       model: '2'
     - regex: 'TA-10(20|28|32|38)'
@@ -227,35 +356,24 @@ Nokia:
       model: '7'
     - regex: 'TA-10(04|12|52)'
       model: '8'
-    # 2018 Models
-    - regex: 'Nokia 8\.1'
-      model: '8.1'
     - regex: 'Nokia 8 Sirocco'
       model: '8 Sirocco'
-    - regex: 'Nokia 7\.1'
-      model: '7.1'
     - regex: 'Nokia 7 plus'
       model: '7 plus'
     - regex: 'Nokia 6\.1 Plus'
       model: '6.1 Plus'
-    - regex: 'Nokia 6\.1'
-      model: '6.1'
     - regex: 'Nokia 5\.1 Plus'
       model: '5.1 Plus'
-    - regex: 'Nokia 5\.1'
-      model: '5.1'
     - regex: 'Nokia 3\.1 Plus'
       model: '3.1 Plus'
-    - regex: 'Nokia 3\.1'
-      model: '3.1'
-    - regex: 'Nokia 2\.1'
-      model: '2.1'
     - regex: 'Nokia 1 Plus'
       model: '1 Plus'
-    - regex: 'Nokia 1'
-      model: '1'
+    - regex: 'Nokia 2 V(?:[);/ ]|$)'
+      model: '2 V Tella'
 
     # Nokia phones
+    - regex: 'Nokia ?X2DS'
+      model: 'X2 Dual'
     - regex: 'RX-51 N900'
       model: 'N900'
     - regex: '(?: )?(Nokia500|nokiaasha500(?:dualsim)?)(?: Build|[_);/])'
@@ -342,6 +460,10 @@ Nokia:
     - regex: 'NOKIA;? 1520\.1'
       model: 'Lumia 1520.1'
 
+    - regex: 'Nokia T20'
+      device: 'tablet'
+      model: 'T20'
+
     - regex: 'Nokia ([A-Za-z0-9\. ]+)(?: Build|\))'
       model: '$1'
 
@@ -384,7 +506,7 @@ CnM:
 
 # RIM/BlackBerry
 RIM:
-  regex: 'BB10;|BlackBerry|rim[0-9]+|PlayBook|STV100-[1234]|STH100-[12]|BBA100-[12]|BBB100-[1234567]|BBC100-1|BBD100-[126]|BBE100-[123456789]|BBF100-[123456789]|BBG100-1|BBH100-1'
+  regex: 'BB10;|BlackBerry|rim[0-9]+|PlayBook|STV100-[1234]|STH100-[12]|BBA100-[12]|BBB100-[1234567]|BBD100-[126]|BB[EF]100-[123456789]|BB[CGH]100-1'
   device: 'smartphone'
   models:
     - regex: 'BBA100-[12]'
@@ -407,6 +529,8 @@ RIM:
       model: 'Evolve'
     - regex: 'BBH100-1'
       model: 'Evolve X'
+    - regex: '(?:BlackBerry )?(9000|9790)'
+      model: 'Bold $1'
     - regex: 'STV100-[1234]'
       model: 'BlackBerry Priv'
     - regex: 'STH100-[12]'
@@ -420,12 +544,57 @@ RIM:
       model: 'BlackBerry $1'
     - regex: 'rim([0-9]+)'
       model: 'BlackBerry $1'
+    - regex: '9300'
+      model: 'Curve 3G 9300'
+    - regex: '(8520|8530|9220|9320|9360)'
+      model: 'Curve $1'
+    - regex: '9630'
+      model: 'Tour 9630'
+    - regex: '9720'
+      model: '9720'
+    - regex: '(9800|9860)'
+      model: 'Torch $1'
     - regex: 'BlackBerry'
       model: 'BlackBerry'
 
+# Ghia or GHIA (www.ghia.com.mx)
+Ghia:
+  regex: 'GHIA|QS702|SVEGLIO[ _][QH]1|VECTOR10\.1|GTKIDS7[BVR]?|(?:GTA7WF|VENUS7|TREO_TAB8G)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SVEGLIO[ _]([QH]1)'
+      model: 'Sveglio $1'
+    - regex: 'QS702'
+      model: 'QS702'
+    - regex: 'GHIA_ZEUS_3G'
+      model: 'Zeus 3G'
+    - regex: 'GHIA[ _](L1)'
+      model: '$1'
+    - regex: 'GHIA_AXIS7'
+      model: 'Axis 7'
+      device: 'tablet'
+    - regex: 'VECTOR10\.1'
+      model: 'Vector 10.1"'
+      device: 'tablet'
+    - regex: 'GTA7WF'
+      device: 'tablet'
+      model: 'A7 ROJA'
+    - regex: 'TREO_TAB8G'
+      device: 'tablet'
+      model: 'TREO TAB8G'
+    - regex: 'GTKIDS7[BVR]?'
+      device: 'tablet'
+      model: 'GT KIDS 7'
+    - regex: 'VENUS7'
+      device: 'tablet'
+      model: 'VENUS 7'
+    - regex: 'GHIA[ ]?(47458)'
+      device: 'tablet'
+      model: '$1'
+
 # PALM
 Palm:
-  regex: '(?:Pre|Pixi)/(\d+)\.(\d+)|Palm|Treo|Xiino'
+  regex: '(?:Pre|Pixi)/(\d+)\.(\d+)|Palm|Treo|Xiino|PVG100(?:E_RU)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '((?:Pre|Pixi))/(\d+\.\d+)'
@@ -436,12 +605,14 @@ Palm:
       model: 'Treo $1'
     - regex: 'Tungsten'
       model: 'Tungsten'
+    - regex: 'PVG100'
+      model: 'Pepito'
     - regex: 'Xiino|Palmscape' # Browser for Palm OS only
       model: ''
 
-# HP
+# HP or Hewlett-Packard
 HP:
-  regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP (?:Pro )?Slate|HP [78]|HP 10 Plus|Compaq [7|8]|HP; [^;/)]+'
+  regex: 'Hewlett-Packard|HP/HP|HP Chromebook|HP EliteBook 820|TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP (?:Pro )?Slate|HP [78]|HP 10 Plus|Compaq [7|8]|HP; [^;/)]+'
   device: 'smartphone'
   models:
     - regex: 'HP Slate 6 Voice Tab'
@@ -473,160 +644,625 @@ HP:
       device: 'tablet'
     - regex: 'HP; ([^;/)]+)'
       model: '$1'
-    - regex: 'HP(?: )?iPAQ(?: )?([a-z0-9]+)'
+    - regex: 'HP ?iPAQ ?([a-z0-9]+)'
       model: 'iPAQ $1'
     - regex: 'webOS.*(P160U)'
       model: 'Veer'
 
+    - regex: 'HP ProBook (6560b)'
+      device: 'desktop'
+      model: 'ProBook $1'
+    - regex: 'Chromebook (11 G5|x360 11 G1 EE|13 G1)'
+      device: 'desktop'
+      model: 'Chromebook $1'
+    - regex: 'HP EliteBook 820 G2'
+      device: 'desktop'
+      model: 'EliteBook 820 G2'
+    - regex: 'Z240 Tower Workstation'
+      device: 'desktop'
+      model: 'Z240 Tower Workstation'
+
 # TiPhone
 TiPhone:
   regex: 'TiPhone ?([a-z0-9]+)'
   device: 'smartphone'
   model: '$1'
 
+# TiVo (https://www.tivo.com/)
+TiVo:
+  regex: 'TIVO[ ,]'
+  device: 'tv'
+  models:
+    - regex: 'STREAM 4K'
+      model: 'Stream 4K'
+    - regex: 'TCD8F6000'
+      model: 'TCD8F6000'
+
 # Apple
 Apple:
-  regex: '(?:iTunes-)?Apple[ _]?TV|(?:Apple-|iTunes-)?(?<!like )(?:iPad|iPhone)|iPh[0-9],[0-9]|CFNetwork|HomePod'
+  regex: '(?:iTunes-)?Apple[ _]?TV|Apple/|(?:Apple-|iTunes-)?(?<!like )(?:iPad|iPhone)|iPh(?:[0-9]|1[0-4]),[0-9]|CFNetwork|HomePod|AirPlay|Watch ?OS|Watch1,[12]|MDCR_Mac|ICRU_iP(?:ad|hone)|Mac OS X[,;]|macOS,'
   models:
     - regex: 'HomePod'
       device: 'smart speaker'
       model: 'HomePod'
+    - regex: 'AirPlay'
+      device: 'smart speaker'
+      model: ''
+
+      # specific wearable devices
+    - regex: 'Watch1,1'
+      device: 'wearable'
+      model: 'Watch 38mm'
+    - regex: 'Watch1,2'
+      device: 'wearable'
+      model: 'Watch 42mm'
+    - regex: 'Watch2,6'
+      device: 'wearable'
+      model: 'Watch Series 1 38mm'
+    - regex: 'Watch2,7'
+      device: 'wearable'
+      model: 'Watch Series 1 42mm'
+    - regex: 'Watch2,3'
+      device: 'wearable'
+      model: 'Watch Series 2 38mm'
+    - regex: 'Watch2,4'
+      device: 'wearable'
+      model: 'Watch Series 2 42mm'
+    - regex: 'Watch3,[13]'
+      device: 'wearable'
+      model: 'Watch Series 3 38mm'
+    - regex: 'Watch3,[24]'
+      device: 'wearable'
+      model: 'Watch Series 3 42mm'
+    - regex: 'Watch5,(?:9|11)'
+      device: 'wearable'
+      model: 'Watch SE 40mm'
+    - regex: 'Watch5,1[02]'
+      device: 'wearable'
+      model: 'Watch SE 44mm'
+    - regex: 'Watch([456]),[13]'
+      device: 'wearable'
+      model: 'Watch Series $1 40mm'
+    - regex: 'Watch([456]),[24]'
+      device: 'wearable'
+      model: 'Watch Series $1 44mm'
+    - regex: 'Watch6,[68]'
+      device: 'wearable'
+      model: 'Watch Series 7 41mm'
+    - regex: 'Watch6,[79]'
+      device: 'wearable'
+      model: 'Watch Series 7 45mm'
+    - regex: 'Watch'
+      device: 'wearable'
+      model: 'Watch'
+
+      # specific desktop devices
+    - regex: '(?:.+_)?MacPro1(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Pro (2006)'
+    - regex: '(?:.+_)?MacPro2(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Pro (2007)'
+    - regex: '(?:.+_)?MacPro3(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Pro (2008)'
+    - regex: '(?:.+_)?MacPro4(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Pro (2009)'
+    - regex: '(?:.+_)?MacPro5(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Pro (2010-2012)'
+    - regex: '(?:.+_)?iMac5(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac (2006)'
+    - regex: '(?:.+_)?iMac5(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac 17" (2006)'
+    - regex: '(?:.+_)?iMac6(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac 24" (2006)'
+    - regex: '(?:.+_)?iMac7(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac (2007)'
+    - regex: '(?:.+_)?iMac8(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac (2008)'
+    - regex: '(?:.+_)?iMac9(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac (2009)'
+    - regex: '(?:.+_)?iMac10(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac (2009)'
+    - regex: '(?:.+_)?iMac11(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac 27" (2009)'
+    - regex: '(?:.+_)?iMac11(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac 21.5" (2010)'
+    - regex: '(?:.+_)?iMac11(?:%2C|,)3'
+      device: 'desktop'
+      model: 'iMac 27" (2010)'
+    - regex: '(?:.+_)?iMac12(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac 21.5" (2011)'
+    - regex: '(?:.+_)?iMac12(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac 27" (2011)'
+    - regex: '(?:.+_)?iMac13(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac 21.5" (2012-2013)'
+    - regex: '(?:.+_)?iMac13(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac 27" (2012)'
+    - regex: '(?:.+_)?iMac14(?:%2C|,)[13]'
+      device: 'desktop'
+      model: 'iMac 21.5" (2013)'
+    - regex: '(?:.+_)?iMac14(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac 27" (2013)'
+    - regex: '(?:.+_)?iMac14(?:%2C|,)4'
+      device: 'desktop'
+      model: 'iMac 21.5" (2014)'
+    - regex: '(?:.+_)?iMac17(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac 27" (2015)'
+    - regex: '(?:.+_)?iMac18(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'iMac 21.5" (2017)'
+    - regex: '(?:.+_)?iMac18(?:%2C|,)3'
+      device: 'desktop'
+      model: 'iMac 27" (2017)'
+    - regex: '(?:.+_)?iMac19(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac 27" (2019)'
+    - regex: '(?:.+_)?iMac19(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac 21.5" (2019)'
+    - regex: '(?:.+_)?iMac20(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'iMac 27" (2020)'
+    - regex: '(?:.+_)?iMac21(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'iMac 24" (2021)'
+    - regex: '(?:.+_)?iMacPro1(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac Pro 27" (2017)'
+    - regex: '(?:.+_)?MacBook1(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 13" (2006)'
+    - regex: '(?:.+_)?MacBook2(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 13" (2006-2007)'
+    - regex: '(?:.+_)?MacBook3(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 13" (2007)'
+    - regex: '(?:.+_)?MacBook[45](?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 13" (2008)'
+    - regex: '(?:.+_)?MacBook5(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook 13" (2009)'
+    - regex: '(?:.+_)?MacBook6(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 13" (2009)'
+    - regex: '(?:.+_)?MacBook7(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 13" (2010)'
+    - regex: '(?:.+_)?MacBook8(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 12" (2015)'
+    - regex: '(?:.+_)?MacBook9(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook 12" (2016)'
+    - regex: '(?:.+_)?MacBookAir1(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2008)'
+    - regex: '(?:.+_)?MacBookAir2(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air (2009)'
+    - regex: '(?:.+_)?MacBookAir3(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 11" (2010)'
+    - regex: '(?:.+_)?MacBookAir3(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2010)'
+    - regex: '(?:.+_)?MacBookAir4(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 11" (2011)'
+    - regex: '(?:.+_)?MacBookAir4(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2011)'
+    - regex: '(?:.+_)?MacBookAir5(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 11" (2012)'
+    - regex: '(?:.+_)?MacBookAir5(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2012)'
+    - regex: '(?:.+_)?MacBookAir6(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 11" (2013-2014)'
+    - regex: '(?:.+_)?MacBookAir6(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2013-2014)'
+    - regex: '(?:.+_)?MacBookAir7(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 11" (2015)'
+    - regex: '(?:.+_)?MacBookAir7(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2015-2017)'
+    - regex: '(?:.+_)?MacBookAir8(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2018)'
+    - regex: '(?:.+_)?MacBookAir8(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2019)'
+    - regex: '(?:.+_)?MacBookAir9(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2020)'
+    - regex: '(?:.+_)?MacBookAir10(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Air 13" (2020)'
+    - regex: '(?:.+_)?MacBookPro1(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2006)'
+    - regex: '(?:.+_)?MacBookPro1(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 17" (2006)'
+    - regex: '(?:.+_)?MacBookPro2(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 17" (2007)'
+    - regex: '(?:.+_)?MacBookPro2(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2007)'
+    - regex: '(?:.+_)?MacBookPro[34](?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro (2008)'
+    - regex: '(?:.+_)?MacBookPro5(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2008)'
+    - regex: '(?:.+_)?MacBookPro5(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 17" (2009)'
+    - regex: '(?:.+_)?MacBookPro5(?:%2C|,)[34]'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2009)'
+    - regex: '(?:.+_)?MacBookPro5(?:%2C|,)5'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2009)'
+    - regex: '(?:.+_)?MacBookPro6(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 17" (2010)'
+    - regex: '(?:.+_)?MacBookPro6(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2010)'
+    - regex: '(?:.+_)?MacBookPro7(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2010)'
+    - regex: '(?:.+_)?MacBookPro8(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2011)'
+    - regex: '(?:.+_)?MacBookPro8(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2011)'
+    - regex: '(?:.+_)?MacBookPro8(?:%2C|,)3'
+      device: 'desktop'
+      model: 'MacBook Pro 17" (2011)'
+    - regex: '(?:.+_)?MacBookPro9(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2012)'
+    - regex: '(?:.+_)?MacBookPro9(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2012)'
+    - regex: '(?:.+_)?MacBookPro10(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2012-2013)'
+    - regex: '(?:.+_)?MacBookPro10(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2012-2013)'
+    - regex: '(?:.+_)?MacBookPro11(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2013-2014)'
+    - regex: '(?:.+_)?MacBookPro11(?:%2C|,)[23]'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2013-2014)'
+    - regex: '(?:.+_)?MacBookPro11(?:%2C|,)[45]'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2015)'
+    - regex: '(?:.+_)?MacBookPro12(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2015)'
+    - regex: '(?:.+_)?MacBookPro13(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2016)'
+    - regex: '(?:.+_)?MacBookPro13(?:%2C|,)3'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2016)'
+    - regex: '(?:.+_)?MacBookPro14(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2017)'
+    - regex: '(?:.+_)?MacBookPro14(?:%2C|,)3'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2017)'
+    - regex: '(?:.+_)?MacBookPro15(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2018-2019)'
+    - regex: '(?:.+_)?MacBookPro15(?:%2C|,)2'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2018-2019)'
+    - regex: '(?:.+_)?MacBookPro15(?:%2C|,)3'
+      device: 'desktop'
+      model: 'MacBook Pro 15" (2019)'
+    - regex: '(?:.+_)?MacBookPro15(?:%2C|,)4'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2019)'
+    - regex: '(?:.+_)?MacBookPro16(?:%2C|,)[14]'
+      device: 'desktop'
+      model: 'MacBook Pro 16" (2019)'
+    - regex: '(?:.+_)?MacBookPro16(?:%2C|,)[23]'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2020)'
+    - regex: '(?:.+_)?MacBookPro17(?:%2C|,)1'
+      device: 'desktop'
+      model: 'MacBook Pro 13" (2020)'
+    - regex: '(?:.+_)?MacBookPro18(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'MacBook Pro 16" (2021)'
+    - regex: '(?:.+_)?MacBookPro18(?:%2C|,)[34]'
+      device: 'desktop'
+      model: 'MacBook Pro 14" (2021)'
+    - regex: '(?:.+_)?Macmini1(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2006)'
+    - regex: '(?:.+_)?Macmini2(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2007)'
+    - regex: '(?:.+_)?Macmini3(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2009)'
+    - regex: '(?:.+_)?Macmini4(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2010)'
+    - regex: '(?:.+_)?Macmini5(?:%2C|,)[123]'
+      device: 'desktop'
+      model: 'Mac Mini (2011)'
+    - regex: '(?:.+_)?Macmini6(?:%2C|,)[12]'
+      device: 'desktop'
+      model: 'Mac Mini (2012)'
+    - regex: '(?:.+_)?Macmini7(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2014)'
+    - regex: '(?:.+_)?Macmini8(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2018)'
+    - regex: '(?:.+_)?Macmini9(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini (2020)'
+    - regex: '(?:.+_)?PowerMac7(?:%2C|,)2'
+      device: 'desktop'
+      model: 'Power Macintosh G5 (2003)'
+    - regex: '(?:.+_)?PowerMac7(?:%2C|,)3'
+      device: 'desktop'
+      model: 'Power Macintosh G5 (2004-2005)'
+    - regex: '(?:.+_)?PowerMac8(?:%2C|,)2'
+      device: 'desktop'
+      model: 'iMac G5 (2005)'
+    - regex: '(?:.+_)?PowerMac10(?:%2C|,)1'
+      device: 'desktop'
+      model: 'Mac Mini G4 (2005)'
+    - regex: '(?:.+_)?PowerMac12(?:%2C|,)1'
+      device: 'desktop'
+      model: 'iMac G5 (2005)'
+    - regex: '(?:.+_)?PowerBook5(?:%2C|,)6'
+      device: 'desktop'
+      model: 'PowerBook G4 (2005)'
+    - regex: '(?:.+_)?PowerBook6(?:%2C|,)7'
+      device: 'desktop'
+      model: 'iBook G4 (2005)'
 
     # specific smartphone devices
-    - regex: '(?:Apple-)?iPh(?:one)?1[C,_]1'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?1[C,_]1'
       model: 'iPhone'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?1[C,_]2'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?1[C,_]2'
       model: 'iPhone 3G'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?2[C,_]1| 3GS\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?2[C,_]1| 3GS\)$'
       model: 'iPhone 3GS'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?3[C,_][123]'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?3[C,_][123]'
       model: 'iPhone 4'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?4[C,_]1|1C2%254enohPi| 4S\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?4[C,_]1|1C2%254enohPi| 4S\)$'
       model: 'iPhone 4S'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?5[C,_][12]| 5\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?5[C,_][12]| 5\)$'
       model: 'iPhone 5'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?5[C,_][34]'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?5[C,_][34]'
       model: 'iPhone 5C'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?6[C,_][12]| 5S\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?6[C,_][12]| 5S\)$'
       model: 'iPhone 5S'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?7[C,_]1|1C2%257enohPi| 6PLUS\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?7[C,_]1|1C2%257enohPi| 6PLUS\)$'
       model: 'iPhone 6 Plus'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?7[C,_]2| 6\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?7[C,_]2| 6\)$'
       model: 'iPhone 6'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?8[C,_]2| 6SPLUS\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?8[C,_]2| 6SPLUS\)$'
       model: 'iPhone 6s Plus'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?8[C,_]1|iPhone 6s| 6S\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?8[C,_]1|iPhone[ /]6s| 6S\)$'
       model: 'iPhone 6s'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?8[C,_]4| SE\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?8[C,_]4| SE\)$'
       model: 'iPhone SE'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?9[C,_][13]| 7\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?9[C,_][13]|iphone7 | 7\)$'
       model: 'iPhone 7'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?9[C,_][24]| 7PLUS\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?9[C,_][24]| 7PLUS\)$'
       model: 'iPhone 7 Plus'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?10[C,_][14]| 8\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?10[C,_][14]| 8\)$'
       model: 'iPhone 8'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?10[C,_][25]| 8PLUS\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?10[C,_][25]| 8PLUS\)$'
       model: 'iPhone 8 Plus'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?10[C,_][36]|iPhone X| X\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?10[C,_][36]|iPhone X| X\)$'
       model: 'iPhone X'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?11[C,_][2]| XS\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?11[C,_]2| XS\)$'
       model: 'iPhone XS'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?11[C,_][46]| XSMAX\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?11[C,_][46]|iPhoneXSMax| XSMAX\)$'
       model: 'iPhone XS Max'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?11[C,_][8]| XR\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?11[C,_]8| XR\)$'
       model: 'iPhone XR'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?12[C,_][1]| 11\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?12[C,_]1|iPhone 11| 11\)$'
       model: 'iPhone 11'
       device: 'smartphone'
-    - regex: '(?:Apple-)?iPh(?:one)?12[C,_][3]| 11PRO\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?12[C,_]3| 11PRO\)$'
       model: 'iPhone 11 Pro'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?12[C,_][5]| 11PROMAX\)$'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?12[C,_]5| 11PROMAX\)$|iPhone_11_Pro_Max'
       model: 'iPhone 11 Pro Max'
       device: 'phablet'
-    - regex: '(?:Apple-)?iPh(?:one)?12[C,_][8]'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?12[C,_]8'
       model: 'iPhone SE (2020)'
       device: 'phablet'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?13[C,_]1| 12MINI\)$'
+      model: 'iPhone 12 Mini'
+      device: 'smartphone'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?13[C,_]2| 12\)$'
+      model: 'iPhone 12'
+      device: 'phablet'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?13[C,_]3| 12PRO\)$'
+      model: 'iPhone 12 Pro'
+      device: 'phablet'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?13[C,_]4| 12PROMAX\)$'
+      model: 'iPhone 12 Pro Max'
+      device: 'phablet'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?14[C,_]2| 13PRO\)$'
+      model: 'iPhone 13 Pro'
+      device: 'phablet'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?14[C,_]3| 13PROMAX\)$'
+      model: 'iPhone 13 Pro Max'
+      device: 'phablet'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?14[C,_]4| 13MINI\)$'
+      model: 'iPhone 13 Mini'
+      device: 'smartphone'
+    - regex: '(?:Apple-|.+_)?iPh(?:one)?14[C,_]5| 13\)$'
+      model: 'iPhone 13'
+      device: 'phablet'
 
     # specific tablet devices
-    - regex: '(?:Apple-)?iPad1[C,_]1'
+    - regex: '(?:Apple-|.+_)?iPad1[C,_]1'
       model: 'iPad'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad2[C,_][1234]'
+    - regex: '(?:Apple-|.+_)?iPad2[C,_][1-4]'
       model: 'iPad 2'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad2[C,_][567]'
+    - regex: '(?:Apple-|.+_)?iPad2[C,_][567]'
       model: 'iPad Mini'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad3[C,_][123]'
+    - regex: '(?:Apple-|.+_)?iPad3[C,_][123]'
       model: 'iPad 3'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad3[C,_][456]'
+    - regex: '(?:Apple-|.+_)?iPad3[C,_][456]'
       model: 'iPad 4'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad4[C,_][123]'
+    - regex: '(?:Apple-|.+_)?iPad4[C,_][123]'
       model: 'iPad Air'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad4[C,_][456]'
+    - regex: '(?:Apple-|.+_)?iPad4[C,_][456]'
       model: 'iPad Mini 2'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad4[C,_][789]'
+    - regex: '(?:Apple-|.+_)?iPad4[C,_][789]'
       model: 'iPad Mini 3'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad5[C,_][12]'
+    - regex: '(?:Apple-|.+_)?iPad5[C,_][12]'
       model: 'iPad Mini 4'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad5[C,_][34]'
+    - regex: '(?:Apple-|.+_)?iPad5[C,_][34]'
       model: 'iPad Air 2'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad6[C,_][34]'
+    - regex: '(?:Apple-|.+_)?iPad6[C,_][34]'
       model: 'iPad Pro 9.7'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad6[C,_][78]'
+    - regex: '(?:Apple-|.+_)?iPad6[C,_][78]'
       model: 'iPad Pro 12.9'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad6[C,_](?:11|12)'
+    - regex: '(?:Apple-|.+_)?iPad6[C,_](?:11|12)'
       model: 'iPad 5 9.7'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad7[C,_][12]'
+    - regex: '(?:Apple-|.+_)?iPad7[C,_][12](?:[\]);/ ]|$)'
       model: 'iPad Pro 2 12.9'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad7[C,_][34]'
+    - regex: '(?:Apple-|.+_)?iPad7[C,_][34](?:[\]);/ ]|$)'
       model: 'iPad Pro 10.5'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad7[C,_][56]'
+    - regex: '(?:Apple-|.+_)?iPad7[C,_][56](?:[\]);/ ]|$)'
       model: 'iPad 6 9.7'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad7[C,_](?:11|12)'
+    - regex: '(?:Apple-|.+_)?iPad7[C,_](?:11|12)(?:[\]);/ ]|$)'
       model: 'iPad 7 10.2'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad8[C,_][1-4]'
+    - regex: '(?:Apple-|.+_)?iPad8[C,_](?:9|10)'
+      model: 'iPad Pro 2 11"'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad13[C,_]4'
+      model: 'iPad Pro 3 11" WiFi'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad13[C,_][5-7]'
+      model: 'iPad Pro 3 11"'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad8[C,_]1[12]'
+      model: 'iPad Pro 4 12.9"'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad8[C,_][1-4]'
       model: 'iPad Pro 3 11.0'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad8[C,_][5-8]'
+    - regex: '(?:Apple-|.+_)?iPad8[C,_][5-8]'
       model: 'iPad Pro 3 12.9'
       device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad11[C,_][12]'
+      model: 'iPad Mini 5'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad11[C,_][34]'
+      model: 'iPad Air 3'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad11[C,_][67]'
+      model: 'iPad 8 10.2"'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad12[C,_]1'
+      model: 'iPad 9 10.2" WiFi'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad12[C,_]2'
+      model: 'iPad 9 10.2"'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad13[C,_]8'
+      model: 'iPad Pro 5 12.9" WiFi'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad13[C,_](?:9|10|11)'
+      model: 'iPad Pro 5 12.9"'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad13[C,_]1'
+      model: 'iPad Air 4 WiFi'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad13[C,_]2'
+      model: 'iPad Air 4'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad14[C,_]1'
+      model: 'iPad Mini 6 WiFi'
+      device: 'tablet'
+    - regex: '(?:Apple-|.+_)?iPad14[C,_]2'
+      model: 'iPad Mini 6'
+      device: 'tablet'
 
     - regex: 'Apple-?TV2[C,_]1'
       model: 'Apple TV 2'
@@ -640,17 +1276,17 @@ Apple:
     - regex: 'Apple-?TV6[C,_]2'
       model: 'Apple TV 4K'
       device: 'tv'
+    - regex: 'Apple-?TV11[C,_]1'
+      model: 'Apple TV 4K (2021)'
+      device: 'tv'
 
     - regex: '(?:iTunes-)?Apple[ _]?TV'
       model: 'Apple TV'
       device: 'tv'
-    - regex: 'HomePod'
-      model: 'HomePod'
-      device: 'smart speaker'
     - regex: 'iTunes-iPad/[0-9]+(?:\.[0-9]+)* \(([^;]+);'
       model: 'iPad $1'
       device: 'tablet'
-    - regex: '(?:Apple-)?iPad'
+    - regex: '(?:Apple-|.+_)?iPad'
       model: 'iPad'
       device: 'tablet'
     - regex: 'iTunes-iPhone/[0-9]+(?:\.[0-9]+)* \(([^;]+);'
@@ -662,22 +1298,30 @@ Apple:
 
 # micromax
 MicroMax:
-  regex: '(?:MicroMax[ \-\_]?[a-z0-9]+|Q327)|4560MMX|P70221 Build|(?:YU(?:5040|5530)|AQ5001 Canvas Power)(?:[);/ ]|$)'
+  regex: '(?:MicroMax[ \-\_]?[a-z0-9]+|Q327)|4560MMX|P70221|(?:YU(?:5040|5530)|AQ5001(?: Canvas Power)?|N8216|N8301|IN_2b|IN_Note1|ione note)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AQ5001 Canvas Power'
       model: 'Canvas Power'
     - regex: 'AQ5001'
       model: 'Canvas Juice 2'
+    - regex: 'Q465(?:[);/ ]|$)'
+      model: 'Canvas Juice 4'
+    - regex: 'E451(?:[);/ ]|$)'
+      model: 'Canvas Pulse'
     - regex: '4560MMX(?:[);/ ]|$)'
       model: '4560MMX'
-    - regex: 'E481'
+    - regex: 'IN_2b(?:[);/ ]|$)'
+      model: 'IN 2B'
+    - regex: 'E481(?:[);/ ]|$)'
       model: 'Canvas 5'
-    - regex: 'P70221 Build'
+    - regex: 'Q462(?:[);/ ]|$)'
+      model: 'Canvas 5 Lite'
+    - regex: 'P70221(?:[);/ ]|$)'
       model: 'Canvas Tab'
       device: 'tablet'
-    - regex: 'Q327'
-      model: 'Bolt'
+    - regex: 'Q(3[25]7|301|326|338)(?:[);/ ]|$)'
+      model: 'Bolt Q$1'
     - regex: 'Q417'
       model: 'Canvas Mega'
     - regex: 'Q402\+'
@@ -688,8 +1332,47 @@ MicroMax:
       model: 'YU Yureka S YU5530'
     - regex: 'Q424'
       model: 'Bolt Selfie'
+    - regex: 'Q402 ?Plus'
+      model: 'Bharat 2 Plus'
     - regex: 'Q426'
       model: 'Canvas Mega 2'
+    - regex: 'N8216'
+      model: 'Infinity N11'
+    - regex: 'N8301'
+      model: 'Infinity N12'
+    - regex: 'Q440Plus(?:[);/ ]|$)'
+      model: 'Q440 Plus'
+    - regex: 'Micromax[_ ]Q353P(?:[);/ ]|$)'
+      model: 'Q353 Plus'
+    - regex: 'Q452(?:[);/ ]|$)'
+      model: 'Spark 4G Prime'
+    - regex: 'Q4601(?:[);/ ]|$)'
+      model: 'Selfie 2 Note'
+    - regex: 'Q421(?:[);/ ]|$)'
+      model: 'Canvas Magnus HD'
+    - regex: 'E313(?:[);/ ]|$)'
+      model: 'Canvas Xpress 2'
+    - regex: 'Q413(?:[);/ ]|$)'
+      model: 'Canvas Xpress'
+    - regex: 'Q4251(?:[);/ ]|$)'
+      model: 'Vdeo 4'
+    - regex: 'Micromax C1A(?:[);/ ]|$)'
+      model: 'Canvas 1 (2018)'
+    - regex: 'C2APLS(?:[);/ ]|$)'
+      model: 'Canvas 2 Plus'
+    - regex: 'Bharat (\d)(?:[);/ ]|$)'
+      model: 'Bharat $1'
+    - regex: 'ione note(?:[);/ ]|$)'
+      model: 'iOne Note'
+    - regex: 'IN_Note1(?:[);/ ]|$)'
+      model: 'IN Note 1'
+    - regex: 'E7533(?:[);/ ]|$)'
+      model: 'IN 1b'
+
+    - regex: 'MicroMax(?:[ \-\_])?(X291|X246|X252|X458|X312)'
+      model: '$1'
+      device: 'feature phone'
+
     - regex: 'MicroMax(?:[ \-\_])?(P[a-z0-9]+)'
       model: '$1'
       device: 'tablet'
@@ -698,7 +1381,7 @@ MicroMax:
 
 # 3Q
 3Q:
-  regex: 'AC0731B|AC1024C|AC7803C|BC9710AM|EL72B|LC0720C|LC0723B|LC0725B|LC0804B|LC0808B|LC0809B|LC0810C|LC0816C|LC0901D|LC1016C|MT0724B|MT0729[BD]|MT0811B|OC1020A|RC0709B|RC0710B|RC0718C|RC0719H|RC0721B|RC0722C|RC0726B|RC0734H|RC0743H|RC0817C|RC1018C|RC1019G|RC1025F|RC1301C|RC7802F|RC9711B|RC9712C|RC9716B|RC9717B|RC9724C|RC9726C|RC9727F|RC9730C|RC9731C|TS0807B|TS1013B|VM0711A|VM1017A|RC0813C|QS9719D|QS9718C|QS9715F|QS1023H|QS0815C|QS0730C|QS0728C|QS0717D|QS0716D|QS0715C|MT7801C|TS9708B|AC0732C|MT0739D|MT0812E|(?:3Q_)?ER71B'
+  regex: 'AC0731B|AC1024C|AC7803C|BC9710AM|EL72B|LC0720C|LC0723B|LC0725B|LC0804B|LC0808B|LC0809B|LC0810C|LC0816C|LC0901D|LC1016C|MT0724B|MT0729[BD]|MT0811B|OC1020A|RC0709B|RC0710B|RC0718C|RC0719H|RC0721B|RC0722C|RC0726B|RC0734H|RC0743H|RC0817C|RC1018C|RC1019G|RC1025F|RC1301C|RC780[24]F|RC9711B|RC9712C|RC9716B|RC9717B|RC9724C|RC9726C|RC9727F|RC9730C|RC9731C|TS0807B|TS1013B|VM0711A|VM1017A|RC0813C|QS9719D|QS9718C|QS9715F|QS1023H|QS0815C|QS0730C|QS0728C|QS0717D|QS0716D|QS0715C|MT7801C|TS9708B|AC0732C|MT0739D|MT0812E|(?:3Q_)?ER71B'
   device: 'tablet'
   models:
     - regex: 'MT0724B|LC0901D|LC0816C|LC0810C|LC0809B|LC0808B|LC0804B|LC0725B|LC0723B'
@@ -715,34 +1398,48 @@ MicroMax:
       model: 'Qoo! Meta'
     - regex: 'EL72B|(?:3Q_)?ER71B'
       model: 'Qoo! Q-Book'
+    - regex: '(RC7804F)'
+      model: 'Qoo! Glaze'
 
 # 4Good
 4Good:
-  regex: '4Good[ _]|S450m [43]G|S555m 4G|S501m 3G|T700i_3G|People (?:G503|G410|GT300)|Light (?:A103|B100)'
+  regex: '4Good[ _]|S450m [43]G|S555m 4G|S501m 3G|T700i_3G|People (?:G503|G410|GT300)|Light (?:A10[34]|B100)'
   device: 'smartphone'
   models:
-    - regex: 'T700i_3G'
-      model: 'T700i 3G'
+    - regex: '(T700i|T100m)[_ ]?3G'
+      model: '$1 3G'
       device: 'tablet'
-    - regex: 'People GT300'
-      model: 'People GT300'
+    - regex: 'People (GT300|AT100)'
+      model: 'People $1'
       device: 'tablet'
     - regex: 'S555m[_ ]4G'
       model: 'People'
-    - regex: '(S(?:450m|501m)[_ ][43]G|Light (?:A103|B100)|People (?:G503|G410))'
-      model: '$1'
-    - regex: '4Good[ _]([^;/]+) Build'
+    - regex: '(S(?:450m|501m)[_ ][43]G|Light (?:A10[34]|B100)|People (?:G503|G410))'
       model: '$1'
-    - regex: '4Good[ _]([^);/ ]+)'
+    - regex: '4Good[ _]([^);/]+)(?: Build|[);])'
       model: '$1'
 
+# Acteck
+Acteck:
+  regex: 'BLECK'
+  device: 'tablet'
+  model: 'Bleck'
+
 # Alba
 Alba:
-  regex: 'Alba 57'
+  regex: 'Alba ?(?:57|4|10 TABLET|(?:[78]|10)(?:Nou|Pie))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Alba 57'
       model: '5.7'
+    - regex: 'Alba (4)'
+      model: '$1'
+    - regex: '10 TABLET'
+      device: 'tablet'
+      model: '10 Tablet'
+    - regex: 'Alba((?:[78]|10)(?:Nou|Pie))'
+      device: 'tablet'
+      model: '$1'
 
 # AllCall
 AllCall:
@@ -770,7 +1467,7 @@ AllCall:
 
 # Bravis
 Bravis:
-  regex: 'Bravis[ _]|A501 Bright|A552 JOY Max|A504 Trace|A505 JOY Plus|A503 Joy|NB(?:106M|10[1-8]|751|7[145]|8[57]1|76)|NP101|NB961|NP 104 3G|B501|N1-570 Space|Atlas A551|A512 Harmony Pro|A510_Jeans_4G|A509_Jeans|N1_550_Cruiser'
+  regex: 'Bravis[ _]|A501 Bright|A552 JOY Max|A504 Trace|A505 JOY Plus|A503 Joy|NB(?:106M|10[1-8]|751|7[145]|8[57]1|76)|NP101|NB961|NP 104 3G|B501|N1-570 Space|Atlas A551|A511 Harmony|A512 Harmony Pro|A510_Jeans_4G|A509_Jeans|N1_550_Cruiser'
   device: 'smartphone'
   models:
     - regex: 'A501 BRIGHT'
@@ -807,10 +1504,14 @@ Bravis:
       model: 'A504 Trace'
     - regex: 'A512 Harmony Pro'
       model: 'A512 Harmony Pro'
+    - regex: 'A511 Harmony'
+      model: 'A511 Harmony'
     - regex: 'A510_Jeans_4G'
       model: 'A510 Jeans 4G'
     - regex: 'A509_Jeans'
       model: 'A509 Jeans'
+    - regex: 'BRAVIS NEO'
+      model: 'A401 Neo'
     - regex: 'N1_550_Cruiser'
       model: 'N1-550 Cruiser'
     - regex: 'BRAVIS OMEGA'
@@ -819,6 +1520,8 @@ Bravis:
       model: 'Biz'
     - regex: 'BRAVIS POWER'
       model: 'Power'
+    - regex: 'BRAVIS[ _]SPARK'
+      model: 'Spark'
 
     - regex: 'BRAVIS[ _]SLIM[ _]3G'
       model: 'Slim 3G'
@@ -835,14 +1538,13 @@ Bravis:
 
     - regex: 'Bravis[_ ]([^;\)]+) Build'
       model: '$1'
-    - regex: '(NB(?:106M|10[1-8]|751|7[145]|8[57]1|76)|NP101|NB961)'
+    - regex: '(NB(?:106M|10[1-8]|75[134]|7[145]|8[57]1|76)|NP101|NB961)'
       model: '$1'
       device: 'tablet'
 
-
-# Acer
+# Acer (acer.com)
 Acer:
-  regex: 'acer|(?<!Satellite |ZTE BLADE |ImSmart |ERGO |X-Style Tab )a(?:101|110|2[10]0|211|50[10]|51[10]|70[10])(?:[);/ ]|$)|Android.*V3[67]0(?:[);/ ]|$)|Android.*Z1[23456]0 Build|Android.*Z5\d{2} Build|Android.*T0[234678] Build|Android.*S55(?:[);/ ]|$)|(?:A1-(713(HD)?|7[23]4|830|841|840FHD|81[01])|A3-A[1234][01]|B1-(7[1235-8][01](HD)?|7[23]3|7A0|8[1235]0|A71|860A)|B3-(A[125]0|A3[02]|A40FHD)|E39)(?:[);/ ]|$)|S5[12]0 Build|(DA[0-9]+HQ?L|Aspire V5-121|Chromebook 14 \(CB3-431\)|Predator G9-793|GT-810|B1-870|B3-A4[02])(?:[);/ ]|$)'
+  regex: 'acer|(?<!Satellite |ZTE BLADE |ImSmart |ERGO |X-Style Tab )(?<!Optima 7 )a(?:101|110|2[10]0|211|50[10]|51[10]|70[10])(?:[);/ ]|$)|Android.*V3[67]0(?:[);/ ]|$)|Android.*Z1[23456]0 Build|Android.*Z5\d{2} Build|Android.*T0[234678] Build|Android.*S55(?! Nova)(?:[);/ ]|$)|(?:A1-(713(HD)?|7[23]4|830|841|840(?:FHD)?|81[01])|A3-A[1234][01]|B1-(7[1235-9][01](HD)?|7[23]3|7A0|8[1235]0|A71|860A)|TPA60W|B3-(A[125]0|A3[02]|A40FHD)|E39)(?:[);/ ]|$)|S5[12]0 Build|(DA[0-9]+HQ?L|Aspire (?:V5-121|XC-704G|V5-573G|4349)|Chromebook 14 \(CB3-431\)|Predator G9-793|GT-810|B1-870|B3-A4[02]|B3-A50FHD|ET-108-11A|ATAB1021E|ACTAB721)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # smart displays
@@ -860,7 +1562,16 @@ Acer:
     - regex: 'A1-81[01]'
       model: 'Iconia A'
       device: 'tablet'
-    - regex: 'A1-84(1|0FHD)'
+    - regex: 'ATAB1021E'
+      model: 'ATAB1021E'
+      device: 'tablet'
+    - regex: 'ET-108-11A'
+      model: 'Enduro T1'
+      device: 'tablet'
+    - regex: 'TPA60W'
+      model: 'TPA60W'
+      device: 'tablet'
+    - regex: 'A1-84(1|0(?:FHD)?)'
       model: 'Iconia Tab 8'
       device: 'tablet'
     - regex: 'A1-713(HD)?'
@@ -878,7 +1589,7 @@ Acer:
     - regex: 'A3-A[34]0'
       model: 'Iconia Tab 10'
       device: 'tablet'
-    - regex: 'B1-7(?:[5678]0|30HD|A0)'
+    - regex: 'B1-7(?:[5-9]0|30HD|A0)'
       model: 'Iconia One 7'
       device: 'tablet'
     - regex: 'B1-7[123][01]|B1-A71'
@@ -890,7 +1601,7 @@ Acer:
     - regex: 'B1-8[123567]0'
       model: 'Iconia One 8'
       device: 'tablet'
-    - regex: 'B3-A([125]0|3[02]|40FHD|4[02])'
+    - regex: 'B3-A([125]0|3[02]|[45]0FHD|4[02])'
       model: 'Iconia One 10'
       device: 'tablet'
     - regex: 'A101'
@@ -908,6 +1619,12 @@ Acer:
     - regex: 'GT-810'
       model: 'Predator 8'
       device: 'tablet'
+    - regex: '(ACTAB721)'
+      model: '$1'
+      device: 'tablet'
+    - regex: 'Acer_one_8_T2'
+      model: 'One 8 T2'
+      device: 'tablet'
 
     # explicit smartphone models
     - regex: 'E39(?:[);/ ]|$)'
@@ -916,8 +1633,6 @@ Acer:
       model: 'Liquid Mini'
     - regex: 'E320(?:-orange)?(?:[);/ ]|$)'
       model: 'Liquid Express'
-    - regex: 'E310(?:[);/ ]|$)'
-      model: 'beTouch E210'
     - regex: 'Android.*V360(?:[);/ ]|$)'
       model: 'Liquid E1 Duo'
     - regex: 'Android.*V370(?:[);/ ]|$)'
@@ -974,10 +1689,10 @@ Acer:
     - regex: '(?:Acer )?(Chromebook 14)'
       model: '$1'
       device: 'desktop'
-    - regex: '(Aspire V5-121)'
+    - regex: '(Aspire (?:V5-121|XC-704G|V5-573G|A515-51G|4349))'
       model: '$1'
       device: 'desktop'
-    - regex: '(Predator G9-793)'
+    - regex: '(Predator G9-793|Aspire E5-511)'
       model: '$1'
       device: 'desktop'
 
@@ -993,7 +1708,7 @@ Acer:
 
 # Advan
 Advan:
-  regex: '(?:ADVAN (?:M4|S40)|i7U|S45E|50[46]1|5059|S50H|I7D|i55[KD]|i4U|S7D|S4Z|i5[KE]|S5E[ _]NXT|S5J\+)(?:[);/ ]|$)'
+  regex: '(?:ADVAN (?:M4|S40)|i7U|S45E|S50H|I7D|i55[KD]|i4U|S7D|S4Z|i5[KE]|S5E[ _]NXT|S5J\+|S4\+)(?:[);/ ]|$)|[ ](?:50(?:[46]1|5[89]|62)|600[24])(?: Build|\) AppleWebKit)|(?:E1C_3G)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'ADVAN M4'
@@ -1008,27 +1723,51 @@ Advan:
       model: 'I$1'
     - regex: 'i4U'
       model: 'I4U'
-    - regex: '(S45E|50[46]1|5059|S50H|I7D|S7D|S4Z|S5J\+)(?:[);/ ]|$)'
+    - regex: ' 6004(?: Build|\) AppleWebKit)'
+      model: 'G2 Pro'
+    - regex: ' 6002(?: Build|\) AppleWebKit)'
+      model: 'G3 Pro'
+    - regex: '(S45E|50[46]1|505[89]|5062|S50H|I7D|S7D|S4Z|S5J\+|S4\+)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'E1C_3G'
+      device: 'tablet'
+      model: 'E1C 3G'
 
-# Advance
+# Advance (advanceperu.com)
 Advance:
-  regex: 'Hollogram|HL6246|IntroTr3544|Tr3845'
+  regex: 'Hollogram|(?:HL(?:4936|6246|[56]575|5[67]67|9000)|IntroTr3544|Pr(?:61(?:4[56]|50)|60[27]0|5[69]50)|Tr3845|SP[345]701)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    # explicit table models
     - regex: 'IntroTr3544|Tr3845'
       model: 'Intro'
       device: 'tablet'
-    - regex: 'HL6246'
-      model: 'Hollogram HL6246'
-    - regex: 'Hollogram ([^;\)]+) Build'
+    - regex: 'SP([345]701)'
+      model: 'SmartPad SP$1'
+      device: 'tablet'
+    - regex: 'Pr(61(?:4[56]|50)|60[27]0|5[69]50)'
+      model: 'Prime PR$1'
+      device: 'tablet'
+    # explicit smartphone models
+    - regex: 'HL(4936|6246|[56]575|5[67]67|9000)'
+      model: 'Hollogram HL$1'
+    - regex: 'Hollogram ([^;/)]+)(?: Build|[;)])'
       model: 'Hollogram $1'
 
-# AGM
+# AGM (agm.tel)
 AGM:
-  regex: 'AGM ([^/;\)]+)(?: Build|\))'
+  regex: 'AGM ([^/;)]+)(?: Build|[;)])|AG[_ ]Go[_-]Tab|(?:Flair(?! \w\d)|(?<!STX )Ultra 2|Freedom Access)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'AG[_ ]Go[_-]Tab[_ ]Access(_2)?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Go Tab Access$1'
+    - regex: '(Flair|Ultra 2|Freedom Access)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'AGM A9(?:[);/ ]|$)'
+      model: 'A9'
+    - regex: 'AGM ([^/;)]+)(?: Build|[;)])'
+      model: '$1'
 
 # Airness
 Airness:
@@ -1036,24 +1775,24 @@ Airness:
   device: 'feature phone'
   model: '$1'
 
-# Aiwa
+# Aiwa (aiwa.mx)
 Aiwa:
-  regex: '(?:AW790|M300|AWM533|AW500)(?:[);/ ]|$)'
+  regex: '(?:AW790|M300(?! 4G)|AWM(?:53[39]|50[19]|561)|AW500)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AW790(?:[);/ ]|$)'
       model: 'AW790'
     - regex: 'AW500(?:[);/ ]|$)'
       model: 'AW500'
-    - regex: 'AWM533(?:[);/ ]|$)'
-      model: 'AWM533'
+    - regex: 'AWM(53[39]|50[19]|561)(?:[);/ ]|$)'
+      model: 'AWM$1'
     - regex: 'M300(?:[);/ ]|$)'
       model: 'M300'
       device: 'phablet'
 
 # Akai
 Akai:
-  regex: 'Akai[ _-]|Eco[ _]E2|Glory[ _](?:G[1235]|L[123]|O[125])|TAB-[79]8[03]0Q?|X6 METAL|AKTB-703MZ'
+  regex: 'AKAI,|Akai[ _-]|Eco[ _]E2|Glory[ _](?:G[1235]|L[123]|O[125])|TAB-[79]8[03]0Q?|X6 METAL|AKTB-703MZ'
   device: 'smartphone'
   models:
     - regex: 'TAB-([79]8[03]0Q?)'
@@ -1069,10 +1808,15 @@ Akai:
       model: 'Glory $1'
     - regex: 'Eco[ _]E2'
       model: 'Eco E2'
-    - regex: 'Akai[ _-]([^;/]+) Build'
+    - regex: 'Akai[ _-]([^;/)]+)(?: Build|[;)])'
       model: '$1'
-    - regex: 'Akai[ _-]([^;/]+)(?:[;/)]|$)'
+
+    - regex: 'AKAI,(AK3219NF)'
+      device: 'tv'
       model: '$1'
+    - regex: 'Si2157LG32'
+      device: 'tv'
+      model: ''
 
 # Arian
 Arian Space:
@@ -1088,239 +1832,281 @@ Arian Space:
     - regex: '70 ST7001RW'
       model: '70'
 
-# Alcatel
+# Alcatel (alcatelmobile.com)
 Alcatel:
-  regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034L_EEA|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU](?:_EEA|_RU)?|5003[ADG](?:_(?:EEA|RU))?|5007A|5008[DUY](?:_(?:EEA|RU))?|5009[AD](?:_RU|_EEA)?|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJ](?:_RU|_EEA)?|5025[DEG]|5026[ADJ]|5027B|5028A|5029E|5032W|5033[AEFXDJGMOTXY](?:_(?:EEA|RU))?|5034D(_RU)?|5036D|5038[ADEX]|5039[D](?:_EEA|_RU)?|5041[CD]|5042[ADEFGWX]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYU](?:_RU|_EEA)?|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY](_RU)?|5053[AKY](?:_EEA|_RU)?|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY](_RU)?|5059[ADXYZIST](_RU)?|5060D(?:_EEA|_RU)?|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI](_RU)?|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|8030Y|8050[DEGX]|8063|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9010X|9022X|9027[FTWX]|9203A|A570BL|I213|I216X|A50[13]DL|A574BL|A57[17]VL|A464BG|5028Y[_ ]EEA)(?:[);/ ]|$)|TIMXL'
+  regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|TIMXL|(?:(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[DEX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034[ADEFGLTX]|4035[ADXY]|4045[ADELX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|4087U|4114E|5001[ADJTU]|5002[ABDEFJHLMRSX]|5003[ADGU]|5006[ADG]|5007[AGUO]|5008[ADTUY]|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AJX]|5017[ABDEOX]|5019D|5022[DEX]|5023[EF]|5024[ADFIJ]|5025[DEG]|5026[ADJ]|5027B|5028[ADY]|5029[ADEFY]|5030[ADEFJMU]|5032W|5033(?:[YX]R|FP|[ADEFGJMOQSTXY])|5034D|5036D|5038[ADEX]|5039[DY]|5041[CD]|5042[ADEFGTWX]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AIUY]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY]|5053[ADKY]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADIJSTXYZ]|5060[ADJ]|5061[AKU]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADIUY]|5116J|5145A|6016[ADEX]|6025[DH]|6036[AXY]|6037[BKY]|6039[AHJKSY]|6042D|6043[AD]|6044D|6045[BFIKOXY]|6050[AFY]|6055[ABDHIKPUYZ]|6056H|6058[ADX]|6060[SXC]|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|7071[ADX]|8030Y|8050[DEGX]|8063|8088[MQX]|8094M|9001[DIX]|9002X|9003[AX]|9005X|9007[ATX]|9008[ADIJNTUX]|9009[AG]|9010X|9013[AX]|9020A|9022X|9024O|9026X|9027[FQTWX]|9029Z|9032[WXZ]|9203A|A(?:46[46]BG|57[04]BL|576CC|621BL|50[13]DL|57[17]VL)|I213|I216[AX]|(?<!\.)80(?:82|6[78]|5[12]))(?:_(?:EEA|RU|TR))?|P3[36]0X|AM-H200|4063F)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:5022[EDX]|5070D)(?:[);/ ]|$)'
+    - regex: '4087U'
+      model: '1SE Light'
+    - regex: '5022[EDX]|5070D'
       model: 'One Touch Pop Star'
-    - regex: '6044D(?:[);/ ]|$)'
+    - regex: '6044D'
       model: 'One Touch Pop Up'
-    - regex: '(?:4015[ATX]|4016A)(?:[);/ ]|$)'
+    - regex: '4015[ATX]|4016A'
       model: 'One Touch Pop C1'
-    - regex: '(?:4015[DN]|4016[DX])(?:[);/ ]|$)'
+    - regex: '4015[DN]|4016[DX]'
       model: 'One Touch Pop C1 Dual SIM'
-    - regex: '4032[AX](?:[);/ ]|$)'
+    - regex: '4032[AX]'
       model: 'One Touch Pop C2'
-    - regex: '4032[DE](?:[);/ ]|$)'
+    - regex: '4032[DE]'
       model: 'One Touch Pop C2 Dual SIM'
-    - regex: '5036D(?:[);/ ]|$)'
+    - regex: '5036D'
       model: 'One Touch Pop C5 Dual SIM'
-    - regex: '(?:7040[AFK]|7041X|7042A)(?:[);/ ]|$)'
+    - regex: '7040[AFK]|7041X|7042A'
       model: 'One Touch Pop C7'
-    - regex: '(?:7040[DE]|7041D)(?:[);/ ]|$)'
+    - regex: '7040[DE]|7041D'
       model: 'One Touch Pop C7 Dual SIM'
-    - regex: '4018[ADEFMX](?:[);/ ]|$)'
+    - regex: '4018[ADEFMX]'
       model: 'One Touch Pop D1'
-    - regex: '4035[ADXY](?:[);/ ]|$)'
+    - regex: '4035[ADXY]'
       model: 'One Touch Pop D3'
-    - regex: '5038[ADEX](?:[);/ ]|$)'
+    - regex: '5038[ADEX]'
       model: 'One Touch Pop D5'
-    - regex: '4045[AX](?:[);/ ]|$)'
+    - regex: '4045[AXL]'
       model: 'One Touch Pop 2 4"'
-    - regex: '4045[DE](?:[);/ ]|$)'
+    - regex: '4045[DE]'
       model: 'One Touch Pop 2 4" Dual SIM'
-    - regex: '5042[AFGWX](?:[);/ ]|$)'
+    - regex: '5042[AFGWX]'
       model: 'One Touch Pop 2 4.5"'
-    - regex: '5042[DE](?:[);/ ]|$)'
+    - regex: '5042[DE]'
       model: 'One Touch Pop 2 4.5" Dual SIM'
-    - regex: '(?:7043[AY]|7044[AX])(?:[);/ ]|$)'
+    - regex: '7043[AY]|7044[AX]'
       model: 'One Touch Pop 2 5"'
-    - regex: '7043[EK](?:[);/ ]|$)'
+    - regex: '7043[EK]'
       model: 'One Touch Pop 2 5" Dual SIM'
-    - regex: '50[16]5X(?:[);/ ]|$)'
+    - regex: '50[16]5X'
       model: 'One Touch Pop 3'
-    - regex: '(?:5015[AE]|5016[AJ]|5065[ADWX]|5116J)(?:[);/ ]|$)'
+    - regex: '5015[AE]|5016[AJ]|5065[ADWX]|5116J'
       model: 'One Touch Pop 3 5"'
-    - regex: '(?:5025[DEG]|5054[ADSTX])(?:[);/ ]|$)'
+    - regex: '5025[DEG]|5054[ADSTX]'
       model: 'One Touch Pop 3 5.5"'
-    - regex: '5015D(?:[);/ ]|$)'
+    - regex: '5015D'
       model: 'One Touch Pop 3 Dual SIM'
-    - regex: '5051[AEJMTWX](?:[);/ ]|$)'
+    - regex: '5051[AEJMTWX]'
       model: 'One Touch Pop 4'
-    - regex: '5051D(?:[);/ ]|$)'
+    - regex: '5051D'
       model: 'One Touch Pop 4 Dual SIM'
-    - regex: '5095[IKY](?:[);/ ]|$)'
+    - regex: '5095[IKY]'
       model: 'One Touch Pop 4S'
-    - regex: '5056[ADEGJMTUX](?:[);/ ]|$)'
+    - regex: '5056[ADEGJMTUX]'
       model: 'One Touch Pop 4+'
-    - regex: '7070X(?:[);/ ]|$)'
+    - regex: '7070X'
       model: 'One Touch Pop 4 6"'
-    - regex: '5057M(?:[);/ ]|$)'
+    - regex: '5057M'
       model: 'One Touch Pop Mirage'
-    - regex: '5050[ASXY](?:[);/ ]|$)'
+    - regex: '5050[ASXY]'
       model: 'One Touch Pop S3'
-    - regex: '7045Y(?:[);/ ]|$)'
+    - regex: '7045Y'
       model: 'One Touch Pop S7'
-    - regex: '6037[BKY](?:[);/ ]|$)'
+    - regex: '6037[BKY]'
       model: 'One Touch Idol 2'
-    - regex: '5027B(?:[);/ ]|$)'
+    - regex: '5042T'
+      model: 'One Touch Astro'
+    - regex: '5027B'
       model: 'One Touch Dawn'
-    - regex: '(?:5024[AD](?:_RU|_EEA)?|5028Y[_ ]EEA)(?:[);/ ]|$)'
-      model: '1S'
-    - regex: '5034D(_RU)?(?:[);/ ]|$)'
+    - regex: '7071[ADX]'
+      model: 'A7 XL'
+    - regex: '5002[ABDEHLMSXJ]'
+      model: '1B (2020)'
+    - regex: '(?:Alcatel_)?5008R'
+      model: 'Onyx'
+    - regex: '(?:Alcatel_)?5002R'
+      model: 'Volta'
+    - regex: '4034T'
+      model: '1E'
+    - regex: '5002F'
+      model: '1A (2020)'
+    - regex: '4063F'
+      model: '1L Plus'
+    - regex: '5034D|6056H'
       model: '3L'
-    - regex: '7040[RT](?:[);/ ]|$)'
+    - regex: 'A576CC'
+      model: 'Kora A576CC'
+    - regex: '7040[RT]'
       model: 'One Touch Fierce 2'
     - regex: '5056[NW]'
       model: 'One Touch Fierce 4'
-    - regex: '5054[NW]'
+    - regex: '5054N'
       model: 'One Touch Fierce XL'
-    - regex: '6016[AX](?:[);/ ]|$)'
+    - regex: '6042D'
+      model: 'One Touch Flash'
+    - regex: '6016[AX]'
       model: 'One Touch Idol 2 mini'
-    - regex: '6016[DE](?:[);/ ]|$)'
+    - regex: '6016[DE]'
       model: 'One Touch Idol 2 mini Dual SIM'
-    - regex: '6036[AXY](?:[);/ ]|$)'
+    - regex: '6036[AXY]'
       model: 'One Touch Idol 2 mini S'
-    - regex: '6050[AFY](?:[);/ ]|$)'
+    - regex: '6050[AFY]'
       model: 'One Touch Idol 2S'
-    - regex: '6039[AHJKY](?:[);/ ]|$)|idol3'
+    - regex: '6039[AHJKYS]|idol3'
       model: 'One Touch Idol 3'
-    - regex: '6045[BFIKOYX](?:[);/ ]|$)'
+    - regex: '6045[BFIKOYX]|AM-H200'
       model: 'One Touch Idol 3 5.5"'
-    - regex: '6055[ABDHIKPUYZ](?:[);/ ]|$)'
+    - regex: '6055[ABDHIKPUYZ]'
       model: 'One Touch Idol 4'
-    - regex: '6070K(?:[);/ ]|$)'
+    - regex: '6070K'
       model: 'One Touch Idol 4S'
-    - regex: '6058[ADX](?:[);/ ]|$)'
+    - regex: '6058[ADX]'
       model: 'One Touch Idol 5'
-    - regex: '6060S(?:[);/ ]|$)'
+    - regex: '6060[SX]'
       model: 'One Touch Idol 5S'
-    - regex: '6043[AD](?:[);/ ]|$)'
+    - regex: '(?:Alcatel_)?6060C'
+      model: 'One Touch Idol 5'
+    - regex: '6043[AD]'
       model: 'One Touch Idol X+'
-    - regex: '8030Y(?:[);/ ]|$)'
+    - regex: '8030Y'
       model: 'One Touch Hero 2'
-    - regex: '7055A(?:[);/ ]|$)'
+    - regex: '7055A'
       model: 'One Touch Hero 2C'
-    - regex: '7053D(?:[);/ ]|$)'
+    - regex: '7053D'
       model: 'One Touch X1'
-    - regex: '5065N(?:[);/ ]|$)'
+    - regex: '5065N'
       model: 'TRU'
-    - regex: 'A574BL(?:[);/ ]|$)'
+    - regex: 'A574BL'
       model: 'Raven'
-    - regex: 'A577VL(?:[);/ ]|$)'
+    - regex: 'A577VL'
       model: 'Zip'
-    - regex: 'A466BG(?:[);/ ]|$)'
+    - regex: 'A466BG'
       model: 'Pixi Unite'
-    - regex: '5056I(?:[);/ ]|$)'
+    - regex: '5056I'
       model: 'One Touch Optus X Smart'
-    - regex: 'A570BL(?:[);/ ]|$)'
+    - regex: 'A570BL'
       model: 'One Touch Pixi Avion LTE'
-    - regex: 'A571VL(?:[);/ ]|$)'
+    - regex: 'A571VL'
       model: 'One Touch Pixi Avion 4G LTE'
-    - regex: '4024[DEX](?:[);/ ]|$)'
+    - regex: '4024[DEX]'
       model: 'One Touch Pixi First'
-    - regex: 'A464BG(?:[);/ ]|$)'
+    - regex: 'A464BG'
       model: 'One Touch Pixi Glitz'
-    - regex: 'A621BL(?:[);/ ]|$)'
+    - regex: 'A621BL'
       model: 'One Touch Pixi Glory'
-    - regex: '4014D(?:[);/ ]|$)'
+    - regex: '4014D'
       model: 'One Touch Pixi 2'
-    - regex: '4009[AFIKMSX](?:[);/ ]|$)'
+    - regex: '4009[AFIKMSX]'
       model: 'One Touch Pixi 3 3.5"'
-    - regex: '4009[DE](?:[);/ ]|$)'
+    - regex: '4009[DE]'
       model: 'One Touch Pixi 3 3.5" Dual SIM'
-    - regex: '(?:4003[AJ]|4013[DEJKMX]|4014[AEKMX]|4114E)(?:[);/ ]|$)'
+    - regex: '4003[AJ]|4013[DEJKMX]|4014[AEKMX]|4114E'
       model: 'One Touch Pixi 3 4"'
-    - regex: '(?:4027[ADNX]|4028[AEJS]|5019D)(?:[);/ ]|$)'
+    - regex: '4027[ADNX]|4028[AEJS]|5019D'
       model: 'One Touch Pixi 3 4.5"'
-    - regex: '5017[ABDEOX](?:[);/ ]|$)'
+    - regex: '5017[ABDEOX]'
       model: 'One Touch Pixi 3 4.5" 4G'
-    - regex: '9002X(?:[);/ ]|$)'
+    - regex: '9002X'
       model: 'One Touch Pixi 3 7"'
       device: 'phablet'
-    - regex: '9007A(?:[);/ ]|$)'
+    - regex: '9007A'
       model: 'One Touch Pixi 3 7"'
       device: 'tablet'
-    - regex: '9007[TX](?:[);/ ]|$)'
+    - regex: '9007[TX]'
       model: 'One Touch Pixi 3 7" 4G'
       device: 'tablet'
-    - regex: '9022X(?:[);/ ]|$)'
+    - regex: '(?:9009G|9013A)'
+      model: '1T'
+      device: 'tablet'
+    - regex: '(?!<\.)8082(?:_(?:EEA|RU|TR))?(?:[);/ ]|$)'
+      model: '1T 10'
+      device: 'tablet'
+    - regex: '(?!<\.)8052(?:_(?:EEA|RU|TR))?(?:[);/ ]|$)'
+      model: 'TEKE Mini'
+      device: 'tablet'
+    - regex: '(?!<\.)8051(?:_(?:EEA|RU|TR))?(?:[);/ ]|$)'
+      model: 'Smart Tab 7" WiFi'
+      device: 'tablet'
+    - regex: '9009A'
+      model: '1T 7'
+      device: 'tablet'
+    - regex: '(?:(?!<\.)806[78]|9013X)(?:_(?:EEA|RU))?(?:[);/ ]|$)'
+      model: '1T 7.0"'
+      device: 'tablet'
+    - regex: '9022X'
       model: 'One Touch Pixi 3 8"'
       device: 'phablet'
-    - regex: '9010X(?:[);/ ]|$)'
+    - regex: '9010X'
       model: 'One Touch Pixi 3 10"'
       device: 'tablet'
-    - regex: '4017[ADEFSX](?:[);/ ]|$)'
+    - regex: '4017[ADEFSX]'
       model: 'One Touch Pixi 4 3.5"'
-    - regex: '4034(?:[ADEFGX]|L_EEA)(?:[);/ ]|$)'
+    - regex: '4034[ADEFGXL]'
       model: 'One Touch Pixi 4 4"'
-    - regex: '4060[SW](?:[);/ ]|$)'
+    - regex: '4060[SW]'
       model: 'One Touch Pixi 4 4.5"'
-    - regex: '5023[EF](?:[);/ ]|$)'
+    - regex: '5023[EF]'
       model: 'One Touch Pixi 4 Plus Power'
-    - regex: '5010[DEGSUX](?:[);/ ]|$)'
+    - regex: '5010[DEGSUX]'
       model: 'One Touch Pixi 4 5" 3G'
-    - regex: '5041D(?:[);/ ]|$)'
+    - regex: '5041D'
       model: 'One Touch Pixi 4 5.0"'
-    - regex: '5012[DFG](?:[);/ ]|$)'
+    - regex: '5012[DFG]'
       model: 'One Touch Pixi 4 5.5" 3G'
-    - regex: '(?:5045[ADFGIJTXY]|5145A)(?:[);/ ]|$)'
+    - regex: '5045[ADFGIJTXY]|5145A'
       model: 'One Touch Pixi 4 5" 4G'
-    - regex: '5098O(?:[);/ ]|$)'
+    - regex: '5098O'
       model: 'One Touch Pixi Theatre'
-    - regex: 'A501DL(?:[);/ ]|$)'
+    - regex: 'A501DL'
       model: 'A1'
-    - regex: 'A503DL(?:[);/ ]|$)'
+    - regex: 'A503DL'
       model: 'A1X'
-    - regex: '5046[ADIJTUY](?:[);/ ]|$)'
+    - regex: '(?:Alcatel_)?5004R'
+      model: 'Axel'
+    - regex: '5046[ADIJTUY]'
       model: 'A3'
-    - regex: '(?:5011A|5049[EG])(?:[);/ ]|$)'
+    - regex: '5011A|5049[EG]'
       model: 'A3 Plus'
     - regex: '9008[ADIJNTUX]'
       model: 'A3 XL'
-    - regex: '9203A(?:[);/ ]|$)'
+    - regex: '9203A'
       model: 'A3 7" 3G'
       device: 'tablet'
-    - regex: '9027[FTWX](?:[);/ ]|$)'
+    - regex: '(?:9027[QFTWX]|9032X)'
       model: '3T 8.0"'
       device: 'tablet'
-    - regex: '9026X(?:[);/ ]|$)'
+    - regex: '9026X'
       model: 'A3 10"'
       device: 'tablet'
-    - regex: '5085[BQ](?:[);/ ]|$)'
+    - regex: '5085[BQ]'
       model: 'A5'
-    - regex: '5085[ADHIJY](?:[);/ ]|$)'
+    - regex: '5085[ADHIJY]'
       model: 'A5 LED'
-    - regex: '5085N(?:[);/ ]|$)'
+    - regex: '5085N'
       model: 'A5 Max LED'
-    - regex: '5090[AIY](?:[);/ ]|$)'
+    - regex: '5090[AIY]'
       model: 'A7'
-    - regex: '5046[GS](?:[);/ ]|$)'
+    - regex: '5046[GS]'
       model: 'A30'
-    - regex: '5049S(?:[);/ ]|$)'
+    - regex: '5049S'
       model: 'A30 Plus'
-    - regex: '5049Z(?:[);/ ]|$)'
+    - regex: '5049Z'
       model: 'A30 Fierce'
     - regex: '5085[GO]'
       model: 'A50'
-    - regex: '5048[AYU](?:_RU|_EEA)?(?:[);/ ]|$)'
+    - regex: '5048[AYUI]'
       model: '3X (2019)'
-    - regex: '5049W(?:[);/ ]|$)'
+    - regex: '5049W'
       model: 'Revvl'
-    - regex: '8050[GX](?:[);/ ]|$)'
+    - regex: '8050[GX]'
       model: 'One Touch Pixi 4 6" 3G'
-    - regex: '8050[ED](?:[);/ ]|$)'
+    - regex: '8050[ED]'
       model: 'One Touch Pixi 4 6" 3G Dual SIM'
-    - regex: '(?:5098S|9001[DIX])(?:[);/ ]|$)'
+    - regex: '5098S|9001[DIX]'
       model: 'One Touch Pixi 4 6" 4G'
-    - regex: '9003[AX](?:[);/ ]|$)'
+    - regex: '9003[AX]'
       model: 'One Touch Pixi 4 7" 3G'
       device: 'tablet'
-    - regex: '8063(?:[);/ ]|$)'
+    - regex: '8063'
       model: 'One Touch Pixi 4 7" WiFi'
       device: 'tablet'
-    - regex: '9024O(?:[);/ ]|$)'
+    - regex: '9024O'
       model: 'One Touch Pixi 5'
       device: 'tablet'
-    - regex: 'I216X(?:[);/ ]|$)'
+    - regex: 'I216[AX]'
       model: 'One Touch Pixi 7'
       device: 'tablet'
-    - regex: 'I213(?:[);/ ]|$)'
+    - regex: 'I213'
       model: 'One Touch Pixi 7'
       device: 'tablet'
-    - regex: '9005X(?:[);/ ]|$)'
+    - regex: '9005X'
       model: 'One Touch Pixi 8'
       device: 'tablet'
     - regex: 'P320X'
@@ -1329,24 +2115,32 @@ Alcatel:
     - regex: 'P310X'
       model: 'One Touch POP 7'
       device: 'tablet'
-    - regex: '7048[ASWX](?:[);/ ]|$)'
+    - regex: 'P330X'
+      model: 'One Touch POP 7S'
+      device: 'tablet'
+    - regex: '9020A'
+      model: 'One Touch Trek HD'
+      device: 'tablet'
+    - regex: '7048[ASWX]'
       model: 'One Touch Go Play'
-    - regex: '(?:Alcatel-)?OT-802(?:[);/ ]|$)'
+    - regex: '(?:Alcatel-)?OT-802'
       model: 'Wave'
-    - regex: 'ALCATEL_ONE_TOUCH_768T(?:[);/ ]|$)'
+    - regex: 'ALCATEL_ONE_TOUCH_768T'
       model: 'Island'
-    - regex: '(?:TRIBE_)?3075A(?:[);/ ]|$)'
+    - regex: '(?:TRIBE_)?3075A'
       model: 'One Touch Tribe'
-    - regex: 'ALCATEL_one_touch_585(?:[);/ ]|$)'
+    - regex: 'ALCATEL_one_touch_585'
       model: 'One Touch 585'
-    - regex: 'ALCATEL_ONE_TOUCH_838(?:[);/ ]|$)'
+    - regex: 'ALCATEL_ONE_TOUCH_838'
       model: 'One Touch 838'
-    - regex: 'ALCATEL_one_touch_813d(?:[);/ ]|$)'
+    - regex: 'ALCATEL_one_touch_813d'
       model: 'One Touch 813D'
-    - regex: 'ALCATEL_one_touch_813(?:[);/ ]|$)'
+    - regex: 'ALCATEL_one_touch_813'
       model: 'One Touch 813'
     - regex: 'OT871A'
       model: 'One Touch 871A'
+    - regex: 'P360X'
+      model: 'One Touch Pop 10'
     - regex: '(?:Alcatel[ _])?One[ _]?Touch[ _]((?:T[0-9]+|TAB[^/;]+|EVO[78](?:HD)?)) Build'
       device: 'tablet'
       model: 'One Touch $1'
@@ -1354,75 +2148,99 @@ Alcatel:
       model: 'One Touch$1'
     - regex: '(?:Alcatel[ _])?One[ _]?Touch([^/;\)]*)\)'
       model: 'One Touch$1'
-    - regex: '5080[ADFQUX](?:[);/ ]|$)'
+    - regex: '5080[ADFQUX]'
       model: 'Shine Lite'
     - regex: 'TIMXL'
       model: 'TIM XL'
     - regex: '5085C'
       model: 'PulseMix'
-    - regex: '4049[DEGMX](?:[);/ ]|$)'
+    - regex: '4049[DEGMX]'
       model: 'U3'
-    - regex: '5044[ADIKOPTY](?:[);/ ]|$)'
+    - regex: '5044[ADIKOPTY]'
       model: 'U5'
-    - regex: '4047[DFXN](?:[);/ ]|$)'
+    - regex: '4047[DFXN]'
       model: 'U5 3G'
-    - regex: '5047[DIUY](?:[);/ ]|$)'
+    - regex: '5047[DIUY]'
       model: 'U5 HD'
-    - regex: '4047G(?:[);/ ]|$)'
+    - regex: '4047G'
       model: 'U5 Lite'
-    - regex: '4047A(?:[);/ ]|$)'
+    - regex: '4047A'
       model: 'U5 Plus'
-    - regex: '4044[CV](?:[);/ ]|$)'
+    - regex: '4044[CV]'
       model: 'Quick Flip'
-    - regex: '4044O(?:[);/ ]|$)'
+    - regex: '4044O'
       model: 'Cingular Flip 2'
-    - regex: '4044[MNT](?:[);/ ]|$)'
+    - regex: '(?:Alcatel)?4044[MNT]'
       model: 'Go Flip'
-    - regex: '5044[GS](?:[);/ ]|$)'
+    - regex: '5044[GS]'
       model: 'U50'
-    - regex: '5033[ADXJEFGMOTXY](?:_(?:EEA|RU))?(?:[);/ ]|$)'
+    - regex: '5033XR'
+      model: '1 (2021)'
+    - regex: '5033[ADJEFGMOTXYQS]'
       model: '1'
-    - regex: '5009[AD](?:_RU|_EEA)?(?:[);/ ]|$)'
+    - regex: '5009[AD]'
       model: '1C'
-    - regex: '5008[DUY](?:_(?:EEA|RU))?(?:[);/ ]|$)'
+    - regex: '5008[ADUYT]'
       model: '1X (2019)'
-    - regex: '5007A(?:[);/ ]|$)'
+    - regex: '5007[AGU]'
       model: '1V (2020)'
-    - regex: '5003[ADG](?:_(?:EEA|RU))?(?:[);/ ]|$)'
+    - regex: '5003[ADGU]'
       model: '1C (2019)'
-    - regex: '5024J(?:[);/ ]|$)'
+    - regex: '5006[ADG]'
+      model: '3C (2019)'
+    - regex: '5024[ADFIJ]|5028Y|6025[DH]'
       model: '1S'
-    - regex: '5028A(?:[);/ ]|$)'
+    - regex: '(?:5028[AD]|5007O)'
       model: '1S (2020)'
-    - regex: '5001[ADJTU](?:_EEA|_RU)?(?:[);/ ]|$)'
+    - regex: '5030E'
+      model: '1SP (2020)'
+    - regex: '5030[ADFJMU]'
+      model: '1SE (2020)'
+    - regex: '5001[ADJTU]'
       model: '1V'
-    - regex: '5059[ADXYZIT](_RU)?(?:[);/ ]|$)'
+    - regex: '5059[ADJXYZIT]'
       model: '1X'
-    - regex: '5059S(?:[);/ ]|$)'
+    - regex: '5059S'
       model: 'Avalon V'
-    - regex: '5060D(?:_EEA|_RU)?(?:[);/ ]|$)'
+    - regex: '5060[ADJ]'
       model: '5V'
       device: 'phablet'
-    - regex: '(?:5052[ADY]|5053[AKY])(?:_EEA|_RU)?(?:[);/ ]|$)'
+    - regex: '5052[ADY]|5053[ADKY]'
       model: '3'
-    - regex: '5029E(?:[);/ ]|$)'
+    - regex: '5029E'
       model: '3 (2020)'
-    - regex: '(?:5032W|5099[ADYUI](_RU)?)(?:[);/ ]|$)'
+    - regex: '5029[ADFY]'
+      model: '3L (2020)'
+    - regex: '5032W|5099[ADYUI]'
       model: '3V'
-    - regex: '5026[ADJ](?:[);/ ]|$)'
+    - regex: '5026[ADJ]'
       model: '3C'
-    - regex: '5039[D](?:_(?:EEA|RU))?(?:[);/ ]|$)'
+    - regex: '5039[DY]'
       model: '3L'
       device: 'phablet'
-    - regex: '5058[AIY](_RU)?(?:[);/ ]|$)'
+    - regex: '5058[AIY]'
       model: '3X'
-    - regex: '5086[ADY](?:[);/ ]|$)'
+    - regex: '5061[AKU]'
+      model: '3X (2020)'
+    - regex: '5086[ADY]'
       model: '5'
-    - regex: '6062W(?:[);/ ]|$)'
+    - regex: '6062W'
       model: '7'
+    - regex: '8088[XQM]'
+      model: '3T 10"'
+      device: 'tablet'
+    - regex: '8094M'
+      model: '3T 10.1"'
+      device: 'tablet'
+    - regex: '9029Z'
+      model: 'Joy Tab'
+      device: 'tablet'
+    - regex: '9032[WZ]'
+      model: 'Joy Tab 2'
+      device: 'tablet'
     - regex: 'Alcatel UP'
       model: ''
-    - regex: '(?:ALCATEL_)?A383G(?:[);/ ]|$)'
+    - regex: '(?:ALCATEL_)?A383G'
       model: 'Big Easy Plus'
     - regex: '5041C'
       model: 'TETRA'
@@ -1435,9 +2253,9 @@ Alcatel:
     - regex: 'Alc([a-z0-9]+)'
       model: '$1'
 
-# Allview
+# Allview (allviewmobile.com)
 Allview:
-  regex: 'Allview|A4You|A5_(?:Easy(?:_TM)?|Ready(?:_TM)?|Quad|Quad_Plus_TM)|A[56789]_Lite|A5Smiley|A6_Duo|A10_Lite_2019|A10_Plus|AX2_Frenzy|AX4Nano|AX5NanoQ|C6_Duo|E[23]_Living|E3_(?:Jump|Sign)|E4_Lite|M9_Connect|P(?:43_Easy|[5689]_Energy|6_Energy_Lite|[68]_Energy_Mini(?:_TM)?|(41|[458])_eMagic(?:_TM)?|[589](?:_)?Life(?:_TM)?|[567]_Lite(?:_TM)?|6_plus|[45678]_Pro|7_Seon|10_Life|10_Max|10_Style|7_Xtreme|6_Qmax|4_Quad)|V(?:[134]_Viper|1_Viper_I|2_Viper_(?:E|I|S|X|X_plus|Xe))|X(?:[1234]_Soul_Xtreme|[12345]_Soul|3_Soul_Lite|[23456]_Soul_Mini(?:_TM)?|4_Soul_Mini_S(?:_TM)?|[234]_Soul_Style(?:_TM)?|2_Soul_Style_Plus|2_Twin)|Viva_(H801|100[13]G|H1001_LTE)'
+  regex: 'Allview|A4You|H1003_LTE_PRO|A5_(?:Easy(?:_TM)?|Ready(?:_TM)?|Quad|Quad_Plus_TM)|A[5-9]_Lite|A5Smiley|A6_Duo|A10_Lite_(?:2019|2GB)|A10_(?:Plus|Max)|AX2_Frenzy|AX4Nano|AX5NanoQ|C6_Duo|E[23]_Living|E3_(?:Jump|Sign)|E4_Lite|M9_Connect|P(?:43_Easy|[5689]_Energy|6_Energy_Lite|[68]_Energy_Mini(?:_TM)?|(41|[458])_eMagic(?:_TM)?|[589](?:_)?Life(?:_TM)?|[567]_Lite(?:_TM)?|6_plus|[45678]_Pro|7_Seon|10_Life|10_Max|10_Style|7_Xtreme|6_Qmax|4_Quad)|V(?:[134]_Viper|1_Viper_I|2_Viper_(?:[EISX]|X_plus|Xe))|X4_Soul_Vision|X(?:[1-46]_Soul_Xtreme|[1-5]_Soul|3_Soul_Lite|[2-6]_Soul_Mini(?:_TM)?|4_Soul_Mini_S(?:_TM)?|[2-58]_Soul_Style(?:_TM)?|2_Soul_Style_Plus|2_Twin)|Viva_(?:H801|100[13]G|(?:H100[12]|H701|H802)_LTE|C701|i701G|803G)'
   device: 'smartphone'
   models:
     - regex: 'A4You'
@@ -1445,8 +2263,6 @@ Allview:
     - regex: 'AX2_Frenzy'
       model: 'AX2 Frenzy'
       device: 'tablet'
-    - regex: 'AX4Nano'
-      model: 'AX4 Nano'
     - regex: 'AX5NanoQ'
       model: 'AX5 Nano Q'
       device: 'tablet'
@@ -1510,7 +2326,9 @@ Allview:
       model: 'V2 Viper X Plus'
     - regex: 'V2_Viper_(E|I|S|X(?:e)?)'
       model: 'V2 Viper $1'
-    - regex: 'X([124])_Soul_Xtreme'
+    - regex: 'X4_Soul_Vision'
+      model: 'X4 Soul Vision'
+    - regex: 'X([1246])_Soul_Xtreme'
       model: 'X$1 Soul Xtreme'
     - regex: 'X4_Soul_Infinity_(L|N|S|Z)'
       model: 'X4 Soul Infinity $1'
@@ -1526,7 +2344,7 @@ Allview:
       model: 'X$1 Soul Pro'
     - regex: 'X2_Soul_Style_Plus'
       model: 'X2 Soul Style Plus'
-    - regex: 'X([234])_Soul_Style(?:_TM)?'
+    - regex: 'X([23458])_Soul_Style(?:_TM)?'
       model: 'X$1 Soul Style'
     - regex: 'X([12345])_Soul'
       model: 'X$1 Soul'
@@ -1548,8 +2366,12 @@ Allview:
       model: 'A6 Duo'
     - regex: 'A10_Lite_2019'
       model: 'A10 Lite (2019)'
+    - regex: 'A10_Lite_2GB'
+      model: 'A10 Lite'
     - regex: 'A10_Plus'
       model: 'A10 Plus'
+    - regex: 'A10_Max'
+      model: 'A10 Max'
     - regex: 'Impera S'
       model: 'Impera S'
     - regex: 'ALLVIEW P4i'
@@ -1573,7 +2395,10 @@ Allview:
     - regex: 'Allview3SpeedQuad'
       device: 'tablet'
       model: 'Alldro 3 Speed Quad'
-    - regex: 'Viva_(H801|100[13]G|H1001_LTE)'
+    - regex: 'H1003_LTE_PRO'
+      device: 'tablet'
+      model: 'Viva H1003 LTE Pro'
+    - regex: 'Viva_(H801|100[13]G|(?:H802|H100[12]|H701)_LTE|C701|i701G|803G)'
       device: 'tablet'
       model: 'Viva $1'
     - regex: 'ALLVIEW ?SPEEDI'
@@ -1599,28 +2424,50 @@ Allview:
 
 # Allwinner
 Allwinner:
-  regex: '(?:QUAD-CORE A64 p3|ZY-07B)(?:[);/ ]|$)'
+  regex: '(?:QUAD-CORE (?:A64 p3|A33 y3|T3 K2001M|T3 k2001o|T3 k2001-nwd)|ZY-07B|UltraOcta-T8|OCTA-CORE T8|OCTOPUS-CORE T8|QuadCore-R16)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-      - regex: 'QUAD-CORE A64 p3'
-        model: 'A64 QUAD-CORE p3'
-      - regex: 'ZY-07B'
-        model: 'ZY-07B'
+    - regex: 'QUAD-CORE A64 p3'
+      model: 'A64 QUAD-CORE p3'
+    - regex: 'QUAD-CORE A33 y3'
+      model: 'A33 QUAD-CORE y3'
+    - regex: 'ZY-07B'
+      model: 'ZY-07B'
+    - regex: 'UltraOcta-T8'
+      device: 'car browser'
+      model: 'Ultra Octa T8'
+    - regex: 'QUAD-CORE T3 K2001o'
+      device: 'car browser'
+      model: 'QUAD-CORE T3 K2001O'
+    - regex: 'QUAD-CORE T3 K(2001M?)'
+      device: 'car browser'
+      model: 'QUAD-CORE T3 K$1'
+    - regex: 'OCTA-CORE T8'
+      device: 'car browser'
+      model: 'OCTA-CORE T8'
+    - regex: 'OCTOPUS-CORE T8'
+      device: 'car browser'
+      model: 'OCTOPUS-CORE T8'
+    - regex: 'QuadCore-R16'
+      device: 'car browser'
+      model: 'QUAD-CORE R16'
 
 # altron
 altron:
-  regex: 'AL-555|GI-626'
+  regex: '(AL-555|GI-626|OB[_-](?:421|728|627))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AL-555'
       model: 'AL-555'
+    - regex: 'OB[_-](421|728|627)'
+      model: 'OB-$1'
     - regex: 'GI-626'
       device: 'phablet'
       model: 'GI-626'
 
-# AMGOO
+# AMGOO (amgoo.com)
 AMGOO:
-  regex: 'AM(350|355|40[257]|41[05]|450|50[89]|52[037]|51[58]|53[05])'
+  regex: 'AM(350|355|40[257]|41[025]|450|50[689]|52[037]|51[58]|53[05])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AM350'
@@ -1654,26 +2501,40 @@ AMGOO:
     - regex: 'AM([0-9]{3})'
       model: 'AM$1'
 
-# Amoi
+# Amoi or ami (amimobile.tech)
 Amoi:
-  regex: 'Amoi|A862W'
+  regex: 'Amoi|(?:A862W|Clever[ -]?(?:Gem S52|Gleam S45|Pad P7|Wave S50|Touch S46|JOY S40|Lite S41))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    # explicit smartphone tablets
+    - regex: 'Clever Pad P7'
+      model: 'Clever Pad P7'
     # explicit smartphone models
     - regex: 'A862W'
       model: 'A862W'
-    - regex: 'Amoi[\- /]([a-z0-9]+)'
+    - regex: 'CLEVER JOY S40'
+      model: 'Clever Joy S40'
+    - regex: 'Clever[ -]?(Gleam S45|Gem S52|Wave S50|Touch S46|Lite S41)'
+      model: 'Clever $1'
+    # explicit feature models
+    - regex: 'Amoi[-_ /](CA6)'
+      device: 'feature phone'
+      model: '$1'
+
+    - regex: 'Amoi[-_ /]([a-z0-9]+)'
       model: '$1'
     - regex: 'Amoisonic-([a-z0-9]+)'
       model: '$1'
 
 # Ainol
 Ainol:
-  regex: 'Numy|novo[0-9]|Novo 10 Hero|AX10PRO|NUMY3GAX9|NOVO10 Spark'
+  regex: 'Numy|novo[0-9]|Novo 10 Hero|AX10PRO|NUMY3GAX9|NOVO10 Spark|Aurora-II'
   device: 'tablet'
   models:
     - regex: 'Numy 3G AX1'
       model: 'Novo 7 Numy AX1 3G'
+    - regex: 'Numy[_ ]?3G[_ ]?Sword'
+      model: 'Numy 3G Sword'
     - regex: 'NOVO10 Spark'
       model: 'Novo 10 Spark'
     - regex: 'AX10PRO'
@@ -1686,9 +2547,15 @@ Ainol:
       model: 'Numy 3G Talos 2'
     - regex: 'NUMY3GAX9(?:[);/ ]|$)'
       model: 'Numy 3G AX9'
+    - regex: 'Numy3G_AX10(?:[);/ ]|$)'
+      model: 'Numy 3G AX10'
     - regex: '(Novo 10 Hero QuadCore)'
       model: '$1'
-    - regex: 'Novo7 Flame(?:[);/ ]|$)'
+    - regex: 'Aurora-II'
+      model: 'Novo 7 Aurora II'
+    - regex: 'Novo7Fire'
+      model: 'Novo 7 Fire'
+    - regex: 'Novo7 ?Flame(?:[);/ ]|$)'
       model: 'Novo 7 Flame'
     - regex: 'NOVO7(?:[);/ ]|$)'
       model: 'Novo 7'
@@ -1697,13 +2564,12 @@ Ainol:
     - regex: 'Novo([0-9]+)[ \-]([^;/]+) Build'
       model: 'Novo $1 $2'
 
-
-# Archos
+# Archos (www.archos.com)
 Archos:
-  regex: '(?:YL-)?Archos|(?:A50TI|AC101BHE)(?:[);/ ]|$)'
+  regex: '(?:YL-)?Archos|(?:A50TI|AC101BHE|AC50BHE)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Archos (Oxygen 63)(?:[);/ ]|$)'
+    - regex: 'Archos (Oxygen (?:63|57|68XL))(?:[);/ ]|$)'
       model: '$1'
     - regex: 'A50TI(?:[);/ ]|$)'
       model: '50 Titanium 4G'
@@ -1713,15 +2579,24 @@ Archos:
     - regex: 'AC101BHE(?:[);/ ]|$)'
       device: 'tablet'
       model: '101B Helium 4G'
+    - regex: 'AC50BHE(?:[);/ ]|$)'
+      model: '50B Helium 4G'
+    - regex: 'Archos 80 Oxygen(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '80 Oxygen'
+    - regex: 'Archos 101 Oxygen(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '101 Oxygen 4G'
+    - regex: 'Archos Oxygen 101S(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '101s Oxygen'
     - regex: '(?:YL-)?Archos ([^/;]*(?:PAD)[^/;]*) Build'
       device: 'tablet'
       model: '$1'
-    - regex: 'Archos ((?:[789]|10)[0-9]?[a-z]* ?(?:G9|G10|Helium|Titanium|Cobalt|Platinum|Xenon|Carbon|Neon|XS|IT)[^/;]*) Build'
+    - regex: 'Archos ((?:[789]|10)[0-9]?[a-z]* ?(?:G9|G10|Helium|Titanium|Copper|Cobalt|Platinum|Xenon|Carbon|Neon|XS|IT)[^/);]*)(?: Build|[;)])'
       device: 'tablet'
       model: '$1'
-    - regex: '(?:YL-)?Archos ([a-z0-9 ]+) Build'
-      model: '$1'
-    - regex: '(?:YL-)?Archos ([a-z0-9]+)'
+    - regex: '(?:YL-)?Archos ([^/);]+)(?: Build|[;)])'
       model: '$1'
 
 # Axxion
@@ -1825,9 +2700,24 @@ Ask:
 
 # ANS
 ANS:
-  regex: 'UL40 Build'
+  regex: 'ANS/|UL40 Build'
   device: 'smartphone'
-  model: 'UL40'
+  models:
+    - regex: 'UL40 Build'
+      model: 'UL40'
+    - regex: 'ANS/L51'
+      model: 'L51'
+
+# AOC (https://www.aoc.com/)
+AOC:
+  regex: 'AOC,|(?:Q10107L-ME)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: '(Q10107L-ME)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+    - regex: '(LE(?:32|43)S5970(?:s)?-20|LE55U7970-30|LE43S5977-20|U60856)'
+      model: '$1'
 
 # Assistant
 Assistant:
@@ -1884,7 +2774,7 @@ Assistant:
 
 # Ark (Ark Electronic Technology)
 Ark:
-  regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_1(?:[);/ ]|$)'
+  regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|Impulse[ _]P[12]|(?:EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Wizard_[12]|UKOZI U5)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
@@ -1897,10 +2787,12 @@ Ark:
       model: 'Edge $1'
     - regex: 'ICON (R40\+|R45)'
       model: 'Icon $1'
-    - regex: 'Wizard_1'
-      model: 'Wizard 1'
+    - regex: 'Wizard_([12])'
+      model: 'Wizard $1'
     - regex: 'Elf_S8(?:[);/ ]|$)'
       model: 'Elf S8'
+    - regex: 'UKOZI U5(?:[);/ ]|$)'
+      model: 'Ukozi U5'
 
 # Garmin-Asus
 Garmin-Asus:
@@ -1916,7 +2808,7 @@ Garmin-Asus:
 
 # Asus
 Asus:
-  regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS600KL|ZS(6[236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00VD'
+  regex: 'Asus(?! Update)|Transformer|ZenFone Max|MeMOPad 10|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|(?:P(?:00[128ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)|K01[579N]|AST21)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(5[02]0|620|55[2345])KL|ZD55[23]KL|ZS6(?:61|7[02136])KS|ZS(6[0236]0|55[10])KL|ZS590KS|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00[SV]D|P01Y_S|Zenfone 5Z'
   device: 'smartphone'
   models:
     # explicit tablet models
@@ -1932,19 +2824,22 @@ Asus:
     - regex: 'ME302C(?:[);/ ]|$)'
       model: 'MeMO Pad FHD 10'
       device: 'tablet'
-    - regex: '(ME302KL|MeMo Pad FHD 10 LTE)(?:[);/ ]|$)'
+    - regex: '(ME302KL|MeMOPad 10FHD LTE|MeMo Pad FHD 10 LTE)(?:[);/ ]|$)'
       model: 'MeMO Pad FHD 10 LTE'
       device: 'tablet'
     - regex: 'ME301T(?:[);/ ]|$)'
       model: 'MeMO Pad Smart 10'
       device: 'tablet'
+    - regex: 'Z101 Prime(?:[);/ ]|$)'
+      model: 'Z101 Prime'
+      device: 'tablet'
     - regex: 'Z101(?:[);/ ]|$)'
       model: 'Z101'
       device: 'tablet'
     - regex: 'X Pad 10 LTE(?:[);/ ]|$)'
       model: 'X Pad 10 LTE'
       device: 'tablet'
-    - regex: '(?:K01[3A]|K007|K00R)(?:[);/ ]|$)|MeMO Pad 7'
+    - regex: '(?:K01[3A7]|K007|K00R)(?:[);/ ]|$)|MeMO Pad 7'
       model: 'MeMO Pad 7'
       device: 'tablet'
     - regex: 'K01E(?:[);/ ]|$)'
@@ -1953,7 +2848,7 @@ Asus:
     - regex: 'K00U|ME173X(?:[);/ ]|$)'
       model: 'MeMO Pad HD 7'
       device: 'tablet'
-    - regex: '(?:K011|K00L)(?:[);/ ]|$)'
+    - regex: '(?:K01[15]|K00L|AST21)(?:[);/ ]|$)'
       model: 'MeMO Pad 8'
       device: 'tablet'
     - regex: 'K014(?:[);/ ]|$)'
@@ -1983,7 +2878,7 @@ Asus:
     - regex: 'Slider SL101'
       model: 'Eee Pad Slider SL101'
       device: 'tablet'
-    - regex: 'P01[YZ]'
+    - regex: 'P01[YZ](?:_S)?'
       model: 'ZenPad C 7.0'
       device: 'tablet'
     - regex: 'P008 Build'
@@ -1995,15 +2890,18 @@ Asus:
     - regex: '(?:ASUS_)?P00J'
       model: 'ZenPad Z8s'
       device: 'tablet'
-    - regex: 'P01[VW]'
+    - regex: 'P01[VW]|P002'
       model: 'ZenPad 7.0'
       device: 'tablet'
-    - regex: 'P024 Build|P00A'
+    - regex: '(?:P024|P00A)(?:[);/ ]|$)'
       model: 'ZenPad 8.0'
       device: 'tablet'
-    - regex: 'P01MA(?: Build|\))|P01M(?: Build|\))'
+    - regex: 'P01MA?(?:[);/ ]|$)'
       model: 'ZenPad S 8.0'
       device: 'tablet'
+    - regex: 'ASUS_(w706)(?:[);/ ]|$)'
+      model: '$1'
+      device: 'tablet'
     - regex: 'P027'
       model: 'ZenPad 3S 10'
       device: 'tablet'
@@ -2013,6 +2911,12 @@ Asus:
     - regex: '(?:ASUS_)?P00C|P02[138]|P00L|P01T_1'
       model: 'ZenPad 10'
       device: 'tablet'
+    - regex: 'ASUS Tablet P1801-T'
+      model: 'Transformer AiO P1801 18.4"'
+      device: 'tablet'
+    - regex: 'ASUS TAB A8'
+      model: 'TAB A8'
+      device: 'tablet'
 
     # explicit phablet models
     - regex: 'ME371MG(?:[);/ ]|$)'
@@ -2021,7 +2925,7 @@ Asus:
     - regex: 'K00G(?:[);/ ]|$)'
       model: 'Fonepad Note 6'
       device: 'phablet'
-    - regex: '(?:K012|K00E)(?:[);/ ]|$)'
+    - regex: '(?:K01[2N9]|K00E)(?:[);/ ]|$)'
       model: 'Fonepad 7'
       device: 'phablet'
     - regex: 'K00Z(?:[);/ ]|$)'
@@ -2034,33 +2938,43 @@ Asus:
     # explicit smartphone models
     - regex: '(?:ASUS_)?T00N'
       model: 'PadFone S'
+    - regex: '(?:ASUS_)?T00[CE]'
+      model: 'PadFone Mini'
+    - regex: '(?:ASUS[-_])?T00T'
+      model: 'PadFone X Mini'
+    - regex: 'PadFone T008'
+      model: 'PadFone E'
+    - regex: 'PadFone T004'
+      model: 'PadFone Infinity'
     - regex: '(?:ASUS_)?A002(A)?'
       model: 'ZenFone AR'
+    - regex: '(?:ASUS_)?(?:I006D|ZS590KS)'
+      model: 'ZenFone 8'
+    - regex: '(?:ASUS_)?(?:I004D|ZS672KS)'
+      model: 'ZenFone 8 Flip'
     - regex: '(?:ASUS_)?A006'
       model: 'ZenFone V'
     - regex: '(?:ASUS_)?A009'
       model: 'ZenFone V Live'
     - regex: '(?:ASUS_)?Z007'
       model: 'ZenFone C'
-    - regex: '(?:ASUS_)?(X00PD|ZB555KL)'
+    - regex: '(?:ASUS_)?(X00P[SD]|ZB555KL)'
       model: 'ZenFone Max M1'
-    - regex: '(?:ASUS_)?(ZB601KL)'
+    - regex: '(?:ASUS_)?(?:ZB60[12]KL)|ZenFone Max Pro M1'
       model: 'ZenFone Max Pro M1'
     - regex: '(?:ASUS_)?(X01([AB]D)|ZB633KL)(?:[);/ ]|$)'
       model: 'ZenFone Max M2'
-    - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?)'
+    - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?|ZE551ML)'
       model: 'ZenFone 2'
     - regex: '(?:ASUS_)?(?:ZenFone 2E)'
       model: 'ZenFone 2E'
-    - regex: '(?:ASUS_)?A007|ZA550KL|ZB553KL|ZB501KL'
+    - regex: '(?:ASUS_)?(?:A007|Z00YD|ZA550KL|ZB553KL|ZB501KL)(?:[);/ ]|$)'
       model: 'ZenFone Live'
-    - regex: '(?:ASUS_)?(X00RD|G552KL)'
+    - regex: '(?:ASUS_)?(?:X00RD|G552KL)'
       model: 'ZenFone Live L1'
     - regex: 'G553KL'
       model: 'ZenFone Lite L1'
-    - regex: '(?:ASUS_)Z00YD'
-      model: 'Live'
-    - regex: '(?:ASUS_)?(?:Z00[ERLMT]D|Z011D)'
+    - regex: '(?:ASUS_)?(?:Z00[ERLMTW]D|Z011D|ZE500KL)'
       model: 'ZenFone 2 Laser'
     - regex: '(?:ASUS_)?(?:T00[IQ1]|Z01KD)'
       model: 'ZenFone 4'
@@ -2070,27 +2984,31 @@ Asus:
       model: 'ZenFone 5 LTE'
     - regex: '(?:ASUS_)?(?:T00K|X017DA|X017D|ZC600KL)'
       model: 'ZenFone 5 Lite'
-    - regex: '(?:ASUS_)?(?:Z01RD|ZS620KL)'
+    - regex: '(?:ASUS_)?(?:Z01RD|ZS620KL)|Zenfone 5Z'
       model: 'ZenFone 5Z'
     - regex: '(?:ASUS_)?(?:T00G|Z002|ZS630KL|I01WD[X]?)'
       model: 'ZenFone 6'
+    - regex: '(?:ASUS_)?ZS671KS'
+      model: 'ZenFone 7 Pro'
+    - regex: '(?:ASUS_)?(?:ZS670KS|I002D)(?:[);/ ]|$)'
+      model: 'ZenFone 7'
     - regex: '(?:ASUS_)?Z010D'
       model: 'ZenFone Max'
     - regex: '(?:ASUS_)?X018D'
       model: 'ZenFone Max Plus M1'
-    - regex: '(?:ASUS_)?X00TD'
+    - regex: '(?:ASUS_)?X00TD?'
       model: 'ZenFone Max Pro M1'
-    - regex: '(?:ASUS_)?X01BDA|ZB631KL'
+    - regex: '(?:ASUS_)?(?:X01BDA|ZB631KL|Zenfone Max Pro M2)'
       model: 'ZenFone Max Pro M2'
     - regex: '(?:ASUS_)?X014D'
       model: 'ZenFone Go Plus'
-    - regex: '(?:ASUS_)?(L001|X00[7AB]D|X009[DB][DA]|Z00[SV]D|ZB500K[LG]|ZB551KL)'
+    - regex: '(?:ASUS_)?(L001|X00[7AB]D|X009[DB][DA]|X009D|Z00[SV]D|ZB500K[LG]|ZB551KL)'
       model: 'ZenFone Go'
     - regex: '(?:ASUS_)?X013D'
       model: 'ZenFone Go Life'
     - regex: '(?:ASUS_)?G550KL'
       model: 'ZenFone Go TV'
-    - regex: '(?:ASUS_)?Z00VD' #ZC500TG
+    - regex: '(?:ASUS_)?Z00[SV]D' #ZC500TG
       model: 'ZenFone Go'
     - regex: '(?:ASUS_)?(X00[23])'
       model: 'ZenFone Pegasus'
@@ -2100,9 +3018,11 @@ Asus:
       model: 'ZenFone Pegasus 2 Plus'
     - regex: '(?:ASUS_)?(X00GD)'
       model: 'ZenFone Pegasus 3S Max'
+    - regex: '(?:ASUS_)?(?:X00D[DS]|X008D)|ZC553KL'
+      model: 'ZenFone 3 Max'
     - regex: '(?:ASUS_)?(X008)'
       model: 'ZenFone 3 Pegasus'
-    - regex: '(?:ASUS_)?(ZE553KL|Z01HD)'
+    - regex: '(?:ASUS_)?(ZE553KL|Z01HDA?)'
       model: 'ZenFone 3 Zoom'
     - regex: '(?:ASUS_)?ZS550KL'
       model: 'ZenFone 3 Deluxe'
@@ -2110,15 +3030,15 @@ Asus:
       model: 'ZenFone Selfie'
     - regex: '(?:ASUS_)?(Z016[DS]|Z01FD)'
       model: 'ZenFone 3 Deluxe'
-    - regex: '(?:ASUS_)?(Z017DA|ZE520KL|ZE552KL|Z017D|Z012(D|S))'
+    - regex: '(?:ASUS_)?Z(?:017DA|E520KL|E552KL|017D|012(?:DC?|S))'
       model: 'ZenFone 3'
     - regex: '(?:ASUS_)?Z01B[DS]|ZC551KL'
       model: 'ZenFone 3 Laser'
-    - regex: '(?:ASUS_)?X00D[DS]|ZC553KL'
-      model: 'ZenFone 3 Max'
     - regex: '(?:ASUS_)?A001'
       model: 'ZenFone 3 Ultra'
-    - regex: '(?:ASUS_)?(X00LDA|Z01MD)'
+    - regex: '(?:ASUS_)?(?:ZD552KL|Z01MDA?)(?:[);/ ]|$)'
+      model: 'ZenFone 4 Selfie Pro'
+    - regex: '(?:ASUS_)?(?:X00LDA|ZD553KL)'
       model: 'ZenFone 4 Selfie'
     - regex: '(?:ASUS_)?(?:X00LD|Z01KS|Z01KDA|ZE554KL)'
       model: 'ZenFone 4'
@@ -2126,22 +3046,28 @@ Asus:
       model: 'ZenFone 4 Max'
     - regex: '(?:ASUS_)?X015D'
       model: 'ZenFone 4 Max Plus'
-    - regex: 'ZD552KL'
-      model: 'ZenFone 4 Selfie Pro'
-    - regex: 'ZD553KL'
-      model: 'ZenFone 4 Selfie'
-    - regex: '(?:ASUS_)?(:?Z01GD|ZS551KL)'
+    - regex: '(?:ASUS_)?(:?Z01G[DS]|ZS551KL)'
       model: 'ZenFone 4 Pro'
-    - regex: '(?:ASUS_)?ZB602KL'
-      model: 'ZenFone Max Pro'
     - regex: '(?:ASUS_)?Z00XS'
       model: 'ZenFone Zoom'
     - regex: '(?:ASUS_)?(?:Z01QD|ZS600KL)'
       model: 'ROG Phone'
     - regex: '(?:ASUS_)?(?:I001D[ABCE]?|ZS660KL)'
       model: 'ROG Phone 2'
-    - regex: '(?:ASUS_)?(?:I003DD?)'
+    - regex: '(?:ASUS_)?(?:I003DD?|ZS661KS)'
       model: 'ROG Phone 3'
+    - regex: '(?:ASUS_)?(?:I005D[AC]?|ZS67[36]KS)'
+      model: 'ROG Phone 5'
+
+    # desktop detections
+    - regex: 'ZN220IC'
+      device: 'desktop'
+      model: 'Zen AiO ZN220IC'
+
+    # watch detections
+    - regex: '(?:ASUS_)?ZenWatch( 2)?'
+      device: 'wearable'
+      model: 'ZenWatch$1'
 
     # general detections
     - regex: 'Asus(?:-|;)?([a-z0-9]+)'
@@ -2153,9 +3079,9 @@ Asus:
     - regex: '(?:Asus|Transformer) ((?:Pad |Prime )?TF[0-9a-z]+)'
       device: 'tablet'
       model: 'Transformer $1'
-    - regex: 'Chromebook Flip C100PA'
-      device: 'tablet'
-      model: 'Chromebook Flip C100PA'
+    - regex: 'Chromebook Flip (C10[01]PA|C302)'
+      device: 'desktop'
+      model: 'Chromebook Flip $1'
 
 # Audiovox
 Audiovox:
@@ -2176,33 +3102,45 @@ AVH:
   regex: 'Excer[ _]'
   device: 'tablet'
   models:
-    - regex: 'Excer[ _]G5.3'
-      model: 'Excer G5.3'
+    - regex: 'Excer[ _]G5.([36])'
+      model: 'Excer G5.$1'
     - regex: 'Excer[ _]G5'
       model: 'Excer G5'
     - regex: 'Excer[ _]10[ _]PRO'
       model: 'Excer 10 Pro'
+    - regex: 'Excer[ _]8'
+      model: 'Excer 8'
 
 # Avvio
 Avvio:
-  regex: 'Avvio[ _]?([a-z0-9\-]+)'
+  regex: 'Avvio[ _]?([a-z0-9\-]+)|(?:CHIVAS_55|Colombia_2018|Mint_M353)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'CHIVAS_55'
+      model: 'Chivas 55'
+    - regex: 'Mint_M353'
+      model: 'Mint M353'
+    - regex: 'Colombia_2018'
+      model: 'Colombia (2018)'
     - regex: 'Avvio[ _]PAD'
       model: 'PAD'
       device: 'tablet'
     - regex: 'Avvio[ _]?([a-z0-9\-]+)'
       model: '$1'
 
-# Azumi Mobile
-"Azumi Mobile":
-  regex: 'Azumi[_ ]'
+# Azumi Mobile (azumi-mobile.com)
+Azumi Mobile:
+  regex: 'Azumi[_ -]|(?:SPEED55|A50_Style_Plus)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Azumi[_ ]([^/;]+) Build'
+    - regex: 'Azumi[_ -]([^/;]+) Build'
       model: '$1'
-    - regex: 'Azumi[_ ]([a-z0-9_]+)'
+    - regex: 'Azumi[_ -]([a-z0-9_]+)'
       model: '$1'
+    - regex: 'SPEED55'
+      model: 'Speed 5.5"'
+    - regex: 'A50_Style_Plus'
+      model: 'A50 Style Plus'
 
 #Barnes & Noble
 'Barnes & Noble':
@@ -2237,77 +3175,163 @@ BGH:
 
 # Bitel
 Bitel:
-  regex: 'Bitel[ _-]([^/;]+) Build|B(840[5789]|841[0456]|850[2346]|860[146]|9401|950[12345])'
+  regex: 'Bitel[ _-]([^/;]+) Build|(?:B(?:840[5-9]|841[0456]|850[2346]|860[146]|9401|950[1-5])|S8402L?|S8501L?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(B(840[5789]|841[0456]|850[2346]|860[146]|9401|950[12345]))'
+    - regex: '(B(?:840[5789]|841[0456]|850[2346]|860[146]|9401|950[12345])|S8402L?|S8501L?)'
       model: '$1'
     - regex: 'Bitel[ _-]([^/;]+) Build'
       model: '$1'
 
 # Blu
 Blu:
-  regex: 'BLU |(?:blu|Dash)[ _]([^/;]+) Build|Studio (5.0K|5.5|View XL|Mega|C 8\+8|C HD|C|G|Selfie LTE|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)|Advance (4.0 ?[LM]|5.0(?: HD)?|A4)|ENERGY (DIAMOND|XL)|LIFE XL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|GRAND (?:5.5 HD|XL LTE)|R1 (HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE'
-  device: 'smartphone'
-  models:
-   - regex: 'Advance (4.0 ?[LM]|4.0|5.0(?: HD)?|A4)'
-     model: 'Advance $1'
-   - regex: 'Studio (5.0 C|5.5|View XL|Mega|C 8\+8|C HD|C|G|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)'
-     model: 'Studio $1'
-   - regex: 'Studio (5.0)K'
-     model: 'Studio $1 K'
-   - regex: 'STUDIO SELFIE LTE'
-     model: 'Studio Selfie LTE'
-   - regex: 'STUDIO ONE'
-     model: 'Studio One'
-   - regex: 'STUDIO SELFIE ([23]|LTE)'
-     model: 'Studio Selfie $1'
-   - regex: 'STUDIO SELFIE'
-     model: 'Studio Selfie'
-   - regex: 'ENERGY DIAMOND'
-     model: 'Energy Diamond'
-   - regex: 'ENERGY XL'
-     model: 'Energy XL'
-   - regex: 'ENERGY X PLUS 2'
-     model: 'Energy X Plus 2'
-   - regex: 'ENERGY X PLUS'
-     model: 'Energy X Plus'
-   - regex: 'LIFE XL'
-     model: 'Life XL'
-   - regex: 'Dash XL'
-     model: 'Dash XL'
-   - regex: 'PURE XL'
-     model: 'Pure XL'
-   - regex: 'Life One X2'
-     model: 'Life One X2'
-   - regex: 'LIFE ONE'
-     model: 'Life One'
-   - regex: 'NEO X PLUS'
-     model: 'Neo X Plus'
-   - regex: 'NEO (XL|X)'
-     model: 'Neo $1'
-   - regex: 'GRAND 5.5 HD'
-     model: 'Grand 5.5 HD'
-   - regex: 'Grand X LTE'
-     model: 'Grand X LTE'
-   - regex: 'Grand XL LTE'
-     model: 'Grand XL LTE'
-   - regex: 'R1 HD'
-     model: 'R1 HD'
-   - regex: 'R1 PLUS'
-     model: 'R1 Plus'
-   - regex: 'Tank Xtreme 5.0'
-     model: 'Tank Xtreme 5.0'
-   - regex: 'Tank Xtreme Pro'
-     model: 'Tank Xtreme Pro'
-   - regex: 'VIVO AIR LTE'
-     model: 'Vivo Air LTE'
-   - regex: 'DASH[ _]([^/;]+) Build'
-     model: 'Dash $1'
-   - regex: 'DASH (5.0|L3|L|M|X2|X)'
-     model: 'Dash $1'
-   - regex: 'blu[ _]([^/;]+) Build'
-     model: '$1'
+  regex: 'BLU[ _]|(?:blu|Dash)[ _]([^/;)]+)(?: Build|[;)])|(?:Studio[ _](X12|5.0K|5.5|View XL|Mega|C 8\+8|[CGM][ _]HD|G2 HD|[CGX]|SELFIE|Selfie LTE|Touch|M5 Plus|J[1258]|X8 HD|X10\+?|XL(?: 2)?)|Advance (4.0 ?[LM]|5.[02](?: HD)?|A4|L[45])|M6 2021|ENERGY (DIAMOND|XL)|Energy X 2|LIFE XL|B110DL|Dash (?:X[2L]|L3)|PURE (?:X[LR]|MINI|View)|Life One X2|G50 (?:Mega|Plus)|G51 Plus|G90(?: PRO)?|G91 Pro|GRAND (?:M3|Max|5.5 HD|XL LTE|Mini)|R1 (?:HD|PLUS)|R2 (?:LTE|Plus)|Tank Xtreme [45].0|Tank Xtreme(?: Pro)?|Touchbook M7 Pro|DASH X PLUS|C[456] 2019|BOLD (?:M7|N1)|B1[34]0DL|Vivo (?:5 Mini|One Plus|5R|XL[234]| Plus|8L|XI[+]?|GO)|(?<!Neffos )C[56]L(?: 2020)?|C6 2020|G9 PRO|D701|VIEW 1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Advance (4.0 ?[LM]|4.0|5.[02](?: HD)?|A4|L[54])'
+      model: 'Advance $1'
+    - regex: 'M6 2021(?:[);/ ]|$)'
+      model: 'M6 (2021)'
+    - regex: '(?:BLU[_ ])?Studio[ _](5.0 C|5.5|C 5\+5 LTE|View XL|Mega|C 8\+8|[CG][ _]HD|C|G|Touch|M HD|G2 HD|M5 Plus|J[1258]|X8 HD|X5|X10\+?|XL(?: 2)?|X)(?:[);/ ]|$)'
+      model: 'Studio $1'
+    - regex: '(?:BLU[_ ])?Studio[ _]5.0 ?K(?:[);/ ]|$)'
+      model: 'Studio 5.0 K'
+    - regex: 'STUDIO SELFIE LTE'
+      model: 'Studio Selfie LTE'
+    - regex: 'STUDIO ONE'
+      model: 'Studio One'
+    - regex: 'STUDIO[_ ](X12)(?:[);/ ]|$)'
+      model: 'Studio $1'
+    - regex: 'STUDIO SELFIE ([23]|LTE)'
+      model: 'Studio Selfie $1'
+    - regex: 'STUDIO SELFIE'
+      model: 'Studio Selfie'
+    - regex: '(?:BLU[_ ])?NEO_ENERGY_MINI'
+      model: 'Neo Energy Mini'
+    - regex: 'ENERGY DIAMOND'
+      model: 'Energy Diamond'
+    - regex: 'ENERGY XL'
+      model: 'Energy XL'
+    - regex: 'Energy X 2'
+      model: 'Energy X 2'
+    - regex: 'ENERGY X PLUS 2'
+      model: 'Energy X Plus 2'
+    - regex: 'ENERGY X PLUS'
+      model: 'Energy X Plus'
+    - regex: 'LIFE XL'
+      model: 'Life XL'
+    - regex: 'DASH[ _]X[ _]PLUS[ _]LTE'
+      model: 'Dash X Plus LTE'
+    - regex: 'DASH X PLUS'
+      model: 'Dash X Plus'
+    - regex: 'DASH 4.5'
+      model: 'Dash 4.5'
+    - regex: 'Dash XL'
+      model: 'Dash XL'
+    - regex: 'PURE (X[LR]|View)'
+      model: 'Pure $1'
+    - regex: 'PURE MINI'
+      model: 'Pure Mini'
+    - regex: 'BOLD (M7|N1)'
+      model: 'Bold $1'
+    - regex: 'Life One X2 Mini'
+      model: 'Life One X2 Mini'
+    - regex: 'LIFE ONE (X2?)'
+      model: 'Life One $1'
+    - regex: 'LIFE ONE'
+      model: 'Life One'
+    - regex: 'LIFE X LTE'
+      model: 'Life X LTE'
+    - regex: 'LIFE MARK'
+      model: 'Life Mark'
+    - regex: 'NEO X PLUS'
+      model: 'Neo X Plus'
+    - regex: 'NEO (XL|X)'
+      model: 'Neo $1'
+    - regex: 'G50 Mega'
+      model: 'G50 Mega'
+    - regex: 'G50 Plus'
+      model: 'G50 Plus'
+    - regex: 'G51 Plus'
+      model: 'G51 Plus'
+    - regex: 'G(90?) PRO'
+      model: 'G$1 Pro'
+    - regex: 'G91 PRO'
+      model: 'G91 Pro'
+    - regex: '(G90|D701)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'GRAND 5.5 HD'
+      model: 'Grand 5.5 HD'
+    - regex: 'Grand X LTE'
+      model: 'Grand X LTE'
+    - regex: 'Grand XL LTE'
+      model: 'Grand XL LTE'
+    - regex: 'Grand Max'
+      model: 'Grand Max'
+    - regex: 'Grand Mini'
+      model: 'Grand Mini'
+    - regex: 'Grand M3'
+      model: 'Grand M3'
+    - regex: 'B110DL'
+      model: 'View Mega'
+    - regex: 'B130DL'
+      model: 'View 2'
+    - regex: 'B140DL'
+      model: 'View 3'
+    - regex: 'VIEW 1'
+      model: 'View 1'
+    - regex: 'R1 HD'
+      model: 'R1 HD'
+    - regex: 'R2 LTE'
+      model: 'R2 LTE'
+    - regex: 'R([12]) PLUS'
+      model: 'R$1 Plus'
+    - regex: 'C([456]) 20(19|20)'
+      model: 'C$1 (20$2)'
+    - regex: 'Tank Xtreme ([45]).0'
+      model: 'Tank Xtreme $1.0"'
+    - regex: 'Tank Xtreme Pro'
+      model: 'Tank Xtreme Pro'
+    - regex: 'Tank Xtreme'
+      model: 'Tank Xtreme'
+    - regex: 'VIVO AIR LTE'
+      model: 'Vivo Air LTE'
+    - regex: 'Touchbook G7'
+      model: 'Touchbook G7'
+    - regex: 'C([56])L 20(20|21)'
+      model: 'C$1L (20$2)'
+    - regex: 'C5L Plus'
+      model: 'C5L Plus'
+    - regex: 'C([56])L'
+      model: 'C$1L'
+    - regex: '(?:BLU[_ ])?VIVO[ _]SELFIE'
+      model: 'Vivo Selfie'
+    - regex: '(?:BLU[_ ])?Vivo 5 Mini'
+      model: 'Vivo 5 Mini'
+    - regex: 'Vivo One Plus 2019'
+      model: 'Vivo One Plus (2019)'
+    - regex: '(?:BLU[_ ])?Vivo (One|XL3|XI)(?: Plus|[+])'
+      model: 'Vivo $1 Plus'
+    - regex: '(?:BLU[_ ])?Vivo (5R|XI|XL[234]|8L)'
+      model: 'Vivo $1'
+    - regex: '(?:BLU[_ ])?VIVO GO'
+      model: 'Vivo Go'
+
+    - regex: 'Touchbook M7 Pro'
+      model: 'Touchbook M7 Pro'
+      device: 'tablet'
+    - regex: 'STUDIO 7.0 II'
+      model: 'Studio 7.0" II'
+      device: 'tablet'
+
+    - regex: 'DASH (L[45] LTE|5.0|L[45]X|L3|X2|[LMX])(?:[);/ ]|$)'
+      model: 'Dash $1'
+
+    - regex: 'DASH[ _]([^)/;]+)(?: Build|\))'
+      model: 'Dash $1'
+
+    - regex: 'blu[ _]([^/;]+)( Build|[);])'
+      model: '$1'
 
 # Bluegood
 Bluegood:
@@ -2319,7 +3343,7 @@ Bluegood:
 
 # Blackview
 Blackview:
-  regex: 'Blackview|(BV([24-9]000|(5[589]|9[15689])00|6[138]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))'
+  regex: 'Blackview|(BV([24-9]000|[46]900|(5[1589]|9[15689])00|6[1368]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))|(?:A[86]0Plus|A80S|BL6000Pro|R6 Lite|P2Lite|A8 MAX)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'A60Pro\)'
@@ -2328,20 +3352,26 @@ Blackview:
       model: 'A60'
     - regex: 'A80Pro(?:[);/ ]|$)'
       model: 'A80 Pro'
+    - regex: 'A8 MAX(?:[);/ ]|$)'
+      model: 'A8 Max'
+    - regex: 'A80S(?:[);/ ]|$)'
+      model: 'A80S'
+    - regex: '(A[86]0|BV[59]500)Plus(?:[);/ ]|$)'
+      model: '$1 Plus'
     - regex: '(BV6000S)'
       model: '$1'
-    - regex: '(BV9700)Pro'
-      model: '$1 Pro'
-    - regex: 'Blackview (A8|E7S)'
-      model: '$1'
+    - regex: '(P2|R6) ?Lite'
+      model: '$1 Lite'
     - regex: 'BV9000Pro-F'
       model: 'BV9000 Pro F'
-    - regex: '(BV([48]000|9[56]00|6[83]00))Pro'
+    - regex: '(BL6000|BV(?:[0-9]+))Pro'
       model: '$1 Pro'
-    - regex: '(BV6100)(?:[);/ ]|$)'
+    - regex: 'Blackview (A[78]|E7S)'
+      model: '$1'
+    - regex: '(BV6[13]00)(?:[);/ ]|$)'
       model: '$1'
       device: 'phablet'
-    - regex: '(BV([24-9]000|(5[589]|9[15689])00)(?:[ _](?:PRO))?)'
+    - regex: '(BV([24-9]000|6[69]00|4900|9[69]00E|(5[1589]|9[15689])00)(?:[ _](?:PRO))?)'
       model: '$1'
     - regex: '(P10000(?:[ _](?:PRO))?)'
       model: '$1'
@@ -2350,33 +3380,39 @@ Blackview:
     - regex: '(Alife[ _][PS]1|DM550|Heatwave)'
       model: '$1'
 
-# Bluboo
+# Bluboo (bluboo.tel)
 Bluboo:
-  regex: 'Bluboo|Xfire|Picasso 4G|Maya Build'
+  regex: 'Bluboo|Maya Build|(?:(?<!IQM )Picasso(?: 4G)?|Xfire2?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Maya Build'
       model: 'Maya'
     - regex: 'Xfire2'
       model: 'Xfire 2'
-    - regex: 'Picasso 4G'
+    - regex: 'Picasso(?: 4G)?'
       model: 'Picasso 4G'
     - regex: 'Xfire'
       model: 'Xfire'
+    - regex: '(?:Bluboo[_ ])?S8[_ ]plus'
+      model: 'S8 Plus'
     - regex: 'Bluboo[ _-]?([^;/)]+) Build'
       model: '$1'
     - regex: 'Bluboo[ _-]?([^;/)]+)'
       model: '$1'
 
-# Black Fox
+# Black Fox or BlackFox
 'Black Fox':
-  regex: 'BMM[ _-]?(?:44[123]D|441S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD])(?:[);/ ]|$)'
+  regex: 'BMM[ _-]?(?:44[123]D|441[AWB]|44[12]S|431[SD]|53[23]D|54[12]S|541[ABW]|54[123]D|543S|531[ABD]|532 S|531S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'BMM443D'
       model: 'B7 Fox+'
-    - regex: 'BMM441S'
+    - regex: 'BMM441[AS]'
       model: 'B8 Fox'
+    - regex: 'BMM442S|BMM441B'
+      model: 'B8 Fox+'
+    - regex: 'BMM441W'
+      model: 'B8M'
     - regex: 'BMM442D'
       model: 'B7'
     - regex: 'BMM531D'
@@ -2399,7 +3435,9 @@ Bluboo:
       model: 'B3'
     - regex: 'BMM541W'
       model: 'B7R Fox'
-    - regex: 'BMM[ _-]?(533D|431D|54[12]S)(?:[);/ ]|$)'
+    - regex: 'BMM 532 S'
+      model: 'BMM 532S'
+    - regex: 'BMM[ _-]?(53[23]D|431[DS]|54[12]S|531S)(?:[);/ ]|$)'
       model: 'BMM $1'
 
 # bogo
@@ -2432,7 +3470,7 @@ Boway:
 
 # Brondi
 Brondi:
-  regex: 'Brondi[ _]|(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY)(?:[ _-]?[2-6])?(?:[);/ ]|$)|Surfing Tab|501 SZ'
+  regex: 'Brondi[ _]|(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY|AMICO_SMARTPHONE_4G)(?:[ _-]?[2-6])?(?:[);/ ]|$)|Surfing Tab|501 SZ'
   device: 'smartphone'
   models:
     - regex: '(?:Brondi[ _])?(620 SZ|730_4G_HD|501 SZ)(?:[);/ ]|$)'
@@ -2449,31 +3487,47 @@ Brondi:
       model: 'SENSUELLE $1'
     - regex: 'VICTORY(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'VICTORY $1'
+    - regex: 'AMICO_SMARTPHONE_4G(?:[);/ ]|$)'
+      model: 'Amico Smartphone 4G'
 
     - regex: 'Surfing Tab ([^;/]+) Build'
       model: 'SURFING TAB $1'
       device: 'tablet'
-    - regex: 'Surfing Tab ([^;/]+)(?:[);/ ]|$)'
+    - regex: 'Surfing Tab ([^;/)]+)[;/)]'
       model: 'SURFING TAB $1'
       device: 'tablet'
 
-# VGO TEL
+# VGO TEL (vgotel.com)
 VGO TEL:
-  regex: 'Venture V(?:[278]|12)(?:[);/ ]|$)'
+  regex: 'VGOTEL|(?:Venture V(?:[278]|12)|VentureV10|Ocean[_ ][689]|Ocean9L)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Venture V([278]|12)(?:[);/ ]|$)'
+    - regex: 'Venture ?V([278]|1[02])(?:[);/ ]|$)'
       model: 'Venture V$1'
+    - regex: 'Ocean[_ ]?([689]|9L)(?:[);/ ]|$)'
+      model: 'Ocean $1'
 
 # Vivo (vivo.com.cn, vivo.com)
 Vivo:
-  regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[3469][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|1819|V201[12]A|V202[0345]C?A)(?:[);/ ]|$)'
+  regex: '((?:VIV-|BBG-)?(?<!FBCR/|NOA )vivo(?!(?:Browser)| 4G_r))|(?:V1730(D[AT]|GA)|V18(01A0|13B[AT])|1819|V1937|I(?:192[78]|201[28])|V(?:2006|202[2-9]|203[0-35-9]|204[0-3568]|205[02-5789]|206[015689]|2070|210[12459]|211[01]|212[049])|V(?:2026|2031|2036|2043)_21|V1936AL|V(?:1732|1809|181[3468]|182[149]|183[1268]|1901|191[13469]|192[1-48]|193[0246]|194[15]|195[05]|196[235]|198[16]|1990|200[125]|201[12]|202[03-5]|203[146]|204[6789]|205[45679]|2066B|206[1568]|207[23]|208[05]|2099|2106|211[18]|212[13]|213[346]|214[1358]|2162)A|V1824BA|V(?:1731|1818|2020)CA|V(?:1818|1938)CT|V(?:1730|2031)EA|V(?:1732|1809|181[3468]|182[19]|183[1268]|1901|1913|1938)T|V2029_PK|V2069A|V2171A|I2011|X50 Pro\+|V211[45]A?|V204[57]A?|V210[28]A?|I2009|V215[4678]A|V213[01]A|V2023EA|V1962BA|V2142|V1930)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'V1824[B]?A(?:[);/ ]|$)'
       model: 'iQOO'
     - regex: 'V1955A(?:[);/ ]|$)'
       model: 'iQOO 3'
+    - regex: 'V2171A(?:[);/ ]|$)'
+      model: 'iQOO 9'
+    - regex: 'I192[78](?:[);/ ]|$)'
+      model: 'iQOO 3 5G'
+    - regex: '(?:V2049A|I2009)(?:[);/ ]|$)'
+      model: 'iQOO 7'
+    - regex: 'V2157A'
+      model: 'iQOO Neo 5 SE'
+    - regex: 'V2154A'
+      model: 'iQOO Neo 5S'
+    - regex: 'I2012(?:[);/ ]|$)'
+      model: 'iQOO 7 5G'
     - regex: 'V1922A(?:[);/ ]|$)'
       model: 'iQOO Pro' # 2019
     - regex: 'V1916A(?:[);/ ]|$)'
@@ -2484,40 +3538,104 @@ Vivo:
       model: 'iQOO Neo 3'
     - regex: 'V1936A[L]?(?:[);/ ]|$)'
       model: 'iQOO Neo 855'
+    - regex: 'V2055A(?:[);/ ]|$)'
+      model: 'iQOO Neo 5'
+    - regex: 'V2118A(?:[);/ ]|$)'
+      model: 'iQOO Neo 5 Lite'
     - regex: 'V1986A(?:[);/ ]|$)'
       model: 'iQOO Z1'
     - regex: 'V2012A(?:[);/ ]|$)'
       model: 'iQOO Z1x'
-    - regex: 'V1919A(?:[);/ ]|$)'
+    - regex: '(?:V2073A|I2011)(?:[);/ ]|$)'
+      model: 'iQOO Z3'
+    - regex: 'V1919A'
       model: 'iQOO Z5x'
+    - regex: 'V2131A'
+      model: 'iQOO Z5x 5G'
+    - regex: 'V2148A'
+      model: 'iQOO Z5'
+    - regex: 'I2018(?:[);/ ]|$)'
+      model: 'iQOO Z5 5G'
     - regex: 'V2023A(?:[);/ ]|$)'
       model: 'iQOO U1'
+    - regex: 'V2065A(?:[);/ ]|$)'
+      model: 'iQOO U1x'
+    - regex: 'V2061A(?:[);/ ]|$)'
+      model: 'iQOO U3'
+    - regex: 'V2143A(?:[);/ ]|$)'
+      model: 'iQOO U3x'
+    - regex: 'V2106A(?:[);/ ]|$)'
+      model: 'iQOO U3x 5G'
     - regex: 'V2024A(?:[);/ ]|$)'
       model: 'iQOO 5'
     - regex: 'V2025A(?:[);/ ]|$)'
       model: 'iQOO 5 Pro'
+    - regex: 'V2136A(?:[);/ ]|$)'
+      model: 'iQOO 8'
+    - regex: 'V2141A(?:[);/ ]|$)'
+      model: 'iQOO 8 Pro'
+    - regex: '(?:V2025)(?:[);/ ]|$)'
+      model: 'V20'
+    - regex: '(?:V2066|V2108)(?:[);/ ]|$)'
+      model: 'V21'
+    - regex: '(?:V2050)(?:[);/ ]|$)'
+      model: 'V21 5G'
+    - regex: 'V2061(?:[);/ ]|$)'
+      model: 'V21e'
+    - regex: 'V2055(?:[);/ ]|$)'
+      model: 'V21e 5G'
+    - regex: 'V2040(?:[);/ ]|$)'
+      model: 'V20 (2021)'
+    - regex: 'Vivo 1921(?:[);/ ]|$)'
+      model: 'U20'
+    - regex: 'Vivo 1916(?:[);/ ]|$)'
+      model: 'U10'
     - regex: 'vivo 1805(?:[);/ ]|$)'
       model: 'Nex'
-    - regex: 'V1923A(?:[);/ ]|$)'
+    - regex: '(?:vivo 1912|V1923A)(?:[);/ ]|$)'
       model: 'Nex 3'
     - regex: 'V1924A(?:[);/ ]|$)'
       model: 'Nex 3 5G'
     - regex: 'V1950A(?:[);/ ]|$)'
       model: 'Nex 3S'
-    - regex: 'V1821[AT](?:[);/ ]|$)'
+    - regex: 'vivo NEX S(?:[);/ ]|$)'
+      model: 'Nex S'
+    - regex: 'vivo NEX A(?:[);/ ]|$)'
+      model: 'Nex A'
+    - regex: 'vivo NEX(?:[);/ ]|$)'
+      model: 'Nex'
+    - regex: '(?:V1821[AT]|vivo 1813)(?:[);/ ]|$)'
       model: 'Nex Dual Display'
     - regex: 'Vivo ONE(?:[);/ ]|$)'
       model: 'One'
-    - regex: 'V1831[AT](?:[);/ ]|$)'
+    - regex: 'V2115A'
+      model: 'T1 5G'
+    - regex: 'V1962BA'
+      model: 'G1 5G'
+    - regex: 'V1831[AT]'
       model: 'S1'
     - regex: 'V1832[AT](?:[);/ ]|$)'
       model: 'S1 Pro'
+    - regex: 'V2121A(?:[);/ ]|$)'
+      model: 'S10'
+    - regex: 'V2130A'
+      model: 'S10e 5G'
     - regex: 'V1932[AT](?:[);/ ]|$)'
       model: 'S5'
     - regex: 'V1962A(?:[);/ ]|$)'
       model: 'S6 5G'
+    - regex: 'V2162A(?:[);/ ]|$)'
+      model: 'S12 5G'
     - regex: 'V2020C?A(?:[);/ ]|$)'
       model: 'S7'
+    - regex: 'V2031EA(?:[);/ ]|$)'
+      model: 'S7e'
+    - regex: 'V2080A(?:[);/ ]|$)'
+      model: 'S7t'
+    - regex: 'V2072A(?:[);/ ]|$)'
+      model: 'S9 (2021)'
+    - regex: 'V2048A(?:[);/ ]|$)'
+      model: 'S9e'
     - regex: 'V1941A(?:[);/ ]|$)'
       model: 'U3'
     - regex: 'V1928A(?:[);/ ]|$)'
@@ -2530,8 +3648,18 @@ Vivo:
       model: 'V15'
     - regex: 'vivo 1818(?:[);/ ]|$)'
       model: 'V15 Pro'
-    - regex: 'vivo 1909(?:[);/ ]|$)'
+    - regex: 'vivo 19(?:10|09)(?:[);/ ]|$)'
       model: 'V17 Pro'
+    - regex: 'vivo 1907(?:_19)?(?:[);/ ]|$)'
+      model: 'V17 Neo'
+    - regex: 'vivo 19(?:20(?:_20)?|19)(?:[);/ ]|$)'
+      model: 'V17'
+    - regex: 'vivo 1933(?:[);/ ]|$)'
+      model: 'V19'
+    - regex: 'V2022(?:[);/ ]|$)'
+      model: 'V20 SE'
+    - regex: 'vivo 2018(?:[);/ ]|$)'
+      model: 'V20 Pro'
     - regex: '(?:VIV-|BBG-)?vivo[ _]1601(?:[);/ ]|$)'
       model: 'V5'
     - regex: 'vivo 1609(?:[);/ ]|$)'
@@ -2542,17 +3670,31 @@ Vivo:
       model: 'V5s'
     - regex: 'vivo 1718(?:[);/ ]|$)'
       model: 'V7'
-    - regex: 'vivo 1716(?:[);/ ]|$)'
+    - regex: 'vivo (?:1716|1850)(?:[);/ ]|$)'
       model: 'V7 Plus'
     - regex: 'vivo 1723(?:[);/ ]|$)'
       model: 'V9'
     - regex: 'vivo 1727(?:[);/ ]|$)'
       model: 'V9 Youth'
+    - regex: 'vivo 1851(?:[);/ ]|$)'
+      model: 'V9 Pro'
+    - regex: 'vivo V3Max(?: [AL])?(?:[);/ ]|$)'
+      model: 'V3 Max'
+    - regex: 'vivo X9s Plus(?:[);/ ]|$)'
+      model: 'X9s Plus'
+    - regex: 'vivo X9s(?: [AL])?(?:[);/ ]|$)'
+      model: 'X9s'
+    - regex: 'vivo X5Pro(?:[);/ ]|$)'
+      model: 'X5 Pro'
     - regex: 'vivo 1721(?:[);/ ]|$)'
       model: 'X20'
-    - regex: 'X20Plus(?:[);/ ]|$)'
+    - regex: '(?:X20Plus(?: a)?|vivo 1720)(?:[);/ ]|$)'
       model: 'X20 Plus'
-    - regex: 'vivo 1725(?:[);/ ]|$)'
+    - regex: 'vivo X21i(?: A)?(?:[);/ ]|$)'
+      model: 'X21i'
+    - regex: 'vivo X21UD(?: A)?(?:[);/ ]|$)'
+      model: 'X21 UD'
+    - regex: 'vivo (?:1725|X21A?)(?:[);/ ]|$)'
       model: 'X21'
     - regex: 'V1814[AT](?:[);/ ]|$)'
       model: 'X21S'
@@ -2568,60 +3710,188 @@ Vivo:
       model: 'X30'
     - regex: 'V1938T(?:[);/ ]|$)'
       model: 'X30 Pro'
-    - regex: 'V2001A(?:[);/ ]|$)'
+    - regex: '(?:V2001A|vivo 2004)(?:[);/ ]|$)'
       model: 'X50'
-    - regex: 'V2005A(?:[);/ ]|$)'
+    - regex: 'V1930(?:[);/ ]|$)'
+      model: 'X50e'
+    - regex: 'vivo 2005(?:[);/ ]|$)'
+      model: 'X50 5G'
+    - regex: '(?:vivo 1937|V1937)(?:[);/ ]|$)'
+      model: 'X50 Lite'
+    - regex: '(?:V2005A|vivo 2006)(?:[);/ ]|$)'
       model: 'X50 Pro'
-    - regex: 'V2011A(?:[);/ ]|$)'
+    - regex: '(?:V2011A|X50 Pro\+)(?:[);/ ]|$)'
       model: 'X50 Pro Plus'
-    - regex: 'X9Plus(?:[);/ ]|$)'
-      model: 'X9 Plus'
+    - regex: '(?:V20(?:46|59)A|V2045)(?:[);/ ]|$)'
+      model: 'X60'
+    - regex: 'V2085A(?:[);/ ]|$)'
+      model: 'X60t'
+    - regex: '(?:V2047A|V2046)(?:[);/ ]|$)'
+      model: 'X60 Pro'
+    - regex: '(?:V2056A|V2047)(?:[);/ ]|$)'
+      model: 'X60 Pro Plus'
+    - regex: '(?:V2134A|V2105)(?:[);/ ]|$)'
+      model: 'X70 Pro'
+    - regex: '(?:V2145A|V2114)(?:[);/ ]|$)'
+      model: 'X70 Pro+'
+    - regex: 'V2133A(?:[);/ ]|$)'
+      model: 'X70'
+    - regex: 'V2104(?:[);/ ]|$)'
+      model: 'X70 5G'
+    - regex: 'X([0-9])Plus(?: A)?(?:[);/ ]|$)'
+      model: 'X$1 Plus'
+    - regex: 'vivo Xplay6(?:[);/ ]|$)'
+      model: 'X Play 6'
+    - regex: 'vivo (?:1929|2015)(?:_21)?(?:[);/ ]|$)'
+      model: 'Y1s'
     - regex: 'vivo 1902(?:[);/ ]|$)'
       model: 'Y17'
+    - regex: 'vivo 1906(?:_20)?(?:[);/ ]|$)'
+      model: 'Y11'
+    - regex: 'vivo 19(?:04|40)(?:[);/ ]|$)'
+      model: 'Y12'
+    - regex: 'V2102(?:[);/ ]|$)'
+      model: 'Y12a'
+    - regex: 'vivo 2007(?:[);/ ]|$)'
+      model: 'Y12i'
+    - regex: 'vivo 1901(?:[);/ ]|$)'
+      model: 'Y15'
+    - regex: 'V2120(?:[);/ ]|$)'
+      model: 'Y15s'
     - regex: 'vivo 1915(?:[);/ ]|$)'
       model: 'Y19'
+    - regex: 'V202[79](?:_PK)?(?:[);/ ]|$)'
+      model: 'Y20'
+    - regex: 'vivo 1613(?:[);/ ]|$)'
+      model: 'Y25'
+    - regex: '(?:V2043_21|V2048)(?:[);/ ]|$)'
+      model: 'Y20 (2021)'
+    - regex: '(?:V205[24]|V2070|V2101)(?:[);/ ]|$)'
+      model: 'Y20A'
+    - regex: 'V2037(?:[);/ ]|$)'
+      model: 'Y20G'
+    - regex: 'V2129(?:[);/ ]|$)'
+      model: 'Y20T'
+    - regex: 'V2065(?:[);/ ]|$)'
+      model: 'Y20G (2021)'
+    - regex: 'V2028(?:[);/ ]|$)'
+      model: 'Y11s'
+    - regex: 'V2038(?:[);/ ]|$)'
+      model: 'Y20s'
+    - regex: 'V2043(?:[);/ ]|$)'
+      model: 'Y20 (2021)'
+    - regex: 'V(?:2041|2060)(?:[);/ ]|$)'
+      model: 'Y72 5G'
+    - regex: 'V2102A'
+      model: 'Y72T 5G'
+    - regex: 'V2032(?:[);/ ]|$)'
+      model: 'Y20i'
+    - regex: 'V2110(?:[);/ ]|$)'
+      model: 'Y21s'
+    - regex: 'V2111(?:[);/ ]|$)'
+      model: 'Y21'
+    - regex: 'V2023(?:[);/ ]|$)'
+      model: 'V20 SE'
     - regex: 'V1901[AT](?:[);/ ]|$)'
       model: 'Y3'
     - regex: 'V1930A(?:[);/ ]|$)'
       model: 'Y3 Standard'
+    - regex: '(?:vivo 1938|V203[46]A)(?:[);/ ]|$)'
+      model: 'Y30'
+    - regex: 'V2099A(?:[);/ ]|$)'
+      model: 'Y30 (2021)'
+    - regex: 'V2066[B]?A(?:[);/ ]|$)'
+      model: 'Y30g'
+    - regex: 'V2036(?:_21)?(?:[);/ ]|$)'
+      model: 'Y31'
+    - regex: 'V2068A?(?:[);/ ]|$)'
+      model: 'Y31s'
+    - regex: 'V2158A'
+      model: 'Y32'
+    - regex: 'V2057(?:[);/ ]|$)'
+      model: 'Y33'
+    - regex: 'V2109(?:[);/ ]|$)'
+      model: 'Y33s'
     - regex: 'V1934A(?:[);/ ]|$)'
       model: 'Y5s'
-    - regex: 'V1965A(?:[);/ ]|$)'
+    - regex: '(?:V1965A|vivo 1935)(?:[);/ ]|$)'
       model: 'Y50'
+    - regex: 'V2023EA'
+      model: 'Y50t'
+    - regex: 'V(?:2024|203[05])(?:[);/ ]|$)'
+      model: 'Y51'
+    - regex: 'vivo 1707(?:[);/ ]|$)'
+      model: 'Y51 (2015)'
+    - regex: 'V2031(?:_21)?(?:[);/ ]|$)'
+      model: 'Y51s'
+    - regex: 'V2054A(?:[);/ ]|$)'
+      model: 'Y31s'
+    - regex: 'V2057A(?:[);/ ]|$)'
+      model: 'Y52s'
+    - regex: 'V2053(?:[);/ ]|$)'
+      model: 'Y52'
     - regex: 'vivo 1606(?:[);/ ]|$)'
       model: 'Y53i'
+    - regex: 'vivo 1606a(?:[);/ ]|$)'
+      model: 'Y53'
+    - regex: '(?:V2058|V2111A|V2123A)(?:[);/ ]|$)'
+      model: 'Y53s'
+    - regex: 'V2069A'
+      model: 'Y53s T1'
     - regex: 'vivo 1603(?:[);/ ]|$)'
       model: 'Y55l'
     - regex: 'vivo 1610(?:[);/ ]|$)'
       model: 'Y55s'
+    - regex: 'V2045A'
+      model: 'Y54s'
     - regex: 'vivo 1719(?:[);/ ]|$)'
       model: 'Y65'
-    - regex: 'vivo 1714(?:[);/ ]|$)'
+    - regex: 'vivo (?:1714|Y69A?)(?:[);/ ]|$)'
       model: 'Y69'
     - regex: 'V2002A(?:[);/ ]|$)'
       model: 'Y70s'
-    - regex: 'vivo 1724(?:[);/ ]|$)'
+    - regex: 'V2006(?:[);/ ]|$)'
+      model: 'Y60s'
+    - regex: 'vivo (?:1724|Y71A?)(?:[);/ ]|$)'
       model: 'Y71'
-    - regex: 'vivo 1801(?:[);/ ]|$)'
+    - regex: 'vivo 1801i?(?:[);/ ]|$)'
       model: 'Y71i'
     - regex: 'V1731CA(?:[);/ ]|$)'
       model: 'Y73'
+    - regex: 'V2059(?:[);/ ]|$)'
+      model: 'Y73 (2021)'
+    - regex: 'V2031A(?:[);/ ]|$)'
+      model: 'Y73s'
+    - regex: 'V2124(?:[);/ ]|$)'
+      model: 'Y76 5G'
+    - regex: 'V2156A'
+      model: 'Y76s'
     - regex: 'V1913[AT](?:[);/ ]|$)'
       model: 'Y7s'
     - regex: 'vivo 180([38]|8i)(?:[);/ ]|$)'
       model: 'Y81'
-    - regex: 'vivo 1812(?:[);/ ]|$)'
+    - regex: 'vivo 1812(?:_19)?(?:[);/ ]|$)'
       model: 'Y81i'
     - regex: 'V1732[AT](?:[);/ ]|$)'
       model: 'Y81s'
+    - regex: 'vivo (?:Y83A?|1802)(?:[);/ ]|$)'
+      model: 'Y83'
     - regex: 'vivo 1726(?:[);/ ]|$)'
       model: 'Y83 Pro'
     - regex: 'V1730EA(?:[);/ ]|$)'
       model: 'Y89'
+    - regex: 'vivo (?:1823|1908)(?:_19)?(?:[);/ ]|$)'
+      model: 'Y90'
     - regex: 'vivo 181[17](?:[);/ ]|$)'
       model: 'Y91'
+    - regex: 'vivo 1820(?:_19)?(?:[);/ ]|$)'
+      model: 'Y91i'
     - regex: 'V1945A(?:[);/ ]|$)'
       model: 'Y9s'
+    - regex: '(?:V2026|V2033|V2042)(?:[);/ ]|$)'
+      model: 'Y12s'
+    - regex: '(?:V20[63]9|V2026_21)(?:[);/ ]|$)'
+      model: 'Y12s (2021)'
     - regex: 'vivo 18(16|20)(?:[);/ ]|$)'
       model: 'Y91i'
     - regex: '(V1818[AT]|vivo 181[45])(?:[);/ ]|$)'
@@ -2634,13 +3904,15 @@ Vivo:
       model: 'Y97'
     - regex: 'V1801A0(?:[);/ ]|$)'
       model: 'Z1'
+    - regex: 'vivo (?:1918|1951)(?:[);/ ]|$)'
+      model: 'Z1 Pro'
     - regex: 'V1730D[AT](?:[);/ ]|$)'
       model: 'Z1i'
     - regex: 'vivo 1917(?:[);/ ]|$)'
       model: 'Z1x'
     - regex: 'V1813B[AT](?:[);/ ]|$)'
       model: 'Z3'
-    - regex: 'V1730GA(?:[);/ ]|$)'
+    - regex: '(?:vivo Z3x|V1730GA)(?:[);/ ]|$)'
       model: 'Z3x'
     - regex: 'V1921A(?:[);/ ]|$)'
       model: 'Z5'
@@ -2650,7 +3922,28 @@ Vivo:
       model: 'Z5x (2020)'
     - regex: 'V1963A(?:[);/ ]|$)'
       model: 'Z6'
-
+    - regex: 'V2142(?:[);/ ]|$)'
+      model: 'Y75 5G'
+    - regex: 'vivo Y75s(?:[);/ ]|$)'
+      model: 'Y75s'
+    - regex: 'vivo X710L?(?:[);/ ]|$)'
+      model: 'X Shot'
+    - regex: 'X6SPlus(?: [AD])?(?:[);/ ]|$)'
+      model: 'X6S Plus'
+    - regex: 'vivo X6S(?: A)?(?:[);/ ]|$)'
+      model: 'X6S'
+    - regex: 'vivo X([5679]|20)[ALD]?(?:[);/ ]|$)'
+      model: 'X$1'
+    - regex: 'vivo X5Pro(?: L)?(?:[);/ ]|$)'
+      model: 'X5 Pro'
+    - regex: 'vivo Y66i(?: A)?(?:[);/ ]|$)'
+      model: 'Y66i'
+    - regex: 'vivo Y(\d{2})[AL]?(?:[);/ ]|$)'
+      model: 'Y$1'
+    - regex: 'vivo Xplay(\d)S(?:[);/ ]|$)'
+      model: 'X Play $1S'
+    - regex: 'vivo Xplay(\d)[AL]?(?:[);/ ]|$)'
+      model: 'X Play $1'
     - regex: '(?:VIV-|BBG-)?vivo[ _]([^/;]+) Build'
       model: '$1'
     - regex: '(?:VIV-|BBG-)?vivo[ _]([^);/]+)(?:[);/]|$)'
@@ -2680,12 +3973,12 @@ Becker:
 
 # Beeline
 Beeline:
-  regex: 'Beeline'
+  regex: 'Beeline|A239s(?:[);/]|$)'
   device: 'smartphone'
   models:
     - regex: 'Beeline[_ ]Pro[_ ]([2436])'
       model: 'Pro $1'
-    - regex: 'Tab (Fast|Pro)'
+    - regex: 'Tab (Fast(?: 2)?|Pro)'
       model: 'Tab $1'
       device: 'tablet'
     - regex: 'Tab ([0-9])'
@@ -2694,11 +3987,9 @@ Beeline:
     - regex: 'Tab'
       model: 'Tab'
       device: 'tablet'
-    - regex: 'E700'
-      model: 'E700'
-    - regex: 'Smart2'
-      model: 'Smart 2'
-    - regex: 'Smart ([0-9])'
+    - regex: 'E([67]00)'
+      model: 'E$1'
+    - regex: '(?:Beeline[_ ])?Smart[ _]?([0-9])'
       model: 'Smart $1'
     - regex: 'Smart Dual'
       model: 'Smart Dual'
@@ -2706,6 +3997,8 @@ Beeline:
       model: 'Fast 2'
     - regex: 'Fast(?:[);/ ]|$)'
       model: 'Fast'
+    - regex: 'A239s(?:[);/ ]|$)'
+      model: 'Smart 8 A239s'
 
 # Beetel
 Beetel:
@@ -2721,13 +4014,17 @@ BenQ-Siemens:
 
 # BenQ
 BenQ:
-  regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
+  regex: 'BENQ(?:[ \-])?([a-z0-9]+)|(?:F52_09|F5_15)(?:[);/ ]|$)'
   device: 'feature phone'
-  model: '$1'
+  models:
+    - regex: 'F(52|5)_(?:15|09)(?:[);/ ]|$)'
+      model: 'F$1'
+    - regex: 'BENQ(?:[ \-])?([a-z0-9]+)'
+      model: '$1'
 
-# Blaupunkt
+# Blaupunkt (blaupunkt.com)
 Blaupunkt:
-  regex: 'Blaupunkt|Atlantis[_ ](?:1001A|1010A|A10\.G40[23])|Discovery[_ ](?:A10_302|111C|1000C|1001A?)|Endeavour[_ ](?:785|101[GLM]|1000|1001|101[03]|1100)|Polaris[_ ]803'
+  regex: 'Blaupunkt|Soundphone S2|Atlantis[_ ](?:1001A|1010A|A10\.G40[23])|SLplus02|Discovery[_ ](?:A10_302|111C|1000C|1001A?)|Endeavour[_ ](?:785|101[GLM]|1000|1001|101[03]|1100)|Polaris[_ ]803|BP_6010'
   device: 'tablet'
   models:
     - regex: 'Discovery[_ ]111C'
@@ -2740,25 +4037,45 @@ Blaupunkt:
       model: 'Discovery 1001A'
     - regex: 'Discovery[_ ]1001'
       model: 'Discovery 1001'
+    - regex: 'Soundphone S2'
+      model: 'Soundphone S2'
     - regex: 'Endeavour[_ ](101[GLM]|785|100[01]|101[03]|1100)'
       model: 'Endeavour $1'
     - regex: 'Polaris[_ ](803)'
       model: 'Polaris $1'
     - regex: 'Atlantis[_ ](1001A|1010A|A10\.G40[23])'
       model: 'Atlantis $1'
-    - regex: 'Blaupunkt (SL 0[124]|SM 01)'
+    - regex: 'SLplus02'
+      model: 'SL Plus 02'
+    - regex: '(BP_6010)'
+      model: '$1'
+    - regex: 'Blaupunkt[_ ](SL[_ ]0[124]|SM[_ ]0[12])'
       device: 'smartphone'
       model: '$1'
+    - regex: '(SF02)'
+      device: 'smartphone'
+      model: '$1'
+    - regex: '(4K Android TV)'
+      device: 'tv'
+      model: '$1'
 
 # Bmobile
 Bmobile:
-  regex: 'Bmobile[_ ]|AX-?([1-9][0-9]{2,3}[eEO+]?|7OO)'
+  regex: 'Bmobile[_ ]|B60Pro_MV03|BL54_?Pro|(?:B50Pro|FUN 4 2018|AX-?(?:[1-9][0-9]{2,3}[eEO+]?|7OO))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AX-?([1-9][0-9]{2,3}[eEO+]?)'
       model: 'AX$1'
     - regex: 'AX7OO'
       model: 'AX700'
+    - regex: 'FUN 4 2018'
+      model: 'Fun 4 (2018)'
+    - regex: 'B60Pro_MV03'
+      model: 'B60 Pro'
+    - regex: 'B50Pro'
+      model: 'B50 Pro'
+    - regex: 'BL54_?Pro'
+      model: 'BL54 Pro'
     - regex: 'Bmobile[_ ]([^/;]+) Build'
       model: '$1'
     - regex: 'Bmobile[_ ]([a-z0-9]+)'
@@ -2766,21 +4083,35 @@ Bmobile:
 
 # bq
 bq:
-  regex: 'Aquaris|bq [^/;]+ Build|BQS[-_]([0-9]{4})|(BQ(ru)?[_ -][0-9]{3,4})|BQ5059|BQ1008G'
+  regex: 'Aquaris|bq [^/;]+ Build|BQS[-_]([0-9]{4})|(BQ(ru)?[_ -][0-9]{3,4})|BQ5059|BQ1008G|BQru_BQru-'
   device: 'smartphone'
   models:
     - regex: 'BQ(?:ru)?-(?:5209L|5044)(?:[);/ ]|$)'
       model: 'Strike LTE'
     - regex: 'BQ(?:ru)?-(?:6035L)(?:[);/ ]|$)'
       model: 'Strike Power Max'
-    - regex: 'BQ(?:ru)?-(5535L)(?:[);/ ]|$)'
+    - regex: 'BQ(?:ru)?-(?:5535L)(?:[);/ ]|$)'
       model: 'Strike Power Plus'
-    - regex: 'BQ(S|ru)?-(5070|6040L)(?:[);/ ]|$)'
+    - regex: 'BQ(S|ru)?-(?:5070|6040L)(?:[);/ ]|$)'
       model: 'Magic'
+    - regex: 'BQ(S|ru)?-(?:6424L)(?:[);/ ]|$)'
+      model: 'Magic O'
     - regex: 'BQ(?:S|ru)?-(?:5730L)(?:[);/ ]|$)'
       model: 'Magic C'
     - regex: 'BQ(?:S|ru)?-(?:5731L)(?:[);/ ]|$)'
       model: 'Magic S'
+    - regex: 'BQ(?:S|ru)?-5745L(?:[);/ ]|$)'
+      model: 'Clever'
+    - regex: 'BQ(?:S|ru)?-5533G(?:[);/ ]|$)'
+      model: 'Fresh'
+    - regex: 'BQ(?:S|ru)?-5031G(?:[);/ ]|$)'
+      model: 'Fun'
+    - regex: 'BQ(?:S|ru)?-(?:5732L)(?:[);/ ]|$)'
+      model: 'Aurora SE'
+    - regex: 'BQ(?:S|ru)?-6430L(?:[);/ ]|$)'
+      model: 'Aurora'
+    - regex: 'BQ(?:S|ru)?-6630L(?:[);/ ]|$)'
+      model: 'Magic L'
     - regex: 'BQ-9011[G]?(?:[);/ ]|$)'
       model: 'Vision'
       device: 'tablet'
@@ -2827,9 +4158,13 @@ bq:
       device: 'tablet'
     - regex: 'BQ-6200L|BQ-6000L'
       model: 'Aurora'
+    - regex: 'BQ-6631G'
+      model: 'Surf'
+    - regex: 'BQ-6022G'
+      model: 'Aura'
     - regex: 'BQ(ru)?[ -]6015L'
       model: 'Universe'
-    - regex: 'BQ-6010G|BQ(?:ru)?-5525'
+    - regex: 'BQ(?:S|ru)?-(?:5525|6030G|6010G)'
       model: 'Practic'
     - regex: 'BQ-6001L|BQ-6050'
       model: 'Jumbo'
@@ -2839,7 +4174,7 @@ bq:
       model: 'Spring'
     - regex: 'BQ-5700L(?:[);/ ]|$)'
       model: 'Space X'
-    - regex: 'BQ-(?:5591|5518G)(?:[);/ ]|$)'
+    - regex: 'BQ-(?:5591|551[89]G)(?:[);/ ]|$)'
       model: 'Jeans'
     - regex: 'BQ-5522'
       model: 'Next'
@@ -2847,6 +4182,8 @@ bq:
       model: 'Silk'
     - regex: 'BQ-5519L(?:[);/ ]|$)'
       model: 'Fast Plus'
+    - regex: 'BQ-5540L(?:[);/ ]|$)'
+      model: 'Fast Pro'
     - regex: 'BQ-5517L(?:[);/ ]|$)'
       model: 'Twin Pro'
     - regex: 'BQ-5516L(?:[);/ ]|$)'
@@ -2873,6 +4210,10 @@ bq:
       model: 'Strike Selfie Max'
     - regex: 'BQ(?:ru)?-5503(?:[);/ ]|$)'
       model: 'Nice 2'
+    - regex: 'BQ(?:ru)?-6045L(?:[);/ ]|$)'
+      model: 'Nice'
+    - regex: 'BQ(?:ru)?-4030G(?:[);/ ]|$)'
+      model: 'Nice Mini'
     - regex: 'BQS-5502(?:[);/ ]|$)'
       model: 'Hammer'
     - regex: 'BQS-5501(?:[);/ ]|$)'
@@ -2901,13 +4242,19 @@ bq:
       model: 'Space'
     - regex: 'BQ-5082(?:[);/ ]|$)'
       model: 'Sense 2'
+    - regex: 'BQ-5045L(?:[);/ ]|$)'
+      model: 'Wallet'
+    - regex: 'BQ-5047L(?:[);/ ]|$)'
+      model: 'Like'
     - regex: 'BQ-5071(?:[);/ ]|$)'
       model: 'Belief'
     - regex: 'BQ[S]?-(?:5065|5340)(?:[);/ ]|$)'
       model: 'Choice'
+    - regex: 'BQ(?:S|ru)?-5046L(?:[);/ ]|$)'
+      model: 'Choice LTE'
     - regex: 'BQ(?:ru)?-?(?:5059|5514G)(?:[);/ ]|$)'
       model: 'Strike Power'
-    - regex: 'BQ-5058(?:[);/ ]|$)'
+    - regex: '(?:BQru_)?BQ(?:ru)?-5058(?:[);/ ]|$)'
       model: 'Strike Power Easy'
     - regex: 'BQ(?:ru)?-5057(?:[);/ ]|$)'
       model: 'Strike 2'
@@ -2921,6 +4268,10 @@ bq:
       model: 'Crystal'
     - regex: 'BQ-5052(?:[);/ ]|$)'
       model: 'Sense'
+    - regex: 'BQ-5060L'
+      model: 'Basic'
+    - regex: 'BQ-6051G(?:[);/ ]|$)'
+      model: 'Soul'
     - regex: 'BQ[S]?-5045(?:[);/ ]|$)'
       model: 'Fast'
     - regex: 'BQ(?:ru)?-(?:5037|5514L)(?:[);/ ]|$)'
@@ -2939,16 +4290,24 @@ bq:
       model: 'Bond'
     - regex: 'BQ-5015L(?:[);/ ]|$)'
       model: 'First'
+    - regex: 'BQ-5016G(?:[);/ ]|$)'
+      model: 'Choice'
     - regex: 'BQ-5012L(?:[);/ ]|$)'
       model: 'Rich'
+    - regex: 'BQ-5521L(?:[);/ ]|$)'
+      model: 'Rich Max'
     - regex: 'BQS-5011(?:[);/ ]|$)'
       model: 'Monte Carlo'
     - regex: 'BQ-5010G(?:[);/ ]|$)'
       model: 'Spot'
+    - regex: 'BQ-5000G(?:[);/ ]|$)'
+      model: 'Velvet Easy'
     - regex: 'BQS-5010(?:[);/ ]|$)'
       model: 'Prague'
     - regex: 'BQ-5009L(?:[);/ ]|$)'
       model: 'Trend'
+    - regex: 'BQ-5560L'
+      model: 'Trend (2021)'
     - regex: 'BQS-500[59](?:[);/ ]|$)'
       model: 'Sydney'
     - regex: 'BQ-5008L(?:[);/ ]|$)'
@@ -3075,9 +4434,9 @@ bq:
     - regex: 'Aquaris M8'
       model: 'Aquaris M8'
       device: 'tablet'
-    - regex: 'Aquaris_A4.5'
-      model: 'Aquaris A4.5'
-    - regex: 'BQ(?:ru)?[_ ]5590(?:[);/ ]|$)'
+    - regex: 'Aquaris_([AM])4.5'
+      model: 'Aquaris $14.5'
+    - regex: 'BQ(?:ru)?[_ -](?:5590|5740G)(?:[);/ ]|$)'
       model: 'Spring'
     - regex: 'BQ[S]?-(?:6016L|5520)(?:[);/ ]|$)'
       model: 'Mercury'
@@ -3128,9 +4487,15 @@ bq:
     - regex: 'BQ-1045[G]?(?:[);/ ]|$)'
       model: 'Orion'
       device: 'tablet'
-    - regex: 'BQ-1054L(?:[);/ ]|$)'
+    - regex: 'BQ-(?:1054L|1020L)(?:[);/ ]|$)'
       model: 'Nexion'
       device: 'tablet'
+    - regex: 'BQ-7083G(?:[);/ ]|$)'
+      model: 'Light'
+      device: 'tablet'
+    - regex: 'BQ-8077L(?:[);/ ]|$)'
+      model: 'Exion Plus'
+      device: 'tablet'
     - regex: 'BQ(?:ru)?-7083(?:[);/ ]|$)'
       model: '7083'
       device: 'tablet'
@@ -3140,12 +4505,21 @@ bq:
     - regex: 'BQ(?:ru)?-1022l(?:[);/ ]|$)'
       model: 'Armor Pro LTE+'
       device: 'tablet'
+    - regex: 'BQ(?:ru)?-1024L(?:[);/ ]|$)'
+      model: 'Exion Pro'
+      device: 'tablet'
+    - regex: 'BQ(?:ru)?-7055L(?:[);/ ]|$)'
+      model: 'Exion One'
+      device: 'tablet'
+    - regex: 'BQ(?:ru)?-1025L(?:[);/ ]|$)'
+      model: 'Exion Max'
+      device: 'tablet'
     - regex: 'BQ(?:ru)?-7081(?:[);/ ]|$)'
       model: 'Charm'
       device: 'tablet'
     - regex: '(?:bq )?(Aquaris[^/;]*) Build'
       model: '$1'
-    - regex: 'Aquaris (E(4.5|[56])|M(5|10)|U2 Lite|U2|U (Lite|Plus)|V Plus|X5 Plus|X5|X Pro|[CMUVX])'
+    - regex: 'Aquaris (VS|E(4.5|[56])|M(5|10)|U2 Lite|U2|U (Lite|Plus)|V Plus|X5 Plus|X2? Pro|X[25]|[CMUVX])'
       model: 'Aquaris $1'
     - regex: 'bq ([^/;]+) Build'
       model: '$1'
@@ -3153,14 +4527,20 @@ bq:
 
 # Bush
 Bush:
-  regex: 'Bush[ _-]'
+  regex: 'Bush[ ,_-]|Bush10Nou'
   device: 'smartphone'
   models:
-    - regex: 'BUSH ([^;/]+)Tablet Build'
+    - regex: 'Bush10Nou'
+      device: 'tablet'
+      model: '10Nou'
+    - regex: 'BUSH ([^;/)]+)Tablet(?: Build|[);])'
       model: '$1Tablet'
       device: 'tablet'
-    - regex: 'BUSH ([^;/]+) Build'
+    - regex: 'BUSH ([^;/)]+)(?: Build|[);])'
       model: '$1'
+    - regex: 'BUSH, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+      device: 'tv'
 
 # CAGI
 CAGI:
@@ -3196,30 +4576,36 @@ Casio:
     - regex: 'C811 4G(?:[);/ ]|$)'
       model: "G'zOne Commando 4G LTE"
 
-# Casper
+# Casper (casper.com.tr)
 Casper:
-  regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G4|M4|[LS]8|S7|P2|V8C|A1_Plus|A1|S10|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G)(?:[);/ ]|$)'
+  regex: 'CASPER[_ ]|VIA[- _]([XF]20|T7D|A[34]|E[43]|F[123]|G[345]|M4|[LS]8|S7|P[23]|V8C|A[13]_Plus(?:_64)?|A1(?:_1)?|S[13]0|S48|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G|S1[78]|S48_0)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'CASPER[_ ]VIA_(G1_Plus|G1|E1|[AE]2|M[123]|V[35689]|V10|G3)(?:[);/ ]|$)'
+    - regex: '(?:CASPER[_ ])?VIA_A1_Plus(?:_64)?'
+      model: 'VIA A1 Plus'
+    - regex: '(?:CASPER[_ ])?VIA[_ ]([XF]20|G1_Plus|A3_Plus|G[135]|E[14]|[AE]2|M[123]|V[35689]|V10|G3|V6X|A[34]|E3|F[123]|G4|M4|P[23]|S|V8C|A1(?:_1)?)(?:[);/ ]|$)'
       model: 'VIA $1'
     - regex: 'CASPER_VIA_E1c'
       model: 'VIA E1C'
     - regex: 'CASPER_L10_4.5G'
       model: 'L10 4.5G'
       device: 'tablet'
+    - regex: 'CASPER_(S[23]8)(?:[);/ ]|$)'
+      model: '$1'
+      device: 'tablet'
     - regex: 'VIA[- _](T7|T8D)-3G'
       model: 'VIA $1 3G'
       device: 'tablet'
-    - regex: 'VIA[- _](T7D|S10|[LS]8|S7|T17_M|T1[07]|T7|T8B)(?:[);/ ]|$)'
+    - regex: 'VIA[- _](T7D|S[13]0|S48|[LS]8|S7|T17_M|T1[07]|T7|T8B|S1[78])(?:[);/ ]|$)'
       model: 'VIA $1'
       device: 'tablet'
-    - regex: 'VIA[_ ](A[34]|E3|F[123]|G4|M4|P2|S|V8C|A1_Plus|A1)'
+    - regex: 'VIA[- _](S48)(?:_0)?(?:[);/ ]|$)'
       model: 'VIA $1'
+      device: 'tablet'
 
 # Cat (Caterpillar, Catphones)
 Cat:
-  regex: 'Cat ?(tablet|stargate|nova)|B15Q|CAT B35'
+  regex: 'Cat ?(tablet|stargate|nova)|(?:B15Q|CAT B35|CAT-B100|S62 Pro)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'B15Q'
@@ -3228,31 +4614,59 @@ Cat:
     - regex: 'CAT B35'
       model: 'B35'
       device: 'smartphone'
+    - regex: 'S62 Pro'
+      model: 'S62 Pro'
+      device: 'smartphone'
     - regex: 'Cat ?(?:tablet)? ?((?:Galactica|Nova|StarGate|PHOENIX)[^/;]*) Build'
       model: '$1'
     - regex: 'Cat ?tablet'
       model: 'Nova'
 
+    - regex: 'CAT-(B100)'
+      device: 'feature phone'
+      model: '$1'
+
 # Carrefour
 Carrefour:
-  regex: 'CT(?:10[0123]0|7[12]0|820)(?:W|FR)?(?:[);/ ]|$)'
+  regex: 'CT(?:10[0123]0|7[12]0|820|735_16GB)(?:W|FR)?(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'CT820'
       model: 'Touch Tablet Neo2'
     - regex: 'CT(10[0123]0(?:W|FR)?)'
       model: 'CT$1'
-    - regex: 'CT(7[12]0(?:W|FR)?)'
+    - regex: 'CT(7[12]0(?:W|FR)?|735)'
       model: 'CT$1'
 
+# Celcus
+Celcus:
+  regex: 'CELCUS, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
 # Celkon
 Celkon:
-  regex: 'Celkon'
+  regex: 'Celkon|Android 7.+ UNIQ(?: Build|[);])|(?:Millennia Hero|2GBStar|2GBXpress|CliQ2|Campus Prime)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Celkon[ _*](C[78]20)'
       model: '$1'
       device: 'tablet'
+    - regex: 'Celkon[_ ]4G_TAB-8'
+      model: '4G Tab 8'
+      device: 'tablet'
+    - regex: 'Millennia Hero'
+      model: 'Millennia Hero'
+    - regex: '2GBStar'
+      model: '2GB Star'
+    - regex: '2GBXpress'
+      model: '2GB Xpress'
+    - regex: 'CliQ2(?:[);/ ]|$)'
+      model: 'CliQ 2'
+    - regex: 'Android 7.+ UniQ(?: Build|[);])'
+      model: 'UniQ'
+    - regex: '(Campus Prime)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'Celkon[ _*](CT[^;/]+) Build'
       model: '$1'
       device: 'tablet'
@@ -3261,69 +4675,128 @@ Celkon:
     - regex: 'Celkon[\. _*]([^;/\)]+)[\)/]'
       model: '$1'
 
+# Cellution
+Cellution:
+  regex: 'Cosmas|CT_Cosmas_V'
+  device: 'smartphone'
+  models:
+    - regex: 'Cosmas'
+      model: 'Cosmas'
+    - regex: 'CT_Cosmas_V'
+      model: 'Cosmas V'
+
 # Changhong
 Changhong:
   regex: 'Changhong'
-  device: 'tv'
+  device: 'smartphone'
   models:
-    - regex: 'Changhong-([^);/]+)'
+    - regex: 'Changhong[ ]?(X1-K|X6|R8|Z9S?|Z1S|S18)(?:[);/ ]|$)'
+      model: '$1'
+
+    - regex: 'ChangHong Android TV'
+      device: 'tv'
+      model: ''
+    - regex: 'changhong,([a-z0-9_ \-]+),(?:wired|wireless)'
+      device: 'tv'
+      model: '$1'
+    - regex: '(?:Opera TV.+)Changhong-([^);/]+)'
+      device: 'tv'
       model: '$1'
 
-# Cherry Mobile
+# Cherry Mobile (cherrymobile.com)
 'Cherry Mobile':
-  regex: 'Cherry|Flare([ _])?(2X|4|A[123]|J[1235]|P[13]|S[4568]|X2)|Flare[ _](?:S Play|HD_MAX|LITE|XL Plus|X_V2)|Fusion Bolt|OMEGA HD 4'
+  regex: 'Cherry|Superion[_ ](?:S2|Radar Deluxe|S1 DTV|S1 Plus DTV)|Flare([ _])?(2X|4|A[123]|J[123568]|P[13]|S[4-8]|X2|Y[367]|S Play|HD|LITE|XL|X_V2|Y3s|Tab)(?:[ _](?:Pro|Plus|Max|LTE))?|Fusion Bolt|Omega[_ ](?:Icon 2|Icon Lite 2|lite[_ ][43][Cs]?|HD [45]|HD_Duo)|Spin Max 2|Selfie_Two|Flare_5'
   device: 'smartphone'
   models:
-    - regex: 'Cherry(?: ?Mobile)?[ _]?([^/;]+) Build'
-      model: '$1'
     - regex: '(Flare2X)'
       model: '$1'
+    - regex: 'Flare[_ ]HD[_ ]([345])'
+      model: 'Flare HD $1'
     - regex: 'Flare_HD_MAX'
       model: 'Flare HD Max'
     - regex: 'FLARE LITE'
       model: 'Flare Lite'
     - regex: 'Flare S Play'
       model: 'Flare S Play'
+    - regex: 'Flare[_ ]J([26])S'
+      model: 'Flare J$1s'
+    - regex: 'Flare_([A-Z]\d+)_Prime'
+      model: 'Flare $1 Prime'
+    - regex: 'Flare_([A-Z]\d+)_Deluxe'
+      model: 'Flare $1 Deluxe'
+    - regex: 'Flare[_ ]([A-Z]\d+)[_ ]Power'
+      model: 'Flare $1 Power'
+    - regex: 'Flare[_ ]([A-Z]\d+)[_ ]Pro'
+      model: 'Flare $1 Pro'
+    - regex: 'Flare[_ ]([A-Z]\d+)[_ ]Lite'
+      model: 'Flare $1 Lite'
+    - regex: 'Flare[_ ]([A-Z]\d+)[_ ]Plus'
+      model: 'Flare $1 Plus'
     - regex: 'Flare XL Plus'
       model: 'Flare XL Plus'
+    - regex: 'Flare ?J3 ?Plus'
+      model: 'Flare J3 Plus'
+    - regex: 'Cherry[_ ]X740'
+      model: 'Flare A5'
     - regex: 'Flare[ _]X[_ ]V2'
       model: 'Flare X V2'
-    - regex: 'Flare[ _](A2|J3|P1|S[46])[ _]Lite'
-      model: 'Flare $1 Lite'
-    - regex: 'Flare[ _](J[12]|S5)[ _]mini'
+    - regex: 'Flare[ _](J[12]|S[57]|Y3|J6|P1)[ _]mini'
       model: 'Flare $1 Mini'
-    - regex: 'Flare J2S'
-      model: 'Flare J2s'
+    - regex: 'Flare_J2_2018'
+      model: 'Flare J2 (2018)'
     - regex: 'Flare S4 Max LTE'
       model: 'Flare S4 Max LTE'
-    - regex: 'Flare S4 Max'
-      model: 'Flare S4 Max'
-    - regex: 'FlareS5LiteDTV '
+    - regex: 'Flare[_ ](S[47]|J2)[_ ]Max'
+      model: 'Flare $1 Max'
+    - regex: 'FlareS5LiteDTV'
       model: 'Flare S5 Lite DTV'
-    - regex: 'Flare_S6_Plus'
-      model: 'Flare S6 Plus'
-    - regex: 'FLARE S6 POWER'
-      model: 'Flare S6 Power'
-    - regex: 'Flare S6'
-      model: 'Flare S6'
-    - regex: 'Flare S8'
-      model: 'Flare S8'
-    - regex: 'Flare(?:[ _])?(4|A[13]|J[135]|P[13]|S4|X2)'
+    - regex: 'Flare[_ ]J2[_ ]DTV'
+      model: 'Flare S2 DTV'
+    - regex: 'Flare[_ ]Lite[_ ]3S'
+      model: 'Flare Lite S3'
+    - regex: 'Flare(?:[ _])?(A[123]|J8 LTE|J[13568]|P[13]|S[4-8]|X2|Y3s|Y7_LTE|Y[673]|[45])'
       model: 'Flare $1'
-    - regex: 'OMEGA HD 4'
-      model: 'Omega HD 4'
-    - regex: '(Fusion Bolt)'
+    - regex: 'OMEGA HD ([45])'
+      model: 'Omega HD $1'
+    - regex: 'Omega_HD_Duo'
+      model: 'Omega HD Duo'
+    - regex: 'Omega Icon Lite 2'
+      model: 'Omega Icon Lite 2'
+    - regex: 'Omega Icon 2'
+      model: 'Omega Icon 2'
+    - regex: 'Omega[_ ]Lite[_ ](3[Cs]|4)'
+      model: 'Omega Lite $1'
+    - regex: 'Spin Max 2'
+      model: 'Spin Max 2'
+    - regex: 'Selfie_Two'
+      model: 'Selfie Two'
+    - regex: 'Superion_S2_Plus'
+      model: 'Superion S2 Plus'
+      device: 'tablet'
+    - regex: 'Superion S1 Plus DTV'
+      model: 'Superion S1 Plus DTV'
+      device: 'tablet'
+    - regex: 'Flare Tab Pro V(\d)'
+      device: 'tablet'
+      model: 'Flare Tab Pro V$1'
+
+    - regex: '(Fusion Bolt|Flare Tab Pro|Flare Tab|Superion[_ ](?:S2|Radar Deluxe|S1 DTV))'
       model: '$1'
       device: 'tablet'
 
+    - regex: 'Cherry(?:[ _]?Mobile)?[ _]?([^/;]+)(?: Build|[);])'
+      model: '$1'
+
 # China Mobile
 'China Mobile':
-  regex: '(M812C|1501_M02|9930i|A1303|A309W|M651CY) Build'
+  regex: '(M812C|1501_M02|9930i|A1303|A309W|M651CY|CMCC[ -]M(?:670|860))(?: Build|[);])'
   device: 'smartphone'
   models:
     - regex: 'M651CY'
       model: 'A3'
-    - regex: '(M812C|1501_M02|9930i|A1303|A309W)'
+    - regex: 'CMCC-M860'
+      model: 'N5 Pro'
+    - regex: '(M812C|1501_M02|9930i|A1303|A309W|M670)'
       model: '$1'
 
 # Comio
@@ -3341,9 +4814,7 @@ Comio:
       model: 'CT701G Plus'
       device: 'tablet'
 
-    - regex: 'Comio[ _-]?([^;/)]+) Build'
-      model: '$1'
-    - regex: 'Comio[ _-]?([^;/)]+)'
+    - regex: 'Comio[ _-]?([^;/)]+)(?: Build|[);])'
       model: '$1'
 
 # Compal
@@ -3352,9 +4823,36 @@ Compal:
   device: 'feature phone'
   model: '$1'
 
+# Artel (artelgroup.org)
+Artel:
+  regex: 'Artel[_ ]|\w+_ARTEL_\w+|(?:GAP YOQ| ALO|U1 MINI|Android 8.+; U4(?!/))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'GAP YOQ(?:[);/ ]|$)'
+      model: 'Gap Yo Q'
+    - regex: 'U1 MINI(?:[);/ ]|$)'
+      model: 'U1 Mini'
+    - regex: 'Android 8.+ U4(?:[);/ ]|$)'
+      model: 'U4'
+    - regex: ' ALO(?:[);/ ]|$)'
+      model: 'Allo'
+    - regex: 'Artel[_ ](Quadro(?: Pro)?|Tesla|Air|Tomchi|Premium|U3_4G|Z5|Sentinel (?:X 8G|X D5|X)|T10)'
+      model: '$1'
+    - regex: 'Artel[_ ]Komi3'
+      model: 'Komi 3'
+    - regex: 'Artel[_ ]Q21_PRO'
+      model: 'Q21 Pro'
+    - regex: 'Artel[_ ](Star|Nova|Connect|Choice|Style)'
+      model: '$1'
+      device: 'tablet'
+
+    - regex: '(?:\w+_)?ARTEL_([FVM]5|X[45])_\w+'
+      device: 'feature phone'
+      model: '$1'
+
 # ComTrade Tesla
 ComTrade Tesla:
-  regex: 'Tesla|Impulse 7.85 3G|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
+  regex: 'Tesla(?!Group/LUMUS)|Impulse 7.85 3G|Impulse 10.1 OCTA|Smartphone_6.1|SP(?:6.2|6.2_Lite)|TTL(?:713G|8)'
   device: 'smartphone'
   models:
     - regex: 'TeslaEvo5.0'
@@ -3365,12 +4863,17 @@ ComTrade Tesla:
     - regex: '(Impulse 7.85 3G)'
       model: '$1'
       device: 'tablet'
-    - regex: 'Tesla_SP([^/;]+)L Build'
+    - regex: 'Impulse 10.1 OCTA'
+      model: 'Impulse 10.1" OCTA'
+      device: 'tablet'
+    - regex: 'Tesla_SP([^/;)]+)L(?: Build|[;)])'
       model: 'Smartphone $1 Lite'
     - regex: 'Smartphone_6.1'
       model: 'Smartphone 6.1'
     - regex: 'SP6.2_Lite'
       model: 'Smartphone 6.2 Lite'
+    - regex: 'Tesla_SP(\d+)[_.](\d+)(?: Build|[;)])'
+      model: 'Smartphone $1.$2'
     - regex: 'Tesla_SP([^/;]+) Build'
       model: 'Smartphone $1'
     - regex: 'SP([^/;]+) Build'
@@ -3414,11 +4917,17 @@ ComTrade Tesla:
       model: 'M8'
       device: 'tablet'
 
+    - regex: 'TESLA,([a-z0-9_ \-]+),(?:wired|wireless)'
+      model: ''
+      device: 'tv'
+
 # ConCorde
 ConCorde:
-  regex: 'ConCorde ([^/;]+) Build'
+  regex: 'ConCorde ([^/;]+) Build|Concorde_Raptor_Z55(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'Concorde_(Raptor_Z55)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'ConCorde Tab ?([^/;]+) Build'
       model: 'Tab $1'
       device: 'tablet'
@@ -3428,18 +4937,18 @@ ConCorde:
     - regex: 'ConCorde ([^/;]+) Build'
       model: '$1'
 
-# Condor
+# Condor (www.condor.dz)
 Condor:
-  regex: 'Allure M[13]|Griffe T[256789]|TFX712G|TRA-901G|TGW[-]?(710G|709)|(?:PGN\-?[456][012][0-9]|PHS\-601|PHQ519|PHQ52[056]|PKT\-301|Plume (?:H1|L[123]|P8))(?:[);/ ]|$)|CTAB[^/;]+ Build'
+  regex: 'Allure (?:M[123]|X)|Griffe T[235-9]|TFX712G|TRA-901G|TGW[-]?(710G|709|102L|801[GL])|(?:PGN\-?[456][012][0-9]|PHS\-601|PHQ519|PHQ52[056]|TB105L|TB717G|PKT\-301|Plume (?:H1|L[1-468]|P8|P6 PRO LTE))(?:[);/ ]|$)|CTAB[^/;]+ Build'
   device: 'smartphone'
   models:
     - regex: 'CTAB([^/;]+) Build'
       device: 'tablet'
       model: 'CTAB $1'
-    - regex: '(TGW)-?(710G|709)(?:[);/ ]|$)'
+    - regex: '(TGW)-?(710G|709|801[GL]|102L)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1 $2'
-    - regex: '(TFX712G)(?:[);/ ]|$)'
+    - regex: '(TFX712G|TB105L|TB717G)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
     - regex: '(TRA)-(901G)(?:[);/ ]|$)'
@@ -3462,7 +4971,7 @@ Condor:
       model: 'C8S'
     - regex: 'PGN\-?506'
       model: 'C7'
-    - regex: '(Allure M[13])'
+    - regex: '(Allure (?:M[123]|X))'
       model: '$1'
     - regex: 'PGN\-?507'
       model: 'Allure A9'
@@ -3492,26 +5001,20 @@ Condor:
       model: 'Plume P6'
     - regex: 'PGN\-?521'
       model: 'Griffe G4 Plus'
-    - regex: 'Griffe T2'
-      model: 'Griffe T2'
-    - regex: 'Griffe T5'
-      model: 'Griffe T5'
-    - regex: 'Griffe T6'
-      model: 'Griffe T6'
-    - regex: 'Griffe T7'
-      model: 'Griffe T7'
-    - regex: 'Griffe T8 Plus'
-      model: 'Griffe T8 Plus'
-    - regex: 'Griffe T9'
-      model: 'Griffe T9'
+    - regex: 'Griffe T3 ?pro'
+      model: 'Griffe T3 Pro'
+    - regex: 'Griffe T([0-9]) Plus'
+      model: 'Griffe T$1 Plus'
+    - regex: 'Griffe T([0-9])'
+      model: 'Griffe T$1'
     - regex: 'PGN\-?522'
       model: 'P6 Plus'
     - regex: 'PGN\-?523'
       model: 'P7 Plus'
     - regex: 'PGN\-?527'
       model: 'Plume P4 Plus'
-    - regex: 'PGN\-?528'
-      model: 'Plume P6 Pro Lte'
+    - regex: 'PGN\-?528|PLUME P6 PRO LTE'
+      model: 'Plume P6 Pro LTE'
     - regex: 'PGN\-?605'
       model: 'Plume P8'
     - regex: 'PGN\-?606'
@@ -3532,72 +5035,147 @@ Condor:
       model: 'Allure A55 Plus'
     - regex: 'Plume H1'
       model: 'Plume H1'
-    - regex: 'Plume L1'
-      model: 'Plume L1'
-    - regex: 'Plume L2 Pro'
-      model: 'Plume L2 Pro'
+    - regex: 'Plume L([2468]) Pro'
+      model: 'Plume L$1 Pro'
     - regex: 'Plume L3 Plus'
       model: 'Plume L3 Plus'
+    - regex: 'Plume L3 Smart'
+      model: 'Plume L3 Smart'
+    - regex: 'Plume L([1-4])'
+      model: 'Plume L$1'
     - regex: 'Plume P8 Pro'
       model: 'Plume P8 Pro'
 
     - regex: 'PGN\-?([0-9]{3})'
       model: 'PGN-$1'
 
-# Coolpad
+# Coolpad (coolpad.us)
 Coolpad:
-  regex: '(?:YL-)?Coolpad|(?:Cool_9S|8190Q|1831-A0|8676-A01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C106-7|MTS-T0|cp3705A[S]?|ORL-C0)(?:[);/ ]|$)|(8295|5860S) Build'
+  regex: '(?:YL-)?Coolpad|(?:Cool_9S|1824-S0|8190Q|1831-A0|8676-[AM]01|1872-A0|CP8298_I00|CP3648AT?|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C105-(?:8|E0)|C106-[789]|C107-9| C106|MTS-T0|cp3705A[S]?|ORL-C0|DLS-E0|1826-I01|8298-(?:M02|A01)|5560S|CP3320AS2|CP3667AT|CP3706AS|CP3669AS|CP3321AT|CP350[34]L|C103|CP03)(?:[);/ ]|$)|(8295|5860S) Build'
   device: 'smartphone'
   models:
     - regex: 'VCR-[AI]0'
       model: 'Cool Play 6'
     - regex: '1831-A0(?:[);/ ]|$)'
       model: 'Cool Play C7'
+    - regex: '1872-A0(?:[);/ ]|$)'
+      model: 'Cool Play 7'
     - regex: 'REVVLPLUS C3701A'
       model: 'REVVL Plus'
       device: 'phablet'
+    - regex: 'CP3667AT'
+      model: 'Tasker'
+      device: 'tablet'
     - regex: '8190Q(?:[);/ ]|$)'
       model: '8190Q'
+    - regex: 'DLS-E0(?:[);/ ]|$)'
+      model: 'N5'
+    - regex: '1824-S0(?:[);/ ]|$)'
+      model: 'N5C'
+    - regex: 'CP3321AT(?:[);/ ]|$)'
+      model: 'Bellaza'
     - regex: 'CP3705A[S]?(?:[);/ ]|$)'
       model: 'Legacy'
-    - regex: 'CP3648A(?:[);/ ]|$)'
+    - regex: 'CP3648AT?(?:[);/ ]|$)'
       model: 'Legacy S'
+    - regex: 'CP3320AS2?(?:[);/ ]|$)'
+      model: 'Legacy S SR'
+    - regex: 'CP3706AS(?:[);/ ]|$)'
+      model: 'Legacy Brisa'
+    - regex: 'CP3669AS(?:[);/ ]|$)'
+      model: 'Suva'
     - regex: 'MTS-T0(?:[);/ ]|$)'
       model: 'N2M'
-    - regex: 'C106-7(?:[);/ ]|$)'
+    - regex: '(?:C106-[789]|R116|C10[36])(?:[);/ ]|$)'
       model: 'Cool 1'
+    - regex: 'C107-9(?:[);/ ]|$)'
+      model: '1C'
+    - regex: 'C105-(?:E0|8)(?:[);/ ]|$)'
+      model: 'Cool S1'
+    - regex: '1826-I01(?:[);/ ]|$)'
+      model: 'Cool 5'
     - regex: 'ORL-C0(?:[);/ ]|$)'
       model: 'Cool 9'
     - regex: 'Cool_9S(?:[);/ ]|$)'
       model: 'Cool 9S'
+    - regex: 'CP03(?:[);/ ]|$)'
+      model: 'Cool 20'
+    - regex: '5560S(?:[);/ ]|$)'
+      model: 'Arise'
     - regex: '(5860S|8295) Build'
       model: '$1'
+    - regex: 'E501'
+      model: 'Modena'
+    - regex: 'E502'
+      model: 'Modena 2'
     - regex: 'CP8676_I02(?:[);/ ]|$)'
       model: 'Note 3'
     - regex: 'CP8676_I03(?:[);/ ]|$)'
       model: 'Note 3 Plus'
     - regex: 'CP8298_I00(?:[);/ ]|$)'
       model: 'Note 3 Lite'
-    - regex: '(8676-A01)(?:[);/ ]|$)'
+    - regex: '(CP350[34]L)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(8676-[AM]01|8298-(?:M02|A01))(?:[);/ ]|$)'
       model: '$1'
     - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
       model: '$1'
     - regex: '(?:YL-)?Coolpad[ _\-]?([a-z0-9\-]+)'
       model: '$1'
 
-# Clarmin
+# Clarmin (clarmin.com)
 Clarmin:
   regex: 'Clarmin'
   device: 'smartphone'
   models:
-    - regex: 'Clarmin_B6'
-      model: 'B6'
+    - regex: 'Clarmin[_ ](B[65]|C1)'
+      model: '$1'
+
+# CORN (corn-mobile.com)
+CORN:
+  regex: 'CORN[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'CORN R([124])0'
+      model: 'R$10'
+    - regex: 'CORN[_ ]X(4|55|5)'
+      model: 'X$1'
+
+# Cosmote (https://www.telekom.ro/)
+Cosmote:
+  regex: 'Cosmote'
+  device: 'smartphone'
+  models:
+    - regex: 'Cosmote_My_mini_Tab' # Allview My Mini Tab
+      device: 'tablet'
+      model: 'My Mini Tab'
 
 # Cricket
 Cricket:
-  regex: 'Cricket-([a-z0-9]+)'
-  device: 'feature phone'
-  model: '$1'
+  regex: 'Cricket-([a-z0-9]+)|(?:U304AC|U325AC|U705AC|V350C|EC1002|EC21100[1-4])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'EC211001'
+      model: 'Dream 5G'
+    - regex: 'U304AC'
+      model: 'Icon'
+    - regex: 'U325AC'
+      model: 'Icon 2'
+    - regex: 'EC211002'
+      model: 'Icon 3'
+    - regex: 'V350C'
+      model: 'Influence'
+    - regex: 'EC211004'
+      model: 'Innovate 5G'
+    - regex: 'U705AC'
+      model: 'Ovation'
+    - regex: 'EC1002'
+      model: 'Ovation 2'
+    - regex: 'EC211003'
+      model: 'Splendor'
+    - regex: 'Cricket-([a-z0-9]+)'
+      device: 'feature phone'
+      model: '$1'
 
 # Crius
 'Crius Mea':
@@ -3607,39 +5185,62 @@ Cricket:
 
 # Crosscall
 Crosscall:
-  regex: 'Crosscall|ODYSSEY_Plus|Odyssey S1|Trekker-[MSX][1234]|Action-X3|Core-X3'
+  regex: 'Crosscall|ODYSSEY_Plus|Odyssey S1|Trekker-[MSX][1-4]|Action-X[35]|Core-(?:M[45]|T4|X[34])'
   device: 'smartphone'
   models:
-    - regex: 'Action-X3'
-      model: 'Action-X3'
-    - regex: 'Core-X3'
-      model: 'Core-X3'
+    - regex: 'Action-X3 Pro(?:[);/ ]|$)'
+      model: 'Action-X3 Pro'
+    - regex: 'Action-X([35])(?:[);/ ]|$)'
+      model: 'Action-X$1'
+    - regex: 'Core-(M[45]|X[34])(?:[);/ ]|$)'
+      model: 'Core-$1'
     - regex: 'Crosscall ([^;/]+) Build'
       model: '$1'
     - regex: 'ODYSSEY_Plus'
       model: 'ODYSSEY+'
     - regex: 'Odyssey S1'
       model: 'ODYSSEY S1'
-    - regex: 'Trekker-([MSX][1234](?: Core)?)'
+    - regex: 'Trekker-([MSX][1-4]) Core'
+      model: 'Trekker-$1 Core'
+    - regex: 'Trekker-([MSX][1-4](?: Core)?)'
       model: 'Trekker-$1'
+    - regex: 'Core-T4'
+      device: 'tablet'
+      model: 'Core-T4'
 
-# AllDocube (https://www.alldocube.com/)
+# Crown
+Crown:
+  regex: 'CROWN, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
+# AllDocube (alldocube.com)
 AllDocube:
-  regex: '(?:T1001XS?|iPlay_20|U1006)(?:[);/ ]|$)'
+  regex: '(?:T1001XS?|T1006S?|T1001|iPlay_[234]0|U1006H?|U63PLUS|iPlay8|iPlay_?8T|iPlay[34]0|iPlay_40H|iPlay20S|kPad)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'T1001XS(?:[);/ ]|$)'
       model: 'M5XS'
+    - regex: 'kPad(?:[);/ ]|$)'
+      model: 'kPad'
+    - regex: 'T1006S(?:[);/ ]|$)'
+      model: 'M5S'
+    - regex: 'T1006(?:[);/ ]|$)'
+      model: 'M5'
     - regex: 'T1001X(?:[);/ ]|$)'
       model: 'M5X'
-    - regex: 'U1006(?:[);/ ]|$)'
+    - regex: 'T1001(?:[);/ ]|$)'
+      model: 'Power M3'
+    - regex: 'U63PLUS(?:[);/ ]|$)'
+      model: 'U63 Plus'
+    - regex: 'U1006H?(?:[);/ ]|$)'
       model: 'iPlay 10 Pro 10.1"'
-    - regex: 'iPlay_20(?:[);/ ]|$)'
-      model: 'iPlay 20'
+    - regex: 'iPlay_?([234]0|8T?|40H|20s)(?:[);/ ]|$)'
+      model: 'iPlay $1'
 
 # Cube (short name Alldocube)
 Cube:
-  regex: '(<!myPhone ?)Cube|(U[0-9]+GT|K8GT)|(?:T8-PLUSM?S?|T8PLUSML|I1-TF[BD]?|I1-TC|i1002S|Iwork10 Flagship|iwork10 Pro)(?:[);/ ]|$)'
+  regex: '(<!myPhone ?)Cube|(U[0-9]+GT|K8GT)|(?:T8-PLUSM?S?|T8PLUSML|I1-TF[BD]?|I1-TC|i15-TG|i1002S|Iwork10 Flagship|iwork10 Pro)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'U27GT'
@@ -3654,6 +5255,8 @@ Cube:
       model: 'iWork 8 Air'
     - regex: 'I1-TC(?:[);/ ]|$)'
       model: 'iWork 8 Ultimate'
+    - regex: 'i15-TG(?:[);/ ]|$)'
+      model: 'iWork 10 Ultimate'
     - regex: '(?:i1002S|iwork10 Pro)(?:[);/ ]|$)'
       model: 'iWork 10 Pro'
     - regex: 'Iwork10 Flagship(?:[);/ ]|$)'
@@ -3666,37 +5269,69 @@ Cube:
     - regex: '(K8GT)'
       model: '$1'
 
+# Oculus (https://www.oculus.com/)
+Oculus:
+  regex: '(?:Pacific|Quest).+OculusBrowser|Standalone HMD'
+  device: 'wearable'
+  models:
+    - regex: 'Pacific'
+      model: 'Go'
+    - regex: '(?:Quest 2|Standalone HMD)'
+      model: 'Quest 2'
+    - regex: 'Quest'
+      model: 'Quest'
+
 # CUBOT
 CUBOT:
-  regex: 'CUBOT|RAINBOW 2|KING_KONG_3|KINGKONG_MINI|QUEST LITE'
+  regex: 'CUBOT|(?<!QUMO )QUEST(?!(?:[0-9]|\s[0-9]))(?: LITE)?|(?:(?<!(?:Redmi|Tegra) )NOTE 7|NOTE 20(?: PRO)?|RAINBOW 2|KING_KONG_3|KINGKONG [57]|KINGKONG 5 Pro|ZORRO 001|KINGKONG[_ ]MINI2?|KING KONG CS|R15_PRO|S550 Pro| CHEETAH| [RX]19|X19 S|(?<!MI )MAX 3)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'CHEETAH 2'
-      model: 'Cheetah 2'
+    - regex: 'CHEETAH( 2)?'
+      model: 'Cheetah$1'
     - regex: 'RAINBOW 2'
       model: 'Rainbow 2'
     - regex: 'RAINBOW'
       model: 'Rainbow'
     - regex: 'DINOSAUR'
       model: 'Dinosaur'
+    - regex: 'KINGKONG MINI2'
+      model: 'King Kong Mini 2'
     - regex: 'KINGKONG_MINI'
       model: 'King Kong Mini'
-    - regex: 'KING_KONG_3'
-      model: 'King Kong 3'
+    - regex: 'KINGKONG 5 Pro'
+      model: 'King Kong 5 Pro'
+    - regex: 'KING[_ ]?KONG[_ ]([357])'
+      model: 'King Kong $1'
+    - regex: 'KING KONG CS'
+      model: 'King Kong CS'
     - regex: 'KING KONG'
       model: 'King Kong'
     - regex: 'QUEST LITE'
       model: 'Quest Lite'
+    - regex: 'QUEST'
+      model: 'Quest'
+    - regex: 'ZORRO 001'
+      model: 'Zorro 001'
     - regex: 'CUBOT[ _]Echo'
       model: 'Echo'
     - regex: 'CUBOT[ _]MANITO'
       model: 'Manito'
     - regex: 'CUBOT[ _]MAGIC'
       model: 'Magic'
+    - regex: 'MAX 3'
+      model: 'Max 3'
     - regex: 'CUBOT[ _]MAX'
       model: 'Max'
     - regex: 'NOTE Plus'
       model: 'Note Plus'
+    - regex: 'NOTE 7'
+      model: 'Note 7'
+    - regex: 'NOTE 20 PRO'
+      model: 'Note 20 Pro'
+    - regex: 'NOTE 20'
+      model: 'Note 20'
+    - regex: '(R15|S550|J3)[_ ]PRO'
+      model: '$1 Pro'
     - regex: 'CUBOT[_ ]NOTE[_ ]S'
       model: 'Note S'
     - regex: 'CUBOT_NOVA'
@@ -3705,7 +5340,9 @@ CUBOT:
       model: 'Power'
     - regex: 'CUBOT_X18_Plus'
       model: 'X18 Plus'
-    - regex: 'CUBOT[ _](A5|C6W|H3|J3|P7|P20|[RX]9|R11|X18)(?:[);/ ]|$)'
+    - regex: 'CUBOT[ _](A5|C6W|H3|J3|P7|P20|[RXJ]9|R11|X18)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: ' (X19 S|[RX]19)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'CUBOT ([^;/]+) Build'
       model: '$1'
@@ -3734,7 +5371,7 @@ Clout:
 
 # Concord
 Concord:
-  regex: 'Concord[ _-]|Flyfix 6|C-721(?:[);/ ]|$)'
+  regex: 'Concord[ _-]|(?:Flyfix 6|C-721|Plus-7_C777|Plus_M19_C779|Plus-9_C778)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'M10'
@@ -3744,6 +5381,9 @@ Concord:
     - regex: 'C-721'
       model: 'Flyfix Q'
       device: 'tablet'
+    - regex: 'Plus[-_]([79]|M19)_(C77[789])(?:[);/ ]|$)'
+      model: 'Plus-$1 $2'
+      device: 'tablet'
 
 # Crescent
 Crescent:
@@ -3759,7 +5399,7 @@ Crescent:
 
 # Cyrus
 Cyrus:
-  regex: 'Cyrus[ _-]'
+  regex: 'Cyrus[ _-]|CyrusApel'
   device: 'smartphone'
   models:
     - regex: 'Cyrus[ _-]?([^;/)]+) Build'
@@ -3787,26 +5427,43 @@ Datsun:
     - regex: 'Datsun_D5001'
       model: 'D5001'
 
-# Danew
+# Danew (danew.fr)
 Danew:
-  regex: 'Dslide ?([^;/]+) Build|Konnect_?(402|504|60[127])'
+  regex: 'Dslide ?([^;/]+) Build|Konnect_?(?:402|50[246]|60[1278])|GEODROID_A5|Dslide[ _]?(?:714|101[45]|1020|1013QC)'
   device: 'smartphone'
   models:
-    - regex: 'Konnect_?(402|504|60[127])'
+    - regex: 'Konnect_?(402|50[246]|60[1278])'
       model: 'Konnect $1'
     - regex: 'Dslide ?([^;/]+) Build'
       device: 'tablet'
       model: 'DSlide $1'
+    - regex: 'GEODROID_A5'
+      device: 'tablet'
+      model: 'Geodroid A5'
+    - regex: 'Dslide[ _]?(714|1013QC|101[45]|1020)'
+      device: 'tablet'
+      model: 'Dslide $1'
+
+# Dazen
+Dazen:
+  regex: 'dazen'
+  device: 'smartphone'
+  models:
+    - regex: '6A'
+      model: '6A'
 
-# Denver Electronics
+# Denver Electronics (denver-electronics.com)
 Denver:
-  regex: '(?:TA[CDQ]-[0-9]+)|P(?:.+)TAQ-(?:[0-9]+)'
+  regex: '(?:TA[CDQ]-[0-9]+)|P(?:.+)TAQ-(?:[0-9]+)|SDQ[_-](?:550[24]4L|52001G|50002G|57004L)'
   device: 'tablet'
   models:
-    - regex: 'P(?:.+)TAQ-(10172MK3|10242MK2|70242MK2|[0-9]+)(?:[);/ ]|$)'
+    - regex: 'P(?:.+)TAQ-(10213GMK2|10172MK3|10242MK2|70242MK2|[0-9]+)(?:[);/ ]|$)'
       model: 'TAQ-$1'
     - regex: '(TA[CDQ]-[0-9]+)'
       model: '$1'
+    - regex: 'SDQ[_-](550[24]4L|52001G|50002G|57004L)'
+      device: 'smartphone'
+      model: 'SDQ-$1'
 
 # Dell
 Dell:
@@ -3815,16 +5472,24 @@ Dell:
   models:
     - regex: 'XCD35'
       model: 'XCD35'
-    - regex: 'Venue (8 7840|10 7040)'
+    - regex: 'Venue ((?:10|[78]) [0-9]{4}|[78] HSPA\+)'
       model: 'Venue $1'
       device: 'tablet'
-    - regex: '(?:Dell )?Venue Build'
+    - regex: '(?:Dell )?Venue(?: Build|[);])'
       model: 'Venue'
     - regex: 'Dell; Venue Pro'
       model: 'Venue Pro'
+
+    - regex: '(OptiPlex (?:3050|7010))'
+      device: 'desktop'
+      model: '$1'
+
     - regex: '(?:Dell )?(Streak|Venue) ?([^/;]*) Build'
       model: '$1 $2'
       device: 'tablet'
+    - regex: '(?:Dell Inc./)?(XPS 13 9360|Latitude 7480)(?:[);/ ]|$)'
+      device: 'desktop'
+      model: '$1'
     - regex: 'Dell; ((?:Streak|Venue)[^;/\)]*)'
       model: '$1'
       device: 'tablet'
@@ -3843,43 +5508,65 @@ Desay:
     - regex: 'Desay[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
-# DEXP
+# DEXP (dexp.club)
 DEXP:
-  regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|(SENIOR|F4[38]D8000K|VA[12]10|ML450|MS[56]50|BL[12]50|BS155|BS160|BS[1256]50|AL[12]40|AS260| (?:B450|B340))(?:[);/ ]|$)'
+  regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|Larus_TV1|Ixion(?:ML4.7|ES250)|M150Storm|(?:SENIOR|F4[38]D8000K|VA(?:[12]10|170)|ML450|MS[56]50|BL(?:[123]50|160|155)|BS(?:155|160|[1256]50)|(?<!ILIUM )S(?:3[78]0|2[89]0|670)|AL(?:[12]40|[23]50)|AS(?:155|[123]60)| (?:N280i|P310|P380i?|R1[18]0|Q110|E1[78]0|E[12]10|B(?:450|340|35[05])|M445|T155|U43F8000Q|A(?:1[456]0|340|[34]55)|GS15[035]|GL[23]55|G25[05]|G15[05]|ES750|XL150|Z[1-4]55|H170|H310|P510|L2[17]0)|Z250|A440|N[13]80i|L3[17]0i|(?<!VOX )G450|G660|Q[123]10|Q[12]80|N[234]10|N[35]70|EX111)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-
     - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
       model: 'Ixion $1'
-    - regex: '(ML450|MS[56]50)(?:[);/ ]|$)'
+    - regex: '(ML450|MS[56]50|ES750|XL150)(?:[);/ ]|$)'
       model: 'Ixion $1'
+    - regex: 'IxionES250(?:[);/ ]|$)'
+      model: 'Ixion ES250 Rage'
+    - regex: 'IxionML4.7(?:[);/ ]|$)'
+      model: 'Ixion ML 4.7"'
+    - regex: 'M150Storm(?:[);/ ]|$)'
+      model: 'Ixion M150 Storm'
+    - regex: 'M445(?:[);/ ]|$)'
+      model: 'Ixion M445 Onyx 2'
+    - regex: 'AL250(?:[);/ ]|$)'
+      model: '4.5" AL250'
+    - regex: 'AL350(?:[);/ ]|$)'
+      model: '5.0" AL350'
+    - regex: 'AS155(?:[);/ ]|$)'
+      model: '5.45" AS155'
     - regex: 'AS260(?:[);/ ]|$)'
       model: '5.85" AS260'
       device: 'phablet'
+    - regex: 'AS360(?:[);/ ]|$)'
+      model: '6.22" AS360'
+      device: 'phablet'
 
-    - regex: 'Ursus ([^;/)]+)(?: Build|\))'
+    - regex: 'Ursus[ _]([^;/)]+)(?: Build|[);])'
       model: 'Ursus $1'
       device: 'tablet'
-    - regex: '(VA[21]10)(?:[);/ ]|$)'
+    - regex: '(VA[21]10|VA170|E210|R1[18]0|Q110|N280i|P380i?|P[35]10|S2[89]0|S3[78]0|S670|H170|H310|L2[17]0|N[13]80i|N[234]10|E1[178]0|Q[123]10|Q[12]80|EX111|N[35]70|L3[17]0i)(?:[);/ ]|$)'
       model: 'Ursus $1'
       device: 'tablet'
 
-    - regex: ' (B450|B340)(?:[);/ ]|$)'
+    - regex: '(G450)[ _](2021)'
+      model: '$1 ($2)'
+    - regex: ' (A440|A[34]55|B450|B340|B35[05]|BL155|BL160|A160|A340|T155|Z[1-4]55|G25[05]|Z250|G450|G660)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'SENIOR(?:[);/ ]|$)'
       model: 'Senior'
 
+    - regex: 'Larus_TV1'
+      device: 'feature phone'
+      model: 'Larus_TV1'
+
     - regex: 'H135[ _]Build'
       model: 'Atlas'
       device: 'desktop'
-    - regex: '(BL[12]50|BS155|BS160|BS[1256]50|AL[12]40)(?:[);/ ]|$)'
+    - regex: '(BL[123]50|BS155|BS160|BS[1256]50|AL[12]40|A1[45]0|GS15[035]|AS160|GL[23]55|G15[05])(?:[);/ ]|$)'
       model: '$1'
     - regex: 'DEXP[ _]([^;/]+) Build'
       model: '$1'
     - regex: 'DEXP[ _]([^);/]+)(?:[);/ ]|$)'
       model: '$1'
 
-    - regex: '(F4[38]D8000K)(?:[);/ ]|$)'
+    - regex: '(F4[38]D8000K|U43F8000Q)(?:[);/ ]|$)'
       device: 'tv'
       model: '$1'
 
@@ -3891,7 +5578,7 @@ Dbtel:
 
 # Dialog
 Dialog:
-  regex: 'Dialog ?([^;/]+) Build'
+  regex: 'Dialog ?([^;/]+)(?: Build|[;)])'
   device: 'smartphone'
   model: '$1'
 
@@ -3909,26 +5596,41 @@ Digi:
 
 # Digicel
 Digicel:
-  regex: 'DIGICEL'
+  regex: 'DIGICEL|DL3(?:PlusPro)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'DL3PlusPro'
+      model: 'DL3 Plus Pro'
+    - regex: 'DL3(?:[);/ ]|$)'
+      model: 'DL3'
+    - regex: 'DL755'
+      model: 'DL755'
     - regex: 'DL810'
       model: 'DL810'
     - regex: 'DIGICEL ([^/;]+) Build'
       model: '$1'
 
+# Digihome
+Digihome:
+  regex: 'DIGIHOME, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
 # Digiland
 Digiland:
-  regex: 'DL1008M'
-  device: 'smartphone'
+  regex: '(?:DL721-RB|DL(?:1023|1036|9002|[78]006|1008M)|Compumax Blue)(?:[);/ ]|$)'
+  device: 'tablet'
   models:
     - regex: 'DL1008M'
-      device: 'tablet'
       model: 'DL1008M'
+    - regex: 'DL(1023|1036|9002|[78]006|721-RB)'
+      model: 'DL$1'
+    - regex: '(Compumax Blue)'
+      model: '$1'
 
 # Digma
 Digma:
-  regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI ATL 4G|CITI Octa 80|CITI 1902 3G|CITI Z530 3G|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _][TC][ST](11[459]4MG|1195MG|1196ML|3001ML|500[67]PG|7113PL|7193MG|8209MG|8139ML|8152ML|1050PL|8205PG|7203MG)|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|LINX B510 3G LT5037MG|LINX A452 3G LT4030PG|LINX A453 3G LT4038PG|LINX A420 3G LS4019PG|LINX A450 3G LT4028PG|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|PS1043MG|LS405[01]MG|LS5053ML|LT5048MG|HT7071MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|TT1004PG|TT7025MG|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
+  regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI (?:7 E401 4G|8 E400 4G|ATL 4G|Kids|Octa [178]0|1902 3G|10 E402|Z530 3G)|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _][TC][ST](?:[0-9]{4}[PM][LG])|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|Linx.+ [34]G L[TS][0-9]{4}[PM][GL]|Linx PS474S|PS1043MG|HT7071MG|HT5035PG|HT4039PG|NS6902QL|NS9797MG|TS7854M|TS1012E 3G|TT1004PG|TT702[045]MG|TT1002MG|TT7026MW|VRL42|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)|DM-LED(?:43SR23|24SR20)'
   device: 'smartphone'
   models:
     - regex: 'HIT(?: 3G)? HT707[10]MG'
@@ -3974,10 +5676,18 @@ Digma:
       model: 'CITI ATL 4G'
     - regex: '(CITI Z530 3G)'
       model: '$1'
+    - regex: '(CITI [A-Z0-9]+ [34]G) C[ST](?:606[32]ML|4024PG|5009PL|5021ML|502[56]PL)'
+      model: '$1'
 
+    - regex: 'TS7854M'
+      model: 'Plane 8.1" 3G'
+      device: 'tablet'
     - regex: 'PS1043MG'
       model: 'Plane 10.3" 3G'
       device: 'tablet'
+    - regex: 'TS1012E 3G'
+      model: 'Plane 10.1" 3G'
+      device: 'tablet'
     - regex: 'MVM900H(?:WZ|C)'
       model: 'iDx8'
       device: 'tablet'
@@ -3994,13 +5704,10 @@ Digma:
     - regex: 'HIT 4G HT7074ML'
       model: 'HIT 4G'
       device: 'tablet'
-    - regex: '(CITI 1902 3G)'
-      model: '$1'
-      device: 'tablet'
-    - regex: '(CITI_8527_4G|CITI Octa 80)'
-      model: '$1'
+    - regex: 'CITI[_ ](1902 3G|Kids|8527_4G|Octa [178]0|10 E402 4G|8 E400 4G|7 E401 4G)'
+      model: 'CITI $1'
       device: 'tablet'
-    - regex: '(CITI[ _](?:[A-Z0-9]+)[ _][34]G)[ _][TC][ST](?:3001ML|500[67]PG|8209MG|11[459]4MG|1195MG|1196ML|3001ML|8152ML|1050PL|7113PL|7193MG|8205PG|7203MG)'
+    - regex: '(CITI[ _](?:[A-Z0-9]+)[ _][34]G)[ _][TC][ST](?:106[24]ML|111[46]ML|1115MG|1117PG|1207MG|1210MG|3001ML|500[67]PG|7052PG|706[567]MG|7097MG|720[48]MG|820[69]MG|11[459]4MG|1195MG|1196ML|3001ML|8152ML|1050PL|709[68]PL|7113PL|7193MG|7216MG|8205PG|7203MG|8143MG|7153MG|7141MG|7140ML)'
       model: '$1'
       device: 'tablet'
     - regex: 'iDxD8 3G'
@@ -4018,21 +5725,49 @@ Digma:
     - regex: 'TT1004PG'
       model: 'Optima 10.4" 3G'
       device: 'tablet'
+    - regex: 'TT1002MG'
+      model: 'Optima D 10.4" 3G'
+      device: 'tablet'
     - regex: 'TT7025MG'
       model: 'Optima 7.5" 3G'
       device: 'tablet'
-    - regex: '((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.STNM]+|Prime)(?:[ _][43]G)?)'
+    - regex: 'TT7026MW'
+      model: 'Optima 7.6" 3G'
+      device: 'tablet'
+    - regex: 'TT7020MG'
+      model: 'Optima 7.3" 3G'
+      device: 'tablet'
+    - regex: 'TT7024MG'
+      model: 'Optima 7.4" 3G'
+      device: 'tablet'
+    - regex: 'Optima ([0-9]+ [AXZ][0-9]+S?) ([43])G'
+      model: 'Optima $1 $2G'
+      device: 'tablet'
+    - regex: 'Optima ([0-9]+ A500S) 3G'
+      model: 'Optima $1 3G'
+      device: 'tablet'
+    - regex: '((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.STNMEV]+|Prime)(?:[ _][43]G)?)'
       model: '$1'
       device: 'tablet'
     - regex: 'Digma[_ ]([^;/]+) Build'
       model: '$1'
       device: 'tablet'
+    # VR headset
+    - regex: 'VRL42(?:[);/ ]|$)'
+      device: 'wearable'
+      model: 'VR L42'
+    # TV models
+    - regex: 'DM-LED(\d+SR\d+)(?:[);/ ]|$)'
+      device: 'tv'
+      model: 'DM-LED$1'
 
 # DoCoMo
 DoCoMo:
   regex: 'DoCoMo|\;FOMA|KGT/1\.0'
   device: 'feature phone'
   models:
+    - regex: 'DoCoMo/.+MST.+(SH2101V)'
+      model: '$1'
     - regex: 'DoCoMo/[12]\.0[/ ]([a-z0-9]+)'
       model: '$1'
     - regex: '([a-z0-9]+)(?:_W)?\;FOMA'
@@ -4042,29 +5777,62 @@ DoCoMo:
 
 # Doogee
 Doogee:
-  regex: 'DOOGEE[ _-]|Valencia2_Y100_?(?:pro|plus)|Y100_Plus|X5max(?:[_ ]PRO)?|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|BL[579]000(?:[);/ ]|$)|BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850'
+  regex: 'DOOGEE[/ _-]|Valencia2_Y100(?:_?(?:pro|plus))?|Y100_Plus|X5max(?:[_ ]PRO)?|Shoot_[12]|x5_doogee|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|(?:BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Y8 Plus|Hitman_DG850|S(?:[568]8|9[0567]|59|40|86)Pro|X9[56]Pro|S[478]0Lite|S88Plus|BL[579]000|N[24]0Pro|(?<!Lenovo )S90C|Ibiza_F2|S55_Lite|S60 ?Lite|Iron-bone DG750|X10S|X[56]0L|MIX2|Y6 Max|Y6_Piano(?:_black)?|X[679]pro)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:Valencia2_)?Y100_Plus(?:[);/ ]|$)'
       model: 'Valencia2 Y100 Plus'
     - regex: 'Valencia2_Y100pro'
       model: 'Valencia2 Y100 Pro'
+    - regex: 'Valencia2_Y100(?:[);/ ]|$)'
+      model: 'Valencia2 Y100'
     - regex: 'LEO_(DG280)'
       model: 'Leo $1'
-    - regex: '(BL[579]000)(?:[);/ ]|$)'
-      model: '$1'
+    - regex: 'Iron-bone (DG750)'
+      model: 'Iron Bone $1'
+    - regex: '(BL[579]000|S90C|X10S|X[56]0L)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'X(9[56])Pro(?:[);/ ]|$)'
+      model: 'X$1 Pro'
+    - regex: 'N([24]0)Pro(?:[);/ ]|$)'
+      model: 'N$1 Pro'
     - regex: 'BL12000 PRO'
       model: 'BL12000 Pro'
     - regex: 'BL5500[_ ]Lite'
       model: 'BL5500 Lite'
     - regex: 'BL12000'
       model: 'BL12000'
+    - regex: 'S([568]8|9[0567]|59|40|86)Pro'
+      model: 'S$1 Pro'
+    - regex: 'S(88)Plus'
+      model: 'S$1 Plus'
+    - regex: 'S([4-8]0|55)[_ ]?Lite'
+      model: 'S$1 Lite'
     - regex: 'KISSME-DG580'
       model: 'Kissme DG580'
     - regex: 'Hitman_DG850'
       model: 'Hitman DG580'
     - regex: 'X9 Mini'
       model: 'X9 Mini'
+    - regex: 'x5_doogee'
+      model: 'X5'
+    - regex: 'Doogee X5MP'
+      model: 'X5 Max Pro'
+    - regex: 'Shoot_([12])'
+      model: 'Shoot $1'
+    - regex: 'Ibiza_F2'
+      model: 'Ibiza F2'
+    - regex: 'Y6_Piano_black'
+      model: 'Y6 Piano Black'
+    - regex: 'Y6_Piano'
+      model: 'Y6 Piano'
+    - regex: 'Y6 Max 3D'
+      model: 'Y6 Max 3D'
+    - regex: 'Y6 Max'
+      model: 'Y6 Max'
+    - regex: 'X([679])pro'
+      model: 'X$1 Pro'
+
     - regex: '(X5max(?:[_ ]PRO)?)'
       model: '$1'
     - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)'
@@ -4073,8 +5841,10 @@ Doogee:
       model: '$1'
     - regex: 'DOOGEE[ _-]([^);/]+)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'Y9Plus(?:[);/ ]|$)'
-      model: 'Y9 Plus'
+    - regex: 'Y([89]) ?Plus(?:[);/ ]|$)'
+      model: 'Y$1 Plus'
+    - regex: 'MIX2(?:[);/ ]|$)'
+      model: 'Mix 2'
 
 # Doov
 Doov:
@@ -4092,11 +5862,25 @@ Dopod:
   device: 'feature phone'
   model: '$1'
 
-# Doro
+# Doppio
+Doppio:
+  regex: 'Doppio '
+  device: 'smartphone'
+  models:
+    - regex: 'Doppio DP355(?:[);/ ]|$)'
+      model: 'DP355'
+    - regex: 'Doppio ([0-9a-z]+)'
+      model: '$1'
+
+# Doro (doro.com)
 Doro:
-  regex: 'Doro'
+  regex: 'Doro|DSB-02[23]0'
   device: 'smartphone'
   models:
+    - regex: 'DSB-0230(?:[);/ ]|$)'
+      model: '8050'
+    - regex: 'DSB-0220(?:[);/ ]|$)'
+      model: '8080'
     - regex: 'Doro[ _-]?([^;/)]+) Build'
       model: '$1'
     - regex: 'Doro[ _-]([0-9a-z]+)'
@@ -4104,9 +5888,11 @@ Doro:
 
 # Dune HD
 'Dune HD':
-  regex: 'DuneHD'
+  regex: 'DuneHD|SOLO 4K(?:[);/ ]|$)'
   device: 'tv'
   models:
+    - regex: 'SOLO 4K(?:[);/ ]|$)'
+      model: 'Solo 4k'
     - regex: 'DuneHD/\d.\d \([a-z]+__([a-z0-9_-]+);'
       model: '$1'
     - regex: 'DuneHD/\d.\d \(([a-z0-9_-]+);'
@@ -4114,25 +5900,30 @@ Doro:
 
 # DNS
 DNS:
-  regex: '(?:DNS|AirTab)[ _\-]([^;/)]+)(?: Build|\))|(?:S4505M|SD01M)(?:[);/ ]|$)'
+  regex: '(?:DNS|AirTab)[ _\-]([^;/)]+)|(?:S4505M|S4004M|SD01M)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:DNS[_ ])?(S4505M|SD01M|S4502|S4003|S4003)(?:[);/ ]|$)'
+    - regex: '(?:DNS[_ ])?(S4505M|S4004M|SD01M|S4502|S4003|S4003)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'AirTab[ _\-]([^;/]+)Build'
+    - regex: 'S-4003(?:[);/ ]|$)'
+      model: 'S4003'
+    - regex: 'AirTab[ _\-]([^;/]+)(?: Build|[);])'
       model: 'AirTab $1'
       device: 'tablet'
-    - regex: 'DNS[ _\-]([^;/]+)Build'
+    - regex: 'DNS[ _\-]([^;/]+)(?: Build|[);])'
       model: '$1'
 
-# E-Boda
+# E-Boda (e-boda.ro)
 E-Boda:
-  regex: 'E-Boda|Eclipse_(?:G400M|G500)'
+  regex: 'E-Boda|Eclipse_(?:G400M|G500)|Revo R77 GPS'
   device: 'smartphone'
   models:
     - regex: 'E-Boda ((?:Revo|Izzycomm|Essential|Intelligence|Supreme)[^/;]+) Build'
       device: 'tablet'
       model: '$1'
+    - regex: 'Revo R77 GPS'
+      device: 'tablet'
+      model: 'Revo R77 GPS'
     - regex: 'Eclipse_(G400M|G500)'
       model: 'Eclipse $1'
     - regex: 'E-Boda ([^/;]+) Build'
@@ -4140,13 +5931,13 @@ E-Boda:
 
 # Easypix
 Easypix:
-  regex: 'EasyPad|EasyPhone'
+  regex: 'EasyPad|(?<!INOI )EasyPhone'
   device: 'smartphone'
   models:
     - regex: '(EasyPhone[^/;]+) Build'
       model: '$1'
-    - regex: '(EasyPad[^/;]+) Build'
-      model: '$1'
+    - regex: 'EasyPad ([^/;)]+)(?: Build|[;)])'
+      model: 'EasyPad $1'
       device: 'tablet'
 
 # Ebest
@@ -4159,29 +5950,37 @@ EBEST:
     - regex: 'EBEST[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
+# Horizont (https://horizont.by/en/)
+Horizont:
+  regex: 'Horizont (32LE7011D)'
+  device: 'tv'
+  model: '$1'
+
 # Echo Mobiles
 Echo Mobiles:
-  regex: 'ECHO[ _](HOLI|HORIZON|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA)|HORIZON_M'
+  regex: 'ECHO[ _](HOLI|HORIZON|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA|FUSION)|HORIZON_M|Stellar 3G|FEELING'
   device: 'smartphone'
   models:
     - regex: 'ECHO_HORIZON_LITE'
       model: 'HORIZON Lite'
-    - regex: '(HORIZON_M)(?:[);/ ]|$)'
+    - regex: '(HORIZON_M|FEELING)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'STELLAR 3G'
+      model: 'STELLAR 3G'
     - regex: 'ECHO_SMART_4G'
       model: 'SMART 4G'
-    - regex: 'ECHO[ _](HOLI|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA)'
+    - regex: 'ECHO[ _](HOLI|MAX|MOSS|NOTE|POWER|SMART|DUNE|JAVA|FUSION)'
       model: '$1'
 
 # ECS
 ECS:
-  regex: '(?:TA10CA3|TM105A?|TR10CS1)(?:[);/ ]|$)'
+  regex: '(?:TA10CA3|TM105A?|TR10[CR]S1|TF10EA2)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'TA10CA3(?:[);/ ]|$)'
       model: 'TA10CA3'
-    - regex: 'TR10CS1(?:[);/ ]|$)'
-      model: 'TR10CS1'
+    - regex: '(TR10[CR]S1|TF10EA2)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'TM105A(?:[);/ ]|$)'
       model: 'TM105A'
     - regex: 'TM105(?:[);/ ]|$)'
@@ -4189,11 +5988,27 @@ ECS:
 
 # EE
 EE:
-  regex: 'Hawk_from_EE'
+  regex: '(?:Harrier(?: Tab)?|Hawk|Rook)[_ ]from[_ ]EE'
   device: 'smartphone'
   models:
-    - regex: 'Hawk_from_EE'
-      model: 'Hawk'
+    - regex: '(Harrier Tab)[_ ]from[_ ]EE'
+      device: 'tablet'
+      model: '$1'
+    - regex: 'Rook[_ ]from[_ ]EE'
+      model: 'Rock'
+    - regex: '(Harrier|Hawk)[_ ]from[_ ]EE'
+      model: '$1'
+
+# EKT
+EKT:
+  regex: 'EK-(?:5040|5336|5540|5937|6020|8680|MII|T7020)'
+  device: 'tablet'
+  models:
+    - regex: 'EK-(MII|T7020)'
+      model: 'EK-$1'
+    - regex: 'EK-(5040|5336|5540|5937|6020|8680)'
+      device: 'smartphone'
+      model: 'EK-$1'
 
 # Eks Mobility
 Eks Mobility:
@@ -4207,21 +6022,40 @@ Eks Mobility:
 
 # Elephone
 Elephone:
-  regex: 'Elephone|P6000( ?Pro| ?Plus|\+| ?02)? Build'
+  regex: 'Elephone|Vowney(?: Lite)?|P6000(?!_Plus)( ?Pro| ?Plus|\+| ?02| 5.0 01)?|Soldier|(?:Trunk 1|P8_3D|P8_Max|A6_mini|Android 9.+ PX|PX_Pro| U3H)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Elephone Trunk(?:[);/ ]|$)'
+    - regex: '(?:Elephone[_ ])?Trunk(?: 1)?(?:[);/ ]|$)'
       model: 'Trunk'
+    - regex: 'Vowney Lite(?:[);/ ]|$)'
+      model: 'Vowney Lite'
+    - regex: 'Vowney(?:[);/ ]|$)'
+      model: 'Vowney'
     - regex: 'P6000(\+| ?Plus)(?:[);/ ]|$)'
       model: 'P6000 Plus'
     - regex: 'P6000 02(?:[);/ ]|$)'
       model: 'P6000 02'
+    - regex: 'P6000 5.0 01(?:[);/ ]|$)'
+      model: 'P6000 01'
     - regex: 'P6000 ?Pro(?:[);/ ]|$)'
       model: 'P6000 Pro'
-    - regex: '(?:Elephone[ _])?(P[68]000|S2)(?:[);/ ]|$)'
+    - regex: 'Soldier(?:[);/ ]|$)'
+      model: 'Soldier'
+    - regex: 'A6_mini(?:[);/ ]|$)'
+      model: 'A6 Mini'
+    - regex: 'PX_Pro(?:[);/ ]|$)'
+      model: 'PX Pro'
+    - regex: ' U3H(?:[);/ ]|$)'
+      model: 'U3H'
+    - regex: 'Android 9.+ PX(?:[);/ ]|$)'
+      model: 'PX'
+    - regex: '(P8_3D|P8_Max)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(?:Elephone[ _])?(P[768]000|S2)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'Elephone[ _\-]([^/;]+) Build'
+    - regex: 'Elephone[ _\-]([^/;]+)(?: Build|[;)])'
       model: '$1'
+
 # Element
 Element:
   regex: 'AFTRS'
@@ -4234,12 +6068,6 @@ Elenberg:
   device: 'tablet'
   model: '$1'
 
-# Energy Sistem
-'Energy Sistem':
-  regex: 'ENERGY[ _-]?([^;/]+) Build'
-  device: 'tablet'
-  model: '$1'
-
 # Ericy
 Ericy:
   regex: 'Ericy-([a-z0-9]+)'
@@ -4264,16 +6092,18 @@ E-tel:
 
 # Evercoss
 Evercoss:
-  regex: 'EVERCOSS[ _]|(A75A\*|U50A_PLUS|M50 STAR)(?:[);/ ]|$)'
+  regex: 'EVERCOSS[ _]|(A75A\*|U50A_PLUS|M50 STAR|A75 MAX)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'A75A\*(?:[);/ ]|$)'
       model: 'A75A Star'
+    - regex: 'A75 MAX*(?:[);/ ]|$)'
+      model: 'A75 Max'
     - regex: 'U50A_PLUS(?:[);/ ]|$)'
       model: 'U50A Plus'
     - regex: 'M50 STAR(?:[);/ ]|$)'
       model: 'M50 Star'
-    - regex: 'EVERCOSS[ _](A7[BRLZ]|A65|A74A)(?:[);/ ]|$)'
+    - regex: 'EVERCOSS[ _](A7[BRLZ]|A65|A74A|A5Z)(?:[);/ ]|$)'
       model: '$1'
 
 # Eurostar
@@ -4299,13 +6129,28 @@ Eton:
 
 # Essentielb
 Essentielb:
-  regex: '(?:Wooze[_ ](?:I55?|L|XL)|HEYOU[135])(?:[);/ ]|$)'
+  regex: '(?:Wooze[_ ]?(?:I55?|I45|X?L)|HEYOU(?:[135]|30))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'HEYOU([135])(?:[);/ ]|$)'
+    - regex: 'HEYOU([135]|30)(?:[);/ ]|$)'
       model: 'HEYou $1'
-    - regex: '(Wooze[_ ](?:I55?|L|XL))(?:[);/ ]|$)'
-      model: '$1'
+    - regex: 'Wooze[_ ]?((?:I55?|I45|X?L))(?:[);/ ]|$)'
+      model: 'Wooze $1'
+
+# Facebook
+Facebook:
+  regex: 'PortalTV'
+  device: 'tv'
+  model: 'Portal TV'
+
+# Gateway
+Gateway:
+  regex: 'GWAT8-1'
+  device: 'smartphone'
+  models:
+    - regex: 'GWAT8-1'
+      device: 'tablet'
+      model: 'Tablet 8"'
 
 # Rikomagic
 Rikomagic:
@@ -4319,23 +6164,34 @@ Rinno:
   device: 'smartphone'
   model: '$1'
 
-# Riviera
+# Riviera (www.riviera.com.ec)
 Riviera:
-  regex: 'RIVIERA '
+  regex: 'RIVIERA[ _]'
   device: 'smartphone'
   models:
-    - regex: 'F23'
-      model: 'F23'
+    - regex: 'RIVIERA[ _](F23|U963)'
+      model: '$1'
 
 # Senseit
 Senseit:
-   regex: 'SENSEIT[ _]?([^;/)]+)( Build|\))'
-   device: 'smartphone'
-   model: '$1'
+  regex: 'SENSEIT[ _]?([^;/)]+)( Build|\))'
+  device: 'smartphone'
+  model: '$1'
+
+# SunWind (sunwind.ru.com)
+SUNWIND:
+  regex: 'SUNWIND[_ ]|SUN[-_]LED\d+|(?:SKY 9 [EA]\d+ 3G)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'SKY ([79]) ([EA]\d+) 3G'
+      model: 'Sky $1 $2 3G'
+    - regex: 'SUN[-_]LED(\d+\w\d+)'
+      device: 'tv'
+      model: 'SUN-LED$1'
 
 # Sony & Sony Ericsson (combined as they are mixed up)
 Sony:
-  regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[246]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|XQ-AD51|XQ-AU52'
+  regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D(?:200[45]|21(?:0[45]|14)|22(?:0[236]|12|43)|230[2356]|240[36]|2502|2533|510[236]|530[36]|5316|5322|5503|58[03]3|65(?:0[23]|43|63)|66[03458]3|66[14]6|6708)|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|6508|65[35]3|66[0358]3|68[358]3)|F(?:311[12356]|331[13]|321[12356]|5[13]21|5122|813[12]|833[12])|G(?:2299|312[135]|311[26]|322[136]|3212|331[123]|3412|3416|342[136]|823[12]|834[123]|8[14]4[12]|8188)|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|4493|8116|8166|82[1679]6|83[12]4|8416|9436|9493)|I(?:3[12]23|3213|[34]113|[34]312|4193|42[19]3|4332)|J(?:3173|3273|81[17]0|82[17]0|91[15]0|92[16]0)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|XQ-[A-Z]{2}[0-9]{2}|W960|portalmmm/2\.0 K|S3[69]h|SOG0[1-5]|SOL2[2-6]|SOT31|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[2-5]D|[1-4]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A[01]01SO|A102SO|SO-[45]1[AB]|SO-5[23][AB]|A103SO|A002SO|NW-(A100|Z1000)Series|NSZ-GS7|SmartWatch 3|SVP-DTV15'
   device: 'smartphone'
   models:
     # SONY ERICSSON: explicit smartphone models
@@ -4465,22 +6321,42 @@ Sony:
       device: 'feature phone'
 
     # SONY: explicit smartphone models
+    - regex: 'SO-01E(?:[);/ ]|$)'
+      model: 'Xperia AX'
+    - regex: 'XQ-BE[4-7]2'
+      model: 'Xperia Pro I'
     - regex: 'SO-04F'
       model: 'Xperia A2'
+    - regex: 'SO-02D'
+      model: 'Xperia NX'
+    - regex: 'G2299'
+      model: 'Xperia R1 Plus'
     - regex: 'SO-04G'
       model: 'Xperia A4'
     - regex: '(?:Sony(?:Ericsson)?)?I(?:4113|31[12]3)'
       model: 'Xperia 10'
-    - regex: '(?:A001SO|XQ-AU52|SO-41A|SOV43)(?:[);/ ]|$)'
+    - regex: '(?:Sony(?:Ericsson)?)?J3173(?:[);/ ]|$)'
+      model: 'Xperia Ace'
+    - regex: 'SO-41B(?:[);/ ]|$)'
+      model: 'Xperia Ace II'
+    - regex: '(?:A001SO|XQ-AU42|XQ-AU51|XQ-A[TU]52|SO-41A|SOV43)(?:[);/ ]|$)'
       model: 'Xperia 10 II'
-    - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|3223)'
+    - regex: '(?:A10[12]SO|SO-52B|SOG04|XQ-BT52)(?:[);/ ]|$)'
+      model: 'Xperia 10 III'
+    - regex: 'XQ-BT44(?:[);/ ]|$)'
+      model: 'Xperia 10 III Lite'
+    - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|32[12]3)'
       model: 'Xperia 10 Plus'
     - regex: '(?:Sony(?:Ericsson)?)?I4193'
       model: 'Xperia 10 Dual'
     - regex: '(?:Sony(?:Ericsson)?)?(?:J(?:9110|81[17]0)|SOV40|SO-03L|802SO)'
       model: 'Xperia 1'
-    - regex: '(?:Sony(?:Ericsson)?)?(?:SOG01|SO-51A)(?:[);/ ]|$)'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:J9150)'
+      model: 'Xperia 1 Professional Edition'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:SOG01|SO-51A|XQ-AT42|XQ-AT51|SO51Aa|XQ-AT72)(?:[);/ ]|$)'
       model: 'Xperia 1 II'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:SO-51B|SOG03|XQ-BC[457]2)(?:[);/ ]|$)'
+      model: 'Xperia 1 III'
     - regex: '(?:Sony(?:Ericsson)?)?LT22i|Xperia P'
       model: 'Xperia P'
     - regex: '(?:Sony(?:Ericsson)?)?LT25i|Xperia V'
@@ -4489,8 +6365,14 @@ Sony:
       model: 'Xperia 5 Dual'
     - regex: '(?:Sony(?:Ericsson)?)?(?:J82[17]0|SO-01M|SOV41|901SO)'
       model: 'Xperia 5'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:SOG02|A002SO|XQ-AS[4567]2|SO-52A)'
+      model: 'Xperia 5 II'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:SO-53B|A103SO|SOG05|XQ-BQ72)'
+      model: 'Xperia 5 III'
     - regex: '(?:Sony(?:Ericsson)?)?(?:SOV42|902SO)'
       model: 'Xperia 8'
+    - regex: '(?:Sony(?:Ericsson)?)?J3273'
+      model: 'Xperia 8 Lite'
     - regex: '(?:Sony(?:Ericsson)?)?LT26ii'
       model: 'Xperia SL'
     - regex: '(?:Sony(?:Ericsson)?)?LT26i|Xperia S(?:[);/ ]|$)'
@@ -4519,6 +6401,8 @@ Sony:
       model: 'Xperia U'
     - regex: '(?:Sony(?:Ericsson)?)?SOL22'
       model: 'Xperia UL'
+    - regex: '(?:Sony(?:Ericsson)?)?SOL21'
+      model: 'Xperia VL'
     - regex: '(?:Sony(?:Ericsson)?)?ST26[ia]'
       model: 'Xperia J'
     - regex: '(?:Sony(?:Ericsson)?)?ST27[ia]'
@@ -4545,13 +6429,13 @@ Sony:
       model: 'Xperia ZR'
     - regex: '(?:Sony(?:Ericsson)?)?C650[236]|Xperia ZL(?:[);/ ]|$)'
       model: 'Xperia ZL'
+    - regex: '(?:Sony(?:Ericsson)?)?SOL25(?:[);/ ]|$)'
+      model: 'Xperia ZL2'
     - regex: '(?:Sony(?:Ericsson)?)?(?:C66(?:0[236]|16)|SO-02E)'
       model: 'Xperia Z'
     - regex: '(?:Sony(?:Ericsson)?)?(?:C68(?:0[26]|[34]3)|XL39H|SOL24)|Xperia Z Ultra(?:[);/ ]|$)'
       device: 'phablet'
       model: 'Xperia Z Ultra'
-    - regex: '(?:Sony(?:Ericsson)?)?(?:C69(?:0[236]|16|43)|L39H|SO-0[12]F)'
-      model: 'Xperia Z1'
     - regex: 'Xperia Z(?:[);/ ]|$)'
       model: 'Xperia Z'
     - regex: '(?:Sony(?:Ericsson)?)?D200[45]'
@@ -4572,7 +6456,7 @@ Sony:
       model: 'Xperia L3'
     - regex: 'I43[13]2'
       model: 'Xperia L3 Dual'
-    - regex: 'XQ-AD51'
+    - regex: 'XQ-AD5[12]'
       model: 'Xperia L4'
     - regex: '(?:Sony(?:Ericsson)?)?D2302'
       model: 'Xperia M2 Dual'
@@ -4610,16 +6494,21 @@ Sony:
       device: 'phablet'
     - regex: '(?:Sony(?:Ericsson)?)?D5503|Xperia Z1 Compact'
       model: 'Xperia Z1 Compact'
-    - regex: '(?:Sony(?:Ericsson)?)?(?:D58[03]3|SO-02G)'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:C69(?:0[236]|16|43)|SOL23|L39H|SO-0[12]F)|Xperia Z1(?:[);/ ]|$)'
+      model: 'Xperia Z1'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:D58[03]3|SO-02G)|Xperia Z3 Compact(?:[);/ ]|$)'
       model: 'Xperia Z3 Compact'
-    - regex: '(?:Sony(?:Ericsson)?)?(?:D65(?:0[23]|43)|SO-03F)'
-      model: 'Xperia Z2'
     - regex: 'Xperia Z2 Tablet Wifi'
       model: 'Xperia Z2 Tablet WiFi'
       device: 'tablet'
+    - regex: 'SGP561'
+      model: 'Xperia Z2 Tablet'
+      device: 'tablet'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:D65(?:0[23]|43)|SO-03F)|Xperia Z2(?:[);/ ]|$)'
+      model: 'Xperia Z2'
     - regex: 'D6563'
       model: 'Xperia Z2a'
-    - regex: '(?:Sony(?:Ericsson)?)?(?:D66[045]3|D66[14]6|SO-01G|SOL26|401SO)'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:D66[045]3|D66[14]6|SO-01G|SOL26|401SO)|Xperia Z3(?:[);/ ]|$)'
       model: 'Xperia Z3'
     - regex: '(?:Sony(?:Ericsson)?)?(?:D6633|D6683)'
       model: 'Xperia Z3 Dual'
@@ -4680,7 +6569,7 @@ Sony:
       model: 'Xperia XA2 Ultra'
     - regex: '(?:Sony(?:Ericsson)?)?G823[12]|SOV35|602SO|SO-03J'
       model: 'Xperia XZs'
-    - regex: '(?:Sony(?:Ericsson)?)?G814[12]|SO-04[JK]'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:G814[12]|G8188|SO-04[JK])'
       model: 'Xperia XZ Premium'
     - regex: '(?:Sony(?:Ericsson)?)?(?:H83[12]4|H82[17]6|SOV37|SO-03K|H8296|702SO)'
       model: 'Xperia XZ2'
@@ -4688,7 +6577,7 @@ Sony:
       model: 'Xperia XZ2 Dual'
     - regex: 'SO-05K'
       model: 'Xperia XZ2 Compact'
-    - regex: '(?:H8166|SOV38)(?:[);/ ]|$)'
+    - regex: '(?:H81[16]6|SOV38)(?:[);/ ]|$)'
       model: 'Xperia XZ2 Premium Dual'
     - regex: '(?:Sony(?:Ericsson)?)?(?:H(8416|9436|9493)|SO-01L|SOV39|801SO)'
       model: 'Xperia XZ3'
@@ -4714,7 +6603,7 @@ Sony:
       model: 'Xperia X Performance Dual'
 
     # SONY: explicit tablet models
-    - regex: 'SGP(?:311|312|321)(?:[);/ ]|$)|SO-03E'
+    - regex: '(?:SGP(?:311|312|321)|(Sony)?SO-03E|Tablet Z LTE)(?:[);/ ]|$)'
       model: 'Xperia Tablet Z'
       device: 'tablet'
     - regex: 'SGP712(?:[);/ ]|$)'
@@ -4730,15 +6619,39 @@ Sony:
       model: 'Xperia Tablet S'
       device: 'tablet'
 
-    # SONY: Bravia
-    - regex: '(?:BRAVIA )(2K GB ATV3|4K UR2|4K GB ATV3|4K GB|4K 2015|2015)(?:[);/ ]|$)'
+    # SONY: explicit wearable models
+    - regex: 'SmartWatch 3'
+      model: 'SmartWatch 3'
+      device: 'wearable'
+
+    # SONY: Bravia or TV Box
+    - regex: '(?:BRAVIA )(2K GB ATV3|4K UR[23]|4K GB ATV3|4K GB|4K 2015|2015)(?:[);/ ]|$)'
       model: 'Bravia $1'
       device: 'tv'
+    - regex: 'SVP-DTV15(?:[);/ ]|$)'
+      model: 'Bravia 4K (2015)'
+      device: 'tv'
+    - regex: '(NSZ-GS7)(?:[);/ ]|$)'
+      model: '$1'
+      device: 'tv'
+    - regex: 'Sony-BRAVIA-VH1(?:[);/ ]|$)'
+      model: 'Bravia VH1'
+      device: 'tv'
+
+    - regex: 'NW-A100Series'
+      model: 'Walkman A100'
+      device: 'portable media player'
+    - regex: 'NW-Z1000Series'
+      model: 'Walkman Z1000'
+      device: 'portable media player'
 
     # general detections
     - regex: 'SonyBDP|SonyDBV'
       model: 'Blu-ray Player'
       device: 'tv'
+    - regex: 'BDP2015'
+      model: 'Blu-ray Player (2015)'
+      device: 'tv'
     - regex: '(?:Sony-)?(KDL?-?[0-9a-z]+)'
       model: '$1'
       device: 'tv'
@@ -4754,6 +6667,9 @@ Sony:
     - regex: 'portalmmm/2.0 K([a-z0-9]+)'
       model: 'K$1'
       brand: 'Sony Ericsson'
+    - regex: 'SonyEricsson ?IS11S'
+      model: 'arco IS11S'
+      brand: 'Sony Ericsson'
     - regex: 'Sony ?Ericsson?([^/;]*) Build'
       model: '$1'
       brand: 'Sony Ericsson'
@@ -4764,6 +6680,9 @@ Sony:
     - regex: 'Sony ?Ericsson ?([a-z0-9\-]+)'
       model: '$1'
       brand: 'Sony Ericsson'
+    - regex: 'Sony Corporation/([^/;]*)\)'
+      model: '$1'
+      device: 'desktop'
 
     - regex: 'Sony (Tablet[^/;]*) Build'
       model: '$1'
@@ -4774,8 +6693,12 @@ Sony:
     - regex: 'Xperia ([^/;]*Tablet[^/;]*) Build'
       model: 'Xperia $1'
       device: 'tablet'
+    - regex: 'Xperia ([^;/]+) \(AOSP\) Build'
+      model: 'Xperia $1'
     - regex: 'Xperia ([^;/]+) Build'
       model: 'Xperia $1'
+    - regex: '(XQ-[A-Z]{2}[0-9]{2})'
+      model: '$1'
     - regex: 'Sony[ -]?([^/;]*) Build'
       model: '$1'
     - regex: 'Sony[ -]?([a-z0-9\-]+)'
@@ -4846,8 +6769,15 @@ Ergo:
     - regex: 'ERGO[_ ]Tab[ _]Hero[ _]II'
       model: 'Tab Hero II'
       device: 'tablet'
+    - regex: 'ERGO[_ ](B700)'
+      model: 'Tab $1'
+      device: 'tablet'
 
-# Ericsson
+    - regex: 'ERGO SmartBox SX'
+      model: 'SmartBox SX'
+      device: 'tv'
+
+# Ericsson
 Ericsson:
   regex: '(?:Ericsson(?:/ )?[a-z0-9]+)|(?:R380 2.0 WAP1.1)'
   device: 'feature phone'
@@ -4857,9 +6787,9 @@ Ericsson:
     - regex: 'R380 2.0 WAP1.1'
       model: 'R380'
 
-# Energizer
+# Energizer (www.energizeyourdevice.com)
 Energizer:
-  regex: 'PowerMax|ENERGY[_ ]?(?:[45]00|400S|S[56]00|E520)(?:[_ ]LTE)?'
+  regex: 'PowerMax|HARDCASEH550S|ENERGY[_ ]?(?:[45]00|400S|S[56]00|E12|E5[02]0S?)(?:[_ ](?:LTE|EU))?'
   device: 'smartphone'
   models:
     - regex: 'PowerMax(P[0-9]+S?)'
@@ -4872,6 +6802,21 @@ Energizer:
       model: 'Energy 400'
     - regex: 'ENERGY[_ ]S([56]00)'
       model: 'Energy S$1'
+    - regex: 'ENERGY[_ ]?(E500S|E500|E12)'
+      model: 'Energy $1'
+    - regex: 'HARDCASE(H550S)'
+      model: 'Hard Case $1'
+
+# Energy Sistem
+'Energy Sistem':
+  regex: 'ENERGY[ _-]?([^;/]+) Build|Energy Phone Pro 3'
+  device: 'smartphone'
+  models:
+    - regex: 'Energy Phone Pro 3'
+      model: 'Energy Phone Pro 3'
+    - regex: 'ENERGY[ _-]?([^;/]+) Build'
+      device: 'tablet'
+      model: '$1'
 
 # eTouch
 eTouch:
@@ -4903,12 +6848,16 @@ Storex:
 
 # Evertek
 Evertek:
-  regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy|Vivid|Slim|Glow|Magic|Smart|Star)[^/;]*) Build|E70[25]0HD|E805[01]HD|E9054HD|E8050HG|E7914HG'
+  regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy|Vivid|Slim|Glow|Magic|Smart|Star)[^/;]*) Build|E70[25]0HD|E805[01]HD|E9054HD|E8050HG|E7914HG|V5_Nano|EverMiracle Plus'
   device: 'smartphone'
   models:
     - regex: '(E70[25]0HD|E805[01]HD|E9054HD|E8050HG|E7914HG)'
       device: 'tablet'
       model: 'Everpad $1'
+    - regex: 'V5_Nano'
+      model: 'V5 Nano'
+    - regex: 'EverMiracle Plus'
+      model: 'EverMiracle Plus'
     - regex: '(Ever(?:Glory|Shine|Miracle|Mellow|Classic|Trendy|Fancy|Vivid|Slim|Glow|Magic|Smart|Star)[^/;]*) Build'
       model: '$1'
 
@@ -4926,64 +6875,73 @@ Evolio:
 
 # Evolveo
 Evolveo:
-  regex: 'EVOLVEO'
+  regex: 'EVOLVEO|StrongPhone'
   device: 'smartphone'
   models:
+    - regex: 'EVOLVEO MultiMedia Box M4'
+      device: 'tv'
+      model: 'MultiMedia Box M4'
     - regex: 'Smart TV ([^;/]*) Build'
       device: 'tv'
       model: 'Smart TV $1'
-    - regex: 'EVOLVEO StrongPhone G([248])'
+    - regex: 'EVOLVEO StrongPhone G(\d)'
       model: 'StrongPhone G$1'
+    - regex: '(?:EVOLVEO[ _])?StrongPhone[ _]?Q([679])(_LTE)?'
+      model: 'StrongPhone Q$1$2'
     - regex: 'EVOLVEO[ _]([^;/]*) Build'
       model: '$1'
 
-# Explay
-Explay:
-  regex: 'Explay|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-3]|RioPlay|Leader|Infinityll|Imperium[78]'
-  device: 'tablet'
+# Evoo
+Evoo:
+  regex: 'EVM4G3(?:[);/ ]|$)'
+  device: 'smartphone'
   models:
-    - regex: 'ActiveD[ _]7.4[ _]3G'
-      model: 'ActiveD 7.4 3G'
-    - regex: 'Imperium([78])(?:[);/ ]|$)'
-      model: 'Imperium $1 3G'
-    - regex: 'ActiveD[ _]8.2[ _]3G'
-      model: 'ActiveD 8.2 3G'
-    - regex: 'CinemaTV[ _]3G'
-      model: 'CinemaTV 3G'
-    - regex: 'Infinityll'
-      model: 'Infinity II'
-    - regex: 'Informer[ _]([0-9]+(?:[ _]3G)?)'
-      model: 'Informer $1'
-    - regex: 'Surfer[ _]([0-9\.]+(?:[ _]3G)?)'
-      model: 'Surfer $1'
-    - regex: 'sQuad[ _]([0-9\.]+(?:[ _]3G)?)'
-      model: 'sQuad $1'
-    - regex: 'Onliner([1-3])'
-      model: 'Onliner $1'
-    - regex: 'Atlant(?:[);/ ]|$)'
-      device: 'smartphone'
-      model: 'Atlant'
-    - regex: 'Explay[ _-]([^;/]+) Build'
-      model: '$1'
-    - regex: 'Explay[ _-]([^;/]+)(?:[;/)]|$)'
-      model: '$1'
-    - regex: '(RioPlay)(?:[);/ ]|$)'
-      device: 'smartphone'
-      model: 'Rio Play'
-    - regex: 'Leader'
-      model: 'Leader'
+    - regex: 'EVM4G3(?:[);/ ]|$)'
+      model: 'EVM4G3'
+
+# Leotec
+Leotec:
+  regex: '(LESPH501[14]|LESPH5003B|SUPERNOVA (?:Qi16|Qi32|i3G96[X]?|iS3G)|PULSAR QI3G)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'LESPH5011'
+      model: 'Argon e250'
+    - regex: 'LESPH5003B'
+      model: 'Argon A250B'
+    - regex: 'LESPH5014'
+      model: 'Krypton K150'
+    - regex: 'SUPERNOVA (Qi16|Qi32|i3G96[X]?|iS3G)'
+      device: 'tablet'
+      model: 'Supernova $1'
+    - regex: 'PULSAR (QI3G)'
+      device: 'tablet'
+      model: 'Pulsar $1'
+
+# EVPAD (https://www.evpadpro.com/)
+EVPAD:
+  regex: 'EVBOX-PLUS\+'
+  device: 'tv'
+  models:
+    - regex: 'EVBOX-PLUS\+'
+      model: 'EVBox Plus'
 
 # EvroMedia
 EvroMedia:
-  regex: 'EVROMEDIA|Playpad[ _]'
+  regex: 'EVROMEDIA|Playpad[ _]|PLAY_PAD_PRO_XL|3G NOTE XL'
   device: 'tablet'
   models:
     - regex: 'Playpad 3G GOO'
       model: 'Play Pad 3G Goo'
+    - regex: 'Play Pad 3G 2Goo'
+      model: 'Play Pad 3G 2Goo'
     - regex: 'Play Pad PRO'
       model: 'Play Pad Pro'
+    - regex: 'PLAY_PAD_PRO_XL'
+      model: 'Play Pad Pro XL'
     - regex: 'PlayPad 3GTab XL'
       model: 'Play Pad 3G Tab XL'
+    - regex: '3G NOTE XL'
+      model: 'Play Pad 3G Note XL'
 # EKO
 EKO:
   regex: 'EKO'
@@ -4996,11 +6954,19 @@ EKO:
 
 # Extrem
 Extrem:
-  regex: 'Rock X9+'
+  regex: 'Rock X9+|ROCK_X11'
   device: 'smartphone'
   models:
     - regex: 'Rock X9+'
       model: 'Rock X9+'
+    - regex: 'ROCK_X11'
+      model: 'Rock X11'
+
+# Jumper (jumper.com.ru)
+Jumper:
+  regex: 'EZpad ([^;/)]+)(?: Build|[;)])'
+  device: 'tablet'
+  model: 'EZpad $1'
 
 # Ezze
 Ezze:
@@ -5020,10 +6986,10 @@ Ezio:
 
 # Forstar
 Forstar:
-  regex: 'Amosta 3G5'
+  regex: 'Amosta ?3G5'
   device: 'smartphone'
   models:
-    - regex: 'Amosta 3G5'
+    - regex: 'Amosta ?3G5'
       model: 'Amosta 3G5'
 
 # Foxconn
@@ -5047,9 +7013,9 @@ Fondi:
     - regex: 'Fondi[- _]([^;/)]+)'
       model: '$1'
 
-# Fairphone
+# Fairphone (fairphone.com)
 Fairphone:
-  regex: '(FP(?:1U?|2))(?:[);/ ]|$)'
+  regex: ' (FP(?:1U?|[23]))(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -5059,9 +7025,9 @@ Famoco:
   device: 'smartphone'
   model: '$1'
 
-# FiGO
+# FiGO (figoglobal.com)
 FiGO:
-  regex: 'ATRIUM II F55L2|TRIO F40LT|EPIC F50G|Gravity X55L|Orion M50L|ULTRA M50G|M405B|VIRTUE3|F55L Build'
+  regex: 'ATRIUM II F55L2|TRIO F40LT|CENTRIC S50G|EPIC F50G|Gravity X55L|Orion M50L|ULTRA M50G|UltraJ8|M405B|VIRTUE3|F55L Build|Orbit_ll'
   device: 'smartphone'
   models:
     - regex: 'ATRIUM II F55L2'
@@ -5082,6 +7048,12 @@ FiGO:
       model: 'Virtue II'
     - regex: 'VIRTUE3'
       model: 'Virtue III'
+    - regex: 'CENTRIC S50G'
+      model: 'Centric S50G'
+    - regex: 'UltraJ8'
+      model: 'Ultra J8'
+    - regex: 'Orbit_ll'
+      model: 'Orbit II'
 
 # FNB
 FNB:
@@ -5101,15 +7073,17 @@ FNB:
 
 # Fujitsu
 Fujitsu:
-  regex: '(?:F-01[FHJKL]|F-02[EFGHLK]|F-03[DEFGH]|F-04[EGKJ]|F-05[DEFJ]|F-06E|F-07[DE]|F-08D|F-09[DE]|F-10D|F-[45]1A|F-11D|F-12C|M532|FARTM933KZ|901FJ|arrows(?:M03|M04-PREMIUM)|801FJ)(?:[);/ ]|$)'
+  regex: '(?:F-01[FHJKLM]|F-02[EFGHLK]|F-03[DEFGKHL]|F-04[EGFHKJ]|F-05[DEFJG]|F-06[EF]|F-07[DE]|F-08D|F-09[DE]|F-10D|F-[45]1A|F-41B|F-[45]2A|F-11D|F-12C|F-51B|M532|FARTM933KZ|901FJ|arrows(?:RX|M03|M0[45](?:-PREMIUM)?)|801FJ|FJL2[12]|RM02|FCG01)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'F-51A(?:[);/ ]|$)'
       model: 'Arrows 5G F-51A'
     - regex: 'F-01F(?:[);/ ]|$)'
       model: 'Arrows NX F-01F'
-    - regex: 'F-01L(?:[);/ ]|$)'
-      model: 'Easy Phone F-01L'
+    - regex: '(F-01[LM]|F-06F|F-03K|F-42A)(?:[);/ ]|$)'
+      model: 'Easy Phone $1'
+    - regex: 'F-03L(?:[);/ ]|$)'
+      model: 'Arrows Phone F-03L'
     - regex: 'F-01J(?:[);/ ]|$)'
       model: 'Arrows NX F-01J'
     - regex: 'F-01K(?:[);/ ]|$)'
@@ -5120,8 +7094,14 @@ Fujitsu:
       model: 'Arrows X F-02E'
     - regex: 'F-02G(?:[);/ ]|$)'
       model: 'Arrows NX F-02G'
+    - regex: 'FJL21(?:[);/ ]|$)'
+      model: 'Arrows EF FJL21'
+    - regex: 'FJL22(?:[);/ ]|$)'
+      model: 'Arrows Z FJL22'
     - regex: 'F-02H(?:[);/ ]|$)'
       model: 'Arrows NX F-02H'
+    - regex: 'F-52A(?:[);/ ]|$)'
+      model: 'Arrows NX9 F-52A'
     - regex: 'F-03D(?:[);/ ]|$)'
       model: 'Arrows Kiss F-03D'
     - regex: 'F-03E(?:[);/ ]|$)'
@@ -5142,16 +7122,22 @@ Fujitsu:
       model: 'Arrows NX F-05F'
     - regex: 'F-05J(?:[);/ ]|$)'
       model: 'Arrows Be F-05J'
+    - regex: 'F-05G(?:[);/ ]|$)'
+      model: 'Arrows K-tai'
     - regex: 'F-04K(?:[);/ ]|$)'
       model: 'Arrows Be F-04K'
     - regex: 'F-02L(?:[);/ ]|$)'
       model: 'Arrows Be 3 F-02L'
     - regex: 'F-41A(?:[);/ ]|$)'
       model: 'Arrows Be 4 F-41A'
+    - regex: 'F-41B(?:[);/ ]|$)'
+      model: 'Arrows Be 4 Plus F-41B'
     - regex: 'F-06E(?:[);/ ]|$)'
       model: 'Arrows NX F-06E'
     - regex: 'F-07D(?:[);/ ]|$)'
       model: 'Arrows μ F-07D'
+    - regex: '(?:F-51B|FCG01)(?:[);/ ]|$)'
+      model: 'Arrows We'
     - regex: '801FJ(?:[);/ ]|$)'
       model: 'Arrows U 801FJ'
     - regex: 'F-07E(?:[);/ ]|$)'
@@ -5168,24 +7154,21 @@ Fujitsu:
       model: 'Arrows Me F-11D'
     - regex: 'F-12C(?:[);/ ]|$)'
       model: 'F-12C'
-    - regex: 'F-04J(?:[);/ ]|$)'
-      model: 'F-04J'
+    - regex: '(F-04[JF])(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'arrowsM03(?:[);/ ]|$)'
       model: 'Arrows M03'
+    - regex: 'RM02(?:[);/ ]|$)'
+      model: 'Arrows RM02'
+    - regex: 'arrowsRX(?:[);/ ]|$)'
+      model: 'Arrows RX'
     - regex: 'arrowsM04-PREMIUM(?:[);/ ]|$)'
       model: 'Arrows M04 Premium'
+    - regex: 'arrowsM(0[45])(?:[);/ ]|$)'
+      model: 'Arrows M$1'
 
-    - regex: 'F-02F(?:[);/ ]|$)'
-      model: 'Arrows Tab F-02F'
-      device: 'tablet'
-    - regex: 'F-02K(?:[);/ ]|$)'
-      model: 'Arrows Tab F-02K'
-      device: 'tablet'
-    - regex: 'F-03G(?:[);/ ]|$)'
-      model: 'Arrows Tab F-03G'
-      device: 'tablet'
-    - regex: 'F-05E(?:[);/ ]|$)'
-      model: 'Arrows Tab F-05E'
+    - regex: '(F-0[32]F|F-03G|F-04H|F-05E|F-02K)(?:[);/ ]|$)'
+      model: 'Arrows Tab $1'
       device: 'tablet'
     - regex: 'FARTM933KZ'
       model: 'Arrows Tab M504/HA4'
@@ -5214,19 +7197,40 @@ Gemini:
   device: 'tablet'
   model: '$1'
 
-# General Mobile
+# General Mobile (www.generalmobile.com)
 General Mobile:
-  regex: 'GM 5 Plus|GM8 go|GM 8 d|GM 8'
+  regex: 'GM 5 Plus|GM8 go|GM [568] d|GM 8|General Mobile 4G|GM 9 (?:Pro|Plus)|(?:e-tab 20|Android 1.+ (?:G[35]01|G[35]10|(?<!Huawei )G700))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'GM 5 Plus'
       model: 'GM 5 Plus'
-    - regex: 'GM 8 d'
-      model: 'GM 8D'
+    - regex: 'G310'
+      model: 'GM 21'
+    - regex: 'G510'
+      model: 'GM 21 Plus'
+    - regex: 'G700'
+      model: 'GM 21 Pro'
+    - regex: 'G301'
+      model: 'GM 20'
+    - regex: 'G501'
+      model: 'GM 20 Pro'
+    - regex: 'GM (\d+) d'
+      model: 'GM $1D'
     - regex: 'GM 8'
       model: 'GM 8'
     - regex: 'GM8 go'
       model: 'GM 8 Go'
+    - regex: 'GM 9 Pro'
+      model: 'GM 9 Pro'
+    - regex: 'GM 9 Plus'
+      model: 'GM 9 Plus'
+    - regex: 'General Mobile 4G Dual'
+      model: '4G Dual'
+    - regex: 'General Mobile 4G'
+      model: '4G'
+    - regex: 'e-tab 20(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'E-Tab 20'
 
 # Geotel
 Geotel:
@@ -5237,33 +7241,26 @@ Geotel:
       model: 'G1'
     - regex: 'GEOTEL[ _]?Note'
       model: 'Note'
-
-# Ghia
-Ghia:
-  regex: 'GHIA|QS702'
-  device: 'smartphone'
-  models:
-    - regex: 'QS702'
-      model: 'QS702'
-    - regex: 'GHIA_ZEUS_3G'
-      model: 'Zeus 3G'
-    - regex: 'GHIA_AXIS7'
-      model: 'Axis 7'
-      device: 'tablet'
+    - regex: 'GEOTEL[ _]AMIGO'
+      model: 'Amigo'
 
 # Gigabyte
 Gigabyte:
-  regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+'
+  regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+|Simba SX1|GSmart_Classic_Lite|(?<!Eagle )Classic[_ ](?:Joy|Pro)'
   device: 'smartphone'
   models:
-    - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|\))'
+    - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|[);])'
       model: '$1'
     - regex: 'Gigabyte-([a-z0-9]+)'
       model: '$1'
+    - regex: '(Classic[ _](?:Joy|Pro)|GSmart_Classic_Lite)'
+      model: '$1'
+    - regex: 'Simba SX1'
+      model: 'GSmart Simba SX1'
 
 # Gigaset
 Gigaset:
-  regex: 'Gigaset|(?:GS5[357]-6|GS[23]70(?:_Plus)?)(?:[);/ ]|$)'
+  regex: 'Gigaset|(?: GX290|GS80|GS1[0189]0|GS1[89]5|GS2[89]0|GS5[357]-6|GS[23]70(?:_Plus)?|E940-2795-00)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Gigaset QV(1030|830)'
@@ -5272,12 +7269,16 @@ Gigaset:
 
     - regex: 'G(S[23]70)[_ ]Plus(?:[);/ ]|$)'
       model: 'G$1 Plus'
-    - regex: 'GS([23]70)(?:[);/ ]|$)'
+    - regex: 'GS([23]70|1[0189]0|1[89]5|2[89]0|80)(?:[);/ ]|$)'
       model: 'GS$1'
+    - regex: '(GX290)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'GS57-6'
       model: 'ME Pro'
     - regex: 'GS55-6'
       model: 'ME'
+    - regex: 'E940-2795-00'
+      model: 'GS4'
     - regex: 'GS53-6'
       model: 'ME Pure'
 
@@ -5288,39 +7289,51 @@ Gigaset:
 
 # Ginzzu
 Ginzzu:
-  regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
+  regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S5002|(?<!Wave Pro )S5021|S5230|S50[45]0|S51[24]0|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST6040|ST6120)'
+    - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST60[14]0|ST6120)'
       model: '$1'
-    - regex: 'GINZZU[_ ]?(GT-(?:1050|7105|70[1-4]0|7115|7210|[WX]831|X770|7810|8[01]10))'
+    - regex: 'GINZZU[_ ]?(GT-(?:1050|7105|70[1-4]0|7115|7210|[WX]831|X[78]70|7810|8[01]10|X853|X890))'
       model: '$1'
       device: 'tablet'
     - regex: '(RS6[12]D) ULTIMATE'
       model: '$1 Ultimate'
-    - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5120|S40[23]0|RS850[12]|RS9602|RS94D)(?:[);/ ]|$)'
+    - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[14-7]|7)D)|S50[45]0|S5002|S5021|S5230|S51[24]0|S40[23]0|RS850[12]|RS9602|RS94D|R8 Dual)(?:[);/ ]|$)'
       model: '$1'
 
 # Gionee
 Gionee:
-  regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)(?:[);/ ]|$)|F103(?: Pro)? Build|P5 mini Build|P7 Max Build|(M7 Power|F106L|F100A|F103S)(?:[);/ ]|$)'
+  regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)(?:[);/ ]|$)|F103(?: Pro)?(?: Build|\))|P5 mini Build|P7 Max Build|(M7 Power|F106L|F100A|F103S|F103 Pro|M6 mirror|20190620G)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'GN810(?:[);/ ]|$)'
       model: 'GN810'
       device: 'phablet'
+    - regex: 'GN8003L'
+      model: 'M6L'
+    - regex: 'GN8003'
+      model: 'M6'
     - regex: 'GN([0-9]{3,4}[a-z]?)(?:[);/ ]|$)'
       model: 'GN$1'
     - regex: '(F106L|F100A|V188S|V188|F103S)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'F103( Pro)? Build'
-      model: 'F103$1'
     - regex: 'M7 Power(?:[);/ ]|$)'
       model: 'M7 Power'
+    - regex: '20190620G(?:[);/ ]|$)'
+      model: 'M11'
     - regex: 'P5 mini Build'
       model: 'P5 mini'
     - regex: 'P7 Max Build'
       model: 'P7 Max'
+    - regex: '(S11|F205|S10) Lite(?:[);/ ]|$)'
+      model: '$1 Lite'
+    - regex: 'M6 mirror(?:[);/ ]|$)'
+      model: 'M6 Mirror'
+    - regex: 'F9 Plus(?:[);/ ]|$)'
+      model: 'F9 Plus'
+    - regex: 'F103( Pro)?( BUILD|\))'
+      model: 'F103$1'
     - regex: '(?:(?:GIO-)?GIONEE[ _-])?Dream_D1(?:[);/ ]|$)'
       model: 'Dream D1'
     - regex: '(?:GIO-)?GIONEE[ _-]([a-z0-9_-]+).*Android'
@@ -5337,20 +7350,24 @@ Grape:
   device: 'smartphone'
   model: 'GTM-5$1'
 
-# Vizio
+# Vizio (vizio.com)
 Vizio:
-  regex: 'Vizio|VAP430|VTAB1008'
+  regex: 'Vizio|(?:VAP430|VTAB1008|XR6[PM]10)(?:[);/ ]|$)'
   device: 'tv'
   models:
     - regex: 'VAP430'
       model: 'VAP430'
-    - regex: 'VTAB1008'
+    - regex: 'ISV-B11'
+      model: 'ISV-B11'
+    - regex: 'D50u-D1'
+      model: 'D50u-D1'
+    - regex: '(VTAB1008|XR6[PM]10)'
       device: 'tablet'
-      model: 'VTAB1008'
+      model: '$1'
 
-# GOCLEVER
+# GOCLEVER (goclever.com)
 GOCLEVER:
-  regex: 'GOCLEVER|QUANTUM_[0-9]{3}|QUANTUM [0-9]{1}|QUANTUM 700N|QUANTUM_(1010N|1010M|900)|ARIES|INSIGNIA|ORION_|ELIPSO|LIBRA[ _]97'
+  regex: 'GOCLEVER|QUANTUM_(?:[235]_)?[0-9]{3}|QUANTUM [0-9]{1}|QUANTUM 700N|Quantum2 500|QUANTUM_(1010N|1010M|900|II_500_N)|ARIES|INSIGNIA|ORION_|ELIPSO|LIBRA[ _]97'
   device: 'smartphone'
   models:
     - regex: 'QUANTUM_(1010N|1010M|900)'
@@ -5365,8 +7382,29 @@ GOCLEVER:
     - regex: 'TQ700N'
       model: 'QUANTUM 700N'
       device: 'tablet'
+    - regex: 'QUANTUM_1010_Lite'
+      model: 'Quantum 1010 Lite'
+      device: 'tablet'
+    - regex: 'QUANTUM_2_(1010|700|960)_Mobile'
+      model: 'Quantum 2 $1 Mobile'
+      device: 'tablet'
+    - regex: 'QUANTUM_([235])_(5[05]0)_RUGGED'
+      model: 'Quantum $1 $2 Rugged'
+    - regex: 'QUANTUM_(\d+)_RUGGED_PRO'
+      model: 'Quantum $1 Rugged Pro'
+    - regex: 'QUANTUM[_ ]([235])_([45]00)[_ ]LITE'
+      model: 'Quantum $1 $2 Lite'
+    - regex: 'QUANTUM_II_500_N'
+      model: 'Quantum 2 500 N'
+    - regex: 'QUANTUM[_ ]([45]00)[_ ]LITE'
+      model: 'Quantum $1 Lite'
+    - regex: 'QUANTUM[ _]?([235])[ _]([^;/]+)(?: Build|[);])'
+      model: 'Quantum $1 $2'
     - regex: '((?:QUANTUM|ARIES|INSIGNIA|ORION|ELIPSO)[ _-]?[^;/]+)(?: Build|\))'
       model: '$1'
+    - regex: 'NETBOOK R103'
+      device: 'desktop'
+      model: 'Netbook R103'
     - regex: 'GOCLEVER[ _-]TAB[ _-]?([^;/]+) Build'
       model: 'TAB $1'
       device: 'tablet'
@@ -5396,6 +7434,71 @@ GoMobile:
     - regex: 'GO([0-9]{3,4})'
       model: 'Go$1'
 
+# Explay
+Explay:
+  regex: 'Explay|[\w]+-EXPLAY-FIN|ActiveD[ _]|Atlant |Informer[ _][0-9]+|CinemaTV 3G|Surfer[ _][0-9\.]|sQuad[ _][0-9\.]|Onliner[1-4]|RioPlay|Leader|Pulsar|Infinityll|Joy_TV|Imperium[78]|Winner[78]|Indigo|Lagoon|Tornado(?! 348)(?:3G)?|Onyx(?!_[A-Z]{1,2})'
+  device: 'tablet'
+  models:
+    - regex: 'ActiveD[ _]7.4[ _]3G'
+      model: 'ActiveD 7.4 3G'
+    - regex: 'Imperium([78])(?:[);/ ]|$)'
+      model: 'Imperium $1 3G'
+    - regex: 'ActiveD[ _]8.2[ _]3G'
+      model: 'ActiveD 8.2 3G'
+    - regex: 'CinemaTV[ _]3G'
+      model: 'CinemaTV 3G'
+    - regex: 'Infinityll'
+      model: 'Infinity II'
+    - regex: 'Informer[ _]([0-9]+(?:[ _]3G)?)'
+      model: 'Informer $1'
+    - regex: 'Surfer[ _]([0-9\.]+(?:[ _]3G)?)'
+      model: 'Surfer $1'
+    - regex: 'sQuad[ _]([0-9\.]+(?:[ _]3G)?)'
+      model: 'sQuad $1'
+    - regex: 'Onliner([1-4])'
+      model: 'Onliner $1'
+    - regex: 'Winner([78])'
+      model: 'Winner $1'
+    - regex: 'Atlant(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Atlant'
+    - regex: 'Indigo(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Indigo'
+    - regex: 'Pulsar(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Pulsar'
+    - regex: 'Tornado(?:3G)?(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Tornado 3G'
+    - regex: 'Onyx(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Onyx'
+    - regex: 'Joy_TV(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'JoyTV'
+    - regex: '[\w]+-EXPLAY-FIN'
+      device: 'feature phone'
+      model: 'Fin'
+
+    - regex: 'Lagoon(?:[);/ ]|$)'
+      model: 'Lagoon'
+    - regex: 'Explay[ _-]([^;/]+)(?: Build|[;)])'
+      model: '$1'
+    - regex: 'RioPlay(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Rio Play'
+    - regex: 'Leader'
+      model: 'Leader'
+
+# Gol Mobile (gol-mobile.com)
+Gol Mobile:
+  regex: 'F10_PRIME'
+  device: 'smartphone'
+  models:
+    - regex: 'F10_PRIME'
+      model: 'F10 Prime'
+
 # Goly
 Goly:
   regex: 'Goly[ _-]'
@@ -5408,13 +7511,15 @@ Goly:
 
 # Google
 Google:
-  regex: 'Nexus|GoogleTV|Glass(?<!Browser)|CrKey[^a-z0-9]|Pixel(?: Build|\))|Pixel (?:XL|C|[2-4]|[2-4] XL)|Google 2XL|G011A'
+  regex: 'Nexus(?! 6P)|GoogleTV|Google Fiber|Google Pixel|Glass(?<!Browser)|CrKey[^a-z0-9]|(?:Pixel|sailfish|taimen|blueline|Chromecast)(?: Build|[)])|Pixel (?:XL|C|[2-6]|[2-4] XL)|Google 2XL|G011A|AOSP on (?:HammerHead|Manta)'
   device: 'smartphone'
   models:
     - regex: 'Glass'
       model: 'Glass'
     - regex: 'Galaxy Nexus'
       model: 'Galaxy Nexus'
+    - regex: 'AOSP on HammerHead'
+      model: 'Nexus 5'
     - regex: '(Nexus (?:S|4|5X?|One))'
       model: '$1'
     - regex: '(Nexus (?:6P?))'
@@ -5423,39 +7528,61 @@ Google:
     - regex: '(Nexus (?:7|9|10))'
       device: 'tablet'
       model: '$1'
+    - regex: 'AOSP on Manta'
+      device: 'tablet'
+      model: 'Nexus 10'
+    - regex: 'Pixel Slate'
+      device: 'tablet'
+      model: 'Pixel Slate'
+    # explicit tv models
+    - regex: '(GFHD[12]00)'
+      device: 'tv'
+      model: 'Fiber $1'
     - regex: 'CrKey[^a-z0-9]'
       model: 'Chromecast'
       device: 'tv'
+    - regex: 'Chromecast'
+      model: 'Chromecast (2020)'
+      device: 'tv'
     - regex: 'GoogleTV'
       device: 'tv'
       model: 'GoogleTV'
-    - regex: 'Pixel(?: Build|\))'
+    # explicit smartphone models
+    - regex: '(?:Pixel|sailfish)(?: Build|[)])'
       model: 'Pixel'
     - regex: 'Pixel XL'
       model: 'Pixel XL'
+    - regex: 'blueline'
+      model: 'Pixel 3'
     - regex: 'Pixel 3 XL'
       model: 'Pixel 3 XL'
-    - regex: 'Pixel 2 XL'
+    - regex: 'Pixel 2 XL|taimen'
       model: 'Pixel 2 XL'
     - regex: 'Pixel 3a XL'
       model: 'Pixel 3a XL'
     - regex: 'Pixel 3a'
       model: 'Pixel 3a'
-    - regex: 'Pixel 3'
-      model: 'Pixel 3'
     - regex: 'Pixel 4 XL'
       model: 'Pixel 4 XL'
-    - regex: 'pixel 4a'
-      model: 'Pixel 4a'
-    - regex: 'pixel 4'
-      model: 'Pixel 4'
-    - regex: 'Pixel 2|G011A'
+    - regex: 'Pixel 4a \(5G\)'
+      model: 'Pixel 4a (5G)'
+    - regex: 'pixel ([45])a'
+      model: 'Pixel $1a'
+    - regex: 'G011A'
       model: 'Pixel 2'
     - regex: 'Google 2XL'
       model: 'Pixel 2 XL'
+    - regex: 'Pixel 6 Pro'
+      model: 'Pixel 6 Pro'
+    - regex: 'pixel ([2-6])'
+      model: 'Pixel $1'
+
     - regex: 'Pixel C'
       device: 'tablet'
       model: 'Pixel C'
+    - regex: 'Nexus Player'
+      device: 'tv'
+      model: 'Nexus Player'
 
 # Gradiente
 Gradiente:
@@ -5486,36 +7613,81 @@ Grundig:
     - regex: 'AFTEU011'
       model: 'Vision 6 HD (2019)'
 
-# Hafury
+# Gtel (https://gtel.co.zw/)
+Gtel:
+  regex: 'Gtel[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'Infinity 8s(?:[);/ ]|$)'
+      model: 'Infinity 8s'
+    - regex: 'Infinity 9(?:[);/ ]|$)'
+      model: 'Infinity 9'
+
+# H96 (https://www.h96tvbox.com/)
+H96:
+  regex: 'H96[ _]'
+  device: 'tv'
+  models:
+    - regex: 'Max RK3318(?:[);/ ]|$)'
+      model: 'Max RK3318'
+    - regex: 'Max X2(?:[);/ ]|$)'
+      model: 'Max X2'
+    - regex: 'Max(?:[);/ ]|$)'
+      model: 'Max'
+
+# Hafury (hafury.com)
 Hafury:
-  regex: 'HAFURY'
+  regex: 'HAFURY|GT20(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'GT20(?:[);/ ]|$)'
+      model: 'GT20'
     - regex: '(MIX|UMAX)'
       model: '$1'
 
-# Haier
+# Haier (www.haier.com)
 Haier:
-  regex: 'Haier|I6_Infinity|Titan[ _]T[13]|(?:HW-)?W(?:716|757|860|970)(?:[);/ ]|$)|S5 Silk|(?:HM-)?(N505|N700|G(?:152|303|353|552|70[01])?-FL|HM-N501-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](D71|G781|d85))'
+  regex: 'Haier|(?:M53-52401|I6_Infinity|Titan[ _]T[135]|(?:HW-)?W(?:71[67]|757|86[07]|970)|S5 Silk|(?:HM-)?(N505|N700|G(?:152|303|353|552|70[01])?-FL|HM-(?:I559|N50[15]|I560|G553|N70[01])-FL|HR-V101|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](?:D71|G781|d85))|A2_Lite_NFC|A4_Lite|HL810G)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'A2_Lite_NFC'
+      model: 'Alpha A2 Lite NFC'
+    - regex: 'A4_Lite'
+      model: 'Alpha A4 Lite'
     - regex: 'HM-N505-FL'
       model: 'I8'
     - regex: 'S5 Silk'
       model: 'S5 Silk'
     - regex: 'HM-N700-FL'
       model: 'L7'
+    - regex: 'HM-N701-FL'
+      model: 'L8'
     - regex: 'HM-N501-FL'
       model: 'L56'
+    - regex: 'HM-I559-FL'
+      model: 'L55s'
+    - regex: 'HM-I560-FL'
+      model: 'G7s'
+    - regex: 'HM-G553-FL'
+      model: 'G51'
     - regex: '(?:HM-)?(G(?:152|353|552|70[01])|G(?:303)|I(?:557))'
       model: '$1'
-    - regex: '(Titan[_ ]T[13]|I6_Infinity)'
+    - regex: '(Titan[_ ]T[135]|I6_Infinity)'
       model: '$1'
-    - regex: '(?:HW-)?W(716|757|860|970)(?:[);/ ]|$)'
+    - regex: '(?:HW-)?W(71[67]|757|86[07]|970)(?:[);/ ]|$)'
       model: 'W$1'
     - regex: 'PAD[ -_](D71|G781|d85)'
       device: 'tablet'
       model: '$1'
+    - regex: '(HL810G|HR-V101|M53-52401)'
+      device: 'tablet'
+      model: '$1'
+    - regex: 'haierATVnippori'
+      device: 'tv'
+      model: '2K Android TV'
+    - regex: 'haierATV'
+      device: 'tv'
+      model: 'Android TV'
     - regex: 'Haier[ _\-](H[WT]-[^/;]+) Build'
       model: '$1'
     - regex: 'Haier[ _\-](H[WT]-[a-z0-9_\-]+)'
@@ -5556,15 +7728,18 @@ Hasee:
     - regex: 'Hasee ([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
-# Hisense
+# Hisense (www.hisense-usa.com)
 Hisense:
-  regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*|E270BSA|HITV300C|M470BS[AE]|E2281|EG680|I46D1G|HAT4KDTV|HLTE([237]00T|200M|203T|202N|21[023567]T|22[67]T|22[13]E|310[TM]|31[16]T|500T|501N|510[TM]|7[23]0T)'
+  regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HISENSE; |HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*|HNR55[01]T|E270BSA|HWCD100E|HITV300C|M470BS[AE]|EG98|E2281|EG680|I46D1G|HAT4KDTV|HITV10[12]C|HLTE([237]00T|200M|203T|202N|21[023567][TM]|22[67]T|22[13]E|230E|103E|310[TM]|31[16]T|500T|501N|510[TM]|7[23]0T)|KS(?:907|964)|U601S Pro|HNR320T|HiSmart 4K ATV4'
   device: 'smartphone'
   models:
     # explicit tablet models
     - regex: 'E270BSA'
       device: 'tablet'
       model: 'Sero 7'
+    - regex: 'HITV10[12]C'
+      device: 'tablet'
+      model: 'E22'
     - regex: 'M470BS[AE]'
       device: 'tablet'
       model: 'Sero 7 Pro'
@@ -5579,16 +7754,26 @@ Hisense:
       model: 'A6'
     - regex: 'HLTE730T'
       model: 'A6L'
-    - regex: 'HLTE221E'
+    - regex: 'HNR320T'
+      model: 'A7'
+    - regex: 'M50 Lite 2021'
+      model: 'M50 Lite (2021)'
+    - regex: 'Infinity E MAX'
+      model: 'Infinity E Max'
+    - regex: 'HLTE221E|E MAX(?:[);/ ]|$)'
       model: 'E Max'
     - regex: 'HLTE501N'
       model: 'V Plus'
+    - regex: 'KS907'
+      model: 'V3'
     - regex: 'HLTE223E'
       model: 'H30'
     - regex: 'I46D1G'
       model: 'Smartfren Andromax R'
     - regex: 'EG680'
       model: 'Smartfren Andromax Z'
+    - regex: 'EG98'
+      model: 'Smartfren Andromax U2'
     - regex: 'HLTE200T(?:[);/ ]|$)'
       model: 'F26'
     - regex: 'HLTE210T(?:[);/ ]|$)'
@@ -5599,39 +7784,67 @@ Hisense:
       model: 'King Kong 4'
     - regex: 'HLTE311T(?:[);/ ]|$)'
       model: 'King Kong 4 Pro'
-    - regex: 'HLTE216T(?:[);/ ]|$)'
+    - regex: 'HLTE216[TM](?:[);/ ]|$)'
       model: 'King Kong 5'
     - regex: 'HLTE316T(?:[);/ ]|$)'
       model: 'King Kong 5 Pro'
     - regex: 'HLTE226T(?:[);/ ]|$)'
       model: 'King Kong 6'
+    - regex: 'F8 MINI(?:[);/ ]|$)'
+      model: 'F8 Mini'
     - regex: 'HLTE217T(?:[);/ ]|$)'
       model: 'F30S'
     - regex: 'HLTE227T(?:[);/ ]|$)'
       model: 'F40'
+    - regex: 'HNR550T(?:[);/ ]|$)'
+      model: 'F50'
+    - regex: 'HNR551T(?:[);/ ]|$)'
+      model: 'F50 Plus'
     - regex: 'HLTE310[TM](?:[);/ ]|$)'
       model: 'H18'
     - regex: 'HLTE510[TM](?:[);/ ]|$)'
       model: 'H20'
+    - regex: 'HLTE103E'
+      model: 'E20'
     - regex: 'HLTE500T(?:[);/ ]|$)'
       model: 'H11'
+    - regex: '(?:HLTE230E|Infinity H40 Lite)(?:[);/ ]|$)'
+      model: 'Infinity H40 Lite'
     - regex: 'HLTE720T(?:[);/ ]|$)'
       model: 'U30'
       device: 'phablet'
+    - regex: 'HWCD100E(?:[);/ ]|$)'
+      model: 'U40 Lite'
     - regex: '(HLTE300T|HLTE200M|HLTE212T)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'HITV300C(?:[);/ ]|$)'
       model: 'E9'
+    - regex: 'E260T\+(?:[);/ ]|$)'
+      model: 'Nana'
+    - regex: 'U601S Pro(?:[);/ ]|$)'
+      model: 'U601S Pro'
+    - regex: 'Infinity H50 ZOOM(?:[);/ ]|$)'
+      model: 'Infinity H50 Zoom'
+    - regex: 'Infinity E30SE(?:[);/ ]|$)'
+      model: 'Infinity E30 SE'
     - regex: '(HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*)'
       model: '$1'
 
-    - regex: '(HAT4KDTV)(?:[);/ ]|$)'
+    - regex: '(HAT4KDTV|HiSmart 4K ATV4)(?:[);/ ]|$)'
       device: 'tv'
       model: '$1'
 
-    - regex: '(?:HS-)?Hisense ([^;/]+) Build'
+    - regex: 'KS964(?:[);/ ]|$)'
+      model: 'U3 (2019)'
+    - regex: '(?:HS-)?Hisense (U3) 2021(?: Build|[);])'
+      model: 'U3 (2021)'
+    - regex: '(?:HS-)?Hisense ([^;/)]+) Pro(?: Build|[);])'
+      model: '$1 Pro'
+    - regex: '(?:HS-)?Hisense ([^;/)]+) Plus(?: Build|[);])'
+      model: '$1 Plus'
+    - regex: '(?:HS-)?Hisense ([^;/)]+)(?: Build|[);])'
       model: '$1'
-    - regex: 'Hisense ([^);/]+)'
+    - regex: '(?:HS-)?Hisense ([^/]+)/'
       model: '$1'
 
 # Hi-Level
@@ -5640,26 +7853,36 @@ Hi-Level:
   device: 'tablet'
   model: 'HLV-T$1'
 
-# Hoffmann
+# HKPro
+HKPro:
+  regex: 'HKPRO,([a-z0-9_ \-]+),(?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
+# Hoffmann (hoffmann-electric.com)
 Hoffmann:
-  regex: '(HOFFMANN|Neo[_ ]A[1379]00)(?:[);/ ]|$)'
+  regex: '(HOFFMANN|Neo[_ ]A[1379]00|X-Go|X-Play|X-Pro|X_Ultra)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Neo[_ ](A[1379]00)'
       model: 'Neo $1'
     - regex: 'HOFFMANN[ _]X[-_ ](Prime|Twist|Max)'
       model: 'X $1'
-
+    - regex: 'X[-_](Play|Go|Pro|Ultra)'
+      model: 'X $1'
 
 # Homtom
 Homtom:
-  regex: 'Homtom|(?:HT[0-9]{1,2})(?: ?Pro)?(?:[);/ ]|$)'
+  regex: 'Homtom|(?:HT[0-9]{1,2}(?: ?Pro)?|HT3_Pro)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:Homtom[_ ])?HT([0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
+    - regex: '(?:Homtom[_ ])?HT ?([0-9]{1,2})[ _]?Pro(?:[);/ ]|$)'
+      model: 'HT$1 Pro'
+    - regex: '(?:Homtom[_ ])?HT ?([0-9]{1,2}?)(?:[);/ ]|$)'
       model: 'HT$1'
     - regex: 'Homtom ([^;/]+) Build'
       model: '$1'
+
 # Hosin
 Hosin:
   regex: 'HOSIN[ _-]'
@@ -5670,19 +7893,28 @@ Hosin:
     - regex: 'HOSIN[ _-]([^;/]+)(?:[;/)]|$)'
       model: '$1'
 
-# Hoozo
+# Hoozo (hoozoelectronics.com)
 Hoozo:
-  regex: 'HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)(?:[);/ ]|$)'
+  regex: '(?:HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)|MZ104|HZ0010|HZ1012|YK_P30(?:_EEA)?)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001|MZ104)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(HZ0010|HZ1012)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(YK_P30)(?:_EEA)?(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: '$1'
 
 # Minix (minix.us)
 Minix:
-  regex: 'NEO-(?:X8-H|U9-H|X[57]-mini|X8H-PLUS|X88-?I|X7-216A|X5-116A|X[68]|U1|Z64)(?:[);/ ]|$)'
+  regex: 'NEO[- ](?:X8-H|U9-H|X[57]-mini|X8H-PLUS|X88-?I|X7-216A|X5-116A|X[68]|U1|Z64|U22-XJ)(?:[);/ ]|$)'
   device: 'tv'
   models:
     - regex: 'NEO-X8-H(?:[);/ ]|$)'
       model: 'NEO X8H'
+    - regex: 'NEO U22-XJ(?:[);/ ]|$)'
+      model: 'NEO U22'
     - regex: 'NEO-X([57])-mini(?:[);/ ]|$)'
       model: 'NEO X$1 Mini'
     - regex: 'NEO-X8H-PLUS(?:[);/ ]|$)'
@@ -5702,9 +7934,71 @@ Minix:
     - regex: 'NEO-U9-H(?:[);/ ]|$)'
       model: 'NEO U9H'
 
+# Huavi (https://www.huavi.us/)
+Huavi:
+  regex: 'KHATAR H-20 PRO(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'KHATAR H-20 PRO(?:[);/ ]|$)'
+      model: 'KHATAR H-20 Pro'
+
+# Turkcell (https://www.turkcell.com.tr/)
+Turkcell:
+  regex: 'TURKCELL[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'Turbo T50(?:[);/ ]|$)'
+      model: 'Turbo T50'
+    - regex: 'T([124-8])0(?:[);/ ]|$)'
+      model: 'T$10'
+    - regex: 'Maxi Plus 5(?:[);/ ]|$)'
+      model: 'T21 Maxi Plus 5'
+    - regex: 'MaxiPRO5(?:[);/ ]|$)'
+      model: 'T21 Maxi Pro 5' # Huawei
+
+    - regex: 'Turkcell_T_Tablet(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'T Tablet'
+
+# China Telecom
+China Telecom:
+  regex: '(?:TYH61[12]M|TYH211U|TYH201H)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'TYH611M'
+      model: 'Maimang 10 SE 5G'
+    - regex: 'TYH612M'
+      model: 'Maimang 10 5G'
+    - regex: 'TYH211U'
+      model: 'Tianyi One (2021)'
+    - regex: 'TYH201H'
+      model: 'Tianyi One'
+
+# U-Magic (China Unicom)
+U-Magic:
+  regex: '(?:Liantong)?(?:VP00[123])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Liantong)?VP001'
+      model: 'Enjoy 20 Plus 5G'
+    - regex: '(?:Liantong)?VP002'
+      model: 'Enjoy 20 5G'
+    - regex: '(?:Liantong)?VP003'
+      model: 'Enjoy 30e 5G'
+
+# Hi Nova
+Hi Nova:
+  regex: '(?:Hebe|Hera)-BD00'
+  device: 'smartphone'
+  models:
+    - regex: 'Hebe-BD00'
+      model: '9 Pro'  # Nova 9 Pro
+    - regex: 'Hera-BD00'
+      model: '9'  # Nova 9
+
 # Huawei
 Huawei:
-  regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-([AT]N00|AN90)|GLK-[AT]L00|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL00|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?)|JEF-[AT]N00|MED-(?:[AT]L00|LX9N?)|EBG-AN[01]0|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|TAH-AN00m|C8817D|T1-821W|d-01J|d-02[HK]|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-L09'
+  regex: '(HW-)?(?:Huawei(?!Browser)|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANA|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|FRL|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JEF|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEN|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PPA|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21?[Lw]|A2[23]L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|YOK-AN[10]0|NIC-LX1A|MRX-(AN19|AL[01]9|W[0-3]9)|CDY-(?:[AT]N00|AN[29][05]|NX9[AB]|TN[29]0)|GLK-(?:[AT]L00|LX1U)|JER-(?:[AT]N20|[AT]N10)|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-([AT]L[02]0|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?|L28)|MED-(?:[AT]L00|LX9N?|AL20)|EBG-(?:AN[01]0|TN00)|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-[AT]N00|JKM-AL00[ab]|TAH-(?:N29|AN00)m?|C8817D|T1-821W|d-01[JK]|d-02[HK]|KRJ-(?:W09|AN00)|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|NOH-(?:NX9|AN0[01]|AN50|AL[01]0)|TNNH?-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-[LW]09|AGS3-(?:[WL]09|AL0[09]|W00[DE])|DNN-LX9|NEY-NX9|LON-AL00|HLK-L41|503HW|AGR-(?:[LW]09|AL09)|PPA-LX[12]|ANG-(?:AN00|LX[12])|NOP-AN00|ALA-AN70|DVC-[AT]N[02]0|302HW|Nexus 6P|DBY-W09|WKG-(?:LX9|[AT]N00)|JSC-(?:AN00|AL50)|OCE-A[NL][015]0|NZA-AL00|BRQ-A[LN]00|BZC-(?:AL|W)00|NEN-L(?:X1|22)|KOZ-AL[04]0|NTH-(?:AN00|NX9)|MRR-W[23]9|WGR-(?:W[10]9|AN19)|TET-AN00|SCMR-(?:W09|AL09)|OXP-AN00|HJC-(?:AN90|LX9)|CDL-AN50|CND-AN00|NTN-(?:LX[13]|AN20|L22)|RNA-[AT]N00|CHL-(?:A[LN]00|AL60)|ELZ-AN[012]0|NAM-(?:LX9|AL00)|JLH-AN00|JAD-AL[056]0|AGS3K-[WL]09|AGRK-[WL]09|MT2L03|LSA-AN00|KJR-W09|TET-A[NL][05]0|TYH601M|RTE-AL00|BAL-AL00|BZI-AL00|BZT3-(?:AL00|W09)|BZD-(?:W00|AL00)|MLD-AL[01]0|AGM3-(?:W09|AL09)HN|ABR-AL00|GIA-AN00'
   device: 'smartphone'
   models:
     - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
@@ -5729,6 +8023,8 @@ Huawei:
       model: 'Ascend G630'
     - regex: 'G7-(?:L01|TL00)(?:[);/ ]|$)'
       model: 'Ascend G7'
+    - regex: 'P7-L10(?:[);/ ]|$)'
+      model: 'Ascend P7'
     - regex: 'G730-C00(?:[);/ ]|$)'
       model: 'Ascend G730'
     - regex: 'U9200(?:[);/ ]|$)'
@@ -5739,11 +8035,15 @@ Huawei:
       model: 'Ascend Y221'
     - regex: 'Y550-L03(?:[);/ ]|$)'
       model: 'Ascend Y550'
+    - regex: 'Y560-L01(?:[);/ ]|$)'
+      model: 'Ascend Y560'
+    - regex: 'Huawei g700(?:-(?:U[012]0|T0[01]))?'
+      model: 'Ascend G700'
     - regex: 'ART-[AT]L00[xm](?:[);/ ]|$)'
       model: 'Enjoy 10'
     - regex: 'STK-[AT]L00(?:[);/ ]|$)'
       model: 'Enjoy 10 Plus'
-    - regex: 'MED-[AT]L00(?:[);/ ]|$)'
+    - regex: 'MED-(?:[AT]L00|AL20)(?:[);/ ]|$)'
       model: 'Enjoy 10E'
     - regex: 'AQM-[AT]L00(?:[);/ ]|$)'
       model: 'Enjoy 10S'
@@ -5757,7 +8057,7 @@ Huawei:
       model: 'Enjoy 7'
     - regex: 'FIG-(?:[AT]L[10]0)(?:[);/ ]|$)'
       model: 'Enjoy 7S'
-    - regex: 'TRT-AL00[A]?(?:[);/ ]|$)'
+    - regex: '(?:TRT-AL00[A]?|TRT-TL10A)(?:[);/ ]|$)'
       model: 'Enjoy 7 Plus'
     - regex: 'LDN-(?:AL[12]0|TL[02]0)(?:[);/ ]|$)'
       model: 'Enjoy 8'
@@ -5767,6 +8067,16 @@ Huawei:
       model: 'Enjoy 8e'
     - regex: 'MRD-[TA]L00(?:[);/ ]|$)'
       model: 'Enjoy 9e'
+    - regex: 'DVC-[AT]N20(?:[);/ ]|$)'
+      model: 'Enjoy 20 Pro'
+    - regex: 'DVC-AN00(?:[);/ ]|$)'
+      model: 'Enjoy Z 5G'
+    - regex: 'PPA-AL20(?:[);/ ]|$)'
+      model: 'Enjoy 20 SE'
+    - regex: 'FRL-[AT]N00'
+      model: 'Enjoy 20 Plus 5G'
+    - regex: 'MLD-AL[01]0'
+      model: 'Enjoy 20e'
     - regex: 'U8665(?:[);/ ]|$)'
       model: 'Fusion 2'
     - regex: 'MED-LX9N?(?:[);/ ]|$)'
@@ -5785,9 +8095,17 @@ Huawei:
       model: 'GR5 (2017)'
     - regex: 'RIO-L03(?:[);/ ]|$)'
       model: 'GX8'
+    - regex: 'RIO-L01(?:[);/ ]|$)'
+      model: 'G8'
+    - regex: 'JAD-AL[056]0'
+      model: 'P50 Pro'
+    - regex: 'ABR-AL00'
+      model: 'P50'
+    - regex: 'BAL-AL00'
+      model: 'P50 Pocket'
     - regex: 'U8860(?:[);/ ]|$)'
       model: 'Honor'
-    - regex: 'COL-(?:AL[01]0|TL[01]0|L29)(?:[);/ ]|$)'
+    - regex: 'COL-(?:AL[01]0|TL[01]0|L29|L10)(?:[);/ ]|$)'
       model: 'Honor 10'
     - regex: 'HRY-(?:[AT]L00[A]?|LX[12]|LX1MEB)(?:[);/ ]|$)'
       model: 'Honor 10 Lite'
@@ -5805,16 +8123,18 @@ Huawei:
       model: 'Honor 20 Pro'
     - regex: '(MAR-LX1H|YAL-AL50)(?:[);/ ]|$)'
       model: 'Honor 20S'
-    - regex: '(?:BMH-AN[12]0|MXW-AN00)(?:[);/ ]|$)'
+    - regex: 'BMH-(?:AN[12]0|TN10)(?:[);/ ]|$)'
       model: 'Honor 30'
-    - regex: 'EBG-AN00(?:[);/ ]|$)'
+    - regex: 'EBG-[AT]N00(?:[);/ ]|$)'
       model: 'Honor 30 Pro'
     - regex: 'EBG-AN10(?:[);/ ]|$)'
       model: 'Honor 30 Pro Plus'
-    - regex: 'CDY-AN90(?:[);/ ]|$)'
+    - regex: 'CDY-(?:AN9[05]|NX9A|TN90)(?:[);/ ]|$)'
       model: 'Honor 30S'
     - regex: 'LRA-LX1(?:[);/ ]|$)'
       model: 'Honor 30I'
+    - regex: 'MXW-[AT]N00(?:[);/ ]|$)'
+      model: 'Honor 30 Lite'
     - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 3C'
     - regex: 'Hol-U19(?:[);/ ]|$)'
@@ -5825,6 +8145,8 @@ Huawei:
       model: 'Honor 4A'
     - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 4C'
+    - regex: 'Honor 4c Pro(?:[);/ ]|$)'
+      model: 'Honor 4C Pro'
     - regex: 'AQM-AL10(?:[);/ ]|$)'
       model: 'Honor 4T Pro'
     - regex: '(CHE2?-[UT]L00[HM]?|CHE1-CL[12]0|CHE2-L(?:1[12]|23)|Che1-L04|CHE-TL00)(?:[);/ ]|$)'
@@ -5839,6 +8161,18 @@ Huawei:
       model: 'Honor 5C Dual SIM'
     - regex: '(?:Honor_|HW-)?KIW-(?:AL10|TL00H|[TC]L00|L2[1-4]|UL00)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 5X'
+    - regex: 'NTH-(?:NX9|AN00)'
+      model: 'Honor 50 5G'
+    - regex: 'JLH-AN00(?:[);/ ]|$)'
+      model: 'Honor 50 SE'
+    - regex: 'NTN-(?:LX[13]|L22)(?:[);/ ]|$)'
+      model: 'Honor 50 Lite'
+    - regex: 'RNA-[AT]N00'
+      model: 'Honor 50 Pro 5G'
+    - regex: 'LSA-AN00'
+      model: 'Honor 60'
+    - regex: 'GIA-AN00'
+      model: 'Honor 60 SE 5G'
     - regex: '((?:Honor_|HW-)?H60-L(?:01|02|03|04|11|12)(?:_TD)?|HW-H60-J1)(?:[);/ ]|$)'
       model: 'Honor 6'
     - regex: 'MYA-TL10(?:[);/ ]|$)'
@@ -5851,7 +8185,7 @@ Huawei:
       model: 'Honor 6C'
     - regex: 'JMM-L22(?:[);/ ]|$)'
       model: 'Honor 6C Pro'
-    - regex: '(?:HONOR[ _]?)?BLN-(?:L2[124]|AL[1234]0|TL[01]0(?:[);/ ]|$))'
+    - regex: '(?:HONOR[ _]?)?BLN-(?:L2[124]|AL[1-4]0|TL[01]0(?:[);/ ]|$))'
       model: 'Honor 6X'
     - regex: '(?:Honor[_]?|HW-)?PLK-(?:AL10|CL00|TL00|TL01H?|UL00|L01)(?:[);/ ]|$)'
       model: 'Honor 7'
@@ -5863,7 +8197,7 @@ Huawei:
       model: 'Honor 7A Pro'
     - regex: '(?:Honor_|HW-)?(?:LND-(?:AL[34]0|L29|TL40)|AUM-L41)(?:[);/ ]|$)'
       model: 'Honor 7C'
-    - regex: 'ATH-(?:AL00|UL00|TL00H)(?:[);/ ]|$)'
+    - regex: 'ATH-(?:[CAU]L00|TL00H)(?:[);/ ]|$)'
       model: 'Honor 7i'
     - regex: '(?:Honor_|HW-)?DUA-(?:L22|LX3)(?:[);/ ]|$)'
       model: 'Honor 7S'
@@ -5883,13 +8217,13 @@ Huawei:
       model: 'Honor 8A Pro'
     - regex: 'BKK-(?:AL[10]0|L21|L22|LX2|TL00)(?:[);/ ]|$)'
       model: 'Honor 8C'
-    - regex: 'KSA-(LX[29]|AL00)(?:[);/ ]|$)'
+    - regex: 'KSA-(LX[239]|AL00)(?:[);/ ]|$)'
       model: 'Honor 8S'
     - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?(?:[);/ ]|$)'
       model: 'Honor 8X'
-    - regex: 'ARE-(?:AL[10]0|L22HN|TL00)(?:[);/ ]|$)'
+    - regex: 'ARE-(?:AL[10]0|L22(?:HN)?|TL00)(?:[);/ ]|$)'
       model: 'Honor 8X Max'
-    - regex: 'STF-(?:AL[10]0|L09|TL10)(?:[);/ ]|$)'
+    - regex: 'STF-(?:AL[10]0|L09S?|TL10)(?:[);/ ]|$)'
       model: 'Honor 9'
     - regex: 'MOA-LX9N(?:[);/ ]|$)'
       model: 'Honor 9A'
@@ -5903,7 +8237,7 @@ Huawei:
       model: 'Honor 9S'
     - regex: 'HLK-AL00a?(?:[);/ ]|$)'
       model: 'Honor 9X'
-    - regex: 'HLK-AL10(?:[);/ ]|$)'
+    - regex: 'HLK-(?:AL10|L4[12])(?:[);/ ]|$)'
       model: 'Honor 9X Pro'
     - regex: 'CAM-UL00(?:[);/ ]|$)'
       model: 'Honor Holly 3'
@@ -5911,6 +8245,12 @@ Huawei:
       model: 'Honor Magic'
     - regex: 'TNY-[AT]L00(?:[);/ ]|$)'
       model: 'Honor Magic 2'
+    - regex: 'ELZ-AN00'
+      model: 'Honor Magic 3'
+    - regex: 'ELZ-AN10'
+      model: 'Honor Magic 3 Pro'
+    - regex: 'ELZ-AN20'
+      model: 'Honor Magic 3 Pro+'
     - regex: 'RVL-AL09(?:[);/ ]|$)'
       model: 'Honor Note 10'
     - regex: 'EDI-AL10(?:[);/ ]|$)'
@@ -5919,11 +8259,15 @@ Huawei:
       model: 'Honor P10 Plus'
     - regex: 'VOG-AL00(?:[);/ ]|$)'
       model: 'Honor P30 Pro'
-    - regex: 'ANA-(?:[AT]N00|NX9)(?:[);/ ]|$)'
-      model: 'Honor P40'
+    - regex: 'ANA-(?:[AT]N00)(?:[);/ ]|$)'
+      model: 'Honor P40 5G'
+    - regex: 'ANA-AL00(?:[);/ ]|$)'
+      model: 'Honor P40 4G'
+    - regex: 'ANA-NX9(?:[);/ ]|$)'
+      model: 'Honor P40 Dual'
     - regex: 'COR-(?:AL[01]0|L29|TL10)(?:[);/ ]|$)'
       model: 'Honor Play'
-    - regex: 'ASK-AL00x(?:[);/ ]|$)'
+    - regex: 'ASK-AL(00x|20)(?:[);/ ]|$)'
       model: 'Honor Play 3'
     - regex: 'KSA-AL10(?:[);/ ]|$)'
       model: 'Honor Play 3E'
@@ -5933,16 +8277,32 @@ Huawei:
       model: 'Honor Play 4C'
     - regex: 'AKA-AL10(?:[);/ ]|$)'
       model: 'Honor Play 4T'
+    - regex: 'OXP-AN00(?:[);/ ]|$)'
+      model: 'Honor Play 4 Pro'
+    - regex: '(?:NZA-AL00?|KOZ-AL40)(?:[);/ ]|$)'
+      model: 'Honor Play 5T' # Vitality Edition
+    - regex: 'CHL-AL00(?:[);/ ]|$)'
+      model: 'Honor Play 5T Pro'
+    - regex: 'CHL-AN00(?:[);/ ]|$)'
+      model: 'Honor X20 SE'
     - regex: 'DUA-[TA]L00(?:[);/ ]|$)'
       model: 'Honor Play 7'
+    - regex: 'HJC-AN90(?:[);/ ]|$)'
+      model: 'Honor Play 5'
+    - regex: 'KOZ-AL00(?:[);/ ]|$)'
+      model: 'Honor Play 20'
+    - regex: 'HJC-LX9(?:[);/ ]|$)'
+      model: 'Honor Play 20 Pro'
     - regex: 'JAT-[AT]L00(?:[);/ ]|$)'
       model: 'Honor Play 8A'
-    - regex: 'MOA-AL00(?:[);/ ]|$)'
+    - regex: '(?:MOA-(?:AL[02]0|TL00))(?:[);/ ]|$)'
       model: 'Honor Play 9A'
     - regex: 'BKL-(?:AL00|AL20|AL30|L09|TL10)(?:[);/ ]|$)'
       model: 'Honor V10'
     - regex: 'PCT-[TA]L10(?:[);/ ]|$)'
       model: 'Honor V20'
+    - regex: 'YOK-AN10(?:[);/ ]|$)'
+      model: 'Honor V40'
     - regex: 'KNT-(?:AL[12]0|[TU]L10)(?:[);/ ]|$)'
       model: 'Honor V8'
     - regex: 'DUK-AL20(?:[);/ ]|$)'
@@ -5957,14 +8317,20 @@ Huawei:
       model: 'Honor View 30'
     - regex: 'OXF-AN10(?:[);/ ]|$)'
       model: 'Honor View 30 Pro'
-    - regex: '(?:Honor_|HW-)?SCL-L(01|32)(?:_TD)?(?:[);/ ]|$)'
+    - regex: '(?:Honor_|HW-)?SCL-L(0[1-4]|21|32)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor Y6'
     - regex: '(?:Honor_|HW-)?LYO-L21(?:[);/ ]|$)'
       model: 'Honor Y6 II Compact'
+    - regex: 'NTN-AN20(?:[);/ ]|$)'
+      model: 'Honor X20'
     - regex: 'TEL-(?:AN(?:00a?|10)|TN00)(?:[);/ ]|$)'
       model: 'Honor X10'
     - regex: 'KKG-AN00(?:[);/ ]|$)'
       model: 'Honor X10 Max'
+    - regex: 'DNN-LX9(?:[);/ ]|$)'
+      model: 'Honor X10 Lite'
+    - regex: 'ALA-AN70(?:[);/ ]|$)'
+      model: 'Honor V40 Lite'
     - regex: 'U8500(?:[);/ ]|$)'
       model: 'Ideos X2'
     - regex: 'U8510(?:[);/ ]|$)'
@@ -5975,8 +8341,18 @@ Huawei:
       model: 'Maimang 5'
     - regex: 'POT-AL10(?:[);/ ]|$)'
       model: 'Maimang 8'
-    - regex: 'TAH-AN00m(?:[);/ ]|$)'
+    - regex: 'TNN-AN00(?:[);/ ]|$)'
+      model: 'Maimang 9'
+    - regex: 'TYH601M'
+      model: 'Maimang 9 5G'
+    - regex: 'TAH-(?:N29|AN00)m(?:[);/ ]|$)'
       model: 'Mate XS'
+    - regex: 'TAH-AN00'
+      model: 'Mate X'
+    - regex: 'TET-A[NL]00(?:[);/ ]|$)'
+      model: 'Mate X2'
+    - regex: 'TET-AN50'
+      model: 'Mate X2 5G'
     - regex: 'ALP-(?:[TA]L00|L[02]9)(?:[);/ ]|$)'
       model: 'Mate 10'
     - regex: 'RNE-(?:AL00|L(?:01|03|21|23))(?:[);/ ]|$)'
@@ -5997,19 +8373,31 @@ Huawei:
       model: 'Mate 30'
     - regex: 'TAS-AN00(?:[);/ ]|$)'
       model: 'Mate 30 5G'
+    - regex: 'LIO-AN00P(?:[);/ ]|$)'
+      model: 'Mate 30 RS Porsche Design'
     - regex: 'SPN-AL00(?:[);/ ]|$)'
       model: 'Mate 30 Lite'
     - regex: 'LIO-(?:[TA]L00|L29|AN00)(?:[);/ ]|$)'
       model: 'Mate 30 Pro'
     - regex: 'LIO-N29(?:[);/ ]|$)'
       model: 'Mate 30 Pro 5G'
-    - regex: 'NXT-(?:AL10|L29)(?:[);/ ]|$)'
+    - regex: 'LIO-AN00m(?:[);/ ]|$)'
+      model: 'Mate 30E Pro 5G'
+    - regex: 'NOH-(?:NX9|AN0[01]|AN50|AL[01]0)(?:[);/ ]|$)'
+      model: 'Mate 40 Pro'
+    - regex: 'NOP-AN00(?:[);/ ]|$)'
+      model: 'Mate 40 Pro+'
+    - regex: 'OCE-AN10(?:[);/ ]|$)'
+      model: 'Mate 40'
+    - regex: 'OCE-(?:A[NL]50|AN00)(?:[);/ ]|$)'
+      model: 'Mate 40E'
+    - regex: 'NXT-(?:AL10|L[02]9)(?:[);/ ]|$)'
       model: 'Mate 8'
     - regex: 'MHA-(?:L[02]9|[AT]L00)(?:[);/ ]|$)'
       model: 'Mate 9'
     - regex: 'BLL-L23(?:[);/ ]|$)'
       model: 'Mate 9 Lite'
-    - regex: 'LON-(?:AL00|L29)(?:[);/ ]|$)'
+    - regex: 'LON-(?:AL00(?:-PD)?|L29)(?:[);/ ]|$)'
       model: 'Mate 9 Pro'
     - regex: 'NEO-AL00(?:[);/ ]|$)'
       model: 'Mate RS'
@@ -6021,8 +8409,10 @@ Huawei:
       model: 'Mate SE'
     - regex: '(CAZ-(?:AL[01]0|TL[12]0)|CAN-L[01][1-3])(?:[);/ ]|$)'
       model: 'Nova'
-    - regex: '608HW(?:[);/ ]|$)'
+    - regex: '(?:608HW|PRA-LX[23])(?:[);/ ]|$)'
       model: 'Nova Lite'
+    - regex: 'MLA-L11(?:[);/ ]|$)'
+      model: 'Nova Plus'
     - regex: '(?:PIC-(?:[AT]L00|LX9)|HWV31)(?:[);/ ]|$)'
       model: 'Nova 2'
     - regex: '704HW(?:[);/ ]|$)'
@@ -6035,11 +8425,11 @@ Huawei:
       model: 'Nova 2I'
     - regex: 'HWI-[AT]L00(?:[);/ ]|$)'
       model: 'Nova 2S'
-    - regex: 'PAR-(?:[AT]L00|LX[19]|TL20)(?:[);/ ]|$)'
+    - regex: 'PAR-(?:[AT]L00|LX[19]|LX1M|TL20)(?:[);/ ]|$)'
       model: 'Nova 3'
     - regex: 'ANE-AL00(?:[);/ ]|$)'
       model: 'Nova 3e'
-    - regex: 'INE-(?:AL00|LX1r|LX[12]|TL00)(?:[);/ ]|$)'
+    - regex: 'INE-(?:AL00|LX[12]r|LX[12]|TL00)(?:[);/ ]|$)'
       model: 'Nova 3i'
     - regex: 'VCE-(L22|[AT]L00)(?:[);/ ]|$)'
       model: 'Nova 4'
@@ -6049,7 +8439,7 @@ Huawei:
       model: 'Nova 5'
     - regex: 'SEA-AL10(?:[);/ ]|$)'
       model: 'Nova 5 Pro'
-    - regex: 'GLK-[AT]L00(?:[);/ ]|$)'
+    - regex: 'GLK-(?:[AT]L00|LX1U)(?:[);/ ]|$)'
       model: 'Nova 5i'
     - regex: 'SPN-TL00(?:[);/ ]|$)'
       model: 'Nova 5i Pro'
@@ -6059,22 +8449,50 @@ Huawei:
       model: 'Nova 6 5G'
     - regex: 'JNY-AL10(?:[);/ ]|$)'
       model: 'Nova 6 SE'
-    - regex: 'JEF-[AT]N00(?:[);/ ]|$)'
+    - regex: 'JEF-(?:[AT]N00|[AT]N20|NX9)(?:[);/ ]|$)'
       model: 'Nova 7 5G'
-    - regex: 'JER-[AT]N10(?:[);/ ]|$)'
+    - regex: 'JER-(?:[AT]N10|[AT]N20)(?:[);/ ]|$)'
       model: 'Nova 7 Pro 5G'
-    - regex: 'CDY-[AT]N00(?:[);/ ]|$)'
+    - regex: '(?:CDY-(?:[AT]N00|NX9B|[AT]N20)|CDL-AN50|CND-AN00)(?:[);/ ]|$)'
       model: 'Nova 7 SE 5G'
     - regex: 'JNY-LX2(?:[);/ ]|$)'
       model: 'Nova 7i'
+    - regex: 'ANG-LX[12](?:[);/ ]|$)'
+      model: 'Nova 8'
+    - regex: 'NEN-L(?:X[13]|22)(?:[);/ ]|$)'
+      model: 'Nova 8i'
+    - regex: 'ANG-AN00(?:[);/ ]|$)'
+      model: 'Nova 8 5G'
+    - regex: 'JSC-AN00'
+      model: 'Nova 8 SE 5G'
+    - regex: 'JSC-AL50'
+      model: 'Nova 8 SE 4G'
+    - regex: 'CHL-AL60'
+      model: 'Nova 8 SE Vitality'
+    - regex: 'BRQ-AL00(?:[);/ ]|$)'
+      model: 'Nova 8 Pro 4G'
+    - regex: 'BRQ-AN00(?:[);/ ]|$)'
+      model: 'Nova 8 Pro 5G'
+    - regex: 'NAM-(?:AL00|LX9)(?:[);/ ]|$)'
+      model: 'Nova 9'
+    - regex: 'RTE-AL00(?:[);/ ]|$)'
+      model: 'Nova 9 Pro'  # 4G
     - regex: 'DIG-L01(?:[);/ ]|$)'
       model: 'Nova Smart'
     - regex: 'WAS-AL00(?:[);/ ]|$)'
       model: 'Nova Youth'
+    - regex: 'WKG-[AT]N00'
+      model: 'Enjoy 20 5G'
+    - regex: 'WKG-LX9(?:[);/ ]|$)'
+      model: 'Nova Y60'
     - regex: 'FIG-L(?:A1|X[123])(?:[);/ ]|$)'
       model: 'P smart'
-    - regex: 'POT-(?:LX(?:[13]|2J|1AF)|AL00)(?:[);/ ]|$)'
+    - regex: 'POT-(?:LX(?:[13]|1T|2J|1AF)|AL00)(?:[);/ ]|$)'
       model: 'P smart (2019)'
+    - regex: 'POT-LX1A(?:[);/ ]|$)'
+      model: 'P smart (2020)'
+    - regex: 'PPA-LX[12](?:[);/ ]|$)'
+      model: 'P smart (2021)'
     - regex: 'STK-LX1(?:[);/ ]|$)'
       model: 'P smart Z'
     - regex: 'VTR-(?:L[02]9|AL00|TL00)(?:[);/ ]|$)'
@@ -6089,42 +8507,46 @@ Huawei:
       model: 'P20'
     - regex: '(?:ANE-(?:LX[123]|LX2J|TL00)|HWV32)(?:[);/ ]|$)'
       model: 'P20 Lite'
-    - regex: '(?:CLT-(?:AL0[01]|TL0[01]|L(?:04|[02]9))|HW-01K)(?:[);/ ]|$)'
+    - regex: '(?:CLT-(?:AL0[01]|TL0[01]|L(?:04|[02]9))l?|HW-01K)(?:[);/ ]|$)'
       model: 'P20 Pro'
     - regex: '(ELE-L(?:04|09|29)|ELE-[AT]L00)(?:[);/ ]|$)'
       model: 'P30'
-    - regex: '(?:MAR-(?:LX(?:1[BM]|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
+    - regex: '(?:MAR-(?:LX(?:1[BM]|2B|[13]Am?|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
       model: 'P30 Lite'
-    - regex: 'MAR-LX[13]A(?:[);/ ]|$)'
-      model: 'P30 Lite Dual SIM'
     - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)(?:[);/ ]|$)'
       model: 'P30 Pro'
+    - regex: 'ANA-LX4(?:[);/ ]|$)'
+      model: 'P40'
     - regex: 'JNY-LX1(?:[);/ ]|$)'
       model: 'P40 Lite'
     - regex: 'ART-L29(?:[);/ ]|$)'
       model: 'P40 Lite E'
     - regex: 'ART-L29N(?:[);/ ]|$)'
       model: 'P40 Lite E NFC'
-    - regex: 'ELS-(?:[AT]N00|NX9|N04)(?:[);/ ]|$)'
+    - regex: '(?:ELS-(?:[AT]N00|NX9|N04)|NEY-NX9)(?:[);/ ]|$)'
       model: 'P40 Pro'
     - regex: 'ELS-(?:AN10|N39)(?:[);/ ]|$)'
       model: 'P40 Pro Plus'
     - regex: 'GRA-(?:L09|UL00)(?:[);/ ]|$)'
       model: 'P8'
-    - regex: '(?:ALE-L(?:02|21|23)|ALE-UL00|ALE-TL00)(?:[);/ ]|$)'
+    - regex: '(?:ALE-L(?:02|21|23)|ALE-[TUC]L00|503HW)(?:[);/ ]|$)'
       model: 'P8 Lite (2015)'
-    - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)(?:[);/ ]|$)'
+    - regex: '(?:PRA-L(?:A1|X[12])|hi6210sft)(?:[);/ ]|$)'
       model: 'P8 Lite (2017)'
     - regex: 'EVA-(?:AL[10]0|L[012]9|[TCD]L00)(?:[);/ ]|$)'
       model: 'P9'
-    - regex: 'VNS-L(?:[23]1|[26]2)(?:[);/ ]|$)'
+    - regex: 'VNS-L(?:[23]1|[26]2|53|23)(?:[);/ ]|$)'
       model: 'P9 Lite'
+    - regex: 'VNS-L52(?:[);/ ]|$)'
+      model: 'P9 Lite Premium'
     - regex: 'SLA-L(?:02|03|22|23)(?:[);/ ]|$)'
       model: 'P9 Lite Mini'
     - regex: 'DIG-L(?:03|23)(?:[);/ ]|$)'
       model: 'P9 Lite Smart'
     - regex: 'VIE-(?:AL10|L[02]9)(?:[);/ ]|$)'
       model: 'P9 Plus'
+    - regex: 'MLA-TL[01]0(?:[);/ ]|$)'
+      model: 'G9 Plus'
     - regex: 'ATH-UL0[16](?:[);/ ]|$)'
       model: 'ShotX'
     - regex: 'U(8230|8661|8667)(?:[);/ ]|$)'
@@ -6141,10 +8563,12 @@ Huawei:
       model: 'Y5 (2017)'
     - regex: 'DRA-L(?:01|03|21|23|X3)(?:[);/ ]|$)'
       model: 'Y5 (2018)'
-    - regex: 'AMN-LX[129](?:[);/ ]|$)'
+    - regex: 'AMN-LX[1239](?:[);/ ]|$)'
       model: 'Y5 (2019)'
     - regex: 'DRA-LX5(?:[);/ ]|$)'
       model: 'Y5 lite'
+    - regex: 'DRA-LX9(?:[);/ ]|$)'
+      model: 'Y5p'
     - regex: 'CRO-L[02]3(?:[);/ ]|$)'
       model: 'Y5 Lite (2017)'
     - regex: 'CAG-L[02]3(?:[);/ ]|$)'
@@ -6155,7 +8579,7 @@ Huawei:
       model: 'Y5 Pro (2017)'
     - regex: 'CUN-(?:L(?:0[123]|2[123]|33)|U29)(?:[);/ ]|$)'
       model: 'Y5II'
-    - regex: 'SCC-U21(?:[);/ ]|$)'
+    - regex: '(?:SCC-U21|SCL-U31)(?:[);/ ]|$)'
       model: 'Y6'
     - regex: 'MYA-L11(?:[);/ ]|$)'
       model: 'Y6 (2016)'
@@ -6183,7 +8607,7 @@ Huawei:
       model: 'Y7 (2017)'
     - regex: 'LDN-L(?:01|X3)(?:[);/ ]|$)'
       model: 'Y7 (2018)'
-    - regex: 'DUB-(?:LX[13]|TL00)(?:[);/ ]|$)'
+    - regex: '(?:HUAWEI[ _]?)?DUB-(?:LX[13]|TL00)(?:[);/ ]|$)'
       model: 'Y7 (2019)'
     - regex: '(LDN-(?:AL00|L21)|TRT-TL10)(?:[);/ ]|$)'
       model: 'Y7 Prime'
@@ -6191,16 +8615,31 @@ Huawei:
       model: 'Y7 Prime (2018)'
     - regex: 'DUB-(?:LX2|AL00)(?:[);/ ]|$)'
       model: 'Y7 Pro (2019)'
+    - regex: 'DUB-AL00a(?:[);/ ]|$)'
+      model: 'Enjoy 9'
     - regex: 'DUB-AL20(?:[);/ ]|$)'
       model: 'Y7 Pro (2019)'
+    - regex: 'PPA-LX3(?:[);/ ]|$)'
+      model: 'Y7a'
+    - regex: 'ART-L28(?:[);/ ]|$)'
+      model: 'Y7p'
     - regex: 'AQM-LX1(?:[);/ ]|$)'
       model: 'Y8p'
     - regex: 'FLA-(LX[123]|AL20|TL10)(?:[);/ ]|$)'
       model: 'Y9 (2018)'
-    - regex: 'JKM-(?:[TA]L00|LX[123])(?:[);/ ]|$)'
+    - regex: 'JKM-(?:[TA]L00[ab]?|LX[123])(?:[);/ ]|$)'
       model: 'Y9 (2019)'
     - regex: 'STK-(L2[12]|LX3)(?:[);/ ]|$)'
       model: 'Y9 Prime (2019)'
+    - regex: 'FRL-L2[23](?:[);/ ]|$)'
+      model: 'Y9a'
+    - regex: '302HW(?:[);/ ]|$)'
+      model: 'Stream S'
+    - regex: 'NMO-L31(?:[);/ ]|$)'
+      model: 'GT3'
+    - regex: 'Nexus 6P(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Nexus 6P'
 
     - regex: 'HWT31(?:[);/ ]|$)'
       model: 'Qua Tab 02 10.1"'
@@ -6208,8 +8647,29 @@ Huawei:
     - regex: 'HDN-[LW]09(?:[);/ ]|$)'
       model: 'Honor Water Play 10.1'
       device: 'tablet'
-    - regex: 'BAH3-AL00(?:[);/ ]|$)'
-      model: 'MatePad 10.4'
+    - regex: 'BAH3-(?:AL00|[LW]09)(?:[);/ ]|$)'
+      model: 'MatePad 10.4"'
+      device: 'tablet'
+    - regex: 'BAH3-W59(?:[);/ ]|$)'
+      model: 'MatePad 10.4" WiFi'
+      device: 'tablet'
+    - regex: 'BAH3-AN10(?:[);/ ]|$)'
+      model: 'MatePad 10.4" 5G'
+      device: 'tablet'
+    - regex: 'DBY-W09(?:[);/ ]|$)'
+      model: 'MatePad 11 WiFi'
+      device: 'tablet'
+    - regex: 'SCMR-W09(?:[);/ ]|$)'
+      model: 'MatePad 10.8" WiFi'
+      device: 'tablet'
+    - regex: 'SCMR-AL09(?:[);/ ]|$)'
+      model: 'MatePad 10.8"'
+      device: 'tablet'
+    - regex: 'AGS3-(L09|AL00)(?:[);/ ]|$)'
+      model: 'MatePad T10s'
+      device: 'tablet'
+    - regex: 'AGS3-W09(?:[);/ ]|$)'
+      model: 'MatePad T10s WiFi'
       device: 'tablet'
     - regex: 'HDL-(?:W09|AL09)(?:[);/ ]|$)'
       model: 'Honor Water Play 8.0'
@@ -6217,18 +8677,63 @@ Huawei:
     - regex: 'JDN-(?:AL00|W09)(?:[);/ ]|$)'
       model: 'Honor Pad 2'
       device: 'tablet'
+    - regex: 'KRJ-W09(?:[);/ ]|$)'
+      model: 'Honor Pad V6'
+      device: 'tablet'
+    - regex: 'KRJ-AN00'
+      model: 'Honor Pad V6 10.4" 5G'
+      device: 'tablet'
+    - regex: 'KJR-W09'
+      model: 'Honor Pad V6 10.4" WiFi'
+      device: 'tablet'
+    - regex: 'KOB2-W09HN'
+      device: 'tablet'
+      model: 'Honor Pad X7 8" WiFi'
+    - regex: 'AGR-W09HN'
+      device: 'tablet'
+      model: 'Honor Pad X6'
+    - regex: 'AGR-AL09HN'
+      device: 'tablet'
+      model: 'Honor Pad X6 9.7"'
+    - regex: 'AGS3-AL09HN(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Honor Pad 6 10.1"'
+    - regex: 'AGS3-W09HN(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Honor Pad 6 10.1" WiFi'
     - regex: 'MON-(W|AL)19(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MatePad C5 8'
     - regex: 'BZA-W00(?:[);/ ]|$)'
       device: 'tablet'
       model: 'C3 9.6'
+    - regex: 'BZC-AL00(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'C3 9.7" (2020)'
+    - regex: 'BZC-W00(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'C3 9.7" (2020) WiFi'
     - regex: 'M2-801L(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M2 8.0"'
-    - regex: 'MRX-(AL09|W09)(?:[);/ ]|$)'
+    - regex: 'MRX-AL[01]9(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MatePad Pro 10.8"'
+    - regex: 'MRX-W[0-3]9(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MatePad Pro 10.8" WiFi'
+    - regex: 'MRR-W[23]9(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'MatePad Pro'
+      model: 'MatePad Pro 10.8" (2021) WiFi'
+    - regex: 'MRX-AN19(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MatePad Pro 10.8" 5G'
+    - regex: 'WGR-W[10]9(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MatePad Pro 12.6" WiFi'
+    - regex: 'WGR-AN19(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MatePad Pro 12.6"'
     - regex: 'CMR-(?:AL[01]9|W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M5 10.8'
@@ -6237,7 +8742,7 @@ Huawei:
       model: 'MediaPad M5 Pro 10.8'
     - regex: 'SCM-AL09(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'MediaPad M5 Pro'
+      model: 'MediaPad M6 10.8"'
     - regex: 'GEM-70[1-3]L(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad X2'
@@ -6252,28 +8757,37 @@ Huawei:
       model: 'MediaPad M6 8.4'
     - regex: 'SCM-W09(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'MediaPad M6 10'
+      model: 'MediaPad M6 10.8" WiFi'
     - regex: 'BTV-W09(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M3 8'
     - regex: '(BAH-W09|CPN-(?:L|W)09|CPN-AL00|701HW)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M3 Lite'
-    - regex: '(BAH-(?:L09|AL00)|BAH3-W09)(?:[);/ ]|$)'
+    - regex: 'BAH-(?:L09|AL00)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M3 Lite 10'
     - regex: 'BTV-DL09'
       device: 'tablet'
       model: 'MediaPad M3'
-    - regex: '(AGS2-AL00|JDN2-W09)HN(?:[);/ ]|$)'
+    - regex: '(AGS2-AL00|JDN2-(?:AL00|W09))HN(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Honor Tab 5'
-    - regex: 'AGS2-(?:[LW]09|L03)(?:[);/ ]|$)'
+    - regex: 'AGM3-W09HN'
+      device: 'tablet'
+      model: 'Honor Pad 7 10.1" WiFi'
+    - regex: 'AGM3-AL09HN'
+      device: 'tablet'
+      model: 'Honor Pad 7 10.1"'
+    - regex: 'AGS2-(?:[LW]09|W09HN|W19|L03)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T5 10'
-    - regex: 'KOB2-L09(?:[);/ ]|$)'
+    - regex: 'KOB2-[LW]09(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T 8.0"'
+    - regex: 'AGR-[LW]09(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MediaPad T 10'
     - regex: 'AGS-(?:L0[39]|W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T3 10'
@@ -6295,7 +8809,7 @@ Huawei:
     - regex: '(?:FDR-(A01[LW]|A03L)|605HW)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T2 10.0" Pro'
-    - regex: 'T1-(?:A21[LW]|A23L)(?:[);/ ]|$)'
+    - regex: 'T1-(?:A21[LW]|A2[23]L)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T1 10'
     - regex: 'T1-701u(?:[);/ ]|$)'
@@ -6304,15 +8818,48 @@ Huawei:
     - regex: '(?:T1-82(?:3L|1W)|MediaPad T1 8.0)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T1 8'
+    - regex: 'AGS3K-W09'
+      device: 'tablet'
+      model: 'MediaPad T10s 10.1" WiFi'
+    - regex: 'AGS3K-L09'
+      device: 'tablet'
+      model: 'MediaPad T10s 10.1" LTE'
+    - regex: 'AGRK-W09'
+      device: 'tablet'
+      model: 'MediaPad T10 9.7" WiFi'
+    - regex: 'AGRK-L09'
+      device: 'tablet'
+      model: 'MediaPad T10 9.7" LTE'
     - regex: 'AGS2-AL00(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Enjoy Tablet 10.1'
+    - regex: 'AGS3-W00[DE](?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Enjoy Tablet 2 10.1" WiFi'
     - regex: 'BZT-(W09|AL[01]0)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad C5 10.1'
+    - regex: 'BZI-AL00'
+      model: 'C5e 10.1"'
+      device: 'tablet'
+    - regex: 'BZT3-W09'
+      model: 'C5 10.4" WiFi'
+      device: 'tablet'
+    - regex: 'BZT3-AL00'
+      model: 'C5 10.4"'
+      device: 'tablet'
+    - regex: 'BZD-W00'
+      device: 'tablet'
+      model: 'MediaPad C3 8.0" WiFi'
+    - regex: 'BZD-AL00'
+      device: 'tablet'
+      model: 'MediaPad C3 8.0"'
     - regex: '(?:d-01J|d-02[HK])(?:[);/ ]|$)'
       device: 'tablet'
       model: 'D Tab Compact'
+    - regex: '(d-01K)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'dtab d-01K'
 
 
       # smart watch regex
@@ -6331,26 +8878,65 @@ Huawei:
       model: 'Ascend Mate $1'
     - regex: 'Huawei[ _\-]?([^/;]*) Build'
       model: '$1'
-    - regex: '(?:HW-)?Huawei(?:/1\.0/0?(?:Huawei))?[_\- /]?([a-z0-9\-_]+)'
+    - regex: '(?:HW-)?Huawei(?!Browser)(?:/1\.0/0?(?:Huawei))?[_\- /]?([a-z0-9\-_]+)'
       model: '$1'
     - regex: 'Huawei; ([a-z0-9 \-]+)'
       model: '$1'
 
 # Hyundai
 Hyundai:
-  regex: 'Hyundai|Ultra (?:Active|Air|Charm|Dream|Energy|Latitude|Link|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)|G(24027|2552[34])K|W25042L'
+  regex: 'Hyundai|Ultra (?:Active|Air|Charm|Dream|Energy|Latitude|Link|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)|Ultra_Vision_Plus|E(?:475|504|603)|G(?:24027|2552[34])K|W25042L|HP554O|Seoul S8|L503F Plus|HT0701L16|HT0704K08|HT1004L16|HT1004LI16|Koral_8W2|Eternity[_ ]G25|HYMI 5S Plus|7GB1|7WD1|(?:Android 9.+ E553)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'Ultra[_ ]Vision[_ ]Plus'
+      model: 'Ultra Vision Plus'
     - regex: 'Ultra (Active|Air|Charm|Dream|Energy Lite|Energy Plus|Energy|Latitude|Link|Live II|Live|Shadow|Shine|Storm|Style|Sync|Trend|Vision|Wave)'
       model: 'Ultra $1'
+    - regex: 'Seoul S8'
+      model: 'Seoul S8'
     - regex: 'G25523K'
       model: 'Eternity G23'
+    - regex: 'Eternity[_ ]G25'
+      model: 'Eternity G25'
     - regex: 'G25524K'
       model: 'Eternity G24'
     - regex: 'G24027K'
       model: 'Eternity G27'
     - regex: 'W25042L'
       model: 'Eternity W42'
+    - regex: 'HP554O'
+      model: 'HP554O'
+    - regex: 'L503F Plus'
+      model: 'L503F Plus'
+    - regex: 'HYMI 5S Plus'
+      model: 'Hymi 5S Plus'
+    - regex: 'E(475|504|553|603)(?:[);/ ]|$)'
+      model: 'E$1'
+    - regex: '(?:Hyundai_)?(Eternity_(?:G57L?|G[56]0))'
+      model: '$1'
+
+    # explicit tables models
+    - regex: 'HT0701L16'
+      model: 'Koral 7XL'
+      device: 'tablet'
+    - regex: 'HT1004LI16'
+      model: 'Koral 10XL'
+      device: 'tablet'
+    - regex: 'Koral_8W2'
+      model: 'Koral 8W2'
+      device: 'tablet'
+    - regex: 'HT1004L16'
+      model: 'Koral 10XL'
+      device: 'tablet'
+    - regex: 'HT0704K08'
+      model: 'Koral 7M4'
+      device: 'tablet'
+    - regex: '7GB1(?:[);/ ]|$)'
+      model: 'HyTab 7GB1'
+      device: 'tablet'
+    - regex: '7WD1(?:[);/ ]|$)'
+      model: 'HyTab Lite 7WD1'
+      device: 'tablet'
     - regex: 'Hyundai ([^;/]+) Build'
       model: '$1'
       device: 'tablet'
@@ -6390,14 +8976,28 @@ Hyundai:
     - regex: 'i-Joy ([^;/]+) Build'
       model: '$1'
 
-# iBall
+# iBall (iball.co.in)
 iBall:
-  regex: 'iBall[ _]([^;/)]+)[ _]Build|(Snap_4G2)(?:[);/ ]|$)'
+  regex: 'iBall[ _]([^;/)]+)[ _]Build|iBall_Slide|(?:Snap[_ ]4G2|6351-Q400i|iT-KSA0003|iT-KSA0012|iT-KSA0066|Avid|Twinkle_i5|Gorgeo[_ ]4GL|Brisk 4G2|Blaze_V4|Wondro 10|Q27 4G|Andi (?:Wink|5G Blink) 4G|Co-Mate)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(Snap_4G2)(?:[);/ ]|$)'
+    - regex: 'Andi Wink 4G'
+      device: 'smartphone'
+      model: 'Andi Wink 4G'
+    - regex: 'Andi 5G Blink 4G'
+      device: 'smartphone'
+      model: 'Andi 5G Blink 4G'
+    - regex: '(Snap[_ ]4G2|Avid|Twinkle_i5|Gorgeo[_ ]4GL|Blaze_V4|Wondro 10|Q27 4G|Brisk 4G2|Co-Mate)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'iBall[ _]([^;/)]+)[ _]Build'
+    - regex: '6351-Q400i(?:[);/ ]|$)'
+      model: 'Slide'
+    - regex: 'iT-KSA0003(?:[);/ ]|$)'
+      model: 'iTAB BizniZ'
+    - regex: 'iT-KSA0066(?:[);/ ]|$)'
+      model: 'iTAB BizniZ Mini'
+    - regex: 'iT-KSA0012(?:[);/ ]|$)'
+      model: 'iTAB Moviez Pro'
+    - regex: 'iBall[ _]([^;/)]+)(?:[ _]Build|\))'
       model: '$1'
 
 # iRola
@@ -6414,13 +9014,18 @@ iRola:
 
 # iRulu
 iRulu:
-  regex: 'iRULU[ _](X11|V[34])(?:[);/ ]|$)'
+  regex: 'iRULU[ _-](X11|V[34]|U2|AL101)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'iRULU[ _-](X11|V[34]|AL101)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'iRULU[ _](U2)(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: '$1'
 
 # Irbis
 Irbis:
-  regex: 'IRBIS|TZ(1(?:0[04]|42|50|84|65|7[01345-89]|8[356]|9[12578])|49|7(?:1[2467]|2[01567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
+  regex: 'IRBIS|TZ(1(?:0[04]|42|5[01]|84|65|7[01345-89]|8[356]|9[12578])|200|49|55|72|22|7(?:0[127]|1[1-46789]|2[021567]|3[025-8]|4[257]|5[23457]|6[12]|72|7[137]|8[1]|9[147])|8(?:[34]1|32|5[3-8]|6[2-5]|7[12478]|8[1-5]|9[0127])|96[0-9])|TZ85|TZ13|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
@@ -6441,17 +9046,25 @@ iBerry:
 
 # iHunt
 iHunt:
-  regex: 'iHunt|One_ Love_|TITAN_P11000_PRO|Like_(3|4U|3_Pro)|X300 Elite|S10_Tank_2019|S60_Discovery_2019|AlienXLite2020'
+  regex: 'iHunt|One_ Love_|TITAN[_ ]P\d+|Like_(3|4U|3_Pro)|X300 Elite|S10_Tank_2019|S10 Tank PRO 2020|S60_Discovery_2019|AlienXLite2020|Alien X Lite|Alien_X|S[23]0 Ultra ApeX 2021|S21 Ultra 4G 2021|Like 11 Panda Pro|Like_Hi10_2021|S21 Plus 2021'
   device: 'smartphone'
   models:
+    - regex: 'Like_Hi10_2021'
+      model: 'Like Hi10 (2021)'
     - regex: 'iHunt_Like'
       model: 'Like'
     - regex: 'S10_Tank_2019'
       model: 'S10 Tank (2019)'
+    - regex: 'S10 Tank PRO 2020'
+      model: 'S10 Tank Pro (2020)'
     - regex: 'One_ Love_'
       model: 'One Love'
     - regex: 'TITAN_P11000_PRO'
       model: 'Titan P11000 Pro'
+    - regex: 'TITAN P4000 Pro 2021'
+      model: 'Titan P4000 Pro (2021)'
+    - regex: 'Titan P8000 PRO 2021'
+      model: 'Titan P8000 Pro (2021)'
     - regex: 'Like_3_Pro'
       model: 'Like 3 Pro'
     - regex: 'Like_3'
@@ -6462,12 +9075,34 @@ iHunt:
       model: 'X300 Elite'
     - regex: 'S60_Discovery_2019'
       model: 'S60 Discovery (2019)'
+    - regex: 'S60 Discovery Pro 2022'
+      model: 'S60 Discovery Pro (2022)'
     - regex: 'AlienXLite2020'
       model: 'Alien X Lite (2020)'
+    - regex: 'Alien X Lite PRO'
+      model: 'Alien X Lite Pro'
+    - regex: 'Alien X Lite'
+      model: 'Alien X Lite'
+    - regex: 'Alien_X_ApeX_2020'
+      model: 'Alien X ApeX (2020)'
+    - regex: 'Alien_X_ApeX'
+      model: 'Alien X ApeX'
+    - regex: 'Alien_X'
+      model: 'Alien X'
+    - regex: 'S21 Plus 2021'
+      model: 'S21 Plus (2021)'
+    - regex: 'S([23]0) Ultra ApeX 2021'
+      model: 'S$1 Ultra ApeX (2021)'
+    - regex: 'S21 Ultra 4G 2021'
+      model: 'S21 Ultra 4G (2021)'
+    - regex: 'Like 11 Panda Pro 2022'
+      model: 'Like 11 Panda Pro (2022)'
+    - regex: 'iHunt ([^;)/]+)(?: Build|[;)])'
+      model: '$1'
 
 # IconBIT
 IconBIT:
-  regex: 'IconBIT|NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)|XDS[789]4K'
+  regex: 'IconBIT|NT-(3506M|1501C|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)|XDS[789]4K|Omnicast UHD|Movie Smart 4K|Movie IPTV Quad|TOUCAN (?:NANO|Stick) 4K|NetTAB_Space_3G'
   device: 'tablet'
   models:
     - regex: 'NT-3506M'
@@ -6501,12 +9136,26 @@ IconBIT:
       model: 'NetTAB Skat MX'
     - regex: 'NT-0902S'
       model: 'NetTAB Space quad RX'
+    - regex: 'NetTAB_Space_3G'
+      model: 'NetTAB Space 3G'
     - regex: 'NT-3702M'
       model: 'NetTAB Matrix 3G duo'
     - regex: 'NT-3703M'
       model: 'NetTAB Matrix 3GT'
+    - regex: 'MATRIX ULTRA'
+      model: 'NetTAB Matrix Ultra'
+
+    - regex: 'NT-1501C'
+      model: 'Callisto 100'
+      device: 'wearable'
 
-    - regex: '(?:iconBIT )?(Movie Ultra HD 4K|XDS[789]4K)'
+    - regex: 'TOUCAN NANO 4K'
+      model: 'Toucan Nano 4K'
+      device: 'tv'
+    - regex: 'TOUCAN Stick 4K'
+      model: 'Toucan Stick 4K'
+      device: 'tv'
+    - regex: '(?:iconBIT )?(Movie Smart 4K|Movie IPTV Quad|Movie Ultra HD 4K|XDS[789]4K|Omnicast UHD|Stick|XDS1000)'
       model: '$1'
       device: 'tv'
 
@@ -6585,17 +9234,21 @@ LYF:
 
 # Lumus
 Lumus:
-  regex: '(?:NEO(SR620|SC600)|Lumus[_ ]Ion)(?:[);/ ]|$)'
+  regex: '(?:NEO(SR620|SC600)|INNOSR545|Lumus[_ ]Ion|AEONSR570)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    # explicit smartphone models
     - regex: 'NEO(SR620|SC600)(?:[);/ ]|$)'
       model: 'Neo $1'
+    - regex: 'INNO(SR545)(?:[);/ ]|$)'
+      model: 'INNO $1'
     - regex: 'Lumus[_ ]Ion(?:[);/ ]|$)'
       model: 'Ion'
-
+    - regex: 'AEON(SR570)(?:[);/ ]|$)'
+      model: 'AEON $1'
 # M4tel
 M4tel:
-  regex: 'M4 SS[0-9]{4}(?:-R)?|M4_B[23]'
+  regex: '(?:M4 SS[0-9]{4}(?:-R)?|M4_B[23]|M4_R2|R2_Plus)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'SS1050'
@@ -6626,6 +9279,10 @@ M4tel:
       model: 'Believe'
     - regex: 'SS4452'
       model: 'Dream'
+    - regex: 'SS4453-R'
+      model: 'R1 Feel'
+    - regex: 'R2_Plus'
+      model: 'R2 Plus'
     - regex: 'SS4453'
       model: 'Inspiration'
     - regex: 'SS4455'
@@ -6642,20 +9299,28 @@ M4tel:
       model: 'Attitude'
     - regex: 'M4_B([23])'
       model: 'B$1'
+    - regex: 'M4_R(2)'
+      model: 'R$1'
 
-# IMO Mobile
+# IMO Mobile or In My Opinion Mobile (imomobile.co.uk)
 IMO Mobile:
-  regex: '(?:IMO)(?:[);/ ]|$)'
+  regex: 'IMO[ _]\w'
   device: 'smartphone'
   models:
-    - regex: 'IMO[ _]Q2 Plus(?:[);/ ]|$)'
-      model: 'Q2 Plus'
+    - regex: 'IMO[ _]Q([23]) Plus(?:[);/ ]|$)'
+      model: 'Q$1 Plus'
+    - regex: 'IMO[ _]Q([4]) Pro(?:[);/ ]|$)'
+      model: 'Q$1 Pro'
     - regex: 'IMO[ _]Q2(?:[);/ ]|$)'
       model: 'Q2'
+    - regex: 'IMO[ _]S2(?:[);/ ]|$)'
+      model: 'S2'
     - regex: 'IMO[ _]FEEL A2(?:[);/ ]|$)'
       model: 'Feel A2'
     - regex: 'IMO[ _]S50(?:[);/ ]|$)'
       model: 'S50 Light'
+    - regex: 'IMO[ _]S80(?:[);/ ]|$)'
+      model: 'S80 Hero'
     - regex: 'IMO[ _]S89(?:[);/ ]|$)'
       model: 'S89 Miracle'
     - regex: 'IMO[ _]S88(?:[);/ ]|$)'
@@ -6674,6 +9339,8 @@ IMO Mobile:
       model: 'Q8 Clarity'
     - regex: 'IMO[ _]Discovery II(?:[);/ ]|$)'
       model: 'Discovery II'
+    - regex: 'IMO[ _]Q(?:[);/ ]|$)'
+      model: 'Q'
 
     - regex: 'IMO[ _](Y5|Z[67])(?:[);/ ]|$)'
       model: 'Tab $1'
@@ -6682,7 +9349,7 @@ IMO Mobile:
       model: 'Tab X9'
       device: 'tablet'
 
-# iLA
+# iLA or ILA Mobile
 iLA:
   regex: 'iLA[-_ ](Silk|X)(?:[);/ ]|$)'
   device: 'smartphone'
@@ -6690,7 +9357,7 @@ iLA:
 
 # iNew
 iNew:
-  regex: 'iNew|(?:V7A|V3 Plus|V3-?E|V3C)(?:[);/ ]|$)'
+  regex: 'iNew|(?:V7A|V3 Plus|V3-?E|V3C|FIRE_Tab_6)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'V3C(?:[);/ ]|$)'
@@ -6701,23 +9368,42 @@ iNew:
       model: 'V3 Plus'
     - regex: 'V7A(?:[);/ ]|$)'
       model: 'V7A'
+    - regex: 'FIRE_Tab_6(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Fire Tab 6'
+
     - regex: 'iNew[ -_]([^;/]+) Build'
       model: '$1'
 
 # iPro
 iPro:
-  regex: 'Kylin[ _]5.[05]|Jade7s'
+  regex: '(?:Kylin[ _]5.[05]S?|KYLIN40|Jade[78]s|Amber[67]S?|Amber5S_Pro|Phonenix50S|Zafiro|I9355A|Opal 4S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Kylin_5.0S'
       model: 'Kylin 5.0S'
     - regex: 'Kylin (5.[05])'
       model: 'Kylin $1'
-    - regex: 'Jade7s'
-      model: 'Jade 7s'
-
-
-# Infinix
+    - regex: 'KYLIN40'
+      model: 'Kylin 40'
+    - regex: 'Opal 4S'
+      model: 'Opal 4S'
+    - regex: 'Jade([78])s'
+      model: 'Jade $1s'
+    - regex: 'Amber7S'
+      model: 'Amber 7S'
+    - regex: 'Amber5S_Pro'
+      model: 'Amber 5S Pro'
+    - regex: 'Amber6'
+      model: 'Amber 6'
+    - regex: 'Phonenix50S'
+      model: 'Phonenix 50S'
+    - regex: 'Zafiro'
+      model: 'Zafiro'
+    - regex: '(I9355A)'
+      model: '$1'
+
+# Infinix (infinixmobility.com)
 Infinix:
   regex: 'Infinix'
   device: 'smartphone'
@@ -6773,6 +9459,12 @@ Infinix:
       model: 'Zero 5 Pro'
     - regex: 'Infinix[ _-]X620'
       model: 'Zero 6'
+    - regex: 'Infinix[ _-]X687B'
+      device: 'phablet'
+      model: 'Zero 8i'
+    - regex: 'Infinix[ _-]X687'
+      device: 'phablet'
+      model: 'Zero 8'
 
     - regex: 'Infinix[ _-]X507'
       model: 'Hot'
@@ -6798,22 +9490,58 @@ Infinix:
       model: 'Hot 6 Pro'
     - regex: 'Infinix[ _-]X624'
       model: 'Hot 7'
+    - regex: 'Infinix[ _-]X625'
+      model: 'Hot 7 Pro'
     - regex: 'Infinix[ _-]X650'
       model: 'Hot 8'
-    - regex: 'Infinix[ _-]X680'
+    - regex: 'Infinix[ _-]X655F'
+      model: 'Hot 9 Pro'
+    - regex: 'Infinix[ _-]X655'
+      model: 'Hot 9'
+    - regex: 'Infinix[ _-]X680[BCEF]'
       model: 'Hot 9 Play'
+    - regex: 'Infinix[ _-]X680D'
+      model: 'Smart 4 Plus'
+    - regex: 'Infinix[ _-]X680'
+      model: 'Smart 4'
+    - regex: 'Infinix[ _-]X688'
+      model: 'Hot 10 Play'
+    - regex: 'Infinix[ _-]X682[BC]'
+      model: 'Hot 10'
+    - regex: 'Infinix[ _-]X689C'
+      model: 'Hot 10T'
+    - regex: 'Infinix X689D'
+      model: 'Hot 10s NFC'
+    - regex: 'Infinix X689'
+      model: 'Hot 10s'
+    - regex: 'Infinix[ _-](?:X659|PR652|X658)'
+      model: 'Hot 10i'
     - regex: 'Infinix[ _-]X573B?'
       model: 'Hot S3'
+    - regex: 'Infinix[ _-]X6812'
+      model: 'Hot 11S'
 
+    - regex: 'Infinix[ _-]X612'
+      model: 'Smart HD (2021)'
     - regex: 'Infinix[ _-]X5010'
       model: 'Smart'
     - regex: 'Infinix[ _-]X5515F'
       model: 'Smart 2'
+    - regex: 'Infinix[ _-]X609'
+      model: 'Smart 2 HD'
+    - regex: 'Infinix[ _-]X627'
+      model: 'Smart 3 Plus'
     - regex: 'Infinix[ _-]X5514D'
       model: 'Smart 2 Pro'
     - regex: 'Infinix[ _-]X653'
       model: 'Smart 4'
+    - regex: 'Infinix[ _-]X657'
+      model: 'Smart 5'
+    - regex: 'Infinix[ _-]X6511'
+      model: 'Smart 6'
 
+    - regex: 'Infinix[ _-]X652B'
+      model: 'S5 Lite'
     - regex: 'Infinix[ _-]X626'
       model: 'S4'
     - regex: 'Infinix[ _-]X652'
@@ -6839,6 +9567,9 @@ Infinix:
     - regex: 'Infinix[ _-]X604'
       model: 'Note 5'
       device: 'phablet'
+    - regex: 'Infinix[ _-]X605'
+      model: 'Note 5 Stylus'
+      device: 'phablet'
     - regex: 'Infinix[ _-]X610'
       model: 'Note 6'
       device: 'phablet'
@@ -6848,10 +9579,28 @@ Infinix:
     - regex: 'Infinix[ _-]X656'
       model: 'Note 7 Lite'
       device: 'phablet'
-
-    - regex: 'Infinix HOT ([a-z]?[1-6])( (?:Lite|Plus|Pro))?'
-      model: 'Hot $1$2'
-    - regex: 'Infinix[ _-](X[78]00)'
+    - regex: 'Infinix[ _-]X692'
+      model: 'Note 8'
+      device: 'phablet'
+    - regex: 'Infinix[ _-]X683'
+      model: 'Note 8i'
+      device: 'phablet'
+    - regex: 'Infinix[ _-]X695'
+      model: 'Note 10 Pro'
+      device: 'phablet'
+    - regex: 'Infinix[ _-]X693'
+      model: 'Note 10'
+      device: 'phablet'
+    - regex: 'Infinix[ _-]X663'
+      model: 'Note 11'
+      device: 'phablet'
+    - regex: 'Infinix[ _-]X697'
+      model: 'Note 11 Pro'
+      device: 'phablet'
+
+    - regex: 'Infinix HOT ([a-z]?[1-6])( (?:Lite|Plus|Pro))?'
+      model: 'Hot $1$2'
+    - regex: 'Infinix[ _-](X[78]00)'
       device: 'tablet'
       model: '$1'
     - regex: 'Infinix[ _-](X\d+)'
@@ -6861,7 +9610,7 @@ Infinix:
 
 # InFocus
 InFocus:
-  regex: 'IF(9001|9007|9021|9035|9031)(?:[);/ ]|$)'
+  regex: 'IF(900[1237]|902[19]|903[15])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IF9001'
@@ -6872,12 +9621,18 @@ InFocus:
       model: 'Turbo 5 Plus'
     - regex: 'IF9035'
       model: 'A2'
+    - regex: 'IF9002'
+      model: 'M5s'
+    - regex: 'IF9003'
+      model: 'M6s'
     - regex: 'IF9031'
       model: 'Vision 3'
+    - regex: 'IF9029'
+      model: 'Vision 3 Pro'
 
-# InnJoo
+# InnJoo (innjoo.es)
 InnJoo:
-  regex: 'InnJoo|(?:Halo Plus|Halo X|Halo[ _]4(?:[ _]mini[ _]LTE)?|Halo2 3G)(?:[);/ ]|$)'
+  regex: 'InnJoo|(?:Halo Plus|Halo X|Halo[ _]4(?:[ _]mini[ _]LTE)?|Halo2 3G|Fire2 Plus LTE|Superb_PLus)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'InnJoo[ _]X3(?:[);/ ]|$)'
@@ -6902,6 +9657,10 @@ InnJoo:
       model: '2 LTE'
     - regex: 'InnJoo[ _]([2-4])'
       model: '$1'
+    - regex: 'Fire2 Plus LTE'
+      model: 'Fire 2 Plus LTE'
+    - regex: 'Superb_PLus'
+      model: 'SuperB Plus'
 
 # Inkti
 Inkti:
@@ -6909,6 +9668,12 @@ Inkti:
   device: 'smartphone'
   model: '$1'
 
+# Innos
+Innos:
+  regex: 'Innos_?(D6000)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
 # Innostream
 Innostream:
   regex: 'INNO([a-z0-9]+)'
@@ -6939,6 +9704,14 @@ Insignia:
       model: '4K (2018)'
       device: 'tv'
 
+# INSYS (https://www.insys.pt/)
+INSYS:
+  regex: 'HK9-4010(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'HK9-4010'
+      model: 'HK9-4010'
+
 # Inq
 INQ:
   regex: 'INQ[/ ]'
@@ -6952,11 +9725,29 @@ INQ:
 
 # Intex
 Intex:
-  regex: 'Intex|(Aqua|Cloud[ _][XY][0-9]{1}|Cloud (?:Fame|Glory) 4G)'
-  device: 'smartphone'
-  models:
+  regex: 'Intex|(Aqua|Cloud[ _][XY][0-9]{1}|Cloud (?:Fame|Glory) 4G)|CLOUD TREAD|IM0318ND(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'IM0318ND'
+      model: 'Aqua Lions 3'
+    - regex: 'AQUA[ _]LIONS[ _]T1[ _]LITE(?:[);/ ]|$)'
+      model: 'Aqua Lions T1 Lite'
+    - regex: 'AQUA[ _]LIONS[ _]([NT]1|[23]|E3)(?:[);/ ]|$)'
+      model: 'Aqua Lions $1'
+    - regex: 'AQUA (A4) PLUS(?:[);/ ]|$)'
+      model: 'Aqua $1 Plus'
+    - regex: 'AQUA[ _](A4|S[13])(?:[);/ ]|$)'
+      model: 'Aqua $1'
+    - regex: 'AQUA CRYSTAL\+(?:[);/ ]|$)'
+      model: 'Aqua Crystal Plus'
+    - regex: 'AQUA FulVU e5(?:[);/ ]|$)'
+      model: 'Aqua Fulvu E5'
+    - regex: 'AQUA JEWEL 2(?:[);/ ]|$)'
+      model: 'Aqua Jewel 2'
     - regex: 'Intex[ _]([^/;]*)[ _]Build'
       model: '$1'
+    - regex: 'CLOUD TREAD(?:[);/ ]|$)'
+      model: 'Cloud Tread'
     - regex: '(Cloud (?:Fame|Glory) 4G)'
       model: '$1'
     - regex: '(Aqua|Cloud)[ _\.]([^/;\)]+)(?:[ _]Build|(?<!Build)/|\))'
@@ -7018,14 +9809,15 @@ iOcean:
     - regex: 'iOCEAN[ _\-]?([^);/ ]+)'
       model: '$1'
 
-# iView
+# iView (iviewus.com)
 iView:
-  regex: '733TPC'
-  device: 'smartphone'
+  regex: '(?:(?:733|730|766|930)TPC|769TPC(?:II)?|744TPC plus)(?:[);/ ]|$)'
+  device: 'tablet'
   models:
-    - regex: '733TPC'
-      device: 'tablet'
-      model: '733TPC'
+    - regex: '744TPC plus'
+      model: '744TPC Plus'
+    - regex: '((?:733|730|766|930)TPC|769TPC(?:II)?)(?:[);/ ]|$)'
+      model: '$1'
 
 # Impression
 Impression:
@@ -7048,22 +9840,100 @@ Impression:
 
 #iLife or i-life (lifedigital.com)
 iLife:
-  regex: '(ITELL_K3500N)(?:[);/ ]|$)'
+  regex: '(ITELL[_ ](?:K3300|K3500N?|K4700)|WTAB_714|WTAB 805)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # iTel
 iTel:
-  regex: 'itel|iNote'
+  regex: 'itel|iNote|GP10X2019(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'W6502'
+      device: 'phablet'
+      model: 'S16'
+    - regex: 'L6503'
+      device: 'phablet'
+      model: 'S16 Pro'
+    - regex: 'W5505'
+      model: 'A36'
+    - regex: 'A571W'
+      model: 'A37'
+    - regex: 'W6002E?'
+      model: 'S15'
+    - regex: 'W5005'
+      model: 'P15'
+    - regex: 'L5502'
+      model: 'A44 Air'
+    - regex: 'L5505'
+      model: 'A47'
+    - regex: 'W5006X'
+      model: 'A17'
+    - regex: 'L6006'
+      model: 'A48'
+    - regex: 'P651W'
+      model: 'P37'
+    - regex: 'P681L'
+      model: 'P37 Pro'
+    - regex: 'L5007'
+      model: 'A24'
+    - regex: 'L6003P'
+      model: 'A55 LTE'
+    - regex: 'L6002P'
+      model: 'S15 Pro'
+    - regex: 'L5006C'
+      model: 'A23 Pro'
+    - regex: 'L5002P'
+      model: 'A25 Pro'
+    - regex: 'L5002'
+      model: 'A25'
+    - regex: 'L5503'
+      model: 'A46'
+    - regex: 'W6004P'
+      model: 'A56 Pro'
+    - regex: 'L6004L'
+      model: 'AC60'
+    - regex: 'W4001'
+      model: 'AC13'
+    - regex: '[LW]6004'
+      model: 'A56 LTE'
+    - regex: 'W6001'
+      model: 'P33 Plus'
+    - regex: 'W5001P'
+      model: 'A33'
+    - regex: 'W6003'
+      model: 'A55'
+    - regex: 'A611W'
+      model: 'A57'
+    - regex: 'L6005'
+      model: 'Vision 1'
+    - regex: 'P651L'
+      model: 'Vision 2S'
+    - regex: 'L6501'
+      model: 'Vision 1 Plus'
+    - regex: 'L6502'
+      model: 'Vision 1 Pro'
+    - regex: 'GP10X2019'
+      model: 'GP10X2019'
     - regex: 'iNote ([^/;]*)Build'
       model: 'iNote $1'
     - regex: 'iNote_([a-z0-9\-_]+)'
       model: 'iNote $1'
-    - regex: 'itel-it(1512|1520)(?:[);/ ]|$)'
+    - regex: 'itel-it(1410|1512|1520)(?:[);/ ]|$)'
       model: 'it$1'
-    - regex: 'iTel ([^/;]*)Build'
+    - regex: 'itel-it1553(?:[);/ ]|$)'
+      model: 'Power Pro'
+    - regex: 'itel[- ](A14|A16 Plus|A44 Power|A23S|A52 Lite)'
+      model: '$1'
+
+    - regex: 'itel it1701'
+      device: 'tablet'
+      model: 'iNote Prime'
+    - regex: 'itel it170([23])'
+      device: 'tablet'
+      model: 'iNote Prime $1'
+
+    - regex: 'iTel ([^/;)]+)(?: Build|[;)])'
       model: '$1'
     - regex: 'iTel[_ ]([a-z0-9\-_]*)'
       model: '$1'
@@ -7080,7 +9950,7 @@ iZotron:
 
 # JAY-Tech
 JAY-Tech:
-  regex: 'TPC-[A-Z0-9]+|TPCY-TX[TE][^);/ ]+'
+  regex: '(?<!VIVAX )TPC-[A-Z0-9]+|TPCY-TX[TE][^);/ ]+'
   device: 'tablet'
   models:
     - regex: 'TPC-([A-Z0-9]+)'
@@ -7090,15 +9960,15 @@ JAY-Tech:
 
 # Jiayu
 Jiayu:
-  regex: 'JIAYU[ _-]|(?:JY-G4[\\_]G5|(?:JY-[a-z0-9]+))(?:[);/ ]|$)'
+  regex: 'JIAYU[ _-]|(?:JY-G4[\\_]G5|(?:JY-[a-z0-9]+)|JY_G4C)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:JIAYU G4_G5|JY-G4[\\_]G5)(?:[);/ ]|$)'
       model: 'G4/G5'
     - regex: 'JIAYU[ _-](G4[S]?|G2F|G3[S]?|S[23])(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(JY-[a-z0-9]+)(?:[);/ ]|$)'
-      model: '$1'
+    - regex: 'JY[-_]([a-z0-9]+|G4C)(?:[);/ ]|$)'
+      model: 'JY-$1'
 
 # Jolla
 Jolla:
@@ -7106,7 +9976,16 @@ Jolla:
   device: 'smartphone'
   model: ''
 
-# Just5
+# Juniper Systems (https://junipersys.com/)
+'Juniper Systems':
+  regex: 'Junipers/'
+  device: 'smartphone'
+  models:
+    - regex: 'Cedar#CT8'
+      device: 'tablet'
+      model: 'CT8'
+
+# Just5 (www.just5.com)
 Just5:
   regex: 'JUST5(-)?SPACER(s)?|COSMO[_ ](L707|L808)|BLASTER|FREEDOM[ _](C100|M303|X1)|Freedom'
   device: 'smartphone'
@@ -7128,13 +10007,34 @@ Just5:
     - regex: 'BLASTER'
       model: 'Blaster'
 
-# Kalley
+# Kalley (www.kalley.com.co)
 Kalley:
-  regex: 'ELEMENT Q'
-  device: 'smartphone'
-  models:
+  regex: 'KALLEY|(?:ELEMENT (?:4 Plus|MAX|Q)|ELEMENT_PRO_2|K-BOOK(?:8MG|73G)|SILVER_MAX|Silver Max (?:Lite|Pro)|Black G|ATV R[12])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Black G'
+      model: 'Black G'
+    - regex: 'Element 4 Plus'
+      model: 'Element 4 Plus'
+    - regex: 'ELEMENT MAX'
+      model: 'Element Max'
+    - regex: 'SILVER_MAX'
+      model: 'Silver Max'
+    - regex: 'Silver Max (Lite|Pro)'
+      model: 'Silver Max $1'
     - regex: 'ELEMENT Q'
       model: 'Element Q'
+    - regex: 'ELEMENT_PRO_2'
+      model: 'Element Pro 2'
+    - regex: 'K-BOOK(8MG|73G)'
+      device: 'tablet'
+      model: 'K-BOOK$1'
+    - regex: 'ATV (R[12])'
+      device: 'tv'
+      model: 'Android TV $1'
+    - regex: 'KALLEY,(55D1240)'
+      device: 'tv'
+      model: '$1'
 
 # Kaan
 Kaan:
@@ -7144,24 +10044,34 @@ Kaan:
 
 # Kazam
 Kazam:
-  regex: 'Kazam|Trooper_X[0-9][0-9](?:[);/ ]|$)|Tornado 348'
+  regex: 'Kazam|(?:Trooper_X[0-9][0-9]|Tornado 348|TROOPER 4\.0)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Tornado 348'
       model: 'Tornado 348'
     - regex: 'Thunder 450W'
       model: 'Thunder 450W'
+    - regex: 'TROOPER 4\.0'
+      model: 'Trooper X4.0'
     - regex: 'Trooper_X([0-9])([0-9])(?:[);/ ]|$)'
       model: 'Trooper X$1.$2'
     - regex: 'Kazam[; _]([^;/)]+)(?: Build|\))'
       model: '$1'
 
+# Kazuna (https://kazuna.co.jp/)
+Kazuna:
+  regex: 'KAZ-N20'
+  device: 'smartphone'
+  models:
+    - regex: 'KAZ-N20'
+      model: 'eTalk MYFLIX'
+
 # Keneksi
 Keneksi:
-  regex: 'KENEKSI|(Hemera|Teta Dual)(?:[);/ ]|$)'
+  regex: 'KENEKSI|(?:Hemera|Teta Dual|Helios)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(Hemera|Teta Dual)(?:[);/ ]|$)'
+    - regex: '(Hemera|Teta Dual|Helios)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'KENEKSI[ _-]liberty'
       model: 'Liberty'
@@ -7176,9 +10086,9 @@ Keneksi:
     - regex: 'KENEKSI[ _-](Moon|Libra_Dual|Glass|Amber|Chance|Amulet|Choice|Crystal|Dream|Delta[_ ]Dual|Norma 2|Norma|Sky|Fire 2|Fire|Flame|Flora|Rock|Solo|Soul|Step|Smart|Star|Storm|Wind)'
       model: '$1'
 
-# Kempler & Strauss
+# Kempler & Strauss (www.kemplerusa.com)
 'Kempler & Strauss':
-  regex: 'Alumini_?3_?Plus|Alumini ?[23]|KEMPLER_(TV|X)'
+  regex: 'Alumini_?3_?Plus|Alumini ?[23]|KEMPLER_(?:P1|TV|[X9]|8_PLUS)'
   device: 'smartphone'
   models:
     - regex: 'Alumini ?2'
@@ -7187,22 +10097,25 @@ Keneksi:
       model: 'Alumini 3 Plus'
     - regex: 'Alumini3'
       model: 'Alumini 3'
+    - regex: 'KEMPLER_P1'
+      model: 'P1'
     - regex: 'KEMPLER_TV'
       model: 'TV'
     - regex: 'KEMPLER_X'
       model: 'X'
+    - regex: 'KEMPLER_8_PLUS'
+      model: '8 Plus'
+    - regex: 'KEMPLER_9'
+      model: '9'
 
 # Kiano
 Kiano:
-  regex: 'Kiano|Elegance_[45]_[015](?:_PRO)?|CORE 10.1 DUAL 3G|Intelect ?(7|8|10)|Slim ?Tab ?\d+(?:[_ ]3GR?)?(?:[);/ ]|$)|Cavion[_ ]'
+  regex: 'Kiano|Elegance_[45]_[015](?:_PRO)?|Elegance 6|CORE 10.1 DUAL 3G|Intelect ?(7|8|10)|Slim ?Tab ?\d+(?:[_ ]3GR?)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Slim ?Tab ?(\d+)(?:[_ ]3GR?)?'
       model: 'Slim Tab $1'
       device: 'tablet'
-    - regex: 'Cavion[_ ](?:Base[_ ])?(\d+)'
-      model: 'Cavion Base $1'
-      device: 'tablet'
     - regex: 'CORE 10.1 DUAL 3G'
       model: 'CORE 10.1 DUAL 3G'
       device: 'tablet'
@@ -7210,12 +10123,20 @@ Kiano:
       model: 'Elegance $1.$2" Pro'
     - regex: 'Elegance_([45])_([015])'
       model: 'Elegance $1.$2"'
+    - regex: 'Elegance 6'
+      model: 'Elegance 6 5.85"'
     - regex: '(Kiano)?(Intelect|Elegance) ?(7|8|10)?'
       model: '$2 $3'
       device: 'tablet'
     - regex: 'Kiano[ _]([^;/]+) Build'
       model: '$1'
 
+# Kingbox
+Kingbox:
+  regex: 'Kingbox'
+  device: 'tv'
+  model: ''
+
 # Kingsun
 Kingsun:
   regex: 'Kingsun[ _-]'
@@ -7228,9 +10149,11 @@ Kingsun:
 
 # Kocaso
 Kocaso:
-  regex: 'Kocaso|M(?:729|7[357][026][hw]?|76[01236][bw]?|83[016]|8[567]0|1050s|106[012368]w?|1070|X736(?:-kit)?|X780)(?:[);/ ]|$)'
+  regex: 'Kocaso|M(?:6200|729|7[357][026][hw]?|76[01236][bw]?|83[016]|8[567]0|1050s|106[012368]w?|1070|X736(?:-kit)?|X780)(?:[);/ ]|$)'
   device: 'tablet'
   models:
+    - regex: 'M6200(?:[);/ ]|$)'
+      model: 'M6200'
     - regex: 'M729(?:[);/ ]|$)'
       model: 'M729'
     - regex: 'M(7[357][026])[hw]?(?:[);/ ]|$)'
@@ -7253,8 +10176,6 @@ Kocaso:
       model: 'M1070'
     - regex: 'MX736(?:-kit)?(?:[);/ ]|$)'
       model: 'MX736'
-    - regex: 'MX780(?:[);/ ]|$)'
-      model: 'MX780'
     - regex: 'Kocaso[ _\-]?([^;/]+) Build'
       model: '$1'
     - regex: 'Kocaso[ _\-]?([a-z0-9_-]+)'
@@ -7272,12 +10193,12 @@ Kogan:
 
 # Komu
 Komu:
-  regex: 'Komu[ -]'
+  regex: 'Komu[_ -]'
   device: 'smartphone'
   models:
-    - regex: 'Komu[ -]([^;/]+) Build'
+    - regex: 'Komu[_ -]([^;/]+) Build'
       model: '$1'
-    - regex: 'Komu[ -]([a-z0-9_-]+)'
+    - regex: 'Komu[_ -]([a-z0-9_-]+)'
       model: '$1'
 
 # Koobee
@@ -7308,23 +10229,30 @@ KT-Tech:
 
 # kddi
 KDDI:
-  regex: 'kddi-([a-z0-9]+)'
+  regex: 'kddi-([a-z0-9]+)|INFOBAR A01'
   device: 'feature phone'
-  model: '$1'
+  models:
+    - regex: 'kddi-([a-z0-9]+)'
+      model: '$1'
+    - regex: 'INFOBAR (A01)'
+      device: 'smartphone'
+      model: 'iida InfoBar $1'
 
 # Kodak
 Kodak:
-  regex: 'KODAK|IM5|Ektra(?:[);/ ]|$)'
+  regex: 'KODAK|(?:IM5|KD50|Ektra|Smartway[_ ](?:[FT]1|L2)|D55L|D60LX)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IM5'
       model: 'IM5'
+    - regex: '(KD50|D55L|D60LX)'
+      model: 'Seren $1'
     - regex: 'Ektra(?:[);/ ]|$)'
       model: 'Ektra'
-    - regex: 'KODAK_SMARTWAY_((M|T)1)'
+    - regex: '(?:KODAK[_ ])?SMARTWAY[_ ]L1 PRO'
+      model: 'Smartway L1 Pro'
+    - regex: '(?:KODAK[_ ])?SMARTWAY[_ ]([FLMTX]1|[LM]2|T3)'
       model: 'Smartway $1'
-    - regex: 'SMARTWAY X1'
-      model: 'Smartway X1'
     - regex: 'Tablet (7|10)'
       device: 'tablet'
       model: 'Tablet $1'
@@ -7347,25 +10275,35 @@ Koridy:
 
 # KRONO
 KRONO:
-  regex: 'NET1100'
+  regex: 'NET1100|NET_(?:TITAN|VOLT)'
   device: 'smartphone'
   models:
     - regex: 'NET1100'
       model: 'NET 1100'
+    - regex: 'NET_(TITAN|VOLT)'
+      model: 'NET $1'
 
 #k-touch
 K-Touch:
-  regex: 'K-?Touch[ _][a-z0-9]+'
+  regex: 'K-?Touch[ _][a-z0-9]+|Pace 2 Lite(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'Pace 2 Lite'
+      model: 'Pace 2 Lite'
     - regex: 'K-?Touch[ _]([^/;]*)[ _]Build'
       model: '$1'
     - regex: 'K-?Touch[ _]([a-z0-9]+)'
       model: '$1'
 
+# Diva
+Diva:
+  regex: '(QC-(?:703GN|704GA|803GN|1013G|7BHD))(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
 # kyocera (kyocera.co.jp, kyocera.com)
 Kyocera:
-  regex: 'Kyocera|KWC-|QC-|(?:NP501KC|503KC|602KC|705KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[12579]|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U?|KYV4[1-8]|KYV4[47][-_]u|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|704KC)(?:[);/ ]|$)'
+  regex: 'Kyocera|KWC-|QC-[0-9]{4}|(?:QC6035|NP501KC|302KC|503KC|602KC|705KC|901KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[1-9]|KYT3[123]|KYF3[123579]|KYF40|KYX31|KYG01|KYY2[1-4]|S2151|KC-S701|S[468]-KC|KYV40U?|KYV4[1-8]|KYV4[47]|KC-S301AE|X3-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|SZJ-JS201|KCP01K|[47]04KC|A001KC|WX10K|URBANO PROGRESSO|E7110|E6921)(?:[-_]u2?)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
@@ -7375,20 +10313,32 @@ Kyocera:
       model: 'One S4'
     - regex: 'S6-KC(?:[);/ ]|$)'
       model: 'One S6'
+    - regex: 'S8-KC(?:[);/ ]|$)'
+      model: 'One S8'
     - regex: 'C5155(?:[);/ ]|$)'
       model: 'Rise'
     - regex: '602KC(?:[);/ ]|$)'
       model: 'Digno G'
     - regex: '503KC(?:[);/ ]|$)'
       model: 'Digno E'
+    - regex: '404KC(?:[);/ ]|$)'
+      model: 'Digno C'
     - regex: '704KC(?:[);/ ]|$)'
       model: 'Digno J'
+    - regex: '302KC(?:[);/ ]|$)'
+      model: 'Digno T'
     - regex: 'NP501KC(?:[);/ ]|$)'
       model: 'Digno'
+    - regex: 'WX10K(?:[);/ ]|$)'
+      model: 'Digno Dual 2'
     - regex: 'KYV36(?:[);/ ]|$)'
       model: 'Digno Rafre'
+    - regex: '901KC(?:[);/ ]|$)'
+      model: 'Digno BX'
     - regex: 'KYV39(?:[);/ ]|$)'
       model: 'Miraie F'
+    - regex: 'KYX31(?:[);/ ]|$)'
+      model: 'Infobar XV'
     - regex: 'C5170(?:[);/ ]|$)'
       model: 'Hydro'
     - regex: 'C5215(?:[);/ ]|$)'
@@ -7407,12 +10357,16 @@ Kyocera:
       model: 'Hydro Reach'
     - regex: 'E6560[CT]'
       model: 'DuraForce'
-    - regex: 'E6810'
+    - regex: '(?:KYOCERA-)?E68[12]0'
       model: 'DuraForce Pro'
-    - regex: 'E6910'
+    - regex: '(?:KYOCERA-)?(?:E69[12]0|E6921)'
       model: 'DuraForce Pro 2'
+    - regex: 'E7110'
+      model: 'DuraForce Ultra 5G'
     - regex: 'KC-S701'
       model: 'Torque'
+    - regex: 'KYG01'
+      model: 'Torque 5G'
     - regex: 'KYL21(?:[);/ ]|$)'
       model: 'Digno S'
     - regex: 'KYL23(?:[);/ ]|$)'
@@ -7423,16 +10377,22 @@ Kyocera:
       model: 'Easy Mobile Phone'
     - regex: 'KYF35(?:[);/ ]|$)'
       model: 'Marvera'
+    - regex: 'KYF40(?:[);/ ]|$)'
+      model: 'Mamorino 5'
     - regex: 'KYF3[179](?:[);/ ]|$)'
       model: 'Gratina 4G'
     - regex: 'KYV48(?:[);/ ]|$)'
       model: 'Gratina KYV48'
+    - regex: 'KYF33(?:[);/ ]|$)'
+      model: 'Torque X01'
     - regex: 'KYV35(?:[);/ ]|$)'
       model: 'Torque G02'
     - regex: 'KYV41(?:[);/ ]|$)'
       model: 'Torque G03'
     - regex: 'KYV46(?:[);/ ]|$)'
       model: 'Torque G04'
+    - regex: 'KYV32?(?:[);/ ]|$)'
+      model: 'Basio'
     - regex: 'KYV47(?:-u)?(?:[);/ ]|$)'
       model: 'Basio 4'
     - regex: 'KYV43(?:[);/ ]|$)'
@@ -7441,9 +10401,9 @@ Kyocera:
       model: 'Kantan Sumaho'
     - regex: 'KYV37(?:[);/ ]|$)'
       model: 'Qua Phone'
-    - regex: 'KYV42(?:[);/ ]|$)'
+    - regex: 'KYV42(?:_u)?(?:[);/ ]|$)'
       model: 'Qua Phone QX'
-    - regex: 'KYV44(?:_u)?(?:[);/ ]|$)'
+    - regex: 'KYV44(?:_u2?)?(?:[);/ ]|$)'
       model: 'Qua Phone QZ'
     - regex: 'KYT33(?:[);/ ]|$)'
       model: 'Qua Tab QZ10'
@@ -7478,8 +10438,14 @@ Kyocera:
       model: 'Brigadier'
     - regex: 'E6782L(?:[);/ ]|$)'
       model: 'DuraScout'
-    - regex: '(KC-S301AE)(?:[);/ ]|$)'
+    - regex: 'KCP01K(?:[);/ ]|$)'
+      model: 'Luce'
+    - regex: '(KC-S301AE|SZJ-JS201)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'A001KC(?:[);/ ]|$)'
+      model: 'Katan Sumaho 2'
+    - regex: 'URBANO PROGRESSO(?:[);/ ]|$)'
+      model: 'Urbano Progresso'
 
     # explicit feature phone models
     - regex: 'S2151'
@@ -7490,25 +10456,35 @@ Kyocera:
       model: 'KZ $1'
     - regex: 'Kyocera(?:[\-/])?([a-z0-9]+)'
       model: '$1'
-    - regex: '(?:KWC|QC)-([a-z0-9]+)'
-      model: '$1'
+    - regex: '(KWC|QC)-?([a-z0-9]+)'
+      model: '$1-$2'
+
+# Mymaga (support.mymaga.eu)
+Mymaga:
+  regex: '(MOVE_S201)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
 
-# Krüger&Matz (Kruger&Matz)
+# Krüger&Matz or Kruger&Matz (www.krugermatz.com)
 Krüger&Matz:
-  regex: 'Kruger[ _&]Matz|KrugerMatz[ _]|MOVE_|LIVE4_KM043[89]|KM(?:106[67]|1065G|0701_1|0805_1)'
+  regex: 'Kruger[ _&]Matz|KrugerMatz[ _]|K&M|FLOW ?5PLUS|FLOW 4 PLUS|Flow 9|FLOW_5|FLOW7|FLOW6(?:S|Lite)|DRIVE9|DRIVE 8|DRIVE[_ ]6S?|MOVE8mini|MOVE9|MOVE_|LIVE_6plus|LIVE 5 PLUS|Live [89]|LIVE4_KM043[89]|LIVE 7S|Flow 7S|KM(?:106[679]|1065G|0701_1|0702|0805_1|1070)'
   device: 'smartphone'
   models:
+    - regex: 'MOVE8mini'
+      model: 'MOVE 8 Mini'
     - regex: 'MOVE_6_mini'
       model: 'MOVE 6 Mini'
-    - regex: 'MOVE[_ ]([78]|6S)'
+    - regex: 'MOVE[_ ]([78]|6S?)'
       model: 'MOVE $1'
     - regex: 'DRIVE 4 mini LTE'
       model: 'DRIVE 4 mini LTE'
-    - regex: 'DRIVE (4[S]?)(?:[);/ ]|$)'
+    - regex: 'DRIVE[ _]?([45689][S]?)(?:[);/ ]|$)'
       model: 'DRIVE $1'
-    - regex: 'Drive 5(?:[);/ ]|$)'
-      model: 'DRIVE 5'
-    - regex: 'FLOW (4[S]?)(?:[);/ ]|$)'
+    - regex: 'FLOW ?([54]) ?PLUS(?:[);/ ]|$)'
+      model: 'FLOW $1 Plus'
+    - regex: 'FLOW6Lite(?:[);/ ]|$)'
+      model: 'FLOW 6 Lite'
+    - regex: 'FLOW[ _]?([4-7][S]?|9)(?:[);/ ]|$)'
       model: 'FLOW $1'
     - regex: 'LIVE4_(KM043[89])(?:[);/ ]|$)'
       model: 'LIVE 4 $1'
@@ -7516,10 +10492,23 @@ Krüger&Matz:
       model: 'LIVE 4'
     - regex: '_LIVE5_(KM0450)(?:[);/ ]|$)'
       model: 'LIVE 5 $1'
-
-    - regex: 'KM(106[67])(?:[);/ ]|$)'
+    - regex: 'LIVE 5 PLUS(?:[);/ ]|$)'
+      model: 'LIVE 5 Plus'
+    - regex: 'LIVE_6plus(?:[);/ ]|$)'
+      model: 'LIVE 6 Plus' # KM0454
+    - regex: 'LIVE ([79])S(?:[);/ ]|$)'
+      model: 'LIVE $1S'
+    - regex: 'Live ([89])(?:[);/ ]|$)'
+      model: 'LIVE $1'
+    - regex: 'MOVE9(?:[);/ ]|$)'
+      model: 'MOVE 9'
+
+    - regex: 'KM(106[679])(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 10.1"'
+    - regex: 'KM(1070)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'EAGLE $1 10.5"'
     - regex: 'KM(1065G)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 10.1"'
@@ -7529,84 +10518,192 @@ Krüger&Matz:
     - regex: 'KM0(805)_1(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 8.0"'
+    - regex: 'KM0(702)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'EAGLE $1 7.0"'
+
+    - regex: 'K&M,([a-z0-9_ \-]+),(?:wired|wireless)'
+      model: '$1'
+      device: 'tv'
 
 # LAIQ
 LAIQ:
   regex: 'LAIQ'
   device: 'smartphone'
   models:
-    - regex: '(Glam|New York)'
+    - regex: '(Glam|New York|Dubai)(?:[);/ ]|$)'
       model: '$1'
 
 # AIS
 AIS:
-  regex: 'iris708'
+  regex: 'iris708|Kingcomm C500'
   device: 'smartphone'
   models:
     - regex: 'iris708'
       model: 'LAVA PRO 4.5'
+    - regex: 'Kingcomm C500'
+      model: 'Super Smart Plus X3'
+
+# Benco (www.bencomobile.com)
+Benco:
+  regex: 'Benco[_ ]|(?:AE9010|AE9950)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'AE9950'
+      model: 'V60'
+    - regex: 'AE9010'
+      model: 'V80'
 
-# Lava
+# Lava (Lavamobiles.com)
 Lava:
-  regex: 'Lava[ _]|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Z61_2GB|A97 IPS)(?:[);/ ]|$)'
+  regex: 'Lava[ _]|LAVA(?:A1|X10)|(?:DISCOVER136|KKT QUADRA)|iris(?! Plus 2021)[ _]?([^/;)]+)(?<!Plus 2021)(?: Build|[;)])|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair (?:[ZS]1|P8)|PixelV1|Pixel V2\+?|Z60s|Z61_2GB|A97 IPS|A97 2GB PLUS|L[EH]9920(?:[_ ]P)?|L[NEH]9910|LH9810|Ivory(?:S1|S4G)?|A76Plus|Grand2c|AH9910| A3_mini)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Flair Z1(?:[);/ ]|$)'
-      model: 'Flair Z1'
+    # explicit smartphone models
+    - regex: 'Flair ([ZS]1|P8)(?:[);/ ]|$)'
+      model: 'Flair $1'
+    - regex: 'AH9910(?:[);/ ]|$)'
+      model: 'Benco Y40'
+    - regex: 'LXX501(?:[);/ ]|$)'
+      model: 'Agni 5G'
+    - regex: 'Z61P(?:[);/ ]|$)'
+      model: 'Z61 Pro'
     - regex: 'A97 IPS(?:[);/ ]|$)'
       model: 'A97 IPS'
-    - regex: 'A67 Build'
-      model: 'A67'
-    - regex: 'A76 Build'
-      model: 'A76'
-    - regex: 'PixelV1(?:[);/ ]|$)'
-      model: 'Pixel V1'
-    - regex: 'X1 Selfie Build'
+    - regex: 'LF6810(?:[);/ ]|$)'
+      model: 'R5s Play'
+    - regex: 'A97 2GB PLUS(?:[);/ ]|$)'
+      model: 'A97 2GB Plus'
+    - regex: 'A76Plus(?:[);/ ]|$)'
+      model: 'A76 Plus'
+    - regex: ' A3_mini(?:[);/ ]|$)'
+      model: 'A3 Mini'
+    - regex: 'Pixel V2\+(?:[);/ ]|$)'
+      model: 'Pixel V2 Plus'
+    - regex: 'Pixel ?V([12])(?:[);/ ]|$)'
+      model: 'Pixel V$1'
+    - regex: 'X1 Selfie(?:[);/ ]|$)'
       model: 'Iris X1 Selfie'
-    - regex: 'X41 Plus Build'
+    - regex: 'X41 Plus(?:[);/ ]|$)'
       model: 'X41 Plus'
-    - regex: 'LAVA_A3'
-      model: 'A3'
+    - regex: '(?:LAVA[_ ]?)?A([13]|67|76)(?:[);/ ]|$)'
+      model: 'A$1'
     - regex: 'LAVA_R1'
       model: 'R1'
     - regex: 'Z61_2GB(?:[);/ ]|$)'
       model: 'Z61'
-    - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
+    - regex: 'LMX06(?:[);/ ]|$)'
+      model: 'Z6'
+    - regex: 'LMG01(?:[);/ ]|$)'
+      model: 'Z2'
+    - regex: 'LZG403(?:[);/ ]|$)'
+      model: 'Z3'
+    - regex: 'Z60s(?:[);/ ]|$)'
+      model: 'Z60s'
+    - regex: 'LE9920[ _]P(?:[);/ ]|$)'
+      model: 'V7'
+    - regex: 'LE9920(?:[);/ ]|$)'
+      model: 'Z53'
+    - regex: 'LH9910(?:[);/ ]|$)'
+      model: 'Z52'
+    - regex: 'LF9810(?:_2GB)?(?:[);/ ]|$)'
+      model: 'Z62'
+    - regex: 'LE9830(?:[);/ ]|$)'
+      model: 'Z93'
+    - regex: 'LH9810(?:[);/ ]|$)'
+      model: 'Iris 52'
+    - regex: 'LH9930(?:[);/ ]|$)'
+      model: 'Iris 54'
+    - regex: 'LE9930(?:[);/ ]|$)'
+      model: 'Iris 59'
+    - regex: 'LH9950(?:[);/ ]|$)'
+      model: 'Iris 46'
+    - regex: 'LN9910(?:[);/ ]|$)'
+      model: 'Z41'
+    - regex: 'LE9910(?:[);/ ]|$)'
+      model: 'V8'
+    - regex: 'LH9920(?:[);/ ]|$)'
+      model: 'V+6'
+    - regex: 'Grand2c'
+      model: 'Grand 2C'
+    # explicit feature phone models
+    - regex: 'DISCOVER136'
+      device: 'feature phone'
+      model: 'Discover 136'
+    - regex: 'KKT QUADRA'
+      device: 'feature phone'
+      model: 'KKT Quadra'
+    - regex: 'KKT40[ ]?Power[P\+]'
+      device: 'feature phone'
+      model: 'KKT40 Power Plus'
+    # explicit tablet models
+    - regex: 'Ivory(S1|S4G)?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Ivory $1'
+    # explicit general
+    - regex: 'iris[ _]?([^/;)]+)(?: Build|[);])'
       model: 'Iris $1'
-    - regex: 'Lava[ _]?([^/;]+)(?:/| Build)'
+    - regex: 'Lava[ _]?([^/;)]+)(?: Build|[);])'
+      model: '$1'
+    - regex: 'LAVA[ _]([^/;)]+)/MIDP'
+      device: 'feature phone'
       model: '$1'
 
+# SKG (skgmobile.net | skgmobile.com)
+SKG:
+  regex: '(Modern[ _](?:S10?|S[3679]))(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# iVA
+iVA:
+  regex: '(LAMCY (?:L3[05]0|C100|L400)|IVA S6)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'LAMCY (L3[05]0|C100|L400)(?:[);/ ]|$)'
+      model: 'Lamcy $1'
+    - regex: 'IVA S6(?:[);/ ]|$)'
+      model: 'S6'
+
 # Landvo
 Landvo:
   regex: 'XM[123]00|(?<!Blade )S6 Build'
   device: 'smartphone'
   models:
-    - regex: 'S6 Build'
+    - regex: 'S6 Build' # clone Galaxy S6
       model: 'S6'
     - regex: 'XM([123])00([^/;]*) Build'
       model: 'XM$100$2'
 
 # Land Rover
 Land Rover:
-  regex: 'Land[ ]?Rover[d]?[ _-](?:X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)|Polar3'
+  regex: 'Land[ ]?Rover[d]?[ _-](?:X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)|Polar3|Vphone[- ]X3'
   device: 'smartphone'
   models:
     - regex: 'Land[ ]?Rover[d]?[ _-](X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'Vphone[- ]X3'
+      model: 'Vphone X3'
     - regex: 'Polar3'
       model: 'Ioutdoor Polar 3'
 
-# lanix
+# iOutdoor
+iOutdoor:
+  regex: 'iOutdoor (X)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# lanix (lanix.com)
 Lanix:
-  regex: 'LANIX-([a-z0-9]+)|Ilium[ _]|X120C|Alpha 950'
+  regex: 'LANIX-([a-z0-9]+)|Ilium[ _]|IliumPad|X120C|Alpha 950'
   device: 'smartphone'
   models:
-    - regex: 'ILIUM[ _]PAD[ _]([^;/]+) Build'
+    - regex: 'ILIUM[ _]?PAD[ _]?([^;/]+)(?: Build|[;)])'
       model: 'Ilium Pad $1'
       device: 'tablet'
     - regex: 'X120C'
       model: 'Ilium X120C'
-    - regex: 'Ilium[ _](Alpha 3|L(?:200|6[12]0|9[125]0|1[0124]00|1050|1120)|LT5[012]0|M[13579]|S(?:106|520|6[27]0)|X(?:1[12]0|2[0126]0|5[12]0|500B|710))'
+    - regex: 'Ilium[ _](Alpha [15]s|Alpha [379]|Alpha 1T|L(?:200|6[12]0|9[0125]0|1[0124]00|1050|1120)|LT5[012]0|M[579]s|M7T|M[13579]|S(?:106|520|6[27]0)|X(?:1[12]0|2[0126]0|5[12]0|500B|710))(?:[);/ ]|$)'
       model: 'Ilium $1'
     - regex: 'ILIUM[ _]([^;/]+) Build'
       model: 'Ilium $1'
@@ -7618,7 +10715,7 @@ Lanix:
 
 # Lark
 Lark:
-  regex: '(Lark|Cumulus|Evolution|FreeMe|Ultimate (?:X4|7i))[ _-]|Build/Lark|Bjorn[_ ]SP-500'
+  regex: '(Lark|Cumulus|Evolution|FreeMe|Ultimate (?:X4|7i))[ _-]|Build/Lark|Bjorn[_ ]SP-500|FreeBird 5WiFi'
   device: 'tablet'
   models:
     - regex: 'Cumulus[ _](5\.5|[56])[ _]HD'
@@ -7630,13 +10727,17 @@ Lark:
       model: 'FreeMe X4 7HD 3G'
     - regex: 'FreeMe[ _]X2[ _]([7-9])'
       model: 'FreeMe X2 $1'
-    - regex: 'FreeMe X4[ _]7[_ ]HD'
+    - regex: 'FreeMe X4[ _]7[_ ]?HD'
       model: 'FreeMe X4 7HD'
     - regex: 'FreeMe X4[ _]9'
       model: 'FreeMe X4 9'
+    - regex: 'FreeMe X4 7'
+      model: 'FreeMe X4 7'
+    - regex: 'FreeBird 5WiFi'
+      model: 'FreeBird 5 WiFi'
     - regex: '(?:Lark[ _-])?Evolution[ _](X2 7 3G-GPS|X4[_ ]10\.1|10|X4[_ ]7[ _]IPS)'
       model: 'Evolution $1'
-    - regex: 'Ultimate (X4 10\.1 3G IPS|X4 8s 3G|7i)'
+    - regex: 'Ul(?:ti|it)mate (X4 10\.1 3G IPS|X4 8s 3G|7i)'
       model: 'Ultimate $1'
     - regex: 'PHABLET 7'
       model: 'Phablet 7'
@@ -7675,12 +10776,12 @@ LCT:
 
 # Leagoo
 Leagoo:
-  regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite 1|Venture 1)(?:[);/ ]|$)'
+  regex: '(?:MY)?LEAGOO[ _-]?|(?:XRover(?: C)?|Shark 5000|M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _](?:X|7s)|Alfa [125]|Elite [15]|Venture 1|Z10-E|M9 Pro|Power 5|Power[ _]2(?: Pro)?|Android 9.+ M1[23])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
-      model: 'M8 Pro'
-    - regex: 'LEAGOO[- _](Z[156]|M[58]|T1)(?:[);/ ]|$)'
+    - regex: '(?:LEAGOO[- _])?M([89])[_-]?Pro(?:[);/ ]|$)'
+      model: 'M$1 Pro'
+    - regex: 'LEAGOO[- _](Z[156]|Z5c|M[58]|T1)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'M5 EDGE'
       model: 'M5 Edge'
@@ -7690,13 +10791,27 @@ Leagoo:
       model: 'KICCAA Power'
     - regex: 'KIICAA MIX'
       model: 'KICCAA Mix'
-    - regex: 'Elite 1(?:[);/ ]|$)'
-      model: 'Elite 1'
+    - regex: 'Elite ([15])(?:[);/ ]|$)'
+      model: 'Elite $1'
+    - regex: 'Shark 5000(?:[);/ ]|$)'
+      model: 'Shark 5000'
+    - regex: 'Power 2 Pro(?:[);/ ]|$)'
+      model: 'Power 2 Pro'
+    - regex: 'Power[ _]([25])(?:[);/ ]|$)'
+      model: 'Power $1'
     - regex: 'Venture 1(?:[);/ ]|$)'
       model: 'Venture 1'
-
-    - regex: '(Leapad[ _]7s)'
+    - regex: 'Alfa ([125])(?:[);/ ]|$)'
+      model: 'Alfa $1'
+    - regex: 'XRover( C)?(?:[);/ ]|$)'
+      model: 'XRover$1'
+    - regex: '(?:LEAGOO[- _])?(Z10-E|M6|M1[23])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(?:My)?Leagoo[- _](E4)(?:[);/ ]|$)'
       model: '$1'
+
+    - regex: '(?:Leapad[ _])(7s|10|X)'
+      model: 'LeaPad $1'
       device: 'tablet'
 
 # Ledstar
@@ -7711,7 +10826,7 @@ Ledstar:
 
 # LeEco
 LeEco:
-  regex: 'Letv|LeEco|X[89]00\+(?:[);/ ]|$)|Le ?X[0-9][^;/]+|Le Max|Le [12]|X900 Build'
+  regex: 'Letv|LeEco|Le ?X[0-9][^;/]+|Le Max|Le [12]|Le2[_ ]x527|X900 Build|(?:X[89]00\+|X52[67])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'X800\+'
@@ -7724,8 +10839,12 @@ LeEco:
       model: '$1'
     - regex: 'X900 Build'
       model: 'Le X900'
-    - regex: 'Le ?X526 Build'
+    - regex: 'LEX72[07](?:[);/ ]|$)'
+      model: 'Le Pro 3'
+    - regex: '(?:Le ?X526|Le2[_ ]x527|Le 2|X52[67])(?:[);/ ]|$)'
       model: 'Le 2'
+    - regex: 'LEX82[09]'
+      model: 'Le Max 2'
     - regex: 'Le ?X([^;/]+) Build'
       model: 'Le X$1'
     - regex: 'Le ?X([^) ;/]+)'
@@ -7739,43 +10858,41 @@ LeEco:
     - regex: 'LeEco ([^;/]+) Build'
       model: '$1'
 
-# Leotec
-Leotec:
-  regex: 'LESPH501[14]|LESPH5003B|SUPERNOVA (Qi16|i3G96[X]?)'
-  device: 'smartphone'
-  models:
-    - regex: 'LESPH5011'
-      model: 'Argon e250'
-    - regex: 'LESPH5003B'
-      model: 'Argon A250B'
-    - regex: 'LESPH5014'
-      model: 'Krypton K150'
-    - regex: 'SUPERNOVA (Qi16|i3G96[X]?)'
-      device: 'tablet'
-      model: 'Supernova $1'
-
 # Lephone
 Lephone:
-  regex: 'lephone[ _]'
+  regex: 'lephone[ _]|lephoneP1'
   device: 'smartphone'
   models:
     - regex: 'lephone[ _](K7|K10)'
       device: 'feature phone'
       model: '$1'
-    - regex: 'lephone[ _](W(1[0125]|[279])|T2)(?:[);/ ]|$)'
+    - regex: 'lephone(?:[ _])?(W(1[0125]|[279])|T2|P1)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'lephone_W7_plus'
       model: 'W7 Plus'
 
 # lenco
 Lenco:
-  regex: 'Lenco ([^/;]*) Build'
+  regex: 'Lenco ([^/);]*)(?: Build|[);])'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'LENCO Diverso-700'
+      device: 'portable media player'
+      model: 'Diverso 700'
+    - regex: 'Lenco ([^/);]*)(?: Build|[);])'
+      model: '$1'
+
+# Aligator
+Aligator:
+  regex: 'ALIGATOR[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|S5540|RX510|S6[05]00|RX710|RX800|S5520)(?:[);/ ]|$)'
+      model: '$1'
 
-# lenovo
+# lenovo (lenovo.com)
 Lenovo:
-  regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:8504F|X304F|X704V|X704A)|A2107A-H|S6000|Z2 Plus|VIBE Z2|Vibe K5(?: Plus)?|P2A42|L18011|[5-8]01LV|Z2131|K350t|VIBE X2|K31-t3|TAB 2 A8-50LC)(?:[);/ ]|$)'
+  regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:X103F|8504F|X304F|X704V|X704A)|A5500-H|A2107A-H|A3500-HV|A2109A|S6000|Z2 Plus|Vibe[ _](?:P1|S6i Plus|S[23567]i|C|[ZX]2|K5(?: Plus)?|V7)|P2A42|L38011|L18011|[5-8]01LV|[67]02LV|Z2131|K350t|K31-t3|TAB 2 A8-50LC|S90-A|P70-A|VR-1541F|d-42A)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Lenovo ?G780'
@@ -7784,54 +10901,141 @@ Lenovo:
     - regex: 'Lenovo ?A3500-FL'
       model: 'IdeaTab A7-40'
       device: 'tablet'
-    - regex: 'Lenovo ?A3500-(H|HV|F)'
+    - regex: '(?:Lenovo ?)?A3500-(?:H|HV|F)'
       model: 'IdeaTab A7-50'
       device: 'tablet'
-    - regex: 'Lenovo ?A5500-[HF]'
+    - regex: '(?:Lenovo[ _])?A5500-[HF]'
       model: 'IdeaTab A8-50'
       device: 'tablet'
-    - regex: 'Lenovo ?A7600-[HF]'
+    - regex: 'Lenovo ?A7600'
       model: 'IdeaTab A10-70'
       device: 'tablet'
     - regex: 'A2107A-H'
       model: 'A2107'
       device: 'tablet'
+    - regex: 'A2109A'
+      model: 'IdeaTab A2109A'
+      device: 'tablet'
     - regex: 'TB2-X30[FL]'
       model: 'Tab 2 A10-30'
       device: 'tablet'
+    - regex: 'TB-X6C6[XF]'
+      model: 'Tab K10'
+      device: 'tablet'
     - regex: 'YT3-X50[FLM]'
       model: 'Yoga Tab 3'
       device: 'tablet'
+    - regex: 'YT-J706[XF]'
+      model: 'Yoga Tab 11'
+      device: 'tablet'
+    - regex: 'YT-K606F'
+      model: 'Yoga Pad Pro'
+      device: 'tablet'
     - regex: 'TB3-730X'
       model: 'TAB3 7'
       device: 'tablet'
     - regex: 'TB3-710[IF]'
       model: 'TAB3 7 Essential'
       device: 'tablet'
+    - regex: 'TB-7703X'
+      model: 'TAB3 7 Plus'
+      device: 'tablet'
+    - regex: 'TB3-X70L'
+      model: 'TAB3 10 Plus'
+      device: 'tablet'
+    - regex: 'TB-8703X'
+      model: 'TAB3 8 Plus'
+      device: 'tablet'
     - regex: 'TAB 2 A8-50LC'
       model: 'TAB2 A8-50LC'
       device: 'tablet'
     - regex: '501LV(?:[);/ ]|$)'
       model: 'TAB2 8.0"'
       device: 'tablet'
+    - regex: 'TAB 2 A10-70L(?:[);/ ]|$)'
+      model: 'TAB 2 A10'
+      device: 'tablet'
     - regex: '(?:TB3-850[FM]|601LV)(?:[);/ ]|$)'
       model: 'TAB3 8'
       device: 'tablet'
-    - regex: 'Lenovo TB-X304[FL]'
+    - regex: '602LV(?:[);/ ]|$)'
+      model: 'TAB3 8 Dual'
+      device: 'tablet'
+    - regex: 'TB-X304[FL]'
       model: 'TAB4 10'
       device: 'tablet'
-    - regex: '(?:TB-X704[VL]|701LV)(?:[);/ ]|$)'
+    - regex: 'TB-8504X'
+      model: 'TAB4 8'
+      device: 'tablet'
+    - regex: 'TB-8704X'
+      model: 'TAB4 8 Plus'
+      device: 'tablet'
+    - regex: '(?:TB-X704[FVL]|70[12]LV)(?:[);/ ]|$)'
       model: 'TAB4 10 Plus'
       device: 'tablet'
     - regex: '801LV(?:[);/ ]|$)'
       model: 'TAB5 10.1"'
       device: 'tablet'
+    - regex: 'TB-X103F(?:[);/ ]|$)'
+      model: 'TAB10 10.1"'
+      device: 'tablet'
     - regex: 'TB-X704A(?:[);/ ]|$)'
       model: 'Moto Tab'
       device: 'tablet'
     - regex: 'TB-X605F(?:[);/ ]|$)'
       model: 'Tab M10'
       device: 'tablet'
+    - regex: 'TB-X705[FL](?:[);/ ]|$)'
+      model: 'Tab P10'
+      device: 'tablet'
+    - regex: 'TB-J606[LF](?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Tab P11'
+    - regex: 'TB-J607F(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Tab QT K11 Pro WiFi'
+    - regex: 'TB-J616[XF](?:[);/ ]|$)'
+      model: 'Tab P11 Plus'
+      device: 'tablet'
+    - regex: 'TB-J706[LF](?:[);/ ]|$)'
+      model: 'Tab P11 Pro'
+      device: 'tablet'
+    - regex: 'TB-7104[IF](?:[);/ ]|$)'
+      model: 'Tab E7'
+      device: 'tablet'
+    - regex: 'TB-8304F1(?:[);/ ]|$)'
+      model: 'Tab E8'
+      device: 'tablet'
+    - regex: 'TB-7304'
+      model: 'Tab 7 Essential'
+      device: 'tablet'
+    - regex: 'TB-7504X(?:[);/ ]|$)'
+      model: 'Tab 7'
+      device: 'tablet'
+    - regex: 'PB-6505'
+      model: 'Tab V7'
+      device: 'tablet'
+    - regex: 'TB-X606[FXV]A?(?:[);/ ]|$)'
+      model: 'Tab M10 FHD Plus'
+      device: 'tablet'
+    - regex: 'TB-X605[FL]C'
+      model: 'Tab M10 FHD Rel'
+      device: 'tablet'
+    - regex: 'TB-X605'
+      model: 'Tab M10 FHD'
+      device: 'tablet'
+    - regex: 'Lenovo TB-X306'
+      model: 'Tab M10 HD'
+      device: 'tablet'
+    - regex: 'Lenovo TB-X505' # 2019
+      model: 'Tab M10'
+      device: 'tablet'
+    - regex: 'TB-7305[IXF](?:[);/ ]|$)'
+      model: 'Tab M7'
+      device: 'tablet'
+    - regex: 'TB-7306[XF](?:[);/ ]|$)'
+      model: 'Tab M7 (Gen 3)'
+      device: 'tablet'
     - regex: 'Lenovo ?B8000(-[FH])?'
       model: 'Yoga Tablet 10'
       device: 'tablet'
@@ -7856,6 +11060,15 @@ Lenovo:
     - regex: 'YT3-850M'
       model: 'Yoga Tab 3 10'
       device: 'tablet'
+    - regex: 'YT-X703L'
+      model: 'Yoga Tab 3 Plus'
+      device: 'tablet'
+    - regex: 'YT-X705[FL]'
+      model: 'Yoga Smart Tab'
+      device: 'tablet'
+    - regex: 'TB-J716F'
+      model: 'XiaoXin Pad Pro 11.5" (2021)'
+      device: 'tablet'
 
     - regex: 'S6000(?:[);/ ]|$)'
       model: 'IdeaTab S6000'
@@ -7869,25 +11082,28 @@ Lenovo:
     - regex: 'ThinkPad ?Tablet([^;/]*) Build'
       model: 'ThinkPad Tablet$1'
       device: 'tablet'
-    - regex: 'IdeaPad ?([^;/]*) Build'
-      model: 'IdeaPad $1'
-      device: 'tablet'
-    - regex: 'Lenovo TAB ?([^/;]*) Build'
-      model: 'TAB $1'
-      device: 'tablet'
     - regex: 'Lenovo ?A3300-(?:GV|H)'
       model: 'TAB 2 A7-30'
       device: 'tablet'
+    - regex: 'TAB 2 A7-30[HGD]C'
+      model: 'TAB 2 A7'
+      device: 'tablet'
     - regex: 'TB-8504F'
       model: 'TAB 4 8'
       device: 'tablet'
+    - regex: 'TB-8704F'
+      model: 'Tab 4 8" Plus'
+      device: 'tablet'
+    - regex: 'TB-X304X'
+      model: 'Tab 4 10.1"'
+      device: 'tablet'
     - regex: 'TB-X304F'
-      model: 'TAB 4 10'
+      model: 'TAB4 10'
       device: 'tablet'
-    - regex: 'Lenovo TB-X505F'
+    - regex: 'TB-X505[FX]'
       model: 'M10'
       device: 'tablet'
-    - regex: 'Lenovo TB-X104[FXL]'
+    - regex: 'TB-X104[FXL]'
       model: 'E10'
       device: 'tablet'
     - regex: 'Tab2A([0-9]-[0-9]{2}[a-z]?)'
@@ -7896,17 +11112,38 @@ Lenovo:
     - regex: 'IdeaTab[ \-_]?([a-z0-9]+)'
       model: 'IdeaTab $1'
       device: 'tablet'
+    - regex: 'YB-Q501F' # tablet/pc
+      model: 'Yoga A12'
+      device: 'tablet'
+    - regex: 'YT-X705X'
+      model: 'Yoga Smart Tab'
+      device: 'tablet'
     - regex: 'Yoga Tablet([^;/]+) Build'
       model: 'Yoga Tablet$1'
       device: 'tablet'
-    - regex: 'Lenovo TB\-X704F Build/NMF26F'
-      model: 'Tab 4 10 Plus'
+    - regex: 'TB-8505[FX]S'
+      model: 'Smart Tab M8'
+      device: 'tablet'
+    - regex: 'TB-8505[FX]|TB-8506F'
+      model: 'Tab M8'
+      device: 'tablet'
+    - regex: 'TB-8705[FX]'
+      model: 'Tab M8 FHD'
       device: 'tablet'
     - regex: 'Lenovo (TB[0-9]?\-[a-z0-9\-]+) Build'
       model: '$1'
       device: 'tablet'
+
     - regex: 'L18011(?:[);/ ]|$)'
       model: 'A5'
+    - regex: 'L18081(?:[);/ ]|$)'
+      model: 'A5s'
+    - regex: 'L19111(?:[);/ ]|$)'
+      model: 'A7'
+    - regex: 'L10041(?:[);/ ]|$)'
+      model: 'A8'
+    - regex: 'L78121(?:[);/ ]|$)'
+      model: 'Z6'
     - regex: 'Z2 Plus'
       model: 'Z2 Plus'
     - regex: 'Z2151'
@@ -7919,26 +11156,58 @@ Lenovo:
       model: 'ZUK $1'
     - regex: 'K10a40(?:[);/ ]|$)'
       model: 'C2'
-    - regex: 'k50a40(?:[);/ ]|$)'
+    - regex: '(?:k50a40|K50-t5)(?:[);/ ]|$)'
       model: 'K3 Note'
-    - regex: 'A7010a48(?:[);/ ]|$)'
+    - regex: 'K(1[30]) Note(?:[);/ ]|$)'
+      model: 'K$1 Note'
+    - regex: 'A7010(?:a48)?(?:[);/ ]|$)'
       model: 'K4 Note'
     - regex: 'K350t(?:[);/ ]|$)'
       model: 'K5'
-    - regex: 'A7020a4[08](?:[);/ ]|$)'
+    - regex: 'L38011(?:[);/ ]|$)'
+      model: 'K5 Play'
+    - regex: '(?:L38041|K5 Pro)(?:[);/ ]|$)'
+      model: 'K5 Pro'
+    - regex: 'L39051(?:[);/ ]|$)'
+      model: 'K10 Plus'
+    - regex: '(?:A7020a4[08]|L38012|K52e78)(?:[);/ ]|$)'
       model: 'K5 Note'
+    - regex: 'L19041(?:[);/ ]|$)'
+      model: 'A6 Note'
     - regex: 'K31-t3(?:[);/ ]|$)'
       model: 'K31'
+    - regex: 'A6010Pro(?:[);/ ]|$)'
+      model: 'A6010 Pro'
     - regex: '(?:A6020a46|Vibe K5 Plus)(?:[);/ ]|$)'
       model: 'Vibe K5 Plus'
     - regex: '(?:Lenovo-)?(?:A6020(?:a40|l36)|Vibe K5)(?:[);/ ]|$)'
       model: 'Vibe K5'
     - regex: 'VIBE Z2(?:[);/ ]|$)'
       model: 'Vibe Z2'
-    - regex: 'VIBE X2(?:[);/ ]|$)'
+    - regex: '(?:VIBE C|A2020a40)(?:[);/ ]|$)'
+      model: 'Vibe C'
+    - regex: '(?:VIBE X2)(?:[);/ ]|$)'
       model: 'Vibe X2'
+    - regex: 'X3(?:a40|c50)(?:[);/ ]|$)'
+      model: 'Vibe X3'
+    - regex: 'Lenovo X3 Lite(?:[);/ ]|$)'
+      model: 'Vibe X3 Lite'
+    - regex: 'VIBE V7(?:[);/ ]|$)'
+      model: 'Vibe V7'
+    - regex: 'VIBE S6i Plus(?:[);/ ]|$)'
+      model: 'Vibe S6i Plus'
+    - regex: 'VIBE[ _]S([23567])i(?:[);/ ]|$)'
+      model: 'Vibe S$1i'
+    - regex: 'L79031(?:[);/ ]|$)'
+      model: 'Legion Pro'
+    - regex: 'L70081(?:[);/ ]|$)'
+      model: 'Legion 2 Pro'
     - regex: 'k33a48(?:[);/ ]|$)'
       model: 'K6'
+    - regex: 'L38043(?:[);/ ]|$)'
+      model: 'K9'
+    - regex: 'L38082(?:[);/ ]|$)'
+      model: 'K11'
     - regex: 'P2A42(?:[);/ ]|$)'
       model: 'P2'
     - regex: 'k53a48(?:[);/ ]|$)'
@@ -7947,32 +11216,83 @@ Lenovo:
       model: 'K6 Power'
     - regex: 'P1ma40(?:[);/ ]|$)'
       model: 'Vibe P1m'
-    - regex: 'P1(?:a42|c72)(?:[);/ ]|$)'
+    - regex: 'Vibe P1 Turbo(?:[);/ ]|$)'
+      model: 'Vibe P1 Turbo'
+    - regex: '(?:P1(?:a42|c72)|Vibe P1)(?:[);/ ]|$)'
       model: 'Vibe P1'
     - regex: 'A2016a40(?:[);/ ]|$)'
       model: 'Vibe B'
     - regex: 'A1010a20(?:[);/ ]|$)'
       model: 'A Plus'
-    - regex: 'Z90a40(?:[);/ ]|$)'
+    - regex: '(?:Z90a40|Z90-7)(?:[);/ ]|$)'
       model: 'Vibe Shot'
     - regex: 'S1a40(?:[);/ ]|$)'
       model: 'Vibe S1'
+    - regex: 'S1La40(?:[);/ ]|$)'
+      model: 'Vibe S1 Lite'
     - regex: 'L78071(?:[);/ ]|$)'
       model: 'Z5s'
+    - regex: 'L78011(?:[);/ ]|$)'
+      model: 'Z5'
+    - regex: 'L78031(?:[);/ ]|$)'
+      model: 'Z5 Pro'
+    - regex: '(?:Z6 Pro|L78051)(?:[);/ ]|$)'
+      model: 'Z6 Pro'
+    - regex: 'L78032(?:[);/ ]|$)'
+      model: 'Z5 Pro GT'
+    - regex: 'L38111(?:[);/ ]|$)'
+      model: 'Z6 Youth'
     - regex: 'L58041(?:[);/ ]|$)'
       model: 'S5 Pro'
+    - regex: 'L58091(?:[);/ ]|$)'
+      model: 'S5 Pro GT'
     - regex: 'L18021(?:[);/ ]|$)'
       model: 'A3'
-    - regex: 'PB2-670M(?:[);/ ]|$)'
+    - regex: 'PB2-6(?:70M|50[YM])(?:[);/ ]|$)'
       model: 'Phab 2'
-    - regex: 'Lenovo ([^/;]*) Build'
+    - regex: 'PB1-750M(?:[);/ ]|$)'
+      model: 'Phab'
+    - regex: 'PB1-770M(?:[);/ ]|$)'
+      model: 'Phab Plus'
+    - regex: '(S90-A|P70-A)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'IdeaPad ?([^;/]*) Build'
+      model: 'IdeaPad $1'
+      device: 'tablet'
+    - regex: 'd-42A(?:[);/ ]|$)'
+      model: 'dtab Compact 42A' # NNT Docomo
+      device: 'tablet'
+
+    - regex: 'Lenovo K12 Pro'
+      model: 'K12 Pro'
+    - regex: 'Lenovo X2(?:-[ER]U)?'
+      model: 'X2'
+
+    - regex: 'VR-1541F'  # VR headset
+      device: 'wearable'
+      model: 'Mirage Solo'
+
+    - regex: 'LENOVO/81W8(?:[);/ ]|$)'
+      device: 'desktop'
+      model: 'IdeaPad S145-15IIL'
+    - regex: 'LENOVO/81MV(?:[);/ ]|$)'
+      device: 'desktop'
+      model: 'IdeaPad S145-15IWL'
+    - regex: 'LENOVO/81SS(?:[);/ ]|$)'
+      device: 'desktop'
+      model: 'Flex 14API 81SS'
+
+    - regex: 'Lenovo TAB ?([^/);]*)(?: Build|[;)])'
+      model: 'TAB $1'
+      device: 'tablet'
+    - regex: 'Lenovo ([^/);]*)(?: Build|[;)])'
       model: '$1'
     - regex: '(?:LNV-|Lenovo-)?Lenovo[ \-_]?([a-z0-9_+\-]+)'
       model: '$1'
 
-# Lexand
+# Lexand or LEXAND (lexand.ru)
 Lexand:
-  regex: '(?:SC7 PRO HD|S5A[1-4]|S4A[1-5]|S6A1|A811|A802)(?:[);/ ]|$)|Lexand ([^;/]+) Build'
+  regex: 'Lexand[ _]|(?:SC7 PRO HD|S5A[1-4]|S4A[1-5]|S6A1|A811|A802|LPH7_Smarty)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'A(811|802)'
@@ -8001,8 +11321,9 @@ Lexand:
       model: 'Antares'
     - regex: 'SC7 PRO HD'
       model: 'SC7 PRO HD'
-
-    - regex: 'Lexand ([^;/]+) Build'
+    - regex: 'LPH7_Smarty'
+      model: 'LPH7 Smarty'
+    - regex: 'Lexand[ _]([^;/)]+)(?: Build|[;)])'
       model: '$1'
 
 # lexibook
@@ -8059,15 +11380,31 @@ Lexibook:
     - regex: '(MFC[0-9]{3}[a-z]{2,})'
       model: '$1'
 
-# LG
+# LG (lg.com)
 LG:
-  regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LJK]|L-[45]1A|901LG|A001LG|802LG'
+  regex: 'LG|Web0S; Linux/SmartTV|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127])|G Watch)(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[05-8]|99[056]|(410|415|425|500|880)PP)|VS820|VS870 4G|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05[DE]|L-03K|L-01[LJK]|L-52A|L-[45]1A|901LG|A001LG|80[12]LG|402LG|LGT32|L-02K|L-01F|LM-V40|DM-01K|DM-02H|LMX130IM|VS810PP|VS425|VM670'
   device: 'smartphone'
   models:
-    - regex: 'LG-D325'
+    - regex: 'DM-(01K|02H)'
+      model: 'Disney Mobile DM-$1'
+    - regex: 'LG-D32[05]'
       model: 'L70'
+    - regex: 'LG-?(D315|L31L)'
+      model: 'F70'
+    - regex: 'LG-D4(?:[01]5|10)'
+      model: 'L90'
+    - regex: 'LG-D373'
+      model: 'L80'
     - regex: 'LG-D340F8'
       model: 'L70 Tri'
+    - regex: 'LG-D125'
+      model: 'L30'
+    - regex: 'LG-X145'
+      model: 'L60'
+    - regex: 'LG-X135'
+      model: 'L60i'
+    - regex: 'LG-D285'
+      model: 'L65'
     - regex: 'LM-X210APM'
       model: 'Phoenix 4'
     - regex: 'LG-P505R'
@@ -8076,15 +11413,29 @@ LG:
       model: 'Zone 4'
     - regex: 'LM-X220PM'
       model: 'Tribute Empire'
-    - regex: 'VS980'
+    - regex: 'LG-SP200'
+      model: 'Tribute Dynasty'
+    - regex: 'LGLS675'
+      model: 'Tribute 5'
+    - regex: 'LG-F570'
+      model: 'Band Play'
+    - regex: 'VS980|L-01F|LG-F320L|LG-D800'
       model: 'G2'
     - regex: 'LG-D6(?:18|20)'
       model: 'G2 Mini'
-    - regex: 'LG-D85[0125]|VS985'
+    - regex: 'LG-(?:D85[012568]|AS990)|VS985|LGLS990|LGL24(?:[);/ ]|$)'
       model: 'G3'
-    - regex: 'LG-D72[2458]'
+    - regex: 'LG-D722'
+      model: 'G3S'
+    - regex: 'LG-D693n?|LG-D690n'
+      model: 'G3 Stylus'
+    - regex: 'LG-(?:D72[23568]|F470K)'
       model: 'G3 Beat'
-    - regex: 'LG-H81[158]'
+    - regex: 'LG-F460'
+      model: 'G3 Cat. 6'
+    - regex: 'LG-D724'
+      model: 'G3s'
+    - regex: 'LG-?H81[012589]|LG-?[LU]S991|LGV32|LG-F500[LSK]|VS986'
       model: 'G4'
     - regex: 'LG-H525n?'
       model: 'G4c'
@@ -8094,155 +11445,301 @@ LG:
       model: 'G4s'
     - regex: 'LG-H735'
       model: 'G4 Beat'
-    - regex: 'LG-H8(?:20|30|5[08]|60)|VS987|RS988'
+    - regex: 'LG-H8(?:20|3[01]|5[08]|6[08])|VS987|(?:LG-)?RS988|LG-F700[SKL]|LG-?[LU]S992'
       model: 'G5'
     - regex: 'LG-H84[05]'
       model: 'G5 SE'
-    - regex: 'VS988|LG-H870DS'
+    - regex: 'VS988|LG-H87(?:[01](?:DS|[SI]|AR)?|[23])|LG-?US997|LGM-G600[SKL]|LG-[AL]S993'
       model: 'G6'
     - regex: 'LM-Q850'
       model: 'G7 Fit'
     - regex: 'LM-Q910'
       model: 'G7 One'
-    - regex: 'LM-G820(N|QM[0127]|UMB)?'
+    - regex: 'LGL23(?:[);/ ]|$)'
+      model: 'G Flex'
+    - regex: 'LG-H950'
+      model: 'G Flex 2'
+    - regex: 'LG-D68[06]'
+      model: 'G Pro Lite'
+    - regex: 'LM-G820([NV]|QM[0127]|UMB)?'
       model: 'G8'
+    - regex: 'LM-G850'
+      model: 'G8X ThinQ'
     - regex: 'LM-G810'
       model: 'G8S ThinQ'
     - regex: '901LG(?:[);/ ]|$)'
       model: 'G8X ThinQ'
-    - regex: 'VS501'
+    - regex: 'LG-H410(?:[);/ ]|$)'
+      model: 'Wine Smart H410'
+    - regex: 'VS501|LM-X120'
       model: 'K20'
-    - regex: '(?:LG-)?H502'
+    - regex: 'LGMS395'
+      model: 'F60'
+    - regex: 'LG-(?:F520K|H788)'
+      model: 'AKA'
+    - regex: 'LM-K920'
+      model: 'K92'
+    - regex: 'LGL41C'
+      model: 'Ultimate 2'
+    - regex: 'LGLS660'
+      model: 'Tribute'
+    - regex: '(?:LG-)?H50[02]'
       model: 'Magna'
+    - regex: 'LGL63BL'
+      model: 'Fiesta'
+    - regex: 'LG-(?:X15[05]|X165g)'
+      model: 'Bello 2'
+    - regex: 'LG-D33[15]'
+      model: 'L Bello'
+    - regex: 'LG-D29[05]'
+      model: 'L Fino'
     - regex: '(?:LG-)?H343'
       model: 'Risio'
     - regex: '(?:LG-)?H650'
       model: 'Zero'
     - regex: '(?:LG-)?M154'
       model: 'Risio 2'
+    - regex: 'LGM-K120[LSK]'
+      model: 'X300'
+    - regex: 'LG-K120(?:[);/ ]|$)'
+      model: 'Spree'
+    - regex: 'LGM-X401S'
+      model: 'X400'
+    - regex: 'LGM-X320[SKL]?(?:[);/ ]|$)'
+      model: 'X500'
+    - regex: 'LG-F620K'
+      model: 'Class'
     - regex: '(?:LG-)?P500H'
       model: 'Optimus One'
-    - regex: 'L-05D(?:[);/ ]|$)'
-      model: 'Optimus it L-05D'
+    - regex: 'LG-E975'
+      model: 'Optimus G'
+    - regex: 'LG-F240[KLS]'
+      model: 'Optimus G Pro'
+    - regex: 'LG-E435f'
+      model: 'Optimus L3 II'
+    - regex: 'LG-E4(?:70f|40|65f)'
+      model: 'Optimus L4 II'
+    - regex: 'LG-E467f'
+      model: 'Optimus L4 II Dual'
+    - regex: 'LG-E460'
+      model: 'Optimus L5 II'
+    - regex: 'LG-E4[17]5f'
+      model: 'Optimus L1 II'
+    - regex: 'LG-P875'
+      model: 'Optimus F5'
+    - regex: 'LGMS500'
+      model: 'Optimus F6'
+    - regex: '(L-05[DE])(?:[);/ ]|$)'
+      model: 'Optimus it $1'
     - regex: 'LG-L160L(?:[);/ ]|$)'
       model: 'Optimus LTE 2'
-    - regex: 'P713(?:[);/ ]|$)'
-      model: 'Optimus L7II'
+    - regex: '(?:P713|LG-P71[05])(?:[);/ ]|$)'
+      model: 'Optimus L7 II'
     - regex: 'L-01D(?:[);/ ]|$)'
       model: 'Optimus LTE L-01D'
     - regex: 'L-02D(?:[);/ ]|$)'
       model: 'PRADA phone L-02D'
     - regex: 'L-07C'
       model: 'Optimus Bright L-07C'
-    - regex: '(?:LG-)?F800(?:S|K|L)?'
+    - regex: '(?:LG-?)?(?:F800[SKL]?|H990|H910(?:PR)?|US996|V34|LS997)(?:[);/ ]|$)'
       model: 'V20'
     - regex: 'LM-Q710(?:\(FGN\)|[\.]?FGN)'
       model: 'Q Stylus Plus'
+    - regex: '801LG'
+      model: 'Q Stylus'
+    - regex: 'LG-M400'
+      model: 'Stylus 3'
+    - regex: 'LG-(?:K520|F720[SL])'
+      model: 'Stylus 2'
+    - regex: 'LG-(?:K53[05])'
+      model: 'Stylus 2 Plus'
     - regex: 'LM-Q[67]10\.FG(?:[);/ ]|$)'
       model: 'Q7'
-    - regex: 'LM-(Q725[KL]|Q610.FGN)(?:[);/ ]|$)'
+    - regex: 'LM-(Q72[57][KLS]|Q610.FGN)(?:[);/ ]|$)'
       model: 'Q7+'
-    - regex: 'LM-Q815[SL](?:[);/ ]|$)'
+    - regex: 'LM-Q815[KSL](?:[);/ ]|$)'
       model: 'Q8+'
-    - regex: 'LM-Q925L(?:[);/ ]|$)'
+    - regex: 'LGM-X800[KL]|LG-H970'
+      model: 'Q8'
+    - regex: 'LM-Q925[LKS](?:[);/ ]|$)'
       model: 'Q9'
+    - regex: 'LM-(?:Q730N|Q620)(?:[);/ ]|$)'
+      model: 'Q70'
+    - regex: 'LM-Q520N(?:[);/ ]|$)'
+      model: 'Q52'
     - regex: 'LGV33(?:[);/ ]|$)'
       model: 'Qua Phone PX'
     - regex: 'L-03K(?:[);/ ]|$)'
       model: 'Style'
     - regex: 'L-01L(?:[);/ ]|$)'
       model: 'Style 2'
+    - regex: 'LGLS775'
+      model: 'Stylo 2'
     - regex: 'VS835(?:[);/ ]|$)'
       model: 'Stylo 2 V'
+    - regex: 'LG-?(?:MS550|K550)'
+      model: 'Stylo 2 Plus'
     - regex: 'L-41A(?:[);/ ]|$)'
       model: 'Style 3'
-    - regex: 'LM-Q710|LML713DL'
+    - regex: 'LG-?(?:MS63[14]|H63[45])(?:[);/ ]|$)'
+      model: 'G Stylo'
+    - regex: 'LG-?(?:LS777|L84VL|M430|L83BL)(?:[);/ ]|$)'
+      model: 'Stylo 3'
+    - regex: 'LG-?([TM]P450)(?:[);/ ]|$)'
+      model: 'Stylo 3 Plus'
+    - regex: 'LM-Q710|LML713DL|LG-Q710[AP]L'
       model: 'Stylo 4'
-    - regex: 'LM-Q720'
+    - regex: '(?:LM-Q720|LGL722DL)(?:[);/ ]|$)'
       model: 'Stylo 5'
-    - regex: 'LM-G710(N|VM)?'
+    - regex: 'LM-Q730(?:[);/ ]|$)'
+      model: 'Stylo 6'
+    - regex: 'LM-G710(N|VM)?|LG-G710'
       model: 'G7 ThinQ'
+    - regex: 'LG-M153'
+      model: 'Fortune'
     - regex: 'LM-X210CM'
       model: 'Fortune 2'
-    - regex: 'LM-X410\.F(?:[);/ ]|$)'
+    - regex: 'LM-X410\.FG?(?:[);/ ]|$)'
       model: 'Premier Pro'
+    - regex: 'LGL455DL(?:[);/ ]|$)'
+      model: 'Premier Pro Plus'
     - regex: 'LML41[34]DL(?:[);/ ]|$)'
       model: 'Premier Pro LTE'
     - regex: 'LM-X525'
       model: 'Q60'
+    - regex: 'LM-K315IM'
+      model: 'W31'
+    - regex: 'LG-?L355DL'
+      model: 'K31'
+    - regex: 'LGL423DL'
+      model: 'Solo LTE'
+    - regex: 'LG-F820L'
+      model: 'U'
     - regex: 'LM-X210K'
       model: 'X2'
-    - regex: 'LG-K580'
+    - regex: 'LG-(?:K580|F690[LS])'
       model: 'X Cam'
+    - regex: 'LG-(?:SP320|M32[27])'
+      model: 'X Charge'
+    - regex: 'LG-K200|LGLS676'
+      model: 'X Style'
+    - regex: 'LG-F740L'
+      model: 'X Skin'
+    - regex: 'LG-(?:K500|F650)'
+      model: 'X Screen'
+    - regex: 'LG-(?:M710|H700|US701)'
+      model: 'X Venture'
     - regex: 'LM-X510WM'
       model: 'X Power 3'
     - regex: 'LM-X(?:41[05]K|410S)'
       model: 'X4'
     - regex: 'LM-X(415[LS]|410L)'
       model: 'X4+'
-    - regex: 'LM-X410\.FN'
+    - regex: 'LM-X410(?:\.FN|\(FG\))'
       model: 'K11'
-    - regex: 'LM-X(?:320|410[UP]M)'
+    - regex: 'LM-X(?:320|410[UP]M)|LGL322DL'
       model: 'K30'
+    - regex: 'LMX130IM'
+      model: 'W10'
+    - regex: 'LM-K310IM'
+      model: 'W11'
+    - regex: 'LM-X600IM'
+      model: 'W30 Pro'
+    - regex: 'LM-X440ZMW'
+      model: 'W30'
+    - regex: 'LM-K610IM'
+      model: 'W41'
+    - regex: 'LG-H522'
+      model: 'Prime Plus 4G'
+    - regex: 'LGL58VL'
+      model: 'Rabel 2'
+    - regex: 'LG-X190'
+      model: 'Ray'
+    - regex: 'LGLS740'
+      model: 'Volt'
     - regex: 'LM-X410'
       model: 'LM-X410'
+    - regex: 'LGM-K121'
+      model: 'X400'
+    - regex: 'LGM-X401L'
+      model: 'X401'
     - regex: 'LM-X420N'
       model: 'X4 (2019)'
-    - regex: 'LG-X230'
+    - regex: '(?:LG-X230|VS425)(?:[);/ ]|$)'
       model: 'K4'
+    - regex: 'LG-K130(?:[);/ ]|$)'
+      model: 'K4 LTE'
+    - regex: '(?:LG-?)?(?:M160|L57BL)(?:[);/ ]|$)'
+      model: 'K4 (2017)'
     - regex: 'LM-X420'
       model: 'K40'
+    - regex: 'LM-X430(?:[);/ ]|$)'
+      model: 'K40S'
+    - regex: 'LM-K410'
+      model: 'K41S'
     - regex: 'LG-X220'
       model: 'K5'
     - regex: 'LM-X540'
       model: 'K50S'
-    - regex: '802LG'
+    - regex: '(?:802LG|LM-X520)(?:[);/ ]|$)'
       model: 'K50'
+    - regex: '402LG'
+      model: 'Spray'
+    - regex: 'L-02K'
+      model: 'JoJo'
     - regex: '(?:LM-X510[KLS]|X5-LG)'
       model: 'X5'
     - regex: 'LM-X625N1'
       model: 'X6'
     - regex: 'LM-X625N'
       model: 'X6 (2019)'
-    - regex: 'LGMS210'
+    - regex: 'LGMS210|LG-M210'
       model: 'Aristo'
     - regex: 'LM-X210[G]?'
       model: 'Aristo 2'
-    - regex: 'LM-X220'
+    - regex: 'LM-X220(?:[);/ ]|$)'
       model: 'Aristo 3'
-    - regex: 'LM-V40(5|9N)'
+    - regex: 'LM-X220N(?:[);/ ]|$)'
+      model: 'X2 (2019)'
+    - regex: 'LM-V40(?:5|9N|5EBW)?(?:[);/ ]|$)'
       model: 'V40 ThinQ'
-    - regex: 'LM-V500N'
-      model: 'V50'
-    - regex: '(?:LG-)?(?:RS987|H901|H96[0128]|VS990)'
+    - regex: 'LM-(?:V500N?|V450)(?:[);/ ]|$)'
+      model: 'V50 ThinQ'
+    - regex: 'LM-V510N'
+      model: 'V50S ThinQ'
+    - regex: 'LM-Q920N'
+      model: 'Q92'
+    - regex: 'LM-Q927L'
+      model: 'Q9 One'
+    - regex: '(?:LG-)?(?:RS987|H90[01]|H96[0218]|VS990|F600[LK]|K428)'
       model: 'V10'
-    - regex: 'LG-X240'
+    - regex: 'LG-(?:X240|M200)'
       model: 'K8 (2017)'
+    - regex: 'LM-X220QMA'
+      model: 'K8s'
     - regex: '(?:LG-)?RS500'
       model: 'K8 4G'
     - regex: '(?:LG-)?VS500'
       model: 'K8 V'
-    - regex: 'LM-X212\(G\)'
+    - regex: 'LM-X212\(G\)|LGUS215'
       model: 'K8 (2018)'
-    - regex: '(?:LG-)?H91[058]'
-      model: 'V20'
-    - regex: '(?:LG-)?H990(?:DS|N|T)?'
-      model: 'V20'
-    - regex: '(?:LG-)?LS997'
+    - regex: '(?:LG-)?(?:VS995|F800K|US999|LS997|H91[058]|H990(?:DS|[NT])?)'
       model: 'V20'
-    - regex: '(?:LG-)?VS995'
-      model: 'V20'
-    - regex: '(?:LG-)?US999'
-      model: 'V20'
-    - regex: 'VS996'
+    - regex: '(?:VS996|LG-(?:H933|H93[012]|H930RE|H932PR|[LU]S998|AS998)|LGM-V300[KLS])(?:[);/ ]|$)'
       model: 'V30'
     - regex: 'L-01J(?:[);/ ]|$)'
       model: 'V20 Pro'
-    - regex: 'L-01K(?:[);/ ]|$)'
+    - regex: '(?:L-01K|LGV35|LG-H930DS)(?:[);/ ]|$)'
       model: 'V30 Plus'
     - regex: 'L-51A(?:[);/ ]|$)'
       model: 'V60'
-    - regex: 'A001LG(?:[);/ ]|$)'
+    - regex: '(?:L-52A|LM-G900(?:N|TM)?)(?:[);/ ]|$)'
+      model: 'Velvet 5G'
+    - regex: 'LM-V700N(?:[);/ ]|$)'
+      model: 'Velvet 2 Pro'
+    - regex: 'LM-G910'
+      model: 'Velvet 4G'
+    - regex: '(?:A001LG|LM-V600V?)(?:[);/ ]|$)'
       model: 'V60 ThinQ 5G'
     - regex: '(?:LG-)?VS410PP'
       model: 'Optimus Zone'
@@ -8252,31 +11749,57 @@ LG:
       model: 'Optimus Zone 2'
     - regex: '(?:LG-)?VS425PP'
       model: 'Optimus Zone 3'
-    - regex: '(?:LG-)?K100'
+    - regex: '(?:LG-?)?(?:K100|LS450)'
       model: 'K3'
-    - regex: '(?:LG-?)?(?:K|MS)33[02]'
+    - regex: 'LG-AS110'
+      model: 'K3 (2017)'
+    - regex: '(?:LG-?)?(?:K|MS)33[02]|LG-X210'
       model: 'K7'
     - regex: '(?:LG-?)?(?:K|MS)350'
       model: 'K8'
     - regex: 'VS500PP'
       model: 'K8 V'
-    - regex: '(?:LG-)?K420(?:N)?'
-      model: 'K10'
-    - regex: '(?:LG-)?K430(?:DS|DSF|DSY)?'
+    - regex: '(?:LG-?)?(?:K420(?:N)?|F670[KLS]?|K430(?:DS|DSF|DSY)?|K410|MS428)'
       model: 'K10'
     - regex: '(?:LG-)?M250N?'
       model: 'K10 (2017)'
-    - regex: '(?:LG-)?F670[KLS]?'
-      model: 'K10'
     - regex: '(?:LG-)?M255'
       model: 'K20'
     - regex: '(?:LG-?)?[MT]P260'
       model: 'K20 Plus'
-    - regex: '(?:LG-)?M700(?:N|A|DSK|AN)?'
+    - regex: 'LM-K200(?:[);/ ]|$)'
+      model: 'K22'
+    - regex: 'LM-K300(?:[);/ ]|$)'
+      model: 'K31'
+    - regex: 'LM-K420(?:[);/ ]|$)'
+      model: 'K42'
+    - regex: '(?:LM-K500|LGL555DL)(?:[);/ ]|$)'
+      model: 'K51'
+    - regex: 'LM-K510(?:[);/ ]|$)'
+      model: 'K51S'
+    - regex: 'LM-K520(?:[);/ ]|$)'
+      model: 'K52'
+    - regex: 'LM-K525(?:[);/ ]|$)'
+      model: 'K56'
+    - regex: 'LM-K526(?:[);/ ]|$)'
+      model: 'K56 Plus'
+    - regex: 'LM-Q510N(?:[);/ ]|$)'
+      model: 'Q51'
+    - regex: ' LM-Q310N(?:[);/ ]|$)'
+      model: 'Q31'
+    - regex: 'LM-Q630N?(?:[);/ ]|$)'
+      model: 'Q61'
+    - regex: '(?:LG-)?M700(?:N|A|DSK|AN)?|LGM-X600[SLK]|LG-M703|LG-US700'
       model: 'Q6'
-    - regex: 'LM-X440IM'
+    - regex: 'LM-X440'
       model: 'W30'
-    - regex: '(?:LG-?)?K220'
+    - regex: 'LGV36(?:[);/ ]|$)'
+      model: 'it'
+    - regex: 'LG-M257(?:[);/ ]|$)'
+      model: 'Harmony'
+    - regex: 'LM-K400(?:[);/ ]|$)'
+      model: 'Harmony 4'
+    - regex: '(?:LG-?)?(?:K220|LS755|F750K)'
       model: 'X Power'
     - regex: '(?:LG-?)?M320'
       model: 'X Power 2'
@@ -8286,35 +11809,78 @@ LG:
       model: 'Phoenix 3'
     - regex: '(?:LG-)?F100[SL]'
       model: 'Optimus Vu'
+    - regex: '(?:LG-)?VM670'
+      model: 'Optimus V'
     - regex: '(?:LG-)?P880'
       model: 'Optimus 4X HD'
-    - regex: '(?:LG-)?(H340n?|H324)'
+    - regex: '(?:LG-)?(H340n?|H32[04])'
       model: 'Leon'
-    - regex: '(?:LG-)?H342'
+    - regex: '(?:LG-)?H342|LGMS345'
       model: 'Leon 4G LTE'
-    - regex: '(?:LG-)?H422'
+    - regex: '(?:LG-)?H4(?:40|2[02])'
       model: 'Spirit'
     - regex: '(?:LG)?C660'
       model: 'Optimus Pro'
+    - regex: 'LGL158VL'
+      model: 'Rebel 3'
     - regex: 'LML21(?:1B|2V)L'
       model: 'Rebel 4'
     - regex: 'VS876'
       model: 'Lucid 3'
-    - regex: 'VS880(PP)?'
+    - regex: 'VS880(PP)?|LG-D690'
       model: 'G Vista'
+    - regex: 'VS820'
+      model: 'Lancet'
+    - regex: 'VS870 4G'
+      model: 'Lucid 2'
+    - regex: 'VS810PP'
+      model: 'Transpyre'
+    - regex: 'LG-D838'
+      model: 'G Pro 2'
+
+    - regex: 'LM-F100N?(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'WING'
 
-    - regex: 'LG-V490'
+    - regex: 'LM-T60[05]'
+      model: 'G Pad 5 10.1" FHD'
+      device: 'tablet'
+    - regex: 'LG-?(?:UK|V)410'
+      model: 'G Pad 7.0" LTE'
+      device: 'tablet'
+    - regex: 'LG-V533'
+      model: 'G Pad IV 8.0"'
+      device: 'tablet'
+    - regex: 'LG-?(?:LK430|V400)'
+      model: 'G Pad F 7.0"'
+      device: 'tablet'
+    - regex: 'LGLK430'
+      model: 'G Pad F 7.0"'
+      device: 'tablet'
+    - regex: 'LG-V49[56]'
+      model: 'G Pad F 8.0"'
+      device: 'tablet'
+    - regex: 'LG-V4[89]0'
       model: 'G Pad 8.0'
       device: 'tablet'
+    - regex: 'LGT01'
+      model: 'G Pad 8.0" LTE'
+      device: 'tablet'
     - regex: 'LG-V500'
       model: 'G Pad 8.3'
       device: 'tablet'
     - regex: 'LG-V700'
       model: 'G Pad 10.1'
       device: 'tablet'
+    - regex: 'LG-V497'
+      model: 'G Pad II 8.0"'
+      device: 'tablet'
     - regex: 'LG-V935'
       model: 'G Pad II 10.1'
       device: 'tablet'
+    - regex: 'LGT02'
+      model: 'G Pad III 8.0'
+      device: 'tablet'
     - regex: 'LG-V521'
       model: 'G Pad X 8.0'
       device: 'tablet'
@@ -8324,7 +11890,31 @@ LG:
     - regex: 'VK815'
       model: 'G Pad X 8.3'
       device: 'tablet'
+    - regex: 'LG-V520'
+      model: 'G Pad X 8.0"'
+      device: 'tablet'
+    - regex: 'LG-V530'
+      model: 'G Pad X2 8.0" Plus'
+      device: 'tablet'
+    - regex: 'LGT32'
+      model: 'Qua Tad PZ'
+      device: 'tablet'
+    - regex: 'LGT31'
+      model: 'Qua Tad PX'
+      device: 'tablet'
 
+    - regex: '\(LGE?, WEBOS[123], (?:wired|wireless)'
+      device: 'tv'
+      model: 'WebOS TV'
+    - regex: '\(LGE?, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: '$1'
+      device: 'tv'
+    - regex: 'Media/BP740'
+      model: 'BP740'
+      device: 'tv'
+    - regex: '47LA790W-ZA'
+      model: '47LA790W-ZA'
+      device: 'tv'
     - regex: 'webOS.TV'
       device: 'tv'
       model: 'WebOS TV'
@@ -8335,6 +11925,9 @@ LG:
     - regex: 'LG Watch Urbane'
       device: 'wearable'
       model: 'Watch Urbane'
+    - regex: 'G Watch( R)?'
+      device: 'wearable'
+      model: 'G Watch$1'
 
     # general detections
     - regex: '(LM-[A-Z]{1}[0-9]{3}([A-Z]{1,3})?)'
@@ -8348,6 +11941,8 @@ LG:
     - regex: 'LG[ _\-](V90.*|Optimus[ _\-]Pad.*) Build'
       device: 'tablet'
       model: '$1'
+    - regex: 'LGM-([^/;]*)( Build|[;)])'
+      model: '$1'
     - regex: 'LG(?:/|-LG| |-)?([^/;]*) Build'
       model: '$1'
     - regex: 'LG(?:/|-LG| |-)?([a-z0-9]+)'
@@ -8359,6 +11954,16 @@ LG:
     - regex: '(VX[0-9]+)'
       model: '$1'
 
+    - regex: 'Web0S; Linux/SmartTV'
+      device: 'tv'
+      model: ''
+
+# Lifemaxx
+Lifemaxx:
+  regex: 'LIFEMAXX, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
 # Lingwin
 Lingwin:
   regex: 'Lingwin[ _\-]'
@@ -8369,27 +11974,32 @@ Lingwin:
     - regex: 'Lingwin[ _\-]?([^);/ ]+)'
       model: '$1'
 
-# Logicom
+# Logicom (logicom-europe.com)
 Logicom:
-  regex: 'LOGICOM[_ ]|(TAB950|TAB1062|E731|E812|E912|E1031|POWER BOT|La Tab 72|(?:B|C|M|ID|VR)[ _]?BOT[ _]?(?:TAB[ _])?([0-9]+\+?)(?:PLUS)?|KT712A_4\.4|L-?IXIR[0-9]*|L-ITE|L-?EMENT|Le[ _]?(?:Hop|Lift|Hola|Moov[2]?|Fit FR|Smooth(?: FR)?))[_);/ ]'
+  regex: 'LOGICOM[_ ]|(TAB950|TAB1062|E731|E812|E912|E1031|POWER BOT|La[ _]Tab[ _](?:7[24]|10[57]|11[345])|(?:B|C|M|ID|VR)[ _]?BOT[ _]?(?:TAB[ _])?([0-9]+\+?)(?:PLUS)?|KT712A_4\.4|L-?IXIR[0-9]*|L-ITE|L-EGANTONE(?:-R)?|Le Fizz|L-?EMENT.+|Le[ _]?(?:Up|Connect|Hop|Hello|Lift|Hola|Moov[2]?|Must(?: 2)?|Starter L|Fit FR|Spark|Prime|Smooth(?: FR)?))[_);/ ]'
   device: 'tablet'
   models:
-    - regex: 'La Tab 72'
-      model: 'La Tab 72'
+    - regex: 'La[ _]Tab[ _](7[24]|10[57]|11[345]|105_P)(?:[);/ ]|$)'
+      model: 'La Tab $1'
     - regex: 'LOGICOM_LA_TAB_LINK_71'
       model: 'La Tab Link 71'
-    - regex: 'KT712A_4.4'
-      model: 'L-ixir Tab 701'
+    - regex: 'KT712A_4.4|L-IXIR TAB 701 3G'
+      model: 'L-ixir Tab 701 3G'
     - regex: 'LIXIR1041'
       model: 'L-ixir Tab 1041'
-    - regex: 'L-?IXIR TAB ([^;/]+) Build'
+    - regex: 'L-?IXIR[ _]TAB[ _]([^);/]+)( Build|[);])'
       model: 'L-ixir Tab $1'
+    - regex: 'L-ITE[ _](400M|452|50[46] HD|506R HD|552 HD)(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'L-ite $1'
     - regex: 'L-ITE[ _]([^;/]+) Build'
       model: 'L-ite Tab $1'
-    - regex: 'L-EMENT (400)(?:[);/ ]|$)'
+    - regex: 'L-?EMENT[ _]?(350|451|40[103]|55[013]|50[15]|500L?)(?:[);/ ]|$)'
       model: 'L-ement $1'
       device: 'smartphone'
-    - regex: 'L-?EMENT[ _](?:TAB)?([^;/]+) Build'
+    - regex: 'L-?EMENT[ _](?:TAB)[ )]?([^);/]+)(?: Build|[);])'
+      model: 'L-ement Tab $1'
+    - regex: 'L-?EMENT[ _]?(74[01])(?:[);/ ]|$)'
       model: 'L-ement Tab $1'
     - regex: '(TAB950|TAB1062|E731|E812|E912|E1031)(?:[);/ ]|$)'
       model: '$1'
@@ -8400,6 +12010,9 @@ Logicom:
     - regex: 'Le Lift'
       model: 'Le Lift'
       device: 'smartphone'
+    - regex: 'Le[ _]Connect'
+      model: 'Le Connect'
+      device: 'smartphone'
     - regex: 'Le Hola FR(?:[);/ ]|$)'
       model: 'Le Hola FR'
       device: 'smartphone'
@@ -8415,19 +12028,49 @@ Logicom:
     - regex: 'Le Fit FR(?:[);/ ]|$)'
       model: 'Le Fit FR'
       device: 'smartphone'
+    - regex: 'Le Fizz'
+      model: 'Le Fizz'
+      device: 'smartphone'
     - regex: 'Le Hop(?:[);/ ]|$)'
       model: 'Le Hop'
       device: 'smartphone'
+    - regex: 'Le[ _]Hello(?:[);/ ]|$)'
+      model: 'Le Hello'
+      device: 'smartphone'
     - regex: 'Le Smooth FR(?:[);/ ]|$)'
       model: 'Le Smooth FR'
       device: 'smartphone'
     - regex: 'Le Smooth(?:[);/ ]|$)'
       model: 'Le Smooth'
       device: 'smartphone'
+    - regex: 'Le Must 2(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Le Must 2'
+    - regex: 'Le Must(?:[);/ ]|$)'
+      model: 'Le Must'
+      device: 'smartphone'
+    - regex: 'Le Starter L(?:[);/ ]|$)'
+      model: 'Le Starter L'
+      device: 'smartphone'
+    - regex: 'Le[ _]Spark(?:[);/ ]|$)'
+      model: 'Le Spark'
+      device: 'smartphone'
+    - regex: 'Le[ _]Prime(?:[);/ ]|$)'
+      model: 'Le Prime'
+      device: 'smartphone'
+    - regex: 'L-EGANTONE-R'
+      model: 'L-Egant One R'
+      device: 'smartphone'
+    - regex: 'L-EGANTONE'
+      model: 'L-Egant One'
+      device: 'smartphone'
+    - regex: 'Le Up(?:[);/ ]|$)'
+      model: 'Le Up'
+      device: 'smartphone'
 
 # Konka
 Konka:
-  regex: 'KONKA[_ ]([a-z0-9]+)'
+  regex: 'KONKA[_ ]([a-z0-9]+)|(?: RE1)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # Explicit smartphone models
@@ -8439,30 +12082,40 @@ Konka:
       model: 'Expose $1'
     - regex: 'W990'
       model: 'Tuxedo 990'
+    - regex: '( RE1)(?:[);/ ]|$)'
+      model: '$1'
 
     - regex: 'KONKA[_ ]([a-z0-9]+)'
       device: 'feature phone'
       model: '$1'
 
-# Konrow
+# Konrow (konrow.com)
 Konrow:
-  regex: '(?:BIGCOOL|COOLFIVE|COOL-K|Just5|Link5)(?:[);/ ]|$)'
+  regex: '(?:BIGCOOL|COOLFIVE|COOL-K|Just5|Link5|EASY(?:5|62)|CITY55|Cool55|SKY_55_EEA)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'BIGCOOL(?:[);/ ]|$)'
       model: 'BigCool'
     - regex: 'COOL-K(?:[);/ ]|$)'
       model: 'Cool-K'
+    - regex: 'Cool55(?:[);/ ]|$)'
+      model: 'Cool 55'
     - regex: 'COOLFIVE(?:[);/ ]|$)'
       model: 'Cool Five'
     - regex: 'Just5(?:[);/ ]|$)'
       model: 'Just 5'
     - regex: 'Link5(?:[);/ ]|$)'
       model: 'Link 5'
+    - regex: 'EASY(5|62)(?:[);/ ]|$)'
+      model: 'Easy $1'
+    - regex: 'CITY55(?:[);/ ]|$)'
+      model: 'City 55'
+    - regex: 'SKY_55_EEA(?:[);/ ]|$)'
+      model: 'Sky 55'
 
-# Karbonn
+# Karbonn (karbonnmobiles.com)
 Karbonn:
-  regex: '(?:Browser-)?Karbonn|K9 Kavach 4G|K9 Music 4G|K9 Smart|K9 VIRAAT 4G|Aura Sleek Plus|Aura Note Play|Titanium (?:Vista 4G|Jumbo)'
+  regex: '(?:Browser-)?Karbonn|K9 Kavach 4G|K9[_ ](?:Viraat|Smart)[_ ]Plus|K9 Music 4G|K9 Smart|K9 VIRAAT 4G|Aura (?:Sleek Plus|Power 4G Plus|Note Play|Note 2)|Titanium[ _](?:3D-Plex|Octane Plus|Vista 4G|Jumbo|S360|S1[059]|S35|S20[13]|S22|S[15]|S200 HD|Frames S7|MOGHUL|S9)|MACHFIVE|MACHONE|K-lite F3|Sparkle V|Alfa A114 Quad|Quattro[ _]L(?:45|5[025])[ _](?:HD|IPS|VR)|A9 Indian|S2052GB'
   device: 'smartphone'
   models:
     - regex: 'K9 Kavach 4G'
@@ -8477,24 +12130,64 @@ Karbonn:
       model: 'K9 Smart Grand'
     - regex: 'K9 Smart Yuva'
       model: 'K9 Smart Yuva'
+    - regex: 'K9[_ ]Smart[_ ]Plus'
+      model: 'K9 Smart Plus'
     - regex: 'K9 Smart'
       model: 'K9 Smart'
+    - regex: 'A9 Indian'
+      model: 'A9 Indian'
+    - regex: 'K9[_ ]Viraat[_ ]Plus'
+      model: 'K9 Viraat Plus'
     - regex: 'Aura Sleek Plus'
       model: 'Aura Sleek Plus'
+    - regex: 'Aura Power 4G Plus'
+      model: 'Aura Power 4G Plus'
     - regex: 'Aura Note Play'
       model: 'Aura Note Play'
+    - regex: 'Aura Note 2'
+      model: 'Aura Note 2'
+    - regex: 'Alfa A114 Quad'
+      model: 'Alfa A114 Quad'
     - regex: 'karbonnK9 Viraat 4G|K9 VIRAAT 4G'
       model: 'K9 Viraat 4G'
+    - regex: 'MACHFIVE'
+      model: 'Mach Five'
+    - regex: 'MACHONEPLUS'
+      model: 'Titanium Mach One Plus'
+    - regex: 'MACHONE'
+      model: 'Titanium Mach One'
     - regex: 'Titanium[ _]S2[ _]Plus'
       model: 'Titanium S2 Plus'
-    - regex: 'Titanium_S99'
-      model: 'Titanium S99'
+    - regex: 'Titanium_S9Plus'
+      model: 'Titanium S9 Plus'
+    - regex: 'Titanium[_ ]S(99|360|1[059]|109|35|200 HD|20[13]|22|[15])(?:[);/ ]|$)'
+      model: 'Titanium S$1'
     - regex: 'Titanium Vista 4G'
       model: 'Titanium Vista 4G'
     - regex: 'Titanium Jumbo 2'
       model: 'Titanium Jumbo 2'
     - regex: 'Titanium Jumbo'
       model: 'Titanium Jumbo'
+    - regex: 'Titanium[ _]MOGHUL'
+      model: 'Titanium Moghul'
+    - regex: 'Titanium Frames S7'
+      model: 'Titanium Frames S7'
+    - regex: 'Titanium Octane Plus'
+      model: 'Titanium Octane Plus'
+    - regex: 'Titanium[ _]3D-Plex'
+      model: 'Titanium 3D Plex'
+    - regex: 'S2052GB'
+      model: 'Titanium S250 2GB'
+    - regex: 'K-lite F3'
+      model: 'K-Lite F3'
+    - regex: 'Sparkle V'
+      model: 'Sparkle V'
+    - regex: 'Quattro[ _]L(5[05])[ _]HD'
+      model: 'Quattro L$1 HD'
+    - regex: 'Quattro[ _]L(45)[ _]IPS'
+      model: 'Quattro L$1 IPS'
+    - regex: 'Quattro[ _]L(52)[ _]VR'
+      model: 'Quattro L$1 VR'
     - regex: 'Karbonn ([a-z0-9]+) WAP-Browser'
       model: '$1'
       device: 'feature phone'
@@ -8522,61 +12215,82 @@ Sagem:
       model: '$1'
     - regex: 'portalmmm/2.0 ((?:SG|my)[a-z0-9]+)'
       model: '$1'
+    - regex: 'DI384_UHD_TKC'
+      model: 'DI384'
+      device: 'tv'
+    - regex: 'DIW350_TP'
+      model: 'DIW350'
+      device: 'tv'
+    - regex: 'Sagemcom_Broadband_SAS,([a-z0-9_ \-]+),(?:wired|wireless)'
+      model: '$1'
+      device: 'tv'
 
 # Coby Kyros
 Coby Kyros:
-  regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742))(?:[);/ ]|$)'
+  regex: '(MID(?:1024|112[56]|1045|1048|106[05]|4331|701[26]|7015A?|70[32]2|703[56]|704[278]|7052|7065|7120|8024|80[47]2|8048|8065|8125|812[78]|9724|974[02]))(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
-# Mpman
+# Mpman (mpmaneurope.com)
 Mpman:
-  regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP100i OCTA|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)(?:[);/ ]|$)'
+  regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520|544|604)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP100i OCTA|MP(?:843|717|718|1010|7007|7008|843|888|959|969|QCG(1[01]|77)(?: 3G)?)|MGP7)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '((?:MPQC|MPDC)[0-9]+[^/;)]+)(?: Build|\))'
       model: '$1'
     - regex: 'MP100i OCTA(?:[);/ ]|$)'
       model: 'MP100i OCTA'
-    - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)(?:[);/ ]|$)'
+    - regex: 'MPQCG10(?: 3G)?(?:[);/ ]|$)'
+      model: 'MPQCG10 3G'
+    - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969|QCG(?:11|77))|MGP7)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(PH(?:150|340|350|360|451|500|520))'
+    - regex: '(PH(?:150|340|350|360|451|500|520|544|604))'
       model: '$1'
       device: 'smartphone'
 
-# Majestic
+# Majestic (www.newmajestic.com)
 Majestic:
-  regex: 'MAJESTIC[ _-]|CRONO ?[0-9]+|TAB (?:647|411) 3G|URANO 77LTE'
-  device: 'smartphone'
-  models:
-      - regex: 'URANO 77LTE(?:[);/ ]|$)'
-        model: 'Urano 77 LTE'
-      - regex: 'TAB (647|411) 3G'
-        model: 'Tab $1 3G'
-        device: 'tablet'
-      - regex: 'MAJESTIC[ _]Tab([^;/]+)Build'
-        model: 'Tab$1'
-        device: 'tablet'
-      - regex: 'MAJESTIC[ _]Tab([^);/]+)(?:[);/]|$)'
-        model: 'Tab$1'
-        device: 'tablet'
-      - regex: 'MAJESTIC[ _]([^;/]+)Build'
-        model: '$1'
-      - regex: 'MAJESTIC[ _]([^);/]+)(?:(?:[);/ ]|$)|$)'
-        model: '$1'
-      - regex: 'CRONO ?([0-9]+) Build'
-        model: 'Crono $1'
-      - regex: 'CRONO ?([0-9]+)(?:[);/]|$)'
-        model: 'Crono $1'
-
-# Manta Multimedia
+  regex: 'MAJESTIC[ _-]|CRONO ?[0-9]+|(?:TAB (?:647|411) 3G|TAB-714|TAB 711 4G|URANO 77LTE|PLUTO__?26N?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'URANO 77LTE(?:[);/ ]|$)'
+      model: 'Urano 77 LTE'
+    - regex: 'PLUTO__?(26N?)(?:[);/ ]|$)'
+      model: 'Pluto $1'
+    - regex: 'TAB (647|411) 3G'
+      model: 'Tab $1 3G'
+      device: 'tablet'
+    - regex: 'TAB 711 4G'
+      model: 'Tab 711 4G'
+      device: 'tablet'
+    - regex: 'TAB-714'
+      model: 'Tab 714 WiFi'
+      device: 'tablet'
+    - regex: 'MAJESTIC[ _]Tab([^;/]+)Build'
+      model: 'Tab$1'
+      device: 'tablet'
+    - regex: 'MAJESTIC[ _]Tab([^);/]+)(?:[);/]|$)'
+      model: 'Tab$1'
+      device: 'tablet'
+    - regex: 'MAJESTIC[ _]([^;/]+)Build'
+      model: '$1'
+    - regex: 'MAJESTIC[ _]([^);/]+)(?:(?:[);/ ]|$)|$)'
+      model: '$1'
+    - regex: 'CRONO ?([0-9]+) Build'
+      model: 'Crono $1'
+    - regex: 'CRONO ?([0-9]+)(?:[);/]|$)'
+      model: 'Crono $1'
+
+# Manta Multimedia or Manta
 Manta Multimedia:
-  regex: 'MSP950(1[45]|2[01])|MSP96017|((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
+  regex: 'MSP950(1[245]|2[01])|MSP96017|MSP94501|MSP95009|MSP96002|MSP450[79]|((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
+    - regex: 'MSP95012'
+      model: 'Titano 1'
     - regex: 'MSP95014'
       model: 'Titano 3'
     - regex: 'MSP95015'
@@ -8587,54 +12301,112 @@ Manta Multimedia:
       model: 'Rocky 3 Pro'
     - regex: 'MSP96017'
       model: 'Forto 2'
+    - regex: 'MSP96002'
+      model: 'Forto 1'
+    - regex: 'MSP94501'
+      model: 'Easy Selfie'
+    - regex: '(MSP450[79]|MSP95009)(?:[);/ ]|$)'
+      model: '$1'
 
 # Masstel
 Masstel:
-  regex: 'Masstel'
+  regex: 'Masstel|Juno[ _]Q[567]'
   device: 'smartphone'
   models:
-    - regex: 'Masstel[_ ](Juno[_ ]Q3|X9|N4[56]0|N5[2458]0|N536|M05|M1[29]0|M1[125]|M250|M25)(?:[);/ ]|$)'
+    - regex: '(?:Masstel[_ ])?(Juno[_ ]Q[3567]|X9|N4[56]0|N5[2458]0|N536|M05|M1[29]0|M1[125]|M250|M25)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Masstel[_ ]\((M18)\)'
       model: '$1'
     - regex: 'Masstel_Tab7LTE(?:[);/ ]|$)'
       model: 'Tab 7 LTE'
       device: 'tablet'
+    - regex: 'Masstel_Tab10_?4G(?:[);/ ]|$)'
+      model: 'Tab 10 4G'
+      device: 'tablet'
     - regex: 'Masstel Tab (840|700i)(?:[);/ ]|$)'
       model: 'Tab $1'
       device: 'tablet'
 
+# Mastertech (https://mastertechhome.com/)
+Mastertech:
+  regex: 'MASTERTECH,([a-z0-9_ \-]+),(?:wired|wireless)'
+  device: 'tv'
+  model: '$1'
+
 # Maxwest
 Maxwest:
-  regex: '(?:Astro_5N_LTE|Virtue Z5|Astro X55s|Nitro_4)(?:[);/ ]|$)'
-  device: 'smartphone'
-  models:
-    - regex: 'Astro_5N_LTE'
-      model: 'Astro 5N LTE'
+  regex: '(?:Astro[_ ](?:Phablet_9|55?N[_ ]LTE|5 PRO|5s|[45]P|X4|5_GO_LTE|X55s?|4\.5|4|X5)|Astro6|Virtue Z5|Nitro[_ ](?:4S?|55R|5[XRP]|[45] GO|4s LTE)|Gravity_55?_GO|Nitro_Phablet_9s)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Astro[_ ](55?)N[_ ]LTE'
+      model: 'Astro $1N LTE'
+    - regex: 'Astro[_ ]X55[_ ]LTE'
+      model: 'Astro X55 LTE'
+    - regex: 'Astro_5_GO_LTE'
+      model: 'Astro 5 Go LTE'
+    - regex: 'Astro 5 PRO'
+      model: 'Astro 5 Pro'
+    - regex: 'Astro[_ ](X55s?|5s|4|X[45]|[45]P)(?:[);/ ]|$)'
+      model: 'Astro $1'
+    - regex: 'Astro[_ ](4\.5)'
+      model: 'Astro $1"'
     - regex: 'Virtue Z5'
       model: 'Virtue Z5'
-    - regex: 'Astro X55s'
-      model: 'Astro X55s'
-    - regex: 'Nitro_4'
-      model: 'Nitro 4'
+    - regex: 'Astro (X55s?|5s)'
+      model: 'Astro $1'
+    - regex: 'Astro[_ ]X4'
+      model: 'Astro X4'
+    - regex: 'Nitro ([45]) GO'
+      model: 'Nitro $1 GO'
+    - regex: 'Nitro 4s LTE'
+      model: 'Nitro 4s LTE'
+    - regex: 'Nitro[ _]4s'
+      model: 'Nitro 4s'
+    - regex: 'Nitro[_ ](4|55R|5[XRP])'
+      model: 'Nitro $1'
+    - regex: 'Gravity_(55?)_GO'
+      model: 'Gravity $1 GO'
+
+    - regex: 'Astro6'
+      device: 'phablet'
+      model: 'Astro 6'
+
+    - regex: 'Nitro_Phablet_9s'
+      device: 'tablet'
+      model: 'Nitro Phablet 9s'
+    - regex: 'Astro_Phablet_9'
+      device: 'tablet'
+      model: 'Astro Phablet 9'
+
+# True Slim (ssbphones.com)
+True Slim:
+  regex: '(SSB-508[ED])(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
 
-# Maze
+# Maze Speed (ssbphones.com)
+Maze Speed:
+  regex: '(SSB-(?:500|508)|SSB408D|SSB504R)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SSB-?(500|508|408D|504R)(?:[);/ ]|$)'
+      model: 'SSB-$1'
+
+# Maze (mazephone.com)
 Maze:
-  regex: '(?:SSB-500|Alpha[_ ]X|Maze Alpha|SSB504R)(?:[);/ ]|$)'
+  regex: '(?:Alpha[_ ]X|Maze Alpha)(?:[);/ ]|$)|(?:Android [78].+ Blade|Comet)(?: Build|[;)])'
   device: 'smartphone'
   models:
-    - regex: 'SSB-500(?:[);/ ]|$)'
-      model: 'SSB-500'
-    - regex: 'SSB504R(?:[);/ ]|$)'
-      model: 'Speed'
     - regex: 'Alpha[_ ]X(?:[);/ ]|$)'
       model: 'Alpha X'
     - regex: 'Maze Alpha(?:[);/ ]|$)'
       model: 'Alpha'
+    - regex: '(Blade|Comet)(?:[);/ ]|$)'
+      model: '$1'
 
-# Mediacom
+# Mediacom (mediacomeurope.it)
 Mediacom:
-  regex: '(?:SmartPad7503G|M-SP10MXA|SmartPad970s2(?:3G)?|M[_-][MPS]P[0-9a-z]+|M-IPRO[0-9a-z]+)(?:[);/ ]|$)'
+  regex: '(?:SmartPad7503G|M-SP10MXA|M-PPAB500|SmartPad970s2(?:3G)?|M[_-][MPS]P[0-9a-z]+|M-IPRO[0-9a-z]+|1AEC|1AZ2[TP])(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'SmartPad7503G(?:[);/ ]|$)'
@@ -8644,53 +12416,73 @@ Mediacom:
     - regex: 'SmartPad970s2(?:[);/ ]|$)'
       model: 'SmartPad 970 S2'
     - regex: 'M-MP84[02]M(?:[);/ ]|$)'
-      model: 'SmartPad 8.0 Mobile'
+      model: 'SmartPad 8.0" Mobile'
     - regex: 'M-MP940M(?:[);/ ]|$)'
-      model: 'SmartPad 9.7 Mobile'
+      model: 'SmartPad 9.7" Mobile'
     - regex: 'M-SP10MXA(?:[);/ ]|$)'
-      model: 'SmartPad MX 10'
+      model: 'SmartPad MX 10.1"'
+    - regex: 'M-SP8MXA(?:[);/ ]|$)'
+      model: 'SmartPad MX 8.0"'
+    - regex: 'M-SP7HXAH(?:[);/ ]|$)'
+      model: 'SmartPad HX 7.0"'
+    - regex: 'M-SP8HXAH(?:[);/ ]|$)'
+      model: 'SmartPad HX 8.0" HD'
     - regex: 'M-MP(?:710|720|725|726|740)GOx?(?:[);/ ]|$)'
-      model: 'SmartPad 7.0 Go'
+      model: 'SmartPad 7.0" Go'
     - regex: 'M-MP876S2(?:[);/ ]|$)'
-      model: 'SmartPad 8.0 S2'
+      model: 'SmartPad 8.0" S2'
     - regex: 'M-MP8S2[AB]?3G(?:[);/ ]|$)'
-      model: 'SmartPad 8.0 S2 3G'
+      model: 'SmartPad 8.0" S2 3G'
     - regex: 'M-MP(101|102|860|875)S2[BW]?(?:[);/ ]|$)'
       model: 'SmartPad $1 S2'
     - regex: 'M-MP85S23G(?:[);/ ]|$)'
       model: 'SmartPad 875 S2 3G'
     - regex: 'M-SP1AGO3G'
       model: 'SmartPad 10 Go 3G'
+    - regex: 'M-SP7xGO3G'
+      model: 'SmartPad 10.1" iPro 3G'
+    - regex: '1AEC'
+      model: 'SmartPad 10 Eclipse'
     - regex: 'M-MP10[45][01]S2(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 S2'
+      model: 'SmartPad 10.1" S2'
     - regex: 'M-MP1S2[AB]3G(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 S2 3G'
+      model: 'SmartPad 10.1" S2 3G'
     - regex: 'M-MP8[24]S4(?:[);/ ]|$)'
-      model: 'SmartPad 8.0 S4'
+      model: 'SmartPad 8.0" S4'
     - regex: 'M-MP8S4[AB]3G(?:[);/ ]|$)'
-      model: 'SmartPad 8.0 S4 3G'
+      model: 'SmartPad 8.0" S4 3G'
     - regex: 'M-MP9S4A3G(?:[);/ ]|$)'
-      model: 'SmartPad 9.7 S4 3G'
+      model: 'SmartPad 9.7" S4 3G'
     - regex: 'M-MP1[02]S4(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 S4'
+      model: 'SmartPad 10.1" S4'
+    - regex: 'M-MP7S4A3G(?:[);/ ]|$)'
+      model: 'SmartPad 7.0" S4 HD'
     - regex: 'M-MP1040MC?(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 HD S4 3G'
+      model: 'SmartPad 10.1" HD S4 3G'
     - regex: 'M-MP1S4[AB]3G(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 S4 3G'
+      model: 'SmartPad 10.1" S4 3G'
+    - regex: 'M-SP10HXxH(?:[);/ ]|$)'
+      model: 'SmartPad 10.1" HX HD'
+    - regex: 'M-SP10MXHA(?:[);/ ]|$)'
+      model: 'SmartPad 10.1" MX'
+    - regex: 'M-SP10MXHL(?:[);/ ]|$)'
+      model: 'SmartPad 10.1" MX Lite'
     - regex: 'M-MP8PA3G(?:[);/ ]|$)'
-      model: 'SmartPad 8.0 HD Pro 3G'
+      model: 'SmartPad 8.0" HD Pro 3G'
     - regex: 'M-MP10PA(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 HD Pro'
+      model: 'SmartPad 10.1" HD Pro'
     - regex: 'M-MP10PA3G(?:[);/ ]|$)'
-      model: 'SmartPad 10.1 HD Pro 3G'
+      model: 'SmartPad 10.1" HD Pro 3G'
     - regex: 'M-IPRO([18][01]0)[BW](?:[);/ ]|$)'
-      model: 'SmartPad 8.0 HD iPro$1 3G'
+      model: 'SmartPad 8.0" HD iPro$1 3G'
+    - regex: '1AZ2[TP](?:[);/ ]|$)'
+      model: 'SmartPad 10.0" Azimut 2'
 
     - regex: '(?:M-MP75S23G|M-MP72[01]M)(?:[);/ ]|$)'
-      model: 'SmartPad 7.0 Mobile'
+      model: 'SmartPad 7.0" Mobile'
       device: 'phablet'
     - regex: 'M-MP7S2[ABDK]3G(?:[);/ ]|$)'
-      model: 'SmartPad 7.0 S2 3G'
+      model: 'SmartPad 7.0" S2 3G'
       device: 'phablet'
     - regex: 'M-MP5303G(?:[);/ ]|$)'
       model: 'SmartPad Mini Mobile'
@@ -8701,6 +12493,9 @@ Mediacom:
     - regex: 'M-PPAG550(?:[);/ ]|$)'
       model: 'PhonePad Duo G550'
       device: 'phablet'
+    - regex: 'M-PPAB500(?:[);/ ]|$)'
+      model: 'PhonePad Duo B500'
+      device: 'phablet'
     - regex: 'M-PP2G530(?:[);/ ]|$)'
       model: 'PhonePad Duo G530'
       device: 'phablet'
@@ -8720,6 +12515,9 @@ Mediacom:
       model: 'PhonePad Duo S551U'
       device: 'phablet'
 
+    - regex: 'M-PPAG4(?:[);/ ]|$)'
+      model: 'PhonePad Duo G4'
+      device: 'smartphone'
     - regex: 'M-PP[ABC]G500(?:[);/ ]|$)'
       model: 'PhonePad Duo G500'
       device: 'smartphone'
@@ -8729,36 +12527,42 @@ Mediacom:
     - regex: 'M[_-]PP[Ax]X(470|510|520)U(?:[);/ ]|$)'
       model: 'PhonePad Duo X$1U'
       device: 'smartphone'
-    - regex: 'M-PPxG(400|501)(?:[);/ ]|$)'
+    - regex: 'M-PPxG(400|501|[457][PM]?)(?:[);/ ]|$)'
       model: 'PhonePad Duo G$1'
       device: 'smartphone'
-    - regex: 'M-PPxS(470|501)(?:[);/ ]|$)'
+    - regex: 'M-PPxS(532[LU]|470|501|5P?|7P?)(?:[);/ ]|$)'
       model: 'PhonePad Duo S$1'
       device: 'smartphone'
+    - regex: 'M-PPxG(450)(?:[);/ ]|$)'
+      model: 'PhonePad Duo G$1'
+      device: 'smartphone'
 
     - regex: 'M-MP([0-9a-z]+)'
       model: 'SmartPad $1'
 
 # Medion
 Medion:
-  regex: 'Medion|(?:MD_)?LIFETAB|([SPX]10[0-9]{2}X|E10[45]1X|X5001|P851X|P850X)(?:[);/ ]|$)'
+  regex: 'Medion|(?:MD_)?LIFETAB|([SPX]10[0-9]{2}X|E10[45]1X|X5001|P851X|P850X|E691X|E1050X)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:MD_)?LIFETAB_([a-z0-9]+)'
+    - regex: '(?:MD_)?LIFETAB[_ ]([a-z0-9]+)'
       device: 'tablet'
       model: 'Lifetab $1'
-    - regex: '(E450[46]|E5004|S5004|X5001|E5020|P5015)(?:[);/ ]|$)'
+    - regex: '(E450[46]|E5004|S5004|X5001|E5020|P5015|P500[45]|X6001)(?:[);/ ]|$)'
       model: 'Life $1'
     - regex: '(B5530)(?:[);/ ]|$)'
       model: '$1'
     - regex: '(E10[45]1X)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
-    - regex: '([SPX]10[0-9]{2}X|P851X|P850X)(?:[);/ ]|$)'
+    - regex: '([SPX]10[0-9]{2}X|P851X|P850X|E691X|E1050X)(?:[);/ ]|$)'
       model: 'Lifetab $1'
       device: 'tablet'
     - regex: 'Medion(?: Smartphone)? ([^/;]+) Build'
       model: '$1'
+    - regex: 'MEDION, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+      device: 'tv'
 
 # MEEG
 MEEG:
@@ -8770,106 +12574,29 @@ MEEG:
     - regex: 'MEEG[ _\-]?([^);/ ]+)'
       model: '$1'
 
-# Meizu
-Meizu:
-  regex: 'Meizu|MZ-[a-z]|(M04[05]|MZ-16th(?: Plus)?|MZ-16[st]|M7[12]1C|M35[1356]|M612C|M578CA|M181[36]|M1822|M681C|M6T|MX[ -]?[2345](?: Pro)?|(?:MZ-)?m[1-6] note|M621C|M1852|M57[18]C|M3[ESX]|M031|m1 metal|M1 E|M2|M2 E|M5s Build|PRO 6|PRO 7-H|MZ-15 (?:Lite|Plus)|MZ-16 X)(?:[);/ ]|$)'
+# Fourel
+Fourel:
+  regex: '(?:EASYSMARTM3|EasySmart M2)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:MZ-)?M571C'
-      device: 'phablet'
-      model: 'M2 Note'
-    - regex: '(?:MZ-)?m([1-6]) note(?:[);/ ]|$)'
-      device: 'phablet'
-      model: 'M$1 Note'
-    - regex: 'M1 E(?:[);/ ]|$)'
-      model: 'M1E'
-    - regex: 'M2 E(?:[);/ ]|$)'
-      model: 'M2E'
-    - regex: '(?:MZ-)?M578C[A]?|M2(?:[);/ ]|$)'
-      model: 'M2'
-    - regex: 'M681C(?:[);/ ]|$)'
-      model: 'M3 Note'
-      device: 'phablet'
-    - regex: 'M621C(?:[);/ ]|$)'
-      model: 'M5 Note'
-      device: 'phablet'
-    - regex: 'M711C(?:[);/ ]|$)'
-      model: 'M6'
-    - regex: 'M721C(?:[);/ ]|$)'
-      model: 'M6 Note'
-      device: 'phablet'
-    - regex: 'M6T'
-      model: 'M6T'
-    - regex: 'M3E'
-      model: 'M3E'
-    - regex: 'M3S'
-      model: 'M3S'
-    - regex: 'M3X'
-      model: 'M3X'
-    - regex: 'M5S|M612C'
-      model: 'M5S'
-    - regex: '(M04[05]|MX[ -]?2)(?:[);/ ]|$)'
-      model: 'MX2'
-    - regex: '(M35[1356]|MX[ -]?3)(?:[);/ ]|$)'
-      model: 'MX3'
-    - regex: 'MX[ -]?4 Pro(?:[);/ ]|$)'
-      model: 'MX4 Pro'
-    - regex: 'MX[ -]?4(?:[);/ ]|$)'
-      model: 'MX4'
-    - regex: 'MX[ -]?5(?:[);/ ]|$)'
-      model: 'MX5'
-    - regex: 'm1 metal'
-      model: 'M1 Metal'
-    - regex: 'M1813(?:[);/ ]|$)'
-      model: 'M8'
-    - regex: 'M1816(?:[);/ ]|$)'
-      model: 'M8 Lite'
-    - regex: 'PRO 6'
-      model: 'PRO 6'
-    - regex: 'PRO 7-H(?:[);/ ]|$)'
-      model: 'PRO 7'
-    - regex: 'M031(?:[);/ ]|$)'
-      model: 'MX Dual Core'
-    - regex: 'M1852(?:[);/ ]|$)'
-      model: 'X8'
-    - regex: 'M1822(?:[);/ ]|$)'
-      model: 'Note 8'
-    - regex: 'MZ-16T(?:[);/ ]|$)'
-      model: '16T'
-    - regex: 'MZ-16th Plus(?:[);/ ]|$)'
-      model: '16th Plus'
-    - regex: 'MZ-15 Plus(?:[);/ ]|$)'
-      model: '15 Plus'
-    - regex: 'MZ-15 Lite(?:[);/ ]|$)'
-      model: '15 Lite'
-    - regex: 'MZ-16th(?:[);/ ]|$)'
-      model: '16th'
-    - regex: 'MZ-16 X(?:[);/ ]|$)'
-      model: '16X'
-    - regex: 'Meizu[_ ]note([89])(?:[);/ ]|$)'
-      device: 'phablet'
-      model: 'Note $1'
-
-    - regex: '(?:MZ-)?Meizu[_ ]([^/;]+) Build'
-      model: '$1'
-    - regex: '(?:MZ-)?Meizu[_ ]([a-z0-9_]+)'
-      model: '$1'
-    - regex: 'MZ-([^/;]+) Build'
-      model: '$1'
+    - regex: 'EASY ?SMART ?M([32])'
+      model: 'Easy Smart M$1'
 
 # Meitu
 Meitu:
-  regex: '(?:(?<!MI CC 9 )Meitu[2]?|MP1503|MP1512|MP160[235]|MP170[19]|MP171[138])(?:[);/ ]|$)'
+  regex: '(?:(?<!MI CC 9 )Meitu[2]?|MP1503|MP1512|MP160[235]|MP170[19]|MP171[138]|MP1801)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'MP1503(?:[);/ ]|$)'
       model: 'M6'
-    - regex: 'MP1512(?:[);/ ]|$)'
+    - regex: '(?:MP1512|Meizu M6s)(?:[);/ ]|$)'
       model: 'M6s'
     - regex: 'MP1602(?:[);/ ]|$)'
       model: 'T8'
     - regex: 'MP1605(?:[);/ ]|$)'
       model: 'V6'
+    - regex: 'MP1801(?:[);/ ]|$)'
+      model: 'V7'
     - regex: 'MP17(?:01|13)(?:[);/ ]|$)'
       model: 'T8s'
     - regex: 'MP1718(?:[);/ ]|$)'
@@ -8885,41 +12612,60 @@ Meitu:
 
 # Memup
 Memup:
-  regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}(?:[);/ ]|$)|SP704CE?'
+  regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}(?:[);/ ]|$)|SP704CE?|SP-NG708-3G'
   device: 'tablet'
   models:
     - regex: 'SlidePad ?([^;/]*) Build'
       model: 'SlidePad $1'
     - regex: 'SPNG([0-9]{2,4}[a-z]{0,2})(?:[);/ ]|$)'
       model: 'SlidePad NG$1'
+    - regex: 'SP-NG(708)-3G(?:[);/ ]|$)'
+      model: 'SlidePad NG$1 3G'
     - regex: 'SP704(CE?)'
       model: 'SlidePad 704$1'
 
-# Mecer
+# Mecer (mecer.co.za)
 Mecer:
-  regex: '(M785|800P3[12]C|101P51C|X1010)(?:[);/ ]|$)'
+  regex: '(M785|800P3[12]C|101P51C|X1010|M7[67]QF6|M17QF6_[43]G)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'M785(?:[);/ ]|$)'
       model: 'Xpress Smartlife M785'
     - regex: 'X1010(?:[);/ ]|$)'
       model: 'X1010'
+    - regex: 'M17QF6_([34])G(?:[);/ ]|$)'
+      model: 'M17QF6 $1G'
     - regex: '800P31C(?:[);/ ]|$)'
       model: 'Xpress Smartlife 800P31C'
     - regex: '800P32C(?:[);/ ]|$)'
       model: 'Xpress Smartlife 800P32C'
     - regex: '101P51C(?:[);/ ]|$)'
       model: 'Xpress Smartlife 101P51C'
+    - regex: 'M7([76])QF6(?:[);/ ]|$)'
+      model: 'Xpress Smartlife M7$1QF6'
+
+# Mione
+Mione:
+  regex: 'Mione[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'Hero (\d+)'
+      model: 'Hero $1'
+    - regex: 'Mione_Pro(?:[);/ ]|$)'
+      model: 'Pro'
 
 # mio
 Mio:
-  regex: 'MIO(?:/)?([a-z0-9]+)|MOBIX M6(?:[);/ ]|$)'
+  regex: 'MIO(?:/)?([a-z0-9]+)|(?:MOBIX M6|Mio TouchPad 7 Quad Core)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'MOBIX M6(?:[);/ ]|$)'
       model: 'Mobix M6'
     - regex: 'MIO(?:/)?([a-z0-9]+)'
       model: '$1'
+    - regex: 'Mio TouchPad 7 Quad Core'
+      device: 'tablet'
+      model: 'TouchPad 7 Quad Core'
 
 # Miray
 Miray:
@@ -8990,37 +12736,130 @@ Mobiola:
     - regex: 'Wave5'
       model: 'Wave 5'
 
-# Mobicel
+# Matrix
+Matrix:
+  regex: '(?:7116-A5|818 3G|MATRIX GRAVITY|Matrix7116)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'MATRIX GRAVITY'
+      device: 'smartphone'
+      model: 'Gravity'
+    - regex: '(7116-A5|818 3G)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Matrix7116(?:[);/ ]|$)'
+      model: '7116 A5'
+
+# Mobicel or Mobicell
 Mobicel:
-  regex: 'Mobicel_(R1)|Matrix'
+  regex: 'Mobicel_(R1)|ASTRO(?: Build|[;)]|$)|(?:Android 8.+ BEAM|FAME(?:_DS)?|CLIK|R7_1|HYPE|DANDY(?:_ZAM)?|(?<!SMADL )Matrix|VENUS_G|TRENDY PLUS|FENDY_DS|TANGO_LITE|BLINK|BERRY|BERRY[_ ]?(?:[12]|PLUS)|R1PLUS_1|ZOOM-H|REBEL|LEGEND MAX|HERO_DS|Switch[ _]GO|SWITCH1|PULSE_1|TRENDY 2|TRENDY_LITE|FEVER_PLUS_[HJ]|RIO_(?:SS|ZAM)|Clik plus|(PURE|Fendy) PLUS|Neo[ _]LTE|Titan_1|ZOOM_1|R4 LTE|NEO_1)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Matrix'
       model: 'Matrix'
+    - regex: 'LEGEND MAX'
+      model: 'Legend Max'
+    - regex: 'BLINK'
+      model: 'Blink'
+    - regex: 'BERRY1'
+      model: 'Berry 1'
+    - regex: 'BERRY 2'
+      model: 'Berry 2'
+    - regex: 'TRENDY 2'
+      model: 'Trendy 2'
+    - regex: 'BERRY[_ ]PLUS'
+      model: 'Berry Plus'
+    - regex: 'BERRY'
+      model: 'Berry'
+    - regex: 'TRENDY PLUS'
+      model: 'Trendy Plus'
+    - regex: 'TRENDY_LITE'
+      model: 'Trendy Lite'
+    - regex: 'R4 LTE'
+      model: 'R4 LTE'
+    - regex: 'HYPE'
+      model: 'Hype'
+    - regex: 'DANDY_ZAM'
+      model: 'Dandy Zam'
+    - regex: 'DANDY'
+      model: 'Dandy'
+    - regex: 'ASTRO'
+      model: 'Astro'
+    - regex: 'VENUS_G'
+      model: 'Venus Go'
+    - regex: 'TANGO_LITE'
+      model: 'Tango Lite'
+    - regex: 'FENDY_DS'
+      model: 'Fendy DS'
+    - regex: 'REBEL'
+      model: 'Rebel'
+    - regex: 'R7_1'
+      model: 'R7'
+    - regex: 'Titan_1'
+      model: 'Titan 1'
+    - regex: 'ZOOM_1'
+      model: 'Zoom 1'
+    - regex: 'HERO_DS'
+      model: 'Hero DS'
+    - regex: 'FAME_DS'
+      model: 'Fame DS'
+    - regex: 'FAME'
+      model: 'Fame'
+    - regex: 'BEAM'
+      model: 'Beam'
+    - regex: 'Neo[ _]LTE'
+      model: 'Neo LTE'
+    - regex: 'NEO_1'
+      model: 'Neo'
+    - regex: 'RIO_(SS|ZAM)'
+      model: 'Rio $1'
+    - regex: 'Switch[ _]GO'
+      model: 'Switch Go'
+    - regex: 'Switch1'
+      model: 'Switch'
+    - regex: 'R1PLUS_1'
+      model: 'R1 Plus'
+    - regex: 'Clik plus'
+      model: 'Clik Plus'
+    - regex: 'CLIK'
+      model: 'Clik'
+    - regex: 'PULSE_1'
+      model: 'Pulse 1'
+    - regex: 'PURE PLUS'
+      model: 'Pure Plus'
+    - regex: 'Fendy plus'
+      model: 'Fendy Plus'
     - regex: 'Mobicel_(R1)'
       model: '$1'
+    - regex: 'ZOOM-H'
+      device: 'tablet'
+      model: 'Zoom H'
+    - regex: 'FEVER_PLUS_([HJ])'
+      device: 'tablet'
+      model: 'Fever Plus $1'
 
 # Mobiistar
 Mobiistar:
-  regex: 'Mobiistar|Zumbo_|PRIME X MAX|X1 Notch|E1 Selfie'
+  regex: 'Mobiistar|Zumbo[ _]S|(?:PRIME X MAX|X1 (?:Notch|Dual)|E1 Selfie|XQ[_ ]Dual)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'X1 Notch(?:[);/ ]|$)'
-      model: 'X1 Notch'
+    - regex: 'X1 (Notch|Dual)(?:[);/ ]|$)'
+      model: 'X1 $1'
     - regex: 'E1 Selfie(?:[);/ ]|$)'
       model: 'E1 Selfie'
-    - regex: 'mobiistar_LAI_Zumbo Build'
+    - regex: 'XQ[_ ]Dual(?:[);/ ]|$)'
+      model: 'XQ Dual'
+    - regex: 'mobiistar_LAI_Zumbo(?:[);/ ]|$)'
       model: 'Zumbo'
-    - regex: 'Zumbo_S_2017 Build'
-      model: 'Lai Zumbo S (2017)'
-    - regex: 'Zumbo_S_2017_Lite Build'
+    - regex: 'Zumbo[_ ]S[_ ]2017[_ ]Lite(?:[);/ ]|$)'
       model: 'Lai Zumbo S Lite (2017)'
-    - regex: 'mobiistar ZUMBO S2( Dual)? Build'
+    - regex: 'Zumbo[_ ]S[_ ]2017(?:[);/ ]|$)'
+      model: 'Lai Zumbo S (2017)'
+    - regex: 'mobiistar ZUMBO S2( Dual)'
       model: 'Zumbo S2'
-    - regex: 'Mobiistar_LAI_Zumbo_J Build'
-      model: 'Lai Zumbo J'
-    - regex: 'Mobiistar_LAI_Zumbo_J_2017 Build'
+    - regex: 'Mobiistar_LAI_Zumbo_J_2017(?:[);/ ]|$)'
       model: 'Lai Zumbo J (2017)'
+    - regex: 'Mobiistar_LAI_Zumbo_J(?:[);/ ]|$)'
+      model: 'Lai Zumbo J'
     - regex: 'Mobiistar_Zumbo_J2'
       model: 'Lai Zumbo J2'
     - regex: 'Mobiistar[_ ]Zumbo[_ ]S2'
@@ -9043,9 +12882,9 @@ Mobiistar:
       model: 'Touch Lai 512'
     - regex: 'mobiistar LAI 504([KC])'
       model: 'Lai 504$1'
-    - regex: 'mobiistar LAI Y Build'
+    - regex: 'mobiistar LAI Y'
       model: 'Lai Y'
-    - regex: 'mobiistar PRIME X 2017 Build'
+    - regex: 'mobiistar PRIME X 2017'
       model: 'Prime X'
     - regex: 'mobiistar[ _]PRIME[ _](X1|558|X[ _]Plus|X[ _]Grand) Build'
       model: 'Prime $1'
@@ -9057,19 +12896,17 @@ Mobiistar:
       model: 'Kat 452'
     - regex: 'mobiistar_LAI_YOLLO Build'
       model: 'Lai Yollo'
-    - regex: 'Mobiistar[ _]([^;/]+) Build'
+    - regex: 'Mobiistar[ _]([^;/)]+)(?: Build|[;)])'
       model: '$1'
 
-# MSI
+# MSI (msi.com)
 MSI:
-  regex: 'Primo ?(?:91|76)|Enjoy 7 Plus'
+  regex: 'Primo ?(?:9[13]|81|76)|Enjoy 7 Plus'
   device: 'tablet'
   models:
     # explicit tablet models
-    - regex: 'Primo ?76'
-      model: 'Primo 76'
-    - regex: 'Primo ?91'
-      model: 'Primo 91'
+    - regex: 'Primo ?(9[13]|76|81)'
+      model: 'Primo $1'
     - regex: 'Enjoy 7 Plus'
       model: 'Enjoy 7 Plus'
 
@@ -9089,9 +12926,17 @@ Mobistel:
   device: 'smartphone'
   model: '$1'
 
+# MobiIoT (https://mobi-iot.com/)
+MobiIoT:
+  regex: 'MobiPrint 4\+(?:[);/ ]|$)'
+  device: 'peripheral'
+  models:
+    - regex: 'MobiPrint 4\+(?:[);/ ]|$)'
+      model: 'MobiPrint 4 Plus'
+
 # Mecool
 Mecool:
-  regex: '(?:KM9PRO|BB2 PRO|KII PRO|KM9_TV_BOX|M8SPROW|M8S (?:PLUS|PRO) (?:DVB|[LW]|PLUS)|M8S (?:MAX|PRO))(?:[);/ ]|$)'
+  regex: 'Mecool[ _-]|(?:KM9PRO|BB2 PRO|K[I]{1,3} PRO|KI PLUS|KM9_TV_BOX|M8SPROW|M8S (?:PLUS|PRO) (?:DVB|[LW]|PLUS)|M8S (?:MAX|PRO))(?:[);/ ]|$)'
   device: 'tv'
   models:
     - regex: 'KM9PRO(?:[);/ ]|$)'
@@ -9100,8 +12945,10 @@ Mecool:
       model: 'KM9 TV Box'
     - regex: 'BB2 PRO(?:[);/ ]|$)'
       model: 'BB2 Pro'
-    - regex: 'KII PRO(?:[);/ ]|$)'
-      model: 'KII Pro'
+    - regex: '(K[I]{1,3}) PRO(?:[);/ ]|$)'
+      model: '$1 Pro'
+    - regex: 'KI PLUS(?:[);/ ]|$)'
+      model: 'KI Plus'
     - regex: 'M8SPROW(?:[);/ ]|$)'
       model: 'M8S Pro W'
     - regex: 'M8S PLUS DVB(?:[);/ ]|$)'
@@ -9116,6 +12963,8 @@ Mecool:
       model: 'M8S Pro'
     - regex: 'M8S MAX(?:[);/ ]|$)'
       model: 'M8S Max'
+    - regex: 'Mecool[ _-]([^/);]+)(?: Build|[;)])'
+      model: '$1'
 
 # Modecom
 Modecom:
@@ -9145,9 +12994,23 @@ Mofut:
     - regex: 'Mofut[ _\-]?((?!Build)[^);/ ]+)'
       model: '$1'
 
+# BrightSign (brightsign.biz)
+BrightSign:
+  regex: 'BrightSign'
+  device: 'tv'
+  models:
+    - regex: '(HD1023|XD233|XD230|XD1030|XD1132|XT114[34]|4K1142|LS424)'
+      model: '$1'
+
+# Verssed
+Verssed:
+  regex: 'MotionE11(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'Motion E1.1'
+
 # motorola
 Motorola:
-  regex: 'MOT(?!TO)|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|XT1941-2|XT1924-9|XT1925-10|XT1965-6|XT1970-5|XT1799-2|XT1021|XT1710-08|XT180[3-5]|XT194[23]-1|XT1929-15|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\)|-0[1-5])?(?:[;]? Build|\))'
+  regex: 'MOT(?!TO)|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|XT1941-2|XT1924-9|XT1925-10|XT1965-6|XT1970-5|XT1799-2|XT1021|XT2071-4|XT2125-4|XT2143-1|XT2153-1|XT2201-2|XT2137-2|XT1710-08|XT180[3-5]|XT194[23]-1|XT1929-15|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\)|-0[1-5])?(?:[;]? Build|\))'
   device: 'smartphone'
   models:
     # Explicit feature phone models
@@ -9162,6 +13025,12 @@ Motorola:
       model: 'Motosmart ME'
     - regex: '(?:MOT-|Motorola-)?XT31[16]'
       model: 'Fire'
+    - regex: '(?:MOT-|Motorola-)?XT2125-4'
+      model: 'Edge S'
+    - regex: '(?:MOT-|Motorola-)?XT2143-1'
+      model: 'Edge 20'
+    - regex: '(?:MOT-|Motorola-)?XT2153-1'
+      model: 'Edge S Pro'
     - regex: '(?:MOT-|Motorola-)?XT32[01]'
       model: 'Defy Mini'
     - regex: '(?:MOT-|Motorola-)?XT3(?:89|90)'
@@ -9220,55 +13089,91 @@ Motorola:
       model: 'Droid RAZR D3'
     - regex: '(?:MOT-|Motorola-)?XT925'
       model: 'Droid RAZR HD'
-    - regex: '(?:MOT-|Motorola-)?XT102[12]'
+    - regex: '(?:MOT-|Motorola-)?(?:XT102[12]|XT830C)'
       model: 'Moto E'
+    - regex: 'Moto E \(XT2052DL\)'
+      model: 'Moto E (XT2052DL)'
     - regex: '(?:MOT-|Motorola-)?XT1706'
       model: 'Moto E3 Power'
+    - regex: 'MotoE2\(4G-LTE\)'
+      model: 'Moto E2 (4G-LTE)'
     - regex: '(?:MOT-|Motorola-)?XT1924-9'
       model: 'Moto E5 Plus'
+    - regex: 'moto e\(?([0-9])\)? plus'
+      model: 'Moto E$1 Plus'
+    - regex: 'Moto E([0-9]) Play'
+      model: 'Moto E$1 Play'
+    - regex: 'moto e6 \(XT2005DL\)'
+      model: 'Moto E6 (XT2005DL)'
+    - regex: 'moto e5 cruise(?:[);/ ]|$)'
+      model: 'Moto E5 Cruise'
+    - regex: 'moto e5 supra(?:[);/ ]|$)'
+      model: 'Moto E5 Supra'
+    - regex: 'Moto E5 go(?:[);/ ]|$)'
+      model: 'Moto E5 Go'
+    - regex: 'Moto E\(?(\di?)\)? Power(?:[);/ ]|$)'
+      model: 'Moto E$1 Power'
+    - regex: 'Moto E\(?([567]i?)\)?(?:[);/ ]|$)'
+      model: 'Moto E$1'
+    - regex: 'Moto E\(?([567])s\)?(?:[);/ ]|$)'
+      model: 'Moto E$1s'
+    - regex: 'Moto E(?: Build|[;)])'
+      model: 'Moto E'
     - regex: '(?:MOT-|Motorola-)?XT1030'
       model: 'Droid Mini'
+    - regex: '(?:MOT-|Motorola-)?XT1565'
+      model: 'Droid Maxx 2'
     - regex: '(?:MOT-|Motorola-)?XT1096'
       model: 'Moto X2'
     - regex: '(?:MOT-|Motorola-)?XT1254'
       model: 'Droid Turbo'
-    - regex: 'moto g power'
-      model: 'Moto G Power'
-    - regex: 'moto g\(([0-9])\) power'
-      model: 'Moto G$1 Power'
-    - regex: 'moto g\(([0-9])\) plus'
-      model: 'Moto G$1 Plus'
-    - regex: '(?:MOT-|Motorola-)?XT10(?:28|3[1234]|68|69)'
+    - regex: '(?:MOT-|Motorola-)?XT10(?:28|3[12349]|68|69)'
       model: 'Moto G'
-    - regex: '(?:MOT-|Motorola-)?XT1799-2'
-      model: 'Moto G5s'
-    - regex: '(?:MOT-|Motorola-)?XT180[3-5]'
+    - regex: '(?:MOT-|Motorola-)?g\(?(\d+)\)? 5G'
+      model: 'Moto G$1 5G'
+    - regex: '(?:MOT-|Motorola-)?XT1609'
+      model: 'Moto G4 Play'
+    - regex: '(?:MOT-|Motorola-)?XT180[3-5]|Moto G ?5S Plus|Moto G \(5S\) Plus'
       model: 'Moto G5s Plus'
+    - regex: '(?:MOT-|Motorola-)?XT1799-2|Moto G \(5S\)'
+      model: 'Moto G5s'
     - regex: '(?:MOT-|Motorola-)?XT168[57]'
       model: 'Moto G5 Plus'
-    - regex: '(?:MOT-|Motorola-)?XT1670' #XT1671 XT1677
+    - regex: '(?:MOT-|Motorola-)?XT167[06]' #XT1671 XT1677
       model: 'Moto G5'
     - regex: '(?:MOT-|Motorola-)?XT1925-10'
       model: 'Moto G6'
     - regex: '(?:MOT-|Motorola-)?XT1965-6'
       model: 'Moto G7 Plus'
+    - regex: 'XT2137-2'
+      model: 'Moto G50'
     - regex: '(?:MOT-|Motorola-)?XT10(?:49|5[23568]|60|9[23457])'
       model: 'Moto X'
-    - regex: '(?:MOT-|Motorola-)?XT1562'
+    - regex: '(?:MOT-|Motorola-)?XT156[234]|Moto X Play(?:[);/ ]|$)'
       model: 'Moto X Play'
     - regex: '(?:MOT-|Motorola-)?XT1572'
       model: 'Moto X Style'
+    - regex: '(?:MOT-|Motorola-)?XT1575'
+      model: 'Moto X Pure Edition'
+    - regex: '(?:MOT-|Motorola-)?XT158[01]'
+      model: 'Moto X Force'
     - regex: '(?:MOT-|Motorola-)?XT1080'
       model: 'Droid Ultra'
-    - regex: '(?:MOT-|Motorola-)?XT1650-05'
+    - regex: '(?:MOT-|Motorola-)?XT1585'
+      model: 'Droid Turbo 2'
+    - regex: '(?:MOT-|Motorola-)?XT1650(?:-05)?'
       model: 'Moto Z'
+    - regex: 'moto z4(?:[);/ ]|$)'
+      model: 'Moto Z4'
+    - regex: 'Moto Z3 Play(?:[);/ ]|$)'
+      model: 'Moto Z3 Play'
     - regex: '(?:MOT-|Motorola-)?XT1635(?:-0[1-3])?'
       model: 'Moto Z Play'
     - regex: '(?:MOT-|Motorola-)?XT1710-(?:-0[28])?'
       model: 'Moto Z2 Play'
-    - regex: '(?:MOT-|Motorola-)?XT1789-05'
+    - regex: '(?:MOT-|Motorola-)?XT1789-05|Moto Z2 Force(?:[);/ ]|$)'
       model: 'Moto Z2 Force'
-    - regex: '(?:MOT-|Motorola-)?XT1929-15'
+    - regex: '(?:MOT-|Motorola-)?XT1929-15|moto z3(?:[);/ ]|$)'
       model: 'Moto Z3'
     - regex: '(?:MOT-|Motorola-)?XT1663'
       model: 'Moto M'
@@ -9278,27 +13183,144 @@ Motorola:
       model: 'P30 Play'
     - regex: '(?:MOT-|Motorola-)?XT1942-1'
       model: 'P30 Note'
-    - regex: '(?:MOT-|Motorola-)?XT1970-5'
+    - regex: '(?:MOT-|Motorola-)?edge plus'
+      model: 'Edge Plus'
+    - regex: 'XT2201-2'
+      model: 'Edge X30'
+    - regex: '(?:MOT-|Motorola-)?edge 20 fusion'
+      model: 'Edge 20 Fusion'
+    - regex: '(?:MOT-|Motorola-)?edge 20 lite'
+      model: 'Edge 20 Lite'
+    - regex: '(?:MOT-|Motorola-)?edge 20 pro'
+      model: 'Edge 20 Pro'
+    - regex: '(?:MOT-|Motorola-)?edge 5G UW \(2021\)'
+      model: 'Edge 5G UW (2021)'
+    - regex: '(?:MOT-|Motorola-)?edge (\d+)'
+      model: 'Edge $1'
+    - regex: '(?:MOT-|Motorola-)?edge \(2021\)'
+      model: 'Edge (2021)'
+    - regex: '(?:MOT-|Motorola-)?edge'
+      model: 'Edge'
+    - regex: '(?:MOT-|Motorola-)?one vision plus'
+      model: 'One Vision Plus'
+    - regex: '(?:MOT-|Motorola-)?(?:XT1970-5|one vision)'
       model: 'One Vision'
+    - regex: '(?:MOT-|Motorola-)?one power'
+      model: 'One Power'
+    - regex: '(?:MOT-|Motorola-)?one hyper'
+      model: 'One Hyper'
     - regex: '(?:MOT-|Motorola-)?one zoom'
       model: 'One Zoom'
+    - regex: '(?:MOT-|Motorola-)?one fusion\+'
+      model: 'One Fusion Plus'
+    - regex: '(?:MOT-|Motorola-)?one fusion'
+      model: 'One Fusion'
     - regex: 'motorola one action'
       model: 'One Action'
+    - regex: 'motorola one macro'
+      model: 'One Macro'
+    - regex: 'motorola one 5G UW ace'
+      model: 'One 5G UW Ace'
+    - regex: 'motorola one 5G UW'
+      model: 'One 5G UW'
+    - regex: 'motorola one 5G ace'
+      model: 'One 5G Ace'
+    - regex: 'motorola one vision'
+      model: 'One Vision'
+    - regex: 'moto g stylus \(XT2115DL\)'
+      model: 'Moto G Stylus (XT2115DL)'
+    - regex: 'moto g stylus \(2021\)'
+      model: 'Moto G Stylus (2021)'
+    - regex: 'moto g stylus 5G'
+      model: 'Moto G Stylus 5G'
+    - regex: 'moto g stylus'
+      model: 'Moto G Stylus'
+    - regex: 'moto g play \(XT2093DL\)'
+      model: 'Moto G Play (XT2093DL)'
+    - regex: 'moto g play \(2021\)'
+      model: 'Moto G Play (2021)'
+    - regex: 'moto g power \(XT2041DL\)'
+      model: 'Moto G Power'
+    - regex: 'moto g power \(2021\)'
+      model: 'Moto G Power (2021)'
+    - regex: 'moto g power \(2022\)'
+      model: 'Moto G Power (2022)'
+    - regex: 'moto g power'
+      model: 'Moto G Power'
+    - regex: 'moto g pro'
+      model: 'Moto G Pro'
+    - regex: 'moto g pure'
+      model: 'Moto G Pure'
+    - regex: 'moto g fast'
+      model: 'Moto G Fast'
+    - regex: 'moto g 5G plus'
+      model: 'Moto G 5G Plus'
+    - regex: 'moto g 5G'
+      model: 'Moto G 5G'
+    - regex: 'moto g\(?40\)? fusion'
+      model: 'Moto G40 Fusion'
+    - regex: 'moto g(31|41)(?:[);/ ]|$)'
+      model: 'Moto G$1'
+    - regex: 'moto g\(?60\)?s'
+      model: 'Moto G60s'
+    - regex: 'moto g\(([0-9]+)\) \(XT1925DL\)'
+      model: 'Moto G$1 (XT1925DL)'
+    - regex: 'moto g\(([0-9]+)\) forge'
+      model: 'Moto G$1 Forge'
+    - regex: 'moto g\(([0-9]+)\) optimo \(XT1952DL\)'
+      model: 'Moto G$1 Optimo (XT1952DL)'
+    - regex: 'moto g\(([0-9]+)\) optimo maxx\(XT1955DL\)'
+      model: 'Moto G$1 Optimo Maxx (XT1955DL)'
+    - regex: 'moto g\(([0-9])\) power lite'
+      model: 'Moto G$1 Power Lite'
+    - regex: 'moto g\(([0-9]|10)\) power'
+      model: 'Moto G$1 Power'
+    - regex: 'moto g\(([0-9])\) supra'
+      model: 'Moto G$1 Supra'
+    - regex: 'moto g\(([0-9])\) plus'
+      model: 'Moto G$1 Plus'
+    - regex: 'moto g\(([0-9]+)\) play'
+      model: 'Moto G$1 Play'
+    - regex: 'moto g\(([0-9]+)\)'
+      model: 'Moto G$1'
+    - regex: 'moto e\(?([0-9]+)\)?(?: Build|[;)])'
+      model: 'Moto E$1'
+    - regex: 'moto x\(?(4+)\)?(?: Build|[;)])'
+      model: 'Moto X$1'
+    - regex: 'moto(?:rola)? one 5G'
+      model: 'One 5G'
+    - regex: 'Moto MAXX'
+      model: 'Moto Maxx'
 
     - regex: 'Moto ([CGEXZ]) ?\(([a-z0-9]+)\)( Plus| Play)?'
       model: 'Moto $1$2$3'
     - regex: 'Moto ?([CGEXZ])([0-9]+)( Plus| Play)?'
       model: 'Moto $1$2$3'
-    - regex: 'Moto ?([CGEXZ])( Plus| Play)?'
+    - regex: '(?:Motorola-)?Moto[ _]?([CGEXZ])([ _](?:Plus|Play))?'
       model: 'Moto $1$2'
+    - regex: 'MotoroiX'
+      model: 'MotoroiX'
 
-    - regex: 'Motorola[ _\-]([a-z0-9]+)'
-      model: '$1'
-    - regex: 'MOTORAZR[ _\-]([a-z0-9]+)'
+    - regex: 'Moto 360'
+      device: 'wearable'
+      model: 'Moto 360'
+    - regex: 'Moto(?:rola)?[- _]F100'
+      device: 'wearable'
+      model: 'Moto ACTV'
+
+    - regex: 'XT2071-4'
+      model: 'RAZR 5G'
+    - regex: 'razr \(2020\)'
+      model: 'RAZR (2020)'
+    - regex: 'MOTORAZR[ _-]([a-z0-9]+)'
       model: 'RAZR $1'
     - regex: 'MOTORIZR[ _\-]([a-z0-9]+)'
       model: 'RIZR $1'
-    - regex: 'MOT(?!OROLA)[O]?[_\-]?([a-z0-9.]+)'
+    - regex: 'Motorola[ _-]([^/);]+)(?: Build|[);])'
+      model: '$1'
+    - regex: 'Moto[ _-]([^/);]+)(?: Build|[);])'
+      model: '$1'
+    - regex: 'MOT(?!OROLA)[O]?[_-]?([a-z0-9.]+)'
       model: '$1'
     - regex: '(?<!AN)DROID ?([a-z0-9 ]*) Build'
       model: 'DROID $1'
@@ -9317,11 +13339,13 @@ Motorola:
 
 # Movic
 Movic:
-  regex: 'MOVIC'
+  regex: 'MOVIC|F4502'
   device: 'smartphone'
   models:
     - regex: 'MOVIC[ -]W([2345])'
       model: 'W$1'
+    - regex: 'F4502'
+      model: 'F4502'
 
 # MTN
 MTN:
@@ -9346,30 +13370,56 @@ MyTab:
     - regex: 'MyTAB-U55GT(?:[);/ ]|$)'
       model: 'U55GT'
 
-# myphone
+# myphone (myphone.com.ph)
 MyPhone:
-  regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|HAMMER[ _](Blade2_PRO|ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active[2]?(_LTE)?)|C-Smart_pix|myPhone_Fun_8|myA17'
+  regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|LUNA_II|HAMMER[ _](FORCE|Blade_3|Blade2_PRO|IRON_[23]|Explorer|ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active[2]?(_LTE)?)|IRON_2|C-Smart_pix|myPhone_Fun_8|FUN_18x9|MyPhoneMY27|Prime_4_Lite|myA17|myX12|Pocket_2|Prime_18x9|Prime3Lite|myT6 DTV|myXI1 (?:Plus|Pro)|myXI3|Q_Smart_BE|Brown 1|Q-Smart_III_Plus|SmartView_(?:[78]|9_6)_(?:LTE|[34]G)'
   device: 'smartphone'
   models:
+    # explicit table models
     - regex: 'MyPad[ _]([^;/]+) Build'
       model: 'MyPad $1'
       device: 'tablet'
     - regex: 'MyTab[ _]([^;/]+) Build'
       model: 'MyTab $1'
       device: 'tablet'
+    - regex: 'myTab_10III'
+      model: 'MyTab 10 III'
+      device: 'tablet'
     - regex: 'myTab10II'
       model: 'MyTab 10 II'
       device: 'tablet'
+    - regex: 'myT6 DTV'
+      model: 'myT6 DTV'
+      device: 'tablet'
+    - regex: 'SmartView_7_3G'
+      model: 'SmartView 7" 3G'
+      device: 'tablet'
+    - regex: 'SmartView_8_LTE'
+      model: 'SmartView 8" LTE'
+      device: 'tablet'
+    - regex: 'SmartView_9_6_3G'
+      model: 'SmartView 9.6" 3G'
+      device: 'tablet'
+
+    # explicit smartphones models
     - regex: 'Cube_LTE'
       model: 'Cube LTE'
+    - regex: 'Prime_4_Lite'
+      model: 'Prime 4 Lite'
+    - regex: 'HAMMER[ _]ENERGY[ _](\d+)'
+      model: 'Hammer Energy $1'
     - regex: 'HAMMER[ _]ENERGY'
       model: 'Hammer Energy'
     - regex: 'HAMMER_AXE[_ ]M[_ ]LTE'
       model: 'Hammer Axe M LTE'
     - regex: 'Hammer Titan 2'
       model: 'Hammer Titan 2'
-    - regex: 'Hammer Iron 2'
-      model: 'Hammer Iron 2'
+    - regex: 'Hammer[_ ]FORCE'
+      model: 'Hammer Force'
+    - regex: '(?:Hammer[ _])?Iron[ _](2|3)'
+      model: 'Hammer Iron $1'
+    - regex: 'Hammer[ _]Explorer'
+      model: 'Hammer Explorer'
     - regex: 'Hammer Active(?:[);/ ]|$)'
       model: 'Hammer Active'
     - regex: 'Hammer_Active2(?:[);/ ]|$)'
@@ -9380,12 +13430,47 @@ MyPhone:
       model: 'Hammer Axe Pro'
     - regex: 'Hammer_Blade2_PRO'
       model: 'Hammer Blade 2 Pro'
+    - regex: 'Hammer_Blade_3'
+      model: 'Hammer Blade 3'
     - regex: 'C-Smart_pix'
       model: 'C-Smart Pix'
+    - regex: 'Pocket_2(?:[);/ ]|$)'
+      model: 'Pocket 2'
     - regex: 'myA17(?:[);/ ]|$)'
       model: 'myA17'
-    - regex: 'myPhone_Fun_8'
-      model: 'FUN 8'
+    - regex: '(?:myPhone_)?Fun[_ ]?(\d)[_ ]?Lite'
+      model: 'FUN $1 Lite'
+    - regex: '(?:myPhone_)?Fun[_ ]?(\d)[_ ]?LTE'
+      model: 'FUN $1 LTE'
+    - regex: '(?:myPhone_)?Fun_?([48]|18x9)'
+      model: 'FUN $1'
+
+    - regex: 'MyPhoneMY27'
+      model: 'my27'
+    - regex: 'myX12(?:[);/ ]|$)'
+      model: 'myX12'
+    - regex: 'myXI1 Plus(?:[);/ ]|$)'
+      model: 'myXI1 Plus'
+    - regex: 'myXI1 Pro(?:[);/ ]|$)'
+      model: 'myXI1 Pro'
+    - regex: 'myXI3(?:[);/ ]|$)'
+      model: 'myXI3'
+    - regex: 'Q_Smart_BE(?:[);/ ]|$)'
+      model: 'Q-Smart BE'
+    - regex: 'Prime_18x9(_LTE)?(?:[);/ ]|$)'
+      model: 'Prime 18x9$1'
+    - regex: 'Prime3Lite(?:[);/ ]|$)'
+      model: 'Prime 3 Lite'
+    - regex: 'Brown 1(?:[);/ ]|$)' # ARK Brown 1
+      model: 'Brown 1'
+    - regex: 'myPhone[_ ]Pocket[_ ]Pro'
+      model: 'Pocket Pro'
+    - regex: 'Q-Smart_III_Plus'
+      model: 'Q-Smart III Plus'
+    - regex: 'LUNA_II'
+      model: 'Luna II'
+
+    # general detections
     - regex: 'MyPhone[ _]([^;/)]+)( Build|\))'
       model: '$1'
 
@@ -9397,6 +13482,12 @@ MyWigo:
     - regex: 'City3'
       model: 'City 3'
 
+# Myros (myrosworld.com)
+Myros:
+  regex: '(E70 Ultra)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
 # Myria
 Myria:
   regex: ' (Myria_[^/;]+|502M|Cozy|Easy tab 9|Grand) Build|Myria_FIVE|Myria_Grand_4G|Myria_Wide_2|Myria_Wide_4G'
@@ -9420,24 +13511,30 @@ Myria:
 
 # M.T.T.
 M.T.T.:
-  regex: 'M.T.T.'
+  regex: 'M\.T\.T\.'
   device: 'smartphone'
   models:
-    - regex: 'M.T.T. ?Tablet([^;/]+)? Build'
+    - regex: 'M\.T\.T\. ?Tablet([^;/]+)? Build'
       device: 'tablet'
       model: 'Tablet$1'
-    - regex: 'M.T.T. ?([^;/]+) Build'
+    - regex: 'M\.T\.T\. ?([^;/]+) Build'
       model: '$1'
 
 # Navon
 Navon:
-  regex: '(?:Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?|Navon[_ ]Infinity)(?:[);/ ]|$)'
+  regex: 'Navon[_ ]|(?:Vision_Tab_(?:7|10)|Pure Micro|Superme_Max|Raptor3G8GB|Predator (?:10|3G)|Platinum[_ ]10[_ ]3G(?:_V2)?|Supreme[_ ](?:Fine(?:[_ ]Micro)?|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'M505 LTE(?:[);/ ]|$)'
+      model: 'Mizu M505 LTE'
+    - regex: '(F552|D504)(?:[);/ ]|$)'
+      model: 'Mizu $1'
     - regex: 'Superme_Max(?:[);/ ]|$)'
       model: 'Supreme Max'
     - regex: 'Supreme_Fine_Mini(?:[);/ ]|$)'
       model: 'Supreme Fine Mini'
+    - regex: 'Supreme_Fine_Micro(?:[);/ ]|$)'
+      model: 'Supreme Fine Micro'
     - regex: 'Supreme[_ ]Fine[_ ]Plus(?:[);/ ]|$)'
       model: 'Supreme Fine Plus'
     - regex: 'Supreme_Fine(?:[);/ ]|$)'
@@ -9450,18 +13547,41 @@ Navon:
       model: 'Supreme Pure'
     - regex: 'Supreme[_ ]Pro(?:[);/ ]|$)'
       model: 'Supreme Pro'
+    - regex: 'Pure Micro(?:[);/ ]|$)'
+      model: 'Pure Micro'
     - regex: 'Navon[_ ]Infinity(?:[);/ ]|$)'
       model: 'Infinity'
+    - regex: 'Navon[_ ](D405)(?:[);/ ]|$)'
+      model: '$1'
+
+    - regex: '(?:Navon[_ ])?Platinum[ _]10[ _]3G(_V2)?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Platinum 10.1" 3G$1'
+    - regex: '(?:Navon[_ ])?Orpheus[ _]3G(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Orpheus 3G'
+    - regex: '(?:Navon_)?Predator[_ ](3G|10|7)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Predator $1'
+    - regex: 'Raptor3G8GB(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Raptor 3G 8GB'
+
+    - regex: 'Vision_Tab_(7|10)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Vision Tab $1'
 
-# NOA
+# NOA or NOA Mobile (noa-mobile.eu)
 NOA:
-  regex: 'NOA[ _]|HummerLE|NextSE'
+  regex: '(?:NOA-)?NOA[ _]|Hummer(?:_2019_R|LE)|NextSE|Vivo 4G_r|SPRINT4G'
   device: 'smartphone'
   models:
     - regex: 'NOA[_ ]CORE[_ ]FORTE'
       model: 'Core Forte'
     - regex: 'HummerLE'
       model: 'Hummer LE'
+    - regex: 'Hummer_2019_R'
+      model: 'Hummer R (2019)'
     - regex: 'NOA[_ ]Hummer[_ ]Lite'
       model: 'Hummer Lite'
     - regex: 'NOA[_ ]MOVEse'
@@ -9476,7 +13596,7 @@ NOA:
       model: 'Vision H3'
     - regex: 'NOA[_ ]LOOP'
       model: 'Loop'
-    - regex: 'NOA[_ ]H4se'
+    - regex: '(?:NOA-)?NOA[_ ]H4se'
       model: 'H4SE'
     - regex: 'NOA[_ ]Mg12'
       model: 'MG12'
@@ -9484,43 +13604,56 @@ NOA:
       model: 'H44SE'
     - regex: 'NOA[_ ]H10LE'
       model: 'H10LE'
+    - regex: 'SPRINT4G'
+      model: 'Sprint 4G'
+    - regex: '(?:NOA[_ ])?Vivo 4G_r'
+      model: 'Vivo 4G'
     - regex: 'NOA[_ ]([^;)/ ]+)'
       model: '$1'
 
+# Nobby (nobby.ru)
 Nobby:
-  regex: 'Nobby[ ](S500|X800|S300(?: Pro)?)(?:[);/ ]|$)'
+  regex: 'Nobby[ ](S500|X800(?: Pro)?|S300(?: Pro)?)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
-# nec
+# nec or nec lavie (www.nec-lavie.jp)
 NEC:
-  regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508HAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|N-06C(?:[);/ ]|$)'
+  regex: 'NEC[ _\-]|KGT/2\.0|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|(?:PC-T[SE]\d{3}[\w]{2,3}|N-06C|N-02E|LAVIE Tab E (?:10|8)FHD[12]|7SD1|8HD1)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'N-06C(?:[);/ ]|$)'
       model: 'Medias Amadana'
+    - regex: 'N-02E(?:[);/ ]|$)'
+      model: 'Medias U'
     - regex: '(?:NEC[ _\-]|KGT/2\.0 )([a-z0-9]+)'
       model: '$1'
     - regex: 'portalmmm/1\.0 ((?:DB|N)[a-z0-9]+)'
       model: '$1'
     - regex: '(?:portalmmm|o2imode)/2\.0[ ,](N[a-z0-9]+)'
       model: '$1'
-    - regex: 'PC-TE508HAW(?:[);/ ]|$)'
+    - regex: 'LAVIE Tab E ((?:10|8)FHD[12]|7SD1|8HD1)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'LAVIE Tab E $1'
+    - regex: 'PC-TE(\d+)'
       device: 'tablet'
-      model: 'LAVIE Tab E TE508'
+      model: 'LAVIE Tab E TE$1'
+    - regex: 'PC-TS(\d+)'
+      device: 'tablet'
+      model: 'LAVIE Tab S TS$1'
 
-# Neffos (TP-Link)
+# Neffos (sub brand TP-Link) (neffos.com)
 Neffos:
   regex: 'Neffos|(TP601A)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'TP601A(?:[);/ ]|$)'
+    - regex: '(?:C57|TP601A)(?:[);/ ]|$)'
       model: 'C5L'
     - regex: 'Neffos[_ ]Y50'
       model: 'Y50'
     - regex: 'Neffos X20 Pro'
       model: 'X20 Pro'
-    - regex: 'Neffos[_ ]((?:Y|N|C|X)[0-9][A-Z]?(?: Max| Lite)?)'
+    - regex: 'Neffos[_ ]((?:[YNCXA])[0-9][A-Z]?(?: Max| Lite| Plus)?)'
       model: '$1'
 
 # Nextbit
@@ -9542,8 +13675,8 @@ Netgear:
   regex: 'GTV100'
   device: 'tv'
   models:
-   - regex: 'GTV100'
-     model: 'NeoTV Prime'
+    - regex: 'GTV100'
+      model: 'NeoTV Prime'
 
 # NeuImage
 NeuImage:
@@ -9555,13 +13688,21 @@ NeuImage:
 
 # NextBook
 NextBook:
-  regex: 'Next[0-9]|NX785QC8G|NXM900MC|NX008HD8G|NX010HI8G|NXM908HC|NXM726|NXA8QC116'
+  regex: 'Next[0-9]|NX(?:785QC8G|M900MC|008HD8G|010HI8G|M908HC|M726|16A8116K|A8QC116|16A10132S|16A11264)'
   device: 'tablet'
   models:
     - regex: 'NX008HD8G'
       model: 'Premium 8 HD'
     - regex: 'NXA8QC116'
       model: 'Ares 8'
+    - regex: 'NX16A8116K'
+      model: 'Ares A8'
+    - regex: 'NX16A10132S'
+      model: 'Ares A10'
+    - regex: 'NX16A11264'
+      model: 'Ares A11'
+    - regex: 'NEXT1015BAP'
+      model: 'Ares 10'
     - regex: 'NXM908HC'
       model: 'Premium 9'
     - regex: 'NX010HI8G'
@@ -9576,11 +13717,13 @@ NextBook:
     - regex: 'Next([0-9]+[^;/]+) Build'
       model: 'Next $1'
 
-# ngm
+# ngm (www.ngm.eu)
 NGM:
-  regex: 'NGM[_ ][a-z0-9]+|(Forward|Dynamic)[ _]?[^/;]+(?:Build|/)'
+  regex: 'NGM[_ ][a-z0-9]+|(Forward|Dynamic)[ _]?[^/;]+(?:Build|/)|Smart5Plus32GB'
   device: 'smartphone'
   models:
+    - regex: 'Smart5Plus32GB'
+      model: 'Smart 5 Plus'
     - regex: '(Forward|Dynamic)[ _]?([^/;]+) Build'
       model: '$1 $2'
     - regex: '(Forward|Dynamic)[ _]?([^/;]+)/'
@@ -9620,39 +13763,157 @@ Noblex:
     - regex: '(?:Noblex|NBX)[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
+# NOGA (https://noganet.ar/)
+NOGA:
+  regex: 'NOGAPAD7G(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'NOGAPAD7G(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'NOGAPAD 7G'
+
 # Nomu
 Nomu:
-  regex: 'Nomu[ _-](?:T18|S30mini)(?:[);/ ]|$)'
+  regex: '(?:Nomu[ _-](?:T18|S30mini|S10)|(?:V1600S|S10 PRO|S50_Pro))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Nomu[ _-]T18(?:[);/ ]|$)'
       model: 'T18'
+    - regex: 'Nomu[ _-]s10(?:[);/ ]|$)'
+      model: 'S10'
     - regex: 'Nomu[ _-]S30mini(?:[);/ ]|$)'
       model: 'S30 Mini'
+    - regex: 'S([15]0)[_ ]PRO(?:[);/ ]|$)'
+      model: 'S$1 Pro'
+    - regex: '(V1600S)(?:[);/ ]|$)'
+      model: '$1'
+
+# Noontec (http://www.noontec.com.au/)
+Noontec:
+  regex: 'Noontec '
+  device: 'tv'
+  model: ''
+
+# Opsson
+Opsson:
+  regex: 'Opsson|IUSAI'
+  device: 'smartphone'
+  models:
+    - regex: 'IUSAI[ _]([^/;]+) Build'
+      model: 'Iusai $1'
+    - regex: 'IUSAI[ _]([^/;\)]+)[/;\)]'
+      model: 'Iusai $1'
+    - regex: 'Opsson[ _]([^/;]+) Build'
+      model: '$1'
+    - regex: '(?:Opsson-)?Opsson[ -_]([^/;]+)/'
+      model: '$1'
 
-# Nomi
+# Nomi (nomi-electronics.com)
 Nomi:
-  regex: 'Nomi[ _-]|(C101010 Ultra2|i501[234]|i5032|i5050|i5510|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3])(?:[);/ ]|$)'
+  regex: 'Nomi[ _-]|(C101010 Ultra2|i501[234]|i5032|i50[57]0|i5510|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3]|i(?:50[015]|450|40[01]|55[02]))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'i501[23](?:[);/ ]|$)'
       model: 'Evo M2'
+    - regex: 'Nomi[ _]i5010(?:[);/ ]|$)'
+      model: 'Evo M'
+    - regex: 'Nomi[ _]i5001(?:[);/ ]|$)'
+      model: 'Evo M3'
+    - regex: 'Nomi[ _]i5011(?:[);/ ]|$)'
+      model: 'Evo M1'
+    - regex: 'Nomi[ _]i506(?:[);/ ]|$)'
+      model: 'i506 Shine'
+    - regex: 'Nomi[ _]i5730(?:[);/ ]|$)'
+      model: 'i5730 Infinity'
+    - regex: 'Nomi[ _]i6030(?:[);/ ]|$)'
+      model: 'Note-X'
+    - regex: 'I5070(?:[);/ ]|$)'
+      model: 'Iron-X'
+    - regex: 'i5071(?:[);/ ]|$)'
+      model: 'Iron-X1'
+    - regex: 'Nomi[_ ]I4070(?:[);/ ]|$)'
+      model: 'Iron-M'
     - regex: 'i5014(?:[);/ ]|$)'
       model: 'Evo M4'
     - regex: 'i5032(?:[);/ ]|$)'
       model: 'Evo X2'
     - regex: 'i5050(?:[);/ ]|$)'
       model: 'Evo Z'
-    - regex: 'Nomi_i4510(?:[);/ ]|$)'
+    - regex: '(?:Nomi_)?i4510(?:[);/ ]|$)'
       model: 'Beat M'
+    - regex: '(?:Nomi_)?i4500(?:[);/ ]|$)'
+      model: 'Beat M1'
     - regex: 'i5532(?:[);/ ]|$)'
       model: 'Space X2'
     - regex: 'i5510(?:[);/ ]|$)'
       model: 'Space M'
+    - regex: 'Nomi[_ ]i5511(?:[);/ ]|$)'
+      model: 'Space M1'
+    - regex: '(?:Nomi_)?i5710(?:[);/ ]|$)'
+      model: 'Infinity X1'
+    - regex: '(?:Nomi[ _])?i(50[015]|450|40[01]|55[02])(?:[);/ ]|$)'
+      model: 'i$1'
     - regex: 'C101010 Ultra2'
       model: 'Ultra 2'
       device: 'tablet'
-    - regex: '(C0(?:700(?:[02358]|2HD)|7850)|C1010[0-3])(?:[);/ ]|$)'
+    - regex: '(?:Nomi_)?C101040'
+      model: 'Ultra 3 Pro'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C101030'
+      model: 'Ultra 3 LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C101012'
+      model: 'Ultra 3 3G'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C101014'
+      model: 'Ultra 4 3G'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C101034'
+      model: 'Ultra 4 LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C101044'
+      model: 'Ultra 4 Pro LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C070010'
+      device: 'tablet'
+      model: 'Corsa'
+    - regex: '(?:Nomi_)?C070020'
+      model: 'Corsa Pro'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C070011'
+      model: 'Corsa 2'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C070030'
+      model: 'Corsa 3 LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C070012'
+      model: 'Corsa 3 3G'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C070014L'
+      model: 'Corsa 4 Light 3G'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C0700[13]4'
+      model: 'Corsa 4 LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C070044'
+      model: 'Corsa 4 Pro LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C080012'
+      model: 'Libra 3 3G'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C080034'
+      model: 'Libra 4 LTE'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C080014'
+      model: 'Libra 4 3G'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C07008'
+      model: 'Sigma'
+      device: 'tablet'
+    - regex: '(?:Nomi_)?C10105'
+      model: 'Stella Plus'
+      device: 'tablet'
+    - regex: '(?:Nomi[ _])?(C0(?:700(?:[0235]|2HD)|7850|9600)|C1010[0-3])(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
     - regex: 'Nomi[ _-]([^;/]+) Build'
@@ -9662,25 +13923,33 @@ Nomi:
 
 # NUU Mobile
 NUU Mobile:
-  regex: 'NUU_|(?:(?:N(5702|5001)L|S6001L)|A6L-[CG])(?:[);/ ]|$)'
+  regex: 'NUU_|(?:(?:N(5702|500[12])L|S6001L|[SN]5501L)|A6L-[CG]|N5502L)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'NUU_A([13])'
       model: 'A$1'
-    - regex: 'NUU_M3(?:[);/ ]|$)'
-      model: 'M3'
+    - regex: 'NUU_M([32])(?:[);/ ]|$)'
+      model: 'M$1'
     - regex: 'NUU_X5(?:[);/ ]|$)'
       model: 'X5'
     - regex: 'S6001L'
       model: 'G2'
+    - regex: 'S5501L'
+      model: 'M19'
     - regex: 'N5702L'
       model: 'G3'
+    - regex: 'N5501L'
+      model: 'A5L'
+    - regex: 'N5002L'
+      model: 'A7L'
+    - regex: 'N5502L'
+      model: 'A10L'
     - regex: '(N5001L|A6L-[CG])(?:[);/ ]|$)'
       model: '$1'
 
 # NYX Mobile
 NYX Mobile:
-  regex: 'NYX[ _]'
+  regex: 'NYX[ _]|(?:GLAM|ARGON)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'NYX_A1'
@@ -9721,6 +13990,10 @@ NYX Mobile:
       model: 'Vox'
     - regex: 'NYX_ZEUZ_HD'
       model: 'Zeus HD'
+    - regex: 'GLAM'
+      model: 'Glam'
+    - regex: 'ARGON'
+      model: 'Argon'
 
 # Nous
 Nous:
@@ -9734,16 +14007,25 @@ Nous:
 
 # Nvidia
 Nvidia:
-  regex: '(SHIELD Tablet K1) Build|SHIELD Android TV|Tegra(Note-P1640| Note 7)'
+  regex: 'NVIDIA|SHIELD|Tegra(Note-P1640| Note 7)'
   device: 'tablet'
   models:
     - regex: 'TegraNote-P1640'
       model: 'Tegra Note P1640'
-    - regex: '(SHIELD Tablet K1|Tegra Note 7)(?: Build|\))'
+    - regex: '(SHIELD Tablet(?: K1)?|Tegra Note 7)(?: Build|[;)])'
       model: '$1'
-    - regex: 'SHIELD Android TV'
+    - regex: 'SHIELD Andr[o0]id TV'
       model: 'SHIELD Android TV'
       device: 'tv'
+    - regex: 'NVIDIA_SHIELD_PRO_2019'
+      model: 'SHIELD TV Pro'
+      device: 'tv'
+    - regex: 'NVIDIA Shield'
+      model: 'SHIELD TV'
+      device: 'tv'
+    - regex: 'SHIELD'
+      model: 'SHIELD Portable'
+      device: 'console'
 
 # O+ (OPlus)
 O+:
@@ -9771,9 +14053,25 @@ O2:
     - regex: 'O2-([a-z0-9]+)'
       model: '$1'
 
-# Odys
+# Funai (https://www2.funai.co.jp/)
+Funai:
+  regex: 'FUNAI, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
+# Fusion5 (www.fusion5store.com)
+Fusion5:
+  regex: 'Fusion5|F104Bv2'
+  device: 'tablet'
+  models:
+    - regex: '(?:Fusion5_)?(F104B)v2_PRO'
+      model: '$1v2 Pro'
+    - regex: '(?:Fusion5_)?(F104B)v2'
+      model: '$1v2'
+
+# Odys (odys.de)
 Odys:
-  regex: 'ODYS[ _-]|IEOS[_ ]([^/;]+)|NOON(?:_PRO)? Build|SPACE10_(?:PLUS|PRO)_3G|THOR_?10|TAO_X10|RAPID_?(?:10|7)_?LTE|MAVEN_?10_|CONNECT[78]|ELEMENT10_PLUS_3G|XELIO[_0-9P]|ADM816HC|ADM8000KP|NEO6_LTE|EOS10|AEON|FALCON_10_PLUS_3G|FUSION|THANOS_10|MAVEN_X10_HD(?:_LTE)?|JUNIOR_8_PRO'
+  regex: 'ODYS[ _-]|IEOS[_ ]([^/;]+)|NOON(?:_PRO)? Build|SPACE10_(?:PLUS|PRO)_3G|THOR_?10|TAO_X10|RAPID_?(?:10|7)_?LTE|MAVEN_?10_|CONNECT[78]|ELEMENT10_PLUS_3G|XELIO[_0-9P]|ADM816HC|ADM8000KP|NEO6_LTE|EOS10|AEON|FALCON_10_PLUS_3G|FUSION|THANOS_10|MAVEN_X10_HD(?:_LTE)?|JUNIOR_8_PRO|JuniorT8Pro|(?:NOVA|PYRO)_X?7_PLUS_3G|UNO_X8|MAVEN_G10|SLADE_X55|XELIO_PRO_10_LTE|NOTOSplus3G|PACE ?10|PACE_10_LTE|Titan_10_LTE|PEDI_PLUS_W'
   device: 'tablet'
   models:
     - regex: 'XELIO[_ ]A10'
@@ -9790,6 +14088,12 @@ Odys:
       model: 'Xelio 10 Xtreme'
     - regex: 'XELIO10_PLUS_3G'
       model: 'Xelio 10 Plus 3G'
+    - regex: 'XELIO10_HD_PLUS_3G'
+      model: 'Xelio 10 HD Plus 3G'
+    - regex: 'XELIO_10_HD'
+      model: 'Xelio 10 HD'
+    - regex: 'XELIO_PRO_10_LTE'
+      model: 'Xelio Pro 10 LTE'
     - regex: 'ELEMENT10_PLUS_3G'
       model: 'Element 10 Plus 3G'
     - regex: 'CONNECT8PLUS'
@@ -9820,25 +14124,54 @@ Odys:
       model: 'Space 10 Pro 3G'
     - regex: 'THOR_?10 Build'
       model: 'Thor 10'
+    - regex: 'JuniorT8Pro'
+      model: 'Junior T8 Pro'
     - regex: 'JUNIOR_8_PRO'
       model: 'Junior 8 Pro'
     - regex: 'ADM816HC'
       model: 'Neo X'
     - regex: 'EOS10'
       model: 'EOS 10'
+    - regex: 'PACE_10_LTE_V2'
+      model: 'Pace 10 LTE V2'
+    - regex: 'PACE ?10'
+      model: 'Pace 10'
     - regex: 'AEON'
       model: 'Aeon'
     - regex: 'FALCON_10_PLUS_3G'
       model: 'Falcon 10 Plus 3G'
     - regex: 'FUSION'
       model: 'Fusion 7'
-    - regex: 'NEO6[_ ]LTE'
-      model: 'Neo 6 LTE'
-      device: 'smartphone'
+    - regex: 'UNO_X8'
+      model: 'Uno X8'
     - regex: 'ADM8000KP'
       model: 'Titan'
+    - regex: 'Titan_10_LTE'
+      model: 'Titan 10 LTE'
+    - regex: 'PYRO_7_PLUS_3G'
+      model: 'Pyro 7 Plus 3G'
+    - regex: 'NOVA_X7_PLUS_3G'
+      model: 'Nova X7 Plus 3G'
+    - regex: 'ODYS_NOVA_X7'
+      model: 'Nova X7'
     - regex: 'THOR_?10_PLUS_3G'
       model: 'Thor 10 Plus 3G'
+    - regex: 'NOTOSplus3G'
+      model: 'Notos Plus 3G'
+    - regex: 'MAVEN_G10'
+      model: 'Maven G10'
+    - regex: 'PEDI_PLUS_W'
+      model: 'Pedi Plus W'
+
+    # explicit smartphones models
+    - regex: 'NEO6[_ ]LTE'
+      model: 'Neo 6 LTE'
+      device: 'smartphone'
+    - regex: 'SLADE_X55'
+      model: 'Slade X55'
+      device: 'smartphone'
+
+    # general detections
     - regex: 'IEOS[ _]([^/;]+) Build'
       model: 'Ieos $1'
     - regex: '(?:ODYS[ _-])?NOON Build'
@@ -9850,7 +14183,7 @@ Odys:
 
 # Obi
 Obi:
-  regex: 'Obi[ _-]|(SJ1\.5|SJ2\.6|S400|S452\+|S451|S453|S501|S502|S503\+?|S507|S520|S550|S551|falcon)[ _]'
+  regex: 'Obi[ _-]|(SJ1\.5|SJ2\.6|(?<!verykool )S(400|452\+|45[13]|50[127]|503\+?|520|55[01])|falcon)[ _]'
   device: 'smartphone'
   models:
     - regex: 'SJ2\.6'
@@ -9888,13 +14221,24 @@ Obi:
     - regex: 'Obi[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
-# onda
+# Okapia
+Okapia:
+  regex: 'Signature (?:L|Pro|Touch)'
+  device: 'smartphone'
+  models:
+    - regex: 'Signature (L|Pro|Touch)'
+      model: 'Signature $1'
+
+# onda (ondatlc.com)
 Onda:
-  regex: 'Onda|(?:(?:V820w|V891[w]?|V919(?: 3G)? Air)[ _-]DualOS|(?:V919 4G Air|V989 Air) Core8|T2101L2B1C| V10 4G|OBOOK (?:20 SE|20 PLUS DUALOS)|OBOOK10 SE|V919 Air CH DualOS)(?:[);/ ]|$)'
+  regex: 'Onda|(?:(?:V820w|V891[w]?|V919(?: 3G)? Air)[ _-]DualOS|(?:V919 4G Air|V989 Air|V972) Core[48]|T2101L2B1C| V10 4G|OBOOK (?:20 SE|20 PLUS DUALOS)|OBOOK10 SE|V919 Air CH DualOS| T9S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: '(?: T9S)(?:[);/ ]|$)'
+      model: 'T9 S'
+
     # explicit tablet models
-    - regex: 'ONDA MID'
+    - regex: 'ONDA[ _]MID'
       model: 'MID'
       device: 'tablet'
     - regex: 'V820w[ _-]DualOS'
@@ -9918,9 +14262,15 @@ Onda:
     - regex: 'V919 4G Air Core8'
       model: 'V919 4G Air Core 8'
       device: 'tablet'
+    - regex: 'V972 Core4'
+      model: 'V919 Core 4'
+      device: 'tablet'
     - regex: 'V989 Air Core8'
       model: 'V989 Air Core 8'
       device: 'tablet'
+    - regex: 'ONDA V989'
+      model: 'V989 Core 8'
+      device: 'tablet'
     - regex: 'T2101L2B1C|OBOOK 20 PLUS DUALOS'
       model: 'oBook 20 Plus Dual OS'
       device: 'tablet'
@@ -9939,27 +14289,57 @@ Onda:
     - regex: 'Onda ([a-z0-9]+)'
       model: '$1'
 
-# OnePlus
+# OnePlus (www.oneplus.com or oneplus.com.ru)
 OnePlus:
-  regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|AC200[13]|A300[03]|A3010|A5000|A600[03]|A601[03]|E100[135]|GM191[03517]|GM190[0135]|GM1920|HD191[013]|HD190[01357]|HD1925|IN201[037]|IN202[03])(?: Build|\))'
+  regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|AC200[13]|A300[03]|A3010|A5000|A600[03]|A601[03]|BE201[1235]|BE202[5689]|E100[135]|GM191[03517]|GM190[0135]|GM192[05]|HD191[013]|HD190[01357]|HD1925|IN201[013579]|IN202[0135]|KB200[01357]|LE211[01357]|LE212[035]|Nord N10 5G|LE210[01]|LE212[17]|DE211[78]|DN210[13]|EB210[13]|MT211[01])(?: Build|\))'
   device: 'smartphone'
   models:
     - regex: 'AC200[13](?:[);/ ]|$)'
       model: 'Nord 5G'
-    - regex: 'IN202[03](?:[);/ ]|$)'
+    - regex: 'EB210[13](?:[);/ ]|$)'
+      model: 'Nord CE 5G'
+    - regex: 'BE2012(?:[);/ ]|$)'
+      model: 'Clover'
+    - regex: 'BE201[135](?:[);/ ]|$)'
+      model: 'Nord N100'
+    - regex: 'DE211[78](?:[);/ ]|$)'
+      model: 'Nord N200 5G'
+    - regex: 'BE2025(?:[);/ ]|$)'
+      model: 'Nord N10'
+    - regex: '(BE202[69]|Nord N10 5G)(?:[);/ ]|$)'
+      model: 'Nord N10 5G'
+    - regex: 'BE2028(?:[);/ ]|$)'
+      model: 'Nord N10 Lite'
+    - regex: 'DN210[13](?:[);/ ]|$)'
+      model: 'Nord 2 5G'
+    - regex: 'IN202[0135](?:[);/ ]|$)'
       model: '8 Pro'
-    - regex: 'IN201[037](?:[);/ ]|$)'
+    - regex: 'KB2000(?:[);/ ]|$)'
+      model: '8T'
+    - regex: '(?:IN201[01357]|OnePlus 8)(?:[);/ ]|$)'
       model: '8'
-    - regex: 'GM191[03517](?:[);/ ]|$)'
+    - regex: 'IN2019(?:[);/ ]|$)'
+      model: '8 5G UW'
+    - regex: 'LE211[01357](?:[);/ ]|$)'
+      model: '9'
+    - regex: 'MT211[01](?:[);/ ]|$)'
+      model: '9RT 5G'
+    - regex: 'LE210[01](?:[);/ ]|$)'
+      model: '9R'
+    - regex: 'LE212[01357](?:[);/ ]|$)'
+      model: '9 Pro'
+    - regex: '(?:GM191[01357]|OnePlus 7 Pro)(?:[);/ ]|$)'
       model: '7 Pro'
     - regex: 'GM190[0135](?:[);/ ]|$)'
       model: '7'
     - regex: 'HD190[01357](?:[);/ ]|$)'
       model: '7T'
-    - regex: 'HD191[013](?:[);/ ]|$)'
+    - regex: '(?:HD191[013]|OnePlus 7T Pro)(?:[);/ ]|$)'
       model: '7T Pro'
-    - regex: '(?:HD1925|GM1920)(?:[);/ ]|$)'
+    - regex: '(?:HD1925|GM192[05])(?:[);/ ]|$)'
       model: '7T Pro 5G'
+    - regex: 'KB200[1357](?:[);/ ]|$)'
+      model: '8T'
     - regex: 'A0001(?:[);/ ]|$)'
       model: 'One'
     - regex: 'A200[135]|OnePlus2'
@@ -9970,7 +14350,7 @@ OnePlus:
       model: '3T'
     - regex: 'A300[03]|OnePlus3'
       model: '3'
-    - regex: 'A5010|OnePlus5T'
+    - regex: 'A5010|OnePlus[ ]?5T'
       model: '5T'
     - regex: 'A5000|OnePlus5'
       model: '5'
@@ -9978,39 +14358,49 @@ OnePlus:
       model: '6'
     - regex: 'A601[03](?:[);/ ]|$)'
       model: '6T'
-    - regex: '(?:du_)?ONEPLUS ?([^;/]+) Build'
+    - regex: '(?:du_)?ONEPLUS[ _]?([^;/)]+)(?: Build|[;)])'
       model: '$1'
 
 # Realme (sub brand Oppo)
 Realme:
-  regex: '(?:RMX(?:19(03|4[1235]|19|9[23]|2[157]|[01379]1|73)|20(?:[025-7]1|[037]2|2[57]|63|76|86|[234]0)|21(?:[12]1|42|76|8[059])|2200|18(0[1579]|11|3[13]|2[157]|[45]1|45))|(?:OPPO[ _]?)?CPH1861)(?:[);/ ]|$)'
+  regex: 'Realme[ _]|(?:RMX(?:19(03|4[1235]|19|9[23]|2[1579]|[01379]1|73)|20(?:[025-7]1|42|[0357]2|03|2[257]|63|7[56]|8[1356]|[2-5]0)|21(?:0[13]|1[27]|[12]1|4[24]|5[156]|6[13]|7[036]|8[059]|9[345])|220[0125]|18(0[13579]|11|3[13]|2[1257]|[45]1|53|45)|32(?:0[13]|42|[346]1)|30(?:[3468]1|4[23]|9[23]|63|85)|31(?:2[12]|15|42|9[1357]|51|6[16]|71)|3125|33[57]0|330[01]|3357|3393|336[036]|326[3589]|3235|3430|3461|3491|33[86]1)|(?:OPPO[ _]?)?CPH1861|RMP210[23])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: '(?:OPPO[ _]?)?RMX3142(?:[);/ ]|$)'
+      model: 'Q3 Pro Play'
     - regex: '(?:OPPO[ _]?)?CPH1861(?:[);/ ]|$)'
       model: '1'
     - regex: 'RMX180[59]'
       model: '2'
-    - regex: 'RMX180[17]'
+    - regex: 'RMX180[137]'
       model: '2 Pro'
-    - regex: 'RMX(1833|182[15])'
+    - regex: 'RMX(1833|182[125])'
       model: '3'
     - regex: 'RMX1827'
       model: '3i'
-    - regex: 'RMX1851'
+    - regex: 'RMX185[13]'
       model: '3 Pro'
-    - regex: 'RMX190[13]'
+    - regex: 'RMX190[13]|Realme X(?:[);/ ]|$)'
       model: 'X'
     - regex: 'RMX199[12]'
       model: 'X2'
     - regex: 'RMX1993'
       model: 'X2 Dual'
-    - regex: 'RMX1931'
+    - regex: 'RMX1931|Realme X2 Pro(?:[);/ ]|$)'
       model: 'X2 Pro'
+    - regex: 'RMX2117'
+      model: 'Q2 5G'
+    - regex: 'RMX2173'
+      model: 'Q2 Pro'
+    - regex: 'RMX2205'
+      model: 'Q3 Pro 5G'
+    - regex: 'RMX3161'
+      model: 'Q3 5G'
     - regex: 'RMX2176(?:[);/ ]|$)'
       model: 'X7 5G'
     - regex: 'RMX2121(?:[);/ ]|$)'
       model: 'X7 Pro 5G'
-    - regex: 'RMX1921'
+    - regex: 'RMX1921|Realme XT(?:[);/ ]|$)'
       model: 'XT'
     - regex: 'RMX19(1[19]|27)'
       model: '5'
@@ -10018,21 +14408,45 @@ Realme:
       model: '5 Pro'
     - regex: 'RMX203[02]'
       model: '5i'
-    - regex: 'RMX2001'
+    - regex: 'RMX1929'
+      model: '5s'
+    - regex: 'RMX200[13]'
       model: '6'
-    - regex: 'RMX2040'
-      model: '6I'
+    - regex: 'RMX204[02]'
+      model: '6i'
     - regex: 'RMX2002'
       model: '6S'
     - regex: 'RMX206[13](?:[);/ ]|$)'
       model: '6 Pro'
+    - regex: 'RMX215[15]'
+      model: '7'
+    - regex: 'RMX2103'
+      model: '7I'
+    - regex: 'RMX2170'
+      model: '7 Pro'
+    - regex: 'RMX3115'
+      model: 'X7 Pro Extreme Edition'
+    - regex: 'RMX3081'
+      model: '8 Pro'
+    - regex: 'RMX3085'
+      model: '8'
+    - regex: 'RMX3151'
+      model: '8i'
+    - regex: 'RMX3381'
+      model: '8s'
+    - regex: 'RMX3241'
+      model: '8 5G'
+    - regex: 'RMX3491'
+      model: '9i'
+    - regex: 'RMX3393'
+      model: '9 Pro+ 5G'
     - regex: 'RMX1925(?:[);/ ]|$)'
       model: '5S'
     - regex: 'RMX1811(?:[);/ ]|$)'
       model: 'C1'
     - regex: 'RMX194[1235](?:[);/ ]|$)'
       model: 'C2'
-    - regex: 'RMX202[107](?:[);/ ]|$)'
+    - regex: 'RMX202[1207](?:[);/ ]|$)'
       model: 'C3'
     - regex: 'RMX2185(?:[);/ ]|$)'
       model: 'C11'
@@ -10040,38 +14454,121 @@ Realme:
       model: 'C12'
     - regex: 'RMX2180(?:[);/ ]|$)'
       model: 'C15'
+    - regex: 'RMX219[45](?:[);/ ]|$)'
+      model: 'C15 Qualcomm Edition'
+    - regex: 'RMX2101(?:[);/ ]|$)'
+      model: 'C17'
+    - regex: 'RMX306[13](?:[);/ ]|$)'
+      model: 'C20'
+    - regex: 'RMX320[13]'
+      model: 'C21'
+    - regex: 'RMX326[13]'
+      model: 'C21Y'
+    - regex: 'RMX319[13]'
+      model: 'C25'
+    - regex: 'RMX319[57]'
+      model: 'C25s'
+    - regex: 'RMX326[589]'
+      model: 'C25Y'
+    - regex: 'RMX3231'
+      model: 'C11 (2021)'
+    - regex: 'RMX330[01]'
+      model: 'GT 2 Pro'
+    - regex: 'RMX3031(?:[);/ ]|$)'
+      model: 'GT Neo'
+    - regex: 'RMX3370(?:[);/ ]|$)'
+      model: 'GT Neo 2'
+    - regex: 'RMX3357(?:[);/ ]|$)'
+      model: 'GT Neo 2T'
+    - regex: 'RMX336[0136]'
+      model: 'GT Master Edition'
+    - regex: 'RMX3350(?:[);/ ]|$)'
+      model: 'GT Neo Flash'
+    - regex: 'RMX216[13](?:[);/ ]|$)'
+      model: 'Narzo 20 Pro'
+    - regex: 'RMX2193(?:[);/ ]|$)'
+      model: 'Narzo 20'
+    - regex: 'RMX2050(?:[);/ ]|$)'
+      model: 'Narzo 20A'
+    - regex: 'RMX3171(?:[);/ ]|$)'
+      model: 'Narzo 30A'
+    - regex: 'RMX2156(?:[);/ ]|$)'
+      model: 'Narzo 30'
+    - regex: 'RMX3242'
+      model: 'Narzo 30 5G'
+    - regex: 'RMX3430'
+      model: 'Narzo 50A'
+    - regex: 'RMX3235'
+      model: 'Narzo 50i'
     - regex: 'RMX1831(?:[);/ ]|$)'
       model: 'U1'
-    - regex: 'RMX20(?:51|25)(?:[);/ ]|$)'
+    - regex: 'RMX(?:20(?:51|[2]5)|2144)(?:[);/ ]|$)'
       model: 'X50 5G'
+    - regex: 'RMX2052(?:[);/ ]|$)'
+      model: 'X50t 5G'
     - regex: 'RMX2071(?:[);/ ]|$)'
       model: 'X50 Pro'
-    - regex: 'RMX2076(?:[);/ ]|$)'
+    - regex: 'RMX207[56](?:[);/ ]|$)'
       model: 'X50 Pro 5G'
     - regex: 'RMX2072(?:[);/ ]|$)'
       model: 'X50 Pro Player'
-    - regex: 'RMX2142(?:[);/ ]|$)'
+    - regex: 'RMX(2142|2081)(?:[);/ ]|$)'
       model: 'X3'
-    - regex: 'RMX2086(?:[);/ ]|$)'
+    - regex: 'RMX208[56]'
       model: 'X3 Super Zoom'
-    - regex: 'RMX2111'
+    - regex: 'RMX2083'
+      model: 'X3'
+    - regex: 'RMX2173'
+      model: 'Q2 Pro'
+    - regex: 'RMX346[12]'
+      model: 'Q3s'
+    - regex: 'RMX211[12]'
       model: 'V5 5G'
-    - regex: 'RMX2200'
+    - regex: 'RMX220[01]'
       model: 'V3 5G'
+    - regex: 'RMX312[12]'
+      model: 'V11 5G'
+    - regex: 'RMX3125'
+      model: 'V11s 5G'
+    - regex: 'RMX304[123]'
+      model: 'V13 5G'
+    - regex: 'RMX309[23]'
+      model: 'V15 5G'
+    - regex: 'RMX2202'
+      model: 'GT 5G'
+    - regex: 'Realme[ _]([1-9])[ _]Pro(?:[);/ ]|$)'
+      model: '$1 Pro'
+    - regex: 'RMP210[23](?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Pad'
 
 # Oppo (oppo.com)
 OPPO:
-  regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|OPG01|(?:X90[07][0679]|U707T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAAT00|PAC[TM]00)(?:[);/ ]|$)|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|CPH19(69|79|23|1[179])|PB(A[TM]00|CT10|BT30|CM[13]0|[FD]M00)|P(DAM10|ADM00|AF[TM]00|ADT00|AHM00|BBM[03]0|BBT00|BDT00|BFT00|[CB]E[MT]00|CA[MT]00|C[CDG]M00|CA[MT]10|[CD]PM00|CRM00|CDT00|CD[TM]10|CHM[013]0|CKM[08]0|CLM[15]0|DEM[13]0|DHM00|DK[TM]00|DPT00|DB[TM]00|DCM00|[CD]NM00|DVM00|DY[TM]20|DNT00|EA[TM]00)'
+  regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|R8001|A101OP|OPG01|A00[12]OP|(?:OPG02|X90[07][0679]|U70[57]T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33[wf]|A33fw|A37fw?|PAAM00|PAAT00|PAC[TM]00|R7kf|R7plus[fmt]?|A1601|CPH[0-9]{4}|CPH19(69|79|23|1[179])|PB(A[TM]00|CT10|BT30|CM[13]0|[FD]M00)|P(E[RFHG]M\d{2}|E[GH]T\d{2}|DAM10|ADM00|AF[TM]00|ADT00|AHM00|BBM[03]0|BBT00|BDT00|BFT00|[CB]E[MT]00|CA[MT]00|C[CDG]M00|CA[MT]10|[CD]PM00|CRM00|CDT00|CD[TM]10|CHM[013]0|CKM[08]0|CLM[15]0|DEM[13]0|DHM00|D[RK][TM]00|DPT00|DB[TM]00|DCM00|[CD]NM00|DVM00|DY[TM][12]0|DNT00|EA[TM]00|CRT01|EDM00)|PFDM00|PEG[MT]10|PEM[MT][02]0|PDET10|PDS[TM]00|PEC[MT]30|OPG03|PE[QYPEXNLU]M00|PCHT30|PFGM00|PF[VU]M10|A102OP|PFCM00|PFJM10|PGCM10|PECM20|PDAT10)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'PCHM10(?:[);/ ]|$)'
       model: 'A11'
+    - regex: 'PCHT30(?:[);/ ]|$)'
+      model: 'A11x'
     - regex: '(?:CPH2083|CPH2077)(?:[);/ ]|$)'
       model: 'A12'
+    - regex: '(?:CPH2179)(?:[);/ ]|$)'
+      model: 'A15s'
+    - regex: '(?:CPH2271)(?:[);/ ]|$)'
+      model: 'A16s'
+    - regex: '(?:CPH2185)(?:[);/ ]|$)'
+      model: 'A15'
     - regex: 'PCHM00(?:[);/ ]|$)'
       model: 'A11x'
     - regex: 'CPH1923(?:[);/ ]|$)'
-      model: 'A1K'
+      model: 'A1k'
+    - regex: 'CPH2071(?:[);/ ]|$)'
+      model: 'A11k'
+    - regex: 'CPH1925(?:[);/ ]|$)'
+      model: 'A1s'
+    - regex: 'CPH2269(?:[);/ ]|$)'
+      model: 'A16'
     - regex: '(?:OPPO[ _]?)?(CPH1837|PAD[TM]00)(?:[);/ ]|$)'
       model: 'A3'
     - regex: '(?:OPPO[ _]?)?A37f(w)(?:[);/ ]|$)'
@@ -10082,30 +14579,66 @@ OPPO:
       model: 'A39'
     - regex: 'CPH20(?:81|73|31|15)(?:[);/ ]|$)'
       model: 'A31'
+    - regex: 'CPH2137(?:[);/ ]|$)'
+      model: 'A33'
     - regex: '(?:OPPO[ _]?)?(?:CPH18(?:0[35]|53)|PBBM30)(?:[);/ ]|$)'
       model: 'A3s'
     - regex: '(?:OPPO[ _]?)?(?:CPH1809|PBA[TM]00|PBBT30)(?:[);/ ]|$)'
       model: 'A5'
     - regex: 'CPH19(?:3[13]|43)(?:[);/ ]|$)'
       model: 'A5 (2020)'
+    - regex: '(?:PEC[MT]30|PECM20)(?:[);/ ]|$)'
+      model: 'A53 5G'
     - regex: 'PDVM00(?:[);/ ]|$)'
       model: 'A32'
-    - regex: '(?:PDAM10|CPH2069|CPH2061)(?:[);/ ]|$)'
+    - regex: 'PEFM00(?:[);/ ]|$)'
+      model: 'A35'
+    - regex: '(?:PDA[TM]10|CPH2069|CPH2061)(?:[);/ ]|$)'
       model: 'A52'
-    - regex: 'CPH2127(?:[);/ ]|$)'
+    - regex: 'CPH(?:2127|213[19])(?:[);/ ]|$)'
       model: 'A53'
+    - regex: 'CPH2135(?:[);/ ]|$)'
+      model: 'A53s'
+    - regex: 'CPH2321(?:[);/ ]|$)'
+      model: 'A53s 5G'
+    - regex: '(?:CPH2195|OPG02|CPH2303)(?:[);/ ]|$)'
+      model: 'A54 5G'
+    - regex: '(?:CPH2239|CPH2241)(?:[);/ ]|$)'
+      model: 'A54'
+    - regex: 'CPH2273(?:[);/ ]|$)'
+      model: 'A54s'
+    - regex: 'PEM[MT][02]0(?:[);/ ]|$)'
+      model: 'A55 5G'
+    - regex: 'CPH2325(?:[);/ ]|$)'
+      model: 'A55'
+    - regex: '(?:A102OP|CPH2309)(?:[);/ ]|$)'
+      model: 'A55s 5G'
+    - regex: 'PFVM10'
+      model: 'A56 5G'
     - regex: '(?:OPPO[ _]?)?CPH170[15](?:[);/ ]|$)'
       model: 'A57'
     - regex: 'CPH19(?:09|1[02])(?:[);/ ]|$)'
       model: 'A5S'
     - regex: '(?:OPPO[ _]?)?(?:CPH190[15]|PBF[TM]00)(?:[);/ ]|$)'
       model: 'A7'
-    - regex: '(?:OPPO[ _]?)?(CPH1801|CPH1717)(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?CPH1717(?:[);/ ]|$)'
       model: 'A71'
+    - regex: '(?:OPPO[ _]?)?CPH1801(?:[);/ ]|$)'
+      model: 'A71 (2018)'
     - regex: '(?:OPPO[ _]?)?(?:PDY[TM]20|CPH2067)(?:[);/ ]|$)'
       model: 'A72'
+    - regex: 'CPH(?:2161|2099)(?:[);/ ]|$)'
+      model: 'A73 5G'
+    - regex: 'CPH2219(?:[);/ ]|$)'
+      model: 'A74'
+    - regex: 'CPH2263(?:[);/ ]|$)'
+      model: 'A74 5G'
+    - regex: '(?:OPPO[ _]?)?(?:PDY[TM]10)(?:[);/ ]|$)'
+      model: 'A72n 5G'
     - regex: '(?:OPPO[ _]?)?CPH1715(?:[);/ ]|$)'
       model: 'A77'
+    - regex: '(?:OPPO[ _]?)?A79kt'
+      model: 'A79'
     - regex: 'PCD[TM]00(?:[);/ ]|$)'
       model: 'A7n'
     - regex: '(PBBT00|PBBM00)(?:[);/ ]|$)'
@@ -10116,20 +14649,28 @@ OPPO:
       model: 'A83'
     - regex: '(?:OPPO[ _]?)?CPH1827(?:[);/ ]|$)'
       model: 'A83 (2018)'
-    - regex: 'PCA[TM]10(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?(?:PCA[TM]10|CPH1938)(?:[);/ ]|$)'
       model: 'A9'
     - regex: '(CPH1937|CPH1941|PCHM30)(?:[);/ ]|$)'
       model: 'A9 (2020)'
-    - regex: '(?:OPPO[ _]?)?CPH1938(?:[);/ ]|$)'
-      model: 'A9 (EN)'
     - regex: '(?:PCPM00|CPH20[02]1)(?:[);/ ]|$)'
       model: 'A91'
     - regex: 'CPH2059(?:[);/ ]|$)'
       model: 'A92'
-    - regex: 'PDKT00(?:[);/ ]|$)'
+    - regex: 'PDK[TM]00(?:[);/ ]|$)'
       model: 'A92s'
-    - regex: 'PDKM00(?:[);/ ]|$)'
+    - regex: '(?:PEH[MT]00|CPH212[13])(?:[);/ ]|$)'
+      model: 'A93'
+    - regex: '(?:PFGM00)(?:[);/ ]|$)'
       model: 'A93s'
+    - regex: 'PFUM10'
+      model: 'A96 5G'
+    - regex: '(?:CPH2203)(?:[);/ ]|$)'
+      model: 'A94'
+    - regex: '(?:CPH2197)(?:[);/ ]|$)'
+      model: 'A74 5G'
+    - regex: 'CPH2365|PELM00'
+      model: 'A95'
     - regex: 'PCE[TM]00(?:[);/ ]|$)'
       model: 'A9x'
     - regex: '(?:OPPO[ _]?)?CPH1851(?:[);/ ]|$)'
@@ -10140,10 +14681,14 @@ OPPO:
       model: 'AX7'
     - regex: '(?:OPPO[ _]?)?X9009(?:[);/ ]|$)'
       model: 'F1 Plus'
-    - regex: 'CPH1911(?:[);/ ]|$)'
+    - regex: 'CPH191[135](?:[);/ ]|$)'
       model: 'F11'
     - regex: 'CPH19(?:69|87)(?:[);/ ]|$)'
       model: 'F11 Pro'
+    - regex: '(?:OPPO[ _]?)?CPH2095'
+      model: 'F17'
+    - regex: '(?:OPPO[ _]?)?(?:CPH2119)(?:[);/ ]|$)'
+      model: 'F17 Pro'
     - regex: '(?:OPPO[ _]?)?A1601(?:[);/ ]|$)'
       model: 'F1s'
     - regex: '(?:OPPO[ _]?)?CPH1609(?:[);/ ]|$)'
@@ -10154,12 +14699,18 @@ OPPO:
       model: 'F5'
     - regex: '(?:OPPO[ _]?)?CPH1725(?:[);/ ]|$)'
       model: 'F5 Youth'
-    - regex: '(?:OPPO[ _]?)?CPH(1859|18(?:19|21))(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?CPH18(?:[15]9|21)(?:[);/ ]|$)'
       model: 'F7'
     - regex: '(?:OPPO[ _]?)?(?:CPH1825|CPH1881)(?:[);/ ]|$)'
       model: 'F9'
     - regex: '(?:OPPO[ _]?)?CPH1823(?:[);/ ]|$)'
       model: 'F9 Pro'
+    - regex: '(?:OPPO[ _]?)?CPH2223(?:[);/ ]|$)'
+      model: 'F19s'
+    - regex: '(?:OPPO[ _]?)?CPH2285(?:[);/ ]|$)'
+      model: 'F19 Pro'
+    - regex: '(?:OPPO[ _]?)?CPH2213(?:[);/ ]|$)'
+      model: 'F19 Pro Plus'
     - regex: '(?:OPPO[ _]?)?X909T?(?:[);/ ]|$)'
       model: 'Find 5'
     - regex: '(?:OPPO[ _]?)?R827T?(?:[);/ ]|$)'
@@ -10168,6 +14719,8 @@ OPPO:
       model: 'Find 7'
     - regex: '(?:OPPO[ _]?)?X900[067](?:[);/ ]|$)'
       model: 'Find 7a'
+    - regex: '(?:OPPO[ _]?)?PEUM00'
+      model: 'Find N 5G'
     - regex: '(?:OPPO[ _]?)?R815[TW]?(?:[);/ ]|$)'
       model: 'Find Clover'
     - regex: '(?:OPPO[ _]?)?R8015(?:[);/ ]|$)'
@@ -10178,16 +14731,22 @@ OPPO:
       model: 'Find Muse'
     - regex: '(?:OPPO[ _]?)?U707T?(?:[);/ ]|$)'
       model: 'Find Way S'
+    - regex: '(?:OPPO[ _]?)?U705T(?:[);/ ]|$)'
+      model: 'Ulike 2'
     - regex: '(?:OPPO[ _]?)?(?:CPH187[15]|PAF[MT]00)(?:[);/ ]|$)'
       model: 'Find X'
     - regex: '(?:OPPO[ _]?)?(?:PAHM00)(?:[);/ ]|$)'
       model: 'Find X Lamborghini'
-    - regex: '(?:OPPO[ _]?)?(?:PDEM10|CPH2023)(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?(?:PDE[TM]10|CPH2023)(?:[);/ ]|$)'
       model: 'Find X2'
     - regex: '(?:OPPO[ _]?)?CPH2005(?:[);/ ]|$)'
       model: 'Find X2 Lite'
     - regex: '(?:OPPO[ _]?)?(?:PDEM30|OPG01|CPH2025)(?:[);/ ]|$)'
       model: 'Find X2 Pro'
+    - regex: 'PEDM00(?:[);/ ]|$)'
+      model: 'Find X3'
+    - regex: '(?:PEEM00|CPH2173|OPG03)(?:[);/ ]|$)'
+      model: 'Find X3 Pro'
     - regex: '(?:OPPO[ _]?)?R1011 Build'
       model: 'Joy Plus'
     - regex: '(?:OPPO[ _]?)?(PBC(?:M30|T10))(?:[);/ ]|$)'
@@ -10198,6 +14757,10 @@ OPPO:
       model: 'K5'
     - regex: '(?:OPPO[ _]?)?(PCLM50)(?:[);/ ]|$)'
       model: 'K7'
+    - regex: '(?:OPPO[ _]?)?(PERM00)(?:[);/ ]|$)'
+      model: 'K7x'
+    - regex: '(?:OPPO[ _]?)?(?:PGCM10)'
+      model: 'K9x'
     - regex: '(?:OPPO[ _]?)?N5117(?:[);/ ]|$)'
       model: 'N1 Mini'
     - regex: '(?:OPPO[ _]?)?N520[79](?:[);/ ]|$)'
@@ -10208,7 +14771,7 @@ OPPO:
       model: 'Neo 3'
     - regex: '(?:OPPO[ _]?)?R831[SL](?:[);/ ]|$)'
       model: 'Neo 5'
-    - regex: '(?:OPPO[ _]?)?A33f(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?A33[wf](?:[);/ ]|$)'
       model: 'Neo 7'
     - regex: '(?:OPPO[ _]?)?A33fw(?:[);/ ]|$)'
       model: 'Neo 7s'
@@ -10216,10 +14779,14 @@ OPPO:
       model: 'Piano'
     - regex: '(?:OPPO[ _]?)?CPH1707(?:[);/ ]|$)'
       model: 'R11'
-    - regex: '(?:OPPO[ _]?)?CPH1719(?:[);/ ]|$)'
-      model: 'R11s'
-    - regex: '(?:OPPO[ _]?)?CPH1721(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?R11 Plusk?t?(?:[);/ ]|$)'
+      model: 'R11 Plus'
+    - regex: 'R8001(?:[);/ ]|$)'
+      model: 'R1K'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1721|R11s Plust?)(?:[);/ ]|$)'
       model: 'R11s Plus'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1719|R11st?)(?:[);/ ]|$)'
+      model: 'R11s'
     - regex: '(?:OPPO[ _]?)?(?:CPH1835|PAC[TM]00|PAAM00)(?:[);/ ]|$)'
       model: 'R15'
     - regex: '(?:OPPO[ _]?)?(?:CPH183[13]|PAAT00)(?:[);/ ]|$)'
@@ -10230,7 +14797,7 @@ OPPO:
       model: 'R17'
     - regex: '(?:OPPO[ _]?)?(?:CPH1893)(?:[);/ ]|$)'
       model: 'R17 Neo'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1877|CPH2119|PBD[MT]00)(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1877|PBD[MT]00)(?:[);/ ]|$)'
       model: 'R17 Pro'
     - regex: '(?:OPPO[ _]?)?R8006(?:[);/ ]|$)'
       model: 'R1L'
@@ -10240,13 +14807,13 @@ OPPO:
       model: 'R5'
     - regex: '(?:OPPO[ _]?)?R7kf(?:[);/ ]|$)'
       model: 'R7 Lite'
-    - regex: '(?:OPPO[ _]?)?R7Plusm(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?R7Plus[mt]?(?:[);/ ]|$)'
       model: 'R7 Plus'
     - regex: '(?:OPPO[ _]?)?R7Plusf(?:[);/ ]|$)'
       model: 'R7 Plus F'
     - regex: '(?:OPPO[ _]?)?X9079(?:[);/ ]|$)'
       model: 'R9 Plus'
-    - regex: '(?:OPPO[ _]?)?CPH1607(?:[);/ ]|$)'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1607|R9sk)(?:[);/ ]|$)'
       model: 'R9s'
     - regex: '(?:OPPO[ _]?)?(?:CPH1611|R9s Plus)(?:[);/ ]|$)'
       model: 'R9s Plus'
@@ -10254,9 +14821,7 @@ OPPO:
       model: 'Reno'
     - regex: 'CPH1983(?:[);/ ]|$)'
       model: 'Reno A'
-    - regex: 'PCCM00(?:[);/ ]|$)'
-      model: 'Reno 10X'
-    - regex: 'CPH1919(?:[);/ ]|$)'
+    - regex: '(?:CPH1919|PCCM00)(?:[);/ ]|$)'
       model: 'Reno 10X Zoom'
     - regex: '(?:PCKM00|CPH1907)(?:[);/ ]|$)'
       model: 'Reno 2'
@@ -10266,26 +14831,70 @@ OPPO:
       model: 'Reno 2Z'
     - regex: 'CPH2043(?:[);/ ]|$)'
       model: 'Reno 3'
-    - regex: 'CPH2013(?:[);/ ]|$)'
+    - regex: '(?:CPH2013|A002OP)(?:[);/ ]|$)'
       model: 'Reno 3A'
-    - regex: 'PDCM00(?:[);/ ]|$)'
+    - regex: '(?:PDCM00|A001OP)(?:[);/ ]|$)'
       model: 'Reno 3 5G'
-    - regex: '(?:PCRM00|CPH203[57]|CPH2009)'
+    - regex: '(?:PCRM00|CPH203[567]|CPH2009)'
       model: 'Reno 3 Pro'
+    - regex: 'PCRT01(?:[);/ ]|$)'
+      model: 'Reno 3 Lite'
     - regex: 'CPH2113(?:[);/ ]|$)'
       model: 'Reno 4 4G'
     - regex: 'CPH2125(?:[);/ ]|$)'
       model: 'Reno 4 Lite'
     - regex: 'CPH2109(?:[);/ ]|$)'
       model: 'Reno 4 Pro 4G'
-    - regex: 'PDP[TM]00(?:[);/ ]|$)'
+    - regex: '(?:PDP[TM]00|CPH2091)(?:[);/ ]|$)'
       model: 'Reno 4 5G'
     - regex: 'PEA[TM]00(?:[);/ ]|$)'
       model: 'Reno 4 SE 5G '
-    - regex: 'PDN[TM]00(?:[);/ ]|$)'
+    - regex: '(?:PDN[TM]00|CPH2089)(?:[);/ ]|$)'
       model: 'Reno 4 Pro 5G'
-    - regex: 'CPH192[15]'
+    - regex: 'CPH2065(?:[);/ ]|$)'
+      model: 'Reno 4Z 5G'
+    - regex: 'CPH2209(?:[);/ ]|$)'
+      model: 'Reno 4F'
+    - regex: 'CPH2159(?:[);/ ]|$)'
+      model: 'Reno 5'
+    - regex: '(?:CPH2199|A101OP)(?:[);/ ]|$)'
+      model: 'Reno 5A'
+    - regex: 'CPH2205(?:[);/ ]|$)'
+      model: 'Reno 5 Lite'
+    - regex: '(?:PEG[MT]00|CPH2145)(?:[);/ ]|$)'
+      model: 'Reno 5 5G'
+    - regex: 'PEG[MT]10(?:[);/ ]|$)'
+      model: 'Reno 5K'
+    - regex: 'CPH2217(?:[);/ ]|$)'
+      model: 'Reno 5F'
+    - regex: 'CPH2211(?:[);/ ]|$)'
+      model: 'Reno 5Z'
+    - regex: '(?:PDS[TM]00|CPH220[17])(?:[);/ ]|$)'
+      model: 'Reno 5 Pro 5G'
+    - regex: 'PDR[TM]00(?:[);/ ]|$)'
+      model: 'Reno 5 Pro Plus 5G'
+    - regex: 'CPH1921(?:[);/ ]|$)'
       model: 'Reno 5G'
+    - regex: '(?:CPH2235|PEQM00|CPH2251)(?:[);/ ]|$)'
+      model: 'Reno 6'
+    - regex: 'CPH2237(?:[);/ ]|$)'
+      model: 'Reno 6 Z 5G'
+    - regex: 'PEPM00(?:[);/ ]|$)'
+      model: 'Reno 6 Pro'
+    - regex: 'CPH224[79](?:[);/ ]|$)'
+      model: 'Reno 6 Pro 5G'
+    - regex: 'PENM00(?:[);/ ]|$)'
+      model: 'Reno 6 Pro Plus'
+    - regex: 'PFJM10'
+      model: 'Reno 7'
+    - regex: 'PFCM00'
+      model: 'Reno 7 SE'
+    - regex: 'PFDM00(?:[);/ ]|$)'
+      model: 'Reno 7 Pro'
+    - regex: '(?:PEYM00)(?:[);/ ]|$)'
+      model: 'K9 Pro 5G'
+    - regex: '(?:PEXM00)(?:[);/ ]|$)'
+      model: 'K9 5G'
     - regex: 'PCLM10(?:[);/ ]|$)'
       model: 'Reno Ace'
     - regex: 'PDHM00(?:[);/ ]|$)'
@@ -10294,6 +14903,8 @@ OPPO:
       model: 'Reno K3'
     - regex: '(?:OPPO[ _]?)?(?:CPH1979|PCD[TM]10)(?:[);/ ]|$)'
       model: 'Reno Z'
+    - regex: 'A59st(?:[);/ ]|$)'
+      model: 'A59s'
 
     - regex: 'N1T?(?:[);/ ]|$)'
       model: 'N1T'
@@ -10308,28 +14919,16 @@ OPPO:
     - regex: '(?:OB-)?OPPO[ _]?((?!Browser)[a-z0-9]+)'
       model: '$1'
 
-# Opsson
-Opsson:
-  regex: 'Opsson|IUSAI'
-  device: 'smartphone'
-  models:
-    - regex: 'IUSAI[ _]([^/;]+) Build'
-      model: 'Iusai $1'
-    - regex: 'IUSAI[ _]([^/;\)]+)[/;\)]'
-      model: 'Iusai $1'
-    - regex: 'Opsson[ _]([^/;]+) Build'
-      model: '$1'
-    - regex: '(?:Opsson-)?Opsson[ -_]([^/;]+)/'
-      model: '$1'
-
-# orange
-Orange:
-  regex: 'SPV[ \-]?([a-z0-9]+)|(?<!FBCR/)Orange[ _-](?!Tahiti-LS\))([^/;]+)( Build|\))(?<!Tahiti-LS\))|SC/IHD92|Nura 2|FunTab ([^/;]+) Build'
+# orange
+Orange:
+  regex: 'SPV[ \-]?([a-z0-9]+)|(?<!FBCR/)Orange[ _-](?!Tahiti-LS\))([^/;]+)( Build|\))(?<!Tahiti-LS\))|SC/IHD92|Nura 2|FunTab ([^/;]+) Build|Orange Mahpee|Dive 50'
   device: 'smartphone'
   models:
     - regex: 'SC/IHD92'
-      model: 'Livebox Play'
       device: 'tv' # set top box
+      model: 'Livebox Play'
+    - regex: 'Nola play'
+      model: 'Nola Play'
     - regex: 'Nura 2'
       model: 'Nura 2'
     - regex: 'Sego'
@@ -10340,31 +14939,63 @@ Orange:
       device: 'tablet'
     - regex: 'Orange[ _-](Rise)(3[12]|5[12])(?:[);/ ]|$)'
       model: '$1 $2'
-    - regex: 'Orange[ _-](Dive)72(?:[);/ ]|$)'
-      model: '$1 72'
-    - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali)(?:[);/ ]|$)'
+    - regex: '(?:Orange[ _-])?Dive ?(\d+) Dual(?:[);/ ]|$)'
+      model: 'Dive $1 Dual'
+    - regex: '(?:Orange[ _-])?Dive ?(\d+)(?:[);/ ]|$)'
+      model: 'Dive $1'
+    - regex: 'Orange[ _-](Daytona|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali|Mahpee)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'SPV[ \-]?([a-z0-9]+)'
       model: 'SPV $1'
 
 # Oukitel
 Oukitel:
-  regex: 'OUKITEL|(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|U20_Plus|WP5 Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000)(?:[);/ ]|$)'
+  regex: 'OUKITEL|(?:Android 10.+ (?:C19|C22)|Android 8.+ U23|Android 7.+ (?:U1[78]|U22)|(?:C1[569]|K10000|K[46]000)(?:[ _]Pro)|K4000Pro|C1[18]_Pro|C1[0237] Pro|C2[13] Pro|C12 Plus|U15 Pro|K15_Plus|U16 Max|C11_F|U7 Max|U7 Plus|U11[_ ]Plus|U20_Plus|OK6000 Plus|WP5000|WP[58] Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K7 Power|K[4-8]000| RT1| WP(?:[15-79]|1[02357])|K[37]_Pro|K13_Pro|U25_Pro)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(C15|C16|K10000|K[46]000|WP5)[ _]Pro(?:[);/ ]|$)'
+    - regex: '(C1[0-9]|C2[13]|K10000|K[46]000|WP[258]|WP12|U[12]5|K[37]|K13)[ _]?Pro(?:[);/ ]|$)'
       model: '$1 Pro'
-    - regex: 'OUKITEL K3(?:[);/ ]|$)'
-      model: 'K3'
-    - regex: '(K10000)[ _]Max(?:[);/ ]|$)'
+    - regex: 'OUKITEL K([37])(?:[);/ ]|$)'
+      model: 'K$1'
+    - regex: '(K10000|U16|U7)[ _]Max(?:[);/ ]|$)'
       model: '$1 Max'
-    - regex: '(U20|K[46]000)[_ ]Plus(?:[);/ ]|$)'
+    - regex: '(U20|K[46]000|U7|U11|OK6000|K15|C12)[_ ]?Plus(?:[);/ ]|$)'
       model: '$1 Plus'
     - regex: '(K4000)[_ ]Lite(?:[);/ ]|$)'
       model: '$1 Lite'
-    - regex: '(Y4800|K10000|K[4567]000)(?:[);/ ]|$)'
+    - regex: '(K10000)[_ ]Mix(?:[);/ ]|$)'
+      model: '$1 Mix'
+    - regex: 'K7 Power(?:[);/ ]|$)'
+      model: 'K7 Power'
+    - regex: '(Y4800|K10000|K[4-8]000|WP5000|[CU]2|U1[078]|U2[23]|C19|C22)(?:[);/ ]|$)'
       model: '$1'
 
+    - regex: ' (RT1)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+
+    - regex: '(?:OUKITEL)? (WP\d+|C11_F)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'OUKITEL; ([^;]+);'
+      model: '$1'
+
+# OKWU
+OKWU:
+  regex: 'OKWU SIGMA(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Sigma'
+
+# Orion
+Orion:
+  regex: 'ORION, ([a-z0-9_ \-]+), (?:wired|wireless)|CRANE-EVB'
+  device: 'tv'
+  models:
+    - regex: 'ORION, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+    - regex: '(CRANE-EVB)'
+      model: 'CRANE-EVB'
+      device: 'tablet'
+
 # Ouki
 Ouki:
   regex: 'OUKI|OK[AU][0-9]+[a-z]* Build'
@@ -10381,7 +15012,7 @@ Ouki:
 
 # Overmax
 Overmax:
-  regex: 'OV-[a-z]+(?:[^;(/]*)[();/ ]|Qualcore 1010|Vertis 5021 Aim|OV1027[34]G'
+  regex: 'OV-[a-z]+(?:[^;(/]*)[();/ ]|Qualcore 10(?:10|27)|Livecore7032|Vertis 5021 Aim|Vertis 4004 You|OV1027[34]G'
   device: 'tablet'
   models:
     - regex: 'OV-V10'
@@ -10390,28 +15021,34 @@ Overmax:
     - regex: 'Vertis 5021 Aim'
       model: 'Vertis 5021 Aim'
       device: 'smartphone'
+    - regex: 'Vertis 4004 You'
+      model: 'Vertis 4004 You'
+      device: 'smartphone'
     - regex: 'OV-Vertis[ _-]([^;/]+) Build'
       model: 'Vertis $1'
       device: 'smartphone'
-
+    - regex: 'Livecore7032'
+      model: 'Livecore 7032'
     - regex: 'Qualcore 1010'
       model: 'Qualcore 1010'
-      device: 'tablet'
+    - regex: 'Qualcore 1027 4G'
+      model: 'Qualcore 1027 4G'
     - regex: 'OV1027([34])G'
       model: 'Qualcore 1027 $1G'
-      device: 'tablet'
-
     - regex: '(OV-[a-z]+(?:[^;(/]*))(?<!Build)[();/ ]'
       model: '$1'
 
 # Oysters
 Oysters:
-  regex: 'Oysters|T84ERI[ _]3G|T72HM(s_)?3G|T102MS_3G|T102ER3G|(T74HMi|T84Bi)[_ ]4G|T74MR4G|T84Ni[_ ][34]G|Pacific[ ]?800i|T104B_[34]G|IndianV|T72HA_3G|T74D_3G|T74N_3G|T74SC_3G|T74Mai_3G|T104MBi_3G|T104SCi_3G|T104ER4G|Atlantic4G|AntarcticE'
+  regex: 'Oysters|T84ERI[ _]3G|T72HM(s_)?3G|T102MS_3G|T102ER3G|(T74HMi|T84Bi)[_ ]4G|T74MR4G|T84Ni[_ ][34]G|Pacific(?:[ ]?800i|E)|T104B_[34]G|IndianV|T72HA_3G|T74D_3G|T74N_3G|T74SC_3G|T74Mai_3G|T104MBi_3G|T104SCi_3G|T104ER4G|Atlantic4G|AntarcticE|T7V 3G|Pacific(?:VS?|4G)'
   device: 'tablet'
   models:
     - regex: 'Pacific[ ]?800i'
       device: 'smartphone'
       model: 'Pacific 800i'
+    - regex: 'PacificE'
+      device: 'smartphone'
+      model: 'Pacific E'
     - regex: 'Atlantic4G'
       device: 'smartphone'
       model: 'Atlantic 4G'
@@ -10421,20 +15058,24 @@ Oysters:
     - regex: 'IndianV'
       device: 'smartphone'
       model: 'Indian V'
+    - regex: '(?:Oysters[_ ])?Pacific(VS?|4G)'
+      device: 'smartphone'
+      model: 'Pacific $1'
     - regex: 'Oysters ((?:Arctic|Indian|Atlantic|Pacific)[^/;]+) Build'
       device: 'smartphone'
       model: '$1'
     - regex: '(T84ERI[ _]3G|T72HM(s_)?3G|(?:(T74HMi|T84Bi)[_ ]4G)|T84Ni[_ ][34]G)'
       model: '$1'
-    - regex: '(T74MR|T102MS|T104B|T74SC|T74[DN]|T72HA|T102ER|T104SCi|T104MBi|T104ER)[ _]?([34]G)'
+    - regex: '(T74MR|T102MS|T104B|T74SC|T74[DN]|T72HA|T102ER|T104SCi|T104MBi|T104ER|T7V)[ _]?([34]G)'
       model: '$1 $2'
     - regex: 'T74Mai_3G'
       model: 'T74MAi 3G'
     - regex: 'Oysters ([^/;]+)( Build|\))'
       model: '$1'
-# öwn (own)
+
+# öwn (own mobile)
 öwn:
-  regex: 'OWN|S4035[ _][34]G'
+  regex: 'OWN[ _]|(?:S4035[ _][34]G|Smart8|SMART PLUS LTE)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'FUN ([67])'
@@ -10449,6 +15090,10 @@ Oysters:
       model: 'One'
     - regex: 'SMART 9'
       model: 'Smart 9'
+    - regex: 'Smart8(?:[);/ ]|$)'
+      model: 'Smart 8'
+    - regex: 'SMART PLUS LTE(?:[);/ ]|$)'
+      model: 'Smart Plus LTE'
 
 # Panacom
 Panacom:
@@ -10461,18 +15106,26 @@ Panacom:
 
 # panasonic
 Panasonic:
-  regex: 'Panasonic|PANATV[0-9]+|Viera/|(?:P902i|P-08D|FZ-B2D|FZ-[NX]1|DMC-CM1|P-01J)(?:[);/ ]|$)|Eluga[ _]|P55 Novo 4G'
+  regex: 'Panasonic|PANATV[0-9]+|Viera/|(?:P902i|P-0[28]D|FZ-B2D|FZ-[NX]1|DMC-CM1|P-01J|P-0[23]E|P55 Max)(?:[);/ ]|$)|Eluga[ _]|P55 Novo 4G'
   device: 'smartphone'
   models:
     - regex: 'P-01J(?:[);/ ]|$)'
       model: 'P-smart Keitai'
+    - regex: 'P-03E(?:[);/ ]|$)'
+      model: 'Eluga P'
+    - regex: 'P-02E(?:[);/ ]|$)'
+      model: 'Eluga X'
+    - regex: 'Eluga[ _]I7(?:_EE)?'
+      model: 'Eluga I7'
     - regex: 'Eluga[ _-]([^;/]+) Build'
       model: 'Eluga $1'
-    - regex: 'Eluga[ _-]([^;/]+)(?:[;/)]|$)'
+    - regex: 'Eluga[ _-]([^);/]+)[;/)]'
       model: 'Eluga $1'
     - regex: '(DMC-CM1)'
       model: 'Lumix $1'
       device: 'camera'
+    - regex: 'P-02D(?:[);/ ]|$)'
+      model: 'Lumix Phone P-02D'
     - regex: '(FZ-[XN]1)(?:[);/ ]|$)'
       model: 'Toughpad $1'
     - regex: 'FZ-B2D(?:[);/ ]|$)'
@@ -10480,6 +15133,8 @@ Panasonic:
       device: 'tablet'
     - regex: 'P55 Novo 4G'
       model: 'P55 Novo 4G'
+    - regex: 'P55 Max'
+      model: 'P55 Max'
     - regex: 'P902i(?:[);/ ]|$)'
       device: 'feature phone'
       model: 'P902i'
@@ -10489,6 +15144,12 @@ Panasonic:
     - regex: 'PANATV[0-9]+|Viera/'
       device: 'tv'
       model: 'Smart TV'
+    - regex: '(43D1200|(?:32|43)D1270|32D1280)'
+      device: 'tv'
+      model: '$1'
+    - regex: 'PANASONIC, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+      device: 'tv'
     - regex: 'Panasonic[ _\-]?([a-z0-9]+)'
       model: '$1'
     - regex: 'portalmmm/2.0 (P[a-z0-9]+)'
@@ -10534,7 +15195,7 @@ PCD Argentina:
 
 # ArmPhone
 ArmPhone:
-  regex: '(TSD Octa A0520P|TSD Quadra A0509P)(?:[);/ ]|$)'
+  regex: '(TSD Octa A0520P|TSD Quadra A050[59]P)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -10545,7 +15206,7 @@ Pentagram:
   models:
     - regex: '(?:PENTAGRAM[_ ])?EON[_ ]PRIX'
       model: 'Eon Prix'
-    - regex: 'Quadra 7( UltraSlim)?'
+    - regex: 'Quadra 7(?: UltraSlim)?'
       model: 'Quadra 7 UltraSlim'
     - regex: 'Monster X5?'
       model: 'Monster X5'
@@ -10558,43 +15219,116 @@ Pentagram:
       model: '$1'
       device: 'smartphone'
 
-# philips
-Philips:
-  regex: 'Philips|AND1E(?:[);/ ]|$)|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E|Xenium S[25]66'
+# Tcl (tcl.com)
+TCL:
+  regex: 'TCL,|TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|4187[DMU]|5004S|5087Z|5101A|5102[BKM]|5107G|5130[JM]|5133A|5148A|5152D|5159[AJ]|5199I|6125[ADFH]|6156H|7040N|9048S|A(?:50[279]|600)DL|T(?:671[EFHO]|766[AHJU]|767H|770[BH]|773O|774H|775[BH]|780H|781|782H|790Y|799[BH]|810[HS])|Percee TV|BeyondTV\d?)(?:_(?:RU|EEA|TR))?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Xenium S([25]66)(?:[);/ ]|$)'
-      model: 'Xenium S$1'
-    - regex: 'AND1E(?: TV)?(?:[);/ ]|$)'
-      model: 'Android TV'
-      device: 'tv'
-    - regex: '(PI3210G)'
+    - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
+      model: 'Gala G60'
+    - regex: '5004S(?:[);/ ]|$)'
+      model: 'Signa'
+    - regex: '4187D(?:[);/ ]|$)'
+      model: '205'
+    - regex: 'T774H(?:[);/ ]|$)'
+      model: '20L'
+    - regex: 'T775B(?:[);/ ]|$)'
+      model: '20L Plus Premium Edition'
+    - regex: 'T775H(?:[);/ ]|$)'
+      model: '20L Plus'
+    - regex: '6125[ADFH]'
+      model: '20E'
+    - regex: '6156H'
+      model: '20Y'
+    - regex: '5199I(?:[);/ ]|$)'
+      model: 'C9'
+    - regex: 'A509DL(?:[);/ ]|$)'
+      model: 'A3'
+    - regex: 'A600DL(?:[);/ ]|$)'
+      model: 'A3X'
+    - regex: '5152D(?:[);/ ]|$)'
+      model: 'C5'
+    - regex: '5133A(?:[);/ ]|$)'
+      model: 'L5'
+    - regex: '5102[BKM](?:[);/ ]|$)'
+      model: 'L7'
+    - regex: '5159[AJ](?:[);/ ]|$)'
+      model: 'L9'
+    - regex: '5101A(?:[);/ ]|$)'
+      model: 'L9 Plus'
+    - regex: '5107G(?:[);/ ]|$)'
+      model: 'L9S'
+    - regex: '5130J(?:[);/ ]|$)'
+      model: 'L10+'
+    - regex: '4187[MU](?:[);/ ]|$)'
+      model: 'L10 Lite'
+    - regex: '5148A(?:[);/ ]|$)'
+      model: 'T9'
+    - regex: '5130M(?:[);/ ]|$)'
+      model: 'T Pro'
+    - regex: 'T780H(?:[);/ ]|$)'
+      model: 'Plex'
+    - regex: 'T782H(?:[);/ ]|$)'
+      model: '10 Plus'
+    - regex: 'T790Y(?:[);/ ]|$)'
+      model: '10 5G'
+    - regex: 'TCL[_ -]([^;/]+) Build'
       model: '$1'
-      device: 'tablet'
-    - regex: '(TPM1[79]1E)' # Smart Tv 2018/2019
+    - regex: 'TCL[_ -]([a-z0-9]+)'
+      model: '$1'
+    - regex: '(7040N)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'A502DL(?:[);/ ]|$)'
+      model: 'LX'
+    - regex: 'A507DL(?:[);/ ]|$)' # TracFone A507DL
+      model: 'A2'
+    - regex: 'T770[HB](?:[);/ ]|$)'
+      model: '10L'
+    - regex: 'T766[AHJU](?:_(?:EEA|RU))?(?:[);/ ]|$)'
+      model: '10 SE'
+    - regex: 'T671[HFEO](?:_EEA)?(?:[);/ ]|$)'
+      model: '20 SE'
+    - regex: 'T767H(?:[);/ ]|$)'
+      model: '20R 5G'
+    - regex: 'T773O(?:[);/ ]|$)'
+      model: '20S'
+    - regex: '5087Z(?:[);/ ]|$)'
+      model: '20 XE'
+    - regex: 'T781(?:[);/ ]|$)'
+      model: '20 5G'
+    - regex: 'T810[SH](?:[);/ ]|$)'
+      model: '20 Pro 5G'
+    - regex: 'T799[BH]'
+      model: '10 Pro'
+    - regex: 'T766H'
+      model: '10 SE'
+
+    - regex: '9048S(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Tab 8" 4G'
+
+    - regex: '(Percee TV)(?:[);/ ]|$)'
       device: 'tv'
-    - regex: '(QM16[134]E)'
       model: '$1'
+    - regex: 'BeyondTV(\d)?(?:[);/ ]|$)'
       device: 'tv'
-    - regex: '(70PUH6774)_96'
-      model: '$1/96 4K UHD'
+      model: 'Beyond TV $1'
+    - regex: '((?:43|55)S62FS|(?:43|50)P65US|U(?:43|60|65)P60|65P4USM|(?:40|49)S62|L32S6|55P610|50P8S|55S62|(?:43|50)P6US|55DP60)'
       device: 'tv'
-    - regex: '(TLE821L)(?:[);/ ]|$)'
-      model: '$1 4G LTE'
-      device: 'tablet'
-    - regex: '(TLE722G)(?:[);/ ]|$)'
       model: '$1'
-      device: 'tablet'
-    - regex: 'Philips, BDP([0-9]{4})'
-      model: 'Blu-ray Player (BDP$1)'
-      device: 'tv'
-    - regex: '(NETTV/[0-9\.]{5})'
-      model: 'NetTV Series'
+
+# JVC
+JVC:
+  regex: 'JVC[;,]|AV-10NT310'
+  device: 'tv'
+  models:
+    - regex: 'JVC[;,](32D1290)'
+      model: '$1'
+    - regex: 'JVC, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
       device: 'tv'
-    - regex: 'Philips-FISIO ([a-z0-9]+)'
-      model: 'Fisio $1'
-    - regex: 'Philips[ _-]?([a-z0-9\-@]+)'
+    - regex: '(AV-10NT310)'
+      device: 'tablet'
       model: '$1'
 
 # phoneOne
@@ -10615,35 +15349,59 @@ Primepad:
 
 # Pioneer
 Pioneer:
-  regex: 'Pioneer|.*; R1 Build|dvr700pi'
+  regex: 'Pioneer|.*; R1 Build|(?:dvr700pi|XDP-300R|F9212[AB])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '.*; R1 Build'
       model: 'R1'
       device: 'tablet'
+    - regex: 'dvr700pi'
+      model: 'DVR700PI 7.0"'
+      device: 'tablet'
+    - regex: '(XDP-300R)'
+      device: 'portable media player'
+      model: '$1'
+    - regex: '(F9212[AB])'
+      device: 'car browser'
+      model: '$1'
+    - regex: 'BDP-160'
+      device: 'tv'
+      model: 'BDP-160'
+    - regex: 'Pioneer, ?([a-z0-9_ \-]+), ?(?:wired|wireless)'
+      device: 'tv'
+      model: ''
     - regex: 'Pioneer[ _-]?([^;/]+) Build'
       model: '$1'
     - regex: 'Pioneer[ _-]?([^;/)]+)(?:[;/)]|$)'
       model: '$1'
-    - regex: 'dvr700pi'
-      model: 'DVR700PI 7.0"'
-      device: 'tablet'
 
 # Pixus
 Pixus:
-  regex: 'Pixus|(Ride[_ ][34]G|Play[ _]Three[ _]v(?:[24].0|3.1))(?:[);/ ]|$)'
+  regex: 'Pixus|(hiPower|Touch_7_3G|Ride[_ ][34]G|Play[ _]Three[ _]v(?:[234].0|3.1))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'Ride[_ ]([34])G'
       model: 'Ride $1G'
-    - regex: 'Play[ _]Three[ _]v([24].0|3.1)'
+    - regex: 'Play[ _]Three[ _]v([234].0|3.1)'
       model: 'Play Three v$1'
     - regex: 'Play Two'
       model: 'Play Two'
-    - regex: 'Touch 7 3G'
+    - regex: 'Play Five'
+      model: 'Play Five'
+    - regex: 'hiPower'
+      model: 'hiPower'
+    - regex: 'Pixus[ _]Sprint'
+      model: 'Sprint'
+    - regex: '(?:Pixus_)?Touch[ _]7[ _]3G'
       model: 'Touch 7 3G'
     - regex: 'Pixus[ _]hiMax'
       model: 'HiMax 9.6"'
+    - regex: 'Pixus[ _]Blast'
+      model: 'Blast 10.1"'
+    - regex: 'Pixus[ _]Joker'
+      model: 'Joker 10.1"'
+    - regex: 'Pixus Blaze 10.1 3G'
+      model: 'Blaze 10.1" 3G'
 
     - regex: 'Raze'
       model: 'Raze'
@@ -10667,6 +15425,22 @@ PULID:
     - regex: 'PULID[ _]([a-z0-9_]+)\)'
       model: '$1'
 
+# Purism (https://puri.sm/)
+Purism:
+  regex: 'Librem 5'
+  device: 'smartphone'
+  models:
+    - regex: 'Librem 5'
+      model: 'Librem 5'
+
+# Point Mobile (https://pointmobile.com/)
+'Point Mobile':
+  regex: 'PM80'
+  device: 'peripheral'
+  models:
+    - regex: 'PM80'
+      model: 'PM80'
+
 # Point of View
 'Point of View':
   regex: 'POV_TV|POV_TAB|MOB-5045'
@@ -10719,53 +15493,102 @@ PPTV:
 
 # ProScan
 ProScan:
-  regex: 'PLT([^;/]+) Build'
+  regex: 'PLT([^;/]+) Build|PLT(?:777[45]|9774|1074)G(?:[);/ ]|$)'
   device: 'tablet'
-  model: 'PLT$1'
+  models:
+    - regex: 'PLT([^;/]+) Build'
+      model: 'PLT$1'
+    - regex: 'PLT(777[45]|9774|1074)G'
+      model: 'PLT$1G'
 
-# RCA Tablets
+# RCA Tablets (RCA) (www.rca.com)
 'RCA Tablets':
-  regex: 'RCT([^;/]+) Build|RCA RLTP4028'
+  regex: 'RCT([^;/]+) Build|RCA RLTP4028|RC7T3G21|RCT6B06P23|RCT6613W23P|RCT6513W87|RCT6973W43(?:MD)?|RCT6703W12|RCT(?:6A06P22|6603W47M7|6303W87(?:DK|M)|6773W22B|6203W46L|6873W42M|6K03W13|6876Q22N|6A06Q22)'
   device: 'smartphone'
   models:
     - regex: 'RCA RLTP4028'
       model: 'RLTP4028'
-    - regex: 'RCT([^;/]+) Build'
+    - regex: 'RCT6513W87'
+      device: 'tablet'
+      model: 'Galileo Pro 11.5"'
+    - regex: 'RCT6873W42M|RCT6876Q22N?'
+      device: 'tablet'
+      model: 'Voyager 7.0"'
+    - regex: 'RCT6973W43(?:MD)?'
+      device: 'tablet'
+      model: 'Voyager III 7.0"'
+    - regex: 'RCT6773W22B'
+      device: 'tablet'
+      model: 'Voyager II 7.0"'
+    - regex: 'RCT6703W12|RCT6B06P23'
+      device: 'tablet'
+      model: 'Atlas 10.0"'
+    - regex: 'RCT6203W46L'
+      device: 'tablet'
+      model: 'Pro 10 Edition II'
+    - regex: 'RCT6A06P22'
+      device: 'tablet'
+      model: 'Endeavor 10.0" HD'
+    - regex: 'RCT(?:6303W87(?:DK|M)|6K03W13)'
+      device: 'tablet'
+      model: 'Viking Pro 10.0"'
+    - regex: 'RCT6603W47M7'
+      device: 'tablet'
+      model: 'Viking II 10.0"'
+    - regex: 'RCT6613W23P'
+      device: 'tablet'
+      model: 'Delta Pro 11.6"'
+    - regex: 'RCT([^;/)]+)(?: Build|[;)])'
       device: 'tablet'
       model: 'RCT$1'
+    - regex: 'RC([^;/)]+)(?: Build|[;)])'
+      device: 'tablet'
+      model: 'RC$1'
 
 # Readboy
 Readboy:
   regex: 'Readboy[ _-]'
   device: 'tablet'
   models:
-    - regex: 'Readboy[ _-]([^;/]+) Build'
-      model: '$1'
-    - regex: 'Readboy[ _-]([^;/]+)(?:[;/)]|$)'
+    - regex: 'Readboy[ _-]C18Max'
+      model: 'C18 Max'
+    - regex: 'Readboy[ _-]C(\d+)Pro'
+      model: 'C$1 Pro'
+    - regex: 'Readboy[ _-]([^;/)]+)(?: Build|[;)])'
       model: '$1'
 
 # Roku
 Roku:
-  regex: 'Roku/DVP'
+  regex: 'Roku(?:OS)?/(?:DVP|Pluto)?-?|QSP; Roku'
   device: 'tv'
-  model: 'Digital Video Player'
+  models:
+    - regex: '3930X'
+      model: 'Express'
+    - regex: ''
+      model: 'Digital Video Player'
 
-# Rokit
+# Rokit (rokitphones.com)
 Rokit:
-  regex: 'IO Pro'
+  regex: 'IO (?:Pro|3D|Light)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IO Pro'
       model: 'IO Pro'
+    - regex: 'IO Light'
+      model: 'IO Light'
+    - regex: 'IO 3D'
+      model: 'IO 3D'
 
-# Rombica
+# Rombica (rumbica.ru)
 Rombica:
-  regex: '(Rombica|SSQ-A0500)(?:[);/ ]|$)'
+  regex: 'Rombica[_ ]|(SSQ-A0500|Smart Box v[0-9]+|Smart Box (?:[ADBXZ]1|[GDFQ]2|A3|H4))(?:[);/ ]|$)'
   device: 'tv'
   models:
     - regex: 'SSQ-A0500(?:[);/ ]|$)'
       model: 'Smart Stick 4K'
-    - regex: '(Infinity K8|Smart Box (?:v005|Quad|Ultra HD v002|4K V001))(?:[);/ ]|$)'
+    - regex: '(?:Rombica[_ ])?Cinema4K_v01'
+      model: 'Cinema 4K v01'
+    - regex: '(Infinity K8|Smart Box (?:v00[3-9]|Quad|Ultra HD v002|4K V001|[ADBXZ]1|[GDFQ]2|A3|H4)|TV (?:Ultima|Fly))(?:[);/ ]|$)'
       model: '$1'
 
 # Rover
@@ -10774,16 +15597,18 @@ Rover:
   device: 'feature phone'
   model: '$1'
 
-# RoverPad
+# RoverPad or Rover Pad
 RoverPad:
-  regex: '(RoverPad|RoverPhone)(?:[);/ ]|$)'
+  regex: '(?:Rover[ ]?Pad|RoverPhone|Sky 7.85 3G|Pro_Q(?:8|10)_LTE)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'RoverPhone(?:[);/ ]|$)'
       model: ''
       device: 'smartphone'
-    - regex: 'RoverPad sky 7.85(?:[);/ ]|$)'
-      model: 'Sky 7.85'
+    - regex: 'Pro_Q(8|10)_LTE(?:[);/ ]|$)'
+      model: 'Pro Q$1 LTE'
+    - regex: '(?:Rover[ ]?Pad)?sky 7.85(?: 3G)?(?:[);/ ]|$)'
+      model: 'Sky 7.85" 3G'
     - regex: 'RoverPad (10.4|Air S70|9.7 3G|Sky 9.7|3W A73|3W7|3WT70|3W9.4)(?:[);/ ]|$)'
       model: '$1'
 
@@ -10795,34 +15620,53 @@ Roadrover:
 
 # RT Project
 RT Project:
-  regex: 'Shock 5'
+  regex: 'Shock ?(?:5|5\.5)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Shock ?(5|5\.5)(?:[);/ ]|$)'
+      model: 'Shock $1'
+
+# S-TELL
+S-TELL:
+  regex: 'S-TELL|(?:M630|M55[78]|P760|M555i)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Shock 5'
-      model: 'Shock 5'
+    - regex: '(P760)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(?:S-TELL[ _])?M([0-9]{3}|555i)(?:[);/ ]|$)'
+      model: 'M$1'
 
 # Safaricom
 Safaricom:
-  regex: 'NEON_RAY'
+  regex: 'NEON[_ ]RAY'
   device: 'smartphone'
   models:
+    - regex: 'NEON_RAY_PRO'
+      model: 'Neon Ray Pro'
     - regex: 'NEON_RAY'
       model: 'Neon Ray'
-
+    - regex: 'NEON RAY 2'
+      model: 'Neon Ray 2'
 
 # Santin
 Santin:
-  regex: '(?:SANTIN|BiTBiZ_V58|ACTOMA ACE|DREAMPLUS03A|Candy U7 Pro)[);/_ ]'
+  regex: 'SANTIN|(?:BiTBiZ_V58|ACTOMA ACE|DREAMPLUS03A|Candy U7 Pro|GAAMII|RS635H)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'BiTBiZ_V58(?:[);/ ]|$)'
       model: 'BiTBiZ V58'
+    - regex: 'GAAMII G1(?:[);/ ]|$)'
+      model: 'GAAMII G1'
+    - regex: 'GAAMII(?:[);/ ]|$)'
+      model: 'GAAMII'
     - regex: 'Candy U7 Pro(?:[);/ ]|$)'
       model: 'Candy U7 Pro'
     - regex: 'DREAMPLUS03A(?:[);/ ]|$)'
       model: 'Dream Plus 03A'
     - regex: 'GreenOrange(?:[);/ ]|$)'
       model: 'Green Orange'
+    - regex: 'CLASSONE(?:[);/ ]|$)'
+      model: 'Class One'
     - regex: 'halove(?:[);/ ]|$)'
       model: 'Halove'
     - regex: 'ACTOMA ACE(?:[);/ ]|$)'
@@ -10835,32 +15679,40 @@ Santin:
       model: 'Galaz'
     - regex: 'NEWDUN(?:[);/ ]|$)'
       model: 'Newdun'
-    - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9)(?:[);/ ]|$)'
+    - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9(?:[ _]Pro)?|Life Shine|ovvi|D|11 XS Max|SHUGUO)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(RS635H)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Santin[ _#]?([^;/)]+)(?: Build|[;)])'
       model: '$1'
 
 # Siemens
 Siemens:
-  regex: 'SIEMENS|SIE-|portalmmm/2\.0 SI|S55|SL45i'
+  regex: 'SIEMENS|SIE-|portalmmm/2\.0 SI|(?:S55(?! Nova)|SL45i)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: '(?:SIE-)?(S[56]5|S40|C45|ME45|SLIK)(?:[);/ ]|$)'
+      device: 'feature phone'
+      model: '$1'
+
     - regex: 'SIEMENS[ \-]([a-z0-9]+)'
       model: '$1'
     - regex: 'SIE(?:MENS )?[\-]?([a-z0-9]+)'
       model: '$1'
-    - regex: '(?:SIE-)?(S55|SL45i)'
+    - regex: '(?:SIE-)?(SL45i)'
       model: '$1'
     - regex: 'portalmmm/2.0 (SI[a-z0-9]+)'
       model: '$1'
 
 # Soundmax
 Soundmax:
-   regex: '((?:SM-LED32M(?:11|04)S)(?:_-Ver01)?|SM-LED40M04S)(?:[);/ ]|$)'
-   device: 'tv'
-   model: '$1'
+  regex: '((?:SM-LED32M(?:11|04)S)(?:_-Ver01)?|SM-LED40M04S)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
 
 # Samsung
 Samsung:
-  regex: 'SAMSUNG(?! ?Browser)|Maple |SC-(?:02[CHMKJG]|03[JLK]|04[ELJ]|05G|52A|01[HFGLKM])|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|(?<!GOG|GOG )Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86(?:[);/ ]|$)|(?:OTV-)?SMT-E5015|ISW11SC|SCV4[0-35678]|SCV3[1-9]|40[34]SC|SCL22|SCG0[126]|SCT21'
+  regex: 'SAMSUNG(?! ?Browser)|lineage_j5y17lte|FamilyHub|Maple (?!III)|Gear Live|(?:SEC_)?SC-(?:001|01[FGHKLM]|02[CGHJKLMF]|03[EFJKL]|04[EFJL]|05[GL]|(?:4[12]|5[1-4])A|5[1-5]B)|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|(?<!GOG|GOG )Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86(?:[);/ ]|$)|(?:OTV-)?SMT-E5015|ISW11SC|40[34]SC|SC(?:V3[1-9]|V4[0-9]|51Aa|-56B|T21|G0[1-9]|G1[012]|L2[234])(?:-[uj])?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit tv models
@@ -10873,454 +15725,630 @@ Samsung:
     - regex: 'Maple '
       device: 'tv'
       model: ''
+    - regex: 'Samsung, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      device: 'tv'
+      model: '$1'
 
     # explicit tablet models
     - regex: '(?:SAMSUNG-)?(?:GT-)?N5100'
       device: 'tablet'
-      model: 'GALAXY Note 8.0"'
+      model: 'Galaxy Note 8.0"'
     - regex: '(?:SAMSUNG-)?SM-T677(?:[ATV]|N[KL])?(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY View 18.4" LTE'
+      model: 'Galaxy View 18.4" LTE'
     - regex: '(?:SAMSUNG-)?SM-T670(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY View 18.4" WiFi'
+      model: 'Galaxy View 18.4" WiFi'
     - regex: '(?:SAMSUNG-)?(?:GT-)?N5110'
       device: 'tablet'
-      model: 'GALAXY Note 8.0" WiFi'
+      model: 'Galaxy Note 8.0" WiFi'
     - regex: '(?:SAMSUNG-)?GT-N5120'
       device: 'tablet'
-      model: 'GALAXY Note 8.0" LTE'
-    - regex: '(?:SAMSUNG-)?GT-N8000'
+      model: 'Galaxy Note 8.0" LTE'
+    - regex: '(?:SAMSUNG-)?(?:GT|SM)-N8000'
       device: 'tablet'
-      model: 'GALAXY Note 10.1"'
+      model: 'Galaxy Note 10.1"'
     - regex: '(?:SAMSUNG-)?GT-N8010'
       device: 'tablet'
-      model: 'GALAXY Note 10.1" WiFi'
+      model: 'Galaxy Note 10.1" WiFi'
     - regex: '(?:SAMSUNG-)?GT-N8020'
       device: 'tablet'
-      model: 'GALAXY Note 10.1" LTE'
+      model: 'Galaxy Note 10.1" LTE'
     - regex: '(?:SAMSUNG-)?GT-P1000M?|SCH-I800'
       device: 'tablet'
-      model: 'GALAXY Tab'
+      model: 'Galaxy Tab'
     - regex: '(?:SAMSUNG-)?GT-P3100B?'
       device: 'tablet'
-      model: 'GALAXY Tab 2 7"'
+      model: 'Galaxy Tab 2 7"'
     - regex: '(?:SAMSUNG-)?GT-P311[03]'
       device: 'tablet'
-      model: 'GALAXY Tab 2 7" WiFi'
+      model: 'Galaxy Tab 2 7" WiFi'
     - regex: '(?:SAMSUNG-)?GT-P5100|SCH-I915'
       device: 'tablet'
-      model: 'GALAXY Tab 2 10.1"'
+      model: 'Galaxy Tab 2 10.1"'
     - regex: '(?:SAMSUNG-)?GT-P511[03]'
       device: 'tablet'
-      model: 'GALAXY Tab 2 10.1" WiFi'
+      model: 'Galaxy Tab 2 10.1" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T217T'
       device: 'tablet'
-      model: 'GALAXY Tab 3 7.0" 4G'
+      model: 'Galaxy Tab 3 7.0" 4G'
     - regex: '(?:SAMSUNG-)?GT-P5200'
       device: 'tablet'
-      model: 'GALAXY Tab 3 10.1"'
+      model: 'Galaxy Tab 3 10.1"'
     - regex: '(?:SAMSUNG-)?GT-P5210'
       device: 'tablet'
-      model: 'GALAXY Tab 3 10.1" WiFi'
+      model: 'Galaxy Tab 3 10.1" WiFi'
     - regex: '(?:SAMSUNG-)?GT-P5220'
       device: 'tablet'
-      model: 'GALAXY Tab 3 10.1" LTE'
+      model: 'Galaxy Tab 3 10.1" LTE'
     - regex: '(?:SAMSUNG-)?GT-P6200'
       device: 'tablet'
-      model: 'GALAXY Tab 7" Plus'
+      model: 'Galaxy Tab 7" Plus'
     - regex: '(?:SAMSUNG-)?GT-P6201'
       device: 'tablet'
-      model: 'GALAXY Tab 7" Plus N'
+      model: 'Galaxy Tab 7" Plus N'
     - regex: '(?:SAMSUNG-)?GT-P6810'
       device: 'tablet'
-      model: 'GALAXY Tab 7.7"'
+      model: 'Galaxy Tab 7.7"'
     - regex: '(?:SAMSUNG-)?GT-P7100'
       device: 'tablet'
-      model: 'GALAXY Tab 10.1v'
+      model: 'Galaxy Tab 10.1v'
     - regex: '(?:SAMSUNG-)?GT-P75[01]0'
       device: 'tablet'
-      model: 'GALAXY Tab 10.1"'
+      model: 'Galaxy Tab 10.1"'
     - regex: '(?:SAMSUNG-)?SM-P600'
       device: 'tablet'
-      model: 'GALAXY Note 10.1" 2014 Edition WiFi'
+      model: 'Galaxy Note 10.1" 2014 Edition WiFi'
     - regex: '(?:SAMSUNG-)?SM-P60[12]'
       device: 'tablet'
-      model: 'GALAXY Note 10.1" 2014 Edition'
+      model: 'Galaxy Note 10.1" 2014 Edition'
     - regex: '(?:SAMSUNG-)?SM-(?:P605|P607T)'
       device: 'tablet'
-      model: 'GALAXY Note 10.1" 2014 Edition LTE'
+      model: 'Galaxy Note 10.1" 2014 Edition LTE'
     - regex: '(?:SAMSUNG-)?SM-P900'
       device: 'tablet'
-      model: 'GALAXY NotePRO 12.2" WiFi'
+      model: 'Galaxy NotePRO 12.2" WiFi'
     - regex: '(?:SAMSUNG-)?SM-P901'
       device: 'tablet'
-      model: 'GALAXY NotePRO 12.2"'
+      model: 'Galaxy NotePRO 12.2"'
     - regex: '(?:SAMSUNG-)?SM-P905'
       device: 'tablet'
-      model: 'GALAXY NotePRO 12.2" LTE'
-    - regex: '(?:SAMSUNG-)?SM-P587(?:[);/ ]|$)'
+      model: 'Galaxy NotePRO 12.2" LTE'
+    - regex: '(?:SAMSUNG-)?SM-(?:P587|P588C)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab A 10.1" with S Pen (2016) LTE'
+      model: 'Galaxy Tab A 10.1" with S Pen (2016) LTE'
+    - regex: '(?:SAMSUNG-)?SM-P583(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab A 10.1" with S Pen (2016) WiFi'
     - regex: '(?:SAMSUNG-)?SM-P205(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" with S Pen (2019) LTE'
+      model: 'Galaxy Tab A 8.0" with S Pen (2019) LTE'
     - regex: '(?:SAMSUNG-)?SM-P200(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" with S Pen (2019) WiFi'
+      model: 'Galaxy Tab A 8.0" with S Pen (2019) WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T307U(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab A 8.4" (2020) LTE'
+    - regex: '(?:SAMSUNG-)?SM-T297'
+      device: 'tablet'
+      model: 'Galaxy Tab A 8.0" (2019) LTE'
+    - regex: '(?:SAMSUNG-)?SM-(?:T505[CN]?|T507)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab A7 10.4" (2020) LTE'
+    - regex: '(?:SAMSUNG-)?SM-T500(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab A7 10.4" (2020) WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T225'
+      device: 'tablet'
+      model: 'Galaxy Tab A7 Lite 8.7" (2021) LTE'
+    - regex: '(?:SAMSUNG-)?SM-T220(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab A7 Lite 8.7" (2021) WiFi'
     - regex: '(?:SAMSUNG-)?SM-T11[03]'
       device: 'tablet'
-      model: 'GALAXY Tab 3 7.0" Lite WiFi'
+      model: 'Galaxy Tab 3 Lite 7.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-X205'
+      device: 'tablet'
+      model: 'Galaxy Tab A8 10.5" LTE'
+    - regex: '(?:SAMSUNG-)?SM-X200'
+      device: 'tablet'
+      model: 'Galaxy Tab A8 10.5" WiFi'
     - regex: '(?:SAMSUNG-)?SM-(?:T830[X]?|T837R4)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S4 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T835[CN]?|T837[VTA])(?:[);/ ]|$)'
+      model: 'Galaxy Tab S4 10.5" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T837P(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S4 10.5" with S Pen'
+    - regex: '(?:SAMSUNG-)?SM-(?:T835[CN]?|T837[VTA]?)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S4 10.5"'
-    - regex: '(?:SAMSUNG-)?SM-(?:T725[N]?|T720X|T727[AV])(?:[);/ ]|$)'
+      model: 'Galaxy Tab S4 10.5"'
+    - regex: '(?:SAMSUNG-)?SM-(?:T725[CN]?|T720X|T727(?:R4|[AUV])?)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S5e 10.5"'
+      model: 'Galaxy Tab S5e 10.5"'
     - regex: '(?:SAMSUNG-)?SM-T720(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S5e 10.5" WiFi'
+      model: 'Galaxy Tab S5e 10.5" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T865N?(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S6 10.5"'
-    - regex: '(?:SAMSUNG-)?SM-T867[V]?(?:[);/ ]|$)'
+      model: 'Galaxy Tab S6 10.5"'
+    - regex: '(?:SAMSUNG-)?SM-T867(?:R4|[VU])?(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S6 10.5" LTE'
-    - regex: '(?:SAMSUNG-)?SM-P615(?:[);/ ]|$)'
+      model: 'Galaxy Tab S6 10.5" LTE'
+    - regex: '(?:SAMSUNG-)?SM-(?:P615[CN]?|P617)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S6 10.4" Lite'
-    - regex: '(?:SAMSUNG-)?SM-P610(?:[);/ ]|$)'
+      model: 'Galaxy Tab S6 Lite 10.4"'
+    - regex: '(?:SAMSUNG-)?SM-P610X?(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S6 10.4" Lite WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T860(?:[);/ ]|$)'
+      model: 'Galaxy Tab S6 Lite 10.4" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T860X?(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S6 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T111[M]?(?:[);/ ]|$)'
+      model: 'Galaxy Tab S6 10.5" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T866N(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab 3 7.0" Lite'
+      model: 'Galaxy Tab S6 10.5" 5G'
+    - regex: '(?:SAMSUNG-)?SM-T111'
+      device: 'tablet'
+      model: 'Galaxy Tab 3 Lite 7.0"'
     - regex: '(?:SAMSUNG-)?SM-T116(?:BU|NU|NY)?'
       device: 'tablet'
-      model: 'GALAXY Tab 3 V'
+      model: 'Galaxy Tab 3 V'
     - regex: '(?:SAMSUNG-)?SM-(?:T2105|T212)'
       device: 'tablet'
-      model: 'GALAXY Tab 3 7.0" Kids'
+      model: 'Galaxy Tab 3 7.0" Kids'
     - regex: '(?:SAMSUNG-)?SM-T210R?'
       device: 'tablet'
-      model: 'GALAXY Tab 3 7.0" WiFi'
+      model: 'Galaxy Tab 3 7.0" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T21(?:[15]|7[AS])'
       device: 'tablet'
-      model: 'GALAXY Tab 3 7.0"'
+      model: 'Galaxy Tab 3 7.0"'
     - regex: '(?:SAMSUNG-)?SM-T230(?:NU)?'
       device: 'tablet'
-      model: 'GALAXY Tab 4 7.0" WiFi'
+      model: 'Galaxy Tab 4 7.0" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T23[15]|403SC'
       device: 'tablet'
-      model: 'GALAXY Tab 4 7.0" 3G'
-    - regex: '(?:SAMSUNG-)?SM-(?:T239|T237P)'
+      model: 'Galaxy Tab 4 7.0" 3G'
+    - regex: '(?:SAMSUNG-)?SM-(?:T239|T237[PV])'
+      device: 'tablet'
+      model: 'Galaxy Tab 4 7.0" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T232(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab 4 7.0" LTE'
+      model: 'Galaxy Tab 4 7.0" WiFi + 3G'
     - regex: '(?:SAMSUNG-)?SM-T310'
       device: 'tablet'
-      model: 'GALAXY Tab 3 8.0" WiFi'
+      model: 'Galaxy Tab 3 8.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T312'
+      device: 'tablet'
+      model: 'Galaxy Tab 3 8.0" 3G'
     - regex: '(?:SAMSUNG-)?SM-T311'
       device: 'tablet'
-      model: 'GALAXY Tab 3 8.0"'
+      model: 'Galaxy Tab 3 8.0"'
     - regex: '(?:SAMSUNG-)?SM-T315'
       device: 'tablet'
-      model: 'GALAXY Tab 3 8.0" LTE'
+      model: 'Galaxy Tab 3 8.0" LTE'
     - regex: '(?:SAMSUNG-)?SM-T330'
       device: 'tablet'
-      model: 'GALAXY Tab 4 8.0" WiFi'
+      model: 'Galaxy Tab 4 8.0" WiFi'
     - regex: '(?:SAMSUNG-)?SM-(?:T33[215]|T337[AVT])'
       device: 'tablet'
-      model: 'GALAXY Tab 4 8.0" LTE'
+      model: 'Galaxy Tab 4 8.0" LTE'
     - regex: '(?:SAMSUNG-)?SM-T520'
       device: 'tablet'
-      model: 'GALAXY TabPRO 10.1" WiFi'
+      model: 'Galaxy TabPRO 10.1" WiFi'
     - regex: '(?:SAMSUNG-)?SM-(?:T53[15]|T537[AV])'
       device: 'tablet'
-      model: 'GALAXY Tab 4 10.1" LTE'
+      model: 'Galaxy Tab 4 10.1" LTE'
     - regex: '(?:SAMSUNG-)?SM-T536(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab 4 10.1" Advanced'
+      model: 'Galaxy Tab 4 10.1" Advanced'
+    - regex: '(?:SAMSUNG-)?SM-T532(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab 4 10.1"'
     - regex: '(?:SAMSUNG-)?SM-T320'
       device: 'tablet'
-      model: 'GALAXY TabPRO 8.4" WiFi'
+      model: 'Galaxy TabPRO 8.4" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T325'
       device: 'tablet'
-      model: 'GALAXY TabPRO 8.4" LTE'
+      model: 'Galaxy TabPRO 8.4" LTE'
     - regex: '(?:SAMSUNG-)?SM-T525'
       device: 'tablet'
-      model: 'GALAXY TabPRO 10.1" LTE'
+      model: 'Galaxy TabPRO 10.1" LTE'
     - regex: '(?:SAMSUNG-)?SM-(?:T530(?:NU)?|T533)'
       device: 'tablet'
-      model: 'GALAXY Tab 4 10.1" WiFi'
+      model: 'Galaxy Tab 4 10.1" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T700'
       device: 'tablet'
-      model: 'GALAXY Tab S 8.4" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T705|T707A)'
+      model: 'Galaxy Tab S 8.4" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T705|T707[AV])'
       device: 'tablet'
-      model: 'GALAXY Tab S 8.4" LTE'
+      model: 'Galaxy Tab S 8.4" LTE'
     - regex: '(?:SAMSUNG-)?SM-T800'
       device: 'tablet'
-      model: 'GALAXY Tab S 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?(?:SM-(?:T805|T807[VP]?)|SCT21)'
+      model: 'Galaxy Tab S 10.5" WiFi'
+    - regex: '(?:SAMSUNG-)?(?:SM-(?:T805|T807[PV]?)|SCT21)'
       device: 'tablet'
-      model: 'GALAXY Tab S 10.5" LTE'
+      model: 'Galaxy Tab S 10.5" LTE'
     - regex: '(?:SAMSUNG-)?SM-(?:T813|T810)'
       device: 'tablet'
-      model: 'GALAXY Tab S2 9.7" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T719[YC]?|T715(?:[YC]|N0)?)(?:[);/ ]|$)'
+      model: 'Galaxy Tab S2 9.7" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T719[CY]?|T715(?:N0|[CY])?)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S2 8.0" LTE'
+      model: 'Galaxy Tab S2 8.0" LTE'
     - regex: '(?:SAMSUNG-)?SM-(?:T71[03]|T710X)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab S2 8.0" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T815|T817[ATW]?|T818[ATW]|T819[Y]?)'
+      model: 'Galaxy Tab S2 8.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T815|T817[ATW]?|T818[ATVW]?|T819[Y]?)'
       device: 'tablet'
-      model: 'GALAXY Tab S2 9.7" LTE'
+      model: 'Galaxy Tab S2 9.7" LTE'
     - regex: '(?:SAMSUNG-)?SM-T820'
       device: 'tablet'
-      model: 'GALAXY Tab S3 9.7" WiFi'
+      model: 'Galaxy Tab S3 9.7" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T82[57]'
       device: 'tablet'
-      model: 'GALAXY Tab S3 9.7" LTE'
+      model: 'Galaxy Tab S3 9.7" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T975N?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S7+ 12.4" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T970(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S7+ 12.4" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T976[BN]|T978U)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S7+ 12.4" 5G'
+    - regex: '(?:SAMSUNG-)?SM-T870(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S7 11.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T875N?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S7 11.0" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T878U(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab S7 11.0" 5G'
+    - regex: '(?:SAMSUNG-)?SM-T735'
+      device: 'tablet'
+      model: 'Galaxy Tab S7 FE 12.4" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T736'
+      device: 'tablet'
+      model: 'Galaxy Tab S7 FE 12.4" 5G'
+    - regex: '(?:SAMSUNG-)?SM-T733'
+      device: 'tablet'
+      model: 'Galaxy Tab S7 FE 12.4" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T900'
       device: 'tablet'
-      model: 'GALAXY TabPRO 12.2" WiFi'
+      model: 'Galaxy TabPRO 12.2" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T280'
       device: 'tablet'
-      model: 'GALAXY Tab A 7.0" WiFi'
+      model: 'Galaxy Tab A 7.0" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T285'
       device: 'tablet'
-      model: 'GALAXY Tab A 7.0" LTE'
+      model: 'Galaxy Tab A 7.0" LTE'
     - regex: '(?:SAMSUNG-)?SM-T3[58]0'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" WiFi'
+      model: 'Galaxy Tab A 8.0" WiFi'
     - regex: '(?:SAMSUNG-)?SM-(?:P350|T3[58]5|T357[TW])'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" LTE'
-    - regex: '(?:SAMSUNG-)?SM-T387(?:R4|VK|AA|[WVT])'
+      model: 'Galaxy Tab A 8.0" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T387(?:AA|R4|VK|[TVW])'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" LTE (2018)'
+      model: 'Galaxy Tab A 8.0" LTE (2018)'
     - regex: '(?:SAMSUNG-)?SM-T295'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" LTE (2019)'
+      model: 'Galaxy Tab A 8.0" LTE (2019)'
     - regex: '(?:SAMSUNG-)?SM-T290'
       device: 'tablet'
-      model: 'GALAXY Tab A 8.0" WiFi (2019)'
+      model: 'Galaxy Tab A 8.0" WiFi (2019)'
     - regex: '(?:SAMSUNG-)?SM-(?:P355([MY])?|T550)'
       device: 'tablet'
-      model: 'GALAXY Tab A 9.7" WiFi'
+      model: 'Galaxy Tab A 9.7" WiFi'
     - regex: '(?:SAMSUNG-)?SM-(?:P550|P555(M)?|T555)'
       device: 'tablet'
-      model: 'GALAXY Tab A 9.7" LTE'
+      model: 'Galaxy Tab A 9.7" LTE'
     - regex: '(?:SAMSUNG-)?SM-(?:T58[05]|P58[05])'
       device: 'tablet'
-      model: 'GALAXY Tab A 10.1" WiFi (2016)'
+      model: 'Galaxy Tab A 10.1" WiFi (2016)'
     - regex: '(?:SAMSUNG-)?SM-T587[P]?'
       device: 'tablet'
-      model: 'GALAXY Tab A 10.1" LTE (2016)'
+      model: 'Galaxy Tab A 10.1" LTE (2016)'
     - regex: '(?:SAMSUNG-)?SM-T59[057]'
       device: 'tablet'
-      model: 'GALAXY Tab A 10.5" LTE (2018)'
-    - regex: '(?:SAMSUNG-)?SM-T51[05]'
+      model: 'Galaxy Tab A 10.5" LTE (2018)'
+    - regex: '(?:SAMSUNG-)?SM-T51(?:7P|[057])'
       device: 'tablet'
-      model: 'GALAXY Tab A 10.1" (2019)'
+      model: 'Galaxy Tab A 10.1" (2019)'
     - regex: '(?:SAMSUNG-)?SM-(?:T37[57]|T378[KLSV])'
       device: 'tablet'
-      model: 'GALAXY Tab E 8.0"'
+      model: 'Galaxy Tab E 8.0"'
     - regex: '(?:SAMSUNG-)?SM-T56[02]'
       device: 'tablet'
-      model: 'GALAXY Tab E 9.6" WiFi'
+      model: 'Galaxy Tab E 9.6" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T561'
       device: 'tablet'
-      model: 'GALAXY Tab E 9.6" 3G'
+      model: 'Galaxy Tab E 9.6" 3G'
     - regex: '(?:SAMSUNG-)?SM-T567V'
       device: 'tablet'
-      model: 'GALAXY Tab E 9.6" 4G'
-    - regex: '(?:SAMSUNG-)?SM-T365(?:[);/ ]|$)'
+      model: 'Galaxy Tab E 9.6" 4G'
+    - regex: '(?:SAMSUNG-)?SM-T365(?:F0|[MY])?(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab Active 8.0"'
+      model: 'Galaxy Tab Active 8.0"'
     - regex: '(?:SAMSUNG-)?SM-T360(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab Active 8.0" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T39[057][U]?(?:[);/ ]|$)'
+      model: 'Galaxy Tab Active 8.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T395[CN]?|T397U)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab Active 2 8.0"'
+    - regex: '(?:SAMSUNG-)?SM-T390(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab Active 2 8.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T575N?|T577U?)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab Active 3 8.0"'
+    - regex: '(?:SAMSUNG-)?SM-T570(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'GALAXY Tab Active 2 8.0"'
-    - regex: '(?:SAMSUNG-)?SM-P902(?:[);/ ]|$)'
+      model: 'Galaxy Tab Active 3 8.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:T545|T547U?)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab Active Pro 10.1"'
+    - regex: '(?:SAMSUNG-)?SM-T540(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Tab Active Pro 10.1" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-(?:P902|P907A)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Galaxy Note Pro 12.2"'
+    - regex: '(?:SAMSUNG[- ])?SM-T2519'
+      model: 'Galaxy Tab Q'
       device: 'tablet'
-      model: 'GALAXY Note Pro 12.2"'
 
     # explicit wearable models
-    - regex: '(?:SAMSUNG )?SM-R820'
+    - regex: 'SM-R820'
+      device: 'wearable'
+      model: 'Galaxy Watch Active 2 44mm'
+    - regex: 'SM-V7000'
+      device: 'wearable'
+      model: 'Galaxy Gear'
+    - regex: 'SM-R3500'
+      device: 'wearable'
+      model: 'Galaxy Gear Fit'
+    - regex: 'SM-R3800'
+      device: 'wearable'
+      model: 'Galaxy Gear 2'
+    - regex: 'SSM-R3810'
+      device: 'wearable'
+      model: 'Galaxy Gear 2 Neo'
+    - regex: 'SM-R825'
+      device: 'wearable'
+      model: 'Galaxy Watch Active 2 44mm LTE'
+    - regex: 'SM-R830'
+      device: 'wearable'
+      model: 'Galaxy Watch Active 2 40mm'
+    - regex: 'SM-R835'
+      device: 'wearable'
+      model: 'Galaxy Watch Active 2 40mm LTE'
+    - regex: 'SM-R800'
+      device: 'wearable'
+      model: 'Galaxy Watch 46mm'
+    - regex: 'SM-R805'
+      device: 'wearable'
+      model: 'Galaxy Watch 46mm LTE'
+    - regex: 'SM-R810'
+      device: 'wearable'
+      model: 'Galaxy Watch 42mm'
+    - regex: 'SM-R815'
+      device: 'wearable'
+      model: 'Galaxy Watch 42mm LTE'
+    - regex: 'SM-R500'
+      device: 'wearable'
+      model: 'Galaxy Watch Active'
+    - regex: 'SM-R600'
+      device: 'wearable'
+      model: 'Galaxy Gear Sport 43mm'
+    - regex: 'SM-R760'
+      device: 'wearable'
+      model: 'Galaxy Gear S3 Frontier 46mm'
+    - regex: 'SM-R750'
+      device: 'wearable'
+      model: 'Gear S 40mm'
+    - regex: 'SM-R732'
+      device: 'wearable'
+      model: 'Gear S2 42mm'
+    - regex: 'SM-R765'
+      device: 'wearable'
+      model: 'Galaxy Gear S3 Frontier 33mm'
+    - regex: 'SM-R770'
+      device: 'wearable'
+      model: 'Galaxy Gear S3 Classic 41mm'
+    - regex: 'SM-R845'
+      device: 'wearable'
+      model: 'Galaxy Watch 3 45mm LTE'
+    - regex: 'SM-R840'
+      device: 'wearable'
+      model: 'Galaxy Watch 3 45mm'
+    - regex: 'SM-R850'
       device: 'wearable'
-      model: 'GALAXY Watch Active 2'
+      model: 'Galaxy Watch 3 41mm'
+    - regex: 'SM-R855'
+      device: 'wearable'
+      model: 'Galaxy Watch 3 41mm 4G'
+    - regex: 'Gear Live'
+      device: 'wearable'
+      model: 'Gear Live'
+
+    # smart fridge models
+    - regex: 'Family ?Hub'
+      device: 'peripheral'
+      model: 'Family Hub'
 
     # explicit smartphone models
-    - regex: '(?:SAMSUNG-)?SM-G850[AMSWYKLX]'
-      model: 'GALAXY Alpha'
+    - regex: '(?:SAMSUNG-)?SM-G850(?:8S|[AFKLMSWXY])'
+      model: 'Galaxy Alpha'
     - regex: '(?:SAMSUNG-)?GT-B5330'
-      model: 'GALAXY Chat'
+      model: 'Galaxy Chat'
     - regex: '(?:SAMSUNG-)?SM-A605K'
-      model: 'GALAXY Jean'
+      model: 'Galaxy Jean'
     - regex: '(?:SAMSUNG-)?SM-A202K'
-      model: 'GALAXY Jean 2'
+      model: 'Galaxy Jean 2'
     - regex: '(?:SAMSUNG-)?GT-B5510'
-      model: 'GALAXY Y Pro'
+      model: 'Galaxy Y Pro'
     - regex: '(?:SAMSUNG-)?GT-B5512'
-      model: 'GALAXY Y Pro Duos'
+      model: 'Galaxy Y Pro Duos'
     - regex: '(?:SAMSUNG-)?GT-B7510'
-      model: 'GALAXY Pro'
+      model: 'Galaxy Pro'
     - regex: '(?:SAMSUNG-)?GT-I5700'
-      model: 'GALAXY Spica'
+      model: 'Galaxy Spica'
     - regex: '(?:SAMSUNG-)?GT-I5801'
-      model: 'GALAXY Apollo'
+      model: 'Galaxy Apollo'
     - regex: '(?:SAMSUNG-)?GT-I5800'
-      model: 'GALAXY 3'
+      model: 'Galaxy 3'
     - regex: '(?:SAMSUNG-)?GT-I8000'
       model: 'Omnia II'
     - regex: '(?:SAMSUNG-)?(?:GT-I8150|SM-T255S)'
-      model: 'GALAXY W'
+      model: 'Galaxy W'
     - regex: 'SC-01H(?:[);/ ]|$)'
-      model: 'GALAXY Active Neo'
+      model: 'Galaxy Active Neo'
     - regex: '(?:SAMSUNG-)?GT-S5830'
-      model: 'GALAXY Ace'
+      model: 'Galaxy Ace'
     - regex: '(?:SAMSUNG-)?SM-(?:G357(?:FZ|M)|G310HN)'
-      model: 'GALAXY Ace Style'
+      model: 'Galaxy Ace Style'
     - regex: '(?:SAMSUNG-)?GT-I8160'
-      model: 'GALAXY Ace 2'
+      model: 'Galaxy Ace 2'
     - regex: '(?:SAMSUNG-)?SM-G313(?:HY|M[LUY]|[FM])'
-      model: 'GALAXY Ace 4'
+      model: 'Galaxy Ace 4'
     - regex: '(?:SAMSUNG-)?SM-G316M'
-      model: 'GALAXY Ace 4 Duos'
+      model: 'Galaxy Ace 4 Duos'
     - regex: '(?:SAMSUNG-)?SM-G313[HU]'
-      model: 'GALAXY Ace 4 Lite'
-    - regex: '(?:SAMSUNG-)?SM-G318(?:H|ML)(?:[);/ ]|$)'
-      model: 'GALAXY Ace 4 Neo'
+      model: 'Galaxy Ace 4 Lite'
+    - regex: '(?:SAMSUNG-)?SM-(?:G316U|G318(?:H|ML))(?:[);/ ]|$)'
+      model: 'Galaxy Ace 4 Neo'
     - regex: '(?:SAMSUNG-)?SM-G9100(?:[);/ ]|$)'
-      model: 'GALAXY S II'
+      model: 'Galaxy S II'
     - regex: '(?:SAMSUNG-)?SHV-E120S(?:[);/ ]|$)'
-      model: 'GALAXY S II HD LTE'
+      model: 'Galaxy S II HD LTE'
     - regex: '(?:SAMSUNG-)?GT-I8190'
-      model: 'GALAXY S III mini'
+      model: 'Galaxy S III mini'
     - regex: '(?:SAMSUNG-)?GT-I8200'
-      model: 'GALAXY S III mini Value Edition'
+      model: 'Galaxy S III mini Value Edition'
     - regex: '(?:SAMSUNG-)?GT-I826[02]'
-      model: 'GALAXY Core'
+      model: 'Galaxy Core'
     - regex: '(?:SAMSUNG-)?SM-G386W'
-      model: 'GALAXY Core LTE'
+      model: 'Galaxy Core LTE'
+    - regex: '(?:SAMSUNG-)?SM-G3589W'
+      model: 'Galaxy Core Lite LTE'
     - regex: '(?:SAMSUNG-)?GT-I8320'
       model: 'H1'
     - regex: '(?:SAMSUNG-)?GT-I85[23]0'
-      model: 'GALAXY Beam'
+      model: 'Galaxy Beam'
     - regex: '(?:SAMSUNG-)?SM-G3858'
-      model: 'GALAXY Beam 2'
+      model: 'Galaxy Beam 2'
     - regex: '(?:SAMSUNG-)?SM-G600S'
-      model: 'GALAXY Wide'
+      model: 'Galaxy Wide'
     - regex: '(?:SAMSUNG-)?GT-I855[028]'
-      model: 'GALAXY Win'
+      model: 'Galaxy Win'
     - regex: '(?:SAMSUNG-)?SM-G381[28]'
-      model: 'GALAXY Win Pro'
+      model: 'Galaxy Win Pro'
     - regex: '(?:SAMSUNG-)?GT-I8580'
-      model: 'GALAXY Core Advance'
+      model: 'Galaxy Core Advance'
     - regex: '(?:SAMSUNG-)?GT-I8730'
-      model: 'GALAXY Express'
+      model: 'Galaxy Express'
     - regex: '(?:SAMSUNG-)?SM-(?:E500(?:HQ|YZ|[0FHM])|S978L)'
-      model: 'GALAXY E5'
-    - regex: '(?:SAMSUNG-)?SM-E700(?:0|9|F|H|M)'
-      model: 'GALAXY E7'
+      model: 'Galaxy E5'
+    - regex: '(?:SAMSUNG-)?SM-E700[09FHM]'
+      model: 'Galaxy E7'
     - regex: '(?:SAMSUNG-)?GT-I90(?:00|08|18|88)'
-      model: 'GALAXY S'
+      model: 'Galaxy S'
     - regex: '(?:SAMSUNG-)?GT-I9001'
-      model: 'GALAXY S Plus'
+      model: 'Galaxy S Plus'
     - regex: '(?:SAMSUNG-)?GT-I9003'
-      model: 'GALAXY SL'
+      model: 'Galaxy SL'
     - regex: '(?:SAMSUNG-)?GT-I9010'
-      model: 'GALAXY S Giorgio Armani'
+      model: 'Galaxy S Giorgio Armani'
     - regex: '(?:SAMSUNG-)?GT-I9070'
-      model: 'GALAXY S Advance'
+      model: 'Galaxy S Advance'
     - regex: '(?:SAMSUNG-)?GT-I910[08]'
-      model: 'GALAXY S II'
+      model: 'Galaxy S II'
     - regex: '(?:SAMSUNG-)?ISW11SC'
-      model: 'GALAXY S II WiMAX'
+      model: 'Galaxy S II WiMAX'
     - regex: '(?:SAMSUNG-)?GT-I9103'
-      model: 'GALAXY R'
+      model: 'Galaxy R'
     - regex: '(?:SAMSUNG-)?GT-I9105'
-      model: 'GALAXY S II Plus'
+      model: 'Galaxy S II Plus'
     - regex: '(?:SAMSUNG-)?SM-G730(?:W8|[AV])'
-      model: 'GALAXY S3 mini'
+      model: 'Galaxy S3 mini'
     - regex: '(?:SAMSUNG-)?(?:GT-I919[025]|SCH-I435)'
-      model: 'GALAXY S4 mini'
+      model: 'Galaxy S4 mini'
     - regex: '(?:SAMSUNG-)?GT-I9515'
-      model: 'GALAXY S4 Value Edition'
+      model: 'Galaxy S4 Value Edition'
     - regex: '(?:SAMSUNG-)?GT-I9295'
-      model: 'GALAXY S4 ACTIVE'
-    - regex: '(?:SAMSUNG-)?(?:GT-I9300|SCH-I535|SCH-L710|SCH-I939)'
-      model: 'GALAXY S III'
+      model: 'Galaxy S4 ACTIVE'
+    - regex: '(?:SAMSUNG-)?(?:GT-I9300|SCH-(?:I535|I939|L710))|SC-03E'
+      model: 'Galaxy S III'
     - regex: '(?:SAMSUNG-)?(?:GT-I9305|SCH-R530)'
-      model: 'GALAXY S III LTE'
-    - regex: '(?:SAMSUNG-)?(?:SM-S975L|GT-I9500|GT-I9502|GT-I9505|SCH-I545|SCH-I959|SCH-R970|GALAXY-S4|SGH-M919N?)|SC-04E'
-      model: 'GALAXY S4'
-    - regex: '(?:SAMSUNG-)?GT-I9506'
-      model: 'GALAXY S4 with LTE+'
+      model: 'Galaxy S III LTE'
+    - regex: '(?:SAMSUNG-)?(?:SM-S975L|GT-I950[025]|SC-04E|SCH-(?:I545|I959|R970)|SGH-M919N?|Galaxy-S4|SHV-E300K)'
+      model: 'Galaxy S4'
+    - regex: '(?:SAMSUNG-)?(?:GT-I9506)'
+      model: 'Galaxy S4 with LTE+'
+    - regex: '(?:SAMSUNG-)?SHV-E330'
+      model: 'Galaxy S4 LTE'
     - regex: '(?:SAMSUNG-)?GT-S5280'
-      model: 'GALAXY STAR'
+      model: 'Galaxy STAR'
     - regex: '(?:SAMSUNG-)?GT-S5301'
-      model: 'GALAXY POCKET Plus'
+      model: 'Galaxy POCKET Plus'
     - regex: '(?:SAMSUNG-)?GT-S5310'
-      model: 'GALAXY POCKET Neo'
+      model: 'Galaxy POCKET Neo'
     - regex: '(?:SAMSUNG-)?SM-G110[BHM]'
-      model: 'GALAXY POCKET 2'
+      model: 'Galaxy POCKET 2'
     - regex: '(?:SAMSUNG-)?GT-S5360'
-      model: 'GALAXY Y Hello Kitty'
+      model: 'Galaxy Y Hello Kitty'
     - regex: '(?:SAMSUNG-)?GT-S6310'
-      model: 'GALAXY Young'
+      model: 'Galaxy Young'
     - regex: '(?:SAMSUNG-)?GT-S6312'
-      model: 'GALAXY Young DUOS'
+      model: 'Galaxy Young DUOS'
     - regex: '(?:SAMSUNG-)?SM-G130(?:BT|HN|[EHMU])'
-      model: 'GALAXY Young 2'
+      model: 'Galaxy Young 2'
     - regex: '(?:SAMSUNG-)?SM-G130BU'
-      model: 'GALAXY Young 2 Pro'
+      model: 'Galaxy Young 2 Pro'
     - regex: '(?:SAMSUNG-)?GT-S6790'
-      model: 'GALAXY FAME Lite with NFC'
+      model: 'Galaxy FAME Lite with NFC'
     - regex: '(?:SAMSUNG-)?GT-S6810'
-      model: 'GALAXY FAME'
+      model: 'Galaxy FAME'
     - regex: '(?:SAMSUNG-)?GT-S6812'
-      model: 'GALAXY FAME Duos'
+      model: 'Galaxy FAME Duos'
     - regex: 'SC-04J(?:[);/ ]|$)'
-      model: 'GALAXY Feel'
+      model: 'Galaxy Feel'
+    - regex: 'SC-02L(?:[);/ ]|$)'
+      model: 'Galaxy Feel 2'
     - regex: '(?:SAMSUNG-)?GT-S7275'
-      model: 'GALAXY ACE 3'
+      model: 'Galaxy ACE 3'
     - regex: '(?:SAMSUNG-)?GT-S7500'
-      model: 'GALAXY ACE Plus'
+      model: 'Galaxy ACE Plus'
     - regex: '(?:SAMSUNG-)?(?:GT-S7560|SCH-I699)'
-      model: 'GALAXY Trend'
+      model: 'Galaxy Trend'
     - regex: '(?:SAMSUNG-)?GT-S7390'
-      model: 'GALAXY Trend Lite'
+      model: 'Galaxy Trend Lite'
     - regex: '(?:SAMSUNG-)?GT-S7580'
-      model: 'GALAXY Trend Plus'
+      model: 'Galaxy Trend Plus'
     - regex: '(?:SAMSUNG-)?SCH-I739'
-      model: 'GALAXY Trend 2'
+      model: 'Galaxy Trend 2'
     - regex: '(?:SAMSUNG-)?(?:GT-S7562|SCH-I919)'
-      model: 'GALAXY S DUOS'
+      model: 'Galaxy S DUOS'
     - regex: '(?:SAMSUNG-)?GT-S7582'
-      model: 'GALAXY S DUOS 2'
+      model: 'Galaxy S DUOS 2'
     - regex: '(?:SAMSUNG-)?SM-(?:G31[36]HU|G313HZ)'
-      model: 'GALAXY S DUOS 3'
+      model: 'Galaxy S DUOS 3'
     - regex: '(?:SAMSUNG-)?GT-S7710'
-      model: 'GALAXY Xcover 2'
+      model: 'Galaxy Xcover 2'
+    - regex: '(?:SAMSUNG-)?SM-G388F'
+      model: 'Galaxy Xcover 3'
     - regex: '(?:SAMSUNG-)?SM-G389F'
-      model: 'GALAXY Xcover 3'
-    - regex: '(?:SAMSUNG-)?SM-G715FN'
-      model: 'GALAXY Xcover Pro'
+      model: 'Galaxy Xcover 3 VE'
+    - regex: '(?:SAMSUNG-)?SM-G390[FWY]'
+      model: 'Galaxy Xcover 4'
     - regex: '(?:SAMSUNG-)?SM-G398FN'
-      model: 'GALAXY Xcover 4s'
-    - regex: '(?:SAMSUNG-)?SM-G390Y'
-      model: 'GALAXY Xcover 4'
+      model: 'Galaxy Xcover 4s'
+    - regex: '(?:SAMSUNG-)?SM-G715(?:FN|U1|[AUW])'
+      model: 'Galaxy Xcover Pro'
+    - regex: '(?:SAMSUNG-)?SM-G889(?:YB|[AFG])'
+      model: 'Galaxy Xcover FieldPro'
+    - regex: '(?:SAMSUNG-)?SM-G525F'
+      model: 'Galaxy Xcover 5'
     - regex: '(?:SAMSUNG-)?GT-S8500'
       model: 'Wave'
     - regex: '(?:SAMSUNG-)?GT-S8530'
@@ -11340,519 +16368,634 @@ Samsung:
     - regex: '(?:SAMSUNG-)?GT-S7230'
       model: 'Wave 723'
     - regex: '(?:SAMSUNG-)?SM-(?:C101|C105([AL])?)'
-      model: 'GALAXY S4 zoom'
+      model: 'Galaxy S4 zoom'
     - regex: '(?:SAMSUNG-)?SM-(?:C111(M)?|C115)'
-      model: 'GALAXY K zoom'
+      model: 'Galaxy K zoom'
     - regex: '(?:SAMSUNG-)?SM-G318[HM]Z'
-      model: 'GALAXY V Plus'
-    - regex: '(?:SAMSUNG-)?SM-(?:G355[HM]|G3556D)'
-      model: 'GALAXY Core 2'
+      model: 'Galaxy V Plus'
+    - regex: '(?:SAMSUNG-)?SM-G355(?:6D|[89HM])'
+      model: 'Galaxy Core 2'
     - regex: '(?:SAMSUNG-)?SM-G350'
-      model: 'GALAXY Core Plus'
+      model: 'Galaxy Core Plus'
     - regex: '(?:SAMSUNG-)?SM-(?:G360[FH]?|S820L)'
-      model: 'GALAXY Core Prime'
+      model: 'Galaxy Core Prime'
     - regex: '(?:SAMSUNG-)?SM-G361[FH]?'
-      model: 'GALAXY Core Prime Value Edition'
-    - regex: '(?:SAMSUNG-)?SM-(?:G386F|G3586V)'
-      model: 'GALAXY Core LTE'
+      model: 'Galaxy Core Prime Value Edition'
+    - regex: '(?:SAMSUNG-)?SM-(?:G386F|G3518(?:_TD)?|G3586V)'
+      model: 'Galaxy Core LTE'
     - regex: '(?:SAMSUNG-)?SM-G3568V'
-      model: 'GALAXY Core Mini 4G'
-    - regex: '(?:SAMSUNG-)?SM-G5108Q'
-      model: 'GALAXY Core Max'
+      model: 'Galaxy Core Mini 4G'
+    - regex: '(?:SAMSUNG-)?SM-G5108Q?'
+      model: 'Galaxy Core Max'
     - regex: '(?:SAMSUNG-)?SM-G3815'
-      model: 'GALAXY EXPRESS II'
-    - regex: '(?:SAMSUNG-)?SM-G388F'
-      model: 'GALAXY Xcover 3'
-    - regex: '(?:SAMSUNG-)?SM-G390[FW]'
-      model: 'GALAXY Xcover 4'
+      model: 'Galaxy EXPRESS II'
     - regex: '(?:SAMSUNG-)?SM-G800'
-      model: 'GALAXY S5 mini'
+      model: 'Galaxy S5 mini'
     - regex: '(?:SAMSUNG-)?SM-G9009D'
-      model: 'GALAXY S5 Dual-SIM'
-    - regex: '(?:SAMSUNG-)?SM-(?:G900|G906[KLS]|S902L|S903VL)|GALAXY-S5'
-      model: 'GALAXY S5'
+      model: 'Galaxy S5 Dual-SIM'
+    - regex: '(?:SAMSUNG-)?SM-G900FD'
+      model: 'Galaxy S5 Duos'
+    - regex: '(?:SAMSUNG-)?SM-(?:G900|G906[KLS]|S902L|S903VL)|Galaxy-S5|SCL23|SC-04F'
+      model: 'Galaxy S5'
     - regex: '(?:SAMSUNG-)?SM-G901F'
-      model: 'GALAXY S5 LTE+'
+      model: 'Galaxy S5 LTE+'
     - regex: '(?:SAMSUNG-)?SM-G870[AFW]|SC-02G'
-      model: 'GALAXY S5 Active'
+      model: 'Galaxy S5 Active'
     - regex: '(?:SAMSUNG-)?SM-G903[FMW]'
-      model: 'GALAXY S5 Neo'
+      model: 'Galaxy S5 Neo'
     - regex: '(?:SAMSUNG-)?SM-G860P'
-      model: 'GALAXY S5 K Sport'
-    - regex: '(?:SAMSUNG-)?(?:SM-G920(?:F[DQ]|W8|[089AFIKLPRSTVX])?|SM-S907VL)|SC-05G'
-      model: 'GALAXY S6'
+      model: 'Galaxy S5 K Sport'
+    - regex: '(?:SAMSUNG-)?(?:SM-G920(?:F[DQ]|W8|[089AFIKLPRSTVX])?|SM-S906L|SM-S907VL)|SC-05G'
+      model: 'Galaxy S6'
     - regex: '(?:SAMSUNG-)?SM-G890A'
-      model: 'GALAXY S5 Active'
+      model: 'Galaxy S5 Active'
     - regex: '(?:SAMSUNG-)?SM-G925[0ADFIKLPRSTVWX]|SCV31|404SC'
-      model: 'GALAXY S6 Edge'
-    - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTVX])'
-      model: 'GALAXY S6 Edge+'
-    - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX8])?(?:[);/ ]|$)'
-      model: 'GALAXY S7'
+      model: 'Galaxy S6 Edge'
+    - regex: '(?:SAMSUNG-)?SM-G928(?:7C|N0|R4|W8|[07ACFGIKLPSTVX])'
+      model: 'Galaxy S6 Edge+'
+    - regex: '(?:SAMSUNG-)?SM-G930(?:AZ|FD|R[467]|T1|V[CL]|W8|[0AFKLPRSTUVX8])?(?:[);/ ]|$)'
+      model: 'Galaxy S7'
     - regex: '(?:SAMSUNG-)?SM-G935(?:R4|W8|[0AFKLPSTUVX])|SC-02H|SCV33'
-      model: 'GALAXY S7 Edge'
+      model: 'Galaxy S7 Edge'
     - regex: '(?:SAMSUNG-)?SM-G891A'
-      model: 'GALAXY S7 Active'
+      model: 'Galaxy S7 Active'
     - regex: '(?:SAMSUNG-)?SM-G950[08FNUW]?|SCV36|SC-02J'
-      model: 'GALAXY S8'
+      model: 'Galaxy S8'
     - regex: '(?:SAMSUNG-)?SM-G8750'
-      model: 'GALAXY S8 Lite'
+      model: 'Galaxy S8 Lite'
     - regex: '(?:SAMSUNG-)?SM-G892[AU]'
-      model: 'GALAXY S8 Active'
-    - regex: '(?:SAMSUNG-)?SM-G955[AFKLNPRTUVW0X]?|SCV35|SC-03J'
-      model: 'GALAXY S8+'
-    - regex: '(?:SAMSUNG-)?SM-G960[FNUWX0]?|SCV38|SC-02K'
-      model: 'GALAXY S9'
-    - regex: '(?:SAMSUNG-)?SM-G965[FNUWX0]|SCV39|SC-03K'
-      model: 'GALAXY S9+'
-    - regex: '(?:SAMSUNG-)?(?:SM-(?:G973|G977[PUTNB])|SCV41|SC-03L)'
-      model: 'GALAXY S10'
-    - regex: '(?:SAMSUNG-)?SM-G770F'
-      model: 'GALAXY S10 Lite'
-    - regex: '(?:SAMSUNG-)?(?:SM-G975[0FUWNX]|SCV42|SC-04L)'
-      model: 'GALAXY S10+'
-    - regex: '(?:SAMSUNG-)?SM-G970[08FUNWX](?:[);/ ]|$)'
-      model: 'GALAXY S10e'
+      model: 'Galaxy S8 Active'
+    - regex: '(?:SAMSUNG-)?SM-G955[0AFKLNPRTUVWX]?|SCV35|SC-03J'
+      model: 'Galaxy S8+'
+    - regex: '(?:SAMSUNG-)?SM-G960[0FNUWX]?|SCV38|SC-02K'
+      model: 'Galaxy S9'
+    - regex: '(?:SAMSUNG-)?SM-G965[0FNUWX]|SCV39|SC-03K'
+      model: 'Galaxy S9+'
+    - regex: '(?:SAMSUNG-)?(?:SM-(?:G973|G977[BNPTU])|SCV41|SC-03L)'
+      model: 'Galaxy S10'
+    - regex: '(?:SAMSUNG-)?SM-(?:S10 Lite|G770(?:U1|F))'
+      model: 'Galaxy S10 Lite'
+    - regex: '(?:SAMSUNG-)?(?:SM-G975[08FUNWX]|SCV42|SC-04L)'
+      model: 'Galaxy S10+'
+    - regex: 'SC-05L'
+      model: 'Galaxy S10+ Olympic Games Edition'
+    - regex: '(?:SAMSUNG-)?SM-G970(?:U1|[08FUNWX])(?:[);/ ]|$)'
+      model: 'Galaxy S10e'
     - regex: '(?:SAMSUNG-)?SM-G980F'
-      model: 'GALAXY S20'
-    - regex: '(?:SAMSUNG-)?SM-G981(?:[0BNUW]|U1)|SCG01'
-      model: 'GALAXY S20 5G'
-    - regex: '(?:SAMSUNG-)?SM-G988(?:[0BNUW]|U1)'
-      model: 'GALAXY S20 Ultra 5G'
+      model: 'Galaxy S20'
+    - regex: '(?:SAMSUNG-)?SM-G981(?:U1|[0BNUVW])|SCG01|SC-51A|SC51Aa'
+      model: 'Galaxy S20 5G'
+    - regex: '(?:SAMSUNG-)?SM-G780'
+      model: 'Galaxy S20 FE'
+    - regex: '(?:SAMSUNG-)?SM-G781(?:U1|[0BNUVW])'
+      model: 'Galaxy S20 FE 5G'
+    - regex: '(?:SAMSUNG-)?SM-G988(?:U1|[0BNQUW])|SCG03'
+      model: 'Galaxy S20 Ultra 5G'
     - regex: '(?:SAMSUNG-)?SM-G985F|SCG02'
-      model: 'GALAXY S20+'
-    - regex: '(?:SAMSUNG-)?SM-G986(?:[0BNUW]|U1)|SC-52A'
-      model: 'GALAXY S20+ 5G'
-    - regex: '(?:SAMSUNG-)?SM-F700(?:[0FNUW]|U1)|SCV47'
-      model: 'GALAXY Z Flip'
+      model: 'Galaxy S20+'
+    - regex: '(?:SAMSUNG-)?SM-G986(?:U1|[0BNUW])|SC-52A'
+      model: 'Galaxy S20+ 5G'
+    - regex: '(?:SAMSUNG-)?SM-G991(?:U1|[0BNWQU])|SCG09'
+      model: 'Galaxy S21 5G'
+    - regex: '(?:SAMSUNG-)?SM-G990'
+      model: 'Galaxy S21 FE 5G'
+    - regex: '(?:SAMSUNG-)?SC-51B'
+      model: 'Galaxy S21 5G Olympic Games Edition'
+    - regex: '(?:SAMSUNG-)?(?:SM-G998(?:U1|[0BNUW])|SC-52B)'
+      model: 'Galaxy S21 Ultra 5G'
+    - regex: '(?:SAMSUNG-)?SM-G996(?:U1|[0BNWU])|SCG10'
+      model: 'Galaxy S21+ 5G'
+    - regex: '(?:SAMSUNG-)?SM-S901(?:U1|[0BENUW])'
+      model: 'Galaxy S22'
+    - regex: '(?:SAMSUNG-)?SM-S908(?:U1|[0BENUW])'
+      model: 'Galaxy S22 Ultra'
+    - regex: '(?:SAMSUNG-)?SM-S906(?:U1|[0BENUW])'
+      model: 'Galaxy S22+'
+    - regex: '(?:SAMSUNG-)?SM-F700(?:U1|[0FNUW])|SCV47'
+      model: 'Galaxy Z Flip'
+    - regex: '(?:SAMSUNG-)?SM-F707(?:U1|[0BNUW])|SCG04'
+      model: 'Galaxy Z Flip 5G'
     - regex: '(?:SAMSUNG-)?SCH-I200'
-      model: 'GALAXY Stellar'
+      model: 'Galaxy Stellar'
     - regex: '(?:SAMSUNG-)?SCH-I829'
-      model: 'GALAXY Style Duos'
-    - regex: '(?:SAMSUNG-)?(?:SGH-S730|SCH-R740)'
-      model: 'GALAXY Discover'
+      model: 'Galaxy Style Duos'
+    - regex: '(?:SAMSUNG-)?(?:SCH-R740|SGH-S730)'
+      model: 'Galaxy Discover'
     - regex: '(?:SAMSUNG-)?SCH-S738'
-      model: 'GALAXY Centura'
+      model: 'Galaxy Centura'
     - regex: 'vollo Vi86(?:[);/ ]|$)'
       model: 'Vollo Vi86'
     - regex: '(?:SAMSUNG-)?SM-G386(?:T1|T)'
-      model: 'GALAXY Avant'
-    - regex: '(?:SAMSUNG-)?SM-A015[AFGM]'
-      model: 'GALAXY A01'
+      model: 'Galaxy Avant'
+    - regex: '(?:SAMSUNG-)?SM-A716S'
+      model: 'Galaxy A Quantum'
+    - regex: '(?:SAMSUNG-)?SM-(?:A015(?:DL|[TU]1|[AFGMUV])|S111DL)'
+      model: 'Galaxy A01'
+    - regex: '(?:SAMSUNG-)?SM-A013[FGM]'
+      model: 'Galaxy A01 Core'
+    - regex: '(?:SAMSUNG-)?SM-(?:A025(?:[AFGM]|AZ)?|S124DL)'
+      model: 'Galaxy A02s'
+    - regex: '(?:SAMSUNG-)?SM-A037[F]?'
+      model: 'Galaxy A03s'
+    - regex: '(?:SAMSUNG-)?SM-A035[F]?'
+      model: 'Galaxy A03'
+    - regex: '(?:SAMSUNG-)?SM-A032[F]?'
+      model: 'Galaxy A03 Core'
+    - regex: '(?:SAMSUNG-)?SM-A022[GMF]?'
+      model: 'Galaxy A02'
     - regex: '(?:SAMSUNG-)?SM-A260[FG]'
-      model: 'GALAXY A2 Core'
-    - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|[09FGHMY])'
-      model: 'GALAXY A3 (2015)'
-    - regex: '(?:SAMSUNG-)?SM-A310(?:N0|[FMYX])'
-      model: 'GALAXY A3 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-A320(?:FL|[FYX])'
-      model: 'GALAXY A3 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-A500[LSWY9]?(?:[);/ ]|$)'
-      model: 'GALAXY A5'
-    - regex: '(?:SAMSUNG-)?SM-A500[FGHKM0]'
-      model: 'GALAXY A5 Duos'
+      model: 'Galaxy A2 Core'
+    - regex: '(?:SAMSUNG-)?SM-S115(?:DL)?'
+      model: 'Galaxy A11'
+    - regex: '(?:SAMSUNG-)?SM-A225[F]?'
+      model: 'Galaxy A22'
+    - regex: '(?:SAMSUNG-)?SM-A226|SC-56B'
+      model: 'Galaxy A22 5G'
+    - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|XZ|[09FGHMXY])'
+      model: 'Galaxy A3 (2015)'
+    - regex: '(?:SAMSUNG-)?SM-A310(?:N0|[FMXY])'
+      model: 'Galaxy A3 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-A320(?:FL|[FXY])'
+      model: 'Galaxy A3 (2017)'
+    - regex: '(?:SAMSUNG-)?SM-A430F'
+      model: 'Galaxy A4'
+    - regex: '(?:SAMSUNG-)?SM-A500(?:YZ|[9LSWY])?(?:[);/ ]|$)'
+      model: 'Galaxy A5'
+    - regex: '(?:SAMSUNG-)?SM-A500[0FGHKM]'
+      model: 'Galaxy A5 Duos'
     - regex: '(?:SAMSUNG-)?SM-A500(?:FU|X)'
-      model: 'GALAXY A5 (2015)'
-    - regex: '(?:SAMSUNG-)?SM-A510[08FKLMSYX]'
-      model: 'GALAXY A5 (2016)'
+      model: 'Galaxy A5 (2015)'
+    - regex: '(?:SAMSUNG-)?SM-A510[08FKLMSXY]'
+      model: 'Galaxy A5 (2016)'
     - regex: '(?:SAMSUNG-)?SM-A520[FKLSWX]'
-      model: 'GALAXY A5 (2017)'
+      model: 'Galaxy A5 (2017)'
+    - regex: '(?:SAMSUNG-)?SM-A525'
+      model: 'Galaxy A52'
+    - regex: '(?:SAMSUNG-)?(?:SC-53B|SM-A526)'
+      model: 'Galaxy A52 5G'
+    - regex: '(?:SAMSUNG-)?SM-A528'
+      model: 'Galaxy A52s 5G'
     - regex: '(?:SAMSUNG-)?SM-A600(?:AZ|FN|GN|T1|[AFGNPTUX])'
-      model: 'GALAXY A6'
+      model: 'Galaxy A6'
     - regex: '(?:SAMSUNG-)?SM-A605(?:[FG]N|[08FGX])'
-      model: 'GALAXY A6+'
+      model: 'Galaxy A6+'
     - regex: '(?:SAMSUNG-)?SM-G6200'
-      model: 'GALAXY A6s (2018)'
-    - regex: '(?:SAMSUNG-)?SM-A60(?:60|6Y)'
-      model: 'GALAXY A60'
+      model: 'Galaxy A6s (2018)'
+    - regex: '(?:SAMSUNG-)?SM-A606[0Y]'
+      model: 'Galaxy A60'
     - regex: '(?:SAMSUNG-)?SM-A700(?:YD|[09FHKLSX])'
-      model: 'GALAXY A7'
-    - regex: '(?:SAMSUNG-)?SM-A710[08FKLMSYX]'
-      model: 'GALAXY A7 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-A720[FSX]'
-      model: 'GALAXY A7 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-A750(?:GN|[FGCNX])'
-      model: 'GALAXY A7 (2018)'
+      model: 'Galaxy A7'
+    - regex: '(?:SAMSUNG-)?SM-A710[08FKLMSXY]'
+      model: 'Galaxy A7 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-A720[FMSX]'
+      model: 'Galaxy A7 (2017)'
+    - regex: '(?:SAMSUNG-)?SM-A750(?:GN|[CFGNX])'
+      model: 'Galaxy A7 (2018)'
     - regex: '(?:SAMSUNG-)?SM-A71(?:5[FW])?(?:[);/ ]|$)'
-      model: 'GALAXY A71'
-    - regex: '(?:SAMSUNG-)?SM-A716U(?:[);/ ]|$)'
-      model: 'GALAXY A71 5G'
-    - regex: '(?:SAMSUNG-)?SM-A(?:530F|800[0FISY])|SCV32'
-      model: 'GALAXY A8'
+      model: 'Galaxy A71'
+    - regex: '(?:SAMSUNG-)?SM-A725[FM](?:[);/ ]|$)'
+      model: 'Galaxy A72'
+    - regex: '(?:SAMSUNG-)?SM-A716(?:U1|[0BUV])(?:[);/ ]|$)'
+      model: 'Galaxy A71 5G'
+    - regex: '(?:SAMSUNG-)?SM-A(?:530F|800[0FISXY])|SCV32'
+      model: 'Galaxy A8'
     - regex: '(?:SAMSUNG-)?SM-G885[FSY]'
-      model: 'GALAXY A8 Star'
+      model: 'Galaxy A8 Star'
     - regex: '(?:SAMSUNG-)?SM-A810(?:YZ|[FS])'
-      model: 'GALAXY A8 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-G887[0F]'
-      model: 'GALAXY A8s'
-    - regex: '(?:SAMSUNG-)?SM-A530[NWXM]'
-      model: 'GALAXY A8 (2018)'
-    - regex: '(?:SAMSUNG-)?SM-A730F'
-      model: 'GALAXY A8+ (2018)'
-    - regex: '(?:SAMSUNG-)?SM-A9000'
-      model: 'GALAXY A9'
+      model: 'Galaxy A8 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-(?:A8s|G887[0F])'
+      model: 'Galaxy A8s'
+    - regex: '(?:SAMSUNG-)?SM-A530[MNWX]'
+      model: 'Galaxy A8 (2018)'
+    - regex: '(?:SAMSUNG-)?SM-A730[FX]'
+      model: 'Galaxy A8+ (2018)'
+    - regex: '(?:SAMSUNG-)?SM-A900[0F]'
+      model: 'Galaxy A9'
     - regex: 'SM-A9\[7\]'
-      model: 'GALAXY A9 7'
+      model: 'Galaxy A9 7'
     - regex: '(?:SAMSUNG-)?SM-A920[0FXN]'
-      model: 'GALAXY A9 (2018)'
+      model: 'Galaxy A9 (2018)'
     - regex: '(?:SAMSUNG-)?SM-G885[08]'
-      model: 'GALAXY A9 Star'
-    - regex: '(?:SAMSUNG-)?SM-(?:A910[0F]|G887N)'
-      model: 'GALAXY A9 Pro'
+      model: 'Galaxy A9 Star'
+    - regex: '(?:SAMSUNG-)?SM-(?:A9 Pro|A910[0F]|G887N)'
+      model: 'Galaxy A9 Pro'
     - regex: '(?:SAMSUNG-)?SM-A105[FGMN]'
-      model: 'GALAXY A10'
+      model: 'Galaxy A10'
     - regex: '(?:SAMSUNG-)?SM-A107[FM]'
-      model: 'GALAXY A10s'
-    - regex: '(?:SAMSUNG-)?SM-(?:S102DL|A102[NWU])'
-      model: 'GALAXY A10e'
-    - regex: '(?:SAMSUNG-)?SM-A115F'
-      model: 'GALAXY A11'
-    - regex: '(?:SAMSUNG-)?SM-(?:A205(?:[FGSWU]|YN|U1)|S205DL)|SC-02M|SCV46'
-      model: 'GALAXY A20'
-    - regex: '(?:SAMSUNG-)?SM-A215U(?:[);/ ]|$)'
-      model: 'GALAXY A21'
-    - regex: '(?:SAMSUNG-)?SM-A217F(?:[);/ ]|$)'
-      model: 'GALAXY A21s'
+      model: 'Galaxy A10s'
+    - regex: '(?:SAMSUNG-)?SM-(?:S102DL|A102[NUW])'
+      model: 'Galaxy A10e'
+    - regex: '(?:SAMSUNG-)?SM-A115(?:A[PZ]|U1|[AFMUW])'
+      model: 'Galaxy A11'
+    - regex: '(?:SAMSUNG-)?SM-(?:A12(?:5[FMNUW]|7[FM])|S127DL)'
+      model: 'Galaxy A12'
+    - regex: '(?:SAMSUNG-)?SM-A136(?:U1|[UW])'
+      model: 'Galaxy A13 5G'
+    - regex: '(?:SAMSUNG-)?SM-(?:A205(?:U1|YN|[FGSWU])|S205DL)|SC-02M|SCV46'
+      model: 'Galaxy A20'
+    - regex: '(?:SAMSUNG-)?(?:SM-A215(?:DL|U1|[UW])|SM-S215DL|SC-42A|SCV49)(?:[);/ ]|$)'
+      model: 'Galaxy A21'
+    - regex: '(?:SAMSUNG-)?SM-A217[FMN](?:[);/ ]|$)'
+      model: 'Galaxy A21s'
     - regex: '(?:SAMSUNG-)?SM-A202[FG]'
-      model: 'GALAXY A20e'
+      model: 'Galaxy A20e'
     - regex: '(?:SAMSUNG-)?SM-A207[0FM]'
-      model: 'GALAXY A20s'
-    - regex: '(?:SAMSUNG-)?(?:SM-A305(?:[GYF]N|GT|[NFG])|SCV43)'
-      model: 'GALAXY A30'
+      model: 'Galaxy A20s'
+    - regex: '(?:SAMSUNG-)?(?:SM-A305(?:[FGY]N|GT|[FGN])|SCV43)'
+      model: 'Galaxy A30'
     - regex: '(?:SAMSUNG-)?SM-A307(?:FN|GN|GT|[FG])'
-      model: 'GALAXY A30s'
-    - regex: '(?:SAMSUNG-)?SM-A315[FNG](?:[);/ ]|$)'
-      model: 'GALAXY A31'
+      model: 'Galaxy A30s'
+    - regex: '(?:SAMSUNG-)?SM-A315[FGN](?:[);/ ]|$)'
+      model: 'Galaxy A31'
+    - regex: '(?:SAMSUNG-)?SM-A325'
+      model: 'Galaxy A32'
+    - regex: '(?:SAMSUNG-)?(?:SM-(?:A326(?:BR|U1|[BUW])|S326DL)|SCG08)'
+      model: 'Galaxy A32 5G'
     - regex: '(?:SAMSUNG-)?SM-A405(?:F[NM]|S)'
-      model: 'GALAXY A40'
-    - regex: '(?:SAMSUNG-)?SM-A305[01](?:[);/ ]|$)'
-      model: 'GALAXY A40s'
-    - regex: '(?:SAMSUNG-)?(?:SM-A415F|SCV48)(?:[);/ ]|$)'
-      model: 'GALAXY A41'
-    - regex: '(?:SAMSUNG-)?SM-(?:A505(?:F[NG]|[FGNWUX]|YN|U1?)|S506DL|505FN)'
-      model: 'GALAXY A50'
+      model: 'Galaxy A40'
+    - regex: '(?:SAMSUNG-)?SM-A305[018](?:[);/ ]|$)'
+      model: 'Galaxy A40s'
+    - regex: '(?:SAMSUNG-)?(?:SM-A415F|SC-41A|SCV48)(?:[);/ ]|$)'
+      model: 'Galaxy A41'
+    - regex: '(?:SAMSUNG-)?SM-A426(?:U1|[0BNU])(?:[);/ ]|$)'
+      model: 'Galaxy A42 5G'
+    - regex: '(?:SAMSUNG-)?SM-(?:A505(?:F[GN]|U1|YN|[FGNUWX])|S506DL|505FN)'
+      model: 'Galaxy A50'
     - regex: '(?:SAMSUNG-)?SM-A5070(?:[);/ ]|$)'
-      model: 'GALAXY A50s'
+      model: 'Galaxy A50s'
     - regex: '(?:SAMSUNG-)?SM-A507FN'
-      model: 'GALAXY A50s'
-    - regex: '(?:SAMSUNG-)?SM-A515[F]'
-      model: 'GALAXY A51'
-    - regex: '(?:SAMSUNG-)?SM-A705(?:GM|[MYF]N|F|[W0X])'
-      model: 'GALAXY A70'
+      model: 'Galaxy A50s'
+    - regex: '(?:SAMSUNG-)?SM-(?:A515[FUW]|S515DL)'
+      model: 'Galaxy A51'
+    - regex: '(?:SAMSUNG-)?(?:SM-A516(?:U1|[0BNUV])|SC-54A|SCG07)'
+      model: 'Galaxy A51 5G'
+    - regex: '(?:SAMSUNG-)?SM-A705(?:GM|[MYF]N|[0FUWX])'
+      model: 'Galaxy A70'
     - regex: '(?:SAMSUNG-)?SM-A707[0F]'
-      model: 'GALAXY A70s'
+      model: 'Galaxy A70s'
     - regex: '(?:SAMSUNG-)?SM-A805[0FNX]'
-      model: 'GALAXY A80'
+      model: 'Galaxy A80'
     - regex: '(?:SAMSUNG-)?SM-A908[BN]'
-      model: 'GALAXY A90'
+      model: 'Galaxy A90'
+    - regex: '(?:SAMSUNG-)?SM-A9080'
+      model: 'Galaxy A90 5G'
+    - regex: '(?:SAMSUNG-)?SM-F127G(?:[);/ ]|$)'
+      model: 'Galaxy F12'
+    - regex: '(?:SAMSUNG-)?SM-E225F(?:[);/ ]|$)'
+      model: 'Galaxy F22'
+    - regex: '(?:SAMSUNG-)?SM-F415F(?:[);/ ]|$)'
+      model: 'Galaxy F41'
+    - regex: '(?:SAMSUNG-)?SM-E5260(?:[);/ ]|$)'
+      model: 'Galaxy F52 5G'
+    - regex: '(?:SAMSUNG-)?SM-E625'
+      model: 'Galaxy F62'
     - regex: '(?:SAMSUNG-)?GT-I9301I'
-      model: 'GALAXY S III Neo'
+      model: 'Galaxy S III Neo'
     - regex: '(?:SAMSUNG-)?SM-S120VL(?:[);/ ]|$)'
-      model: 'GALAXY Luna'
-    - regex: '(?:SAMSUNG-)?SM-J100(?:FN|VPP|MU|[FHMY])'
-      model: 'GALAXY J1'
+      model: 'Galaxy Luna'
+    - regex: '(?:SAMSUNG-)?SM-(?:J100(?:FN|VPP|MU|[FGHMY])|S777C)'
+      model: 'Galaxy J1'
     - regex: '(?:SAMSUNG-)?SM-J105[BFHYM]'
-      model: 'GALAXY J1 Mini'
-    - regex: '(?:SAMSUNG-)?SM-J106[FMHB]'
-      model: 'GALAXY J1 mini Prime'
-    - regex: '(?:SAMSUNG-)?SM-(?:J120(?:ZN|[AFHGMTW])|J05H)'
-      model: 'GALAXY J1 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J110[FHMLG]|J111[FM])'
-      model: 'GALAXY J1 Ace'
-    - regex: '(?:SAMSUNG-)?SM-J200[FGHYM]'
-      model: 'GALAXY J2'
+      model: 'Galaxy J1 Mini'
+    - regex: '(?:SAMSUNG-)?SM-J106[BFHM]'
+      model: 'Galaxy J1 mini Prime'
+    - regex: '(?:SAMSUNG-)?SM-(?:J120(?:ZN|[AFGHMPTW])|J05H)'
+      model: 'Galaxy J1 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-(?:J110[FGHLM]|J111[FM])'
+      model: 'Galaxy J1 Ace'
+    - regex: '(?:SAMSUNG-)?SM-J200[FGHMY]'
+      model: 'Galaxy J2'
     - regex: '(?:SAMSUNG-)?SM-J200BT'
-      model: 'GALAXY J2 Duos'
+      model: 'Galaxy J2 Duos'
     - regex: '(?:SAMSUNG-)?SM-J260AZ'
-      model: 'GALAXY J2 Pure'
+      model: 'Galaxy J2 Pure'
     - regex: '(?:SAMSUNG-)?SM-(?:J260([AFGMY]|T1)|S260DL)'
-      model: 'GALAXY J2 Core'
-    - regex: '(?:SAMSUNG-)?SM-J(?:210F|250[FNMGY])'
-      model: 'GALAXY J2 Pro'
+      model: 'Galaxy J2 Core'
+    - regex: '(?:SAMSUNG-)?SM-J(?:210F|250[FGMNY])'
+      model: 'Galaxy J2 Pro'
     - regex: '(?:SAMSUNG-)?SM-(?:S367VL|S357BL)'
-      model: 'GALAXY J3 Orbit'
+      model: 'Galaxy J3 Orbit'
     - regex: '(?:SAMSUNG-)?SM-J311(?:[09]|9S)'
-      model: 'GALAXY J3 Pro'
+      model: 'Galaxy J3 Pro'
     - regex: '(?:SAMSUNG-)?SM-S320VL(?:[);/ ]|$)'
-      model: 'GALAXY J3 Sky'
+      model: 'Galaxy J3 Sky'
     - regex: '(?:SAMSUNG-)?SM-S327VL(?:[);/ ]|$)'
-      model: 'GALAXY J3 Luna Pro'
+      model: 'Galaxy J3 Luna Pro'
     - regex: '(?:SAMSUNG-)?SM-J327(?:T1|[ATW])(?:[);/ ]|$)'
-      model: 'GALAXY J3 Prime'
+      model: 'Galaxy J3 Prime'
     - regex: '(?:SAMSUNG-)?SM-J327(?:[FP]|R4)'
-      model: 'GALAXY J3 Emerge'
+      model: 'Galaxy J3 Emerge'
     - regex: '(?:SAMSUNG-)?SM-J337R4(?:[);/ ]|$)'
-      model: 'GALAXY J3 Aura'
+      model: 'Galaxy J3 Aura'
     - regex: '(?:SAMSUNG-)?SM-J337T(?:[);/ ]|$)'
-      model: 'GALAXY J3 Star'
+      model: 'Galaxy J3 Star'
     - regex: '(?:SAMSUNG-)?SM-J327V'
-      model: 'GALAXY J3 Eclipse'
+      model: 'Galaxy J3 Eclipse'
     - regex: '(?:SAMSUNG-)?SM-S337TL'
-      model: 'GALAXY J3 Luna Pro'
+      model: 'Galaxy J3 Luna Pro'
     - regex: '(?:SAMSUNG-)?SM-J3109'
-      model: 'GALAXY J3 (2015)'
-    - regex: '(?:SAMSUNG-)?SM-J320(?:[ZF]N|R4|W8|YZ|[AFGHMNPVY])'
-      model: 'GALAXY J3 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J330(?:[08FGLN]|FN)|J327(?:R7|U))(?:[);/ ]|$)'
-      model: 'GALAXY J3 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-J337(?:[AWPUV]|VPP)(?:[);/ ]|$)'
-      model: 'GALAXY J3 (2018)'
-    - regex: '(?:SAMSUNG-)?SM-J400[FGM]'
-      model: 'GALAXY J4'
-    - regex: '(?:SAMSUNG-)?SM-J500(?:[8F]|FN|[7GYMH]|N0)(?:[);/ ]|$)'
-      model: 'GALAXY J5 (2015)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J510(?:[8FHKLSYG]|[UFMG]N)|5108|G510H)(?:[);/ ]|$)'
-      model: 'GALAXY J5 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-J530'
-      model: 'GALAXY J5 (2017)'
+      model: 'Galaxy J3 (2015)'
+    - regex: '(?:SAMSUNG-)?SM-(?:J300H|J320(?:[ZF]N|R4|W8|YZ|[AFGHMNPVY]))'
+      model: 'Galaxy J3 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-(?:J330(?:FN|[08FGLN])|J327(?:R7|U))(?:[);/ ]|$)'
+      model: 'Galaxy J3 (2017)'
+    - regex: '(?:SAMSUNG-)?SM-J337(?:VPP|[AWPUV])(?:[);/ ]|$)'
+      model: 'Galaxy J3 (2018)'
+    - regex: '(?:SAMSUNG-)?SM-(?:G400[FG]|J400[FGM])'
+      model: 'Galaxy J4'
+    - regex: '(?:SAMSUNG-)?SM-J500(?:FN|N0|[78FGHMY])(?:[);/ ]|$)'
+      model: 'Galaxy J5 (2015)'
+    - regex: '(?:SAMSUNG-)?SM-(?:J510(?:[FGMU]N|FQ|[8FGHKLSY])|5108|G510H)(?:[);/ ]|$)'
+      model: 'Galaxy J5 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-J530|lineage_j5y17lte'
+      model: 'Galaxy J5 (2017)'
     - regex: '(?:SAMSUNG-)?SM-G570[0FMY]'
-      model: 'GALAXY J5 Prime'
-    - regex: '(?:SAMSUNG-)?SM-J600[NFGL]'  # 2018
-      model: 'GALAXY J6'
+      model: 'Galaxy J5 Prime'
+    - regex: '(?:SAMSUNG-)?SM-J600[FGLN]'  # 2018
+      model: 'Galaxy J6'
     - regex: '(?:SAMSUNG-)?SM-J610[FG]'
-      model: 'GALAXY J6+'
+      model: 'Galaxy J6+'
     - regex: '(?:SAMSUNG-)?SM-J410[FG]'
-      model: 'GALAXY J4 Core'
-    - regex: '(?:SAMSUNG-)?SM-J415(?:[FNG]|[FG]N)'
-      model: 'GALAXY J4+'
-    - regex: '(?:SAMSUNG-)?SM-J7[01]0(?:8|F|FN|H|K|M|MN)'
-      model: 'GALAXY J7'
+      model: 'Galaxy J4 Core'
+    - regex: '(?:SAMSUNG-)?SM-J415(?:[FG]N|[FGN])'
+      model: 'Galaxy J4+'
+    - regex: '(?:SAMSUNG-)?SM-J7[01]0(?:FN|MN|[8FHKM])'
+      model: 'Galaxy J7'
     - regex: '(?:SAMSUNG-)?SM-J700P'
-      model: 'GALAXY J7 (2015)'
+      model: 'Galaxy J7 (2015)'
     - regex: '(?:SAMSUNG-)?SM-(?:J700(?:T1|T)|J710GN|J7109)'
-      model: 'GALAXY J7 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J730[K]|J727(?:[AUSF]|R4))(?:[);/ ]|$)'
-      model: 'GALAXY J7 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-J737(?:[AVPUS]|T1?|VPP|R4)(?:[);/ ]|$)'
-      model: 'GALAXY J7 (2018)'
+      model: 'Galaxy J7 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-(?:J730[K]|J727(?:R4|[AFSU]))(?:[);/ ]|$)'
+      model: 'Galaxy J7 (2017)'
+    - regex: '(?:SAMSUNG-)?SM-J737(?:R4|T1|VPP|[APSTUV])(?:[);/ ]|$)'
+      model: 'Galaxy J7 (2018)'
     - regex: '(?:SAMSUNG-)?SM-C710F'
-      model: 'GALAXY J7+ (C7)'
+      model: 'Galaxy J7+ (C7)'
     - regex: '(?:SAMSUNG-)?SM-G610[FMY]'
-      model: 'GALAXY J7 Prime'
+      model: 'Galaxy J7 Prime'
     - regex: '(?:SAMSUNG-)?SM-G611(?:FF|MT|M)'
-      model: 'GALAXY J7 Prime 2'
-    - regex: '(?:SAMSUNG-)?SM-G615[F]'
-      model: 'GALAXY J7 Max'
+      model: 'Galaxy J7 Prime 2'
+    - regex: '(?:SAMSUNG-)?SM-G615F'
+      model: 'Galaxy J7 Max'
     - regex: '(?:SAMSUNG-)?SM-(?:S727VL|S737TL)'
-      model: 'GALAXY J7 Sky Pro'
-    - regex: '(?:SAMSUNG-)?SM-J730(?:F|G|GM)'
-      model: 'GALAXY J7 Pro'
-    - regex: '(?:SAMSUNG-)?SM-J701(?:F|M)'
-      model: 'GALAXY J7 Core' # also GALAXY J7 Nxt and GALAXY J7 Neo
+      model: 'Galaxy J7 Sky Pro'
+    - regex: '(?:SAMSUNG-)?SM-(?:J7 Pro|J730(?:GM|[FG]))'
+      model: 'Galaxy J7 Pro'
+    - regex: '(?:SAMSUNG-)?SM-J701[FM]'
+      model: 'Galaxy J7 Core' # also Galaxy J7 Nxt and Galaxy J7 Neo
     - regex: '(?:SAMSUNG-)?SM-J720[FM]'
-      model: 'GALAXY J7 Duo'
+      model: 'Galaxy J7 Duo'
     - regex: '(?:SAMSUNG-)?SM-(?:S767VL|S757BL)'
-      model: 'GALAXY J7 Crown'
-    - regex: '(?:SAMSUNG-)?SM-J727(?:P|T|V)'
-      model: 'GALAXY J7 V'
+      model: 'Galaxy J7 Crown'
+    - regex: '(?:SAMSUNG-)?SM-J727[PTV]'
+      model: 'Galaxy J7 V'
     - regex: 'SM-J7\[7\]'
-      model: 'GALAXY J7 7'
+      model: 'Galaxy J7 7'
     - regex: '(?:SAMSUNG-)?SM-J810'
-      model: 'GALAXY J8'
+      model: 'Galaxy J8'
+    - regex: 'SM-J8 Plus'
+      model: 'Galaxy J8 Plus'
     - regex: 'SM-J8 Pro'
-      model: 'GALAXY J8 Pro'
+      model: 'Galaxy J8 Pro'
     - regex: 'SM-J9\[7\] Prime'
-      model: 'GALAXY J9 7 Prime'
+      model: 'Galaxy J9 7 Prime'
     - regex: 'SM-J9\[8\] Pro'
-      model: 'GALAXY J9 8 Pro'
+      model: 'Galaxy J9 8 Pro'
     - regex: '(?:SAMSUNG-)?SM-M015[FG]'
-      model: 'GALAXY M01'
-    - regex: '(?:SAMSUNG-)?SM-M105[FGM]'
-      model: 'GALAXY M10'
+      model: 'Galaxy M01'
+    - regex: '(?:SAMSUNG-)?SM-M013F'
+      model: 'Galaxy M01 Core'
+    - regex: '(?:SAMSUNG-)?SM-M017F'
+      model: 'Galaxy M01s'
+    - regex: '(?:SAMSUNG-)?SM-M025F'
+      model: 'Galaxy M02s'
+    - regex: '(?:SAMSUNG-)?SM-M022[FGM]'
+      model: 'Galaxy M02'
+    - regex: '(?:SAMSUNG-)?SM-M105[FGMY]'
+      model: 'Galaxy M10'
     - regex: '(?:SAMSUNG-)?SM-M107F'
-      model: 'GALAXY M10s'
-    - regex: '(?:SAMSUNG-)?SM-M115F'
-      model: 'GALAXY M11'
-    - regex: '(?:SAMSUNG-)?SM-M205[FGNM]'
-      model: 'GALAXY M20'
+      model: 'Galaxy M10s'
+    - regex: '(?:SAMSUNG-)?SM-M115[FM]'
+      model: 'Galaxy M11'
+    - regex: '(?:SAMSUNG-)?SM-M127[FG]'
+      model: 'Galaxy M12'
+    - regex: '(?:SAMSUNG-)?SM-(?:M205(?:[FGMN]|FN)|M20)(?:[);/ ]|$)'
+      model: 'Galaxy M20'
     - regex: '(?:SAMSUNG-)?SM-M215F'
-      model: 'GALAXY M21'
-    - regex: '(?:SAMSUNG-)?SM-M307([0F]|FN)'
-      model: 'GALAXY M30s'
-    - regex: '(?:SAMSUNG-)?SM-M305'
-      model: 'GALAXY M30'
+      model: 'Galaxy M21'
+    - regex: '(?:SAMSUNG-)?SM-M215G'
+      model: 'Galaxy M21 (2021)'
+    - regex: '(?:SAMSUNG-)?SM-M225'
+      model: 'Galaxy M22'
+    - regex: '(?:SAMSUNG-)?SM-(?:M307(?:FN|[0F])|M30s)'
+      model: 'Galaxy M30s'
+    - regex: '(?:SAMSUNG-)?SM-M305?'
+      model: 'Galaxy M30'
     - regex: '(?:SAMSUNG-)?SM-M315F'
-      model: 'GALAXY M31'
+      model: 'Galaxy M31'
+    - regex: '(?:SAMSUNG-)?SM-M325F'
+      model: 'Galaxy M32'
+    - regex: '(?:SAMSUNG-)?SM-M326'
+      model: 'Galaxy M32 5G'
     - regex: '(?:SAMSUNG-)?SM-M317F'
-      model: 'GALAXY M31s'
+      model: 'Galaxy M31s'
     - regex: '(?:SAMSUNG-)?SM-M405'
-      model: 'GALAXY M40'
+      model: 'Galaxy M40'
+    - regex: '(?:SAMSUNG-)?SM-M426'
+      model: 'Galaxy M42 5G'
+    - regex: '(?:SAMSUNG-)?SM-M515F'
+      model: 'Galaxy M51'
+    - regex: '(?:SAMSUNG-)?SM-M526'
+      model: 'Galaxy M52 5G'
+    - regex: '(?:SAMSUNG-)?SM-M625'
+      model: 'Galaxy M62'
     - regex: '(?:SAMSUNG-)?SM-W201([689])'
-      model: 'GALAXY W201$1'
+      model: 'Galaxy W201$1'
+    - regex: '(?:SAMSUNG-)?SM-W2022'
+      model: 'Galaxy W22'
 
-    - regex: '(?:SAMSUNG-)?SM-G850F'
-      model: 'GALAXY Alpha'
+    - regex: '(?:SAMSUNG-)?SM-W2015'
+      model: 'Galaxy Golden 2'
     - regex: '(?:SAMSUNG-)?SM-G910S'
-      model: 'GALAXY Round'
+      model: 'Galaxy Round'
     - regex: '(?:SAMSUNG-)?SM-(?:G550(?:FY|T[12]?)|S550TL|G55[01]0|G5520)'
-      model: 'GALAXY On5'
+      model: 'Galaxy On5'
     - regex: '(?:SAMSUNG-)?SM-G5528'
-      model: 'GALAXY On5 (2016)'
+      model: 'Galaxy On5 (2016)'
     - regex: '(?:SAMSUNG-)?SM-G600(?:FY|[0F])'
-      model: 'GALAXY On7'
+      model: 'Galaxy On7'
     - regex: '(?:SAMSUNG-)?SM-G610[0KLS]'
-      model: 'GALAXY On7 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-G611[FSKL]'
-      model: 'GALAXY On7 Prime'
-    - regex: '(?:SAMSUNG-)?SM-C5000'
-      model: 'GALAXY C5'
+      model: 'Galaxy On7 (2016)'
+    - regex: '(?:SAMSUNG-)?SM-G611[FKLS]'
+      model: 'Galaxy On7 Prime'
+    - regex: '(?:SAMSUNG-)?SM-C500[0X]'
+      model: 'Galaxy C5'
     - regex: '(?:SAMSUNG-)?SM-C501[08]'
-      model: 'GALAXY C5 Pro'
-    - regex: '(?:SAMSUNG-)?SM-C7000'
-      model: 'GALAXY C7'
-    - regex: '(?:SAMSUNG-)?SM-C701[08F]'
-      model: 'GALAXY C7 Pro'
+      model: 'Galaxy C5 Pro'
+    - regex: '(?:SAMSUNG-)?SM-C700[0X]'
+      model: 'Galaxy C7'
+    - regex: '(?:SAMSUNG-)?SM-C701[08FX]'
+      model: 'Galaxy C7 Pro'
     - regex: '(?:SAMSUNG-)?SM-C710[08]'
-      model: 'GALAXY C8'
+      model: 'Galaxy C8'
     - regex: '(?:SAMSUNG-)?SM-C900[08FY]'
-      model: 'GALAXY C9 Pro'
+      model: 'Galaxy C9 Pro'
     - regex: '(?:SAMSUNG-)?SM-Z130H'
-      model: 'GALAXY Z1'
+      model: 'Galaxy Z1'
     - regex: '(?:SAMSUNG-)?SM-Z200[FMY]'
-      model: 'GALAXY Z2'
+      model: 'Galaxy Z2'
     - regex: '(?:SAMSUNG-)?SM-Z300H'
-      model: 'GALAXY Z3'
+      model: 'Galaxy Z3'
     - regex: '(?:SAMSUNG-)?SM-Z400[FY]'
-      model: 'GALAXY Z4'
-    - regex: '(?:SAMSUNG-)?SM-(?:G150|G155S)(?:[);/ ]|$)'
-      model: 'GALAXY Folder'
-    - regex: '(?:SAMSUNG-)?(?:SM-G16(?:[05]0?|0N))(?:[);/ ]|$)'
-      model: 'GALAXY Folder 2'
+      model: 'Galaxy Z4'
+    - regex: '(?:SAMSUNG-)?SM-(?:G150(?:N[0KLS])?|G155S)(?:[);/ ]|$)'
+      model: 'Galaxy Folder'
+    - regex: '(?:SAMSUNG-)?(?:SM-G16(?:0N|[05]0?|5N))(?:[);/ ]|$)'
+      model: 'Galaxy Folder 2'
     - regex: '(?:SAMSUNG-)?SM-J321AZ(?:[);/ ]|$)'
-      model: 'GALAXY Sol'
+      model: 'Galaxy Sol'
     - regex: '(?:SAMSUNG-)?SM-J326AZ(?:[);/ ]|$)'
-      model: 'GALAXY Sol 2'
+      model: 'Galaxy Sol 2'
     - regex: '(?:SAMSUNG-)?SM-J336AZ(?:[);/ ]|$)'
-      model: 'GALAXY Sol 3'
+      model: 'Galaxy Sol 3'
     - regex: '(?:SAMSUNG-)?SM-J727AZ(?:[);/ ]|$)'
-      model: 'GALAXY Halo'
+      model: 'Galaxy Halo'
     - regex: '(?:SAMSUNG-)?SM-J327AZ'
-      model: 'GALAXY Amp Prime 2'
+      model: 'Galaxy Amp Prime 2'
     - regex: '(?:SAMSUNG-)?SM-J337AZ'
-      model: 'GALAXY Amp Prime 3 (2018)'
+      model: 'Galaxy Amp Prime 3 (2018)'
 
     # explicit phablet models
-    - regex: '(?:SAMSUNG-)?SM-(?:F900[0FU]|F907[BN])'
-      model: 'GALAXY Fold'
+    - regex: '(?:SAMSUNG-)?SM-(?:F900[0FUW]|F907[BN])|SCV44'
+      model: 'Galaxy Fold'
+      device: 'phablet'
+    - regex: '(?:SAMSUNG-)?(?:SM-F711|SCG12|SC-54B)'
+      model: 'Galaxy Z Flip 3'
+      device: 'phablet'
+    - regex: '(?:SAMSUNG-)?SM-F916(?:U1|[0BNQUW])|SCG05'
+      model: 'Galaxy Z Fold 2 5G'
+      device: 'phablet'
+    - regex: '(?:SAMSUNG-)?(?:SM-F926|SC-55B|SCG11)'
+      model: 'Galaxy Z Fold 3 5G'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I9060(?:[);/ ]|$)'
-      model: 'GALAXY Grand Neo'
+      model: 'Galaxy Grand Neo'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I9063'
-      model: 'GALAXY Grand Neo Duos'
+      model: 'Galaxy Grand Neo Duos'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I9(?:080|128)'
-      model: 'GALAXY Grand'
+      model: 'Galaxy Grand'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I9168'
-      model: 'GALAXY Grand Neo+'
+      model: 'Galaxy Grand Neo+'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I9082'
-      model: 'GALAXY Grand Duos'
+      model: 'Galaxy Grand Duos'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-N7000'
-      model: 'GALAXY Note'
+      model: 'Galaxy Note'
       device: 'phablet'
-    - regex: 'SC-01G(?:[);/ ]|$)'
-      model: 'GALAXY Note Edge'
+    - regex: '(?:SC-01G|SCL24)(?:[);/ ]|$)'
+      model: 'Galaxy Note Edge'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N935[FSLK](?:[);/ ]|$)'
-      model: 'GALAXY Note Fan Edition'
+      model: 'Galaxy Note Fan Edition'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?(?:(?:GT-)?N7100|SCH-I605|SCH-N719|SCH-R950|SPH-L900)(?:[);/ ]|$)'
-      model: 'GALAXY Note II'
+    - regex: '(?:SAMSUNG-)?(?:(?:GT-)?N7100|SCH-(?:I605|N719|R950)|SPH-L900)(?:[);/ ]|$)'
+      model: 'Galaxy Note II'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-N7105'
-      model: 'GALAXY Note II LTE'
+      model: 'Galaxy Note II LTE'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G710[25L]?(?:[);/ ]|$)'
-      model: 'GALAXY Grand 2'
+    - regex: '(?:SAMSUNG-)?SM-G710(?:2T|5[HL]|[25689KLS])?(?:[);/ ]|$)'
+      model: 'Galaxy Grand 2'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-G720(?:AX|N0|[02])(?:[);/ ]|$)'
-      model: 'GALAXY Grand Max'
-    - regex: '(?:SAMSUNG-)?SM-(?:G53(?:0[AFTYHWMP]|0[AF]Z|1[FH]|0[689]W|0MU|0BT|0R[47])|S920L)(?:[);/ ]|$)'
-      model: 'GALAXY Grand Prime'
+      model: 'Galaxy Grand Max'
+    - regex: '(?:SAMSUNG-)?SM-(?:G530(?:[689]W|[AF]Z|BT|MU|R[47]|[AFHMPTWY])|G531[FH]|S920L)(?:[);/ ]|$)'
+      model: 'Galaxy Grand Prime'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-G531(?:BT|[MY])(?:[);/ ]|$)'
-      model: 'GALAXY Grand Prime VE Duos'
+      model: 'Galaxy Grand Prime VE Duos'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-G532F(?:[);/ ]|$)'
-      model: 'GALAXY Grand Prime Plus' # also GALAXY J2 Prime
+      model: 'Galaxy Grand Prime Plus' # also Galaxy J2 Prime
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-G532MT(?:[);/ ]|$)'
-      model: 'GALAXY J2 Prime (TV)'
+      model: 'Galaxy J2 Prime (TV)'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-G532[MG](?:[);/ ]|$)'
-      model: 'GALAXY J2 Prime'
+      model: 'Galaxy J2 Prime'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N7502(?:[);/ ]|$)'
-      model: 'GALAXY Note 3 Neo Duos'
+      model: 'Galaxy Note 3 Neo Duos'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N750[QL50]?'
-      model: 'GALAXY Note 3 Neo'
+    - regex: '(?:SAMSUNG-)?SM-N750[05LQ]?'
+      model: 'Galaxy Note 3 Neo'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N9002(?:[);/ ]|$)'
-      model: 'GALAXY Note 3 Duos'
+      model: 'Galaxy Note 3 Duos'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-9005(?:[);/ ]|$)'
-      model: 'GALAXY Note 3 LTE'
+      model: 'Galaxy Note 3 LTE'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?(?:SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?|SCL22|SC-01F(?:[);/ ]|$))'
-      model: 'GALAXY Note 3'
+    - regex: '(?:SAMSUNG-)?(?:SM-N900(?:W8|[05689][VQ]?|[AKLPSTV])?|SCL22|SC-01F|SC-02F)'
+      model: 'Galaxy Note 3'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-(?:N910|910U)|N9100(?:[);/ ]|$)'
-      model: 'GALAXY Note 4'
+      model: 'Galaxy Note 4'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N916[SKL]'
-      model: 'GALAXY Note 4 LTE'
+    - regex: '(?:SAMSUNG-)?SM-N916[KLS]'
+      model: 'Galaxy Note 4 LTE'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N915'
-      model: 'GALAXY Note 4 Edge'
+      model: 'Galaxy Note 4 Edge'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N920(?:[0ACGIKLSTPFVX]|R[467]|W8)'
-      model: 'GALAXY Note 5'
+    - regex: '(?:SAMSUNG-)?SM-N920(?:R[467]|W8|[0ACFGIKLPSTVX])'
+      model: 'Galaxy Note 5'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N9208'
-      model: 'GALAXY Note 5 Duos'
+      model: 'Galaxy Note 5 Duos'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-G750(?:8Q|[9AFH])'
-      model: 'GALAXY Mega 2'
+      model: 'Galaxy Mega 2'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I915[028]'
-      model: 'GALAXY Mega 5.8'
+      model: 'Galaxy Mega 5.8'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I920[05]'
-      model: 'GALAXY Mega 6.3'
+      model: 'Galaxy Mega 6.3'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?(?:SM-N930[VFST0P]|SCV34)'
-      model: 'GALAXY Note 7'
+    - regex: '(?:SAMSUNG-)?(?:SM-N930(?:R[467]|W8|[0AFKLPSTUVX])|SCV34)'
+      model: 'Galaxy Note 7'
       device: 'phablet'
     - regex: '(?:SAMSUNG[- ])?SM-N950|SCV37|SC-01K'
-      model: 'GALAXY Note 8'
+      model: 'Galaxy Note 8'
       device: 'phablet'
     - regex: '(?:SAMSUNG[- ])?(?:SM-N960|SCV40|SC-01L)'
-      model: 'GALAXY Note 9'
+      model: 'Galaxy Note 9'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?SM-(?:N970(?:U1|W8|[089DFJKLSXUW])|N971N)'
-      model: 'GALAXY Note 10'
+    - regex: '(?:SAMSUNG[- ])?SM-(?:N970(?:U1|W8|[089DFJKLSUWX])|N971N)'
+      model: 'Galaxy Note 10'
       device: 'phablet'
     - regex: '(?:SAMSUNG[- ])?SM-N770[FX]'
-      model: 'GALAXY Note 10 Lite'
+      model: 'Galaxy Note 10 Lite'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?(?:SM-N975(?:[0FUXW]|U1|Xu)|SM-N976[0BVNUQ]|SC-01M|SCV45)'
-      model: 'GALAXY Note 10+'
+    - regex: '(?:SAMSUNG[- ])?(?:SM-N975(?:U1|XU|[0CFUWX])|SM-N976[0BVNQU]|SC-01M|SCV45)'
+      model: 'Galaxy Note 10+'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?(?:SM-N980(?:F|F/DS))'
-      model: 'GALAXY Note 20'
+    - regex: '(?:SAMSUNG[- ])?(?:SM-N980(?:F/DS|F))'
+      model: 'Galaxy Note 20'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?(?:SM-N981(?:B|B/DS|N|U|U1|W))'
-      model: 'GALAXY Note 20 5G'
+    - regex: '(?:SAMSUNG[- ])?(?:SM-N981(?:B/DS|U1|[0BNUW]))'
+      model: 'Galaxy Note 20 5G'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?(?:SM-N985(?:F|F/DS))'
-      model: 'GALAXY Note 20 Ultra'
+    - regex: '(?:SAMSUNG[- ])?(?:SM-N985(?:F/DS|F))'
+      model: 'Galaxy Note 20 Ultra'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?(?:SM-N986(?:B/DS|U1|[BNWU])|SCG06)'
-      model: 'GALAXY Note 20 Ultra 5G'
+    - regex: '(?:SAMSUNG[- ])?(?:SM-N986(?:B/DS|U1|[0BNUW])|SC-53A|SCG06)'
+      model: 'Galaxy Note 20 Ultra 5G'
       device: 'phablet'
 
     - regex: '(?:SAMSUNG-)?SM-W750V'
@@ -11865,12 +17008,17 @@ Samsung:
       model: 'E2152'
       device: 'feature phone'
 
+    # explicit notebooks
+    - regex: 'Chromebook 3'
+      model: 'Chromebook 3'
+      device: 'desktop'
+
     # general detections
     - regex: '(?:SAMSUNG-)?(GT-(P|N8|N5)[0-9]+[a-z]?)'
       device: 'tablet'
       model: '$1'
     - regex: 'SC-02C'
-      model: 'GALAXY S II'
+      model: 'Galaxy S II'
     - regex: '(?:SAMSUNG-)?((?:SM-[TNP]|GT-P)[a-z0-9_\-]+)'
       device: 'tablet'
       model: '$1'
@@ -11880,9 +17028,9 @@ Samsung:
       device: 'tv'
       model: 'Smart TV'
     - regex: 'Galaxy ([^/;]+) Build'
-      model: 'GALAXY $1'
+      model: 'Galaxy $1'
     - regex: 'Galaxy ([a-z0-9]+)'
-      model: 'GALAXY $1'
+      model: 'Galaxy $1'
     - regex: 'SAMSUNG[\-][ ]?([a-z0-9]+[\-_][a-z0-9]+)'
       model: '$1'
     - regex: 'SAMSUNG;[ ]?([a-z0-9]+[\-_][a-z0-9]+)'
@@ -11891,6 +17039,8 @@ Samsung:
       model: '$1'
     - regex: 'SAMSUNG;[ ]?([a-z0-9 ]+)'
       model: '$1'
+    - regex: 'SEC_SC-([a-z0-9]+)'
+      model: 'SC-$1' # NTT DoCoMo
     - regex: 'SEC-([a-z0-9]+)'
       model: '$1'
     - regex: 'SAM-([a-z0-9]+)'
@@ -11923,13 +17073,17 @@ Selfix:
       model: 'Slash 6'
     - regex: 'VOYAGER-V45'
       model: 'Voyager V45'
+    - regex: 'SELFIX_Q5_URBAN'
+      model: 'Q5 Urban'
 
-# Sencor
+# Sencor (sencor.cz or sencor.com)
 Sencor:
-  regex: 'Sencor|ELEMENT[ _]?(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?(?:[);/ ]|$)|ELEMENT[ _]?(?:P[0-9]+)(?:[);/ ]|$)'
+  regex: 'Sencor|(?:ELEMENT[ _]?(?:(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?|P[0-9]+|10.1 Q001)|10_1Q205)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     # explicit tablet models
+    - regex: '(?:SENCOR[ _])?Element (10\.1) (Q001)'
+      model: 'Element $1" $2'
     - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V3'
       model: 'Element 7 V3'
     - regex: '(?:SENCOR[ _])?ELEMENT[ _]?7[ _]?V2[ _]BASIC'
@@ -11950,6 +17104,10 @@ Sencor:
       model: 'Element 9.7'
     - regex: '(?:SENCOR[ _])?ELEMENT10[ _]1'
       model: 'Element 10.1'
+    - regex: '(?:SENCOR[ _])?(7Q105)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(10)_(1Q205)(?:[);/ ]|$)'
+      model: '$1.$2'
 
     - regex: '(?:SENCOR[ _])?ELEMENT[ _]?P([0-9]+)'
       model: 'Element P$1'
@@ -11958,43 +17116,88 @@ Sencor:
     - regex: 'Sencor[ _]([^;/]+) Build'
       model: '$1'
 
-# Senwa
+# Senwa (senwamobile.com)
 Senwa:
-  regex: 'Senwa|(?:S\-?(?:471|7[12]5|6[01]5|915|905TL|1000|5018)|V705B)[ /;\)]'
+  regex: 'Senwa|(?:S\-?(?:471|7[12]5|6[01]5|915|905TL|1000|5018)|V705B|LS50F| LS50?|LS5518H|LS5718|LS5018F)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'S\-?471[ /;\)]'
+    - regex: 'S-?471(?:[);/ ]|$)'
       model: 'Jazz'
-    - regex: 'S\-?605[ /;\)]'
+    - regex: 'S-?605(?:[);/ ]|$)'
       model: 'City'
-    - regex: 'S\-?905TL[ /;\)]'
+    - regex: 'S-?905TL(?:[);/ ]|$)'
       model: 'Odin'
-    - regex: 'S\-?1000[ /;\)]'
+    - regex: 'S-?1000(?:[);/ ]|$)'
       model: 'Odin'
-    - regex: 'S\-?5018[ /;\)]'
+    - regex: 'S-?5018(?:[);/ ]|$)'
       model: 'Inizio'
-    - regex: 'S\-?(615|7[12]5|915)[ /;\)]'
+    - regex: 'LS5018F(?:[);/ ]|$)'
+      model: 'Inizio LTE'
+    - regex: 'S-?(615|7[12]5|915)(?:[);/ ]|$)'
       model: 'S$1'
-    - regex: 'V705B[ /;\)]'
+    - regex: 'V705B(?:[);/ ]|$)'
       model: 'V705B'
-    - regex: 'Senwa[ _-]*([^;/]+) Build'
-      model: '$1'
-    - regex: 'Senwa[ _-]*([^ ;/)]+)(?:[);/ ]|$)'
-      model: '$1'
-
-# Sky
+    - regex: 'LS50F(?:[);/ ]|$)'
+      model: 'Evolution'
+    - regex: ' LS50(?:[);/ ]|$)'
+      model: 'Pegasus'
+    - regex: ' LS5(?:[);/ ]|$)'
+      model: 'Thor'
+    - regex: 'LS5518H(?:[);/ ]|$)'
+      model: 'Sparkly'
+    - regex: 'LS5718(?:[);/ ]|$)'
+      model: 'Diamond'
+    - regex: 'Senwa[ _-]*([^;/]+)(?: Build|[;)])'
+      model: '$1'
+
+# Sky or Sky Devices (skydevices.com)
 Sky:
-  regex: '(SKY|Elite|Fuego)[_ ][3-7]\.[05]([A-Z]{1,2})?|Elite_5_5_Octa|Platinum_(5.0M|M5)'
+  regex: '(?:SKY|Elite|Fuego)[_ ][3-7]\.[05](?:[A-Z]{1,2})?|Elite[ _](?:5_0T|M45|[45]T|45T|GO|M5Plus|[TE]55|T[46]|[ABCHP]5|5_5_Octa|Octa|[BCEHPT]55)|Platinum[_ ](?:5.0M|5\.5C|[56]\.[05]\+?|[HJM]5|[ABCMP]4|[ACGK]55|[ABDEFG]5|A57|P9|X|UNO|VIEW2|O|4\.0|4_0Plus)|PLATINUMVIEW|SKY[ _](?:55M|Pro_III)|SKYVISION|SKY Black| SKY[ _]Prestige'
   device: 'smartphone'
   models:
-    - regex: 'Platinum_(5.0M|M5)'
+    - regex: 'Platinum[_ ](?:5\.0M|M5)'
       model: 'Platinum 5.0M'
+    - regex: 'Platinum[_ ]5\.5C'
+      model: 'Platinum 5.5C'
+    - regex: 'Platinum[_ ]([56])\.([05])\+'
+      model: 'Platinum $1.$2 Plus'
+    - regex: 'Platinum_4_0Plus'
+      model: 'Platinum 4.0 Plus'
+    - regex: 'Platinum[ _]4\.0'
+      model: 'Platinum 4.0'
+    - regex: 'Platinum[_ ](P9) Pro(?:[);/ ]|$)'
+      model: 'Platinum $1 Pro'
+    - regex: 'Platinum[_ ]([ABCMP]4|[HJ]5|[ACGK]55|[ABDEFG]5|A57|P9|X|UNO|O|6\.0)(?:[);/ ]|$)'
+      model: 'Platinum $1'
+    - regex: 'Platinum[_ ]?VIEW(2)?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Platinum View$1'
+    - regex: 'SKYVISION'
+      device: 'tablet'
+      model: 'Vision'
+    - regex: 'Elite Octa(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Elite Octa'
     - regex: 'Elite_5_5_Octa'
       model: 'Elite 5.5 Octa'
-    - regex: 'Elite[_ ]([3-7]\.[05](?:[A-Z]{1,2})?\+?)'
+    - regex: 'Elite M5Plus'
+      model: 'Elite M5 Plus'
+    - regex: 'Elite[ _](M45|Go|[45]T|T[46]|[ABCHP]5|[ABCEHPT]55|45T)(?:[);/ ]|$)'
       model: 'Elite $1'
+    - regex: 'Elite[_ ]([3-7])[\._]([05](?:[A-Z]{1,2})?\+?)'
+      model: 'Elite $1.$2'
     - regex: 'Fuego[_ ]([3-7]\.[05](?:[A-Z]{1,2})?\+?)'
       model: 'Fuego $1'
+    - regex: 'SKY Black'
+      model: 'Black'
+    - regex: 'SKY_Pro_III'
+      model: 'Pro III'
+    - regex: 'SKY 55M'
+      model: '55M'
+    - regex: 'SKY[ _]PrestigeX'
+      model: 'Prestige X'
+    - regex: 'SKY[ _]Prestige'
+      model: 'Prestige'
     - regex: 'SKY[_ ]([3-7]\.[05](?:[A-Z]{1,2})?)'
       model: '$1'
 
@@ -12048,7 +17251,7 @@ Smartfren:
 
 # Smartisan
 Smartisan:
-  regex: '(SM(?:70[15]|[89]01|919)|OD10[35]|YQ60[1357]|DE106|DT1901A|O[CE]106|OS103|O[CS]105)[ /;\)]'
+  regex: 'Smartisan[_ ]|(SM(?:70[15]|[89]01|919)|OD10[35]|YQ60[1357]|DT2002C|DE106|DT190[12]A|O[CE]106|OS103|O[CS]105)[ /;\)]'
   device: 'smartphone'
   models:
     - regex: 'SM70[15]'
@@ -12071,14 +17274,18 @@ Smartisan:
       model: 'Nut Pro 2s'
     - regex: 'OC10[56][ /;\)]'
       model: 'Nut 3'
-    - regex: 'DT1901A[ /;\)]'
+    - regex: 'DT2002C[ /;\)]'
+      model: 'Nut 2'
+    - regex: 'DT190[12]A[ /;\)]'
       model: 'Nut Pro 3'
     - regex: 'OS103[ /;\)]'
       model: 'JianGuo Pro 2'
+    - regex: 'Smartisan U3 Pro'
+      model: 'U3 Pro'
 
 # STF Mobile
 STF Mobile:
-  regex: 'Fractal|AERIAL PLUS|Origins Pro'
+  regex: '(?:AERIAL PLUS|BLOCK_MINI|BLOCK GO|BLOCK 3|Fractal|Joy Pro|Origins Pro|SLAY II)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Fractal'
@@ -12087,6 +17294,18 @@ STF Mobile:
       model: 'Origins Pro'
     - regex: 'AERIAL PLUS'
       model: 'Aerial Plus'
+    - regex: 'BLOCK_MINI'
+      model: 'Block Mini'
+    - regex: 'BLOCK 3 mini'
+      model: 'Block 3 Mini'
+    - regex: 'BLOCK 3'
+      model: 'Block 3'
+    - regex: 'BLOCK GO'
+      model: 'Block Go'
+    - regex: 'SLAY II'
+      model: 'Slay II'
+    - regex: 'Joy Pro'
+      model: 'Joy Pro'
 
 # STK
 STK:
@@ -12100,7 +17319,7 @@ STK:
 
 # Stonex
 Stonex:
-  regex: 'STX[ -]([^;/]+)'
+  regex: 'STX[ -]([^;/]+)|STONE EVO'
   device: 'smartphone'
   models:
     - regex: 'STX[ -]([^;/]+) Build'
@@ -12110,19 +17329,19 @@ Stonex:
 
 # SuperSonic
 SuperSonic:
-  regex: '(SC-[0-9]+[a-z]+)'
+  regex: '(SC-[0-9]+[a-z]+|SC-2110)'
   device: 'tablet'
   model: '$1'
 
 # Supra
 Supra:
-  regex: 'SUPRA|NVTAB 7.0 3G'
+  regex: 'SUPRA|NVTAB 7.0 3G|M74C 3G'
   device: 'smartphone'
   models:
-    - regex: 'SUPRA[ _]([^;/]+)(?: Build|\))'
+    - regex: 'SUPRA[ _]([^;/)]+)(?: Build|[;)])'
       device: 'tablet'
       model: '$1'
-    - regex: '(NVTAB 7.0 3G)'
+    - regex: '(NVTAB 7.0 3G|M74C 3G)'
       device: 'tablet'
       model: '$1'
 
@@ -12142,26 +17361,32 @@ SunVan:
     - regex: 'SUNVAN[ _\-]?([^);/ ]+)'
       model: '$1'
 
-# SWISSMOBILITY
+# SWISSMOBILITY or Swiss Mobility
 SWISSMOBILITY:
-  regex: 'SCHR9GR|ZUR722M'
+  regex: '(?:SCHR9G[RL]|PRA(?:U8|100|557|507)|ZUR(?:722M|70016W?|700[RW]|805A))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'SCHR9GR'
+    - regex: 'SCHR9G[RL]'
       model: 'SCHON R9'
+    - regex: 'PRA(U8|100|557|507)(?:[);/ ]|$)'
+      model: 'PRA$1'
     - regex: 'ZUR722M'
       device: 'phablet'
       model: 'Z72 go'
 
+    - regex: 'ZUR(70016W?|700[RW]|805A)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'ZUR$1'
+
 # Thomson
 Thomson:
-  regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002|5014G)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+'
+  regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|(?<!\.)8950|MID1002|5014G|TEO7RK|TEO104G|Friendly_TH101|Delight TH201)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+|THOMSON,'
   device: 'tablet'
   models:
     # already detected as manta device
     #- regex: 'MID1002'
     #  model: 'MID1002'
-    - regex : 'Primo(7|8)'
+    - regex: 'Primo(7|8)'
       model: 'Primo $1'
     - regex: 'QM734-2'
       model: 'QM734-2'
@@ -12171,8 +17396,10 @@ Thomson:
       model: 'QM735-8G'
     - regex: 'QM736-8G\(HD\)'
       model: 'QM736-8G (HD)'
-    - regex: '8950(?:[);/ ]|$)'
+    - regex: '(?<!\.)8950(?:[);/ ]|$)'
       model: '3G 8950'
+    - regex: 'TEO(7RK|104G)(?:[);/ ]|$)'
+      model: 'TEO$1'
 
     - regex: '5014G(?:[);/ ]|$)'
       device: 'smartphone'
@@ -12183,10 +17410,31 @@ Thomson:
     - regex: 'Every([0-9]+)'
       device: 'smartphone'
       model: 'Every$1'
+    - regex: 'Delight TH201'
+      device: 'smartphone'
+      model: 'Delight TH201'
+    - regex: 'Friendly_TH101'
+      device: 'smartphone'
+      model: 'Friendly TH101'
+    - regex: '((?:49|55)UC6306|55UC63|32HD55|40FD54|55UD63)'
+      device: 'tv'
+      model: '$1'
+
+# Tanix
+Tanix:
+  regex: '(?:TX5 MAX|TX[69]s|TX3 Mini)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: 'TX([69])s'
+      model: 'TX$1s'
+    - regex: 'TX5 MAX'
+      model: 'TX5 Max'
+    - regex: 'TX3 Mini'
+      model: 'TX3 Mini'
 
 # pantech
 Pantech:
-  regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+(?:[);/ ]|$)|ADR910L'
+  regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|(?<!Winmax )TX[T]?[0-9]+|IM-[a-z0-9]+(?:[);/ ]|$)|ADR910L'
   device: 'smartphone'
   models:
     # explicit smartphone models
@@ -12201,6 +17449,8 @@ Pantech:
       model: '$1'
     - regex: '(P[GTN]-[a-z0-9]+)'
       model: '$1'
+    - regex: '(TX[T]?[0-9]+) Pro'
+      model: '$1 Pro'
     - regex: '(TX[T]?[0-9]+)'
       model: '$1'
     - regex: '(IM-[a-z0-9]+)(?:[);/ ]|$)'
@@ -12220,17 +17470,30 @@ Ployer:
     - regex: 'MOMO([0-9][^);/]*)(?:[);/]|$)'
       model: 'MOMO $1'
 
-# Plum
+# Plum (plum-mobile.com)
 Plum:
-  regex: 'PLUM '
+  regex: 'PLUM[ _]'
   device: 'smartphone'
   models:
     - regex: 'Z405'
       model: 'Gator 3'
+    - regex: 'Z407'
+      model: 'Axe 4'
+    - regex: 'Z516'
+      model: 'Compass'
+    - regex: 'Z811'
+      device: 'tablet'
+      model: 'Optimax 11'
+    - regex: 'Z709'
+      device: 'tablet'
+      model: 'Optimax 7'
+    - regex: 'Z712'
+      device: 'tablet'
+      model: 'Optimax 12'
 
 # Polaroid
 Polaroid:
-  regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5)(?:[);/ ]|$)'
+  regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|P902/A900|PSPC(?:505|550|[MZL]20A0|K2[01]NA)|SIGMA 5|MIDS145PXE|MIDS747PX|MID4004JBL|MIDS185PR|PSPTD21NA|POMDTB006|PSPCL30A0|PSN-H116)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
@@ -12240,14 +17503,20 @@ Polaroid:
       model: 'Turbo C5'
     - regex: 'P4006A'
       model: 'Turbo D4'
+    - regex: 'PSPTD21NA'
+      model: 'Turbo D2 Plus'
     - regex: 'P4526A'
       model: 'Turbo E'
     - regex: 'PSPC(505|550)'
       model: 'Cosmo $1'
+    - regex: 'PSPCL30A0'
+      model: 'Cosmo C6'
     - regex: 'P5006A'
       model: 'Cosmo K'
     - regex: 'P5526A'
       model: 'Cosmo K Plus'
+    - regex: 'PSPCK20NA'
+      model: 'Cosmo K2'
     - regex: 'PSPCK21NA'
       model: 'Cosmo K2 Plus'
     - regex: 'P5026A'
@@ -12268,6 +17537,8 @@ Polaroid:
       model: 'L5s'
     - regex: 'PRO4611(?:PR201)?'
       model: 'Pro4611'
+    - regex: 'PRO5023'
+      model: 'Phantom 5'
     - regex: 'PROV400'
       model: 'Agate'
     - regex: 'PROV350'
@@ -12276,13 +17547,28 @@ Polaroid:
       model: 'Sigma 5'
     - regex: 'PRO([VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z]))'
       model: 'Pro$1'
+    - regex: 'PSPT350'
+      model: 'Turbo 350 Gris'
+    - regex: 'PSN-H116'
+      model: 'Snap'
 
-    - regex: '(MID(?:1014|0714))'
+    - regex: 'POLAROID, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      device: 'tv'
+      model: ''
+
+    - regex: 'MIDS185PR'
+      model: 'Pure 10.1"'
+      device: 'tablet'
+    - regex: '(MID(?:1014|0714|S145PXE|S747PX|4004JBL)|POMDTB006)'
       model: '$1'
       device: 'tablet'
+
     - regex: '((?:PMID|MIDC)[0-9a-z]+)(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
+    - regex: '(P902/A900)(?:[);/ ]|$)'
+      model: '$1'
+      device: 'tablet'
     - regex: 'Polaroid'
       model: ''
       device: 'tablet'
@@ -12316,14 +17602,20 @@ Polytron:
       model: 'Rocket R2'
     - regex: 'POLYTRON[ _-]R2407'
       model: 'Rocket R3'
+    - regex: 'POLYTRON[ _-]R2452'
+      model: 'Rocket S1'
     - regex: 'POLYTRON[ _-]R2457'
       model: 'Rocket S2'
     - regex: 'POLYTRON[ _-]R2501'
       model: 'Rocket T1'
+    - regex: 'POLYTRON[ _-]R2507'
+      model: 'Rocket T3'
     - regex: 'POLYTRON[ _-]R2509SE'
       model: 'Rocket T6 SE'
     - regex: 'POLYTRON[ _-]R2509'
       model: 'Rocket T6'
+    - regex: 'POLYTRON[ _-]R250A'
+      model: 'Rocket T7'
     - regex: 'POLYTRON[ _-]R2506'
       model: 'Rocket T4'
     - regex: 'POLYTRON[ _-](?:R3450|W1400)'
@@ -12344,6 +17636,8 @@ Polytron:
       model: 'Rocket L501'
     - regex: 'POLYTRON[ _]P520'
       model: 'Prime 7S'
+    - regex: 'POLYTRON[ _]P552'
+      model: 'Prime 7 Pro'
     - regex: '4G500'
       model: 'Zap 6 Cleo'
     - regex: 'W8480'
@@ -12373,47 +17667,209 @@ Polytron:
       model: 'Rocket Pad'
       device: 'tablet'
 
-
-# Positivo
+# Positivo (www.positivoempresas.com.br)
 Positivo:
-  regex: 'YPY_S450'
+  regex: '(?:YPY_S450|Twist 4(?: Fit|Pro)?|T1085|Positivo Q20|M10 4G PRO X)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'YPY_S450'
       model: 'YPY S450'
+    - regex: 'Positivo (Q20)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Twist 4 (Fit|Pro)'
+      model: 'Twist 4 $1'
+    - regex: 'Twist 4'
+      model: 'Twist 4'
+    - regex: 'T1085'
+      device: 'tablet'
+      model: 'T1085'
+    - regex: 'M10 4G PRO X'
+      device: 'tablet'
+      model: 'M10 4G Pro X'
 
-# Prestigio
+# Prestigio (prestigio.ru)
 Prestigio:
-  regex: '(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+(?:[);/ ]|$)|Muze C3'
+  regex: 'Prestigio 5500 DUO|(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+(?:[);/ ]|$)|Muze C3'
   device: 'tablet'
   models:
-    - regex: 'PMT3277_3G'
-      model: 'MultiPad Ranger 7.0 3G'
-    - regex: 'PGPS7799CIS08GBPG(?:[);/ ]|$)'
-      model: 'Geo Vision Tour 3'
-    - regex: 'PGPS7797(?:[);/ ]|$)'
-      model: 'Geo Vision Tour 2'
-    - regex: 'PMT3201_4G'
-      model: 'Grace 4G'
+    # explicit smartphone models
+    - regex: 'Prestigio 5500 DUO'    # PAP5500DUO
+      model: 'MultiPhone 5500 Duo'
+      device: 'smartphone'
+    - regex: 'PSP(5517|550[578])DUO(?:[);/ ]|$)'
+      model: 'MultiPhone $1 Duo'
+      device: 'smartphone'
     - regex: 'PSP5551DUO'
+      device: 'smartphone'
       model: 'Grace S5'
-    - regex: 'PMT3287_3G'
-      model: 'MultiPad Ranger 8.0 3G'
-    - regex: 'PMT3208[_ ]3G'
-      model: 'MultiPad Wize 8.0 3G'
-    - regex: 'PSP7546DUO([ _][A-Z]{2})?'
-      model: 'X Pro'
-    - regex: 'PSP7610DUO([ _][A-Z]{2})?'
-      model: 'S Max'
-    - regex: '(PM[PT][0-9]+[a-z0-9_]+)(?:[);/ ]|$)'
-      model: '$1'
-    - regex: '((?:PAP|PSP)[0-9]+[a-z0-9_]+(?: DUO)?)(?:[);/ ]|$)'
-      model: '$1'
+    - regex: 'PSP7590DUO'
       device: 'smartphone'
-    - regex: 'Muze C3(?:[);/ ]|$)'
-      model: 'Muze C3'
+      model: 'Grace V7 LTE'
+    - regex: 'PSP7551DUO'
       device: 'smartphone'
-
+      model: 'Grace S7 LTE'
+    - regex: 'PSP5470DUO'
+      device: 'smartphone'
+      model: 'Grace X5'
+    - regex: 'PSP5530DUO'
+      device: 'smartphone'
+      model: 'Grace Z5'
+    - regex: 'PSP3533DUO'
+      device: 'smartphone'
+      model: 'Grace Z3'
+    - regex: 'PSP5515DUO'
+      device: 'smartphone'
+      model: 'Grace P5'
+    - regex: 'PSP5552DUO'
+      device: 'smartphone'
+      model: 'Grace R5 LTE'
+    - regex: 'PSP5506DUO'
+      device: 'smartphone'
+      model: 'Grace Q5'
+    - regex: 'PSP5511DUO'
+      device: 'smartphone'
+      model: 'Grace M5 LTE'
+    - regex: 'PSP7501DUO'
+      device: 'smartphone'
+      model: 'Grace R7'
+    - regex: 'PSP7570DUO'
+      device: 'smartphone'
+      model: 'Grace P7 LTE'
+    - regex: 'PSP7572DUO'
+      device: 'smartphone'
+      model: 'Grace B7'
+    - regex: 'PSP3552DUO'
+      device: 'smartphone'
+      model: 'Muze H3'
+    - regex: 'PSP5523DUO'
+      device: 'smartphone'
+      model: 'Muze H5 LTE'
+    - regex: 'PSP3515DUO'
+      device: 'smartphone'
+      model: 'Muze M3 LTE'
+    - regex: 'PSP3495DUO'
+      device: 'smartphone'
+      model: 'Muze V3 LTE'
+    - regex: 'PSP5513DUO'
+      device: 'smartphone'
+      model: 'Muze D5 LTE'
+    - regex: 'PSP5520DUO'
+      device: 'smartphone'
+      model: 'Muze B5'
+    - regex: 'PSP5518DUO'
+      device: 'smartphone'
+      model: 'Muze X5 LTE'
+    - regex: 'PSP5553DUO'
+      device: 'smartphone'
+      model: 'Muze F5 LTE'
+    - regex: 'PSP5502DUO'
+      device: 'smartphone'
+      model: 'Muze A5'
+    - regex: 'PSP5545DUO'
+      device: 'smartphone'
+      model: 'Muze E5 LTE'
+    - regex: 'PSP7512DUO'
+      device: 'smartphone'
+      model: 'Muze E7 LTE'
+    - regex: 'PSP3511DUO'
+      device: 'smartphone'
+      model: 'Muze G3 LTE'
+    - regex: 'PSP5522DUO'
+      device: 'smartphone'
+      model: 'Muze G5 LTE'
+    - regex: 'PSP7550DUO'
+      device: 'smartphone'
+      model: 'Muze G7 LTE'
+    - regex: 'PSP7510DUO'
+      device: 'smartphone'
+      model: 'Muze C7 LTE'
+    - regex: '(?:Muze C3|PSP3504DUO)(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Muze C3'
+    - regex: 'PSP3512DUO'
+      device: 'smartphone'
+      model: 'Muze B3'
+    - regex: 'PSP3532DUO'
+      device: 'smartphone'
+      model: 'Muze F3'
+    - regex: 'PSP3470DUO'
+      device: 'smartphone'
+      model: 'Muze J3'
+    - regex: 'PSP5524DUO'
+      device: 'smartphone'
+      model: 'Muze J5'
+    - regex: 'PSP7511DUO'
+      device: 'smartphone'
+      model: 'Muze B7'
+    - regex: 'PSP3514DUO'
+      device: 'smartphone'
+      model: 'Wize U3'
+    - regex: 'PSP3513DUO'
+      device: 'smartphone'
+      model: 'Wize V3'
+    - regex: 'PSP3416DUO'
+      device: 'smartphone'
+      model: 'Wize YA3'
+    - regex: 'PSP3406DUO'
+      device: 'smartphone'
+      model: 'Wize Y3'
+    - regex: 'PSP3423DUO'
+      device: 'smartphone'
+      model: 'Wize R3'
+    - regex: 'PSP3471DUO'
+      device: 'smartphone'
+      model: 'Wize Q3 LTE'
+    - regex: 'PSP3510DUO'
+      device: 'smartphone'
+      model: 'Wize G3'
+    - regex: 'PSP3537DUO'
+      device: 'smartphone'
+      model: 'Wize NV3'
+    - regex: 'PSP3528DUO'
+      device: 'smartphone'
+      model: 'Wize PX3'
+    - regex: 'PSP3527DUO'
+      device: 'smartphone'
+      model: 'Wize NK3'
+    - regex: 'PSP3468DUO'
+      device: 'smartphone'
+      model: 'Wize OK3'
+    # explicit tables models
+    - regex: 'PMT3277_3G'
+      model: 'MultiPad Ranger 7.0" 3G'
+    - regex: 'PMT4208'
+      model: 'Node A8 3G'
+    - regex: 'PMT4771'
+      model: 'Root A10 3G'
+    - regex: 'PMP7070C3G'
+      model: 'MultiPad 4 Diamond 7.0" 3G'
+    - regex: 'PGPS7799CIS08GBPG(?:[);/ ]|$)'
+      model: 'Geo Vision Tour 3'
+    - regex: 'PGPS7797(?:[);/ ]|$)'
+      model: 'Geo Vision Tour 2'
+    - regex: 'PMT(3118|38[74]8|3[12]01|3[12]57|778[18]|5588|5791|577[18]|4327|3768)[_ ]([34])G'
+      model: 'Grace $1 $2G'
+    - regex: 'PMT3287_3G'
+      model: 'MultiPad Ranger 8.0 3G'
+    - regex: 'PMT4238_4G'
+      model: 'Q Pro'
+    - regex: 'PMT(1177|3208|3618|31[357]1|1157|1196|3[10]96|3[17]61)[_ ]([34])GE?'
+      model: 'MultiPad Wize $1 $2G'
+    - regex: 'PMT(4638|4311|413[17]|411[178]|3771)[_ ]([34])GE?'
+      model: 'Wize $1 $2G'
+    - regex: 'PMT(3231|4231|4667|38[3678]1)[_ ]([34])GE?'
+      model: 'Muze $1 $2G'
+    - regex: 'PSP7546DUO([ _][A-Z]{2})?'
+      model: 'X Pro'
+    - regex: 'PSP7610DUO([ _][A-Z]{2})?'
+      model: 'S Max'
+    # general detection
+    - regex: '(PM[PT][0-9]+[a-z0-9_]+)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '((?:PAP|PSP)[0-9]+[a-z0-9_]+(?: DUO)?)(?:[);/ ]|$)'
+      model: '$1'
+      device: 'smartphone'
+
 # Sanyo
 Sanyo:
   regex: 'Sanyo|MobilePhone[ ;]'
@@ -12427,14 +17883,14 @@ Sanyo:
     - regex: 'SCP-?6780'
       model: 'Innuendo'
 
-    - regex: 'SANYO[ \-_]([a-z0-9\-]+)'
+    - regex: 'SANYO[ /_-]([a-z0-9\-]+)'
       model: '$1'
     - regex: 'MobilePhone ([a-z0-9\-]+)'
       model: '$1'
 
-# Qilive (Auchan)
+# Qilive
 Qilive:
-  regex: 'Qilive [0-9][^;/]*|Q(7S5[5]?IN4G|7T10INP|8T10IN|8S55IN4G2|8S[56]IN4G|10S5[37]IN4G|10S[56]IN4G|10S[56]IN4GR|9S5IN4G|6T7IN)'
+  regex: 'Qilive [0-9][^;/]*|Q(7S5[5]?IN4G|7T10INP|T19101HV|8T10IN|8S55IN4G2|8S[56]IN4G|9T9IN|9T(?:7|10)IN4G|9S55IN4G|10S5[37]IN4G|10S[56]IN4G|10S[56]IN4GR|9S5IN4G|6T7IN)'
   device: 'smartphone'
   models:
     - regex: 'Q7S5IN4G'
@@ -12449,6 +17905,8 @@ Qilive:
       model: 'Q8 5.1" 4G'
     - regex: 'Q9S5IN4G'
       model: 'Q9 5.0" 4G'
+    - regex: 'Q9S55IN4G'
+      model: 'Q9 5.5" 4G'
     - regex: 'Q10S53IN4G'
       model: 'Q10 5.3" 4G'
     - regex: 'Q10S57IN4G'
@@ -12466,22 +17924,92 @@ Qilive:
     - regex: 'Q8T10IN'
       model: 'Q8 10.1"'
       device: 'tablet'
-    - regex: 'Qilive ([0-5][^;/]*) Build'
+    - regex: 'Q9T7IN4G'
+      model: 'Q9 7.0" 4G'
+      device: 'tablet'
+    - regex: 'Q9T9IN'
+      model: 'Q9 9.0"'
+      device: 'tablet'
+    - regex: 'Q9T10IN4G'
+      model: 'Q9 10.1" 4G'
+      device: 'tablet'
+    - regex: '(QT19101HV)'
+      model: '$1'
+      device: 'tablet'
+    - regex: 'Qilive (1\d+[^;/)]*)(?: Build|[;)])'
       model: '$1'
-    - regex: 'Qilive ([0-5][^;/]*)/'
+      device: 'tablet'
+    - regex: 'Qilive ([0-5][^;/)]*)(?: Build|[;)])'
       model: '$1'
-    - regex: 'Qilive ([6-9][^;/]*) Build'
+    - regex: 'Qilive ([0-5]*)/'
       model: '$1'
+    - regex: '97R-2'
+      model: '97R2'
       device: 'tablet'
-    - regex: 'Qilive ([6-9][^;/]*)/'
+    - regex: 'Qilive ([6-9][^;/)]*)(?: Build|[;)])'
       model: '$1'
       device: 'tablet'
 
-# QMobile
+# Vankyo
+Vankyo:
+  regex: 'Vankyo[_ ]|QTAB1010X'
+  device: 'tablet'
+  models:
+    - regex: 'Vankyo[_ ]S(10|[78])'
+      model: 'MatrixPad S$1'
+    - regex: 'QTAB(1010X)'
+      model: 'QTab $1'
+
+# QMobile or QSmart or Q-Smart (qmobile.com.pk)
 QMobile:
-  regex: 'QMobile|QTab|Q-Smart|Noir X1S|LUNA PRO|NICE S'
+  regex: 'QMobile|QTab(?!10EW)|Q-Smart|(?:E2 Noir|Noir X1S|LUNA PRO|NICE S|JazzX JS(?:[27]|10)(?: PRO)?|LT[57]00[ _]PRO|LT950|Q Infinity|Hot 5|Hot Pro 2|VITA S|i7i 2020|i10[ _]20(?:20|19)|Z12 PRO| GLi)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'JazzX JS7 PRO'
+      model: 'Jazz X JS7 Pro'
+    - regex: 'JazzX JS(2|10)'
+      model: 'Jazz X JS$1'
+    - regex: 'Noir X1S'
+      model: 'Noir X1S'
+    - regex: 'A600(?:[);/ ]|$)'
+      model: 'Noir A600'
+    - regex: 'Z12 PRO'
+      model: 'Noir Z12 Pro'
+    - regex: 'E2 Noir'
+      model: 'E2 Noir'
+    - regex: 'Hot Pro 2'
+      model: 'Hot Pro 2'
+    - regex: 'Hot 5'
+      model: 'Hot 5'
+    - regex: 'LT([57]00)[ _]PRO'
+      model: 'Noir LT$1 Pro'
+    - regex: 'LUNA PRO'
+      model: 'Luna Pro'
+    - regex: 'VITA S'
+      model: 'Vita S'
+    - regex: 'NICE S'
+      model: 'Nice S'
+    - regex: 'i7i 2020'
+      model: 'i7i (2020)'
+    - regex: 'i10[ _]20(20|19)'
+      model: 'i10 (20$1)'
+    - regex: 'i8i PRO'
+      model: 'i8i Pro'
+    - regex: 'Q Infinity PRO'
+      model: 'Q Infinity Pro'
+    - regex: 'Q Infinity E Lite'
+      model: 'Q Infinity E Lite'
+    - regex: 'Q Infinity ([FCB])'
+      model: 'Q Infinity $1'
+    - regex: '(LT950)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'GLi Lite(?:[);/ ]|$)'
+      model: 'GLi Lite'
+    - regex: ' GLi(?:[);/ ]|$)'
+      model: 'GLi'
+    - regex: 'QMobile ENERGY (X[12])(?:[);/ ]|$)'
+      model: 'Energy $1'
+    # general detections
     - regex: 'QTab[ _-]([^;/]+) Build'
       model: '$1 Tab'
       device: 'tablet'
@@ -12492,24 +18020,45 @@ QMobile:
       model: '$1'
     - regex: '(?:QMobile|Q-Smart)[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
-    - regex: 'Noir X1S'
-      model: 'Noir X1S'
-    - regex: 'LUNA PRO'
-      model: 'Luna Pro'
-    - regex: 'NICE S'
-      model: 'Nice S'
+    - regex: 'Q Infinity'
+      model: 'Q Infinity'
+
+# Maximus (maximus-mobile.com)
+Maximus:
+  regex: 'Maximus[ _]|(Noir X|G10 max)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Maximus[ _])?(Noir X|D1)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'G10 max(?:[);/ ]|$)'
+      model: 'G10 Max'
+    - regex: 'Maximus_(T2)'
+      device: 'tablet'
+      model: '$1'
 
 # Quantum
 Quantum:
-  regex: 'Quantum (?:Fit|MUV (?:PRO|UP)|Go|Mini|V|You [2E])(?:[);/ ]|$)'
+  regex: '(?:Quantum (?:Fit|Five|UP|MUV (?:PRO|UP)|Go|Mini|V|You [2E])|Q20|LIO\+|Q-TITANO(_007i|-H2)?|Q-Pulse70M|Q-Wave(?:101|71M))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Quantum (Fit|Go|Mini|V|You [2E])(?:[);/ ]|$)'
+    - regex: 'LIO\+(?:[);/ ]|$)'
+      model: 'Lio Plus'
+    - regex: 'Quantum (Fit|Five|Go|Mini|V|You [2E]|Q20)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Quantum MUV PRO(?:[);/ ]|$)'
       model: 'MUV Pro'
     - regex: 'Quantum MUV UP(?:[);/ ]|$)'
       model: 'MUV Up'
+    - regex: 'Quantum UP(?:[);/ ]|$)'
+      model: 'Up'
+    - regex: 'Q-TITANO[ _-](BOS|X|M1|007i|H[12]|AK47)(?:[);/ ]|$)'
+      model: 'Q-Titano $1'
+    - regex: 'Q-Pulse70M(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Q-Pulse 70M'
+    - regex: 'Q-Wave(101|71M)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Q-Wave $1'
 
 # Quechua
 Quechua:
@@ -12519,9 +18068,21 @@ Quechua:
 
 # Ramos
 Ramos:
-  regex: 'Ramos ?([^/;]+) Build'
-  device: 'tablet'
-  model: '$1'
+  regex: 'Ramos ?([^/);]+)(?: Build|[);])|(?:MOS1(?:max)?|W22PRO 3G)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Ramos[ _])?(R10|R9|M7)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(MOS1)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'MOS1max'
+      model: 'MOS1 Max'
+    - regex: 'W22PRO 3G'
+      device: 'tablet'
+      model: 'W22 Pro 3G'
+    - regex: 'Ramos ?([^/;]+)(?: Build|[);])'
+      device: 'tablet'
+      model: '$1'
 
 # Razer
 Razer:
@@ -12537,22 +18098,34 @@ Sendo:
 
 # Turbo-X
 Turbo-X:
-  regex: 'Turbo-X|Hive V 3G|Turbox_S3'
+  regex: 'Turbo-X|(?:Hive V 3G|Turbox_S3|Fire_II_WiFi)(?:[);/ ]|$)|Mercury(?!/)'
   device: 'smartphone'
   models:
+    # specific smartphone models
     - regex: 'Turbox_S3'
       model: 'S3'
     - regex: 'Turbo-X_A2(?:[);/ ]|$)'
       model: 'A2'
     - regex: 'Turbo-X_e3(?:[);/ ]|$)'
       model: 'E3'
+    - regex: 'Mercury(?!/)'
+      model: 'Mercury'
+
+    # specific tablet models
     - regex: 'Turbo-X Ice(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Ice'
     - regex: 'Hive V 3G(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Hive V 3G'
+    - regex: 'Fire_II_WiFi(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Fire II WiFi'
 
+    # general detections
+    - regex: 'TURBO-X, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+      device: 'tv'
     - regex: 'Turbo-X Tablet([^;/]+) Build'
       device: 'tablet'
       model: 'Tablet$1'
@@ -12585,14 +18158,16 @@ Turbo:
   device: 'smartphone'
   model: 'Blackphone 2'
 
-# Sigma
+# Sigma or Sigma Mobile (sigmamobile.net)
 Sigma:
-  regex: 'Sigma|(X[_-]Style[ _]?Tab[_ ]A([0-9]{2,3})|X[-_ ]?treme[-_ ]?PQ[0-9]{2}|X-Style_S5501)(?:[);/ ]|$)'
+  regex: 'Sigma(?!Designs)|(X[_-]Style[ _]?Tab[_ ]A(\d+)|X[-_ ]?treme[-_ ]?PQ[0-9]{2}|X-Style_S5501)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: '(?:Sigma[ _])?X[-_ ]?treme[-_ ]?PQ([0-9]{2}) Max(?:[);/ ]|$)'
+      model: 'X-Treme PQ$1 Max'
     - regex: '(?:Sigma[ _])?X[-_ ]?treme[-_ ]?PQ([0-9]{2})(?:[);/ ]|$)'
       model: 'X-Treme PQ$1'
-    - regex: 'X[_-]Style[ _]?Tab[_ ]A([0-9]{2,3})(?:[);/ ]|$)'
+    - regex: 'X[_-]Style[ _]?Tab[_ ]A(\d+)(?:[);/ ]|$)'
       model: 'X-Style Tab A$1'
       device: 'tablet'
     - regex: '(?:Sigma[ _])?X[-_ ]?Style[-_ ]S([0-9]+)(?:[);/ ]|$)'
@@ -12600,17 +18175,29 @@ Sigma:
 
 # Spice
 Spice:
-  regex: 'Spice'
+  regex: '(?<![\d];)Spice|(?:Xlife[-_ ](?:\d+Q?|Victor5|M5q\+|M5 Pro|Proton5|Electro55HD))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Spice[ _\-]?([^/;]+)(?:[\)]| Build)'
+    - regex: '(?:Spice_)?Xlife[-_ ](\d+Q?|M5\+)(?:[);/ ]|$)'
+      model: 'Xlife $1'
+    - regex: 'Xlife-M5q\+'
+      model: 'Xlife M5Q+'
+    - regex: 'Xlife-M5 Pro'
+      model: 'Xlife M5 Pro'
+    - regex: 'Xlife-Victor5'
+      model: 'Xlife Victor 5'
+    - regex: 'Xlife-Proton5 Pro'
+      model: 'Xlife Proton 5 Pro'
+    - regex: 'Xlife-Electro55HD'
+      model: 'Xlife Electro 55 HD'
+    - regex: 'Spice[-_ ]?([^/;]+)(?: Build|[;)])'
       model: '$1'
-    - regex: 'Spice[ _\-]?([^/;]+)(?:/|$)'
+    - regex: 'Spice[-_ ]?([^/;]+)(?:/|$)'
       model: '$1'
 
 # Sharp (jp.sharp)
 Sharp:
-  regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[45789]|SH-M1[123]|S[357]-SH|SH-Z(10|01)|SH-[CL]02|SH-RM1[12]|404SH|[45]02SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL22|SHV4[0-8]|SHV3[13-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|603SH|SHV4[035][-_]u|SW001SH|SHG01)(?:[);/ ]|$)'
+  regex: 'SHARP(?!_2)|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[14-9]|SH-M1[1-7](?:-y)?|S[357]-SH|SH-[MZ](10|01)|SH-[CL]02|SH-RM(?:1[1258]|02)|SH-R?M19|SH-R10A|[34]04SH|401SH|[45]02SH|306SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL2[125]|SHV4[0-8]|SHV3[1-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|403SH|603SH|SHF3[1-4]|SHV4[035][-_]u|SW001SH|SHG0[1-6]|X4-SH|A002SH|SH-A01|DM-01[JH]|SH-D01|SH-01FDQ|A[01]01SH|606SH|FS801[56]|d-41A|NP80[567]SH|NP501SH|A00[34]SH|A102SH|IS05|SH-(?:53A|51B|H01)|LP-01|FS8014|SBM00[35]SH|SBM103SH)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
@@ -12620,8 +18207,10 @@ Sharp:
       model: 'Aquos Xx3 Mini'
     - regex: '50[23]SH(?:[);/ ]|$)'
       model: 'Aquos Xx2'
-    - regex: '404SH(?:[);/ ]|$)'
+    - regex: '[34]04SH(?:[);/ ]|$)'
       model: 'Aquos Xx'
+    - regex: '606SH(?:[);/ ]|$)'
+      model: 'Aquos ea'
     - regex: '507SH(?:[);/ ]|$)'
       model: 'Android One'
     - regex: 'S3-SH(?:[);/ ]|$)'
@@ -12630,57 +18219,87 @@ Sharp:
       model: 'Android One S5'
     - regex: 'S7-SH(?:[);/ ]|$)'
       model: 'Android One S7'
+    - regex: 'X4-SH(?:[);/ ]|$)'
+      model: 'Android One X4'
+    - regex: 'SHG06(?:[);/ ]|$)'
+      model: 'Aquos Wish'
     - regex: 'SH-M04(?:[);/ ]|$)'
       model: 'Aquos SH-M04'
     - regex: 'SH-M05(?:[);/ ]|$)'
       model: 'Aquos Sense Lite'
     - regex: 'SH-M07(?:[);/ ]|$)'
       model: 'Aquos Sense Plus'
-    - regex: 'SH-M12(?:[);/ ]|$)'
+    - regex: 'A003SH(?:[);/ ]|$)'
+      model: 'Aquos Sense 4 Basic'
+    - regex: 'SH-41A(?:[);/ ]|$)'
+      model: 'Aquos Sense 4'
+    - regex: '(?:SH-54B|SHG05|SH-R?M19)(?:[);/ ]|$)'
+      model: 'Aquos Sense 6'
+    - regex: '(?:SHG03|A004SH|SH-M17|SH-53A)(?:[);/ ]|$)'
+      model: 'Aquos Sense 5G'
+    - regex: 'SH-D01(?:[);/ ]|$)'
+      model: 'Aquos D10'
+    - regex: 'SH-M12(?:-y)?(?:[);/ ]|$)'
       model: 'Aquos S3 Dual SIM'
-    - regex: '(?:SH-Z10|801SH)(?:[);/ ]|$)'
-      model: 'Aquos zero'
-    - regex: '(?:SH-M13|906SH)(?:[);/ ]|$)'
+    - regex: 'SH-H01(?:[);/ ]|$)'
+      model: 'Aquos Zeta'
+    - regex: '(?:SH-[MZ]10|801SH)(?:[);/ ]|$)'
+      model: 'Aquos Zero'
+    - regex: '(?:SH-M13|906SH|SH-01M)(?:[);/ ]|$)'
       model: 'Aquos Zero 2'
-    - regex: 'SH-Z01(?:[);/ ]|$)'
+    - regex: '(?:SHG04|A102SH|SH-RM18)(?:[);/ ]|$)'
+      model: 'Aquos Zero 6'
+    - regex: '(?:SHG02|A002SH)(?:[);/ ]|$)'
+      model: 'Aquos Zero 5G Basic'
+    - regex: '(?:SH-Z01|Aquos S2 4/64)(?:[);/ ]|$)'
       model: 'Aquos S2 (C10)'
-    - regex: '(?:SH-02E|SH-01[GH]|SH-04H)(?:[);/ ]|$)'
+    - regex: '(?:SH-02E|SH-01[GH]|SH-04H|SH-09D)(?:[);/ ]|$)'
       model: 'Aquos Phone Zeta'
-    - regex: 'SH06D(?:[);/ ]|$)'
+    - regex: 'SH-01FDQ(?:[);/ ]|$)'
+      model: 'Dragon Quest'
+    - regex: 'SH-?06D(?:[);/ ]|$)'
       model: 'Aquos Phone SH-06D'
-    - regex: 'SHL22(?:[);/ ]|$)'
-      model: 'Aquos Phone SHL22'
+    - regex: '(SHL2[125]|SH-M01)(?:[);/ ]|$)'
+      model: 'Aquos Phone $1'
+    - regex: 'SBM(203SH|30[23]SH)(?:[);/ ]|$)'
+      model: 'Aquos Phone XX $1'
     - regex: 'SH-L02(?:[);/ ]|$)'
       model: 'Aquos L2'
     - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
       model: 'Aquos R'
-    - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
-      model: 'Aquos R'
-    - regex: '(?:701SH|SHV41)(?:[);/ ]|$)'
+    - regex: '(?:701SH|SHV41|SH-M06)(?:[);/ ]|$)'
       model: 'Aquos R Compact'
     - regex: '(?:SH-M09|SHV42|706SH|SH-03K)(?:[);/ ]|$)'
       model: 'Aquos R2'
     - regex: '803SH(?:[);/ ]|$)'
       model: 'Aquos R2 Compact'
-    - regex: '(?:908SH|SHG01)(?:[);/ ]|$)'
+    - regex: '(?:908SH|SHG01|SH-M14)(?:[);/ ]|$)'
       model: 'Aquos R5G'
+    - regex: 'SH-M16(?:[);/ ]|$)'
+      model: 'Aquos S4 Plus'
+    - regex: 'SH-M15(?:[);/ ]|$)'
+      model: 'Aquos S4 SIM'
     - regex: 'SH-C02(?:[);/ ]|$)'
       model: 'Aquos V'
+    - regex: '(SHF3[1-4])(?:[);/ ]|$)'
+      model: 'Aquos K $1'
     - regex: '704SH(?:[);/ ]|$)'
       model: 'Simple Smartphone 4'
     - regex: '(?:SH-02J|SH-04G)(?:[);/ ]|$)'
       model: 'Aquos Ever'
     - regex: 'SH-02H(?:[);/ ]|$)'
       model: 'Aquos Compact'
-    - regex: '305SH(?:[);/ ]|$)'
+    - regex: '30[56]SH(?:[);/ ]|$)'
       model: 'Aquos Crystal'
     - regex: '402SH(?:[);/ ]|$)'
       model: 'Aquos Crystal X'
-    - regex: '509SH(?:[);/ ]|$)'
+    - regex: '403SH(?:[);/ ]|$)'
+      model: 'Aquos Crystal 2'
+    - regex: '(?:509SH|SH-R10A)(?:[);/ ]|$)'
       model: 'Aquos 3'
     - regex: 'NP601SH(?:[);/ ]|$)'
       model: 'Aquos 2'
-    - regex: '(?:SHV40|SHV34)(?:_u)?(?:[);/ ]|$)'
+    - regex: '(?:SHV40|SHV3[24])(?:_u)?(?:[);/ ]|$)'
       model: 'Aquos S'
     - regex: '702SH(?:[);/ ]|$)'
       model: 'Aquos S Basic'
@@ -12688,11 +18307,13 @@ Sharp:
       model: 'Aquos S Mini'
     - regex: '(?:FS8010|SH-M08|SHV43(?:-u)?|SH-01[KL])(?:[);/ ]|$)'
       model: 'Aquos S2'
+    - regex: 'FS8016(?:[);/ ]|$)'
+      model: 'Aquos S2 Plus'
     - regex: '(?:SHV46|SH-R?M11|901SH)(?:[);/ ]|$)'
       model: 'Aquos S3 Plus'
     - regex: '(?:SHV44|808SH|SH-04L|SH-03G)(?:[);/ ]|$)'
       model: 'Aquos R3'
-    - regex: '(?:FS8032|SH-02M|SHV45(?:-U)?)(?:[);/ ]|$)'
+    - regex: '(?:FS8032|FS8015|SH-02M|SHV45(?:-U)?)(?:[);/ ]|$)'
       model: 'Aquos S3'
     - regex: 'FS8018(?:[);/ ]|$)'
       model: 'Aquos S3 Mini'
@@ -12700,27 +18321,62 @@ Sharp:
       model: 'Aquos S3 Basic'
     - regex: 'SH-RM12(?:[);/ ]|$)'
       model: 'Aquos S3 Lite'
+    - regex: 'SH-RM15(?:[);/ ]|$)'
+      model: 'Aquos S4 Lite'
     - regex: 'SH-51A(?:[);/ ]|$)'
       model: 'Aquos R5G'
+    - regex: '(?:SH-51B|A101SH)(?:[);/ ]|$)'
+      model: 'Aquos R6'
     - regex: 'SHV3[57](?:_u)?(?:[);/ ]|$)'
       model: 'Aquos U'
     - regex: 'TG-L900S(?:[);/ ]|$)'
       model: 'Luna S'
+    - regex: 'SH-A01(?:[);/ ]|$)'
+      model: 'B10'
     - regex: '(?:FS8002|SHV47)(?:[);/ ]|$)'
       model: 'Z2'
     - regex: 'FS8009(?:[);/ ]|$)'
       model: 'Z3'
+    - regex: 'FS8014(?:[);/ ]|$)'
+      model: 'R1'
     - regex: 'FS8028(?:[);/ ]|$)'
       model: 'R1S'
     - regex: 'SHV36(?:[);/ ]|$)'
       model: 'Basio 2'
     - regex: 'SW001SH(?:[);/ ]|$)'
       model: 'Star Wars'
+    - regex: 'SH-RM02'
+      model: 'Aquos SH-RM02'
+    - regex: '401SH'
+      model: 'Aquos 401SH'
+    - regex: '(DM-01[JH])'
+      model: 'Disney Mobile $1'
+    - regex: 'A001SH'
+      model: 'Simple Sumaho 5'  # (Simple Smartphone 5)
+    - regex: 'NP80[56]SH'
+      model: 'Aquos Keitai 3'
+    - regex: 'NP807SH'
+      model: 'Aquos Keitai 10'
+    - regex: 'NP501SH'
+      model: 'Aquos Keitai'
+    - regex: 'LP-01(?:[);/ ]|$)'
+      model: 'Leica Leitz Phone 1'
+    - regex: 'SBM(00[35]SH)(?:[);/ ]|$)'
+      model: 'Galapagos $1'  # SoftBank
+    - regex: 'SBM(103SH)(?:[);/ ]|$)'
+      model: 'Aquos Phone $1'  # SoftBank
+    - regex: 'SH-02L(?:[);/ ]|$)'
+      model: 'Aquos K-tai'
+    - regex: 'SBM200SH(?:[);/ ]|$)'
+      model: 'Pantone 6' # SoftBank
 
     # explicit tablet models
     - regex: 'SH-08E(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Sharp Aquos Pad'
+    - regex: 'd-41A(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'dtab d-41A'
 
     - regex: '(LC-(?:[0-9]{2})[a-z0-9]+)(?:[);/ ]|$)'
       device: 'tv'
@@ -12732,9 +18388,15 @@ Sharp:
       model: '$1'
     - regex: '(?:SHARP|SBM)([a-z0-9]+)'
       model: '$1'
-    - regex: '(SH-?[0-9]+[a-z]?)(?:[);/ ]|$)'
+    - regex: '(SH-?[0-9]+[a-z]?|IS05)(?:[);/ ]|$)'
       model: '$1'
 
+# Simply or SIMPLE Mobile (simplemobile.com)
+Simply:
+  regex: '(NP602SI)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
 # Softbank
 Softbank:
   regex: 'Softbank|J-PHONE'
@@ -12749,7 +18411,7 @@ Softbank:
 
 # Sonim
 Sonim:
-  regex: 'Sonim[ -]|XP[67]700(?:[);/ ]|$)'
+  regex: 'Sonim[ -]|XP(?:[67]7|88)00(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Sonim-XP3400'
@@ -12759,6 +18421,8 @@ Sonim:
       model: 'XP6700'
     - regex: 'XP7700(?:[);/ ]|$)'
       model: 'XP7700'
+    - regex: 'XP8800(?:[);/ ]|$)'
+      model: 'XP8'
 
 # Star
 Star:
@@ -12771,9 +18435,94 @@ Star:
     - regex: 'N(9[5678]00|8800|9977)(?:[);/ ]|$)'
       model: 'N$1'
 
+# Starmobile (starmobile.ph)
+Starmobile:
+  regex: '(?:Starmobile (?:Play (?:Neo|Spark|GO|Click)|Astra)|UP[_ ](?:Sense|Rave|Groove|Prime|Selfie|Xtreme|XL|Max)|PLAY (?:Club|Style))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Starmobile PLAY GO(?:[);/ ]|$)'
+      model: 'Play Go'
+    - regex: 'Starmobile ASTRA(?:[);/ ]|$)'
+      model: 'Astra'
+    - regex: '(?:Starmobile )?Play (Neo|Spark|Click|Club|Style)(?:[);/ ]|$)'
+      model: 'Play $1'
+    - regex: 'UP[_ ](Sense|Rave|Groove|Prime|Selfie|Xtreme|XL|Max)(?:[);/ ]|$)'
+      model: 'UP $1'
+
+# Toshiba
+Toshiba:
+  regex: 'Toshiba|TSBNetTV/|portalmmm/[12].0 TS|(?:T-01C|T-0[12]D|IS04|IS11T|AT1S0|AT300SE|AT(?:7-C|10-A|10[PL]E-A|100|200|270|300|330|374|400|470|500a?|503|570|703|830)|AFTKMST12|AFTBAMR311)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    # explicit smartphone models
+    - regex: 'T-01C'
+      model: 'Regza T-01C'
+    - regex: 'T-01D'
+      model: 'Regza T-01D'
+    - regex: 'T-02D'
+      model: 'Regza T-02D'
+    - regex: 'IS04'
+      model: 'Regza IS04'
+    - regex: 'IS11T'
+      model: 'Regza IS11T'
+
+    # explicit tablet models
+    - regex: 'AT7-C'
+      model: 'Excite'
+      device: 'tablet'
+    - regex: 'AT1S0'
+      model: 'Regza AT1S0'
+      device: 'tablet'
+    - regex: 'AT300SE'
+      model: 'Regza AT300SE'
+      device: 'tablet'
+    - regex: 'AT500a'
+      model: 'Regza AT500a'
+      device: 'tablet'
+    - regex: 'AT(100|200|270|300|330|374|400|470|500|503|570|703|830)'
+      model: 'Regza AT$1'
+      device: 'tablet'
+    - regex: 'AT10([PL])E-A'
+      model: 'Excite AT10$1-A'
+      device: 'tablet'
+    - regex: 'AT10-A'
+      model: 'Excite AT10-A'
+      device: 'tablet'
+
+    - regex: 'AFTKMST12'
+      device: 'tv'
+      model: '43LF711U20'
+    - regex: 'AFTBAMR311'
+      device: 'tv'
+      model: '43LF421U19'
+    - regex: 'TOSHIBA, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      device: 'tv'
+      model: ''
+    - regex: 'TSBNetTV/'
+      device: 'tv'
+      model: ''
+    - regex: 'Toshiba[ /_\-]?([a-z0-9_ \-]+) Build'
+      model: '$1'
+    - regex: 'Toshiba[ /_\-]?([a-z0-9_\-]+)'
+      model: '$1'
+    - regex: 'portalmmm/[12].0 (TS[a-z0-9 ]+)'
+      model: '$1'
+
+# Ok
+Ok:
+  regex: 'AFTWI001(?:[);/ ]|$)'
+  device: 'tv'
+  model: '4K (2020)'
+
+# Anker (https://www.anker.com/)
+Anker:
+  regex: 'AFTMM(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'Nebula Soundbar'
+
 # Kindle
 Amazon:
-  regex: 'KF(?:OT|ONWI|TT|JWI|JWA|[DFS]OWI|A[PRSU]WI|T[BH]WI|SAW[IA]|GIWI|KAWI|MAWI|MEWI|MUWI|SUWI)(?:[);/ ]|$)|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)|AFT[ABMNRST]|SD4930UR|AEO(BC|KN)(?:[);/ ]|$)'
+  regex: '(?:AFT[ABMNRST]|AFTSSS?|AFTKA|SD4930UR|AEO(?:BC|C[HW]|KN)|KF(?:OT|ONWI|TT|JWI|JWA|[DFS]OWI|A[PRSU]WI|T[BH]WI|TRP?WI|SAW[IA]|GIWI|KAWI|MAWI|MEWI|MUWI|SUWI))(?:[);/ ]|$)|Kindle|AlexaMediaPlayer|Amazon (?:Tate|Jem)|Silk/\d+\.\d+|Echo/1|.+FIRETVSTICK'
   device: 'tablet'
   models:
     - regex: 'AFTA'
@@ -12786,10 +18535,22 @@ Amazon:
       model: 'Fire TV (Gen 3)'
       device: 'tv'
     - regex: 'AFTB'
-      model: 'Fire TV'
+      model: 'Fire TV (Gen 1)'
+      device: 'tv'
+    - regex: 'AFTSSS'
+      model: 'Fire TV Stick (Gen 3)'
+      device: 'tv'
+    - regex: 'AFTSS'
+      model: 'Fire TV Stick Lite (Gen 1)'
       device: 'tv'
     - regex: 'AFT[MST]'
-      model: 'Fire TV stick'
+      model: 'Fire TV Stick'
+      device: 'tv'
+    - regex: '.+FIRETVSTICK2018'
+      model: 'Fire TV Stick 4K'
+      device: 'tv'
+    - regex: 'AFTKA'
+      model: 'Fire TV Stick 4K Max' # 2021
       device: 'tv'
     - regex: 'KFFOWI(?:[);/ ]|$)'
       model: 'Fire 7"'
@@ -12837,32 +18598,59 @@ Amazon:
       model: 'Fire HD 10 (2017)'
     - regex: 'KFMAWI(?:[);/ ]|$)'
       model: 'Fire HD 10 (2019)'
+    - regex: 'KFTRWI(?:[);/ ]|$)'
+      model: 'Fire HD 10 (2021)'
+    - regex: 'KFTRPWI(?:[);/ ]|$)'
+      model: 'Fire HD 10 Plus (2021)'
     - regex: 'SD4930UR'
       model: 'Fire Phone'
       device: 'smartphone'
 
-
     - regex: 'KFOT|Kindle Fire|Silk/\d+\.\d+'
       model: 'Kindle Fire'
     - regex: 'Kindle'
       model: 'Kindle'
 
-    - regex: 'AEO(BC|KN)(?:[);/ ]|$)'
+    - regex: 'Echo/1|AEO(?:BC|KN)(?:[);/ ]|$)'
       model: 'Echo'
       device: 'smart speaker'
+    - regex: 'AEOC[HW](?:[);/ ]|$)'
+      model: 'Echo Show 8'
+      device: 'smart speaker'
+    - regex: 'AlexaMediaPlayer'
+      model: 'Alexa'
+      device: 'smart speaker'
 
 # Symphony
 Symphony:
-  regex: 'SYMPHONY[ \_]([a-z0-9]+)|roar (V20|E80)'
+  regex: 'SYMPHONY[ \_]([a-z0-9]+)|(?:(?:roar[ _](?:V20|V78|E80|V150))|roarV95|ZVIII|V141)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'roar V20'
-      model: 'Roar V20'
-    - regex: 'roar E80'
-      model: 'Roar E80'
+    - regex: 'ZVIII'
+      model: 'ZVIII'
+    - regex: 'Symphony Atom ii'
+      model: 'Atom II'
+    - regex: 'roar[ _]?(V20|E80|V78|V95|V150)(?:[);/ ]|$)'
+      model: 'Roar $1'
+    - regex: '(V141)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'SYMPHONY[ \_]([a-z0-9]+)'
       model: '$1'
 
+# Helio
+Helio:
+  regex: 'Helio (S60|S5)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# HERO (https://www.only4hero.com/)
+HERO:
+  regex: 'SP-001(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SP-001(?:[);/ ]|$)'
+      model: 'SP-001'
+
 # Syrox
 Syrox:
   regex: '(SYX-(?:T70[04]|T10[12]))(?:[);/ ]|$)'
@@ -12875,23 +18663,53 @@ Qtek:
   device: 'smartphone'
   model: '$1'
 
-# Q-Touch
+# Q-Box
+Q-Box:
+  regex: 'QBOX(?:[);/ ]|$)'
+  device: 'tv'
+  model: ''
+
+# Q-Touch or Q.Touch or QTouch
 Q-Touch:
-  regex: '(Q09) Build'
+  regex: 'Qtouch_|[ ](Q09|QS701|Q05A|QS31)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: '(?:Qtouch[_ ])?[ ]?(Q09|QS701|Q05A|Q85|QS31)(?:[);/ ]|$)'
+      model: '$1'
+
+# G-Touch or GTouch
+G-Touch:
+  regex: 'GTouch[_ ]|(?:Stella (?:XS?|Omega))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Stella (XS?|Omega)'
+      model: 'Stella $1'
+    - regex: 'GTouch[_ ]STELLA'
+      model: 'Stella'
 
 # T-Mobile
 T-Mobile:
-  regex: 'T-Mobile[ _][a-z0-9 ]+|REVVLRY|REVVL 2( PLUS)?(?:[);/ ]|$)'
+  regex: 'T-Mobile[ _][a-z0-9 ]+|(?:REVVLRY\+?|REVVL V\+ 5G|REVVL 2(?: PLUS)?|5062[ZW]|5007[ZW]|T790[WZ]|Telekom Puls|TMRVL4G)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'TMRVL4G'
+      model: 'REVVL V'
+    - regex: '5062[ZW]'
+      model: 'REVVL 4 Plus'
+    - regex: '5007[ZW]'
+      model: 'REVVL 4'
+    - regex: 'T790[WZ]'
+      model: 'REVVL 5G'
     - regex: 'REVVL 2 PLUS'
       model: 'REVVL 2 Plus'
+    - regex: 'REVVL V\+ 5G'
+      model: 'REVVL V+ 5G'
     - regex: 'REVVLRY'
       model: 'REVVL Plus'
     - regex: 'REVVL 2(?:[);/ ]|$)'
       model: 'REVVL 2'
+    - regex: 'Telekom Puls(?:[);/ ]|$)'
+      model: 'Telekom Puls'
     - regex: 'T-Mobile[ _]([a-z0-9_ ]+) Build'
       model: '$1'
     - regex: 'T-Mobile[ _]([a-z0-9_ ]+)'
@@ -12905,49 +18723,46 @@ T-Mobile:
     - regex: 'Ignis ([89])'
       model: 'Ignis $1'
 
-# Tcl
-TCL:
-  regex: 'TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D)(?:[);/ ]|$)'
-  device: 'smartphone'
-  models:
-    - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
-      model: 'Gala G60'
-    - regex: '5199I(?:[);/ ]|$)'
-      model: 'C9'
-    - regex: '5152D(?:[);/ ]|$)'
-      model: 'C5'
-    - regex: '5133A(?:[);/ ]|$)'
-      model: 'L5'
-    - regex: 'T780H(?:[);/ ]|$)'
-      model: 'Plex'
-    - regex: 'TCL[_ -]([^;/]+) Build'
-      model: '$1'
-    - regex: 'TCL[_ -]([a-z0-9]+)'
-      model: '$1'
-    - regex: '(7040N)(?:[);/ ]|$)'
-      model: '$1'
-    - regex: 'A502DL(?:[);/ ]|$)'
-      model: 'LX'
-    - regex: '5159[AJ](?:[);/ ]|$)'
-      model: 'L9'
-
-# Teclast
+# Teclast (teclast.com)
 Teclast:
-  regex: 'Teclast|X98 Air III|X98 Air II\(HG5N\)|Tbook|X80 Power\(B2N4\)|(?:T30|P80X|P20HD)_(?:ROW|EEA)|T10\(E3C6\)|P10S\(N4H5\)|98\(M1E[45789]\)|98\(M3E3\)'
+  regex: 'Teclast|P80_G3M2|TLA002|TLA016|X98 Air III|M20_4G|X98 Air II\(HG5N\)|Tbook|X80 Power\(B2N4\)|(?:T40 Plus|T30|P80[XH]|P20HD|P10[_ ]HD|M40|P10S|M30_Pro|M40SE|P80)_(?:ROW|EEA|RUS)|T40 Plus\(M7T3\)|T40 PRO\(T1A1\)|T10\(E3C[56]\)|P10S\(N4H5\)|98\(M1E[45789]\)|98\(M3E3\)|X10 \(M1D3\)|M89 Pro|M40\(N9H3\)|M40(?:SE|Pro)_(?:ROW|EEA|RUS)'
+
   device: 'tablet'
   models:
     - regex: 'Tbook[_ -]([^;/]+) Build'
       model: 'Tbook $1'
-    - regex: 'T10\(E3C6\)'
+    - regex: 'T10\(E3C[56]\)'
       model: 'T10'
-    - regex: 'T30_(ROW|EEA)'
-      model: 'T30 $1'
-    - regex: 'P80X_(ROW|EEA)'
-      model: 'P80X $1'
-    - regex: 'P10S\(N4H5\)'
+    - regex: 'X10 \(M1D3\)'
+      model: 'X10'
+    - regex: 'P10S(?:\(N4H5\)|_(?:ROW|EEA))(?:[);/ ]|$)'
       model: 'P10S'
-    - regex: 'P20HD_(?:ROW|EEA)'
+    - regex: 'P20HD_(?:ROW|EEA|RUS)'
       model: 'P20HD'
+    - regex: 'P10[_ ]HD_(?:ROW|EEA)'
+      model: 'P10HD'
+    - regex: 'P80[_ ](?:ROW|EEA)|P80_G3M2'
+      model: 'P80'
+    - regex: 'M([43]0)_?Pro[_ ](?:ROW|EEA|RUS)'
+      model: 'M$1 Pro'
+    - regex: 'M20_4G'
+      model: 'M20 4G'
+    - regex: 'M89 Pro'
+      model: 'M89 Pro'
+    - regex: 'TLA002'
+      model: 'M30 4G'
+    - regex: 'TLA016'
+      model: 'M16'
+    - regex: 'M40\(N9H3\)'
+      model: 'M40'
+    - regex: 'M40SE'
+      model: 'M40 SE'
+    - regex: 'T40 PRO\(T1A1\)'
+      model: 'T40 Pro'
+    - regex: 'T40 Plus(?:_(?:ROW|EEA)|\(M7T3\))'
+      model: 'T40 Plus'
+    - regex: '(P80[Xh]|T30|M40)[_ ](?:ROW|EEA)'
+      model: '$1'
     - regex: '98\(M1E[45789]\)|98\(M3E3\)'
       model: 'TPad 98 10.1" 4G'
     - regex: 'X80 Power\(B2N4\)(?:[);/ ]|$)'
@@ -12968,64 +18783,314 @@ Tecno Mobile:
       model: 'Phantom 6 Plus'
     - regex: 'Phantom6'
       model: 'Phantom 6'
+    - regex: 'TECNO[ _]AC8(?:[);/ ]|$)'
+      model: 'Phantom X'
+    - regex: 'TECNO[ _]AB7(?:[);/ ]|$)'
+      model: 'Phantom 9'
+    - regex: 'TECNO[ _]AX8(?:[);/ ]|$)'
+      model: 'Phantom 8'
     - regex: 'TECNO-W3'
       model: 'W3'
     - regex: 'TECNO[ _]F4 Pro(?:[);/ ]|$)'
       model: 'F4 Pro'
+    - regex: 'TECNO[ _]IN5(?:[);/ ]|$)'
+      model: 'Camon i'
+    - regex: 'TECNO[ _]ID5b(?:[);/ ]|$)'
+      model: 'Camon i2X'
     - regex: 'TECNO[ _]ID6(?:[);/ ]|$)'
       model: 'Camon iClick 2'
+    - regex: 'TECNO[ _]IN2(?:[);/ ]|$)'
+      model: 'Camon iSky'
+    - regex: 'TECNO[ _]KB3(?:[);/ ]|$)'
+      model: 'Camon iSky 3'
     - regex: 'Tecno[ _]7C(?:[);/ ]|$)'
       model: 'DroidPad 7C'
       device: 'tablet'
+    - regex: 'Tecno[ _]P701(?:[);/ ]|$)'
+      model: 'DroidPad 7D'
+      device: 'tablet'
     - regex: 'DP7C Pro-SGA1(?:[);/ ]|$)'
       model: 'DroidPad 7C Pro'
       device: 'tablet'
+    - regex: 'Tecno[ _]P703(?:[);/ ]|$)'
+      model: 'DroidPad 7F'
+      device: 'tablet'
+    - regex: 'Tecno[ _]P704a(?:[);/ ]|$)'
+      model: 'DroidPad 7G'
+      device: 'tablet'
     - regex: 'TECNO[ _]DP10A Pro(?:[);/ ]|$)'
       model: 'DroidPad 10A Pro'
       device: 'tablet'
     - regex: 'TECNO[ _]P904(?:[);/ ]|$)'
       model: 'DroidPad 10D 4G'
       device: 'tablet'
+    - regex: 'Tecno[ _]RC6(?:[);/ ]|$)'
+      model: 'R7+'
     - regex: 'Tecno[ _]CB7[j]?'
       model: 'Camon i4'
+    - regex: 'Tecno[- _]C9(?:[);/ ]|$)'
+      model: 'Camon C9'
+    - regex: 'Tecno[ _]CF7k?(?:[);/ ]|$)'
+      model: 'Camon 11'
+    - regex: 'Tecno[ _]CF8(?:[);/ ]|$)'
+      model: 'Camon 11 Pro'
+    - regex: 'Tecno[ _]CC7S?(?:[);/ ]|$)'
+      model: 'Camon 12'
+    - regex: 'Tecno[ _]CC9(?:[);/ ]|$)'
+      model: 'Camon 12 Pro'
+    - regex: 'Tecno[ _](?:CC6|KC3)(?:[);/ ]|$)'
+      model: 'Camon 12 Air'
+    - regex: 'Tecno[ _-]CD7(?:[);/ ]|$)'
+      model: 'Camon 15'
+    - regex: 'Tecno[ _-]CD6S?(?:[);/ ]|$)'
+      model: 'Camon 15 Air'
+    - regex: 'Tecno[ _-]CD8j(?:[);/ ]|$)'
+      model: 'Camon 15 Premier'
+    - regex: 'Tecno[ _-]CD8(?:[);/ ]|$)'
+      model: 'Camon 15 Pro'
+    - regex: 'Tecno[ _-](?:CE9h|CE7)(?:[);/ ]|$)'
+      model: 'Camon 16'
+    - regex: 'Tecno[ _-]CE9(?:[);/ ]|$)'
+      model: 'Camon 16 Premier'
+    - regex: 'Tecno[ _-]CE8(?:[);/ ]|$)'
+      model: 'Camon 16 Pro'
+    - regex: 'Tecno[ _-]CD6j(?:[);/ ]|$)'
+      model: 'Camon 16 S'
+    - regex: 'Tecno[ _-]CE7j(?:[);/ ]|$)'
+      model: 'Camon 16 SE'
+    - regex: 'Tecno[ _-]CG6j?(?:[);/ ]|$)'
+      model: 'Camon 17'
+    - regex: 'Tecno[ _-]CG8(?:[);/ ]|$)'
+      model: 'Camon 17 Pro'
+    - regex: 'Tecno[ _-]CG7n?(?:[);/ ]|$)'
+      model: 'Camon 17P'
+    - regex: 'Tecno[ _-]CH9n?(?:[);/ ]|$)'
+      model: 'Camon 18 Premier'
+    - regex: 'Tecno[ _-]CH6n?(?:[);/ ]|$)'
+      model: 'Camon 18'
+    - regex: 'Tecno[ _-]CH7n?(?:[);/ ]|$)'
+      model: 'Camon 18P'
+    - regex: 'Tecno[ _-]CA6(?:[);/ ]|$)'
+      model: 'Camon CM'
+    - regex: 'Tecno[ _-]CA7(?:[);/ ]|$)'
+      model: 'Camon X'
+    - regex: 'Tecno[ _-]CA8(?:[);/ ]|$)'
+      model: 'Camon X Pro'
+    - regex: 'Tecno[ _-]Camon CX(?:[);/ ]|$)'
+      model: 'Camon CX'
+    - regex: 'Tecno[ _-]CX Air(?:[);/ ]|$)'
+      model: 'Camon CX Air'
+    - regex: 'TECNO[ _]F3(?:[);/ ]|$)'
+      model: 'Pop 1'
+    - regex: 'TECNO[ _]B1(?:[);/ ]|$)'
+      model: 'Pop 2'
+    - regex: 'TECNO[ _]SA2S(?:[);/ ]|$)'
+      model: 'Pop 2 Mini'
+    - regex: 'TECNO[ _]B1[fg](?:[);/ ]|$)'
+      model: 'Pop 2F'
+    - regex: 'TECNO[ _](?:RA8|KB2h)(?:[);/ ]|$)'
+      model: 'Pop 2S'
+    - regex: 'TECNO[ _]KB2j(?:[);/ ]|$)'
+      model: 'Pop 2S Pro'
+    - regex: 'TECNO[ _]BA2(?:[);/ ]|$)'
+      model: 'Pop 2 Plus'
+    - regex: 'TECNO[ _]B1p(?:[);/ ]|$)'
+      model: 'Pop 2 Power'
+    - regex: 'TECNO[ _]RB8S(?:[);/ ]|$)'
+      model: 'Pop 2X Plus'
+    - regex: 'TECNO[ _]RB6S(?:[);/ ]|$)'
+      model: 'Pop 2X Air'
+    - regex: 'TECNO[ _]RB7S(?:[);/ ]|$)'
+      model: 'Pop 2X'
+    - regex: 'TECNO[ _]SC7S(?:[);/ ]|$)'
+      model: 'Pop 2 Air'
+    - regex: 'TECNO[ _]BB2(?:[);/ ]|$)'
+      model: 'Pop 3'
+    - regex: 'TECNO[ _]BB4(?:[);/ ]|$)'
+      model: 'Pop 3 Plus'
+    - regex: 'TECNO[ _]BC2c?(?:[);/ ]|$)'
+      model: 'Pop 4'
+    - regex: 'TECNO[ _]BC3?(?:[);/ ]|$)'
+      model: 'Pop 4 Pro'
+    - regex: 'TECNO[ _]BC1(?:[);/ ]|$)'
+      model: 'Pop 4 Air'
+    - regex: 'TECNO[ _]BC1s(?:[);/ ]|$)'
+      model: 'Pop 4 LTE'
+    - regex: 'TECNO[ _]BD2[dp]?(?:[);/ ]|$)'
+      model: 'Pop 5'
+    - regex: 'TECNO[ _]BD1(?:[);/ ]|$)'
+      model: 'Pop 5 Go'
+    - regex: 'TECNO[ _]BD4(?:[);/ ]|$)'
+      model: 'Pop 5 LTE'
+    - regex: 'TECNO[ _]BD4j(?:[);/ ]|$)'
+      model: 'Pop 5 Pro'
+    - regex: 'TECNO[ _]BD3(?:[);/ ]|$)'
+      model: 'Pop 5P'
+    - regex: 'Tecno[ _]SA1S Pro(?:[);/ ]|$)'
+      model: 'SA1s Pro'
+    - regex: 'Tecno[ _]KG5(?:[);/ ]|$)'
+      model: 'Spark Go (2022)'
+    - regex: 'Tecno[ _]KA7O?(?:[);/ ]|$)'
+      model: 'Spark 2'
+    - regex: 'Tecno[ _]LB6?(?:[);/ ]|$)'
+      model: 'Spark 2 Youth'
+    - regex: 'Tecno[ _]KB7j?(?:[);/ ]|$)'
+      model: 'Spark 3'
+    - regex: 'Tecno[ _]KB8?(?:[);/ ]|$)'
+      model: 'Spark 3 Pro'
+    - regex: 'Tecno[ _](?:KC8S?|KC2j?)(?:[);/ ]|$)'
+      model: 'Spark 4'
+    - regex: 'Tecno[ _](?:KC6S?|KC1j)(?:[);/ ]|$)'
+      model: 'Spark 4 Air'
+    - regex: 'Tecno[ _]BB4k(?:[);/ ]|$)'
+      model: 'Spark 4 Lite'
+    - regex: 'Tecno[ _]KD6a?(?:[);/ ]|$)'
+      model: 'Spark 5 Air'
+    - regex: 'Tecno[ _]KD7[hS](?:[);/ ]|$)'
+      model: 'Spark 5'
+    - regex: 'Tecno[ _]KD7(?:[);/ ]|$)'
+      model: 'Spark 5 Pro'
+    - regex: 'TECNO[ _]KE7(?:[);/ ]|$)'
+      model: 'Spark 6'
+    - regex: 'TECNO[ _]KE6j?(?:[);/ ]|$)'
+      model: 'Spark 6 Air'
+    - regex: 'TECNO[ _]KE5[jk]?(?:[);/ ]|$)'
+      model: 'Spark 6 Go'
+    - regex: 'TECNO[ _](?:KF6[nmjki]?|PR651[EH]?)(?:[);/ ]|$)'
+      model: 'Spark 7'
+    - regex: 'TECNO[ _]KF8(?:[);/ ]|$)'
+      model: 'Spark 7 Pro'
+    - regex: 'TECNO[ _]KF7j(?:[);/ ]|$)'
+      model: 'Spark 7P'
+    - regex: 'TECNO[ _]KF6p(?:[);/ ]|$)'
+      model: 'Spark 7T'
+    - regex: 'TECNO[ _]KG6k?(?:[);/ ]|$)'
+      model: 'Spark 8'
+    - regex: 'TECNO[ _]KG7n?(?:[);/ ]|$)'
+      model: 'Spark 8P'
+    - regex: 'TECNO[ _]KG6p(?:[);/ ]|$)'
+      model: 'Spark 8T'
+    - regex: 'TECNO[ _]KG8(?:[);/ ]|$)'
+      model: 'Spark 8 Pro'
+    - regex: 'TECNO[ _]KC1h(?:[);/ ]|$)'
+      model: 'Spark Go'
+    - regex: 'TECNO[ _]KC1(?:[);/ ]|$)'
+      model: 'Spark Air'
+    - regex: 'TECNO[ _]K9(?:[);/ ]|$)'
+      model: 'Spark Plus'
+    - regex: 'TECNO[ _]KA6(?:[);/ ]|$)'
+      model: 'Spark Youth'
+    - regex: 'TECNO[ _]KA9(?:[);/ ]|$)'
+      model: 'Spark CM'
     - regex: 'Tecno[ _]DP8D(?:[);/ ]|$)'
       model: 'DroidPad 8D'
       device: 'tablet'
-    - regex: 'Tecno[ _]LB8'
+    - regex: 'TECNO[ _]LA7 Pro(?:[);/ ]|$)'
+      model: 'Pouvoir 2 Pro'
+    - regex: 'TECNO[ _]LA7(?:[);/ ]|$)'
+      model: 'Pouvoir 2'
+    - regex: 'TECNO[ _]LA6(?:[);/ ]|$)'
+      model: 'Pouvoir 1'
+    - regex: 'TECNO[ _]LB7(?:[);/ ]|$)'
+      model: 'Pouvoir 3'
+    - regex: 'TECNO[ _]LC6a?(?:[);/ ]|$)'
+      model: 'Pouvoir 3 Air'
+    - regex: 'Tecno[ _]LB8a?'
       model: 'Pouvoir 3 Plus'
-    - regex: 'Tecno ([^;/]+) Build'
+    - regex: 'TECNO[ _]LC7S?(?:[);/ ]|$)'
+      model: 'Pouvoir 4'
+    - regex: 'TECNO[ _]LC8(?:[);/ ]|$)'
+      model: 'Pouvoir 4 Pro'
+    - regex: 'Tecno[ _-]J8(?:[);/ ]|$)'
+      model: 'Boom J8'
+    - regex: 'Tecno[ _-]RA7(?:[);/ ]|$)'
+      model: 'R7 4G'
+    - regex: 'Tecno[ _-]W3 Pro(?:[);/ ]|$)'
+      model: 'W3 Pro'
+    - regex: 'Tecno[ _-]WX3P(?:[);/ ]|$)'
+      model: 'WX3 Pro'
+    - regex: 'TECNO S9'
+      device: 'phablet'
+      model: 'S9'
+    - regex: 'TECNO[ _]LD7j?(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Pova'
+    - regex: 'TECNO[ _]LE6(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Pova Neo'
+    - regex: 'TECNO[ _]LE7n?(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Pova 2'
+    - regex: 'Tecno (F2) ?LTE'
+      model: '$1 LTE'
+
+    - regex: 'TECNO[ _-]?(T611)(?:[);/ ]|$)'
+      device: 'feature phone'
+      model: '$1'
+
+    - regex: 'Tecno[ _]([^;/]+)(?: Build|[);])'
       model: '$1'
-    - regex: 'Tecno[ _]?([a-z0-9_\-]+)'
+    - regex: 'Tecno[ _-]?([a-z0-9_\-]+)'
       model: '$1'
 
-# TechPad
+# TechPad (techpad.mx)
 TechPad:
-  regex: 'Tech ?pad|XTAB[ _-]|Dual C1081HD|S813G'
+  regex: 'Tech[ _]?pad|XTAB[ _-]|(?:3G_16|Dual C1081HD|S813G|NOTE[_ ]4CAM|M5(?:Go|Plus))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'S813G'
       model: 'S813G'
+    - regex: 'TechPad10QC'
+      model: '10QC'
+    - regex: 'TechPad_10xx'
+      model: '10XX'
+    - regex: 'TechPad703'
+      model: '703'
+    - regex: 'TechPad[_ ](10Y|9x|i700)'
+      model: '$1'
+    - regex: 'TechPad[_ ]3Gx'
+      model: '3Gx'
+    - regex: '3G_16'
+      model: '3G-16'
     - regex: 'Dual C1081HD'
       model: 'XTAB C1081HD'
     - regex: 'XTAB[ _-]([^/;]+) Build'
       model: 'XTAB $1'
-    - regex: 'Tech ?pad[ _-]([^/;]+) Build'
+    # explicit smartphone models
+    - regex: 'M5(Go|Plus)'
+      device: 'smartphone'
+      model: 'M5 $1'
+    - regex: 'NOTE[ _]4CAM'
+      device: 'smartphone'
+      model: 'Note 4 Cam'
+    # explicit feature phone models
+    - regex: 'Tech_Pad_Kaios_One_3G'
+      device: 'feature phone'
+      model: 'Kaios One 3G'
+
+    - regex: 'Tech ?pad[ _-]([^/;)]+)(?: Build|[;)])'
       model: '$1'
       device: 'smartphone'
 
+# Techwood
+Techwood:
+  regex: 'Techwood'
+  device: 'tv'
+  model: ''
+
 # Tesco
 Tesco:
-  regex: 'Hudl ([^/;]+) Build|W032i-C3(?:[);/ ]|$)'
+  regex: 'Hudl (?:[^/;]+)(?: Build|[;)])|W032i-C3(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'Hudl ([^/;]+) Build'
+    - regex: 'Hudl ([^/;]+)(?: Build|[;)])'
       model: 'Hudl $1'
     - regex: 'W032i-C3(?:[);/ ]|$)'
       model: 'Op3n Dott'
 
-# teXet
+# teXet (www.texet.ru)
 teXet:
-  regex: 'Texet|(NaviPad [^/;]*) Build|TM-(?:1046|1058|1057|1067|3000|3200R|3500|4003|4071|450[34]|451[30]|4377|4082R|550[83]|5010|5017|507[4-7]|5[23]77|6003|6906|702[13]|7055HD|709[69]|9747BT|9758|9751HD|9767|5513|520[410]|5505|507[13]|5581|7859|8044|9748[ _]3G|9720|7047HD[ _]3G|9757|9740|4982|4515|4083|500[3567]|5571|3204R|5016|8043|7047HD[ _]3G|8041HD|8066|705[23]|7041|8041HD|8051|8048|974[96]|973[78]W|974[170]|9743W|9750HD|7043XD|7049|7887|7037W|702[46])|TB-(771A|711A)|X-Force[\(-]?TM-5009\)?|X-Plus[\(-]?TM-5577\)?|TM_5011|X-pad (?:AIR 8|iX 7|NAVI 7.[35]|NAVI 10|SKY 8.1|STYLE 8|STYLE 10.1|HIT|LITE 7.[12]|QUAD (?:7.2|10|7)|SHINE 8.1)(?: 3G)?'
+  regex: 'Texet|(NaviPad [^/;]*) Build|TM-(?:1046|1058|1057|1067|3000|3200R|3500|400[34]|4071|450[34]|451[30]|4377|4082R|508[34]|550[358]|5010|5017|507[4-7]|5[23]77|6003|6906|702[13]|7055HD|709[69]|9747BT|9758|9751HD|9767|5513|520[410]|507[13]|558[134]|570[23]|7859|8044|9748[ _]3G|9720|7047HD[ _]3G|9757|9740|4982|4515|4083|500[3567]|5571|3204R|5016|8043|7047HD[ _]3G|8041HD|8066|705[23]|7041|8041HD|8051|8048|974[96]|973[78]W|974[170]|9743W|9750HD|7043XD|7049|7887|7037W|702[46])|TB-(771A|711A)|X-Force[\(-]?TM-5009\)?|X-Plus[\(-]?TM-5577\)?|TM_5011|X-pad (?:AIR 8|iX 7|NAVI 7.[35]|NAVI 10|SKY 8.1|STYLE 8|STYLE 10.1|HIT|LITE 7.[12]|QUAD (?:7.2|10|7)|SHINE 8.1)(?: 3G)?'
   device: 'tablet'
   models:
     - regex: 'TM-9749'
@@ -13087,7 +19152,7 @@ teXet:
     - regex: 'TM-4503'
       device: 'smartphone'
       model: 'X-Quad'
-    - regex: '(TM-(?:3000|3200R|4003|4083|4377|4504|451[30]|500[35]|5[23]77|5571|3204R|520[04]|5581|5505|507[13]|5017|507[4-7]|6003|5513))'
+    - regex: '(TM-(?:3000|3200R|400[34]|4083|4377|4504|451[30]|500[35]|5[23]77|5571|3204R|520[04]|5581|5505|5017|507[13-7]|5081|6003|5513))'
       device: 'smartphone'
       model: '$1'
     - regex: 'TM-5006'
@@ -13099,6 +19164,18 @@ teXet:
     - regex: 'TM_5011'
       device: 'smartphone'
       model: 'X-Omega'
+    - regex: 'TM-508(3|4)'
+      device: 'smartphone'
+      model: 'Pay $1G'
+    - regex: 'TM-558(3|4)'
+      device: 'smartphone'
+      model: 'Pay 5.5" $1G'
+    - regex: 'TM-5702'
+      device: 'smartphone'
+      model: 'Pay 5.7" 3G'
+    - regex: 'TM-5703'
+      device: 'smartphone'
+      model: 'Pay 5.7" Pro'
     - regex: 'TM-5201'
       device: 'smartphone'
       model: 'Rock'
@@ -13114,6 +19191,9 @@ teXet:
     - regex: 'TM-4982'
       device: 'smartphone'
       model: 'iX-Maxi'
+    - regex: 'TEXET[_ ]IX-MINI'
+      device: 'smartphone'
+      model: 'iX-Mini'
     - regex: 'TM-5010'
       device: 'smartphone'
       model: 'X-Selfie'
@@ -13132,22 +19212,39 @@ teXet:
     - regex: 'X-Plus[\(-]?TM-5577\)?'
       device: 'smartphone'
       model: 'X-Plus'
+    - regex: 'teXet[_ ]X-medium[_ ]plus'
+      device: 'smartphone'
+      model: 'X-Medium Plus'
 
 # Telefunken
 Telefunken:
-  regex: 'TELEFUNKEN|Foxtrot|TEL-1013GIQA|TF-SP5001|(TF-MID(?:[78]02G|9705RG|7805G|1010G))|(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S70T2S))'
+  regex: 'TELEFUNKEN|Foxtrot|TEL-1013GIQA|TEL-1014GIQ|TEL-73GIQA|TEL-74GIQ|TF-SP(?:500[12]|4002)|(TF-MID(?:[78]02G|70[78]G|80[46]G|9705RG|9707G|7805G|100[57]G|1010G))|(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S7[05]T2S|40S63T2S|40S19T2S))|LTE_LIMA|LTE Mike|Outdoor (?:LTE|WT4|WT4-S)'
   device: 'tablet'
   models:
     - regex: 'TEL-1013GIQA'
       model: 'Giqa 10.1 3G'
-    - regex: '(?:TELEFUNKEN)?(TF-SP5001|Outdoor LTE|Foxtrot)'
+    - regex: 'TEL-(1014GIQ|74GIQ|73GIQA)'
+      model: 'TEL-$1'
+    - regex: 'Foxtrot2'
+      model: 'Foxtrot 2'
+      device: 'smartphone'
+    - regex: 'LTE_LIMA'
+      model: 'Lima LTE'
+      device: 'smartphone'
+    - regex: 'LTE Mike'
+      model: 'Mike LTE'
+      device: 'smartphone'
+    - regex: '(?:TELEFUNKEN)?(TF-SP(?:500[12]|4002)|Outdoor (?:LTE|WT4-S|WT4)|Foxtrot)'
       model: '$1'
       device: 'smartphone'
-    - regex: '(TF-MID(?:[78]02G|9705RG|7805G|1010G))'
+    - regex: '(TF-MID(?:[78]02G|70[78]G|80[46]G|9705RG|9707G|7805G|100[57]G|1010G))'
       model: '$1'
-    - regex: '(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S70T2S))'
+    - regex: '(TF-LED(?:65S75T2SU|32S39T2S|32S5[289]T2S|32S7[05]T2S|40S63T2S|40S19T2S))'
       model: '$1'
       device: 'tv'
+    - regex: 'TELEFUNKEN, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+      device: 'tv'
 
 # Telego
 Telego:
@@ -13163,13 +19260,13 @@ Telego:
 
 # Telenor
 Telenor:
-  regex: '(?<!FBCR/)Telenor'
+  regex: '(?<!FBCR/)Telenor|(?:Infinity[_ ](?:E[2-5]|K2?|A2))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Telenor[ _]([^;/]+) Build'
-      model: '$1'
-    - regex: 'Telenor[ _]([^a-z0-9_]+)\)'
+    - regex: 'Telenor[ _]([^;/]+)(?: Build|[;)])'
       model: '$1'
+    - regex: 'Infinity[ _](E[2-5]|K2?|A2)'
+      model: 'Infinity $1'
 
 # Telit
 Telit:
@@ -13181,13 +19278,25 @@ Telit:
     - regex: 'Telit[\-_]?([a-z0-9]+)'
       model: '$1'
 
+# Telpo ((https://www.telpo.com.cn/))
+Telpo:
+  regex: 'TPS320'
+  device: 'peripheral'
+  models:
+    - regex: 'TPS320'
+      model: 'TPS320'
+
 # ThL
 ThL:
-  regex: 'ThL[ _-]|Knight 2'
+  regex: 'ThL[ _-]|(?:Knight 2|THL5000|T200)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Knight 2'
       model: 'Knight 2'
+    - regex: 'THL ?(5000)'
+      model: '$1'
+    - regex: '(T200)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'ThL[ _-]*([^;/]+) Build'
       model: '$1'
     - regex: 'ThL[ _-]*([^ ;/)]+)(?:[);/ ]|$)'
@@ -13205,7 +19314,7 @@ TIANYU:
 
 # Timovi
 Timovi:
-  regex: 'Tmovi|Infinit_Lite_2'
+  regex: 'Tmovi[ _]|(?:Infinit[ _](?:Lite[_ ]2|X[_ ]CAM)|Infinit MX(?: Pro)?|Vision_PRO|VISION ULTRA|Epix|Yeah_Go)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Tmovi[ _]Prime'
@@ -13214,10 +19323,22 @@ Timovi:
       model: 'Yeah Beat'
     - regex: 'YeahLIVE'
       model: 'Yeah LIVE'
-    - regex: 'Infinit Lite'
-      model: 'Infinit Lite'
-    - regex: 'Infinit_Lite_2'
-      model: 'Infinit Lite 2'
+    - regex: 'Infinit[_ ]X[_ ]CAM'
+      model: 'Infinit X Cam'
+    - regex: 'Infinit MX Pro'
+      model: 'Infinit MX Pro'
+    - regex: 'Infinit MX'
+      model: 'Infinit MX'
+    - regex: 'Infinit[_ ]Lite([_ ]2)?'
+      model: 'Infinit Lite$1'
+    - regex: 'Vision_PRO'
+      model: 'Vision Pro'
+    - regex: 'VISION ULTRA'
+      model: 'Vision Ultra'
+    - regex: 'Epix'
+      model: 'Epix'
+    - regex: 'Yeah_Go'
+      model: 'Yeah Go'
 
 # Tooky
 Tooky:
@@ -13251,32 +19372,43 @@ Top House:
     - regex: 'COTO_T40017'
       model: 'T40017'
 
+# Topelotek
+Topelotek:
+  regex: 'KIDS09'
+  device: 'tablet'
+  model: 'KIDS09 Kids Tablet'
+
 # Toplux
 Toplux:
   regex: 'Toplux ([a-z0-9]+)'
   device: 'feature phone'
   model: '$1'
 
-# Touchmate
+# Touchmate (touchmate.net)
 Touchmate:
-  regex: 'TOUCHMATE|(TM-(?:MID1020A|MID710|MID798|MID792|MID788D|SM500N|SM410))'
+  regex: 'TOUCHMATE|(TM-(?:MID1050WKD|MID1020A|MID794C|MID795|MID710|MID798|MID792|MID788D|SM500N|SM410|MID1010))'
   device: 'smartphone'
   models:
-    - regex: '(TM-(?:MID1020A|MID710|MID798|MID792|MID788D))'
+    - regex: '(TM-(?:MID1020A|MID794C|MID795|MID710|MID798|MID792|MID788D|MID1010))'
       device: 'tablet'
       model: '$1'
+    - regex: 'TM-MID1050WKD'
+      device: 'tablet'
+      model: 'Mega Matrix 10.1" 3G'
     - regex: '(TM-(?:SM500N|SM410))'
-      model:  '$1'
+      model: '$1'
     - regex: 'Touchmate ([^/;]+) Build'
-      model:  '$1'
+      model: '$1'
 
-# TrekStor
+# TrekStor (www.trekstor.de)
 TrekStor:
-  regex: '(?:TrekStor|Surftab) ([^/;]+)(?: Build|\))|Surftab[^;\)]*(?:[;\)]|$)|ST10216-2A|VT10416-[12]|TFMTKAW01232'
+  regex: '(?:TrekStor|Surftab) ([^/;]+)(?: Build|\))|Surftab[^;\)]*(?:[;\)]|$)|ST10216-2A|ST13416-1|VT10416-[12]|TFMTKAW01232|PEAQ PET 100|Xintroni10.1'
   device: 'tablet'
   models:
     - regex: 'ST10216-2A|VT10416-[12]'
       model: 'SurfTab 10.1'
+    - regex: 'ST13416-1'
+      model: 'SurfTab Theatre 13.4"'
     - regex: 'PrimeTab P10'
       model: 'PrimeTab P10'
     - regex: 'TrekStor ([^/;]+) Build'
@@ -13287,6 +19419,10 @@ TrekStor:
       model: 'SurfTab $1'
     - regex: 'TFMTKAW01232'
       model: 'SurfTab L15'
+    - regex: 'Xintroni10.1'
+      model: 'SurfTab Xintron I 10.1"'
+    - regex: '(PEAQ PET 100)'
+      model: '$1'
 
 # Trevi
 Trevi:
@@ -13374,20 +19510,19 @@ Unowhy:
   device: 'tablet'
   model: 'QOOQ'
 
-
 # UTStarcom
 UTStarcom:
   regex: 'utstar[ _-]?([a-z0-9]+)'
   device: 'feature phone'
   model: '$1'
 
-# Ulefone
+# Ulefone (ulefone.com or ulefone.ru)
 Ulefone:
-  regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|X[236]|6[SE]|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)(?:[);/ ]|$)'
+  regex: 'Ulefone|Gemini Pro|Power_[356]|Power_5S|S(?:10|9)_Pro|(?:Note [89]P|Armor(?:[ _](?:[2367]|2S|X[236]|6[SE]|3WT|3W|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?|Note (?:11P|7T)|Paris_X|P6000_Plus)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'S10_Pro'
-      model: 'S10 Pro'
+    - regex: 'S(10|9)_Pro'
+      model: 'S$1 Pro'
     - regex: 'Be[ _]Touch([ _][23])?'
       model: 'Be Touch$1'
     - regex: 'Be[ _]Pure[ _]Lite'
@@ -13400,36 +19535,52 @@ Ulefone:
       model: 'Be One'
     - regex: 'Be[ _]X'
       model: 'Be X'
-    - regex: 'U007 Pro'
-      model: 'U007 Pro'
-    - regex: 'U008 Pro'
-      model: 'U008 Pro'
-    - regex: 'Armor[ _]2(?:[);/ ]|$)'
-      model: 'Armor 2'
-    - regex: 'Armor[ _]3(?:[);/ ]|$)'
-      model: 'Armor 3'
-    - regex: 'Armor[ _]7(?:[);/ ]|$)'
-      model: 'Armor 7'
-    - regex: 'Armor[ _]X([236])(?:[);/ ]|$)'
-      model: 'Armor X$1'
+    - regex: 'U(00[78]) Pro'
+      model: 'U$1 Pro'
+    - regex: 'P6000_Plus'
+      model: 'P6000 Plus'
+    - regex: 'Paris_X'
+      model: 'Paris X'
+    - regex: 'Power Armor (\d+)(?:[);/ ]|$)'
+      model: 'Power Armor $1'
     - regex: 'Armor[ _]6S(?:[);/ ]|$)'
       model: 'Armor 6S'
-    - regex: 'Armor[ _]6E(?:[);/ ]|$)'
-      model: 'Armor 6E'
-    - regex: 'Armor[ _]6(?:[);/ ]|$)'
-      model: 'Armor 6'
-    - regex: 'Armor[ _]X5(?:[);/ ]|$)'
-      model: 'Armor X5'
-    - regex: 'Armor[ _]5S(?:[);/ ]|$)'
-      model: 'Armor 5S'
+    - regex: 'Armor[ _]([679])E(?:[);/ ]|$)'
+      model: 'Armor $1E'
+    - regex: 'Armor[ _]X(\d+) Pro(?:[);/ ]|$)'
+      model: 'Armor X$1 Pro'
+    - regex: 'Armor[ _]X(\d+)(?:[);/ ]|$)'
+      model: 'Armor X$1'
+    - regex: 'Armor[ _]([25])S(?:[);/ ]|$)'
+      model: 'Armor $1S'
     - regex: 'Armor[ _]X(?:[);/ ]|$)'
       model: 'Armor X'
+    - regex: 'Armor[ _]3W(?:[);/ ]|$)'
+      model: 'Armor 3W'
+    - regex: 'Armor[ _]3WT(?:[);/ ]|$)'
+      model: 'Armor 3WT'
+    - regex: 'Armor[ _](1\d|11T) 5G(?:[);/ ]|$)'
+      model: 'Armor $1 5G'
+    - regex: 'Armor[ _](8) Pro(?:[);/ ]|$)'
+      model: 'Armor $1 Pro'
+    - regex: 'Armor[ _]([236789])(?:[);/ ]|$)'
+      model: 'Armor $1'
     - regex: 'Armor(?:[);/ ]|$)'
       model: 'Armor'
     - regex: 'Gemini Pro(?:[);/ ]|$)'
       model: 'Gemini Pro'
-    - regex: 'Power_([356])'
+    - regex: 'Power[_ ]([356][SL]?)'
       model: 'Power $1'
+    - regex: 'Note 8P(?:[);/ ]|$)'
+      model: 'Note 8P'
+    - regex: 'Note 7T(?:[);/ ]|$)'
+      model: 'Note 7T'
+    - regex: 'Note (9|11)P(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Note $1P'
+    - regex: 'Ulefone[_ ]Tab[_ ]([^;/)]+)(?: Build|[);])'
+      device: 'tablet'
+      model: 'Tab $1'
     - regex: 'Ulefone[_ ](X|S1[ _]Pro|S[17])(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Ulefone[ _-]?([^;/]+) Build'
@@ -13437,20 +19588,54 @@ Ulefone:
     - regex: 'Ulefone[ _-]?([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
-# UMIDIGI
+# UMIDIGI or UMI
 UMIDIGI:
-  regex: 'UMI(?:DIGI)?[ _]|A5_Pro'
+  regex: 'UMI(?:DIGI)?[ _]|(?:A[5]_Pro|.+; A[79] Pro|S3_Pro|ROME[_ ]X|BISON|hammer_S|S2 LITE|London|Z2_PRO|C NOTE 2|A11 Pro Max|Power 3|Android 10.+ (?:A3[SX]|A7S(?! 2020))|RP01|MT01|MP0[12])(?:[;/) ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'A5_Pro'
-      model: 'A5 Pro'
+    - regex: 'MT01(?:[;/) ]|$)'
+      device: 'tablet'
+      model: 'A11 Tab'
+
+    - regex: '(A[3579]|Z2|S3)[_ ]Pro'
+      model: '$1 Pro'
+    - regex: 'A11 Pro Max'
+      model: 'A11 Pro Max'
+    - regex: 'MP01(?:[;/) ]|$)'
+      model: 'A11S'
     - regex: 'UMI TOUCH X'
       model: 'Touch X'
     - regex: 'UMI TOUCH'
       model: 'Touch'
-    - regex: 'UMI_(London|Diamond(?:_X)?)'
-      model: '$1'
-    - regex: 'UMI(?:DIGI)?[ _]([^/;)]+)(?: Build|\))'
+    - regex: 'ROME[_ ]X'
+      model: 'Rome X'
+    - regex: 'BISON GT'
+      model: 'Bison GT'
+    - regex: 'Bison N1'
+      model: 'Bison N1'
+    - regex: 'RP01(?:[;/) ]|$)'
+      model: 'Bison X10'
+    - regex: 'BISON Pro'
+      model: 'Bison Pro'
+    - regex: 'BISON'
+      model: 'Bison'
+    - regex: 'hammer_S'
+      model: 'Hammer S'
+    - regex: 'C NOTE 2'
+      model: 'C Note 2'
+    - regex: 'UMI[_ ]SUPER'
+      model: 'Super'
+    - regex: 'S2 LITE'
+      model: 'S2 Lite'
+    - regex: 'Power 3'
+      model: 'Power 3'
+    - regex: 'MP02(?:[;/) ]|$)'
+      model: 'Power 5S'
+    - regex: ' (A3[SX]|A7S)(?:[;/) ]|$)'
+      model: '$1'
+    - regex: '(?:UMI_)?(London|Diamond(?:_X)?)'
+      model: '$1'
+    - regex: 'UMI(?:DIGI)?[ _]([^/;)]+)(?: Build|[;)])'
       model: '$1'
 
 # Uniscope
@@ -13491,11 +19676,13 @@ Unnecto:
     - regex: 'U905'
       model: 'Air 5.5'
 
-# Unonu
+# Unonu (unonumobile.com)
 Unonu:
-  regex: 'Unonu[ _-]'
+  regex: 'Unonu[ _-]|(?:U4001)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: '(U4001)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'Unonu[ _-]([^;/]+) Build'
       model: '$1'
     - regex: 'Unonu[ _-]?([^;/)]+)(?:[);/ ]|$)'
@@ -13509,13 +19696,17 @@ UTOK:
 
 # Vastking
 Vastking:
-  regex: '(M910A|M783K|M783K-16G|M1072R-3G)(?:[);/ ]|$)'
+  regex: '(?:M910A|M783K|M783K-16G|M1072R-3G|KingPad_(?:K10|SA10)(?:Pro)?)(?:_EEA)?(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'KingPad_(K10|SA10)(Pro)?'
+      model: 'KingPad $1 $2'
+    - regex: '(M910A|M783K|M783K-16G|M1072R-3G)(?:[);/ ]|$)'
+      model: '$1'
 
-# ViewSonic
+# ViewSonic (viewsonic.com)
 ViewSonic:
-  regex: 'ViewSonic|VSD[0-9]+(?:[);/ ]|$)|ViewPad|ViewPhone'
+  regex: 'ViewSonic|ViewPad|ViewPhone|(?:IFP(?:98|86|[67]5)50-3|VSD[0-9]+)(?:[);/ ]|$)'
   device: 'smart display'
   models:
     - regex: '(?:ViewSonic-)?V500(?:[);/ ]|$)'
@@ -13532,6 +19723,8 @@ ViewSonic:
       device: 'tablet'
     - regex: '(VSD[0-9]+)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'IFP(98|86|[67]5)50-3'
+      model: 'ViewBoard IFP$150-3 $1" 4K'
 
 # Vitelcom
 Vitelcom:
@@ -13553,18 +19746,18 @@ Fengxiang:
 
 # VK Mobile
 VK Mobile:
-  regex: 'VK(?!share)[\-]?([a-z0-9 ]+)([;\)/ ]| Build)'
+  regex: 'VK-VK([79]00)(?:[);/ ]|$)'
   device: 'feature phone'
-  model: '$1'
+  model: 'VK$1'
 
 # Vernee
 Vernee:
-  regex: 'Vernee|Mars Pro|Apollo (?:Lite|X)|Thor (?:E|Plus)'
+  regex: 'Vernee|(?:Mars Pro|Apollo[ _](?:Lite|X)|Thor (?:E|Plus)|X2_euro|M7_EEA|T3 Pro|V2 Pro)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Apollo Lite'
+    - regex: 'Apollo[ _]Lite'
       model: 'Apollo Lite'
-    - regex: 'Apollo X'
+    - regex: 'Apollo[ _]X'
       model: 'Apollo X'
     - regex: 'Mars Pro'
       model: 'Mars Pro'
@@ -13574,6 +19767,12 @@ Vernee:
       model: 'Thor Plus'
     - regex: 'Vernee_M5'
       model: 'M5'
+    - regex: 'M7_EEA'
+      model: 'M7'
+    - regex: 'X2_euro'
+      model: 'X2'
+    - regex: '(V2|T3) Pro'
+      model: '$1 Pro'
     - regex: 'Vernee[ _-]([^;/]+) Build'
       model: '$1'
     - regex: 'Vernee[ _-]([a-z0-9_-]+)'
@@ -13595,13 +19794,27 @@ Vertu:
 
 # Venso mobile
 Venso:
-  regex: '(CX-508|CX-551|Reiv 500|Creon F5)(?:[);/ ]|$)'
+  regex: '(?:CX-508|CX-551|Reiv 500|Creon F5|Isprit U50|Isprit-U50-LTE)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'Isprit U50|Isprit-U50-LTE'
+      model: 'Isprit U50'
+    - regex: '(CX-508|CX-551|Reiv 500|Creon F5)'
+      model: '$1'
+
+# Venturer (https://venturer.com/)
+Venturer:
+  regex: 'VCT([a-z0-9_-]+)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'VCT9B06Q22(?:[);/ ]|$)'
+      model: 'Challenger Pro 10.1"'
+    - regex: 'VCT([a-z0-9_-]+)'
+      model: 'VCT$1'
 
 # Verizon
 Verizon:
-  regex: 'QTA(SUN[12]|XIA1|QZ3|QZ3KID|IR7)|QMV7B'
+  regex: 'QTA(SUN[12]|XIA1|QZ3|QZ3KID|IR7)|QMV7[AB]'
   device: 'tablet'
   models:
     - regex: 'QTAXIA1|QTAIR7'
@@ -13614,7 +19827,7 @@ Verizon:
       model: 'Ellipsis Kids LTE'
     - regex: 'QTAQZ3'
       model: 'Ellipsis 8'
-    - regex: 'QMV7B'
+    - regex: 'QMV7[AB]'
       model: 'Ellipsis 7'
 
 # Verykool
@@ -13622,16 +19835,101 @@ Verykool:
   regex: 'verykool'
   device: 'smartphone'
   models:
-    - regex: 'verykoolS5004'
-      model: 'Lotus JR.'
-    - regex: 'verykool[ _]?([^/;]+) Build'
+    - regex: 'verykool[ _]?SL5009'
+      model: 'Jet'
+    - regex: 'verykool[ _]?S5001'
+      model: 'Lotus'
+    - regex: 'verykool[ _]?S5004'
+      model: 'Lotus Jr'
+    - regex: 'verykool[ _]?S5007'
+      model: 'Lotus Plus'
+    - regex: 'verykool[ _]?s5015'
+      model: 'Spark II'
+    - regex: 'verykool[ _]?SL5011'
+      model: 'Spark LTE'
+    - regex: 'verykool[ _]?s5019'
+      model: 'Wave'
+    - regex: 'verykool[ _]?S5005'
+      model: 'Lotus II'
+    - regex: 'verykool[ _]?SL5560'
+      model: 'Maverick Pro'
+    - regex: 'verykool[ _]?SL5200'
+      model: 'Eclipse'
+    - regex: 'verykool[ _]?SL5050'
+      model: 'Phantom'
+    - regex: 'verykool[ _]?S5030'
+      model: 'Helix II'
+    - regex: 'verykool[ _]?s5527'
+      model: 'Alpha Pro'
+    - regex: 'verykool[ _]?s5526'
+      model: 'Alpha'
+    - regex: 'verykool[ _]?S5530'
+      model: 'Maverick II'
+    - regex: 'verykool[ _]?S5525'
+      model: 'Maverick III'
+    - regex: 'verykool[ _]?S5524'
+      model: 'Maverick III Jr'
+    - regex: 'verykool[ _]?s5516'
+      model: 'Maverick Jr'
+    - regex: 'verykool[ _]?SL5550'
+      model: 'Maverick LTE'
+    - regex: 'verykool[ _]?s5035'
+      model: 'Spear'
+    - regex: 'verykool[ _]?s5034'
+      model: 'Spear Jr'
+    - regex: 'verykool[ _]?s5037'
+      model: 'Apollo Quattro'
+    - regex: 'verykool[ _]?s5036'
+      model: 'Apollo'
+    - regex: 'Sol Quatro Jr'
+      model: 'Sol Quatro Jr'
+    - regex: 'verykool[ _]?s6005x'
+      model: 'Cyprus Pro'
+    - regex: 'verykool[ _]?SL6010'
+      model: 'Cyprus LTE'
+    - regex: 'verykool[ _]?S4006[QT]?'
+      model: 'Leo 3G'
+    - regex: 'verykool[ _]?S4007'
+      model: 'Leo IV'
+    - regex: 'verykool[ _]?S4008'
+      model: 'Leo V'
+    - regex: 'verykool[ _]?s5017|Dorado s5017'
+      model: 'Dorado'
+    - regex: 'verykool[ _]?s4510'
+      model: 'Luna'
+    - regex: 'verykool[ _]?s5204'
+      model: 'Orion'
+    - regex: 'verykool[ _]?s5205'
+      model: 'Orion Pro'
+    - regex: 'verykool[ _]?s5528Jr'
+      model: 'Cosmo Jr'
+    - regex: 'verykool[ _]?s5528'
+      model: 'Cosmo'
+    - regex: 'verykool[ _]?s5702'
+      model: 'Royale Quattro'
+    - regex: 'verykool[ _]?SL5029'
+      model: 'Bolt Pro'
+    - regex: 'verykool[ _]?SL5565'
+      model: 'Rocket'
+
+    - regex: 'verykool[ _]?TL8010'
+      device: 'tablet'
+      model: 'KolorPad LTE'
+    - regex: 'verykool[ _]?T7440'
+      device: 'tablet'
+      model: 'KolorPad II'
+    - regex: 'verykool[ _]?T7445'
+      device: 'tablet'
+      model: 'KolorPad IV'
+
+    - regex: 'verykool[ _]?([^/;)]+)(?:[ _]SL?[0-9]{4}[QT]?)(?: Build|[);])'
       model: '$1'
-    - regex: 'verykool[ _]?([^/;]+);'
+    - regex: 'verykool[ _]?([^/;)]+)(?: Build|[);])'
       model: '$1'
 
-# Vestel
+# Vestel (vestel.com)
 Vestel:
-  regex: 'Venus[ _](GO|V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250[GS]|VSP355[GS]|V3_5580_Dual'
+  regex: 'Vestel[ _]|Venus[ _](GO|E[2-5]|V[1-9]|Z[1-9]0)|(?<!Winnovo )V_?TAB|VP74|VT97PRO|VSP145M|VSP250[GS]|VSP355[GS]|V3_5580_Dual|V TAB Z1'
   device: 'smartphone'
   models:
     - regex: 'VT97PRO'
@@ -13643,12 +19941,18 @@ Vestel:
     - regex: 'VTAB10'
       model: 'VTab 10'
       device: 'tablet'
-    - regex: 'V_TAB_7_ECO_III '
+    - regex: 'V_TAB_7_ECO_III'
       model: 'VTab 7 Eco 3'
       device: 'tablet'
+    - regex: 'V_TAB_7_LITE_III'
+      model: 'VTab 7 Lite 3'
+      device: 'tablet'
     - regex: 'V_TAB_([0-9]{4}[A-Z]?)'
       model: 'VTab $1'
       device: 'tablet'
+    - regex: 'V[_ ]TAB[_ ](Z1)'
+      model: 'VTab $1'
+      device: 'tablet'
     - regex: 'V3_5580_Dual'
       model: 'Venus V3 5580 Dual'
     - regex: 'VSP145M'
@@ -13661,18 +19965,33 @@ Vestel:
       model: 'Venus 5.5V'
     - regex: 'VSP355S'
       model: 'Venus 5.5X'
-    - regex: 'Venus[ _]V([1-9])'
-      model: 'Venus V$1'
+    - regex: 'Venus[ _]V([1-9])([ _][0-9]{4})?'
+      model: 'Venus V$1$2'
     - regex: 'Venus[ _]Z([1-9]0)'
       model: 'Venus Z$1'
     - regex: 'Venus[ _]GO'
       model: 'Venus Go'
+    - regex: 'Venus E2 Plus Dual'
+      model: 'Venus E2 Plus Dual'
+    - regex: 'Venus[ _]E2 Plus'
+      model: 'Venus E2 Plus'
+    - regex: 'Venus[ _]E([345])'
+      model: 'Venus E$1'
+    - regex: 'Vestel_5000_Dual'
+      model: '5000 Dual'
+    - regex: 'Vestel_5000_2gb'
+      model: '5000 2GB'
+    - regex: 'Vestel[ _](5000|5530)'
+      model: '$1'
 
 # Videocon
 Videocon:
-  regex: 'Videocon[_ \-]|VT75C|V502430'
+  regex: 'Videocon[_ \-]|(?:VT75C|V406018|V512930|V50(?:2430|3630|4730|5024|5430|4630|5[98]20)|Z45_(?:Dazzle|Amaze)|Z45Q Star|Z50 Nova)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'Videocon_V1585'
+      device: 'feature phone'
+      model: 'V1585'
     - regex: 'Videocon[_ \-]([a-z0-9]+)'
       model: '$1'
     - regex: 'VT75C(?:[);/ ]|$)'
@@ -13680,10 +19999,32 @@ Videocon:
       device: 'tablet'
     - regex: 'V502430(?:[);/ ]|$)'
       model: 'Kryton 3'
+    - regex: 'V505024(?:[);/ ]|$)'
+      model: 'Kryton 22 Plus'
+    - regex: 'V503630(?:[);/ ]|$)'
+      model: 'Delite 11'
+    - regex: 'V504730(?:[);/ ]|$)'
+      model: 'Delite 21'
+    - regex: 'V505920(?:[);/ ]|$)'
+      model: 'Metal Pro 2'
+    - regex: 'V505820(?:[);/ ]|$)'
+      model: 'Metal Pro 1'
+    - regex: 'V406018(?:[);/ ]|$)'
+      model: 'Starr 100'
+    - regex: 'V512930(?:[);/ ]|$)'
+      model: 'Ultra 50'
+    - regex: '(V505430|V504630)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Z45_(Dazzle|Amaze)(?:[);/ ]|$)'
+      model: 'Infinium Z45 $1'
+    - regex: 'Z45Q Star(?:[);/ ]|$)'
+      model: 'Infinium Z45Q Star'
+    - regex: 'Z50 Nova(?:[);/ ]|$)'
+      model: 'Infinium Z50 Nova'
 
 # Vodafone
 Vodafone:
-  regex: '(?<!FBCR/)Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat|VFD[ _][0-9]+(?:[);/ ]|$)|VFD320|VF6[89]5|VF-(696|1397|795|895N|1497)'
+  regex: '(?<!FBCR/)Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat|Smart Ultra 6|(?:VFD[ _][0-9]+|VFD320|VF6[89]5|VF-(696|1397|795|895N|1497))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'VFD 100'
@@ -13700,6 +20041,8 @@ Vodafone:
       model: 'Smart Turbo 7'
     - regex: 'VFD 51[013]'
       model: 'Smart E8'
+    - regex: 'VFD 52[78]'
+      model: 'Smart E9'
     - regex: 'VFD 600'
       model: 'Smart Prime 7'
     - regex: 'VFD320'
@@ -13708,12 +20051,18 @@ Vodafone:
       model: 'Smart X9'
     - regex: 'VFD 610'
       model: 'Smart N8'
+    - regex: 'VFD 630'
+      model: 'Smart N10'
+    - regex: 'VFD 620'
+      model: 'Smart N9 Lite'
     - regex: 'Smart ultra 6'
       model: 'Smart Ultra 6'
     - regex: 'VFD 700'
       model: 'Smart Ultra 7'
     - regex: 'VFD 720'
       model: 'Smart N9'
+    - regex: 'VFD 730'
+      model: 'Smart V10'
     - regex: 'VFD 900'
       model: 'Smart Platinum 7'
     - regex: 'Vodafone[ _]875(?:[);/ ]|$)'
@@ -13722,6 +20071,8 @@ Vodafone:
       model: 'Smart 3' # Alcatel
     - regex: 'Vodafone[ _]785(?:[);/ ]|$)'
       model: 'Smart 4 Mini'
+    - regex: 'VFD 525(?:[);/ ]|$)'
+      model: 'Smart 4G'
     - regex: 'Vodafone[ _]890N(?:[);/ ]|$)'
       model: 'Smart 4 Turbo' # Coolpad 3601U
     - regex: 'Vodafone[ _]985N(?:[);/ ]|$)'
@@ -13786,9 +20137,9 @@ Vodafone:
     - regex: 'Vodafone[ _-]([a-z0-9_-]+)'
       model: '$1'
 
-# Vonino
+# Vonino (vonino.ro, vonino.it)
 Vonino:
-  regex: 'Vonino|Epic (?:E8|P7)|Gyga[ _](?:X|S|QS|XS)|Jax[ _](?:QS|[SXQN]|Mini)|Magnet[ _]M[19]|Navo_QS|Onyx_(QS|Z)|Orin_QS|Pluri[ _](?:[BCMQ]7|[CQ]8)|Sirius_QS|Volt[ _][XS]|Xavy_(T7|L8)|Xylo[ _][XSPQ]|Zun[ _]X[OS]?|JAX_N'
+  regex: 'Vonino|Epic (?:E8|P7)|Gyga[ _](?:X|S|QS|XS)|Jax[ _](?:QS|[SXQN]|Mini)|Magnet[ _](?:M[19]|G[35]0)|Navo_QS|Onyx_(QS|Z)|Orin_QS|Pluri[ _](?:[BCMQ]7|[CQM]8)|Sirius_QS|(?<!Schok )Volt[ _][XS]|Xavy_(T7|L8)|Xylo[ _][XSPQT]|Zun[ _]X[OS]?|JAX_N|Druid_L10|iMart_Pro'
   device: 'smartphone'
   models:
     - regex: 'Zun[ _]XO'
@@ -13797,7 +20148,7 @@ Vonino:
       model: 'Zun XS'
     - regex: 'Zun[ _]X'
       model: 'Zun X'
-    - regex: 'Xylo[ _](P|S|X|Q)'
+    - regex: 'Xylo[ _]([PSXQT])'
       model: 'Xylo $1'
     - regex: 'Volt[ _]S_A7'
       model: 'Volt S A7'
@@ -13819,17 +20170,24 @@ Vonino:
       model: 'Jax $1'
     - regex: 'Jax[ _]Mini'
       model: 'Jax Mini'
+
+    - regex: 'iMart_Pro'
+      device: 'tablet'
+      model: 'IMart Pro'
     - regex: 'Epic (E8|P7)'
       model: 'Epic $1'
       device: 'tablet'
     - regex: 'Pluri[ _](B|C|M|Q)7'
       model: 'Pluri $17'
       device: 'tablet'
-    - regex: 'Pluri[ _](C|Q)8'
+    - regex: 'Pluri[ _]([CQM])8'
       model: 'Pluri $18'
       device: 'tablet'
-    - regex: 'Magnet[ _]M([19])'
-      model: 'Magnet M$1'
+    - regex: 'Druid[_ ](L10)'
+      model: 'Druid $1'
+      device: 'tablet'
+    - regex: 'Magnet[ _](M[19]|G[35]0)'
+      model: 'Magnet $1'
       device: 'tablet'
     - regex: 'Navo_QS'
       model: 'Navo QS'
@@ -13878,30 +20236,43 @@ Voxtel:
 
 # Vulcan
 Vulcan:
-  regex: 'VP5004A'
+  regex: '(?:VP5004A|HT0704W08|VS5513|VS4011|VR6031)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'VP5004A'
-      model: 'VP5004A'
+    - regex: '(VP5004A|VR6031)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'VS5513(?:[);/ ]|$)'
+      model: 'Tempo S13'
+    - regex: 'VS4011(?:[);/ ]|$)'
+      model: 'Tempo S11'
+    - regex: 'HT0704W08' # Hyundai
+      model: 'Koral 7W4'
+      device: 'tablet'
 
-# Walton
+# Walton (waltonbd.com)
 Walton:
-  regex: 'Walton|Walpad|Primo[ _](C[1234]?|D[1-68]|E[1-58]|EF[23]?|EM|F[1-7]i?|G[1-7]|GF[234]?|GH[23]?|GM|H[2346]|HM|N|N1|NF|NX2?|R[12346]|RH2?|RM2?|RX[23]?|S[123456]|V1|X[1234]|Z|ZX)'
+  regex: 'Walton|Walpad|RX7 Mini|Primo[ _](C[1234]?|D[1-689]|E[1-589]|F8s|S7|EF[23]?|EM|F[1-79]i?|G[1-9]|GF[234]?|GH[23]?|GM|H[2-689M]|H7s|N[F1]?|NX2?|R[1-468]|R[HM]2?|RX[23]?|S[1-6]|V1|X[1-4]|Z|ZX)'
   device: 'smartphone'
   models:
-    - regex: 'Walpad ([^;/]+) Build'
+    - regex: 'Walpad[ _]([^;/)]+)(?: Build|[);])'
       device: 'tablet'
       model: 'Primo Walpad $1'
     - regex: 'Primo S6 infinity'
       model: 'Primo S6 Infinity'
-    - regex: 'Walton[ _]([^;/]+) Build'
-      model: '$1'
-    - regex: 'Walton[ _]([^;/]+)\)'
-      model: '$1'
-    - regex: 'Primo[ _]([^;/]+) Build'
-      model: 'Primo $1'
-    - regex: 'Primo[ _]([0-9a-z]+)'
+    - regex: 'Primo H8 Pro(?:[);/ ]|$)'
+      model: 'Primo H8 Pro'
+    - regex: 'Primo (RM2|ZX2|NX4) mini(?:[);/ ]|$)'
+      model: 'Primo $1 Mini'
+    - regex: 'Primo H8(?:[);/ ]|$)'
+      model: 'Primo H8 Turbo'
+    - regex: 'RX7 Mini(?:[);/ ]|$)'
+      model: 'RX7 Mini'
+
+    # general detections
+    - regex: 'Primo[ _]([^;/)]+)(?: Build|[;)])'
       model: 'Primo $1'
+    - regex: 'Walton[ _]([^;/)]+)(?: Build|[;)])'
+      model: '$1'
 
 # Wellcom
 WellcoM:
@@ -13911,7 +20282,7 @@ WellcoM:
 
 # Wexler
 Wexler:
-  regex: 'Wexler|ULTIMA 7 TWIST PLUS|TAB[ _]10Q(?:[);/ ]|$)|ZEN[ _](?:4\.5|4\.7|5)'
+  regex: 'Wexler|(?:ULTIMA 7 TWIST PLUS|TAB10iQ3G|TAB[ _]10Q)(?:[);/ ]|$)|ZEN[ _](?:4\.[57]|5)'
   device: 'tablet'
   models:
     - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.5(?:[);/ ]|$)'
@@ -13923,8 +20294,13 @@ Wexler:
     - regex: '(?:Wexler[ _\-\.])?ZEN[ _]5(?:[);/ ]|$)'
       model: 'ZEN 5'
       device: 'smartphone'
+    - regex: 'ZEN[ _]5\+(?:[);/ ]|$)'
+      model: 'ZEN 5 Plus'
+      device: 'smartphone'
     - regex: '(?:Wexler[ _\-\.])?TAB[ _]10Q(?:[);/ ]|$)'
       model: 'TAB 10Q'
+    - regex: 'TAB10iQ3G(?:[);/ ]|$)'
+      model: 'TAB 10iQ 3G'
     - regex: 'Wexler[ _\-\.]([^;/]+) Build'
       model: '$1'
     - regex: 'Wexler[ _\-\.]([^);/]+)(?:[);/]|$)'
@@ -13932,17 +20308,53 @@ Wexler:
     - regex: '(ULTIMA 7 TWIST PLUS)(?:[);/ ]|$)'
       model: '$1'
 
-# Wiko
+# Inco (incomobile.com)
+Inco:
+  regex: '(?:Inco[ _](Aurora II|Colors|Sphere|Plain[_ ]2S?|Plain2 S|Flex(?: 2S)?|S4|Bloom(?: 2)?)|(Horizon_S|Horizon \+|MATTER))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Inco[ _])?(Plain[_ ]2S?|Colors|Horizon_S|Horizon \+|Aurora II|Flex(?: 2S)?|S4|Bloom(?: 2)?)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Plain2 S'
+      model: 'Plain 2S'
+    - regex: 'MATTER'
+      model: 'Matter'
+    - regex: 'Inco Sphere( 3)?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Sphere$1'
+
+# Wink
+Wink:
+  regex: '(?<!mismart )Wink[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'Wink[_ ]((?:Glory|World|Share|City)(?:[_ ](?:SE|S))?)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Wink[ _](Primo|Highway)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+
+# Wiko (wikomobile.com)
 Wiko:
-  regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa(?!nna)|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 Go|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C800|K[346]00|P200|C200SN)|WC300|W-(V720|V800|P[36]11|K420|K510)-(TVM|EEA|SUN|OPE)|WIM Lite|W-K360-TV|W-U300|U307AS|CINK PEAX 2'
+  regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa(?!nna|lPlus)|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?! Plus)(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 (?:Go|Plus)|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C8[06]0|K[346]00|P130|P200|C200SN)|WC300|W-(?:V7[23]0|V745|V755|V8[035]0|P[36]11|K130|K211|K3[68]0|K420|K510S?|K560|K610|K630)-(?:BYT|EEA|FRA|OPE|SUN|SWI|TIM|TMV|TVM|DU|T[HV])|WIM Lite|W-V851|W-V6[08]0|W-V750BN|W-K200|W-U300|U307AS|CINK PEAX 2|HIGHWAY PURE|C210AE|v3913|U614AS|V3991AN'
   device: 'smartphone'
   models:
+    - regex: '(?:WIKO-)?W-V745'
+      model: 'Power U10'
+    - regex: '(?:WIKO-)?W-V750'
+      model: 'Power U20'
+    - regex: '(?:WIKO-)?W-V755-EEA'
+      model: 'Power U30'
     - regex: '(?:WIKO-)?Cink Peax 2'
       model: 'Cink Peax 2'
     - regex: '(?:Wiko-)?Cink([^/;]*) Build'
       model: 'Cink$1'
     - regex: '(?:WIKO-)?CINK_([a-z0-9_]+)'
       model: 'Cink $1'
+    - regex: '(?:WIKO-)?HIGHWAY PURE'
+      model: 'Highway Pure'
+    - regex: '(?:WIKO-)?HIGHWAY STAR'
+      model: 'Highway Star'
     - regex: '(?:Wiko-)?Highway([^/;]*) Build'
       model: 'Highway$1'
     - regex: '(?:WIKO-)?HIGHWAY_([a-z0-9_]+)'
@@ -13987,6 +20399,8 @@ Wiko:
       model: 'Jerry Max'
     - regex: 'W_K300'
       model: 'Jerry 3'
+    - regex: 'W-K420-TVM'
+      model: 'Jerry 4'
     - regex: '(?:WIKO-)?Jerry2'
       model: 'Jerry 2'
     - regex: '(?:WIKO-)?Jerry'
@@ -14001,8 +20415,14 @@ Wiko:
       model: 'Kite'
     - regex: 'W_K400'
       model: 'Lenny 5'
+    - regex: 'C210AE(?:[);/ ]|$)'
+      model: 'Life'
     - regex: 'U307AS(?:[);/ ]|$)'
       model: 'Life 2'
+    - regex: 'U316AT(?:[);/ ]|$)'
+      model: 'Life 3'
+    - regex: 'v3913(?:[);/ ]|$)'
+      model: 'Kenny'
     - regex: '(?:WIKO-)?Lenny[ -_]?3 Max'
       model: 'Lenny 3 Max'
     - regex: '(?:WIKO-)?Lenny[ -_]?4 Plus'
@@ -14019,12 +20439,18 @@ Wiko:
       model: 'Sunset'
     - regex: '(?:WIKO-)?Sunny3'
       model: 'Sunny 3'
+    - regex: 'W-K200'
+      model: 'Sunny 3 Plus'
     - regex: '(?:WIKO-)?Sunny2 Plus'
       model: 'Sunny 2 Plus'
     - regex: '(?:WIKO-)?Sunny2'
       model: 'Sunny 2'
     - regex: 'W-K360-TV'
       model: 'Sunny 4 Plus'
+    - regex: 'W-K130-TMV'
+      model: 'Sunny 4'
+    - regex: 'W-K380-TVM'
+      model: 'Sunny 5'
     - regex: '(?:WIKO-)?Sunny'
       model: 'Sunny'
     - regex: '(?:W_K600|Tommy3|W_C200SN)'
@@ -14039,6 +20465,8 @@ Wiko:
       model: 'Wax'
     - regex: '(?:WIKO-)?HARRY'
       model: 'Harry'
+    - regex: 'W-V600'
+      model: 'Harry 2'
     - regex: '(?:WIKO-)?WIM Lite'
       model: 'WIM Lite'
     - regex: '(?:WIKO-)?Pulp Fab 4G'
@@ -14049,8 +20477,8 @@ Wiko:
       model: 'Pulp 4G'
     - regex: '(?:WIKO-)?Pulp'
       model: 'Pulp'
-    - regex: '(?:WIKO-)?Robby'
-      model: 'Robby'
+    - regex: '(?:WIKO-)?Robby(2)?'
+      model: 'Robby$1'
     - regex: '(?:WIKO-)?U PULSE LITE'
       model: 'U Pulse Lite'
     - regex: '(?:WIKO-)?U PULSE'
@@ -14061,8 +20489,12 @@ Wiko:
       model: 'U Feel Prime'
     - regex: '(?:WIKO-)?U FEEL'
       model: 'U Feel'
+    - regex: 'V3991AN'
+      model: 'U Feel Fab'
     - regex: '(?:WIKO-)?View2 Go'
       model: 'View 2 Go'
+    - regex: '(?:WIKO-)?View2 Plus'
+      model: 'View 2 Plus'
     - regex: '(?:WIKO-)?View XL'
       model: 'View XL'
     - regex: '(?:WIKO-)?View Prime'
@@ -14071,41 +20503,61 @@ Wiko:
       model: 'View Lite'
     - regex: 'W_C800'
       model: 'View 2'
+    - regex: 'W_C860'
+      model: 'View 2 Pro'
     - regex: 'W_P200'
       model: 'View Max'
-    - regex: 'W-V800-(TVM|EEA|OPE)'
+    - regex: 'W_P130'
+      model: 'View Go'
+    - regex: 'W-V800-(TVM|TIM|EEA|OPE|DU)'
       model: 'View 3 Lite'
+    - regex: 'W-V851'
+      model: 'View 5'
+    - regex: 'W-V850-EEA'
+      model: 'View 5 Plus'
+    - regex: 'W-K130-(?:OPE|EEA)'
+      model: 'Y50'
     - regex: 'W-K420-EEA'
       model: 'Y50'
-    - regex: 'W-K510-(TVM|EEA|OPE|SUN)'
+    - regex: 'W-K211'
+      model: 'Y51'
+    - regex: 'W-K510-(?:TVM|EEA|OPE|SUN|BYT|TH)|W-K510S-SWI'
       model: 'Y60'
-    - regex: 'W-V720-(EEA|OPE)'
+    - regex: 'W-K560-(?:EEA|TVM)'
+      model: 'Y61'
+    - regex: 'W-K610'
+      model: 'Y62'
+    - regex: 'W-V720-(?:EEA|OPE|SUN)'
       model: 'Y80'
-    - regex: 'W-P311-(EEA|OPE)'
+    - regex: 'W-V680'
+      model: 'Y81'
+    - regex: 'W-K630'
+      model: 'Y82'
+    - regex: 'W-P311-(?:EEA|OPE|TVM)'
       model: 'View 3'
-    - regex: 'W-P611-EEA'
+    - regex: 'W-P611-(?:EEA|OPE)'
       model: 'View 3 Pro'
+    - regex: 'W-V830-(?:EEA|OPE)'
+      model: 'View 4'
+    - regex: 'W-V730-(?:EEA|TVM)'
+      model: 'View 4 Lite'
+    - regex: 'W-V745-TVM'
+      model: 'Power U10'
     - regex: 'W-U300(?:[);/ ]|$)'
       model: 'Ride'
-    - regex: 'Wiko ([^/;]+) Build'
-      model: '$1'
-    - regex: 'Wiko ([^/; ]+)'
+    - regex: 'U520AS(?:[);/ ]|$)'
+      model: 'Ride 2'
+    - regex: 'U614AS(?:[);/ ]|$)'
+      model: 'Ride 3'
+    - regex: 'Wiko ([^/;)]+)(?: Build|[;)])'
       model: '$1'
 
 # Wieppo
 Wieppo:
-  regex: 'Wieppo (S6 Lite|S[658])(?:[);/ ]|$)'
+  regex: 'Wieppo (S6 Lite|S[658]|E1)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
-# Wink
-Wink:
-  regex: 'Wink_'
-  device: 'smartphone'
-  models:
-    - regex: 'Wink_City_(SE|S)'
-      model: 'City $1'
-
 # Weimei
 Weimei:
   regex: 'weplus_3'
@@ -14116,11 +20568,13 @@ Weimei:
 
 # Wileyfox
 Wileyfox:
-  regex: '(?:Wileyfox [^/]+)|Swift 2(?:[);/ ]|$)'
+  regex: 'Wileyfox|Swift 2(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Wileyfox Spark \+'
       model: 'Spark +'
+    - regex: 'Wileyfox; Pro'
+      model: 'Pro'
     - regex: 'Wileyfox Spark X'
       model: 'Spark X'
     - regex: 'Wileyfox (Spark|Swift)'
@@ -14153,6 +20607,16 @@ Wolfgang:
   device: 'smartphone'
   model: 'AT-AS$1'
 
+# Wolki (https://wolkimobile.com/)
+Wolki:
+  regex: '(?:W55SE|WS067)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'W55SE'
+      model: 'W5.5 SE'
+    - regex: 'WS067'
+      model: 'W6 Pro'
+
 # Wonu
 Wonu:
   regex: 'Wonu ([a-z0-9]+)'
@@ -14167,35 +20631,135 @@ Woo:
     - regex: 'SP5026i-Scorpio'
       model: 'Scorpio'
 
-# Woxter
+# Woxter (woxter.es)
 Woxter:
-  regex: 'Woxter[ _]([^/;]+) Build'
+  regex: 'Woxter[ _]|Nimbus 101Q'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'Nimbus ?(101Q|115|1100RX)(?:[);/ ]|$)'
+      model: 'Nimbus $1'
+    - regex: 'WOXTER[ _]I-101(?:[);/ ]|$)'
+      model: 'i-101'
+    - regex: 'Woxter[ _]([SQ]X) ?([0-9A-Z]+)(?:[);/ ]|$)'
+      model: '$1 $2'
+    - regex: 'Woxter[_ ](?:Zielo[ _])?(Q27|Z800|Z420)(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Zielo $1'
+    - regex: 'Woxter[ _]([^/;)]+)(?: Build|\))'
+      model: '$1'
 
 # X-View
 X-View:
-  regex: 'ZEN_U5+'
+  regex: 'ZEN_U5\+|AMBER_KIDS|Proton_Amber_HD|PROTON_JADE_2_PRO'
   device: 'smartphone'
   models:
-    - regex: 'ZEN_U5+'
+    - regex: 'ZEN_U5\+'
       model: 'ZEN U5+'
+    - regex: 'AMBER_KIDS'
+      device: 'tablet'
+      model: 'Amber Kids'
+    - regex: 'Proton_Amber_HD'
+      device: 'tablet'
+      model: 'Proton Amber HD'
+    - regex: 'PROTON_JADE_2_PRO'
+      device: 'tablet'
+      model: 'Proton Jade 2 Pro'
 
 # POCO (sub brand Xiaomi)
 POCO:
-  regex: '(?:POCO[ _](?:X2|F2 PRO)|M2007J20CG)(?:[);/ ]|$)'
+  regex: '(?:POCO[ _](?:X[23](?:_SN)?|F2 PRO|M[32]|F3)|M2010J19C[GI]|M2007J20C[ITG]|M2012K11AG|M2006C3MI|M2004J19PI|M2102J20S[GI]|M2103K19P[IGY]|21091116AG|21061110AG|M2104K10I|211033MI|2201117PG)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'POCO X2(?:[);/ ]|$)'
       model: 'X2'
-    - regex: 'M2007J20CG(?:[);/ ]|$)'
+    - regex: '(?:M2012K11AG|POCO F3)(?:[);/ ]|$)'
+      model: 'F3'
+    - regex: 'M2004J19PI(?:[);/ ]|$)'
+      model: 'M2'
+    - regex: '(?:M2103K19P[IGY]|M3 Pro 5G)(?:[);/ ]|$)'
+      model: 'M3 Pro 5G'
+    - regex: 'POCO M([23]) Pro(?:[);/ ]|$)'
+      model: 'M$1 Pro'
+    - regex: '21091116AG'
+      model: 'M4 Pro 5G'
+    - regex: '2201117PG'
+      model: 'M4 Pro'
+    - regex: '(?:M2010J19C[GI]|POCO M3)(?:[);/ ]|$)'
+      model: 'M3'
+    - regex: '(?:M2007J20C[GT]|POCO X3 NFC)(?:[);/ ]|$)'
       model: 'X3 NFC'
+    - regex: '(?:M2102J20S[GI]|X3 Pro)(?:[);/ ]|$)'
+      model: 'X3 Pro'
+    - regex: '(?:M2007J20CI|POCO X3(?:_SN)?)(?:[);/ ]|$)'
+      model: 'X3'
+    - regex: '(?:21061110AG)(?:[);/ ]|$)'
+      model: 'X3 GT'
+    - regex: '(?:M2104K10I)(?:[);/ ]|$)'
+      model: 'F3 GT'
+    - regex: 'M2006C3MI(?:[);/ ]|$)'
+      model: 'C3'
+    - regex: '211033MI(?:[);/ ]|$)'
+      model: 'C31'
     - regex: 'POCO F2 PRO(?:[);/ ]|$)'
       model: 'F2 Pro'
 
+# Zopo
+Zopo:
+  regex: 'ZOPO|(?:ZOPO[_ ])?(Flash X3|F2_Color5_5|F5_Color_M5|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:ZOPO_C2_MOD|ZP998)(?:[);/ ]|$)'
+      model: 'C2 II'
+    - regex: 'ZOPO 9xxQuad(?:[);/ ]|$)'
+      model: '9XX Quad'
+    - regex: '(?:ZOPO_)?ZP980[+](?:[);/ ]|$)'
+      model: 'ZP980+'
+    - regex: '(?:ZOPO_)?ZP980(?:[);/ ]|$)'
+      model: 'Scorpio'
+    - regex: 'ZP952(?:[);/ ]|$)'
+      model: 'Speed 7 Plus'
+    - regex: 'ZP951(?:[);/ ]|$)'
+      model: 'Speed 7'
+    - regex: 'ZP955(?:[);/ ]|$)'
+      model: 'Speed 8'
+    - regex: 'ZP950[+h]?(?:[);/ ]|$)'
+      model: 'Leader Max'
+    - regex: 'ZP(?:900H?|910)(?:[);/ ]|$)'
+      model: 'Leader'
+    - regex: 'ZP(?:800H|810)(?:[);/ ]|$)'
+      model: 'Libero HD'
+    - regex: 'ZP500[+]?(?:[);/ ]|$)'
+      model: 'Libero'
+    - regex: 'ZP330(?:[);/ ]|$)'
+      model: 'Color C'
+    - regex: 'ZP370(?:[);/ ]|$)'
+      model: 'Color S'
+    - regex: 'F2_Color5_5(?:[);/ ]|$)'
+      model: 'Color F2'
+    - regex: 'F5_Color_M5(?:[);/ ]|$)'
+      model: 'F5 Color M5'
+    - regex: 'ZP5(63|86)(?:[);/ ]|$)'
+      model: 'Color X'
+    - regex: 'ZP567(?:[);/ ]|$)'
+      model: 'Color C5i'
+    - regex: 'ZP300[S+]?(?:[);/ ]|$)'
+      model: 'Field'
+    - regex: 'ZP200[+]?(?:[);/ ]|$)'
+      model: 'Shining'
+    - regex: 'ZP100(?:[);/ ]|$)'
+      model: 'Pilot'
+    - regex: 'ZP1790(?:[);/ ]|$)'
+      model: 'Flash X2'
+    - regex: 'ZP781(?:[);/ ]|$)'
+      model: 'Flash G5 Plus'
+    - regex: 'ZOPO[_ ]ONE[_ ]([YXTP])(?:[);/ ]|$)'
+      model: 'One $1'
+    - regex: '(?:ZOPO_)?(Flash X3|X1i|ZP[0-9]{2,}[^/;)]+)(?: Build|\))'
+      model: '$1'
+
 # Xiaomi
 Xiaomi:
-  regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-A0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP1|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006C3(?:L[GC]|MN?G)|M2007J1SC|M2002J9[EG]|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2003J15SC|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01'
+  regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?|pomelo)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|POCOPHONE|(?:SHARK )?(KLE|KSR|MBU)-[AH]0|SK[RW]-[AH]0|PRS-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP[01]|AXSO0|AESP0|MOOQ0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006J10C|M2006C3(?:L[IGC]|LVG|MN?G|MT)|M2007J1(?:7[CGI]|SC)|M2002J9[SEG]|HM2014819|WT88047|210611(?:8C|19BI)|M2004J(?:7[AB]|19)C|M2012K11(?:[CGI]|A[CI])|M2011K2[CG]|M2011J18C|M2006C3[ML]II|M2003J15SC|M2007J3S[ICYGP]|M2007J22[CG]|M2103K19[CGYI]|M2101K(?:[79]AG|7AI|7B[GI]|6[GIRP]|7BNY|9[GCR])|M2010J19S[CGYIL]|M1908C3JGG|M2102(?:K1AC|K1[CG]|J2SC)|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01|Qin 1s\+|Qin 2(?: Pro)?|MI_(NOTE_Pro|5X|4i|(?:A2|8)_Lite)|A001XM|lancelot|XIG02|21061119(?:[AD]G|AL)|2107119DC|M2101K(?:7BL|9AI)|M2012K10C|M2104K10AC|M1901F71|21051182[CG]|21081111RG|2109119D[GI]|21091116(?:AI|[AU]?C|i)|2201117T[GIY]|21121(?:119S[CG]|23AC)|2107113S[GR]|M2105K81A?C|2109119BC|220112[23]C|joyeuse|galahad|begonia| MDG1'
   device: 'smartphone'
   models:
     # specific smartphone models
@@ -14209,62 +20773,138 @@ Xiaomi:
       model: 'Black Shark 2 Pro'
     - regex: '(?:SHARK )?KLE-A0'
       model: 'Black Shark 3'
+    - regex: '(?:SHARK )?KSR-A0'
+      model: 'Black Shark 4 Pro'
+    - regex: '(?:SHARK )?KLE-H0'
+      model: 'Black Shark 3 5G'
+    - regex: '(?:SHARK )?MBU-H0'
+      model: 'Black Shark 3 Pro 5G'
     - regex: '(?:SHARK )?MBU-A0'
       model: 'Black Shark 3 Pro'
+    - regex: '(?:SHARK )?PRS-[AH]0'
+      model: 'Black Shark 4'
     - regex: 'Xiaomi_2014501|2014501 Build'
       model: 'Hongmi 4G'
     - regex: 'Xiaomi_2014011|2014011 Build'
       model: 'Hongmi 1S'
     - regex: 'Xiaomi_201302[23]|201302[23] Build'
       model: 'Hongmi'
-    - regex: 'Xiaomi_2014818|2014818 Build'
+    - regex: 'Xiaomi[_-]2014818|2014818 Build'
       model: 'Hongmi 2 3G'
     - regex: 'Xiaomi_2014817|2014817 Build'
       model: 'Hongmi 2'
-    - regex: 'Xiaomi_201481[123]|201481[123] Build'
+    - regex: 'Xiaomi[_-]201481[123]|201481[123] Build'
       model: 'Hongmi 2 4G'
     - regex: 'MI[_ ]PLAY(?:[);/ ]|$)'
-      model: 'MI Play'
+      model: 'Mi Play'
     - regex: 'Mi 9 SE(?:[);/ ]|$)'
-      model: 'MI 9 SE'
-    - regex: 'MI CC 9 Meitu Edition(?:[);/ ]|$)'
-      model: 'MI CC 9'
+      model: 'Mi 9 SE'
+    - regex: 'MI CC 9e'
+      model: 'Mi CC 9e'
+    - regex: 'MI CC9 Pro Premium Edition'
+      model: 'Mi CC 9 Pro Premium Edition'
+    - regex: 'MI CC9 Pro'
+      model: 'Mi CC 9 Pro'
+    - regex: 'MI CC 9(?: Meitu Edition)?(?:[);/ ]|$)'
+      model: 'Mi CC 9'
     - regex: 'Xiaomi_M2001J2E_TD-LTE(?:[);/ ]|$)'
-      model: 'MI 10'
+      model: 'Mi 10'
+    - regex: '(?:Xiaomi_)?(?:Mi 10 Pro|M2001J1E(?:_TD-LTE)?)(?:[);/ ]|$)'
+      model: 'Mi 10 Pro'
+    - regex: 'M2011K2[CG](?:[);/ ]|$)'
+      model: 'Mi 11'
+    - regex: 'M2012K11AI(?:[);/ ]|$)'
+      model: 'Mi 11X'
+    - regex: 'M2012K11I(?:[);/ ]|$)'
+      model: 'Mi 11X Pro'
+    - regex: 'M2007J3S[GI](?:[);/ ]|$)'
+      model: 'Mi 10T Pro 5G'
+    - regex: 'M2007J17G(?:[);/ ]|$)'
+      model: 'Mi 10T Lite 5G'
+    - regex: 'M2007J3S[CYP](?:[);/ ]|$)'
+      model: 'Mi 10T 5G'
     - regex: 'M2007J1SC(?:[);/ ]|$)'
-      model: 'MI 10 Ultra 5G'
-    - regex: '(?:M2002J9[EG]|XIG01)(?:[);/ ]|$)'
-      model: 'MI 10 Lite 5G'
+      model: 'Mi 10 Ultra 5G'
+    - regex: 'M2102J2SC(?:[);/ ]|$)'
+      model: 'Mi 10S'
+    - regex: '(?:M2002J9[EGS]|XIG01|Mi 10 Lite 5G)(?:[);/ ]|$)'
+      model: 'Mi 10 Lite 5G'
+    - regex: 'M2007J17I(?:[);/ ]|$)'
+      model: 'Mi 10i'
+    - regex: 'M2012K11G(?:[);/ ]|$)'
+      model: 'Mi 11i'
+    - regex: '(?:2107113S[GR]|Xiaomi 11T Pro)(?:[);/ ]|$)'
+      model: 'Mi 11T Pro'
+    - regex: '(?:21081111RG|Xiaomi 11T)(?:[);/ ]|$)'
+      model: 'Mi 11T'
+    - regex: '(?:M2101K9[GCR]|2109119DG|Mi 11 Lite 5G)(?:[);/ ]|$)'
+      model: 'Mi 11 Lite 5G'
+    - regex: '(?:2109119DI|(?:Xiao)?mi 11 Lite 5G NE)(?:[);/ ]|$)'
+      model: 'Mi 11 Lite 5G NE'
+    - regex: '(?:M2101K9A[GI]|Mi 11 Lite)(?:[);/ ]|$)'
+      model: 'Mi 11 Lite'
+    - regex: 'M2102K1[CG](?:[);/ ]|$)'
+      model: 'Mi 11 Ultra'
+    - regex: 'M2102K1AC(?:[);/ ]|$)'
+      model: 'Mi 11 Pro'
+    - regex: '2201122C(?:[);/ ]|$)'
+      model: '12 Pro'
+    - regex: '2201123C(?:[);/ ]|$)'
+      model: '12'
+    - regex: '2112123AC(?:[);/ ]|$)'
+      model: '12X'
+    - regex: 'MI[ _]8[ _]Lite(?:[);/ ]|$)'
+      model: 'Mi 8 Lite'
+    - regex: 'MI 8 Explorer Edition(?:[);/ ]|$)'
+      model: 'Mi 8 Explorer Edition'
+    - regex: 'MI 8 ([a-z]+)(?:[);/ ]|$)'
+      model: 'Mi 8 $1'
     - regex: 'Mi 9T Pro(?:[);/ ]|$)'
-      model: 'MI 9T Pro'
-    - regex: 'Mi9 Pro 5G(?:[);/ ]|$)'
-      model: 'MI 9 Pro 5G'
-    - regex: 'MI 8 Lite(?:[);/ ]|$)'
-      model: 'MI 8 Lite'
+      model: 'Mi 9T Pro'
+    - regex: 'Mi ?9 Pro 5G(?:[);/ ]|$)'
+      model: 'Mi 9 Pro 5G'
+    - regex: 'MI 9 Transparent Edition(?:[);/ ]|$)'
+      model: 'Mi 9 Transparent Edition'
+    - regex: 'MI ([89]) Lite(?:[);/ ]|$)'
+      model: 'Mi $1 Lite'
     - regex: 'MI 5s Plus(?:[);/ ]|$)'
-      model: 'MI 5s Plus'
+      model: 'Mi 5s Plus'
+    - regex: 'Xiaomi_MDT2'
+      model: 'Mi 5X'
     - regex: 'Xiaomi_2013061|2013061 Build'
-      model: 'MI 3'
-    - regex: 'Mi-4c(?:[);/ ]|$)'
-      model: 'MI 4C'
-    - regex: 'MI MAX 3(?:[);/ ]|$)'
-      model: 'MI MAX 3'
-    - regex: 'MI MAX 2(?:[);/ ]|$)'
-      model: 'MI MAX 2'
-    - regex: 'Mi A2 Lite(?:[);/ ]|$)'
-      model: 'MI A2 Lite'
-    - regex: 'MIX 3(?:[);/ ]|$)'
-      model: 'MI MIX 3'
+      model: 'Mi 3'
+    - regex: 'Mi[- ]([43])c(?:[);/ ]|$)'
+      model: 'Mi $1C'
+    - regex: 'MI 4W(?:[);/ ]|$)'
+      model: 'Mi 4W'
+    - regex: 'Mi_4i(?:[);/ ]|$)'
+      model: 'Mi 4i'
+    - regex: 'MI 4 ?LTE(?:[);/ ]|$)'
+      model: 'Mi 4 LTE'
+    - regex: 'MI MAX ([23])(?:[);/ ]|$)'
+      model: 'Mi Max $1'
+    - regex: 'MI MAX(?:[);/ ]|$)'
+      model: 'Mi Max'
+    - regex: 'Mi[ _]A2[ _]Lite(?:[);/ ]|$)'
+      model: 'Mi A2 Lite'
+    - regex: '2106118C(?:[);/ ]|$)'
+      model: 'Mi Mix 4'
+    - regex: 'Mi MIX 3 5G(?:[);/ ]|$)'
+      model: 'Mi Mix 3 5G'
+    - regex: 'MIX ([23])(?:[);/ ]|$)'
+      model: 'Mi Mix $1'
     - regex: 'MIX 2S(?:[);/ ]|$)'
-      model: 'MI MIX 2S'
-    - regex: 'MIX 2(?:[);/ ]|$)'
-      model: 'MI MIX 2'
+      model: 'Mi Mix 2S'
     - regex: 'MIX(?:[);/ ]|$)'
-      model: 'MI MIX'
+      model: 'Mi Mix'
+    - regex: 'Mi Note 3(?:[);/ ]|$)'
+      model: 'Mi Note 3'
     - regex: 'POCOPHONE[ _]F1|POCO F1'
       model: 'Pocophone F1'
     - regex: 'Redmi 5 Plus'
       model: 'Redmi 5 Plus'
+    - regex: 'MDG1(?:[);/ ]|$)'
+      model: 'Redmi 5'
     - regex: 'WT88047(?:[);/ ]|$)'
       model: 'Redmi 2'
     - regex: 'HM2014819(?:[);/ ]|$)'
@@ -14275,21 +20915,75 @@ Xiaomi:
       model: 'Redmi 1S'
     - regex: 'HM 1(?:[);/ ]|$)'
       model: 'Redmi 1'
+    - regex: 'Redmi 8A (Dual|Pro)(?:[);/ ]|$)'
+      model: 'Redmi 8A $1'
     - regex: 'M2004J7AC(?:[);/ ]|$)'
       model: 'Redmi 10X'
-    - regex: 'M2004J19C(?:[);/ ]|$)'
+    - regex: '(?:M2004J19C|M2006C3MII|lancelot|galahad)(?:[);/ ]|$)'
       model: 'Redmi 9'
-    - regex: 'M2006C3L[GC](?:[);/ ]|$)'
+    - regex: 'M2010J19SI(?:[);/ ]|$)'
+      model: 'Redmi 9 Power'
+    - regex: 'M2006C3L[GCI](?:[);/ ]|$)'
       model: 'Redmi 9A'
-    - regex: 'M2006C3MG(?:[);/ ]|$)'
+    - regex: 'M2006C3LII(?:[);/ ]|$)'
+      model: 'Redmi 9i'
+    - regex: 'M2006C3M[GT](?:[);/ ]|$)'
       model: 'Redmi 9C'
-    - regex: 'M2006C3MNG(?:[);/ ]|$)'
+    - regex: 'M2006C3LVG(?:[);/ ]|$)'
+      model: 'Redmi 9AT'
+    - regex: '(?:M2010J19S[GYL]|pomelo)(?:[);/ ]|$)'
+      model: 'Redmi 9T'
+    - regex: '(?:M2006C3MNG|Redmi 9C NFC)(?:[);/ ]|$)'
       model: 'Redmi 9C NFC'
+    - regex: '21061119D[CG](?:[);/ ]|$)'
+      model: 'Redmi 10'
+    - regex: '(?:21061119A[GL]|21121119SG)(?:[);/ ]|$)'
+      model: 'Redmi 10 (2022)'
+    - regex: '21061119BI(?:[);/ ]|$)'
+      model: 'Redmi 10 Prime'
     - regex: 'M2004J7BC(?:[);/ ]|$)'
       model: 'Redmi 10X Pro'
-    - regex: 'Redmi K20 Pro(?:[);/ ]|$)'
-      model: 'Redmi K20 Pro'
-
+    - regex: 'Redmi K20 Pro Premium Edition(?:[);/ ]|$)'
+      model: 'Redmi K20 Pro Premium Edition'
+    - regex: 'Redmi K30 Pro Zoom Edition(?:[);/ ]|$)'
+      model: 'Redmi K30 Pro Zoom Edition'
+    - regex: 'Redmi K([23]0) Pro(?:[);/ ]|$)'
+      model: 'Redmi K$1 Pro'
+    - regex: 'Redmi K30 5G(?:[);/ ]|$)'
+      model: 'Redmi K30 5G'
+    - regex: 'M2012K11AC(?:[);/ ]|$)'
+      model: 'Redmi K40'
+    - regex: 'M2012K10C(?:[);/ ]|$)'
+      model: 'Redmi K40 Gaming'
+    - regex: 'M2012K11C(?:[);/ ]|$)'
+      model: 'Redmi K40 Pro'
+    - regex: 'M2006J10C(?:[);/ ]|$)'
+      model: 'Redmi K30 Ultra'
+    - regex: 'Redmi Y1 Lite(?:[);/ ]|$)'
+      model: 'Redmi Y1 Lite'
+    - regex: 'Redmi 6 Pro(?:[);/ ]|$)'
+      model: 'Redmi 6 Pro'
+    - regex: 'Redmi 4 Prime(?:[);/ ]|$)'
+      model: 'Redmi 4 Prime'
+    - regex: 'Qin 2 Pro(?:[);/ ]|$)'
+      model: 'Qin 2 Pro'
+    - regex: 'Qin 2(?:[);/ ]|$)'
+      model: 'Qin 2'
+    - regex: '2107119DC(?:[);/ ]|$)'
+      model: 'CC11'
+    - regex: '2109119BC(?:[);/ ]|$)'
+      model: 'Civi'
+
+      # specific tablet models
+    - regex: '(?:21051182[CG]|(?:Xiao)?mi Pad 5)(?:[);/ ]|$)'
+      model: 'Mi Pad 5'
+      device: 'tablet'
+    - regex: 'M2105K81C(?:[);/ ]|$)'
+      model: 'Mi Pad 5 Pro 5G'
+      device: 'tablet'
+    - regex: 'M2105K81AC(?:[);/ ]|$)'
+      model: 'Mi Pad 5 Pro'
+      device: 'tablet'
     - regex: 'MI PAD 4 PLUS(?:[);/ ]|$)'
       model: 'Mi Pad 4 Plus'
       device: 'tablet'
@@ -14305,6 +20999,8 @@ Xiaomi:
     - regex: 'MI PAD(?:[);/ ]|$)'
       model: 'Mi Pad'
       device: 'tablet'
+
+      # specific tv models
     - regex: 'MIBOX3[ _]Pro(?:[);/ ]|$)'
       model: 'Mi Box 3 Pro'
       device: 'tv'
@@ -14317,12 +21013,23 @@ Xiaomi:
     - regex: 'MiTV-MSSP1(?:[);/ ]|$)'
       model: 'MiTV 4S'
       device: 'tv'
-    - regex: '(?:MiTV-AXSO0|MiTV4(?:A|-ANSM0))(?:[);/ ]|$)'
+    - regex: 'MiTV-AESP0(?:[);/ ]|$)'
+      model: 'MiTV Stick'
+      device: 'tv'
+    - regex: 'MiTV-MOOQ0(?:[);/ ]|$)'
+      model: 'MiTV P1'
+      device: 'tv'
+    - regex: '(?:MiTV-AXSO0|MiTV4(?:A|-ANSM0)|MiTV-MSSP0)(?:[);/ ]|$)'
       model: 'MiTV 4A'
       device: 'tv'
-    - regex: '(MiTV)(4[CSX]|4)(?:[);/ ]|$)'
-      model: '$1 $2'
+    - regex: 'MiTV(4[CSX]|4)(?:[);/ ]|$)'
+      model: 'MiTV $1'
       device: 'tv'
+
+      # specific phablet models
+    - regex: 'M2011J18C(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Mi Mix Fold'
     - regex: 'HM NOTE 1W(?:[);/ ]|$)'
       device: 'phablet'
       model: 'Redmi Note'
@@ -14332,46 +21039,130 @@ Xiaomi:
     - regex: 'HM NOTE 1(?:LTE|S)(?:W|GLOBAL|TD)? (?:Build|MIUI)|HM NOTE 1LTE'
       device: 'phablet'
       model: 'Redmi Note 4G'
-    - regex: 'Redmi Note 6 Pro'
-      model: 'Redmi Note 6 Pro'
-      device: 'phablet'
-    - regex: 'Redmi Note 5 Pro'
-      model: 'Redmi Note 5 Pro'
+    - regex: 'Xiaomi[_ ]2015052'
+      model: 'Redmi Note 2'
       device: 'phablet'
     - regex: 'Redmi Note 5A Prime'
       model: 'Redmi Note 5A Prime'
       device: 'phablet'
-    - regex: 'M2003J15SC(?:[);/ ]|$)'
+    - regex: 'Redmi Note 5A Lite'
+      model: 'Redmi Note 5A Lite'
+      device: 'phablet'
+    - regex: '(?:M2010J19SC)(?:[);/ ]|$)'
       model: 'Redmi Note 9'
       device: 'phablet'
-    - regex: 'Redmi Note 7 Pro(?:[);/ ]|$)'
-      model: 'Redmi Note 7 Pro'
+    - regex: 'M2003J15SC(?:[);/ ]|$)'
+      model: 'Redmi Note 10X'
+      device: 'phablet'
+    - regex: 'M2101K7BL(?:[);/ ]|$)'
+      model: 'Redmi Note 10S'
+      device: 'phablet'
+    - regex: '(?:M2007J22G|A001XM)(?:[);/ ]|$)'
+      model: 'Redmi Note 9T 5G'
+      device: 'phablet'
+    - regex: 'M2007J22C(?:[);/ ]|$)'
+      model: 'Redmi Note 9 5G'
+      device: 'phablet'
+    - regex: 'M2007J17C(?:[);/ ]|$)'
+      model: 'Redmi Note 9 Pro 5G'
       device: 'phablet'
-    - regex: 'Redmi Note 8 Pro(?:[);/ ]|$)'
+    - regex: 'joyeuse(?:[);/ ]|$)'
+      model: 'Redmi Note 9 Pro'
+      device: 'phablet'
+    - regex: 'Redmi Note 10 Lite'
+      model: 'Redmi Note 10 Lite'
+      device: 'phablet'
+    - regex: 'M2101K7A[GI]'
+      model: 'Redmi Note 10'
+      device: 'phablet'
+    - regex: 'M2103K19Y'
+      model: 'Redmi Note 10T'
+      device: 'phablet'
+    - regex: 'M2101K7B(?:[GI]|NY)(?:[);/ ]|$)'
+      model: 'Redmi Note 10S'
+      device: 'phablet'
+    - regex: '(?:M2103K19[GC]|Redmi Note 10 5G)(?:[);/ ]|$)'
+      model: 'Redmi Note 10 5G'
+      device: 'phablet'
+    - regex: 'M2103K19I'
+      model: 'Redmi Note 10T 5G'
+      device: 'phablet'
+    - regex: 'XIG02(?:[);/ ]|$)'
+      model: 'Redmi Note 10 JE'
+      device: 'phablet'
+    - regex: '(?:M2101K6[GIRP]|M2104K10AC|Redmi Note 10 Pro(?! Max))(?:[);/ ]|$)'
+      model: 'Redmi Note 10 Pro'
+      device: 'phablet'
+    - regex: '21091116C(?:[);/ ]|$)'
+      model: 'Redmi Note 11 Pro'
+      device: 'phablet'
+    - regex: '21091116UC(?:[);/ ]|$)'
+      model: 'Redmi Note 11 Pro+'
+      device: 'phablet'
+    - regex: '21091116AC(?:[);/ ]|$)'
+      model: 'Redmi Note 11 5G'
+      device: 'phablet'
+    - regex: '(?:21121119SC|2201117T[GIY])(?:[);/ ]|$)'
+      model: 'Redmi Note 11 4G'
+      device: 'phablet'
+    - regex: '21091116(?:AI|I)(?:[);/ ]|$)'
+      model: 'Redmi Note 11T 5G'
+      device: 'phablet'
+    - regex: '(?:M1908C3JGG|Redmi Note 8 \(2021\))(?:[);/ ]|$)'
+      model: 'Redmi Note 8 (2021)'
+      device: 'phablet'
+    - regex: 'begonia(?:[);/ ]|$)'
       model: 'Redmi Note 8 Pro'
       device: 'phablet'
-
+    - regex: 'M1901F71(?:[);/ ]|$)'
+      model: 'Redmi Note 7S'
+      device: 'phablet'
+    - regex: 'Redmi Note (\d+) Pro Max(?:[);/ ]|$)'
+      model: 'Redmi Note $1 Pro Max'
+      device: 'phablet'
+    - regex: 'Redmi Note (\d+) Pro(?:[);/ ]|$)'
+      model: 'Redmi Note $1 Pro'
+      device: 'phablet'
     - regex: 'Redmi[ _]Note[ _]([^;/) ]+)?'
       model: 'Redmi Note $1'
       device: 'phablet'
     - regex: 'Redmi[ _]([^;/) ]+)?'
       model: 'Redmi $1'
     - regex: 'MI_NOTE_Pro'
-      model: 'MI Note Pro'
+      model: 'Mi Note Pro'
+      device: 'phablet'
+    - regex: 'Mi Note 10 Pro'
+      model: 'Mi Note 10 Pro'
+      device: 'phablet'
+    - regex: 'Mi Note 10 Lite'
+      model: 'Mi Note 10 Lite'
+      device: 'phablet'
+    - regex: 'Mi Note 10'
+      model: 'Mi Note 10'
       device: 'phablet'
     - regex: 'MI[ _]Note[ _]([^;/) ]+)?'
-      model: 'MI Note $1'
+      model: 'Mi Note $1'
       device: 'phablet'
-    - regex: '(MI(?:-One)?[ _](?:[^;/]*))Build'
-      model: '$1'
-    - regex: '(MI [a-z0-9]+|MI-One[ _]?[a-z0-9]+)(?:[);/ ]|$)'
-      model: '$1'
+
+    # specific feature phone models
+    - regex: 'Qin 1s\+'
+      model: 'Qin 1s+'
+
+    # general detections
+    - regex: 'MI[- ]One[ _]?Plus(?:[);/ ]|$)'
+      model: 'Mi One Plus'
+    - regex: 'Mi[- ]One[ _]?([a-z0-9]+)?(?: Build|[);])'
+      model: 'Mi One $1'
+    - regex: 'MI[ _]([^;/]*) Build'
+      model: 'Mi $1'
+    - regex: 'MI[ _]([a-z0-9]+)(?:[);/ ]|$)'
+      model: 'Mi $1'
     - regex: 'HM Note ([^/;]+) (?:Build|MIUI)'
       device: 'phablet'
       model: 'Note'
     - regex: 'HM ([^/;]+) (?:Build|MIUI)'
       model: 'HM $1'
-    - regex: 'Xiaomi[ _]([^/;]+)(?: Build|$)'
+    - regex: 'Xiaomi[ _-]([^/;]+)(?: Build|$)'
       model: '$1'
 
 # Xion
@@ -14384,12 +21175,18 @@ Xion:
 
 # Xolo
 Xolo:
-  regex: 'Xolo|(?:Q600|Q700s?|Q800|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])(?:[);/ ]|$)|BLACK-1XM'
+  regex: 'Xolo|(?:Q600|Q700s?|Q800|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05]|Era5X|Era[ _]2V|Era_4X(?:_2GB)?|BLACK-1XM|A1000s_Lite)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'BLACK-1XM'
       model: 'Black 1X'
-    - regex: '(Q600 Club|Q600|Q700s?|Q800|Q1000s Plus|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])(?:[);/ ]|$)'
+    - regex: 'Era_?([45])X(?:[);/ ]|$)'
+      model: 'Era $1X'
+    - regex: 'Era_4X_2GB(?:[);/ ]|$)'
+      model: 'Era 4X 2GB'
+    - regex: 'Era[ _]2V(?:[);/ ]|$)'
+      model: 'Era 2V'
+    - regex: '(Q600 Club|Q600|Q700s?|Q800|Q1000s Plus|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05]|A1000s_Lite)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Xolo[ _]?([^;/]+) Build'
       model: '$1'
@@ -14437,81 +21234,64 @@ Yarvik:
 
 # Yes
 'Yes':
-  regex: 'M631Y|M651G_MY|YES (MPY(?:48|54))'
+  regex: 'M631Y|M685Y4|M651G_MY|YES (?:Altitude 4|MPY(?:48|54))'
   device: 'smartphone'
   models:
     - regex: 'M631Y'
       model: 'Altitude'
     - regex: 'M651G_MY'
       model: 'Altitude 2'
-    - regex: 'YES (MPY(?:48|54))'
+    - regex: 'M685Y4'
+      model: 'Altitude 3'
+    - regex: 'YES (Altitude 4|MPY(?:48|54))'
       model: '$1'
 
 # Yezz
 Yezz:
-  regex: 'Yezz|ANDY[ _]|4E4|A5EI'
-  device: 'smartphone'
-  models:
-    - regex: 'ANDY_35E2I'
-      model: 'Andy 3.5E2I'
-    - regex: 'ANDY_35EI2'
-      model: 'Andy 3.5EI2'
-    - regex: 'Andy 3.5EI'
-      model: 'Andy 3.5EI'
-    - regex: 'ANDY_45EL'
-      model: 'Andy 4.5EL'
-    - regex: 'Andy 4.7T'
-      model: 'Andy 4.7T'
-    - regex: 'ANDY_4E2I'
-      model: 'Andy 4E2I'
+  regex: 'Yezz|ANDY[ _]|(?:4E4|A5EI|LIV1|LIV2[_ ]?LTE|ART2PRO)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
     - regex: '4E4'
       model: 'Andy 4E4'
-    - regex: 'ANDY_4EI2'
-      model: 'Andy 4EI2'
     - regex: 'Yezz-AC4EI'
       model: 'Andy 4EI'
     - regex: 'YEZZ-A4M'
       model: 'Andy A4M'
-    - regex: 'ANDY_4EL2_LTE'
-      model: 'Andy 4EL2 LTE'
-    - regex: 'Andy_55EI'
-      model: 'Andy 55EI'
-    - regex: 'ANDY_5EI'
-      model: 'Andy 5EI'
-    - regex: 'Andy 5EL2 LTE'
-      model: 'Andy 5EL2 LTE'
-    - regex: 'Andy_5ML_LTE'
-      model: 'Andy 5ML LTE'
-    - regex: 'Andy_5T'
-      model: 'Andy 5T'
-    - regex: 'A3.5EP'
-      model: 'Andy A3.5EP'
     - regex: 'A5EI'
       model: 'Andy A5EI'
-    - regex: 'ANDY_C5QL'
-      model: 'Andy C5QL'
-    - regex: 'ANDY_5EL'
-      model: 'Andy 5EL'
-    - regex: 'ANDY[_ ]5EI'
-      model: 'Andy 5EI'
+    - regex: 'ART2PRO'
+      model: 'Art 2 Pro'
+    - regex: 'LIV1'
+      model: 'LIV1'
+    - regex: 'LIV2[_ ]?LTE'
+      model: 'LIV2 LTE'
+
+    - regex: 'Andy[ _]([A-Z]*[0-9]\.[0-9][A-Z0-9]*)(?:[ _](LTE))?'
+      model: 'Andy $1 $2'
+    - regex: 'Andy[ _]([A-Z]*[0-9])([0-9][A-Z0-9]*)(?:[ _](LTE))?'
+      model: 'Andy $1.$2 $3'
+    - regex: 'Andy[ _]([A-Z]*[0-9][A-Z0-9]+)(?:[ _](LTE))?'
+      model: 'Andy $1 $2'
 
 # Yu
 Yu:
-  regex: '(?:YU5[05]10[A]?|YU4711|AO5510|YU5050|YU5014)(?:[);/ ]|$)'
+  regex: '(?:YU5[05]10[A]?|YU4711|AO5510|YU5050|YU501[14]|YU5551)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'YU5010[A]?(?:[);/ ]|$)'
       model: 'Yuphoria'
+    - regex: 'YU5011(?:[);/ ]|$)'
+      model: 'Yunique 2'
     - regex: 'YU5050(?:[);/ ]|$)'
       model: 'Yutopia'
     - regex: 'AO5510(?:[);/ ]|$)'
       model: 'Yureka'
+    - regex: 'YU5551(?:[);/ ]|$)'
+      model: 'Yureka 2'
     - regex: 'YU5510[A]?(?:[);/ ]|$)'
       model: 'Yureka Plus'
     - regex: 'YU4711(?:[);/ ]|$)'
       model: 'Yunique'
-    - regex: 'YU4711(?:[);/ ]|$)'
-      model: 'Yunique'
     - regex: 'YU5014(?:[);/ ]|$)'
       model: 'Ace'
 
@@ -14630,78 +21410,39 @@ ZYQ:
       model: 'Q88'
       device: 'tablet'
 
-
-# Toshiba
-Toshiba:
-  regex: 'Toshiba|TSBNetTV/|portalmmm/[12].0 TS|T-01C|T-0[12]D|IS04|IS11T|AT1S0|AT300SE|AT(7-C|10-A|10[PL]E-A|100|200|270|300|330|374|400|470|500|503|570|703|830)'
-  device: 'smartphone'
-  models:
-    # explicit smartphone models
-    - regex: 'T-01C'
-      model: 'Regza T-01C'
-    - regex: 'T-01D'
-      model: 'Regza T-01D'
-    - regex: 'T-02D'
-      model: 'Regza T-02D'
-    - regex: 'IS04'
-      model: 'Regza IS04'
-    - regex: 'IS11T'
-      model: 'Regza IS11T'
-
-    # explicit tablet models
-    - regex: 'AT7-C'
-      model: 'Excite'
-      device: 'tablet'
-    - regex: 'AT1S0'
-      model: 'Regza AT1S0'
-      device: 'tablet'
-    - regex: 'AT300SE'
-      model: 'Regza AT300SE'
-      device: 'tablet'
-    - regex: 'AT500a'
-      model: 'Regza AT500a'
-      device: 'tablet'
-    - regex: 'AT(100|200|270|300|330|374|400|470|500|503|570|703|830)'
-      model: 'Regza AT$1'
-      device: 'tablet'
-    - regex: 'AT10([PL])E-A'
-      model: 'Excite AT10$1-A'
-      device: 'tablet'
-    - regex: 'AT10-A'
-      model: 'Excite AT10-A'
-      device: 'tablet'
-
-    - regex: 'TSBNetTV/'
-      device: 'tv'
-      model: ''
-    - regex: 'Toshiba[ /_\-]?([a-z0-9_ \-]+) Build'
-      model: '$1'
-    - regex: 'Toshiba[ /_\-]?([a-z0-9_\-]+)'
-      model: '$1'
-    - regex: 'portalmmm/[12].0 (TS[a-z0-9 ]+)'
-      model: '$1'
-
 # Vivax (www.vivax.com)
 Vivax:
-  regex: 'VIVAX|(?:Fly5[_ ]Lite|Fun[_ ]S500|Point_X2)(?:[);/ ]|$)'
+  regex: 'VIVAX|(?:Fly5[_ ]Lite|Fun[_ ]S500|Point[_ ](?:X[12]|X501|X450)|PRO3|32LE77SM|40LE77SM|FUN S1|FUN_S20)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Fly5[_ ]Lite(?:[);/ ]|$)'
       model: 'Fly 5 Lite'
-    - regex: 'Point_X2'
-      model: 'Point X2'
+    - regex: 'Point_X([12])(?:[);/ ]|$)'
+      model: 'Point X$1'
     - regex: 'Fun[_ ]S500(?:[);/ ]|$)'
       model: 'Fun S500'
-    - regex: 'VIVAX[ _]Fly3(?:[);/ ]|$)'
-      model: 'Fly 3'
-    - regex: 'VIVAX (Point X551)(?:[);/ ]|$)'
+    - regex: 'FUN[ _]S(1|20)(?:[);/ ]|$)'
+      model: 'Fun S$1'
+    - regex: 'VIVAX[ _]Fly ?(\d)(?:[);/ ]|$)'
+      model: 'Fly $1'
+    - regex: 'VIVAX[ _]Fly[ _]V(1|550)(?:[);/ ]|$)'
+      model: 'Fly V$1'
+    - regex: '(?:VIVAX )?(Point[ _](?:X551|X501|X450))(?:[);/ ]|$)'
       model: '$1'
     - regex: 'SMART Point X5010(?:[);/ ]|$)'
       model: 'Smart Point X5010'
+    - regex: 'VIVAX[_ ]PRO3'
+      model: 'Pro 3'
+    - regex: 'VIVAX (?:TABLET )?TPC[-_ ](\d+) ([34])G(?:[);/ ]|$)'
+      model: 'TPC-$1 $2G'
+
+    - regex: '(32LE77SM|40LE77SM)'
+      device: 'tv'
+      model: '$1'
 
-# MLS
-MLS:
-  regex: 'IQ(?:0705|L550|1010w?|1012N?|1019N|1025|1380|1401|1436|1452a|1453|1470|1502a|1511|1552|1553|1568|1570|1805N|1806|1808|1810B_M|1832|1850|1890|5017|9610|181011N|E[12]00|EL41|G550|GW516|L30|L5[01]|M801|M1001|N700|P50|R300|S300|S1001|W503|W511T|W553N?|W60[38]|W626|M960|D700|9013_4N)(?:[);/ ]|$)'
+# MLS or Making Life Simple (mlsinnovation.com)
+MLS: #iQ
+  regex: 'IQ(?:0705|L550|1010w?|1012N?|1019N|1025|1060M|1380|1401|1436|1452a|1453|1470|1502a|1511|1552|1553|1568|1570|1805N|1806|1808|1810B_M|1832|1850|1890|5017|L626|9610|181011N|A27X_E|E[12]00|EL41|G550|GW516|L30|L5[01]|M801|M1001|N700|P50|R300|S300|S1001|W503|W511T|W553N?|W60[38]|W626|M960|D700|9013_4N)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IQ0705(?:[);/ ]|$)'
@@ -14785,6 +21526,8 @@ MLS:
       model: 'Energy 4G'
     - regex: 'iQE200(?:[);/ ]|$)'
       model: 'MX 4G'
+    - regex: 'iQA27X_E(?:[);/ ]|$)'
+      model: 'MX (2019)'
     - regex: 'IQEL41(?:[);/ ]|$)'
       model: 'Fab 4G'
     - regex: 'IQL30(?:[);/ ]|$)'
@@ -14808,6 +21551,9 @@ MLS:
     - regex: 'IQS1001(?:[);/ ]|$)'
       model: 'Vista 4G' ## Gold
       device: 'tablet'
+    - regex: 'iQ1060M(?:[);/ ]|$)'
+      model: 'Space S 4G'
+      device: 'tablet'
     - regex: 'IQR300(?:[);/ ]|$)'
       model: 'R3 4G'
     - regex: 'IQW608(?:[);/ ]|$)'
@@ -14821,14 +21567,33 @@ MLS:
       model: 'Liberal'
     - regex: 'IQW553N?(?:[);/ ]|$)'
       model: 'Alu 5.5"'
+    - regex: 'iQL626?(?:[);/ ]|$)'
+      model: 'Pop 4G'
     - regex: 'IQW503(?:[);/ ]|$)'
       model: 'Flame 4G (2018)'
     - regex: 'iQD700(?:[);/ ]|$)'
       model: 'Color Fingerprint 4G'
 
+# MMI
+MMI:
+  regex: 'MMI, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: '$1'
+
+# FLYCAT
+FLYCAT:
+  regex: 'FLYCAT'
+  device: 'smartphone'
+  models:
+    - regex: 'OPTIMUM (500[1-4]|5501)'
+      model: 'Optimum $1'
+    - regex: 'UNICUM (1002|8S|8003)'
+      device: 'tablet'
+      model: 'Unicum $1'
+
 # Fly
 Fly:
-  regex: 'Fly(?!Flow|touch)|Power Plus 5000|Photo Pro|Slimline|Life (?:Ace|Jet|Sky|Compact 4G)|FS50[1-9]|FS51[0-8]|FS52[0-9]|FS530|FS55[134]|FS40[1-9]|FS45[1-9]|4FS06|MERIDIAN-|(?:IQ(?!10[134]0)[0-9]{3,}[i]?)[ _]?(?:Quad|Firebird|Quattro|Turbo|Magic)?(?:[);/ ]|$)'
+  regex: 'Fly(?!Flow|touch)|Power Plus 5000|Photo Pro|Slimline|Life (?:Ace|Jet|Sky|Compact 4G|Geo|Zen|Play)|FS50[1-9]|FS51[0-8]|FS52[0-9]|FS530|FS55[134]|FS40[1-9]|FS45[1-9]|4FS06|MERIDIAN-|(?:IQ(?!10[134]0)[0-9]{3,}[i]?)[ _]?(?:Quad|Firebird|Quattro|Turbo|Magic)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:Fly_)?IQ310(?:[);/ ]|$)'
@@ -14849,6 +21614,14 @@ Fly:
       model: 'Life Jet'
     - regex: 'Life Sky(?:[);/ ]|$)'
       model: 'Life Sky'
+    - regex: 'Life Geo(?:[);/ ]|$)'
+      model: 'Life Geo'
+    - regex: 'Life Zen(?:[);/ ]|$)'
+      model: 'Life Zen'
+    - regex: 'Life Play(?:[);/ ]|$)'
+      model: 'Life Play'
+    - regex: 'Life Buzz(?:[);/ ]|$)'
+      model: 'Life Buzz'
     - regex: 'Life Compact 4G(?:[);/ ]|$)'
       model: 'Life Compact 4G'
     - regex: 'FS506'
@@ -15032,7 +21805,7 @@ Fly:
     - regex: 'Fly[ _\-]?([a-z0-9_]+)/'
       model: '$1'
       device: 'feature phone'
-    - regex: 'Flylife[ _\-]?([^/;]+) Build'
+    - regex: 'Flylife[ _\-]?([^/;]+)(?: Build|[;)])'
       model: 'Flylife $1'
       device: 'tablet'
     - regex: 'Fly[ _\-]?([a-z0-9]+)'
@@ -15051,41 +21824,55 @@ FinePower:
     - regex: 'FinePower[_ ]?([CD][1-9])(?:[);/ ]|$)'
       model: '$1'
 
-# Freetel
+# Freetel (freetel.jp)
 Freetel:
-  regex: '(?:FTJ17A00|FTJ152[ABCD]|FT141B|FT142D_LTEXM|FT142A?|FTJ161[AB]|FTJ1[56]2E|FTJ162D|FTE161[GE])(?:[);/ ]|$)'
-  device: 'smartphone'
-  models:
-   - regex: 'FTJ152C'
-     model: 'Samurai Miyabi'
-   - regex: 'FTJ17A00(?:[);/ ]|$)'
-     model: 'Rei 2 Dual'
-   - regex: 'FTJ161A'
-     model: 'Musashi'
-   - regex: 'FTE161E'
-     model: 'Ice 2'
-   - regex: 'FTE161G'
-     model: 'Ice 2 Plus'
-   - regex: 'FTJ162E'
-     model: 'Raijin'
-   - regex: 'FT141B'
-     model: 'Nico'
-   - regex: 'FT142D_LTEXM'
-     model: 'XM'
-   - regex: 'FT142A?'
-     model: 'Priori 2'
-   - regex: 'FTJ152A'
-     model: 'Priori 3'
-   - regex: 'FTJ162D'
-     model: 'Priori 4'
-   - regex: 'FTJ152B'
-     model: 'Priori 3S LTE'
-   - regex: 'FTJ152D'
-     model: 'Samurai Kiwami'
-   - regex: 'FTJ161B'
-     model: 'Samurai Rei'
-   - regex: 'FTJ152E'
-     model: 'Katana 1'
+  regex: '(?:FTJ17[AC]00|FTJ152[ABCD]|FTU18A00|FT141B|FT142D(?:_LTEXM)?|FT142A?|FTJ161[AB]|FTJ1[56]2E|FTJ162[BD]|FTE161[GE])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'FTJ152C'
+      model: 'Samurai Miyabi'
+    - regex: 'FTJ17A00(?:[);/ ]|$)'
+      model: 'Rei 2 Dual'
+    - regex: 'FTJ17C00(?:[);/ ]|$)'
+      model: 'Priori 5'
+    - regex: 'FTU18A00(?:[);/ ]|$)'
+      model: 'Cricket Wave'
+    - regex: 'FTJ161A'
+      model: 'Musashi'
+    - regex: 'FTE161E'
+      model: 'Ice 2'
+    - regex: 'FTE161G'
+      model: 'Ice 2 Plus'
+    - regex: 'FTJ162E'
+      model: 'Raijin'
+    - regex: 'FT141B'
+      model: 'Nico'
+    - regex: 'FT142D(?:_LTEXM)?(?:[);/ ]|$)'
+      model: 'XM'
+    - regex: 'FT142A?'
+      model: 'Priori 2'
+    - regex: 'FTJ152A'
+      model: 'Priori 3'
+    - regex: 'FTJ162D'
+      model: 'Priori 4'
+    - regex: 'FTJ152B'
+      model: 'Priori 3S LTE'
+    - regex: 'FTJ152D'
+      model: 'Samurai Kiwami'
+    - regex: 'FTJ162B'
+      model: 'Samurai Kiwami 2'
+    - regex: 'FTJ161B'
+      model: 'Samurai Rei'
+    - regex: 'FTJ152E'
+      model: 'Katana 1'
+
+# Western Digital
+Western Digital:
+  regex: 'Westerndigital|WDSimpleBrowser'
+  device: 'tv'
+  models:
+    - regex: 'Streamer2010'
+      model: 'Streamer (2010)'
 
 # Zeemi
 Zeemi:
@@ -15113,79 +21900,187 @@ Zenek:
     - regex: 'Z5516'
       model: 'Zebra'
 
-# Zopo
-Zopo:
-  regex: 'ZOPO|(?:ZOPO[_ ])?(Flash X3|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
+# Nubia (www.nubia.com)
+Nubia:
+  regex: 'Nubia[ _]|(?:NX(?:403A|404H|406E|40[X2]|503A|50[5678]J|51[0123]J|521J|523J_V1|529Jq?|5[345]1J|5[48]9J|569[HJ]|5[67]3J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|6[126]9J|66[67]J|907J))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'NX667J'
+      model: 'Z30 Pro'
+    - regex: 'NX669J'
+      model: 'Red Magic 6'
+    - regex: 'NX666J'
+      model: 'Red Magic 6R'
+    - regex: 'NX619J'
+      model: 'Red Magic Mars'
+    - regex: 'NX629J'
+      model: 'Red Magic 3'
+    - regex: 'NX40[X2]'
+      model: 'Z5 Mini'
+    - regex: 'NX(403[AE]|406E|404H)'
+      model: 'Z5S Mini'
+    - regex: 'NX503A'
+      model: 'Z5S'
+    - regex: 'NX506J'
+      model: 'Z7'
+    - regex: 'NX507J'
+      model: 'Z7 Mini'
+    - regex: 'NX505J'
+      model: 'Z7 Max'
+    - regex: 'NX508J'
+      model: 'Z9'
+    - regex: '(NX5[12]1J|Nubia Z9 mini)'
+      model: 'Z9 Mini'
+    - regex: '(NX510J|Nubia Z9 Max)'
+      model: 'Z9 Max'
+    - regex: 'NX512J'
+      model: 'Z9 Max Dual'
+    - regex: 'NX531J'
+      model: 'Z11'
+    - regex: 'NX523J_V1'
+      model: 'Z11 Max'
+    - regex: '(?:NX549J|Nubia Z11 mini S)'
+      model: 'Z11 Mini S'
+    - regex: '(?:NX529Jq?|Nubia Z11 mini)'
+      model: 'Z11 Mini'
+    - regex: 'NX606J'
+      model: 'Z18'
+    - regex: 'NX616J'
+      model: 'Z18S'
+    - regex: 'NX611J'
+      model: 'Z18 Mini'
+    - regex: 'NX551J'
+      model: 'M2'
+    - regex: 'NX563J'
+      model: 'Z17'
+    - regex: 'NX569[HJ]'
+      model: 'Z17 Mini'
+    - regex: 'NX589J'
+      model: 'Z17 Mini S'
+    - regex: 'NX591J'
+      model: 'Z17 Lite'
+    - regex: 'NX595J'
+      model: 'Z17S'
+    - regex: 'NX612J'
+      model: 'V18'
+    - regex: 'NX627J'
+      model: 'Z20'
+    - regex: 'NX513J'
+      model: 'My Prague'
+    - regex: 'NX601J'
+      model: 'X6'
+    - regex: 'NX609J'
+      model: 'Red Magic'
+    - regex: 'NX659J'
+      model: 'Red Magic 5G'
+    - regex: 'NX651J'
+      model: 'Play'
+    - regex: 'NX573J'
+      model: 'M2 Lite'
+    - regex: 'NX907J'
+      model: 'M2 Play'
+    - regex: 'NX541J'
+      model: 'N1'
+    - regex: 'NX597J'
+      model: 'N1 Lite'
+    - regex: 'NX575J'
+      model: 'N2'
+    - regex: 'NX6(?:08|17)J'
+      model: 'N3'
+    - regex: 'Nubia 8011'
+      model: 'N80'
+    - regex: 'Nubia[_ ]([^;)/]+)( build|[;)])'
+      model: '$1'
+
+# Rakuten (network.mobile.rakuten.co.jp)
+Rakuten:
+  regex: '(?:ZR01|3917JR|P710|C330)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(ZOPO_C2_MOD|ZP998)(?:[);/ ]|$)'
-      model: 'C2 II'
-    - regex: '(?:ZOPO_)?ZP980[+](?:[);/ ]|$)'
-      model: 'ZP980+'
-    - regex: '(?:ZOPO_)?ZP980(?:[);/ ]|$)'
-      model: 'Scorpio'
-    - regex: 'ZP952(?:[);/ ]|$)'
-      model: 'Speed 7 Plus'
-    - regex: 'ZP951(?:[);/ ]|$)'
-      model: 'Speed 7'
-    - regex: 'ZP955(?:[);/ ]|$)'
-      model: 'Speed 8'
-    - regex: 'ZP950[+h]?(?:[);/ ]|$)'
-      model: 'Leader Max'
-    - regex: 'ZP(?:900H?|910)(?:[);/ ]|$)'
-      model: 'Leader'
-    - regex: 'ZP(?:800H|810)(?:[);/ ]|$)'
-      model: 'Libero HD'
-    - regex: 'ZP500[+]?(?:[);/ ]|$)'
-      model: 'Libero'
-    - regex: 'ZP330(?:[);/ ]|$)'
-      model: 'Color C'
-    - regex: 'ZP370(?:[);/ ]|$)'
-      model: 'Color S'
-    - regex: 'ZP5(63|86)(?:[);/ ]|$)'
-      model: 'Color X'
-    - regex: 'ZP567(?:[);/ ]|$)'
-      model: 'Color C5i'
-    - regex: 'ZP300[S+]?(?:[);/ ]|$)'
-      model: 'Field'
-    - regex: 'ZP200[+]?(?:[);/ ]|$)'
-      model: 'Shining'
-    - regex: 'ZP100(?:[);/ ]|$)'
-      model: 'Pilot'
-    - regex: 'ZP1790(?:[);/ ]|$)'
-      model: 'Flash X2'
-    - regex: 'ZP781(?:[);/ ]|$)'
-      model: 'Flash G5 Plus'
-    - regex: '(Flash X3|ZP[0-9]{2,}[^/;)]+)(?: Build|\))'
-      model: '$1'
+    - regex: 'ZR01'
+      model: 'Big'
+    - regex: '3917JR'
+      model: 'Big S'
+    - regex: 'P710'
+      model: 'Hand'
+    - regex: 'C330'
+      model: 'C330 Mini'
 
 # ZTE
 ZTE:
-  regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[35] 2019-T|A6 MAX|A0622|X9)|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|dandelion|901ZT|A001ZT|Z-01K)(?:[);/ ]|$)'
+  regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade[ _](?:E01|V0820|L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|320|460|465|475|510|520|530|602|51|30|3)|V580|V Ultra|Q Lux)|N9[15]8St|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:5151V|610DL|6400C|6410S|233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|992|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|V769M|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A[357] 2019-T|A[35] 2020-T|A7S 2020-T|A6 MAX|A0622|X9)|Z3153V|Z836F|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|P650 Pro|dandelion|901ZT|A00[13]ZT|Z-01K|UZTE (?:GRAND V7|V808)|ZTG01|K8[37]CA|VERGATARIO ?5(?:PLUS)?|Axon mini|KIS C341|A103ZT|Z3351S|Z5156CC|B867RE|MEO Smart A80|P651 2021)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
+    - regex: 'P651 2021(?:[);/ ]|$)'
+      model: 'P651 (2021)'
+    - regex: '7530N(?:[);/ ]|$)'
+      model: 'Voyage 10'
+    - regex: 'A2122H(?:[);/ ]|$)'
+      model: 'S30 Pro 5G'
     - regex: '602ZT(?:[);/ ]|$)'
       model: 'Libero 2'
     - regex: 'A001ZT(?:[);/ ]|$)'
       model: 'Libero 3'
+    - regex: 'A003ZT(?:[);/ ]|$)'
+      model: 'Libero 5G'
+    - regex: 'A103ZT(?:[);/ ]|$)'
+      model: 'Libero 5G II'
     - regex: '901ZT(?:[);/ ]|$)'
       model: 'Libero S10'
-    - regex: 'ZTE 2050(?:[);/ ]|$)'
+    - regex: 'ZTG01(?:[);/ ]|$)'
+      model: 'A1'
+    - regex: 'ZTE T221(?:[);/ ]|$)'
+      model: 'Blade AF3'
+    - regex: 'A0616(?:[);/ ]|$)'
+      model: 'Blade A3'
+    - regex: '(?:A7020(?:RU)?|Blade A7S 2020-T)(?:[);/ ]|$)'
+      model: 'Blade A7s (2020)'
+    - regex: 'A7000(?:[);/ ]|$)'
+      model: 'Blade A7 (2020)'
+    - regex: 'A7030'
+      model: 'Blade A71'
+    - regex: 'A0722(?:[);/ ]|$)'
+      model: 'Blade A7 Vita'
+    - regex: 'Blade 10 Vita(?:[);/ ]|$)'
+      model: 'Blade 10 Vita'
+    - regex: 'ZTE (?:2050|V1050)(?:RU)?'
       model: 'Blade 20 Smart'
-    - regex: '902ZT(?:[);/ ]|$)'
+    - regex: 'ZTE Axon 7(?:[);/ ]|$)'
+      model: 'Axon 7'
+    - regex: 'A2019G? Pro(?:[);/ ]|$)'
+      model: 'Axon 9 Pro'
+    - regex: '(?:902ZT|A2020N3 Pro)(?:[);/ ]|$)'
       model: 'Axon 10 Pro 5G'
+    - regex: 'A2021[LG]?(?:[);/ ]|$)'
+      model: 'Axon 11 5G'
+    - regex: 'A2021E?(?:[);/ ]|$)'
+      model: 'Axon 11'
+    - regex: 'A2022H'
+      model: 'Axon 31 Pro 5G'
+    - regex: 'A2022PG'
+      model: 'Axon 30 Ultra'
+    - regex: 'A2022P'
+      model: 'Axon 30 Pro 5G'
+    - regex: 'A2022'
+      model: 'Axon 30 Pro'
+    - regex: 'A2322G'
+      model: 'Axon 30 5G'
+    - regex: 'A2322'
+      model: 'Axon 30'
     - regex: 'N799D(?:[);/ ]|$)'
       model: 'Blade Eg'
     - regex: 'Z818L(?:[);/ ]|$)'
       model: 'Allstar'
     - regex: 'Z3001S(?:[);/ ]|$)'
       model: 'Quest Plus'
+    - regex: 'Z3351S(?:[);/ ]|$)'
+      model: 'Quest 5'
     - regex: 'Ctyon-A9(?:[);/ ]|$)'
       model: 'Ctyon A9'
     - regex: 'K3DX-V5G(?:[);/ ]|$)'
       model: 'V5G'
-    - regex: 'N918St(?:[);/ ]|$)'
+    - regex: '(?:ZTE)?N918St(?:[);/ ]|$)'
       model: 'V5S'
     - regex: 'N958St(?:[);/ ]|$)'
       model: 'V5 Max'
@@ -15195,6 +22090,8 @@ ZTE:
       model: 'Imperial Max'
     - regex: 'N9120(?:[);/ ]|$)'
       model: 'Avid'
+    - regex: 'Z5156CC(?:[);/ ]|$)'
+      model: 'Avid 579'
     - regex: 'N9130(?:[);/ ]|$)'
       model: 'Speed'
     - regex: 'N9132(?:[);/ ]|$)'
@@ -15207,6 +22104,8 @@ ZTE:
       model: 'V5'
     - regex: 'N9510(?:[);/ ]|$)'
       model: 'Warp 4G'
+    - regex: 'Z5151V(?:[);/ ]|$)'
+      model: 'Visible R2'
     - regex: 'N9517(?:[);/ ]|$)'
       model: 'Blade Force'
     - regex: 'Z559DL(?:[);/ ]|$)'
@@ -15215,6 +22114,8 @@ ZTE:
       model: 'Blade Q+'
     - regex: 'Blade Q Lux(?:[);/ ]|$)'
       model: 'Blade Q Lux'
+    - regex: 'ZTE T320(?:[);/ ]|$)'
+      model: 'Blade GF3'
     - regex: 'N9515(?:[);/ ]|$)'
       model: 'Warp Sync'
     - regex: 'N9519(?:[);/ ]|$)'
@@ -15227,82 +22128,6 @@ ZTE:
       model: 'Max XL'
     - regex: 'N9810(?:[);/ ]|$)'
       model: 'Vital'
-    - regex: 'NX40[X2](?:[);/ ]|$)'
-      model: 'Nubia Z5 mini'
-    - regex: 'NX(403[AE]|406E|404H)(?:[);/ ]|$)'
-      model: 'Nubia Z5S Mini'
-    - regex: 'NX503A(?:[);/ ]|$)'
-      model: 'Nubia Z5S'
-    - regex: 'NX506J(?:[);/ ]|$)'
-      model: 'Nubia Z7'
-    - regex: 'NX507J(?:[);/ ]|$)'
-      model: 'Nubia Z7 mini'
-    - regex: 'NX505J(?:[);/ ]|$)'
-      model: 'Nubia Z7 max'
-    - regex: 'NX508J(?:[);/ ]|$)'
-      model: 'Nubia Z9'
-    - regex: '(NX5[12]1J|Nubia Z9 mini)(?:[);/ ]|$)'
-      model: 'Nubia Z9 mini'
-    - regex: '(NX510J|Nubia Z9 Max)(?:[);/ ]|$)'
-      model: 'Nubia Z9 max'
-    - regex: 'NX512J(?:[);/ ]|$)'
-      model: 'Nubia Z9 max dual'
-    - regex: 'NX531J(?:[);/ ]|$)'
-      model: 'Nubia Z11'
-    - regex: 'NX523J_V1'
-      model: 'Nubia Z11 Max'
-    - regex: 'NX529J(?:[);/ ]|$)'
-      model: 'Nubia Z11 mini'
-    - regex: '(?:NX549J|Nubia Z11 mini S)(?:[);/ ]|$)'
-      model: 'Nubia Z11 mini S'
-    - regex: 'NX606J(?:[);/ ]|$)'
-      model: 'Nubia Z18'
-    - regex: 'NX616J(?:[);/ ]|$)'
-      model: 'Nubia Z18S'
-    - regex: 'NX611J(?:[);/ ]|$)'
-      model: 'Nubia Z18 mini'
-    - regex: 'NX551J(?:[);/ ]|$)'
-      model: 'Nubia M2'
-    - regex: 'NX563J(?:[);/ ]|$)'
-      model: 'Nubia Z17'
-    - regex: 'NX569[HJ](?:[);/ ]|$)'
-      model: 'Nubia Z17 Mini'
-    - regex: 'NX589J(?:[);/ ]|$)'
-      model: 'Nubia Z17 Mini S'
-    - regex: 'NX591J(?:[);/ ]|$)'
-      model: 'Nubia Z17 Lite'
-    - regex: 'NX595J'
-      model: 'Nubia Z17S'
-    - regex: 'NX612J(?:[);/ ]|$)'
-      model: 'Nubia V18'
-    - regex: 'NX627J'
-      model: 'Nubia Z20'
-    - regex: 'NX513J(?:[);/ ]|$)'
-      model: 'Nubia My Prague'
-    - regex: 'NX601J(?:[);/ ]|$)'
-      model: 'Nubia X6'
-    - regex: 'NX609J(?:[);/ ]|$)'
-      model: 'Nubia Red Magic'
-    - regex: 'NX659J(?:[);/ ]|$)'
-      model: 'Nubia Red Magic 5G'
-    - regex: 'NX651J(?:[);/ ]|$)'
-      model: 'Nubia Play'
-    - regex: 'NX619J(?:[);/ ]|$)'
-      model: 'Nubia Red Magic Mars'
-    - regex: 'NX629J(?:[);/ ]|$)'
-      model: 'Nubia Red Magic 3'
-    - regex: 'NX573J'
-      model: 'Nubia M2 Lite'
-    - regex: 'NX907J(?:[);/ ]|$)'
-      model: 'Nubia M2 Play'
-    - regex: 'NX541J'
-      model: 'Nubia N1'
-    - regex: 'NX597J'
-      model: 'Nubia N1 Lite'
-    - regex: 'NX575J'
-      model: 'Nubia N2'
-    - regex: 'NX6(08|17)J(?:[);/ ]|$)'
-      model: 'Nubia N3'
     - regex: '[UV]9180(?:[);/ ]|$)'
       model: 'V5 Red Bull'
     - regex: '[UV]9815(?:[);/ ]|$)'
@@ -15313,6 +22138,12 @@ ZTE:
       model: 'Blade C'
     - regex: 'V809'
       model: 'Blade C2'
+    - regex: 'ZTE[_ ]Blade[_ ](C2|V7)[_ ]Plus'
+      model: 'Blade $1 Plus'
+    - regex: 'Blade G Plus'
+      model: 'Blade G Plus'
+    - regex: 'ZTE_Blade_III'
+      model: 'Blade III'
     - regex: '(?:ZTE_)?V829'
       model: 'Blade G Pro'
     - regex: 'V882'
@@ -15331,6 +22162,8 @@ ZTE:
       model: 'Grand X Max+'
     - regex: '(?:ZTE_)?Grand[ _]Era'
       model: 'Grand Era'
+    - regex: 'UZTE GRAND V7' # UZTE
+      model: 'Grand V7'
     - regex: 'V788D'
       model: 'Kis Plus'
     - regex: 'Z331(?:[);/ ]|$)'
@@ -15345,11 +22178,11 @@ ZTE:
       model: 'Optus X Wave'
     - regex: 'Optus X Start(?:[);/ ]|$)'
       model: 'Optus X Start'
-    - regex: 'Blade (A(0620|310|452|460|462|465|475|510|512|520|530|602|612|910)|L110|V0730|V0800|V580|V1000)(?:[);/ ]|$)'
-      model: 'Blade $1'
+    - regex: 'BA520(?:[);/ ]|$)'
+      model: 'Blade A520'
     - regex: 'Blade L2 Plus(?:[);/ ]|$)'
       model: 'Blade L2 Plus'
-    - regex: 'Blade L2(?:[);/ ]|$)'
+    - regex: '(?:ZTE_)?Blade[ _]L2(?:[);/ ]|$)'
       model: 'Blade L2'
     - regex: 'Blade L3 Plus(?:[);/ ]|$)'
       model: 'Blade L3 Plus'
@@ -15357,63 +22190,87 @@ ZTE:
       model: 'Blade L3 Apex'
     - regex: 'Blade L3(?:[);/ ]|$)'
       model: 'Blade L3'
-    - regex: 'Blade L5 Plus(?:[);/ ]|$)'
+    - regex: 'ZTE[ _]T610(?:[);/ ]|$)'
+      model: 'Blade L4'
+    - regex: 'ZTE[ _]Blade L4 Pro(?:[);/ ]|$)'
+      model: 'Blade L4 Pro'
+    - regex: '(?:Blade L5 Plus|BLADE L0510)(?:[);/ ]|$)'
       model: 'Blade L5 Plus'
-    - regex: 'Blade L5(?:[);/ ]|$)'
-      model: 'Blade L5'
     - regex: 'Blade L6(?:[);/ ]|$)'
       model: 'Blade L6'
     - regex: 'Blade L7A(?:[);/ ]|$)'
       model: 'Blade L7A'
-    - regex: 'Blade L7(?:[);/ ]|$)'
-      model: 'Blade L7'
-    - regex: 'Blade L8(?:RU)?(?:[);/ ]|$)'
-      model: 'Blade L8'
-    - regex: 'Blade A3 2019-T(?:[);/ ]|$)'
-      model: 'Blade A3 (2019)'
-    - regex: 'Blade A5 2019-T(?:[);/ ]|$)'
-      model: 'Blade A5 (2019)'
+    - regex: 'Blade L(\d+)(?:RU)?'
+      model: 'Blade L$1'
+    - regex: 'Blade A([357]) (20(?:19|20))'
+      model: 'Blade A$1 ($2)'
+    - regex: 'ZTE BV0720(?:[);/ ]|$)'
+      model: 'Blade A2'
+    - regex: 'Blade A[35] 2020-T(?:[);/ ]|$)'
+      model: 'Blade A$1 (2020)'
+    - regex: 'ZTE C880A(?:[);/ ]|$)'
+      model: 'Blade A1'
+    - regex: 'Blade A([35]1?) Lite'
+      model: 'Blade A$1 Lite'
+    - regex: 'Blade (S6|A[35]1?) Plus'
+      model: 'Blade $1 Plus'
     - regex: 'BLADE A0622(?:[);/ ]|$)'
       model: 'Blade A6'
-    - regex: 'BLADE A6 MAX(?:[);/ ]|$)'
+    - regex: 'BLADE (?:A6 MAX|A0605)(?:[);/ ]|$)'
       model: 'Blade A6 Max'
-    - regex: 'Blade S6 Plus(?:[);/ ]|$)'
-      model: 'Blade S6 Plus'
+    - regex: 'A0622(?:[);/ ]|$)'
+      model: 'Blade A6 Lite'
     - regex: 'Blade S6(?:[);/ ]|$)'
       model: 'Blade S6'
+    - regex: 'BLADE A5 PRO(?:[);/ ]|$)'
+      model: 'Blade A5 Pro'
     - regex: 'T920(?:[);/ ]|$)'
       model: 'Blade S7'
+    - regex: 'ZTE[ _]T617(?:[);/ ]|$)'
+      model: 'Blade D Lux'
+    - regex: 'Blade L210'
+      model: 'Blade L210'
     - regex: 'BLADE V Ultra(?:[);/ ]|$)'
       model: 'Blade V Ultra'
     - regex: 'Blade V6 MAX(?:[);/ ]|$)'
       model: 'Blade V6 Max'
     - regex: 'Blade V6 Plus(?:[);/ ]|$)'
       model: 'Blade V6 Plus'
-    - regex: 'Blade V6(?:[);/ ]|$)'
-      model: 'Blade V6'
     - regex: 'Blade (?:V7 Lite|V0720)(?:[);/ ]|$)'
       model: 'Blade V7 Lite'
-    - regex: 'Blade V7(?:[);/ ]|$)'
+    - regex: 'BLADE V0710(?:[);/ ]|$)'
       model: 'Blade V7'
-    - regex: 'Blade X7(?:[);/ ]|$)'
-      model: 'Blade X7'
-    - regex: 'Blade X9(?:[);/ ]|$)'
-      model: 'Blade X9'
-    - regex: 'Blade V8Q(?:[);/ ]|$)'
+    - regex: 'Blade V([67])(?:[);/ ]|$)'
+      model: 'Blade V$1'
+    - regex: 'BV0800(?:[);/ ]|$)'
+      model: 'Blade V8'
+    - regex: 'ZTE Blade V1000|(?:ZTE_)?V1000'
+      model: 'Blade V10'
+    - regex: 'Blade X([79])(?:[);/ ]|$)'
+      model: 'Blade X$1'
+    - regex: 'ZTE T630(?:[);/ ]|$)'
+      model: 'Blade X5'
+    - regex: 'ZTE T520(?:[);/ ]|$)'
+      model: 'Blade L5'
+    - regex: 'Blade (?:V8Q|V0840)(?:[);/ ]|$)'
       model: 'Blade V8Q'
     - regex: 'Blade V8 SE(?:[);/ ]|$)'
       model: 'Blade V8 SE'
-    - regex: 'Blade V9 Vita(?:[);/ ]|$)'
+    - regex: 'BLADE (?:V0850|V8 Mini)(?:[);/ ]|$)'
+      model: 'Blade V8 Mini'
+    - regex: 'BLADE V0920'
       model: 'Blade V9 Vita'
-    - regex: 'Blade V9(?:[);/ ]|$)'
-      model: 'Blade V9'
-    - regex: 'Blade V10 Vita(?:[);/ ]|$)'
-      model: 'Blade V10 Vita'
+    - regex: 'ZTE 8030'
+      model: 'Blade V30 Vita'
+    - regex: 'ZTE 9030'
+      model: 'Blade V30'
+    - regex: 'Blade V(9|10) Vita(?:[);/ ]|$)'
+      model: 'Blade V$1 Vita'
+    - regex: 'Blade V([89]|10)(?:[);/ ]|$)'
+      model: 'Blade V$1'
     - regex: 'BLADE V0820(?:[);/ ]|$)'
       model: 'Blade V8 Lite'
-    - regex: 'BLADE V0850(?:[);/ ]|$)'
-      model: 'Blade V8 Mini'
-    - regex: '(?:Blade[ _])?(Apex2|G (LTE|Lux)|Vec|A510)'
+    - regex: '(?:Blade[ _])?(Apex2|G (LTE|Lux)|Vec)(?:[);/ ]|$)'
       model: 'Blade $1'
     - regex: 'Z768G(?:[);/ ]|$)'
       model: 'Midnight'
@@ -15421,16 +22278,24 @@ ZTE:
       model: 'Obsidian'
     - regex: 'Z986U'
       model: 'Blade Max 3'
+    - regex: 'Z6410S'
+      model: 'Blade Max 2s'
+    - regex: 'Z610DL'
+      model: 'Blade Max View'
     - regex: 'Z971'
       model: 'Blade Spark'
     - regex: 'Z978'
       model: 'Blade V8 Pro'
     - regex: 'Z839'
       model: 'Blade Vantage'
+    - regex: 'Z3153V'
+      model: 'Blade Vantage 2'
     - regex: 'Z930L'
       model: 'Unico LTE'
     - regex: 'Z965'
       model: 'Blade X'
+    - regex: 'Z6400C'
+      model: 'Blade X2 Max'
     - regex: 'Z981'
       model: 'Blade Z Max Pro'
     - regex: 'Z982'
@@ -15459,9 +22324,9 @@ ZTE:
       model: 'Majesty Pro Plus LTE'
     - regex: 'Z828TL'
       model: 'Midnight Pro LTE'
-    - regex: 'Z792'
+    - regex: '(?:ZTE-)?Z792'
       model: 'Fanfare'
-    - regex: 'Z812'
+    - regex: '(?:ZTE-)?Z812'
       model: 'Maven'
     - regex: 'Z815'
       model: 'Fanfare 2'
@@ -15483,7 +22348,7 @@ ZTE:
       model: 'Avid 4'
     - regex: 'Z833'
       model: 'Avid TRIO'
-    - regex: '(?:Z836BL|Z837VL)(?:[);/ ]|$)'
+    - regex: '(?:Z836BL|Z837VL|Z836F)(?:[);/ ]|$)'
       model: 'ZFive 2 LTE'
     - regex: 'Z558VL'
       model: 'ZFive C LTE'
@@ -15505,11 +22370,11 @@ ZTE:
       model: 'ZMax Z970'
     - regex: 'Z986DL'
       model: 'MAX Blue LTE'
-    - regex: 'Z992'
+    - regex: '(?:ZTE[-_])?Z992'
       model: 'Avail 2'
     - regex: '(?:Z999|Z-01K)(?:[);/ ]|$)'
       model: 'Axon M'
-    - regex: 'B2016'
+    - regex: 'B201[56]|Axon mini'
       model: 'Axon Mini'
     - regex: 'A2015'
       model: 'Axon Tianji'
@@ -15517,11 +22382,9 @@ ZTE:
       model: 'Axon 7'
     - regex: 'A2018'
       model: 'Axon 7s'
-    - regex: 'A2019G Pro'
-      model: 'Axon Pro'
     - regex: 'B2017G'
       model: 'Axon 7 Mini'
-    - regex: 'A2020G? Pro(?:[);/ ]|$)'
+    - regex: 'A2020(?:RU|[GU])? Pro(?:[);/ ]|$)'
       model: 'Axon 10 Pro'
     - regex: 'Z667T'
       model: 'Zinger'
@@ -15533,7 +22396,7 @@ ZTE:
       model: 'Score'
     - regex: 'X501'
       model: 'Groove'
-    - regex: 'G-X991'
+    - regex: '(?:ZTE-)?G-X991'
       model: 'Rio'
     - regex: 'F-450'
       model: 'Adamant'
@@ -15545,35 +22408,140 @@ ZTE:
       model: 'V865M'
     - regex: 'Z6621O(?:[);/ ]|$)'
       model: 'Optus X Vista'
+    - regex: 'P650 Pro(?:[);/ ]|$)'
+      model: 'Optus X Pro LTE'
+    - regex: 'V769M(?:[);/ ]|$)'
+      model: 'Leo Q2'
+    - regex: 'VERGATARIO 5(?:[);/ ]|$)'
+      model: 'Vergatario 5'
+    - regex: 'VERGATARIO5PLUS(?:[);/ ]|$)'
+      model: 'Vergatario 5 Plus'
+    - regex: 'ZTE V5 PRO(?:[);/ ]|$)'
+      model: 'V5 Pro'
+    - regex: 'ZTE 9000'
+      model: 'Blade V2020'
+    - regex: 'ZTE 8000'
+      model: 'Blade V2020 Vita'
+    - regex: 'KIS C341'
+      model: 'Kis C341'
+    - regex: 'MEO Smart A80'
+      model: 'MEO Smart A80'
+
+    - regex: 'A2121[LE]?(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Axon 20 5G'
+    - regex: 'ZTE 8010'
+      device: 'phablet'
+      model: 'Blade V2020 Smart'
+
+    # explicit tv models
+    - regex: 'B867RE(?:[);/ ]|$)'
+      device: 'tv'
+      model: 'ZXV10 B867RE'
+
+    # explicit tablet models
+    - regex: 'K83CA(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Grand X View 3'
+    - regex: 'K87CA(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Grand X View 4'
 
     - regex: 'AxonPhone ([^;/]+) Build'
       model: 'AxonPhone $1'
     - regex: '([a-z0-9]+)_USA_Cricket'
       model: '$1'
-    - regex: 'ZTE[\- ](V98|V96A|V81|V70)(?:[);/ ]|$)'
+    - regex: 'ZTE[- ](V98|V96A|V81|V70)(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
-    - regex: 'ZTE[\- ]([a-z0-9\-_ ]+) Build'
+    - regex: 'Blade[_ ](A(\d+)C?|L111|V580|E01)(?:[);/ ]|$)'
+      model: 'Blade $1'
+    - regex: 'Blade[_ ]V0730(?:[);/ ]|$)'
+      model: 'Blade V7'
+    - regex: 'Blade[_ ]V0800(?:[);/ ]|$)'
+      model: 'Blade V8'
+    - regex: 'Blade[_ ]V1000(?:[);/ ]|$)'
+      model: 'Blade V10'
+    - regex: 'ZTE B(A601|A910|A510)(?:[);/ ]|$)'
+      model: 'Blade $1'
+    - regex: 'ZTE Blade (A[35]1)'
+      model: 'Blade $1'
+    - regex: 'ZTE BA610T(?:[);/ ]|$)'
+      model: 'Blade A610'
+    - regex: 'ZTE[- ]([a-z0-9\-_ ]+) Build'
       model: '$1'
     - regex: 'ZTE-(?:G |G-)?([a-z0-9 _]+)'
       model: '$1'
-    - regex: 'ZTE[ _]([a-z0-9]+)'
+    - regex: 'U?ZTE[ _]?([a-z0-9]+)'
       model: '$1'
 
-Zuum:
-  regex: 'Zuum[ _-]|COVET|MAGNO|ONIX S|STEDI|STELLAR Z'
-  device: 'smartphone'
+# Onix
+Onix:
+  regex: '(?:ONIX S405|AT101-1116|ONIX_8_3G_01)(?:[);/ ]|$)'
+  device: 'tablet'
   models:
-    - regex: 'COVET'
-      model: 'Covet'
-    - regex: 'MAGNO'
-      model: 'Magno'
+    - regex: '(AT101-1116)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'ONIX_8_3G_01(?:[);/ ]|$)'
+      model: '8" Tablet 3G'
+    - regex: '(S405)(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: '$1'
+
+Zuum:
+  regex: 'Zuum[ _-]|Android 6.+ UNIQ(?: Build|[);])|(?:ROCKET III?|Akus (?:PRO|Z1?)|COVET|MAGNO(?:-S)?|ONIX(?: S)?|STEDI|STELLAR(?:[ _](?:Z|PRO|[MP]1|M2))?|GRAVITY [ZM]|AURA X|COVET_PRO_LITE|RONI|Android.+; LIMIT)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'AKUS PRO'
+      model: 'Akus Pro'
+    - regex: 'AKUS Z1'
+      model: 'Akus Z1'
+    - regex: 'Akus Z'
+      model: 'Akus Z'
+    - regex: 'COVET_PRO_LITE'
+      model: 'Covet Pro Lite'
+    - regex: 'COVET PRO'
+      model: 'Covet Pro'
+    - regex: 'COVET Mini'
+      model: 'Covet Mini'
+    - regex: 'COVET( Z)?'
+      model: 'Covet$1'
+    - regex: 'MAGNO PLUS'
+      model: 'Magno Plus'
+    - regex: 'MAGNO-S'
+      model: 'Magno S'
+    - regex: 'MAGNO( C1?)?'
+      model: 'Magno$1'
     - regex: 'ONIX S'
       model: 'Onix S'
+    - regex: 'ONIX'
+      model: 'Onix'
     - regex: 'STEDI'
       model: 'Stedi'
-    - regex: 'STELLAR Z'
-      model: 'Stellar Z'
+    - regex: 'STELLAR PRO'
+      model: 'Stellar Pro'
+    - regex: 'STELLAR PLUS'
+      model: 'Stellar Plus'
+    - regex: 'STELLAR ([MP][123]|Z)'
+      model: 'Stellar $1'
+    - regex: 'STELLAR MINI'
+      model: 'Stellar Mini'
+    - regex: 'STELLAR Max'
+      model: 'Stellar Max'
+    - regex: 'STELLAR'
+      model: 'Stellar'
+    - regex: 'GRAVITY ([MZ])'
+      model: 'Gravity $1'
+    - regex: 'AURA X'
+      model: 'Aura X'
+    - regex: 'RONI'
+      model: 'Roni'
+    - regex: 'ROCKET (III?)'
+      model: 'Rocket $1'
+    - regex: 'Android 6.+; UNIQ(?: Build|[);])'
+      model: 'Uniq'
+    - regex: 'Android.+; LIMIT(?: Build|[);])'
+      model: 'Limit'
     - regex: 'Zuum[ _-]([^;/]+) Build'
       model: '$1'
     - regex: 'Zuum[ _-]?([^;/)]+)(?:[);/ ]|$)'
@@ -15591,10 +22559,10 @@ Zen:
 
 # Zync
 Zync:
-  regex: 'ZYNC|(Cloud Z5|Z1000|Z18|Z99 Dual Core|Z99[_ ][23]G|Z99|Z900[_ ]Plus|Z909|Z930[+]|Z930)'
+  regex: 'ZYNC|(Cloud Z5|Z1000|Z18|Z99|Z99[_ ][23]G|Z99|Z900[_ ]Plus|Z909|Z930[+]|Z930)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(Z18|Z99 Dual Core|Z99[_ ][23]G|Z99|Z900[_ ]Plus|Z909|Z930[+]|Z930)'
+    - regex: '(Z18| DuZ99al Core|Z99[_ ][23]G|Z99 Dual Core|Z99|Z900[_ ]Plus|Z909|Z930[+]|Z930)'
       model: '$1'
     - regex: '(Z1000[^/;]+)Build'
       model: '$1'
@@ -15612,9 +22580,10 @@ Lemhoov:
   models:
     - regex: 'Lemhoov[ _-]([^/;]+) Build'
       model: '$1'
-# MTC
+
+# MTC (MTS)
 MTC:
-  regex: 'MTC[ _](968|97[82]|970|982[OT]?|1078)|(?:MTC[_ ])?SMART[ _]?(?:Race[2]?|Sprint|Run|Surf[2]?)[ _]4G|MTC975|MTC[ _]SMART[ _](?:Run|Start_2)'
+  regex: 'MTC[ _](968|97[82]|970|982[OT]?|1078)|(?:MTC[_ ])?SMART[ _]?(?:Race[2]?|Sprint|Run|Turbo|Surf[2]?)[ _]4G|MTC975|Smart Bit|Smart_(?:LINE|Light)|(?:MTC[ _])?SMART[ _](?:Run|Start_[23])|Redbox Mini 5\(MTS\)|MTS TV|DV8304-C'
   device: 'smartphone'
   models:
     - regex: 'MTC[ _]?(97[258]|970[H]?|982[OT]?|968)'
@@ -15626,16 +22595,33 @@ MTC:
       model: 'Smart Race 4G'
     - regex: 'SMART[ _]Race2[ _]4G'
       model: 'Smart Race 2 4G'
-    - regex: '(MTC_)?SMART[ _]Sprint[ _]4G'
+    - regex: '(?:MTC_)?SMART[ _]Sprint[ _]4G'
       model: 'Smart Sprint 4G'
-    - regex: '(MTC_)?SMART[ _]Start_2'
-      model: 'Smart Start 2'
+    - regex: '(?:MTC_)?SMART[ _]Start_([23])'
+      model: 'Smart Start $1'
+    - regex: 'Smart_LINE'
+      model: 'Smart Line'
+    - regex: 'Smart_Light'
+      model: 'Smart Light'
+    - regex: 'Smart Bit'
+      model: 'Smart Bit'
     - regex: 'SMART[ _]?Run(?:[ _]4G)?'
       model: 'Smart Run 4G'
     - regex: 'SMART[ _]Surf2[ _]4G'
       model: 'Smart Surf 2 4G'
     - regex: 'SMART[ _]Surf[ _]4G'
       model: 'Smart Surf 4G'
+    - regex: 'SMART[ _]Turbo[ _]4G'
+      model: 'Smart Turbo 4G'
+    - regex: 'Redbox Mini 5\(MTS\)'
+      device: 'tv'
+      model: 'Redbox Mini 5'
+    - regex: 'MTS TV Box 317'
+      device: 'tv'
+      model: 'SB-317'
+    - regex: 'DV8304-C'
+      device: 'tv'
+      model: 'SuperWave DV8304-C'
 
 # MegaFon
 MegaFon:
@@ -15655,39 +22641,63 @@ MegaFon:
       model: 'Mint'
     - regex: '(SP-A5)'
       model: '$1'
+    - regex: 'MegaFon V9+'
+      device: 'tablet'
+      model: 'V9 Plus'
 
 # Inoi
 Inoi:
   regex: 'INOI'
   device: 'smartphone'
   models:
-    - regex: 'INOI 2 Lite 2019'
-      model: '2 Lite (2019)'
-    - regex: 'INOI 2 2019'
-      model: '2 (2019)'
-    - regex: 'INOI[_ ]([^;/]+)(?: Build|\))'
+    - regex: 'inoiPad mini 2\+32 Wi-Fi\+3G'
+      device: 'tablet'
+      model: 'Pad Mini 2+32'
+    - regex: 'inoiPad 2\+32 Wi-Fi\+3G'
+      device: 'tablet'
+      model: 'Pad 2+32'
+    - regex: 'inoiPad mini 1\+16 Wi-Fi'
+      device: 'tablet'
+      model: 'Pad Mini 1+16 WiFi'
+    - regex: 'INOI easyphone'
+      model: 'Easy Phone'
+    - regex: 'INOI (2|5) Lite (2019|2021)'
+      model: '$1 Lite ($2)'
+    - regex: 'INOI[_ ]([13])[_ ]LITE'
+      model: '$1 Lite'
+    - regex: 'INOI ([257]) (?:\d\+\d+ )?(2019|202[01])(?:[);/ ]|$)'
+      model: '$1 ($2)'
+    - regex: 'INOI[_ ]([^);/]+)(?: Build|[;)])'
       model: '$1'
 
-# Vertex
+# Vertex (vertex-digital.ru)
 Vertex:
-  regex: 'Lion_Dual|V709X|Baccara|Eagle[ _]4G|ImpressMAX|Impress[ _]([^;/]+)(?:Build|\))'
+  regex: '(?:Luck|Luck_L1[02]0_[34]G|Lion_Dual|V709X|TAB X8|TAB X10|Tab [43]G (?:7-2|8-1|10-1)|Pro_P3[01]0_4G|Lion_DC|Baccara|Eagle[ _]4G|ImpressMAX)(?:[);/ ]|$)|Impress[ _]([^;/]+)(?:Build|\))'
   device: 'smartphone'
   models:
-    - regex: '(Lion_Dual|Baccara|Eagle[ _]4G)'
+    - regex: '(Lion_Dual|Lion_DC|Baccara|Eagle[ _]4G|Luck_L1[02]0_[34]G|Luck)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'ImpressMAX(?:[);/ ]|$)'
+    - regex: 'Impress ?MAX(?:[);/ ]|$)'
       model: 'Impress Max'
-    - regex: '(Impress[ _]([^;/]+))(?:Build|\))'
+    - regex: 'IMPRESS ECLIPSE(?:[);/ ]|$)'
+      model: 'Impress Eclipse'
+    - regex: 'Pro_P(3[01]0)_4G(?:[);/ ]|$)'
+      model: 'Pro P$1 4G'
+    - regex: 'Impress_Luck[_ ]?4G_NFC(?:[);/ ]|$)'
+      model: 'Impress Luck 4G NFC'
+    - regex: '(Impress[ _][a-z]+)([34])G(?:Build|\))'
+      model: '$1 $2G'
+    - regex: '(Impress[ _](?:[^;/]+))(?:Build|\))'
       model: '$1'
     - regex: '(V709X)'
       device: 'tablet'
       model: '$1'
-
-# Devices with undectable brand, but detectable model
-Unknown:
-  regex: 'WebTV/(\d+\.\d+)'
-  device: 'tv'
-  model: 'Web TV'
+    - regex: 'TAB X(8|10)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Tab X$1'
+    - regex: 'Tab ([43])G ([78]|10)-([21])'
+      device: 'tablet'
+      model: 'Tab $1G $2.$3"'
 
 # Starway
 Starway:
@@ -15697,23 +22707,33 @@ Starway:
 
 # Savio
 Savio:
-  regex: 'TB-PO1 Build'
+  regex: ' (TB-PO1|TB-B01|TB-G01)(?:[);/ ]|$)'
   device: 'tv'
+  model: '$1'
+
+# Schok (https://www.schokgear.com/)
+Schok:
+  regex: 'Schok '
+  device: 'smartphone'
   models:
-    - regex: '(TB-PO1)'
-      model: '$1'
+    - regex: 'Schok Volt SV55'
+      model: 'Volt SV55'
 
 # Simbans
 Simbans:
-  regex: 'TangoTab|Presto[ )]|Ultimax|Valumax|S72-B|SX2W'
+  regex: 'TangoTab|Presto[ )]|PicassoTab_X|Ultimax|Valumax|S72-B|SX2W'
   device: 'tablet'
   models:
+    - regex: 'TangoTab_(\d+)'
+      model: 'TangoTab $1'
     - regex: 'TangoTab'
       model: 'TangoTab'
     - regex: 'Ultimax'
       model: 'Ultimax'
     - regex: 'Valumax'
       model: 'Valumax'
+    - regex: 'PicassoTab_X'
+      model: 'Presto Tab X'
     - regex: 'Presto'
       model: 'Presto'
     - regex: 'S72-B'
@@ -15729,14 +22749,17 @@ MYFON:
 
 # X-TIGI
 X-TIGI:
-  regex: 'X[-_]TIGI|Hope7[_ ]Mate'
+  regex: 'X[-_]TIGI|Hope7[_ ](?:Mate|Max)|JOY10 Mate|Photo_P15_Lite|SHARP_2'
   device: 'smartphone'
   models:
     - regex: 'X-TIGI_JOY10_PRO'
       model: 'Joy 10 Pro'
       device: 'tablet'
-    - regex: 'Hope7[_ ]Mate'
-      model: 'Hope 7 Mate'
+    - regex: 'JOY10 Mate'
+      model: 'Joy 10 Mate'
+      device: 'tablet'
+    - regex: 'Hope7[_ ](Mate|Max)'
+      model: 'Hope 7 $1'
       device: 'tablet'
     - regex: 'X-TIGI_JOY7_MAX'
       model: 'Joy 7 Max'
@@ -15747,31 +22770,49 @@ X-TIGI:
       model: 'V19'
     - regex: 'X-TIGI[_ ]Photo[_ ]P11'
       model: 'Photo P11'
-    - regex: 'X[-_]TIGI[ _-]([^/;)]+) Build'
+    - regex: 'Photo_P15_Lite'
+      model: 'Photo P15 Lite'
+    - regex: 'SHARP_2'
+      model: 'Sharp 2'
+    - regex: 'X[-_]TIGI[ _-]([^/;)]+)(?: Build|[;)])'
       model: '$1'
 
-# Xiaolajiao (Shenzhen Peppers)
+# Hot Pepper (hotpeppermobile.com)
+Hot Pepper:
+  regex: '(?:HPP-GS1|VLE5)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'HPP-GS1'
+      model: 'Ghost'
+    - regex: 'VLE5'
+      model: 'Poblano'
+
+# Xiaolajiao or Shenzhen Peppers xiaolajiao.com)
 Xiaolajiao:
-  regex: '(LA2-(?:L|S[N]?)|HLA Note3|20190416Q|20170608S|20180322D)(?:[);/ ]|$)'
+  regex: '(LA2-(?:L|S[N]?)|HLA Note3|L7620DE|20190416Q|20170608S|20180322D|20190325D|20190718Q)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'HLA Note3(?:[);/ ]|$)'
       model: 'Red Pepper Note 3'
     - regex: '(LA2-(?:L|S[N]?))(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(20190416Q)(?:[);/ ]|$)'
+    - regex: '(20190416Q|L7620DE)(?:[);/ ]|$)'
       model: '$1'
     - regex: '20170608S(?:[);/ ]|$)'
       model: 'Red Pepper Plus'
     - regex: '20180322D(?:[);/ ]|$)'
       model: 'E Sports'
+    - regex: '20190325D(?:[);/ ]|$)'
+      model: 'Red Pepper 8X Pro'
+    - regex: '20190718Q(?:[);/ ]|$)'
+      model: 'Red Pepper 9X'
 
 # Ritmix
 Ritmix:
-  regex: '(RMD[-_](?:10(?:2[689]|30|5[089])|1121|75[01]|726|85[57]|870)|RMP-(?:450|50[56]|530|600))(?:[);/ ]|$)'
+  regex: '(RMD[-_](?:10(?:2[689]|30|5[089])|1121|75[017]|726|85[57]|870)|RMP-(?:450|50[56]|530|600))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'RMD[-_](10(?:2[689]|30|5[089])|1121|75[01]|726|85[57]|870)(?:[);/ ]|$)'
+    - regex: 'RMD[-_](10(?:2[689]|30|5[089])|1121|75[017]|726|85[57]|870)(?:[);/ ]|$)'
       model: 'RMD-$1'
     - regex: 'RMP[-_](450|50[56]|530|600)(?:[);/ ]|$)'
       model: 'RMP-$1'
@@ -15779,9 +22820,9 @@ Ritmix:
 
 # Ross&Moor
 'Ross&Moor':
-  regex: 'RMD[-_](974R|600)(?:[);/ ]|$)'
+  regex: 'RM(D)?[-_](974R|600|550|790)(?:[);/ ]|$)'
   device: 'tablet'
-  model: 'RMD-$1'
+  model: 'RM$1-$2'
 
 # R-TV
 R-TV:
@@ -15801,9 +22842,9 @@ NEXBOX:
     - regex: 'NEXBOX-([^) ]+)'
       model: '$1'
 
-# True
+# True or TrueSmart
 'True':
-  regex: 'SMART[ _](MAX 4.0 PLUS|4G GEN C [45].[05]|4G Speedy 5.0 Plus|4G[_ ]Speedy[_ ]5inch)'
+  regex: ' TRUE BEYOND TAB 3G|SMART[ _](MAX 4.0 PLUS|4G[ _](?:GEN C [45].[05]|M1 Plus|Champion|Speedy 5.0 Plus|Speedy[_ ]5inch|P1))'
   device: 'smartphone'
   models:
     - regex: 'SMART MAX 4.0 PLUS'
@@ -15814,6 +22855,16 @@ NEXBOX:
       model: 'Smart 4G Speedy 5.0 Plus'
     - regex: 'SMART[ _]4G[_ ]Speedy[_ ]5inch'
       model: 'Smart 4G Speedy 5'
+    - regex: 'SMART[ _]4G[_ ]Champion'
+      model: 'Smart 4G Champion'
+    - regex: 'SMART[ _]4G[_ ]P1 Prime'
+      model: 'Smart 4G P1 Prime'
+    - regex: 'SMART[ _]4G[_ ]P1'
+      model: 'Smart 4G P1'
+    - regex: 'SMART[ _]4G M1 Plus'
+      model: 'Smart 4G M1 Plus'
+    - regex: 'TRUE BEYOND TAB 3G'
+      model: 'Beyond Tab 3G'
 
 Yandex:
   regex: '(YNDX-?000SB)(?:[);/ ]|$)'
@@ -15827,7 +22878,7 @@ FORME:
   models:
     - regex: 'FORME[ _-]F520(?:[);/ ]|$)'
       model: 'Forever'
-    - regex: 'FORME[ _-](A37|R7S)(?:[);/ ]|$)'
+    - regex: 'FORME[ _-](A[35]7|R7S?|P6)(?:[);/ ]|$)'
       model: '$1'
 
 # Shuttle
@@ -15838,20 +22889,30 @@ Shuttle:
 
 # BDF
 BDF:
-  regex: '(BDF[- ](?:819|P10|K107H|KT107|MT6753|X20)|K960N_MT(?:6580|6753)(?:_32_N)?)(?:[);/ ]|$)'
+  regex: '(?:BDF[- ](?:819|P10|M107|K107H|KT107|MT6753|X20)|K960N_MT(?:6580|6753)(?:_32_N)?)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'BDF[- ](819|P10|K107H|KT107|MT6753|X20)(?:[);/ ]|$)'
+    - regex: 'BDF[- ](819|P10|M107|K107H|KT107|MT6753|X20)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'K960N_MT(6580|6753)(_32_N)?(?:[);/ ]|$)'
       model: 'BK960N MT$1'
 
+# Hi (https://www.hi-online.co.za/)
+Hi:
+  regex: '(?:Boost Ultra|HMR5012)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Boost Ultra(?:[);/ ]|$)'
+      model: 'Boost Ultra'
+    - regex: 'HMR5012(?:[);/ ]|$)'
+      model: 'Boost Go'
+
 # Highscreen
 Highscreen:
-  regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ]Power|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max|Max(?:Lite|2))|PowerFour|BOOST II(?:se)?|FestXL|Tasty|Boost3)(?:[);/ ]|$)'
+  regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ](?:Power|F)|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max|Max(?:Lite|2))|Power(?:Four|Five)|BOOST II(?:se)?|Fest(?:XL)?(?:-Pro)?|Tasty|Boost3|Boost 3(?: Pro)? SE|Expanse|Hercules|Alpha Rage|VergeM|Ice2|Prime [LS]|Spade|Spark 2|Alpha GTR|Wallet)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])(?:[);/ ]|$)'
+    - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS]|Alpha GTR|Wallet)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'PowerFivePro(?:[);/ ]|$)'
       model: 'Power Five Pro'
@@ -15863,12 +22924,26 @@ Highscreen:
       model: 'Power Five Evo'
     - regex: 'Power Five Max(?:[);/ ]|$)'
       model: 'Power Five Max'
+    - regex: 'Power[_ ]?Five(?:[);/ ]|$)'
+      model: 'Power Five'
+    - regex: 'Spade(?:[);/ ]|$)'
+      model: 'Spade'
+    - regex: 'Spark 2(?:[);/ ]|$)'
+      model: 'Spark 2'
+    - regex: 'FestXL-Pro(?:[);/ ]|$)'
+      model: 'Fest XL Pro'
     - regex: 'FestXL(?:[);/ ]|$)'
       model: 'Fest XL'
+    - regex: 'Fest-Pro(?:[);/ ]|$)'
+      model: 'Fest Pro'
+    - regex: 'Fest(?:[);/ ]|$)'
+      model: 'Fest'
     - regex: 'PowerFour(?:[);/ ]|$)'
       model: 'Power Four'
     - regex: 'Pure[_ ]Power(?:[);/ ]|$)'
       model: 'Pure Power'
+    - regex: 'Pure[ _]F(?:[);/ ]|$)'
+      model: 'Pure F'
     - regex: 'Razar_Pro(?:[);/ ]|$)'
       model: 'Razar Pro'
     - regex: 'Easy[_ ]([SLF]|XL)[_ ]Pro(?:[);/ ]|$)'
@@ -15883,14 +22958,30 @@ Highscreen:
       model: 'Boost 2'
     - regex: 'BOOST IIse(?:[);/ ]|$)'
       model: 'Boost 2 SE'
+    - regex: 'Boost 3 SE(?:[);/ ]|$)'
+      model: 'Boost 3 SE'
+    - regex: 'Boost 3 Pro SE(?:[);/ ]|$)'
+      model: 'Boost 3 Pro SE'
     - regex: 'BOOST3(?:[);/ ]|$)'
       model: 'Boost 3'
     - regex: 'Zera-S-Power(?:[);/ ]|$)'
       model: 'Zera S Power'
     - regex: 'Tasty(?:[);/ ]|$)'
       model: 'Tasty'
+    - regex: 'VergeM(?:[);/ ]|$)'
+      model: 'Verge M'
     - regex: 'WinWin(?:[);/ ]|$)'
       model: 'WinWin'
+    - regex: 'Expanse(?:[);/ ]|$)'
+      model: 'Expanse'
+    - regex: 'Hercules(?:[);/ ]|$)'
+      model: 'Hercules'
+    - regex: 'Alpha Rage(?:[);/ ]|$)'
+      model: 'Alpha Rage'
+    - regex: 'Ice2(?:[);/ ]|$)'
+      model: 'Ice 2'
+    - regex: 'Prime ([LS])(?:[);/ ]|$)'
+      model: 'Prime $1'
 
 # CVTE
 CVTE:
@@ -15912,35 +23003,54 @@ Globex:
 
 # Atom
 Atom:
-  regex: 'ATOM-(108AM)(?:[);/ ]|$)'
+  regex: 'ATOM-(108AM|216RK|216AM)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Qumo
 Qumo:
-  regex: 'QUMO[ _]?|(Vega[ _]?78[23])(?:[);/ ]|$)'
+  regex: 'QUMO[ _]?|(?:Quest[ _]?(?:408|410|45[56]|50[679])|Vega[ _]?78[23]|Sirius[ _]?(?:1001|890))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '(?:QUMO[ _]?)?Vega[ _]?(78[23]|8002)(?:[);/ ]|$)'
       model: 'Vega $1'
     - regex: 'Yooda(?:[);/ ]|$)'
       model: 'Yooda'
-    - regex: '(?:QUMO)?(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 71 4GB Black|Altair 700[24]|Altair 706)(?:[);/ ]|$)'
+    - regex: 'Sirius[ _]?(1001|890)(?:[);/ ]|$)'
+      model: 'Sirius $1'
+    - regex: '(?:QUMO[ _]?)?(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 71 4GB Black|Altair 700[24]|Altair 706|Vega_803i)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'QUMO[ _]Quest[ _]?(35[34]|40[26]|45[28]|476|507|570|600)(?:[);/ ]|$)'
+    - regex: '(?:QUMO[ _])?Quest[ _]?(35[34]|40[268]|410|45[2568]|47[46]|50[679]|5[137]0|574|600)(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Quest $1'
 
-# Umax
+# Qubo (qubomobile.com)
+Qubo:
+  regex: '(Cronos|MINERVA(?:_32GB)?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Umax (umax.cz)
 Umax:
-  regex: 'VisionBook[ _]|[78]Qa_3G(?:[);/ ]|$)'
+  regex: 'VisionBook[ _]|([78]Qa_3G|VB_10Q_Plus|10A_LTE_eea)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '(VisionBook[ _](?:10Qi|7Q[i]?|8Q[ei]?|P70|8Qi_3G)(?:[ _](?:[34]G|Plus|LTE))?)(?:[);/ ]|$)'
       model: '$1'
     - regex: '([78])Qa_3G(?:[);/ ]|$)'
       model: 'VisionBook $1Qa 3G'
-    - regex: '(VisionBook[ _](?:P50 LTE|P55 LTE(?: Pro)?))(?:[);/ ]|$)'
+    - regex: 'VisionBook_10Q_LTE(?:[);/ ]|$)'
+      model: 'VisionBook 10Q LTE'
+    - regex: 'VisionBook_10Q_Pro(?:[);/ ]|$)'
+      model: 'VisionBook 10Q Pro'
+    - regex: '10A_LTE_eea(?:[);/ ]|$)'
+      model: 'VisionBook 10A LTE'
+    - regex: 'VB_10Q_Plus(?:[);/ ]|$)'
+      model: 'VisionBook 10Q Plus'
+    - regex: 'VisionBook_P50Plus_LTE(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'VisionBook P50 Plus LTE'
+    - regex: '(VisionBook[ _](?:P50 LTE|P55 X2 LTE|P55 LTE(?: Pro)?))(?:[);/ ]|$)'
       device: 'smartphone'
       model: '$1'
 
@@ -15950,24 +23060,26 @@ Mann:
   device: 'smartphone'
   model: '$1'
 
-# Unihertz
+# Unihertz (unihertz.com)
 Unihertz:
-  regex: '(Titan|Jelly-Pro)(?:[);/ ]|$)'
+  regex: '((?<!Astra )Titan|Jelly-Pro|Jelly2(?:_JP)?|Atom_X?L)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(Jelly)-(Pro)(?:[);/ ]|$)'
-      model: '$1 $2'
-    - regex: '(Titan)(?:[);/ ]|$)'
+    - regex: '(Jelly)-Pro(?:[);/ ]|$)'
+      model: '$1 Pro'
+    - regex: 'Jelly2(?:_JP)?(?:[);/ ]|$)'
+      model: 'Jelly 2'
+    - regex: '(Titan|Atom_X?L)(?:[);/ ]|$)'
       model: '$1'
 
 # Chuwi
 Chuwi:
-  regex: '(?:CW-(Hi8-super|Hi12|V99|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (?:pro|plus))|Hi10 (?:Pro|plus)|HiBox-hero|HiBook pro|Hi8 (?:Air|Pro))(?:[);/ ]|$)'
+  regex: '(?:CW-(Hi8-super|Hi12|V99i?|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (?:pro|plus))|Hi10 (?:Pro|plus)|HiPad[ -](?:X|Pro|Air)|HiBox-hero|HiBook(?: pro)?|Hi[89] ?(?:Air|Pro)|HiPadPlus|Hi8SE|Vi8 plus|Vi10(?: ?Pro)?)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '(CW-Hi8-super)(?:[);/ ]|$)'
       model: 'Hi8'
-    - regex: '(?:CW-)?(Vi10|Hi10) plus(?:[);/ ]|$)'
+    - regex: '(?:CW-)?(Vi10|Hi10|Vi8) plus(?:[);/ ]|$)'
       model: '$1 Plus'
     - regex: 'CW-(V88)-QUAD(?:[);/ ]|$)'
       model: '$1 Quad'
@@ -15979,16 +23091,35 @@ Chuwi:
       model: '$1 Pro'
     - regex: 'HiBook pro(?:[);/ ]|$)'
       model: 'HiBook Pro'
-    - regex: 'Hi8 Air(?:[);/ ]|$)'
-      model: 'Hi8 Air'
-    - regex: 'Hi8 pro(?:[);/ ]|$)'
-      model: 'Hi8 Pro'
+    - regex: 'HiBook(?:[);/ ]|$)'
+      model: 'HiBook'
+    - regex: 'HiPad X(?:[);/ ]|$)'
+      model: 'HiPad X'
+    - regex: 'HiPad Pro(?:[);/ ]|$)'
+      model: 'HiPad Pro'
+    - regex: 'HiPad-Air(?:[);/ ]|$)'
+      model: 'HiPad Air'
+    - regex: 'HiPadPlus(?:[);/ ]|$)'
+      model: 'HiPad Plus'
+    - regex: 'Hi([89]) ?Air(?:[);/ ]|$)'
+      model: 'Hi$1 Air'
+    - regex: 'Hi8SE(?:[);/ ]|$)'
+      model: 'Hi8 SE'
+    - regex: 'Hi([89]) ?pro(?:[);/ ]|$)'
+      model: 'Hi$1 Pro'
+    - regex: 'Vi10 Plus(?:[);/ ]|$)'
+      model: 'Vi10 Plus'
+    - regex: 'Vi10 ?Pro(?:[);/ ]|$)'
+      model: 'Vi10 Pro'
+    - regex: 'Vi10(?:[);/ ]|$)'
+      model: 'Vi10'
+
 
     - regex: 'HiBox-hero(?:[);/ ]|$)'
       model: 'HiBox Hero'
       device: 'desktop'
 
-    - regex: 'CW-(Vi[78]|Hi12|V99|V88S)(?:[);/ ]|$)'
+    - regex: 'CW-(Vi[78]|Hi12|V99i?|V88S)(?:[);/ ]|$)'
       model: '$1'
 
 # Bezkam
@@ -16015,6 +23146,14 @@ Ghong:
   device: 'smartphone'
   model: '$1'
 
+# Ghost
+Ghost:
+  regex: 'GHOST G03(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'G03(?:[);/ ]|$)'
+      model: 'G03'
+
 # Xoro
 Xoro:
   regex: '(?:TelePAD(?:795|731|1032|10A3|7A3)|Era 2X|HMT(?:390Q?|400)|HST 260)(?:[);/ ]|$)'
@@ -16039,15 +23178,33 @@ Xoro:
 
 # Vinga
 Vinga:
-  regex: 'VMP-(021-82|041-162|011-81)(?:[);/ ]|$)'
+  regex: 'VMP-(015-162|021-82|041-162|011-81|025-324|045-664)(?:[);/ ]|$)|VMP023\.'
   device: 'tv'
   models:
     - regex: 'VMP-021-82'
       model: '021'
+    - regex: 'VMP-025-324'
+      model: '025'
+    - regex: 'VMP-015-162'
+      model: '015'
     - regex: 'VMP-041-162'
       model: '041'
+    - regex: 'VMP-045-664'
+      model: '045'
     - regex: 'VMP-011-81'
       model: '011'
+    - regex: 'VMP023\.'
+      model: '023'
+
+# Viumee (viumee.com)
+Viumee:
+  regex: '(?:SMART[_ ]EV[56]|EV7_Pro)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(EV7)_Pro'
+      model: '$1 Pro'
+    - regex: 'SMART[_ ](EV[56])'
+      model: 'Smart $1'
 
 # Nuvo
 Nuvo:
@@ -16063,15 +23220,19 @@ Nuvo:
 
 # Sunvell
 Sunvell:
-  regex: 'T95ZPLUS(?:[);/ ]|$)'
+  regex: '(?:T95ZPLUS|T95[KU]PRO)(?:[);/ ]|$)'
   device: 'tv'
-  model: 'T95Z Plus'
+  models:
+    - regex: 'T95ZPLUS'
+      model: 'T95Z Plus'
+    - regex: '(T95[KU])PRO'
+      model: '$1 Pro'
 
 # Ugoos
 Ugoos:
-  regex: 'UGOOS-AM6(?:[);/ ]|$)'
+  regex: 'UGOOS-(AM[36])(?:[);/ ]|$)'
   device: 'tv'
-  model: 'AM6'
+  model: '$1'
 
 # Yxtel
 Yxtel:
@@ -16081,10 +23242,14 @@ Yxtel:
 
 # Proline
 Proline:
-  regex: '(H10882M-TN)(?:[);/ ]|$)'
+  regex: 'Proline_|(?:H10882M-TN|H10888M|H1010)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
-
+  models:
+    - regex: 'Proline[_ ]FalconXL'
+      device: 'smartphone'
+      model: 'Falcon XL'
+    - regex: '(H10882M-TN|H10888M|H1010)'
+      model: '$1'
 # Yota
 Yota:
   regex: '(YD20[16]|YOTA 3[+])(?:[);/ ]|$)'
@@ -16097,12 +23262,16 @@ Yota:
 
 # Mystery
 Mystery:
-  regex: '(MYSTERY|MID-(?:123G|72[12]|7[01348]3G|753G|833G))(?:[);/ ]|$)'
+  regex: 'MYSTERY|(MID-(?:123G|72[12]|7[01348]3G|753G|8[23]3G))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'MID-(123G|72[12]|7[01348]3G|753G|833G)(?:[);/ ]|$)'
+    - regex: 'MID-(123G|72[12]|7[01348]3G|753G|8[23]3G)(?:[);/ ]|$)'
       model: 'MID-$1'
 
+    - regex: 'MYSTERY_TV_(D3155CH31)'
+      device: 'tv'
+      model: '$1'
+
 # Ritzviva
 Ritzviva:
   regex: '(RITZVIVA[_ ]S500C)(?:[);/ ]|$)'
@@ -16117,11 +23286,17 @@ DeWalt:
 
 # Runbo
 Runbo:
-  regex: 'Runbo'
+  regex: 'Runbo|F1-TT(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Runbo[ _-]?(X5-W|F1 Plus|F1-TT|F1-EN|F1|TT|Q5-S|X5-King|X6|Q5)(?:[);/ ]|$)'
+    - regex: 'Runbo[ _-]?(X5-W|F1 Plus|[PF]1-TT|F1-EN|[FH]1|TT|Q5-S|X5-King|X6|Q5)(?:[);/ ]|$)'
       model: '$1'
+    - regex: 'F1-TT'
+      model: 'F1-TT'
+
+    - regex: 'RunboP2'
+      device: 'tablet'
+      model: 'P2'
 
 # NewsMy
 NewsMy:
@@ -16129,6 +23304,12 @@ NewsMy:
   device: 'car browser'
   model: '$1'
 
+# Newsday
+Newsday:
+  regex: 'Newsday[_ ](E1|A[12])(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
 # Daewoo
 Daewoo:
   regex: 'Daewoo|(DTA-07IDRF)(?:[);/ ]|$)'
@@ -16163,37 +23344,71 @@ Spectrum:
 
 # Kivi
 Kivi:
-  regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
+  regex: 'KIVI [24]K|(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|32H700GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55U600G[RU]|65UP50GU|55U[PC]50G[RU]|50U600G[RU]|50UX10S|55UR50G[RU]|40FK30G|40FR5[02]BR|43U(?:800BR|600KD|K35G)|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G|32H600KD)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)(?:[);/ ]|$)'
+    - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|32H700GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55U600G[RU]|65UP50GU|55U[PC]50G[RU]|50UX10S|50U600G[RU]|55UR50G[RU]|40FK30G|40FR5[02]BR|43U(?:K35G|600KD|800BR)|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G|32H600KD)(?:[);/ ]|$)'
       model: '$1'
     - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])(?:[);/ ]|$)'
       model: '$1 v$2'
+    - regex: 'KIVI ([24]K Android TV)'
+      model: '$1'
 
-# Divisat
+# Divisat (divisat.ru)
 Divisat:
-  regex: '(Divisat)(?:[);/ ]|$)'
+  regex: '(?:Divisat|X-MEDIA|DVS X3)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: '(?:DVS )?(J-Link|X3)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'X-MEDIA(?:[);/ ]|$)'
+      model: 'X-Media'
+
+# ArtLine (artline.ua)
+ArtLine:
+  regex: 'ARTLINE[ _-](KMX3)(?:[);/ ]|$)'
   device: 'tv'
+  model: '$1'
+
+# DIXON (https://www.dixoninfo.com/)
+DIXON:
+  regex: 'DIXON_|(?:ACK1010|KT5512|HK7-3502|DN6015|DFM48)(?:[);/ ]|$)'
+  device: 'smartphone'
   models:
-    - regex: '(J-Link)(?:[);/ ]|$)'
+    - regex: '(ACK1010|KT5512|DFM48)'
       model: '$1'
+    - regex: 'HK7-3502'
+      model: 'Solis'
+    - regex: 'DN6015'
+      model: 'Astrum'
+    - regex: 'DIXON_XK1_3G(?:[);/ ]|$)'
+      device: 'feature phone'
+      model: 'XK1 3G'
 
 # Kanji
 Kanji:
-  regex: 'KJ-(OB03|YUBI)(?:[);/ ]|$)'
+  regex: 'KJ-(OB0[23]|YUBI|SMART4K|GOCHI|ALFARK)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'KJ-OB03(?:[);/ ]|$)'
+    - regex: 'KJ-OB03'
       model: 'Cata 7'
-    - regex: 'KJ-YUBI(?:[);/ ]|$)'
+    - regex: 'KJ-GOCHI'
+      model: 'Gochi'
+    - regex: 'KJ-OB02'
+      model: 'Ailu Max'
+    - regex: 'KJ-YUBI'
       model: 'Yubi 3G'
+    - regex: 'KJ-ALFARK'
+      model: 'Alfa'
+    - regex: 'KJ-SMART4K'
+      device: 'tv'
+      model: 'Smart 4K'
 
-#Kaiomy
+# Kaiomy
 Kaiomy:
-   regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
-   device: 'tablet'
-   model: 'KaiCloud $1'
+  regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'KaiCloud $1'
 
 # National
 National:
@@ -16203,11 +23418,19 @@ National:
 
 # Vsun
 Vsun:
-  regex: 'VSUN (ILLUSION|RACE|V9)(?:[);/ ]|$)'
+  regex: '(?:VSUN (?:ILLUSION|RACE|V9)|MARS TOUCH|MARS NOTE|MARS NOCAM|SATURN SELFIE)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'ILLUSION(?:[);/ ]|$)'
       model: 'Illusion'
+    - regex: 'MARS TOUCH(?:[);/ ]|$)'
+      model: 'Mars Touch'
+    - regex: 'MARS NOTE(?:[);/ ]|$)'
+      model: 'Mars Note'
+    - regex: 'MARS NOCAM(?:[);/ ]|$)'
+      model: 'Mars Nocam'
+    - regex: 'SATURN SELFIE(?:[);/ ]|$)'
+      model: 'Saturn Selfie'
     - regex: 'RACE(?:[);/ ]|$)'
       model: 'Race'
     - regex: '(V9)(?:[);/ ]|$)'
@@ -16221,20 +23444,12 @@ Shift Phones:
 
 # RugGear
 RugGear:
-  regex: '(RugGear|RG(?:310|500|65[05]|702|710|850))(?:[);/ ]|$)'
+  regex: '(RugGear|RG(?:310|500|65[05]|702|7[13]0|850))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(RG[0-9]+)(?:[);/ ]|$)'
       model: '$1'
 
-# Aligator
-Aligator:
-  regex: 'ALIGATOR[_);/ ]'
-  device: 'smartphone'
-  models:
-    - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|RX510)(?:[);/ ]|$)'
-      model: '$1'
-
 # Maxcom
 Maxcom:
   regex: '(MS(?:45[036]|505|514)|MS457(?:PLUS)?)(?:[);/ ]|$)'
@@ -16247,14 +23462,20 @@ Maxcom:
 
 # Luna
 Luna:
-  regex: '(?:LUNA[ _](?:V55|G[56]0)|TG-L800S)(?:[);/ ]|$)'
+  regex: '(?:LUNA[ _](?:[VG]55|G[56]0)|TG-L800S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'LUNA[ _](V55|G[56]0)(?:[);/ ]|$)'
+    - regex: 'LUNA[ _]([VG]55|G[56]0)(?:[);/ ]|$)'
       model: '$1'
     - regex: '(TG-L800S)(?:[);/ ]|$)'
       model: '$1'
 
+# Luxor
+Luxor:
+  regex: 'LUXOR, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
 # Protruly
 Protruly:
   regex: 'PROTRULY[ _](D[78]|V10S)(?:[);/ ]|$)'
@@ -16275,13 +23496,17 @@ Uhans:
 
 # Soyes
 Soyes:
-  regex: 'SOYES[ _]([67]S)(?:[);/ ]|$)'
+  regex: '(?:SOYES[ _](?:[67]S|XS|XS11)|S10-H)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'SOYES[ _]([67]S|XS11|XS)'
+      model: '$1'
+    - regex: 'S10-H'
+      model: 'S10-H'
 
 # Zidoo
 Zidoo:
-  regex: 'ZIDOO[ _](H6 Pro|X6 Pro|X9S|Z10|X[158])(?:[);/ ]|$)'
+  regex: 'ZIDOO[ _](H6 Pro|X6 Pro|X9S|Z10|X[158]|X20 Pro|Z9S)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
@@ -16293,20 +23518,10 @@ Zfiner:
 
 # iGet
 iGet:
-  regex: 'SMART_(G10[12]|G71|G81[H]?)(?:[);/ ]|$)'
+  regex: 'SMART[_ ](L20X|G10[12]|S7[02]|G71|G81[H]?|L103|W10X)(?:_eea)?(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Smart $1'
 
-# iVA
-iVA:
-  regex: '(LAMCY L350|IVA S6)(?:[);/ ]|$)'
-  device: 'smartphone'
-  models:
-    - regex: 'LAMCY L350(?:[);/ ]|$)'
-      model: 'Lamcy L350'
-    - regex: 'IVA S6(?:[);/ ]|$)'
-      model: 'S6'
-
 # Phicomm
 Phicomm:
   regex: '(PHICOMM)(?:[);/ ]|$)'
@@ -16318,7 +23533,7 @@ Phicomm:
       model: 'Energy L'
     - regex: 'PHICOMM ENERGY 3\+(?:[);/ ]|$)'
       model: 'Energy 3+'
-    - regex: 'CLUE (2S|M)(?:[);/ ]|$)'
+    - regex: 'CLUE (2S|M|C230)(?:[);/ ]|$)'
       model: 'Clue $1'
 
 # Huadoo
@@ -16329,40 +23544,62 @@ Huadoo:
 
 # Gome
 Gome:
-  regex: 'GOME[_ ](2018X38A|2017X05A|2016G68A|2017M27A|2016M25A|C7_Note_Plus|U9|S[17])(?:[);/ ]|$)'
+  regex: '(?:GOME[_ ](?:201[678].+|C7_Note(?:_Plus)?|U9|S[17])|Fenmmy_Note)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'GOME[_ ](?:2018X38A)(?:[);/ ]|$)'
       model: 'C72'
+    - regex: 'GOME[_ ](?:2018X07A)(?:[);/ ]|$)'
+      model: 'C7'
     - regex: 'GOME[_ ](?:2017X05A)(?:[);/ ]|$)'
       model: 'C71'
+    - regex: 'GOME[_ ](?:2017X82A)(?:[);/ ]|$)'
+      model: 'C51'
     - regex: 'GOME[_ ](?:2016G68A)(?:[);/ ]|$)'
       model: 'K1'
     - regex: 'GOME[_ ](?:2016M25A)(?:[);/ ]|$)'
       model: 'U1'
     - regex: 'GOME[_ ](?:2017M27A)(?:[);/ ]|$)'
       model: 'U7'
-    - regex: 'GOME[_ ](C7_Note_Plus|U9|S[17])(?:[);/ ]|$)'
+    - regex: 'GOME[_ ](?:2017M95A)(?:[);/ ]|$)'
+      model: 'U7 Mini'
+    - regex: 'GOME[_ ](?:2018M29A)(?:[);/ ]|$)'
+      model: 'U9'
+    - regex: 'GOME[_ ](C7_Note(?:_Plus)?|U9|S[17])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(?:GOME[_ ])?(Fenmmy_Note)(?:[);/ ]|$)'
+      device: 'phablet'
       model: '$1'
 
-# Voyo
+# Voyo (en.myvoyo.com)
 Voyo:
-  regex: 'VOYO[_ ](A15)(?:[);/ ]|$)'
+  regex: '(?:VOYO[_ ](?:A15)|i8-Max|Q101-4G)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'i8-Max(?:[);/ ]|$)'
+      model: 'i8 Max'
+    - regex: '(Q101)-4G(?:[);/ ]|$)'
+      model: '$1 4G'
+    - regex: 'VOYO[_ ](A15)(?:[);/ ]|$)'
+      model: '$1'
 
-# Ryte (Ryte Mobile)
+# Ryte (rytemobile.com)
 Ryte:
-  regex: 'RYTE (U55 LTE)(?:[);/ ]|$)'
+  regex: '(?:RYTE U55 LTE|RT701)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'RYTE (U55 LTE)'
+      model: '$1'
+    - regex: '(RT701)'
+      device: 'tablet'
+      model: '$1'
 
 # Vontar
 Vontar:
-  regex: '(HK1 (?:Max|MINI|PLUS|PRO)|VONTAR[ -](?:Z[58]|V1|KIII|MX-4K))(?:[);/ ]|$)'
+  regex: '(HK1 (?:Max|MINI|PLUS|PRO)|VONTAR[ -](?:Z[58]|V1|KIII|MX-4K|X3))(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'VONTAR[ -](Z[58]|V1|KIII|MX-4K)(?:[);/ ]|$)'
+    - regex: 'VONTAR[ -](Z[58]|V1|KIII|MX-4K|X3)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'HK1 Max(?:[);/ ]|$)'
       model: 'HK1 Max'
@@ -16375,7 +23612,7 @@ Vontar:
 
 # Vorke
 Vorke:
-  regex: 'VORKE (Z[15]|Z6(?: Plus)?)(?:[);/ ]|$)'
+  regex: 'VORKE (Z[157]|Z6(?: Plus)?)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
@@ -16385,39 +23622,64 @@ Wigor:
   device: 'smartphone'
   model: '$1'
 
-# NEXON
+# NEXON (nexon.ua)
 NEXON:
-   regex: 'NEXON (X[19])(?:[);/ ]|$)'
-   device: 'tv'
-   model: '$1'
+  regex: 'NEXON (X3\+|X[12589])(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
 
-# ONN
+# ONN (walmart)
 ONN:
-  regex: '(ONA19TB00[27])(?:[);/ ]|$)'
+  regex: '(ONA19TB00[327]|10000520[6-9]|O8HD|100026191|100011886|10000356[12]|100011885|100015685-A|TBBVNC10000520[78])(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# EXO S.A (exo.com.ar)
+EXO:
+  regex: '(?:EXO_)?(Wave_i101G|Wave_i007B?|Wave i101[Hb]|Wave-i101L)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
-# Q.Bell
+# Q.Bell (qbell.it)
 'Q.Bell':
-  regex: '(QPHONE[_ ](?:10.1|9.1|5.4))(?:[);/ ]|$)'
+  regex: '(QPHONE[_ ](?:10.1|9.[12]|7.1|5.[246])|QTAB10EW)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: '(QPHONE[_ ](?:10.1|9.[12]|7.1|5.[246]))(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'QTAB10EW'
+      device: 'tablet'
+      model: 'QTAB10EW'
 
 # Datawind
 Datawind:
-  regex: '(DW-PS3G5)(?:[);/ ]|$)'
+  regex: 'DW-[A-Z0-9]{5}(?:[);/ ]|$)'
   device: 'smartphone'
-  model: 'Pocket Surfer 3G5'
+  models:
+    - regex: '(DW-PS3G5)(?:[);/ ]|$)'
+      model: 'Pocket Surfer 3G5'
+    - regex: 'DW-UBT7W'
+      device: 'tablet'
+      model: 'Ubislate 7W'
 
-# Droxio
+# Droxio (droxio.es) sub brand 3GO
 Droxio:
-  regex: 'DROXIO (C40|B45)(?:[);/ ]|$)'
+  regex: 'DROXIO (C40|A47|B45|KENTIA)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
+# 3GO (www.3go.es)
+3GO:
+  regex: '(?:Aplay ?[34])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Aplay ?([34])'
+      device: 'tablet'
+      model: 'Aplay $1'
+
 # Goophone
 Goophone:
-  regex: '(?:M(G492|L7[JK]2)CH|MN(4A2|8J2)ZP|MGA92ZP|MKU82ZP|MNGW2CH|MNH02CH|MNRM2CH)[/]A(?:[);/ ]|$)'
+  regex: 'Goophone[ _]|(?:M(G492|L7[JK]2)CH|MN(4A2|8J2)ZP|MGA92ZP|MKU82ZP|MNGW2CH|MNH02CH|MNRM2CH)[/]A(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:MG492CH|MGA92ZP)[/]A(?:[);/ ]|$)'
@@ -16432,22 +23694,42 @@ Goophone:
       model: 'I7'
     - regex: '(?:MN8J2ZP|MNRM2CH)[/]A(?:[);/ ]|$)'
       model: 'I7 Plus'
+    - regex: 'S4 MEGA(?:[);/ ]|$)'
+      model: 'S4 Mega'
+    - regex: 'Goophone i([69])(?:[);/ ]|$)'
+      model: 'I$1'
 
 # PocketBook
 PocketBook:
-  regex: 'PocketBook SURFpad 3 \(([\d]+).([\d]+)["]?\)(?:[);/ ]|$)'
+  regex: 'PocketBook[ _/]'
   device: 'tablet'
-  model: 'Surfpad 3 $1.$2"'
+  models:
+    - regex: 'A7(?:[);/ ]|$)'
+      model: 'A7'
+    - regex: 'A10 3G(?:[);/ ]|$)'
+      model: 'A10 3G'
+    - regex: 'A10(?:[);/ ]|$)'
+      model: 'A10'
+    - regex: 'SURFpad2(?:[);/ ]|$)'
+      model: 'SURFpad 2'
+    - regex: 'PocketBook SURFpad 3 \(([\d]+).([\d]+)["]?\)(?:[);/ ]|$)'
+      model: 'SURFpad 3 $1.$2"'
+    - regex: 'SURFpad 4 ([LMS])(?:[);/ ]|$)'
+      model: 'SURFpad 4 $1'
+    - regex: 'PocketBook/(515|614|62[23467]|63[012]|64[01]|650|740|801|840)(?:[);/ ]|$)'
+      model: '$1'
 
 # Bitmore
 Bitmore:
-  regex: '(?:Mobitab10c-3G|Tab1011Q_II)(?:[);/ ]|$)'
+  regex: '(?:Mobitab10c-3G|Tab1011Q_II|Colortab[ _]?(10(?:M| II)?|816i))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '(Mobitab)(10)c-3G(?:[);/ ]|$)'
       model: '$1 $2C 3G'
     - regex: 'Tab1011Q_II(?:[);/ ]|$)'
       model: 'Tab1011Q II'
+    - regex: 'Colortab[ _]?(10(?:M| II)?|816i)(?:[);/ ]|$)'
+      model: 'ColorTab $1'
 
 # Kuliao
 Kuliao:
@@ -16457,16 +23739,25 @@ Kuliao:
 
 # Sugar
 Sugar:
-  regex: 'SUGAR (?:C[12]1|[YF]11|[YFS]9|C6|[FY]7|Y8|Y1[25])(?:[);/ ]|$)'
+  regex: 'SUGAR[ _]'
   device: 'smartphone'
   models:
     - regex: 'SUGAR Y([78]) MAX(?:[);/ ]|$)'
       model: 'Y$1 Max'
     - regex: 'SUGAR F7 Mini(?:[);/ ]|$)'
       model: 'F7 Mini'
-    - regex: 'SUGAR (C[12]1|[YF]11|[YFS]9|C6|Y7|Y1[25])(?:[);/ ]|$)'
+    - regex: 'SUGAR[ _]([^);/]+)(?: Build|[);])'
       model: '$1'
 
+# Subor
+Subor:
+  regex: 'SUBOR[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'SUBOR[ _](S5|2019)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'SUBOR[_ ]K10PLUS(?:[);/ ]|$)'
+      model: 'K10 Plus'
 
 # Xshitou
 Xshitou:
@@ -16482,60 +23773,98 @@ JKL:
 
 # Gree
 Gree:
-  regex: '(G0215D|G0245D|G0335D)(?:[);/ ]|$)'
+  regex: '(?:G0[256]15D|G0245D|G0335D)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'G0515D'
+      model: 'Tosot 5G'
+    - regex: 'G0615D'
+      model: 'Tosot 7G'
+    - regex: '(G0215D|G0245D|G0335D)(?:[);/ ]|$)'
+      model: '$1'
 
 # Vodacom
 Vodacom:
-  regex: '(?:Vodacom)[ _](Power Tab 10)(?:[);/ ]|$)'
+  regex: '(?:Vodacom)[ _]|(?:Kicka 5 Plus 4G)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'Kicka 5 Plus 4G'
+      device: 'smartphone'
+      model: 'Kicka 5 Plus 4G'
+    - regex: '(?:Vodacom)[ _](Power Tab 10)(?:[);/ ]|$)'
+      model: '$1'
 
 # VKworld
 VKworld:
-  regex: '(?:(?:VK700)-MAX|T5SE)(?:[);/ ]|$)'
+  regex: '(?:(?:VK700)-MAX|VK700 Pro|T5SE|VK700X|vk6050|vk6735|vk700)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(VK700)-MAX(?:[);/ ]|$)'
       model: '$1 Max'
+    - regex: '(VK700) Pro(?:[);/ ]|$)'
+      model: '$1 Pro'
     - regex: 'T5SE(?:[);/ ]|$)'
       model: 'T5 SE'
+    - regex: 'VK(700X|6050|6735|700)(?:[);/ ]|$)'
+      model: 'VK$1'
 
-# Mito
+# Mito (mitomobile.com)
 Mito:
-  regex: 'MITO[- _](A(?:1[068]|39|55|180|2[36]0|313|322|33|3[136]0|[35]50|6[89]|7[235]|82|[356]0|810|950)|T(?:10|35|3[03]0|510|888)|311)(?:[);/ ]|$)'
+  regex: 'MITO[- _]'
   device: 'smartphone'
   models:
-    - regex: 'MITO[ _](A(?:1[068]|39|55|180|2[36]0|33|322|313|3[136]0|[35]50|6[89]|7[235]|82|[356]0|810|950))(?:[);/ ]|$)'
-      model: '$1'
-    - regex: 'MITO-(311)(?:[);/ ]|$)'
+    - regex: 'MITO[- _]3255(?:[);/ ]|$)'
+      device: 'tv'
+      model: '3255'
+    - regex: 'MITO[- _]A37[_ ]Z1plus'
+      model: 'A37 Z1 Plus'
+    - regex: 'MITO[- _](A(?:19[_ ][12]GB|37[_ ]Z1|36[_ ]W1|[0-9]+)|311)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'MITO[ _](T(?:10|35|3[03]0|510|888))(?:[);/ ]|$)'
+    - regex: 'MITO[- _](T(?:[0-9]+))(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
 
-# TWM
+# TWM or TaiwanMobile
 TWM:
-  regex: 'Amazing[ _](X[35]s|X[2356]|A5S|A[48]|A4S)(?:[);/ ]|$)'
+  regex: 'Amazing[ _](X[35]s|X[123567]|A5S|A3[025]|A[468]|A4S|A5[057]|P6)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Amazing[ _](X[35])s(?:[);/ ]|$)'
       model: 'Amazing $1S'
-    - regex: 'Amazing[ _](A5S|X[2356]|A[48]|A4S)(?:[);/ ]|$)'
+    - regex: 'Amazing[ _](A5S|X[123567]|A[468]|A4S|A5[057]|A3[025])(?:[);/ ]|$)'
+      model: 'Amazing $1'
+    - regex: 'Amazing[ _](P6)(?:[);/ ]|$)'
+      device: 'tablet'
       model: 'Amazing $1'
 
-# Onix
-Onix:
-  regex: '(AT101-1116)(?:[);/ ]|$)'
-  device: 'tablet'
-  model: '$1'
+# TWZ (twz.co.th)
+TWZ:
+  regex: 'TWZ[-_ ](?:TabPlay|Y6[08]|Y52|A49|A[59]5|A567|AA8|QQ[12])|TWZQQ1'
+  device: 'smartphone'
+  models:
+    - regex: 'TWZ[_ ]TabPlay[_ ](12[56])'
+      device: 'tablet'
+      model: 'TabPlay $1'
+    - regex: 'TWZ[-_ ]?(Y6[08]|Y52|A49|A[59]5|A567|AA8|QQ[12])'
+      model: '$1'
+
+# Oale
+Oale:
+  regex: '(?:Apex([13])|CC1 PRO)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(CC1) PRO'
+      model: '$1 Pro'
+    - regex: 'Apex([13])'
+      model: 'Apex $1'
 
 # Mobo
 Mobo:
-  regex: '(MT7-442D)(?:[);/ ]|$)'
+  regex: '(?:(?:MOBO[_ ]MB7005|MT7-421HD)|(?:MT7-442D|MT7-411D))(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: '(?:MOBO[_ ])?(MB7005|MT7-421HD|MT7-442D|MT7-411D)(?:[);/ ]|$)'
+      model: '$1'
 
 # Macoox
 Macoox:
@@ -16545,9 +23874,32 @@ Macoox:
 
 # Prixton
 Prixton:
-  regex: '(T7012Q)(?:[);/ ]|$)'
+  regex: 'PRIXTON |(T7012Q)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'PRIXTON (C18)'
+      device: 'smartphone'
+      model: '$1'
+    - regex: '(T7012Q)(?:[);/ ]|$)'
+      model: '$1'
+
+# Mafe
+Mafe:
+  regex: 'Mafe_M820(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Mafe_M820'
+      model: 'Shine M820'
+
+# Magnus or Magnus Telecom
+Magnus:
+  regex: 'Magnus[ _](?:bravoZ[23]0|Infinity_?(?:G8|G11))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'bravo(Z[23]0)'
+      model: 'Bravo $1'
+    - regex: '(?:Magnus[ _])?Infinity_?(G8|G11)'
+      model: 'Infinity $1'
 
 # Newland
 Newland:
@@ -16555,15 +23907,17 @@ Newland:
   device: 'smartphone'
   model: 'MT90 Orca'
 
-# Orbic
+# Orbic (orbic.us)
 Orbic:
-  regex: '(?:RC555L|RC501L)(?:[);/ ]|$)'
+  regex: 'RC(?:501|545|555)L(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'RC555L(?:[);/ ]|$)'
-      model: 'Wonder'
     - regex: 'RC501L(?:[);/ ]|$)'
       model: 'Slim'
+    - regex: 'RC545L(?:[);/ ]|$)'
+      model: 'Maui'
+    - regex: 'RC555L(?:[);/ ]|$)'
+      model: 'Wonder'
 
 # RED
 RED:
@@ -16573,33 +23927,39 @@ RED:
 
 # Contixo
 Contixo:
-  regex: 'Contixo|(?:CX-1045 3G)(?:[);/ ]|$)'
+  regex: 'Contixo|(?:CX-1045 3G|KT995 3G|CX1045|B108_4G)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'CX-1045 3G(?:[);/ ]|$)'
+    - regex: 'CX-?1045(?: 3G)?(?:[);/ ]|$)'
       model: 'CX-1045 3G'
     - regex: 'CONTIXO GX 1035(?:[);/ ]|$)'
       model: 'GX-1035 4G 10.1"'
+    - regex: 'Contixo GT1160 4G(?:[);/ ]|$)'
+      model: 'GT1160 4G 10.1"'
     - regex: 'B105(?:[);/ ]|$)'
       model: 'B105 3G 10.1"'
-    - regex: 'B108(?:[);/ ]|$)'
+    - regex: 'B108(?:[_ ]4G)?(?:[);/ ]|$)'
       model: 'B108 4G 10.1"'
     - regex: 'KT107(?: 3G)?(?:[);/ ]|$)'
       model: 'KT107 3G 10.1"'
+    - regex: 'K109(?:[);/ ]|$)'
+      model: 'KT109 4G 10.1"'
     - regex: 'KT715 3G(?:[);/ ]|$)'
       model: 'KT715 3G 7.0"'
     - regex: 'KT995(?:[);/ ]|$)'
       model: 'KT995 3G 10.1"'
+    - regex: 'KT ?1100GT(?: 4G)?(?:[);/ ]|$)'
+      model: 'KT1100GT'
 
 # E-Ceros
 'E-Ceros':
-   regex: '(?:CT9716(?:-B)?)(?:[);/ ]|$)'
-   device: 'tablet'
-   models:
-     - regex: 'CT9716(?:[);/ ]|$)'
-       model: 'Revolution'
-     - regex: 'CT9716-B(?:[);/ ]|$)'
-       model: 'Revolution HD'
+  regex: '(?:CT9716(?:-B)?)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'CT9716(?:[);/ ]|$)'
+      model: 'Revolution'
+    - regex: 'CT9716-B(?:[);/ ]|$)'
+      model: 'Revolution HD'
 
 # How (how.com.br)
 How:
@@ -16615,11 +23975,13 @@ How:
 
 # Multilaser
 Multilaser:
-  regex: '(?:Multilaser[ _](?:[FEGH])(?:[_ ](?:Pro|Max|Lite))?|MS50[LGX]|M7[_-]3G[_-]PLUS|MS5\.V2|MS45S_A6|MS45S|MS50S|MS60[XZ]|M7SQC_Plus|MS80X|MS40[GS]|MS55M|MS70|M7-3G QUAD CORE|M7sLite)(?:[);/ ]|$)'
+  regex: '(?:Multilaser[ _](?:[FEGH])(?:[_ ](?:Pro|Max|Lite))?|MS50[LGXM]|M7[_-]3G[_-](?:PLUS|QC_3|QUAD_CORE)|MS5\.V2|M9-3G|MS45S_A6|ML([02]1|12)-M7s[- ]?Quad-?Core| ML01-M7-SD|MS45S|MS50S|MS60[XZ]|M7SQC_Plus|MS80X|MS40[GS]|MS55M|MS70|M7_3G_A10|M7-3G QUAD CORE|M7s_?Lite|M10_4G_PRO|MS50L?_4G|MS60F(?:_PLUS)?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Multilaser[ _]G[_ ]Pro(?:[);/ ]|$)'
       model: 'G Pro'
+    - regex: 'Multilaser[ _]F[_ ]Pro(?:[);/ ]|$)'
+      model: 'F Pro'
     - regex: 'Multilaser[ _]G[_ ]Max(?:[);/ ]|$)'
       model: 'G Max'
     - regex: 'Multilaser[ _]G(?:[);/ ]|$)'
@@ -16628,20 +23990,40 @@ Multilaser:
       model: 'E Lite'
     - regex: 'Multilaser[ _]([FEH])(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(MS50[LGX]|MS45S_A6|MS40[GS]|MS55M|MS70|MS60[XZ]|MS45S|MS80X|MS50S|MS5\.V2)(?:[);/ ]|$)'
+    - regex: 'MS60F_PLUS(?:[);/ ]|$)'
+      model: 'MS60F Plus'
+    - regex: '(MS50[LGXSM]|MS45S_A6|MS40[GS]|MS55M|MS60F|MS70|MS60[XZ]|MS45S|MS80X|MS50L?_4G|MS5\.V2)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'M7[_-]3G[_-]PLUS(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7 3G Plus'
+    - regex: 'M10_4G_PRO(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'M10 4G Pro'
     - regex: 'M7SQC_PLUS(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7SQC Plus'
-    - regex: 'M7-3G QUAD CORE(?:[);/ ]|$)'
+    - regex: 'M7-3G_QC_3(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'M7 3G Quad Core 3'
+    - regex: 'M7-3G[ _]QUAD[ _]CORE(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7 3G Quad Core'
-    - regex: 'M7sLite(?:[);/ ]|$)'
+    - regex: 'ML([02]1|12)-M7s[- ]?Quad-?Core(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'ML$1-M7s Quad Core'
+    - regex: 'M7s_?Lite(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7s Lite'
+    - regex: 'ML01-M7-SD(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'ML01-M7 SD'
+    - regex: 'M9-3G(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'M9 3G'
+    - regex: 'M7_3G_A10(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'M7 3G A10'
 
 # Positivo BGH
 Positivo BGH:
@@ -16676,29 +24058,40 @@ Positivo BGH:
     - regex: 'T1060B(?:[);/ ]|$)'
       device: 'tablet'
       model: 'T1060B'
-    - regex: 'Positivo Ypy L1050E(?:[);/ ]|$)'
+    - regex: 'Positivo Ypy (AB7F|AB10H|L1050E)(?:[);/ ]|$)'
       device: 'tablet'
-      model: 'Ypy L1050E'
+      model: 'Ypy $1'
     - regex: 'Twist Tab(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Twist Tab'
 
 # Maxtron
 Maxtron:
-  regex: 'Maxtron[ _-](V[327]|S8)(?:[);/ ]|$)'
+  regex: 'Maxtron[ _-](V[327]|S[89]|T1)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'Maxtron[ _-](V[327]|S[89])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Maxtron[ _-](T1)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
 
 # Philco (philco.com.br)
 Philco:
-  regex: '(PCS01|PH350B|PTB7R)(?:[);/ ]|$)'
+  regex: 'PHILCO |(PCS0[12]|PH350B|PTB[78]R|PTB7PAP_PTB7PAB_PTB7PAR|Hit Max)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(PCS01|PH350B)(?:[);/ ]|$)'
+    - regex: '(PCS0[12]|PH350B|Hit Max)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(PTB7R)(?:[);/ ]|$)'
+    - regex: '(PTB[78]R)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
+    - regex: 'PHILCO Android TV(?:[);/ ]|$)'
+      device: 'tv'
+      model: ''
+    - regex: 'PTB7PAP_PTB7PAB_PTB7PAR(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'PTB7PA'
 
 # SEMP TCL
 SEMP TCL:
@@ -16716,25 +24109,34 @@ SEMP TCL:
 
 # Newman
 Newman:
-  regex: 'Newman[ _](P308|K1)(?:[);/ ]|$)'
+  regex: 'Newman[ _](P308|K1|G5i)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Swipe
 Swipe:
-  regex: '(Elite Sense)(?:[);/ ]|$)'
+  regex: '(?:Elite Sense|Elite_VR|Slate2)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: '(Elite Sense|Elite_VR)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Slate2(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Slate 2'
 
 # Owwo
 Owwo:
-  regex: 'OWWO[ _]?([1457]S|Q[78])(?:[);/ ]|$)'
+  regex: '(?:OWWO[ _]?(?:[1457]S|Q[78])|CARNIVAL B5)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'OWWO[ _]?([1457]S|Q[78])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'CARNIVAL B5(?:[);/ ]|$)'
+      model: 'Carnival B5'
 
 # 360 or names Qihoo 360, +360
 '360':
-  regex: '(?:180[1379]-A01|1713-A01|1707-A01|1509-A00|1603-A03|1607-A01|1503-A01)(?:[);/ ]|$)'
+  regex: '(?:180[1379]-A01|1713-A01|1707-A01|1509-A00|1603-A03|1607-A01|1503-A01|1505-A02|1605-A01)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '1807-A01(?:[);/ ]|$)'
@@ -16753,10 +24155,14 @@ Owwo:
       model: 'Q5 Plus'
     - regex: '1503-A01(?:[);/ ]|$)'
       model: 'N4'
+    - regex: '1605-A01(?:[);/ ]|$)'
+      model: 'N5'
     - regex: '1603-A03(?:[);/ ]|$)'
       model: 'N4A'
     - regex: '1607-A01(?:[);/ ]|$)'
       model: 'N5S'
+    - regex: '1505-A02(?:[);/ ]|$)'
+      model: 'N4S'
 
 # TD Systems
 TD Systems:
@@ -16766,32 +24172,50 @@ TD Systems:
 
 # Ravoz
 Ravoz:
-  regex: 'RAVOZ[ _](Z[347]|R[478])(?:[);/ ]|$)'
+  regex: 'RAVOZ[ _](Z[57] (?:Lite|Pro)|Z[3-7]|R[478])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
-# Tone Mobile
+# Tone Mobile (tone.ne.jp)
 Tone:
-  regex: 'TONE (e19|m15)(?:[);/ ]|$)'
+  regex: 'TONE[ _](e19|m15|e2[01])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # AT&T
 AT&T:
-   regex: '(?:U304AA|QS5509A)(?:[);/ ]|$)'
-   device: 'smartphone'
-   models:
-     - regex: 'U304AA(?:[);/ ]|$)'
-       model: 'Radiant Core'
-     - regex: 'QS5509A(?:[);/ ]|$)'
-       model: 'Axia'
+  regex: '(?:EA1002|EA21100[12]|U(?:304|202|705|31[89])AA|QS5509A|V340U|V350U)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'U304AA(?:[);/ ]|$)'
+      model: 'Radiant Core'
+    - regex: 'U705AA(?:[);/ ]|$)'
+      model: 'Radiant Max'
+    - regex: 'EA211001(?:[);/ ]|$)'
+      model: 'Radiant Max 5G'
+    - regex: 'QS5509A(?:[);/ ]|$)'
+      model: 'Axia'
+    - regex: 'U318AA(?:[);/ ]|$)'
+      model: 'Calypso'
+    - regex: 'U319AA(?:[);/ ]|$)'
+      model: 'Calypso 2'
+    - regex: 'V350U(?:[);/ ]|$)'
+      model: 'Maestro Plus'
+    - regex: 'U202AA(?:[);/ ]|$)'
+      model: 'Maestro'
+    - regex: 'EA1002(?:[);/ ]|$)'
+      model: 'Maestro Max'
+    - regex: 'EA211002(?:[);/ ]|$)'
+      model: 'Motivate 2'
+    - regex: 'V340U(?:[);/ ]|$)'
+      model: 'Fusion Z' # Vsmart
 
 # BIHEE
 BIHEE:
   regex: '(ZBH-)?BIHEE'
   device: 'smartphone'
   models:
-    - regex: '(A1[12]|A[78]\+|A[56])(?:[);/ ]|$)'
+    - regex: '(A1[1268]|A[78]\+|A[56])(?:[);/ ]|$)'
       model: '$1'
 
 # Enot
@@ -16832,13 +24256,15 @@ Winds:
 
 # Asano
 Asano:
-  regex: '32LF7130S(?:[);/ ]|$)'
+  regex: '(?:32LH7010T|32LH7030S|32LF7130S|28LH7011T)(?:[);/ ]|$)'
   device: 'tv'
-  model: '32LF7130S 32.0"'
+  models:
+    - regex: '(\d{2})(L[FH]\d+[ST])(?:[);/ ]|$)'
+      model: '$1$2 $1.0"'
 
 # Phonemax
 Phonemax:
-  regex: 'PHONEMAX[_ ](Saturn(?:[_ ]X)?|Mars)(?:[);/ ]|$)'
+  regex: '(?:PHONEMAX[_ ](?:Saturn(?:[_ ]X)?|Mars|Venus X)|Rocky 2)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'PHONEMAX[_ ]Saturn[_ ]X(?:[);/ ]|$)'
@@ -16847,6 +24273,10 @@ Phonemax:
       model: 'Saturn'
     - regex: 'PHONEMAX[_ ]Mars(?:[);/ ]|$)'
       model: 'Mars'
+    - regex: 'PHONEMAX[_ ]Venus X(?:[);/ ]|$)'
+      model: 'Venus X'
+    - regex: 'Rocky 2(?:[);/ ]|$)'
+      model: 'Rocky 2'
 
 # Vipro (Vipro Mobile)
 Vipro:
@@ -16858,25 +24288,44 @@ Vipro:
     - regex: 'VIPRO PRO[ _-]?([0-9])(?:[);/ ]|$)'
       model: 'Pro $1'
 
+# Virzo (https://virzo.com/)
+Virzo:
+  regex: 'V608C(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'V608C(?:[);/ ]|$)'
+      model: 'V608c'
+
 # OzoneHD
 OzoneHD:
-  regex: 'OzoneHD[ _](T2 WiFi|4K(?: TV)?)(?:[);/ ]|$)'
+  regex: 'Ozone HD|OzoneHD[ _](T2 WiFi|4K(?: TV)?|Fun)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
-# KZEN
+# KZEN (kzen.me)
 Kzen:
-  regex: 'Ureki_U1(?:[);/ ]|$)'
+  regex: '(?:Ureki_U1|Victor V1|DART KZ07|REX RX)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: 'Ureki U1'
+  models:
+    - regex: 'Ureki_U1'
+      model: 'Ureki U1'
+    - regex: 'Victor V1'
+      model: 'Victor V1'
+    - regex: 'REX RX'
+      model: 'Rex RX'
+    - regex: 'DART KZ07'
+      device: 'tablet'
+      model: 'Dart KZ07'
 
 # MELROSE
 Melrose:
-  regex: 'MELROSE_(?:S9|2019)(?:[);/ ]|$)'
+  regex: 'MELROSE[_ ](?:S9\+?|S9P|2019)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'MELROSE_S9(?:[);/ ]|$)'
-      model: 'S9'
+    - regex: 'MELROSE[_ ]S9\+(?:[);/ ]|$)'
+      model: 'S9 Plus'
+    - regex: 'MELROSE[_ ](S9|S9P)(?:[);/ ]|$)'
+      model: '$1'
     - regex: 'MELROSE_2019(?:[);/ ]|$)'
       model: '2019 Ultra Slim 3.4"'
 
@@ -16910,6 +24359,12 @@ Lumigon:
   device: 'smartphone'
   model: '$1'
 
+# Neo
+Neo:
+  regex: 'NEO, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
 # Neomi
 Neomi:
   regex: 'NEO[ ]?(90[689])(?:[);/ ]|$)'
@@ -16918,19 +24373,25 @@ Neomi:
 
 # Eltex (eltex-co.ru)
 Eltex:
-  regex: '(?:NV501WAC|NV501)(?:[);/ ]|$)'
+  regex: '(?:NV5(?:01|10)WAC|NV501|NV510WB|NV711WAC)(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'NV501WAC(?:[);/ ]|$)'
-      model: 'NV-501-Wac'
+    - regex: 'NV(501|510|711)WAC(?:[);/ ]|$)'
+      model: 'NV-$1-Wac'
     - regex: 'NV501(?:[);/ ]|$)'
       model: 'NV-501'
+    - regex: 'NV510WB(?:[);/ ]|$)'
+      model: 'NV-510-WB'
 
 # Senkatel
 Senkatel:
-  regex: 'Senkatel[ _](T1009|T8002|T701[12]|T9702)(?:[);/ ]|$)'
+  regex: 'Senkatel[ _]|(?:MaximusT1001)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'MaximusT1001'
+      model: 'Maximus T1001'
+    - regex: 'Senkatel[ _](T1009|T8002|T701[12]|T9702)'
+      model: '$1'
 
 # Bobarry
 Bobarry:
@@ -16938,15 +24399,15 @@ Bobarry:
   device: 'tablet'
   model: 'K10 SE'
 
-# Wortmann
+# Wortmann (wortmann.de)
 Wortmann:
-  regex: 'TERRA PAD 1004(?:[);/ ]|$)'
+  regex: 'TERRA[ _]PAD[ _](\d+)(?:[);/ ]|$)'
   device: 'tablet'
-  model: 'Terra Pad 1004'
+  model: 'Terra Pad $1'
 
 # BB Mobile
 BB Mobile:
-  regex: 'Techno[_ ](TQ863Q|X595BT|S700BF|I700AJ|10.1 LTE TQ060X|7.0 LTE TQ763I)(?:[);/ ]|$)'
+  regex: 'bb-mobile|Techno[-_ ](8\.0|9\.7|TQ863Q|X595BT|X800BJ|S700BF|I700AJ|10.1 LTE TQ060X|7.0 LTE TQ763I|I785AP|I101BI)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'Techno[_ ]S700BF(?:[);/ ]|$)'
@@ -16957,10 +24418,21 @@ BB Mobile:
       model: 'Techno 8.0" Poplar LTE TQ863Q'
     - regex: 'Techno[_ ]I700AJ(?:[);/ ]|$)'
       model: 'Techno 7.0" Mozg LTE I700AJ'
+    - regex: 'Techno[-_ ]I785AP(?:[);/ ]|$)'
+      model: 'Techno 7.85" Mozg I785AP'
+    - regex: 'Techno[_ ]X800BJ(?:[);/ ]|$)'
+      model: 'Techno 8.0" Mozg X800BJ'
+    - regex: 'Techno[-_ ]I101BI(?:[);/ ]|$)'
+      model: 'Techno 10.1" Mozg I101BI'
     - regex: 'Techno[_ ]7.0 LTE TQ763I(?:[);/ ]|$)'
       model: 'Techno 7.0" Kalash LTE TQ763I'
+    - regex: '(FirstTab TP-17)(?:[);/ ]|$)'
+      model: '$1'
 
-    - regex: 'Techno[_ ](X595BT)(?:[);/ ]|$)'
+    - regex: 'Techno[_ ](9\.7|8\.0) 3G(?:[);/ ]|$)'
+      model: 'Techno $1" 3G'
+
+    - regex: 'Techno[_ ](?:X595BT)(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Techno Spark 3G X595BT'
 
@@ -16980,31 +24452,54 @@ Billion:
   device: 'smartphone'
   model: 'Capture Plus'
 
-# Tele2 (mobile operator)
+# Tele2 (www.tele2.com) mobile operator
 Tele2:
-  regex: 'Tele2[ _](?:Mi[dn]i[ _][12][\._][10]|Mi[dn]i|Maxi(?:[ _](?:Plus|LTE))?)(?:[);/ ]|$)'
+  regex: 'Tele2[ _]'
   device: 'smartphone'
   models:
-      - regex: 'Tele2[ _]Mini[ _]1[_\.]1(?:[);/ ]|$)'
-        model: 'Mini 1.1'
-      - regex: 'Tele2[ _]Midi[ _]2[_\.]0(?:[);/ ]|$)'
-        model: 'Midi 2.0'
-      - regex: 'Tele2[ _](Maxi(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
-        model: '$1'
-      - regex: 'Tele2[ _](Midi[ _]1\.1|Mi[dn]i)(?:[);/ ]|$)'
-        model: '$1'
+    - regex: 'Tele2[ _](Mi[dn]i)[ _]1.1(?:[);/ ]|$)'
+      model: '$1 1.1'
+    - regex: 'Tele2[ _]Midi[ _]2.0(?:[);/ ]|$)'
+      model: 'Midi 2.0'
+    - regex: 'Tele2[ _]((?:Maxi|Midi)(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Tele2[ _](Mi[dn]i)(?:[);/ ]|$)'
+      model: '$1'
+
+# ALDI NORD
+'ALDI NORD':
+  regex: 'ALDINORD, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
+# ALDI SÜD
+'ALDI SÜD':
+  regex: 'ALDISUED, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
 
 # Alfawise
 Alfawise:
-  regex: '(A95X_R1)(?:[);/ ]|$)'
+  regex: '(?:Alfawise (?:A9)|(?:A95X_R1|Z28Pro))(?:[);/ ]|$)'
   device: 'tv'
-  model: '$1'
+  models:
+    - regex: '(A95X_R1)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Z28Pro(?:[);/ ]|$)'
+      model: 'Z28 Pro'
+    - regex: 'Alfawise (A9)'
+      model: '$1'
 
 # Klipad
 Klipad:
-  regex: '(KL-V905)(?:[);/ ]|$)'
+  regex: 'KLIPAD_|(?:KL-V905|KL4889|KL9878A?(?:_EEA)?|7589AN)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: '(?:KLIPAD_)?(V355B?|KL600|KL-V905)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(KL4889|7589AN|KL9878A?)(?:_EEA)?(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
 
 # SQOOL (sqool.fr)
 SQOOL:
@@ -17012,43 +24507,93 @@ SQOOL:
   device: 'tablet'
   model: 'V$1'
 
-# TurboKids
+# TurboPad (turbopad.ru)
+TurboPad:
+  regex: 'Turbopad[-_ ]?(72[34]|80[23]|912|101[456])(?:NEW)?(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# TurboKids sub brand TurboPad (turbokids.ru)
 TurboKids:
-  regex: 'Turbokids[-_ ]?(TMNT|3G|S4)(?:[);/ ]|$)'
+  regex: 'Turbokids[-_ ]?(TMNT|3G|S4|Princess)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
-# Jinga
+# Türk Telekom (https://www.turktelekom.com.tr/)
+Türk Telekom:
+  regex: 'Turk Telekom'
+  device: 'smartphone'
+  models:
+    - regex: 'TT175(?:[);/ ]|$)'
+      model: 'TT175'
+
+# Jinga (jinga.ru)
 Jinga:
-  regex: 'Jinga[-_ ]|(?:Optim4G|PassPlus|Hotz[_ ]M1)(?:[);/ ]|$)'
+  regex: 'Jinga[-_ ]|(?:(?:Fresh|Optim)4G|Pass(?:Plus|3G)|PicassoNote|Hotz[_ ]M1|WinPRO|Touch4G|Start(?:3G|LTE)?|IGO[ _]L[41]|Basco (?:L3|L[45]00|XS1|S2)|M500-1|Hit4G|A450|Neon(?!/)|JoyPRO|Fresh|GoalPlus)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Optim4G(?:[);/ ]|$)'
       model: 'Optim 4G'
+    - regex: 'Fresh4G(?:[);/ ]|$)'
+      model: 'Fresh 4G'
     - regex: 'Hotz[_ ]M1(?:[);/ ]|$)'
       model: 'Hotz M1'
+    - regex: 'Hit4G(?:[);/ ]|$)'
+      model: 'Hit 4G'
     - regex: 'PassPlus(?:[);/ ]|$)'
       model: 'Pass Plus'
+    - regex: 'Pass3G(?:[);/ ]|$)'
+      model: 'Pass 3G'
+    - regex: 'GoalPlus(?:[);/ ]|$)'
+      model: 'Goal Plus'
+    - regex: '(Win|Joy)PRO(?:[);/ ]|$)'
+      model: '$1 Pro'
+    - regex: 'Touch4G(?:[);/ ]|$)'
+      model: 'Touch 4G'
+    - regex: 'Start3G(?:[);/ ]|$)'
+      model: 'Start 3G'
+    - regex: 'StartLTE(?:[);/ ]|$)'
+      model: 'Start LTE'
+    - regex: 'Start(?:[);/ ]|$)'
+      model: 'Start'
+    - regex: 'PicassoNote(?:[);/ ]|$)'
+      model: 'Picasso Note'
     - regex: 'Jinga Iron(?:[);/ ]|$)'
       model: 'Iron'
+    - regex: 'Fresh(?:[);/ ]|$)'
+      model: 'Fresh'
     - regex: 'Jinga Basco neo(?:[);/ ]|$)'
       model: 'Basco Neo'
-    - regex: 'Jinga Basco L3(?:[);/ ]|$)'
-      model: 'Basco L3'
+    - regex: 'M500-1(?:[);/ ]|$)'
+      model: 'Basco M500 3G'
+    - regex: '(?:Jinga[ _])?Basco[ _](L[13]|L[45]00|XS1|S2)(?:[);/ ]|$)'
+      model: 'Basco $1'
     - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
       model: 'Trezor S1 Plus'
     - regex: 'JINGA_IGO_L2(?:[);/ ]|$)'
       model: 'IGO L2'
-    - regex: 'JINGA_IGO_M1(?:[);/ ]|$)'
-      model: 'IGO M1'
-    - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
-      model: 'Trezor S1 Plus'
+    - regex: '(?:JINGA[_ ])?IGO[_ ]([ML]1|L4)(?:[);/ ]|$)'
+      model: 'IGO $1'
+    - regex: '(?:JINGA[_ ])?(Neon|A450)(?:[);/ ]|$)'
+      model: '$1'
+
+# Jio (https://www.jio.com/)
+Jio:
+  regex: 'LS1542QWN(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'LS1542QWN(?:[);/ ]|$)'
+      model: 'JioPhone Next'
 
 # Twoe
 Twoe:
-  regex: 'TWOE[-_ ](E450R)(?:[);/ ]|$)'
+  regex: '(?:TWOE[-_ ]E450R|F534L|F572L|E500A)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'TWOE[-_ ](E450R)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(F534L|F572L|E500A)(?:[);/ ]|$)'
+      model: '$1'
 
 # iTruck
 iTruck:
@@ -17056,11 +24601,16 @@ iTruck:
   device: 'smartphone'
   model: '7.0" 3G'
 
-# Torex
+# Torex (torex.tools)
 Torex:
-  regex: 'TOREX-(PS12)(?:[);/ ]|$)'
+  regex: 'TOREX[- ](?:PS12|S18|S27)(?:[);/ ]|$)'
   device: 'tablet'
-  model: '$1'
+  models:
+    - regex: 'TOREX-(PS12)'
+      model: '$1'
+    - regex: 'TOREX[- ](S18|S27)'
+      device: 'smartphone'
+      model: '$1'
 
 # Doffler
 Doffler:
@@ -17074,87 +24624,177 @@ Oyyu:
   device: 'tablet'
   model: 'T11 3G'
 
-# Primux
+# Primux (primux.es)
 Primux:
-   regex: 'Primux'
-   device: 'smartphone'
-   models:
-     - regex: 'PrimuxDelta6(?:[);/ ]|$)'
-       model: 'Delta 6'
+  regex: 'Primux|SirocoY'
+  device: 'smartphone'
+  models:
+    - regex: 'Primux_ioxphone(?:[);/ ]|$)'
+      model: 'IOX Phone'
+    - regex: 'PrimuxDelta6(?:[);/ ]|$)'
+      model: 'Delta 6'
+    - regex: 'PrimuxKappa(P50[01])(?:[);/ ]|$)'
+      model: 'Kappa $1'
+    - regex: 'PrimuxKappa(?:[);/ ]|$)'
+      model: 'Kappa'
+    - regex: 'Primux_Beta2(?:[);/ ]|$)'
+      model: 'Beta 2'
+    - regex: 'Primux_?Omega([57])(?:[);/ ]|$)'
+      model: 'Omega $1'
+
+    - regex: 'PrimuxUP(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'UP'
+    - regex: ' PrimuxZonda4(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Zonda 4'
+    - regex: 'Primux_Siroco6(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Siroco 6'
+    - regex: 'SirocoY(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'Siroco Y'
 
 # iMars
 iMars:
-  regex: 'IMARS VEGA X7(?:[);/ ]|$)'
+  regex: '(?:IMARS VEGA X7|VIVI_8|MILKY_WAY_M2)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: 'Vega X7'
+  models:
+    - regex: 'IMARS VEGA X7'
+      model: 'Vega X7'
+    - regex: 'VIVI_8'
+      model: 'VIVI 8'
+    - regex: 'MILKY_WAY_M2'
+      model: 'Milky Way M2'
 
-# Logic
+# Logic (logicmobility.com)
 Logic:
-  regex: 'LOGIC[_ ](X[135]|X4M|L5D|X5[AFT]|X60G)(:?[_ ]LITE2?)?(?:[);/ ]|$)'
+  regex: '(?:LOGIC[_ ](X50|X[135]|X4M|L5D|X5[AFT]|X60G|L50T?|L57|L6[01]|X60_PLUS)(:?[_ ]LITE2?)?|L55[ABS])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'LOGIC[_ ]X60_PLUS(?:[);/ ]|$)'
+      model: 'X60 Plus'
     - regex: 'LOGIC[_ ](X5|X4M)[_ ]LITE(?:[);/ ]|$)'
       model: '$1 Lite'
     - regex: 'LOGIC[_ ](X5)[_ ]LITE2(?:[);/ ]|$)'
       model: '$1 Lite 2'
-    - regex: 'LOGIC[_ ](X[13]|X4M|L5D|X5[AFT]|X60G)(?:[);/ ]|$)'
+    - regex: 'LOGIC[_ ](X50|X[13]|X4M|L5D|X5[AFT]|X60G|L6[01])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(L50T?|L57|L55[ABS])(?:[);/ ]|$)'
+      model: '$1'
+
+# Cloud or Cloud TruConnect (www.cloudmobileusa.com)
+Cloud:
+  regex: '(?:Cyclone_C4|Storm_C3|Stratus_C5(?:_Elite)?|Sunshine_T1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(Sunshine_T1)'
+      device: 'tablet'
+      model: '$1'
+    - regex: 'Storm_C3'
+      model: 'Storm C3'
+    - regex: 'Stratus_C5_Elite'
+      model: 'Stratus C5 Elite'
+    - regex: '(Stratus_C5|Cyclone_C4)'
       model: '$1'
 
+# Cloudpad
+Cloudpad:
+  regex: '\+VT(?:107C|Q007C)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '\+VT(107C)'
+      model: '+VT$1'
+    - regex: '\+VTQ(007C)'
+      model: '+VTQ$1'
+
 # Cloudfone
 Cloudfone:
-  regex: 'Thrill (?:Boost[ ]?(2|3)?|Snap|Access)(?:[);/ ]|$)'
+  regex: 'CloudFone[ _]|(?:Thrill (?:Boost[ ]?(2|3)?|Snap|Access|Plus 16GB)|Excite Prime 2 Pro|NBA Edition|Go SP|Next Infinity Plus|Go Connect)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'Thrill Boost 2 Plus(?:[);/ ]|$)'
+      model: 'Thrill Boost 2 Plus'
     - regex: 'Thrill Boost (2|3)(?:[);/ ]|$)'
       model: 'Thrill Boost $1'
     - regex: 'Thrill Boost(?:[);/ ]|$)'
       model: 'Thrill Boost'
     - regex: 'Thrill Snap(?:[);/ ]|$)'
       model: 'Thrill Snap'
+    - regex: 'Thrill Plus 16GB(?:[);/ ]|$)'
+      model: 'Thrill Plus 16GB'
     - regex: 'Thrill Access(?:[);/ ]|$)'
       model: 'Thrill Access'
+    - regex: 'Excite Prime 2 Pro(?:[);/ ]|$)'
+      model: 'Excite Prime 2 Pro'
+    - regex: 'NBA Edition(?:[);/ ]|$)'
+      model: 'NBA Edition'
+    - regex: '(Go SP(?: 2)?|Next Infinity Plus|Go Connect(?: Lite)?(?: 2)?)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Next(?:[);/ ]|$)'
+      model: 'Next'
 
 # Vsmart
 Vsmart:
-  regex: '(?:Joy 1\+|Active 1\+|Bee 3)(?:[);/ ]|$)'
+  regex: '(?:Joy [123]\+|Joy [34]|Active 1\+|Bee 3|Active 3|V341U|Bee Lite)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Joy 1\+(?:[);/ ]|$)'
-      model: 'Joy 1 Plus'
+    - regex: 'Joy ([123])\+(?:[);/ ]|$)'
+      model: 'Joy $1 Plus'
+    - regex: 'Joy ([34])(?:[);/ ]|$)'
+      model: 'Joy $1'
     - regex: 'Active 1\+(?:[);/ ]|$)'
       model: 'Active 1 Plus'
     - regex: 'Bee 3(?:[);/ ]|$)'
       model: 'Bee 3'
+    - regex: 'Active 3(?:[);/ ]|$)'
+      model: 'Active 3'
+    - regex: 'V341U(?:[);/ ]|$)'
+      model: 'Hobson'
+    - regex: 'Bee Lite(?:[);/ ]|$)'
+      model: 'Bee Lite'
 
 # MiXzo
 MiXzo:
-  regex: '(?:MiXzo )?(?:ME1030|MX1037|MX1041)[ _][34]G(?:[);/ ]|$)'
+  regex: '(?:MiXzo[ _])?(?:ME ?10(?:2[35]|30)|MX1037|MX1024|MX10[24]1|MX1397)([ _][34]G)?(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'MiXzo ME1030[_ ]3G(?:[);/ ]|$)'
-      model: 'ME1030 3G'
-    - regex: '(?:MiXzo )?MX1041[ _]4G(?:[);/ ]|$)'
-      model: 'MX1041 4G'
-    - regex: '(?:MiXzo )?MX1037[ _]4G(?:[);/ ]|$)'
-      model: 'MX1037 4G'
+    - regex: 'MiXzo[_ ]ME ?(1023|1030)(?:[_ ]([34])G)(?:[);/ ]|$)'
+      model: 'ME$1 $2G'
+    - regex: 'MiXzo[_ ]MX1021(?:[_ ]3G)?(?:[);/ ]|$)'
+      model: 'MX1021 3G'
+    - regex: '(?:MiXzo[ _])?MX(1037|1041|1024|1397)[ _]4G(?:[);/ ]|$)'
+      model: 'MX$1 4G'
+    - regex: 'ME ?1025'
+      model: 'ME1025 3G'
 
 # Openbox
 Openbox:
-  regex: 'Openbox (A[34](?: (?:Pro|Lite))?)(?:[);/ ]|$)'
+  regex: '(?:Openbox (?:A[34](?: (?:Pro|Lite))?)|AS_4K_CI(?:_PRO)?)(?:[);/ ]|$)'
   device: 'tv'
-  model: '$1'
+  models:
+    - regex: 'Openbox (A[34](?: (?:Pro|Lite))?)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'AS_4K_CI_PRO'
+      model: 'AS 4K CI Pro'
+    - regex: 'AS_4K_CI'
+      model: 'AS 4K CI'
 
 # Ziox
 Ziox:
-  regex: 'ZIOX[_ ]|(?:Astra Viva 4G|Astra NXT Pro)(?:[);/ ]|$)'
+  regex: 'ZIOX[_ ]|(?:Astra Viva 4G|Astra (?:(?:NXT|Curve|Young) Pro|(?:Metal|Titan|Young|Curve) 4G|Star|Blaze)|Duopix \w\d{1,2})(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'ZIOX_F9_PRO(?:[);/ ]|$)'
+    - regex: 'ZIOX[_ ]F9[_ ]PRO(?:[);/ ]|$)'
       model: 'F9 Pro'
-    - regex: 'Astra Viva 4G(?:[);/ ]|$)'
-      model: 'Astra Viva 4G'
-    - regex: 'Astra NXT Pro(?:[);/ ]|$)'
-      model: 'Astra NXT Pro'
+    - regex: 'Astra (Viva|Titan|Young|Metal|Curve) 4G(?:[);/ ]|$)'
+      model: 'Astra $1 4G'
+    - regex: 'Astra (Star|Blaze)(?:[);/ ]|$)'
+      model: 'Astra $1'
+    - regex: 'Astra (NXT|Curve|Young) Pro(?:[);/ ]|$)'
+      model: 'Astra $1 Pro'
+    - regex: 'Duopix (\w\d{1,2})(?:[);/ ]|$)'
+      model: 'Duopix $1'
 
 # iDroid
 iDroid:
@@ -17178,27 +24818,67 @@ Aoson:
     - regex: 'aoson(M707TG)(?:[);/ ]|$)'
       model: '$1'
 
+# Finlux
+Finlux:
+  regex: 'FINLUX, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
 # FireFly Mobile
 FireFly Mobile:
-  regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|FORCE|FUSION|F8[_ ]Premium|XCITE))(?:[);/ ]|$)'
+  regex: '(?:AURII[ _](?:Passion|Virtuoso|ULTRA|Secret Lite|AMUSE[_ ]3G|FORCE|FUSION|F8[_ ]Premium|XCITE|DELIGHT|DREAM[_ ](?:MINI|One))|SECRET_XR|INTENSE[ _](?:POWER|METAL_2|XT)|SUPER SWEET|SWEET MINI)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AURII[ _]FORCE(?:[);/ ]|$)'
-      model: 'AURII Force'
+      model: 'Aurii Force'
+    - regex: 'AURII[ _]DELIGHT(?:[);/ ]|$)'
+      model: 'Aurii Delight'
+    - regex: 'AURII[ _]DREAM[_ ]MINI(?:[);/ ]|$)'
+      model: 'Aurii Dream Mini'
+    - regex: 'AURII[ _]DREAM[_ ]One(?:[);/ ]|$)'
+      model: 'Aurii Dream One'
+    - regex: 'AURII[ _]ULTRA(?:[);/ ]|$)'
+      model: 'Aurii Ultra'
+    - regex: 'AURII[ _]AMUSE[_ ]3G(?:[);/ ]|$)'
+      model: 'Aurii Amuse 3G'
     - regex: 'AURII[ _]FUSION(?:[);/ ]|$)'
-      model: 'AURII Fusion'
+      model: 'Aurii Fusion'
     - regex: 'AURII[ _]XCITE(?:[);/ ]|$)'
-      model: 'AURII xCite'
-    - regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|F8[_ ]Premium))(?:[);/ ]|$)'
-      model: '$1'
+      model: 'Aurii xCite'
+    - regex: 'SECRET_XR(?:[);/ ]|$)'
+      model: 'Aurii Secret XR'
+    - regex: 'AURII[ _]((?:Passion|Virtuoso|Secret Lite|F8[_ ]Premium))(?:[);/ ]|$)'
+      model: 'Aurii $1'
+    - regex: 'INTENSE POWER(?:[);/ ]|$)'
+      model: 'Intense Power'
+    - regex: 'INTENSE_XT(?:[);/ ]|$)'
+      model: 'Intense XT'
+    - regex: 'INTENSE_METAL_2(?:[);/ ]|$)'
+      model: 'Intense Metal 2'
+    - regex: 'SUPER SWEET(?:[);/ ]|$)'
+      model: 'Super Sweet'
+    - regex: 'SWEET MINI(?:[);/ ]|$)'
+      model: 'Sweet Mini'
+
+# FISE (http://www.fise.com.cn/)
+FISE:
+  regex: 'Fise_'
+  device: 'smartphone'
+  models:
+    - regex: 'Fise_32433_3G(?:[);/ ]|$)'
+      device: 'feature phone'
+      model: 'M32433 3G'
 
 # i-Cherry or iCherry
 i-Cherry:
   regex: 'iCherry_?'
   device: 'smartphone'
   models:
-     - regex: 'iCherry[ _]C(25[125]|21[16]|110|121|22[079]|23[03])(?:[);/ ]|$)'
-       model: 'C$1'
+    - regex: 'iCherry[ _](C(?:25[1258]|21[16]|110|121|22[0379]|23[03])|X1)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'iCherry-C256'
+      device: 'tablet'
+      model: 'C256 Nano 3G'
 
 # NextTab
 NextTab:
@@ -17208,9 +24888,9 @@ NextTab:
 
 # Time 2
 Time2:
- regex: '(TC1050G)(?:[);/ ]|$)'
- device: 'tablet'
- model: '$1 10.1"'
+  regex: '(TC1050G)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1 10.1"'
 
 # Sunstech
 Sunstech:
@@ -17218,11 +24898,28 @@ Sunstech:
   device: 'tablet'
   model: '$1'
 
-# Hotwav
+# Hotwav (www.hotwav.com)
 Hotwav:
-  regex: '(Venus[_ ]X1[024569]|Pearl K2)(?:[);/ ]|$)'
+  regex: '(?:Venus[_ ](?:X[12]|X1[0245679]|R8 PLUS|R[236-9]|R1[028]|X16-1)|Cosmos[ _](?:V8_lite|V19_Plus|V2[0-3]|U2|V1[359]|V[45689]|V8-2)|Pearl K2|Magic Q8|Magic 5 Plus|Magic (?:[89]|1[13])|Hot[_ ]6|Symbol (?:M1|X|Max|R60))(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'Cosmos[ _]V8_lite(?:[);/ ]|$)'
+      model: 'Cosmos V8 Lite'
+    - regex: 'Hot[_ ]6?(?:[);/ ]|$)'
+      model: 'Hot 6'
+    - regex: 'Venus R8 PLUS(?:[);/ ]|$)'
+      model: 'Venus R8 Plus'
+    - regex: 'Venus[_ ]X16(?:-1)?(?:[);/ ]|$)'
+      model: 'Venus X16'
+    - regex: 'Venus[_ ](X[12]|X1[0245679]|R[236-9]|R1[028])(?:[);/ ]|$)'
+      model: 'Venus $1'
+    - regex: 'Symbol M1'
+      model: 'Symbol M1'
+    - regex: 'Symbol R60'
+      device: 'phablet'
+      model: 'Symbol R60'
+    - regex: '(Cosmos[ _](?:V19_Plus|V2[0-3]|U2|V1[359]|V[45689])|Pearl K2(?: Prime)?|Magic Q8|Magic 5 Plus|Magic (?:[89]|1[13])|Symbol (?:X|Max))(?:-2)?(?:[);/ ]|$)'
+      model: '$1'
 
 # Tetratab
 Tetratab:
@@ -17238,9 +24935,13 @@ Dolamee:
 
 # INVIN
 Invin:
-  regex: 'INVIN[ _-](X[24]|KM6)(?:[);/ ]|$)'
+  regex: 'INVIN[ _-]|KM5PRO(?:[);/ ]|$)'
   device: 'tv'
-  model: '$1'
+  models:
+    - regex: 'INVIN[ _-](X[24]|KM[678])'
+      model: '$1'
+    - regex: 'KM5PRO'
+      model: 'KM5 Pro'
 
 # Doopro
 Doopro:
@@ -17278,11 +24979,30 @@ Nos:
     - regex: 'NOS Roya(?:[);/ ]|$)'
       model: 'Roya'
 
-# Accent
+# Accent (DBM Maroc) (accent.ma)
 Accent:
-  regex: 'ACCENT_NEON(?:[);/ ]|$)'
-  device: 'smartphone'
-  model: 'Neon'
+  regex: '(?:ACCENT[_ ]NEON|FAST73G|PEARL[_ ]A[24567]|TANK_P55|CAMELEON[_ ](?:C[456]|A1)(?:[_ ]PLUS)?|Speed[- ](?:[AXYM]2|X2\+))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'ACCENT[_ ]NEON(?:[);/ ]|$)'
+      model: 'Neon'
+    - regex: 'CAMELEON[_ ]C6[_ ]PLUS(?:[);/ ]|$)'
+      model: 'Cameleon C6 Plus'
+    - regex: 'Speed[- ]([AXYM]2)(?:[);/ ]|$)'
+      model: 'Speed $1'
+    - regex: 'Speed-X2\+(?:[);/ ]|$)'
+      model: 'Speed X2 Plus'
+    - regex: 'CAMELEON[_ ](C[456]|A1)(?:[);/ ]|$)'
+      model: 'Cameleon $1'
+    - regex: 'PEARL A4 Lite(?:[);/ ]|$)'
+      model: 'Pearl A4 Lite'
+    - regex: 'PEARL[_ ]A([2567])(?:[);/ ]|$)'
+      model: 'Pearl A$1'
+    - regex: 'TANK_P55(?:[);/ ]|$)'
+      model: 'Tank P55'
+    - regex: 'FAST73G(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'FAST7 3G'
 
 # Avenzo (www.avenzo.es)
 Avenzo:
@@ -17294,17 +25014,54 @@ Avenzo:
     - regex: 'MOB4PRO 4G(?:[);/ ]|$)'
       model: 'Mob 4 Pro 4G'
 
-# Beelink
+# Beelink (www.bee-link.com)
 Beelink:
-  regex: 'Beelink (GT1|LAKE I|SEA I|A1)(?:[);/ ]|$)'
+  regex: '(?:Beelink (?:G[ST]1|LAKE I|SEA I|A1)|GTKing(?:_AT)?|GT1mini-2|GT1-mini(?:[-_]AT)?)(?:[);/ ]|$)'
   device: 'tv'
-  model: '$1'
+  models:
+    - regex: 'Beelink (G[ST]1|LAKE I|SEA I|A1)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'GT1-mini(?:-AT)?(?:[);/ ]|$)'
+      model: 'GT1 Mini'
+    - regex: 'GT1mini-2(?:[);/ ]|$)'
+      model: 'GT1 Mini 2'
+    - regex: 'GTKing PRO(?:[);/ ]|$)'
+      model: 'GT King Pro'
+    - regex: 'GTKing(?:_AT)?(?:[);/ ]|$)'
+      model: 'GT King'
 
 # MAXVI
 MAXVI:
-  regex: 'MAXVI[ _](MS401)(?:[);/ ]|$)'
+  regex: 'MAXVI[ _](?:MS401)(?:[);/ ]|$)|\w*_?MAXVI?_\w+|MS502[_ ]Orion|MS531'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'MAXVI[ _](MS401)'
+      model: '$1'
+    - regex: 'MS531'
+      model: 'MS531 Vega'
+    - regex: 'MS502[_ ]Orion'
+      model: 'MS502 Orion'
+    - regex: '\w*MAXVI_(P11|K10|X[358]00)_'
+      device: 'feature phone'
+      model: '$1'
+
+# MDC Store (http://mdc.store/ or https://www.facebook.com/mdcmobileuzbekistan/)
+MDC Store:
+  regex: '(?:Prime_S|M300 4G|MDC M5)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Prime_S(?:[);/ ]|$)'
+      model: 'Prime S'
+    - regex: '(M300) 4G(?:[);/ ]|$)'
+      model: '$1 4G'
+    - regex: 'MDC M5(?:[);/ ]|$)'
+      model: 'M5'
+
+# MDTV
+MDTV:
+  regex: 'MDTV(?:[);/ ]|$)'
+  device: 'tv'
+  model: ''
 
 # meanIT (meanit.hr)
 meanIT:
@@ -17333,17 +25090,17 @@ X-BO:
 
 # Xgody
 Xgody:
-  regex: 'XGODY'
+  regex: 'XGODY|Y19\(EU\)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'XGODY Y17(?:[);/ ]|$)'
       model: 'Y17'
-
+    - regex: 'Y19\(EU\)'
+      model: 'Y19'
     - regex: 'XGODY_X96(?:[);/ ]|$)'
       model: 'X96'
       device: 'tv'
 
-
 # Alcor (alcordigital)
 Alcor:
   regex: '(Access_Q784C)(?:[);/ ]|$)'
@@ -17352,7 +25109,7 @@ Alcor:
 
 # iBrit
 iBrit:
-  regex: 'IBRIT_'
+  regex: 'IBRIT_|(?:SI5[12])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IBRIT_I([57])(?:[);/ ]|$)'
@@ -17361,6 +25118,10 @@ iBrit:
       model: 'Power 6'
     - regex: 'iBRIT_Speed Pro(?:[);/ ]|$)'
       model: 'Speed Pro'
+    - regex: 'SI51(?:[);/ ]|$)'
+      model: 'Speed'
+    - regex: 'SI52(?:[);/ ]|$)'
+      model: 'Speed Plus'
 
 # Ovvi
 Ovvi:
@@ -17370,26 +25131,44 @@ Ovvi:
 
 # Fero
 Fero:
-  regex: 'Fero_|Royale_X2'
+  regex: 'Fero[_ ]|Royale[_ ](?:[YX]2|A1)'
   device: 'smartphone'
   models:
     - regex: 'Fero_Y1'
       model: 'Y1'
-    - regex: 'Royale_X2'
-      model: 'Royale X2'
+    - regex: 'Royale Y2 Lite'
+      model: 'Royale Y2 Lite'
+    - regex: 'Royale[_ ]([YX]2|A1)'
+      model: 'Royale $1'
+    - regex: 'FERO PACE'
+      model: 'Pace'
+    - regex: 'Fero[ _](A4001|A450[23]|A5001|L100|Iris|Power|Mega LTE|Vibe)'
+      model: '$1'
+
+# Ruio
+Ruio:
+  regex: 'Ruio[ _]|M671M4(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Ruio[ _](S4)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Ruio[ _](S5)Plus(?:[);/ ]|$)'
+      model: '$1 Plus'
+    - regex: 'M671M4'
+      model: 'Cola 4G'
 
 # Transpeed
 Transpeed:
-  regex: 'Transpeed_|(?:TR99 MINI\+|TR99)(?:[);/ ]|$)'
+  regex: 'Transpeed[_ ]|(?:TR99 MINI\+|TR99)(?:[);/ ]|$)'
   device: 'tv'
   models:
     - regex: 'TR99 MINI\+'
       model: 'TR99 Mini Plus'
-    - regex: '(?:Transpeed_)?(TR99|6K)(?:[);/ ]|$)'
+    - regex: '(?:Transpeed[_ ])?(TR99|H616|6K|X4S)(?:[);/ ]|$)'
       model: '$1'
 
 # 8848 (everest 8848, 8848 titanium)
-8848:
+'8848':
   regex: '8848 (M[3-6])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
@@ -17399,3 +25178,3449 @@ VVETIME:
   regex: 'ZYVV1(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'V1'
+
+# A1 (www.a1.by)
+A1:
+  regex: '(?:A1 (?:Alpha|Alpha 20\+)|Alpha 20)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'A1 Alpha 20\+'
+      model: 'Alpha 20 Plus'  # ZTE Blade V2020
+    - regex: 'Alpha 20'
+      model: 'Alpha 20'
+    - regex: 'Alpha 21'
+      model: 'Alpha 21'
+    - regex: 'A1 Alpha'
+      model: 'Alpha'
+
+# Swisstone
+Swisstone:
+  regex: 'swisstone (SD 5[13]0)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# P-UP (Peaup Co., Ltd.) (p-up.jp, mode1.jp)
+P-UP:
+  regex: 'MD-0[143]P(?:[);/ ]|$)'
+  device: 'phablet'
+  models:
+    - regex: 'MD-04P(?:[);/ ]|$)'
+      model: 'Mode 1 RR'
+    - regex: 'MD-03P(?:[);/ ]|$)'
+      model: 'Mode 1 RS'
+    - regex: 'MD-01P(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Mode 1 MD-01P'
+
+# Paladin (https://paladin.com.my/)
+Paladin:
+  regex: 'Paladin TV'
+  device: 'tv'
+  model: 'TV Box'
+
+# iVooMi
+iVooMi:
+  regex: '(?:Innelo_1|iV 505|Me 1\+)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Innelo_1'
+      model: 'Innelo 1'
+    - regex: 'iV 505'
+      model: 'Me 1'
+    - regex: 'Me 1\+'
+      model: 'Me 1+'
+
+# Pixelphone
+Pixelphone:
+  regex: 'Pixelphone S1(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'S1'
+
+# Pixela
+Pixela:
+  regex: 'Infineum[_ ](Z4?5)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Infineum $1'
+
+# Iris
+Iris:
+  regex: '(?:Vox[_ ](?:[45]S|Alpha|POP|STEEL Plus|Energy|FORTIS|VERO)|IS2_?Plus|IS2S|Next_P_PRO|IRS002-16|X1 mini)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Vox[_ ]([45])S'
+      model: 'Vox $1S'
+    - regex: 'VOX[_ ]FORTIS'
+      model: 'Vox Fortis'
+    - regex: 'VOX[_ ]VERO'
+      model: 'Vox Vero'
+    - regex: 'VOX Alpha Plus'
+      model: 'Vox Alpha Plus'
+    - regex: 'VOX STEEL Plus'
+      model: 'Vox Steel Plus'
+    - regex: 'VOX Alpha'
+      model: 'Vox Alpha'
+    - regex: 'VOX Energy'
+      model: 'Vox Energy'
+    - regex: 'VOX POP plus'
+      model: 'Vox Pop Plus'
+    - regex: 'VOX POP Pro'
+      model: 'Vox Pop Pro'
+    - regex: 'Next_P_PRO'
+      model: 'Next P Pro'
+    - regex: 'IS2_?Plus'
+      model: 'IS2 Plus'
+    - regex: 'IRS002-16'
+      model: 'I-S6'
+    - regex: 'IS2S'
+      model: 'IS2S'
+    - regex: 'X1 mini'
+      model: 'X1 Mini'
+
+# Fonos
+Fonos:
+  regex: 'Fonos-(O1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Xtouch (www.xtouchtechnologies.com)
+Xtouch:
+  regex: '(?:Xtouch[ _](?:X10|A5|X)|XBot[_ ](?:Senior|Junior)|X9_16GB)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Xtouch[ _](X10|A5|X)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'X9_16GB(?:[);/ ]|$)'
+      model: 'X9'
+    - regex: 'XBot[_ ](Senior|Junior)'
+      model: 'XBot $1'
+
+# Conquest
+Conquest:
+  regex: 'Conquest[-_](?:S(?:20|[68]|1[0126])|F2)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Conquest[-_]S([68]|1[0126]|20)'
+      model: 'S$1'
+    - regex: 'Conquest-F2'
+      model: 'F2'
+
+# Zatec
+Zatec:
+  regex: 'ZATEC[_ ]|(?:[ ]WIND|ZPLAY1_2018|Zpower_(?:Plus|2018))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'ZATEC[_ ]GRAVITY(?:[);/ ]|$)'
+      model: 'Gravity'
+    - regex: '[ ]WIND(?:[);/ ]|$)'
+      model: 'Wind'
+    - regex: 'ZPLAY1_2018'
+      model: 'Zplay (2018)'
+    - regex: 'Zpower_2018'
+      model: 'Zpower (2018)'
+    - regex: 'Zpower_Plus'
+      model: 'Zpower Plus'
+
+# Selecline (https://www.auchan.lu/)
+Selecline:
+  regex: 'Selecline[ _]|S4T7IN(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'S4T7IN(?:[);/ ]|$)'
+      model: 'S4T7IN'
+    - regex: 'Selecline 10(?:[);/ ]|$)'
+      model: '10'
+
+# Selenga
+Selenga:
+  regex: 'Selenga[ _](A[134])(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Starlight
+Starlight:
+  regex: 'Starlight|(?:My_Star_X|RIO STAR|C_Note_Pro|Star_Mix_2|I_STAR_PLUS)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'My_Star_X'
+      model: 'My Star X'
+    - regex: 'RIO STAR'
+      model: 'Rio Star'
+    - regex: 'C_Note_Pro'
+      model: 'C Note Pro'
+    - regex: 'Star_Mix_2'
+      model: 'Star Mix 2'
+    - regex: 'I_STAR_PLUS'
+      model: 'I Star Plus'
+    - regex: 'Starlight_ROME_X'
+      model: 'Rome X'
+
+# GEOFOX
+GEOFOX:
+  regex: 'GEOFOX[_ ](MID ?743)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'MID743'
+
+# Tinmo
+Tinmo:
+  regex: 'TiNMO[- _](A11|K3)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Verico
+Verico:
+  regex: '(RP-UDM0[12]A|RP-UDP05A|JO-UQM10A)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'Uni Pad $1'
+
+# TTEC (ttec.com.tr)
+TTEC:
+  regex: '(Magictab (?:9GX|7GE|718))(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# eSTAR
+eSTAR:
+  regex: 'eSTAR[_ ](?:Grand|GO\!?|Zoom Quad|Gemini|MINI[_ ]3G|BEAUTY|MOON)'
+  device: 'tablet'
+  models:
+    - regex: 'eSTAR (Grand|GO\!?) (HD Intel|IPS Intel|IPS|HD|Intel) Quad Core 3G'
+      model: '$1 $2 Quad Core 3G'
+    - regex: 'eSTAR (Zoom Quad|Gemini|GO)'
+      model: '$1'
+    - regex: 'eSTAR GRAND HD quad core( [34]G)?'
+      model: 'Grand HD Quad Core$1'
+    - regex: 'eSTAR GRAND'
+      model: 'Grand'
+    - regex: 'eSTAR BEAUTY HD Quad core'
+      model: 'Beauty HD Quad Core'
+    - regex: 'eSTAR MOON HD Quad core'
+      model: 'Moon HD Quad Core 3G'
+    - regex: 'eSTAR BEAUTY 2 HD Quad core'
+      model: 'Beauty 2 HD Quad Core'
+    - regex: 'eSTAR[_ ]MINI[_ ]3G'
+      model: 'Mini 3G'
+
+# Hometech (hometech.com.tr)
+Hometech:
+  regex: '(?:Ideal (?:10S|Tab [79])|ALFA(?:10TB|7LM)|ALFA[_ ](?:10RC|10TM?|10MB|7RS|[78]RC|7M)|HT[ _](?:7RT|8MZ))(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(Ideal (?:10S|Tab 9))(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'ALFA[_ ]?(10RC|10T[BM]?|7RS|[78]RC|7L?M|10MB)(?:[);/ ]|$)'
+      model: 'ALFA $1'
+    - regex: 'Ideal Tab 7 Ips( 3G)?'
+      model: 'Ideal Tab 7 IPS$1'
+    - regex: 'HT[ _](7RT|8MZ)(?:[);/ ]|$)'
+      model: 'HT $1'
+
+# ExMobile (www.exmobile.my)
+ExMobile:
+  regex: 'EX(29|45)i(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'EX $1i'
+
+# Exmart Mobile (exmartmobile.com)
+Exmart:
+  regex: 'Exmart[ _](K1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Hipstreet (hipstreet.com)
+Hipstreet:
+  regex: 'HS_|10DTB12(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'HS_9DTB39(?:[);/ ]|$)'
+      model: 'Pulse'
+    - regex: '10DTB12(?:[);/ ]|$)'
+      model: 'Phoenix'
+    - regex: 'HS_([a-z0-9]+)(?:[);/ ]|$)'
+      model: '$1'
+
+# Navitech
+Navitech:
+  regex: '(NeoTab)[ _-]((?:S1[23]0|S125|H85|H11[05]|KID741|S9700))(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1 $2'
+
+# NorthTech (north-tech.us)
+NorthTech:
+  regex: '(NT-TP10)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'TouchPad 10.0"'
+
+# UNIWA
+UNIWA:
+  regex: 'UNIWA[ _](X5|F40)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# ANDOWL (www.andowlph.com)
+Andowl:
+  regex: '(?:ANDOWL-)?(Q[45]|QG9)(?:[);/ ]|$)|Andowl'
+  device: 'tv'
+  model: '$1'
+
+# Silelis (silelis.com)
+Silelis:
+  regex: 'Silelis[ _](T-1)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Bluedot (bluedot.co.jp)
+Bluedot:
+  regex: 'BLUEDOT[_ ]|(?:BNT-71)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(?:BLUEDOT[_ ])?(BNP-500)(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: '$1'
+    - regex: '(BNT-71)(?:[);/ ]|$)'
+      model: '$1'
+
+# Planet Computers
+Planet Computers:
+  regex: '(Cosmo_Communicator)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Reach
+Reach:
+  regex: '(Allure[_ ](?:Ultra(?:[_]Curve)?|Secure|Admire|Rise)|Opulent X)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# MobiWire
+MobiWire:
+  regex: '(?:Kiona|KANUNA|Halona|Kicka[_ ][45][ _]Plus|Kohana|Kosumi|KWANITA|Lonan|Hotah|Kicka 5|Kiona|SmartE11|Sakari)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'KANUNA'
+      model: 'Kanuna'
+    - regex: 'KWANITA'
+      model: 'Kwanita'
+    - regex: 'SmartE11'
+      model: 'Smart E11'
+    - regex: '(Kiona|Kicka[_ ][45][ _]Plus|Kohana|Kosumi|Lonan|Halona|Hotah|Kicka 5|Kiona|Sakari)(?:[);/ ]|$)'
+      model: '$1'
+
+# Hezire
+Hezire:
+  regex: '(HTB801)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Hurricane (hurricanemobile.com)
+Hurricane:
+  regex: 'Hurricane[ _]|(?:Flame_Plus|Glaze|Cobra|Ridge Plus|Rush Plus|DZIRE|Android 7.+ Beam|Vulcan|SAGE|Iris Plus 2021|VortexPlus)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Hurricane[ _]IGNITE'
+      model: 'Ignite'
+    - regex: 'Hurricane[ _]Bolt'
+      model: 'Bolt'
+    - regex: 'Hurricane[ _]VORTEX'
+      model: 'Vortex'
+    - regex: 'Hurricane[ _]GIGA'
+      model: 'Giga'
+    - regex: 'Glaze'
+      model: 'Glaze'
+    - regex: 'Cobra'
+      model: 'Cobra'
+    - regex: 'DZIRE'
+      model: 'Dzire'
+    - regex: 'SAGE'
+      model: 'Sage'
+    - regex: 'Beam'
+      model: 'Beam'
+    - regex: 'Vulcan'
+      model: 'Vulcan'
+    - regex: 'Flame_Plus'
+      model: 'Flame Plus'
+    - regex: 'Ridge Plus'
+      model: 'Ridge Plus'
+    - regex: 'Rush Plus'
+      model: 'Rush Plus'
+    - regex: 'Iris Plus 2021'
+      model: 'Iris Plus (2021)'
+    - regex: 'VortexPlus'
+      model: 'Vortex Plus'
+
+# iSwag (iswagmobile.com)
+iSWAG:
+  regex: 'ISWAG[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'iSWAG[_ ]KRONOS'
+      model: 'Kronos'
+    - regex: 'iSWAG[_ ]Lynx'
+      model: 'Lynx'
+    - regex: 'iSWAG[_ ]MANTRA'
+      model: 'Mantra'
+    - regex: 'iSWAG[_ ]MEGA'
+      model: 'Mega'
+    - regex: 'iSWAG[_ ]NEMESIS'
+      model: 'Nemesis'
+    - regex: 'ISWAG[_ ]VIPER'
+      model: 'Viper'
+
+# Reeder (reeder.com.tr)
+Reeder:
+  regex: '(?:reeder[_ ](?:3G_Tablet|A7iC|A[78]i[_ ]Quad|A8i Q2|M8 Plus|[TM]8|M10 Plus|P11SE)|M10SPlus|P12Curve|P13_Blue_Plus|P13_Max_Blue|P13[_ ]Blue[_ ]Ma(?:ks|x)|P13_Blue|P13 Blue 2021)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'reeder[_ ](3G_Tablet|A7iC|A[78]i[_ ]Quad|A8i Q2|M8 Plus|[TM]8|M10 Plus|P11SE)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'M10SPlus'
+      model: 'M10S Plus'
+
+    - regex: 'P12Curve'
+      device: 'smartphone'
+      model: 'P12 Curve'
+    - regex: 'P13_Blue_Maks'
+      device: 'smartphone'
+      model: 'P13 Blue Maks'
+    - regex: 'P13_Blue_Plus'
+      device: 'smartphone'
+      model: 'P13 Blue Plus'
+    - regex: 'P13 Blue 2021'
+      device: 'smartphone'
+      model: 'P13 Blue (2021)'
+    - regex: 'P13 Blue Max 2020'
+      device: 'smartphone'
+      model: 'P13 Blue Max (2020)'
+    - regex: 'P13[_ ]Blue[_ ]Max|P13_Max_Blue'
+      device: 'smartphone'
+      model: 'P13 Blue Max'
+    - regex: 'P13_Blue'
+      device: 'smartphone'
+      model: 'P13 Blue'
+
+# ELARI (elari.net)
+ELARI:
+  regex: 'KidPhone4G(?:[);/ ]|$)'
+  device: 'wearable'
+  model: 'KidPhone 4G'
+
+# Epik One or EPIKONE (epikmobile.com)
+'Epik One':
+  regex: '(K501 Plus|[ ]K5(?:0[0-4]|1[01]|03[TS]|3[456]|4[05]|73|03HD)|[ ]K60[01]|[ ]X507T|[ ]K40[56]|[ ]T700)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'K501 Plus'
+      model: 'Leo Plus'
+    - regex: 'K501'
+      model: 'Leo'
+    - regex: 'K500'
+      model: 'Omega Lite'
+    - regex: 'K502'
+      model: 'Omega'
+    - regex: 'K503T'
+      model: 'Leo Turbo'
+    - regex: 'K503S'
+      model: 'Leo Pro'
+    - regex: 'K503HD'
+      model: 'Leo HD'
+    - regex: 'K503'
+      model: 'Leo Max'
+    - regex: 'K504'
+      model: 'Titan 3G'
+    - regex: 'X507T'
+      model: 'Titan II'
+    - regex: 'K510'
+      model: 'Bolt'
+    - regex: 'K511'
+      model: 'Bolt Pro'
+    - regex: 'K534'
+      model: 'Hada'
+    - regex: 'K535'
+      model: 'Hada Turbo'
+    - regex: 'K545'
+      model: 'Rocket'
+    - regex: 'K536'
+      model: 'Royal'
+    - regex: 'K540'
+      model: 'Excalibur'
+    - regex: 'K573'
+      model: 'Panther'
+    - regex: 'K600'
+      model: 'Jupiter'
+    - regex: 'K601'
+      model: 'Jupiter One'
+    - regex: 'K406'
+      model: 'Pebble Plus'
+    - regex: 'K405'
+      model: 'Pebble II'
+    - regex: 'T700'
+      model: 'Palette'
+      device: 'tablet'
+
+# Altice
+Altice:
+  regex: 'Altice[ _](S62|S31|S43)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Kult
+Kult:
+  regex: '(Ambition|Beyond)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Beyond
+Beyond:
+  regex: '(?:SURVE(10|[26-8]|[12] PRO)|Home9)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SURVE([12]) PRO'
+      model: 'Surve $1 Pro'
+    - regex: 'SURVE(10|[26-8])'
+      model: 'Surve $1'
+    - regex: 'Home9'
+      model: 'Home 9'
+
+# BioRugged (biorugged.com)
+BioRugged:
+  regex: '(?:BioWolf 8-F30|BIOWOLF8F30|Ruggbo 20 Lite)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'BioWolf 8-F30|BIOWOLF8F30'
+      model: 'BioWolf 8-F30'
+    - regex: 'Ruggbo 20 Lite'
+      model: 'Ruggbo 20 Lite'
+
+# VAIO (vaio.com)
+VAIO:
+  regex: '(?:VPA051|VA-10J)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'VPA051'
+      model: 'Phone A'
+    - regex: '(VA-10J)'
+      model: '$1'
+
+# Spark (https://www.spark.co.nz/)
+Spark:
+  regex: 'Spark Plus 3(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Plus 3'
+      model: 'Plus 3'
+
+# SPC or SPC Universe or SPC Mobile (spc.es)
+SPC:
+  regex: '(?:Gravity Max|GRAVITY 2|GRAVITY_OCTACORE|SPC (?:GEN|SMART)|SPC_ALIEN(?:_STICK)?|SPC Glow9.7|Lightyear)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'GRAVITY_OCTACORE'
+      model: 'Gravity OctaCore'
+    - regex: 'Gravity Max'
+      model: 'Gravity Max'
+    - regex: 'GRAVITY 2'
+      model: 'Gravity 2'
+    - regex: 'SPC Glow9.7'
+      model: 'Glow 9.7"'
+    - regex: 'Lightyear'
+      model: 'Lightyear'
+
+    - regex: 'SPC SMART PLUS'
+      device: 'smartphone'
+      model: 'Smart Plus'
+    - regex: 'SPC SMART LITE'
+      device: 'smartphone'
+      model: 'Smart Lite'
+    - regex: 'SPC SMART MAX'
+      device: 'smartphone'
+      model: 'Smart Max'
+    - regex: 'SPC SMART'
+      device: 'smartphone'
+      model: 'Smart'
+    - regex: 'SPC GEN MAX'
+      device: 'smartphone'
+      model: 'Gen Max'
+    - regex: 'SPC GEN LITE'
+      device: 'smartphone'
+      model: 'Gen Lite'
+    - regex: 'SPC GEN Plus'
+      device: 'smartphone'
+      model: 'Gen Plus'
+    - regex: 'SPC GEN'
+      device: 'smartphone'
+      model: 'Gen'
+
+    - regex: 'SPC_ALIEN_STICK'
+      device: 'tv'
+      model: 'Alien Stick'
+    - regex: 'SPC_ALIEN'
+      device: 'tv'
+      model: 'Alien'
+
+# Winmax (winmaxmobile.com)
+Winmax:
+  regex: 'Winmax[ _](?:XC14|XC[46]|TX30)(?:[);/ ]|$)|MAUI.+Winmax_BD45'
+  device: 'smartphone'
+  models:
+    - regex: 'Winmax[ _](XC14|XC[46])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Winmax[ _](TX30)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+    - regex: 'MAUI.+Winmax_(BD45)'
+      device: 'feature phone'
+      model: '$1'
+
+# Zebra (zebra.com)
+Zebra:
+  regex: ' (TC5[16]|TC2[056]|TC75|TC7[05]x|TC5[27]|TC700H|ET51)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(TC5[16]|TC2[056]|TC75|TC7[05]x|TC5[27]|TC700H)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(ET51)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+
+# Thuraya (thuraya.com)
+Thuraya:
+  regex: 'Thuraya[ _](X5-Touch)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Bkav (bkav.com)
+Bkav:
+  regex: 'Bphone[ _](B111[45]|B2017)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Bphone $1'
+
+# Brandt
+Brandt:
+  regex: '(BPRIME|BSTAR\+?|BPRIMES|B-ONE)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Bigben
+Bigben:
+  regex: 'GAMETAB-ONE(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'GameTab-One'
+
+# smartec (smartec.tn)
+SMARTEC:
+  regex: '(Atractivo)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Asanzo (asanzo.vn)
+Asanzo:
+  regex: 'ASANZO[ _](?:A2|S[23]|[SZ]5|S3_PLUS)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'ASANZO[ _]S3[ _]PLUS'
+      model: 'S3 Plus'
+    - regex: 'ASANZO[ _](A2|S[23]|[SZ]5)(?:[);/ ]|$)'
+      model: '$1'
+
+# Artizlee
+Artizlee:
+  regex: 'Artizlee[ _]S9|ATL-(?:16|21(?:PLUS|[XT])?|31|26)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'ATL-21PLUS(?:[);/ ]|$)'
+      model: 'ATL-21 Plus'
+    - regex: '(ATL-(?:16|21[XT]?|31|26))(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Artizlee[ _]S9'
+      device: 'smartphone'
+      model: 'S9'
+
+# Mintt (www.mintt.co)
+Mintt:
+  regex: '(?:Coolmintt(?:A3|M2)?|Ultramintt(?:S2)?|FRESHMINTT(?:A7|A10)?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Coolmintt ?([PM]1|P3|A3|M2)(?:[);/ ]|$)'
+      model: 'CoolMintt $1'
+    - regex: 'Ultramintt ?([SR]1|S2|A5)(?:[);/ ]|$)'
+      model: 'UltraMintt $1'
+    - regex: 'FRESHMINTT ?(A7|A10)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'FreshMintt $1'
+
+# Premio
+Premio:
+  regex: '(?:AXE_II|186HS2080531|186HS1050531|186HS1050232|186FT1080231|185FT5050231|PREMIO[ _](?:S50|P420|P451))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '186HS2080531'
+      model: 'X1'
+    - regex: 'AXE_II'
+      model: 'Axe II'
+    - regex: '186HS1050531'
+      model: 'P541'
+    - regex: '185FT5050231'
+      model: 'P511'
+    - regex: '186FT1080231'
+      model: 'P571'
+    - regex: '186HS1050232'
+      model: 'P630'
+    - regex: 'PREMIO[ _](S50|P420|P451)(?:[);/ ]|$)'
+      model: '$1'
+
+# Trifone
+Trifone:
+  regex: 'Passion[-_](?:1S|PRO|PLUS)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Passion-1S'
+      model: 'Passion 1S'
+    - regex: 'Passion-Plus'
+      model: 'Passion Plus'
+    - regex: 'Passion_Pro'
+      model: 'Passion Pro'
+
+# Bluewave
+Bluewave:
+  regex: '(?:33GT HD|WV8R-M|WV8R[_-]N)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '33GT HD'
+      model: 'Wave 8 HD+'
+    - regex: 'WV8R-M'
+      model: 'Wave 8 Red Marshmallow'
+    - regex: 'WV8R[_-]N'
+      model: 'Wave 8 Red Nougat'
+
+# Siragon (siragon.com)
+Siragon:
+  regex: 'Siragon|(?:SP-(?:5[0124]50|5400))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Siragon[_ ])?(SP-(?:5[0124]50|5400))'
+      model: '$1'
+
+# Poppox
+Poppox:
+  regex: 'Poppox P3'
+  device: 'smartphone'
+  model: 'P3'
+
+# POPTEL (https://www.poptelmobile.com/)
+POPTEL:
+  regex: 'P9000_MAX(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'P9000_MAX(?:[);/ ]|$)'
+      model: 'P9000 Max'
+
+# Zentality (zentalityinfo.com)
+Zentality:
+  regex: 'C-723ULTRA(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'C-723 Ultra'
+
+# Black Bear
+'Black Bear':
+  regex: '(B6 Master|B6 Note X)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Fortis
+Fortis:
+  regex: '(Apollo 5 Neo)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# OpelMobile (opelmobile.com.au)
+OpelMobile:
+  regex: 'Opel ?Mobile|(?:OpelMobile_Smart(?:JX|X1)|Easy_Smart_2)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Easy_Smart_2'
+      model: 'Easy Smart 2'
+    - regex: 'OpelMobile_SmartJX'
+      model: 'SmartJX'
+    - regex: 'OpelMobile_SmartX1'
+      model: 'SmartX1 4G'
+    - regex: 'Opel Mobile SmartX6'
+      model: 'SmartX6'
+
+# NuAns
+NuAns:
+  regex: 'NEO \[Reloaded\](?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'NEO Reloaded'
+
+# Koolnee (sub brand from Koobee)
+Koolnee:
+  regex: '(K1 Trio)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Sansui (sansui-global.com)
+Sansui:
+  regex: 'Sansui[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'Sansui[_ ](Switch|Play|Fun|SA4[01]|U4[56]|U3[02]|Nova)(?:[);/ ]|$)'
+      model: '$1'
+
+# Sico (sico.com.eg)
+Sico:
+  regex: 'SICO[_ ](?:PLUS|e1002)|(?:Express3-Max|SSR3-1-51-5M|SSD-1-53-13M|Mega2|Express3)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SICO[_ ]PLUS2'
+      model: 'Plus 2'
+    - regex: 'SICO[_ ]PLUS'
+      model: 'Plus'
+    - regex: 'Mega2'
+      model: 'Mega 2'
+    - regex: 'SSR3-1-51-5M'
+      model: 'Pro 3'
+    - regex: 'SSD-1-53-13M'
+      model: 'Diamond'
+    - regex: 'SICO[_ ]e1002'
+      device: 'tablet'
+      model: 'E1002'
+    - regex: 'Express3-Max'
+      device: 'tablet'
+      model: 'Express 3 Max'
+    - regex: 'Express3'
+      device: 'tablet'
+      model: 'Express 3'
+
+# Smadl (smadlethiopia.com)
+Smadl:
+  regex: 'Android.+(?:Safari)(?!/[\d.]+)(?: Build|\) AppleWebKit)|SMADL[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'Android.+(?:Safari)(?!/[\d.]+)(?: Build|\) AppleWebKit)'
+      model: 'Safari'
+    - regex: 'SMADL[ _]Matri([2X])'
+      model: 'Matri $1'
+
+# EXCEED (exceedmobiles.com)
+EXCEED:
+  regex: '(EX7SL?4|EX10S4)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Tymes
+Tymes:
+  regex: 'Tymes[ _](V5)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Solone
+Solone:
+  regex: 'SOLONE|(?:E1457|W145[02])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'E1457'
+      model: 'Earth Iron E1457'
+    - regex: 'W1450'
+      model: 'Wind Breeze W1450'
+    - regex: 'W1452'
+      model: 'Wind Air W1452'
+    - regex: 'SOLONE A47'
+      model: 'SL-A47'
+    - regex: 'SOLONE[ _]Elite[ _]L5501'
+      model: 'Elite L5501'
+    - regex: 'SOLONE[ _]SUMO[_ ]S5001'
+      model: 'Sumo S5001'
+    - regex: 'SOLONE[ _](SL-K40|S5002)(?:[);/ ]|$)'
+      model: '$1'
+
+# Far Eas Tone (Fareastone)
+FarEasTone:
+  regex: 'Smart ?(601|550|50[59])(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Smart $1'
+
+# Smailo
+Smailo:
+  regex: 'Smailo_(2GO)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Colors or ColorsMobile (www.colors-mobile.com)
+Colors:
+  regex: '(?:Colors[ _](S(?:[19]|11)|P70|P[456]5|P32|E15|P50 Plus)|Pride_1A|P52_Pride5C|P90_Pride5X)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Pride_1A(?:[);/ ]|$)'
+      model: 'Pride 1A'
+    - regex: 'P52_Pride5C(?:[);/ ]|$)'
+      model: 'Pride 5C'
+    - regex: 'P90_Pride5X(?:[);/ ]|$)'
+      model: 'Pride 5X'
+    - regex: 'Colors[ _](S(?:[19]|11)|P70|E15|P[456]5|P32|P50 Plus)(?:[);/ ]|$)'
+      model: '$1'
+
+# Honeywell (honeywell.com)
+Honeywell:
+  regex: '(?:EDA50K?|EDA70|EDA51|CK65|CT60)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    # smartphone + scan
+    - regex: '(EDA50K?|EDA70|EDA51)(?:[);/ ]|$)'
+      model: 'ScanPal $1'
+    # mobile terminal
+    - regex: '(CK65|CT60)(?:[);/ ]|$)'
+      device: 'peripheral'
+      model: 'Dolphin $1'
+
+# Electroneum (electroneum.com)
+Electroneum:
+  regex: 'electroneum(M1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# High Q or HighQ
+'High Q':
+  regex: '(ELT070[46]H|ELT0802H)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Pluzz
+Pluzz:
+  regex: 'Pluzz[_-](Z552|PL5[05]10|PL4010|PL501[46]|Elite_Dual)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# IKU Mobile (iku-mobile.com)
+'IKU Mobile':
+  regex: '(?:IKU[_ ](?:A40|T[123]|K3|i[34]|T[_ ]MAX)|Powerful_K55i|Curvy C50L)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(Powerful_K55i|Curvy C50L)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'IKU[_ ](A40|K3|i[34])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'IKU[_ ](T[123])(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+    - regex: 'IKU[_ ]T[_ ]Max(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'T Max'
+
+# IKI Mobile (ikimobile.com)
+IKI Mobile:
+  regex: '(?:GO5_55|BLESS_GO55|BLESSPLUS|KF4Go|KF5bless)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'GO5_55'
+      model: 'Go 5.5"'
+    - regex: 'BLESS_GO55'
+      model: 'Bless Go 5.5"'
+    - regex: 'BLESSPLUS'
+      model: 'Bless Plus'
+    - regex: '(KF4Go|KF5bless)'
+      model: '$1'
+
+# CG Mobile
+'CG Mobile':
+  regex: '(?:CG_OMEGA6|Omega (?:[38])|CG_EON_Blaze_Pro|CG\|EON Blaze GOLD)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Omega ([38])(?:[);/ ]|$)'
+      model: 'Omega $1'
+    - regex: 'CG_OMEGA6(?:[);/ ]|$)'
+      model: 'Omega 6'
+    - regex: 'CG_EON_Blaze_Pro(?:[);/ ]|$)'
+      model: 'EON Blaze Pro'
+    - regex: 'CG\|EON Blaze GOLD(?:[);/ ]|$)'
+      model: 'EON Blaze Gold'
+
+# IUNI
+IUNI:
+  regex: 'IUNI[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'IUNI[ _](U3|i1|N1)'
+      model: '$1'
+
+# (zhnkmobile.com)
+'ZH&K':
+  regex: '(?:ODYSSEY O2|ODYSSEY RANGE)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'ODYSSEY O2'
+      model: 'Odyssey O2'
+    - regex: 'ODYSSEY RANGE'
+      model: 'Odyssey Range'
+
+# Ordissimo (ordissimo.fr)
+Ordissimo:
+  regex: '(LeNumero1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Necnot (necnontrade.com)
+Necnot:
+  regex: '(M002[DGQK]-2|M002N|M002N-3T|M002W-2T|6M-3T)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Einstein
+Einstein:
+  regex: 'Einstein(T3)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# AfriOne (afrione.com)
+AfriOne:
+  regex: '(CYGNUSX?|Gravity Z2|ChampionPro)(?:[);/ ]|$)'
+  device: 'phablet'
+  models:
+    - regex: 'CYGNUSX(?:[);/ ]|$)'
+      model: 'Cygnus X'
+    - regex: 'CYGNUS(?:[);/ ]|$)'
+      model: 'Cygnus'
+
+    - regex: 'Gravity Z2(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Gravity Z2'
+    - regex: 'ChampionPro(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Champion Pro'
+
+# Connex (connexdevices.co.za)
+Connex:
+  regex: '(?:CTAB1044hn|CTAB-1044|SEN_1055_ARM)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(CTAB1044hn|CTAB-1044)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'SEN_1055_ARM'
+      model: 'Serenity 1055 10.1"'
+
+# Connectce
+Connectce:
+  regex: '(?:CP6001A)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Connect Core 6'
+
+# ClearPHONE (https://www.clear.store/)
+ClearPHONE:
+  regex: 'ClearPHONE'
+  device: 'smartphone'
+  models:
+    - regex: 'ClearPHONE 620(?:[);/ ]|$)'
+      model: '620'
+
+# Clementoni
+Clementoni:
+  regex: '(?:CLEMPAD[_ ](?:6_XL|HR_Plus|HR|[68]|7_S|201[89])|ClemPhone_7|MFC_(?:2018|8))(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'CLEMPAD_(201[89])'
+      model: 'Clempad ($1)'
+    - regex: 'MFC_2018'
+      model: 'Clempad (2018)'
+    - regex: 'MFC_8'
+      model: 'Clempad 8'
+    - regex: 'CLEMPAD_7_S'
+      model: 'Clempad 7S'
+    - regex: 'Clempad[_ ](6_XL|HR_Plus|HR|[68])'
+      model: 'Clempad $1'
+    - regex: 'ClemPhone[ _](7)'
+      device: 'smartphone'
+      model: 'Clemphone $1'
+
+# Cell-C
+Cell-C:
+  regex: 'Cell_?C_'
+  device: 'smartphone'
+  models:
+    - regex: 'Cell_C_(Summit_Plus|Fame|Evolve)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'CELLC_Evolve'
+      device: 'tablet'
+      model: 'Evolve'
+
+# VC
+VC:
+  regex: '(?:Camellia_II|Cactus II|Maple III|Maple-II|Cactus-Pro|LavenderII|Jasmine-II)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(Camellia_II|Cactus II|Maple III)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Cactus-Pro'
+      model: 'Cactus Pro'
+    - regex: '(Maple|Jasmine|Lavender)-?II(?:[);/ ]|$)'
+      model: '$1 II'
+
+# CellAllure (cellallure.com)
+CellAllure:
+  regex: '(?:Cool_Extreme_2|Earn|Fashion2Plus|Fashion[ _]C|Cool Duo|CHIC_X1|Miracle XS|Miracle 6.0 S)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(Cool_Extreme_2|Earn|Fashion[ _]C|Cool Duo|Miracle XS|Miracle 6.0 S)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Fashion2Plus'
+      model: 'Fashion 2 Plus'
+    - regex: 'CHIC_X1'
+      model: 'Chic X1'
+
+# Eagle (eagleuhd.com)
+Eagle:
+  regex: 'Eagle[ _](Classic Pro|Elite|Gold)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Invens
+Invens:
+  regex: '(Fighter|Eager|Royal R[1-8])(?: Build|[;)])'
+  device: 'smartphone'
+  model: '$1'
+
+# Chico Mobile (chicomobile.ph)
+Chico Mobile:
+  regex: '(?:ALTO (?:Bombo|classic|Estrella|JUEGO|SUBIR|[235])|FUEGO MAX|OJOS[ _](?:CAMBIO|NUBE|[68i]|ORO))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'ALTO Bombo'
+      model: 'Alto Bombo'
+    - regex: 'ALTO classic'
+      model: 'Alto Classic'
+    - regex: 'ALTO Estrella'
+      model: 'Alto Estrella'
+    - regex: 'ALTO JUEGO'
+      model: 'Alto Juego'
+    - regex: 'ALTO SUBIR'
+      model: 'Alto Subir'
+    - regex: 'ALTO ([235])'
+      model: 'Alto $1'
+    - regex: 'OJOS[ _]([68i])'
+      model: 'Ojos $1'
+    - regex: 'OJOS NUBE'
+      model: 'Ojos Nube'
+    - regex: 'OJOS CAMBIO'
+      model: 'Ojos Cambio'
+    - regex: 'OJOS ORO'
+      model: 'Ojos Oro'
+
+    - regex: 'FUEGO MAX'
+      device: 'tablet'
+      model: 'Fuego Max'
+
+# Claresta
+Claresta:
+  regex: 'Claresta[ _]|(?:AirPhoneS[56]|AirPhone K6)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'AirPhone ?(S[56]|K6)'
+      model: 'AirPhone $1'
+    - regex: 'Claresta (F3) PRO'
+      model: '$1 Pro'
+    - regex: 'Claresta[ _](F4)'
+      model: '$1'
+
+# Camfone (camfonemobile.com)
+Camfone:
+  regex: '(?:Camfone (?:SE)|Hero[_ ](?:H5\+|SE2|H9|(?:H7|XR)_Plus|SX|1[123]|SE3[ _]Max)|Honey (?:Y1|Y2s))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(Hero[_ ](?:H5\+|SE2|H9|(?:H7|XR)_Plus|SX|1[123]|SE3[ _]Max)|Honey (?:Y1|Y2s))(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Camfone (SE)(?:[);/ ]|$)'
+      model: '$1'
+
+# Bellphone
+Bellphone:
+  regex: 'Bp100 X-Plus(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'BP 100 X-Plus'
+
+# Gini
+Gini:
+  regex: 'Gini[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'Gini[ _]W(7)'
+      model: 'W$1'
+    - regex: 'Gini[ _]n(8)'
+      model: 'N$1'
+    - regex: 'Gini[ _]s5Pro'
+      model: 'S5 Pro'
+    - regex: 'Gini[ _]Tab[ _](V[78])'
+      device: 'tablet'
+      model: 'Tab $1'
+
+# MIVO (mivo.com.my)
+MIVO:
+  regex: '(Caryota [1245789]|Jazz J[13] 2018)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(Caryota [1245789])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Jazz (J[13]) 2018'
+      model: 'Jazz $1 (2018)'
+
+# Jesy (en.jesy.com)
+Jesy:
+  regex: 'Jesy_(J7)'
+  device: 'smartphone'
+  model: '$1'
+
+# Teknosa or Tekno S.A
+Teknosa:
+  regex: 'Preo[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'Preo Teknosa P1'
+      model: 'Preo P1'
+    - regex: 'Preo[ _]P([23])'
+      model: 'Preo P$1'
+
+# Hyve
+Hyve:
+  regex: '(?:Pryme 01|ST01)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Pryme 01'
+      model: 'Pryme 01'
+    - regex: 'ST01'
+      model: 'Storm ST01'
+
+# EWIS
+EWIS:
+  regex: 'OCTA T720Q(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'Octa T720Q'
+
+# Leader Phone or LP (lp.tn)
+Leader Phone:
+  regex: '(Vyper|N-5[07]|N-45|LP DAISY|LP_VEYRON|LP_PRADO)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'N-45 light'
+      model: 'N-45 Light'
+    - regex: 'Vyper PRO'
+      model: 'Vyper Pro'
+    - regex: 'LP DAISY'
+      model: 'Daisy'
+    - regex: 'LP_VEYRON'
+      model: 'Veyron'
+    - regex: 'LP_PRADO'
+      model: 'Prado'
+    - regex: '(Vyper|N-5[07]|N-45)(?:[);/ ]|$)'
+      model: '$1'
+
+# Cavion (cavion.pl)
+Cavion:
+  regex: '(?:Cavion[_ ](?:Solid[_ ]4[\._]5|Base[ _](?:7|7_3G_Silver|5[._]0|10|7.2 Quad)|10_3GRQ)|Cavion7.1quad)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Cavion[_ ]Solid[_ ]4[._]5'
+      model: 'Solid 4.5"'
+    - regex: 'Cavion[ _]BASE[ _]5[._]0'
+      model: 'Base 5.0"'
+    - regex: 'CAVION_10_3GRQ'
+      device: 'tablet'
+      model: 'Base 10 3GR Quad'
+    - regex: 'Cavion(?:7.1quad)'
+      device: 'tablet'
+      model: 'Base 7.1" Quad'
+    - regex: 'Cavion Base 7.2 Quad'
+      device: 'tablet'
+      model: 'Base 7.2" Quad'
+    - regex: 'Cavion Base 10'
+      device: 'tablet'
+      model: 'Base 10'
+    - regex: 'Cavion Base 7 Dual'
+      device: 'tablet'
+      model: 'Base 7.0" Dual'
+    - regex: 'Cavion Base 7 Quad'
+      device: 'tablet'
+      model: 'Base 7.0" Quad'
+    - regex: 'Cavion_Base_7_3G_Silver'
+      device: 'tablet'
+      model: 'Base 7.0" 3G Silver'
+
+# GLX or JLX
+GLX:
+  regex: 'GLX (?:Aria|Dorna|Taban|Shine|Spark|ASA)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'GLX ASA'
+      model: 'Asa'
+    - regex: 'GLX (Aria|Taban|Shine|Spark)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'GLX (Dorna)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+
+# Seeken (seekenmobile.com)
+Seeken:
+  regex: 'Seeken[ _-]'
+  device: 'smartphone'
+  models:
+    - regex: 'Seeken[_ -](SG1|SJ1)'
+      model: '$1'
+    - regex: 'Seeken[_ -](ST-101)'
+      device: 'tablet'
+      model: '$1'
+
+# Jivi Mobiles (jivi.in)
+Jivi:
+  regex: '(?:Revolution TnT3|Xtreme_(?:[37]|3x)|Xtreme (?:XT84|XT309 Plus|1))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Revolution (TnT3)'
+      model: 'Revolution $1'
+    - regex: 'Xtreme (XT84)'
+      model: 'Xtreme Klick $1'
+    - regex: 'Xtreme (XT309) Plus'
+      model: 'Xtreme View Pro $1Plus'
+    - regex: 'Xtreme[ _]([137]|3x)(?:[);/ ]|$)'
+      model: 'Xtreme $1'
+
+# Winnovo (www.mywinnovo.com)
+Winnovo:
+  regex: 'Winnovo[ _]|(?:T10LTE)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'T10LTE(?:[);/ ]|$)'
+      model: 'T10 LTE'
+    - regex: 'Winnovo[ _](M866|M798|VTab|750[PK])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Winnovo[ _](K5[46]|K43)[a-z]{2}'
+      device: 'smartphone'
+      model: '$1'
+
+# WE or WM Mobile or AAMRA WE
+WE:
+  regex: 'WE (A[15]0|B3|F[12]0|E[12]|L[3469]|R[34]|V[34]|S1|X[13]|T1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Trio or triomobiles (http://triomobiles.com/products.html)
+Trio:
+  regex: 'Trio V51 DT(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'V51DT'
+
+# Seuic (en.seuic.com)
+Seuic:
+  regex: '(AUTOID9N|CRUISE1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Centric
+Centric:
+  regex: '(?:Centric[- ]CM(?:5001|33[23]1|3321Plus)|CM4331)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Centric[- ])?CM5001'
+      model: 'A1'
+    - regex: '(?:Centric[- ])?CM3321Plus'
+      model: 'P1 Plus'
+    - regex: '(?:Centric[- ])?CM3321'
+      model: 'P1'
+    - regex: '(?:Centric[- ])?CM3331'
+      model: 'L3'
+    - regex: '(?:Centric[- ])?CM4331'
+      model: 'G1'
+
+# Kata mobile (secure.katadigital.com)
+Kata:
+  regex: 'Kata[ _-]'
+  device: 'smartphone'
+  models:
+    - regex: 'Kata[ _-](C3|L1|M3s|M4|V[56])(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Kata[ _-]i5-\w'
+      model: 'I5'
+    - regex: 'Kata-(T5)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+    - regex: 'Kata-Tmini4(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'T Mini 4'
+    - regex: 'Kata Box 2(?:[);/ ]|$)'
+      device: 'tv'
+      model: 'Box 2'
+
+# Hardkernel (www.hardkernel.com)
+Hardkernel:
+  regex: 'ODROID[-]?(C2|U2|XU[34])(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: 'ODROID $1'
+
+# Wiseasy (wiseasy.com)
+Wiseasy:
+  regex: 'WISENET5(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: 'WISENET5'
+
+# Shtrikh-M
+Shtrikh-M:
+  regex: 'SHTRIH-SMARTPOS-F2(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: 'Smartpos F2'
+
+# BBK (bbk.ru)
+BBK:
+  regex: '([65]5|50|4[03]|3[29]|28)LEX[-_](81(?:27|39|45|58|6[12]|7[34])|71(?:[23]7|4[345]|5[45]|6[368]|[57]8))[_/]([FU]?TS2C)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1LEX-$2/$3'
+
+# 4ife
+4ife:
+  regex: '4ife (4K Smart TV Box)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Westpoint
+Westpoint:
+  regex: 'WESTPOINT[;,]'
+  device: 'tv'
+  models:
+    - regex: '(TETS-4919SM)'
+      model: '$1'
+
+# Wintouch (http://www.wintouch.ae/)
+Wintouch:
+  regex: 'Q93S'
+  device: 'tablet'
+  model: 'Q93S'
+
+# Aiuto
+Aiuto:
+  regex: '(AT702)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Seatel
+Seatel:
+  regex: 'Seatel'
+  device: 'smartphone'
+  models:
+    - regex: 'Seatel[ _](L2|V8[AE]|T[5-8]|R6|V[89])(?:[);/ ]|$)'
+      model: '$1'
+
+# Ditecma (ditecma.com)
+Ditecma:
+  regex: '(M1092R(?:-[12]|V[45])?)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Datamini (datamini.co.in)
+Datamini:
+  regex: '(K908H4G)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# 3GNET (3gnet.com.tw)
+3GNET:
+  regex: '(?<!NetType/)3GNET[ _]'
+  device: 'smartphone'
+  models:
+    - regex: '3GNET[ _](U8|T800|U6s)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '3GNET[ _]T ?900'
+      model: 'T900'
+
+# Yoka TV
+'Yoka TV':
+  regex: 'KB2 PRO(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'KB2 Pro'
+
+# Formuler (formuler.tv)
+Formuler:
+  regex: 'Formuler[ _]|(?:S_TURBO_PRO)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: 'Formuler[ _](Z8(?: Pro)?)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'S_TURBO_PRO(?:[);/ ]|$)'
+      model: 'S Turbo Pro'
+
+# Malata
+Malata:
+  regex: '(?:Build/)?Malata[ _]?([a-z0-9]+)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# MBOX
+MBOX:
+  regex: 'MBOX3?(?:[);/ ]|$)'
+  device: 'tv'
+  model: ''
+
+# IT
+IT:
+  regex: 'IT-(?:1101S?|1101-QUAD)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'IT-1101-QUAD'
+      model: '1101 Quad'
+    - regex: 'IT-(1101S?)'
+      model: '$1'
+
+# Navcity (www.navcity.com.br)
+Navcity:
+  regex: 'NP-752Go(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'NP-752Go'
+      model: 'NP-752 Go'
+
+# Jeka
+Jeka:
+  regex: '(?:JK(?:960|[71]03) 3G|JK702|JK101|JK[17]00 v2.0)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'JK(960|[71]03) 3G(?:[);/ ]|$)'
+      model: 'JK $1 3G'
+    - regex: 'JK(702|[17]00 v2.0|101)(?:[);/ ]|$)'
+      model: 'JK $1'
+
+# Jiake
+Jiake:
+  regex: 'JK-?(760)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'JK-$1'
+
+# iQ&T (iqandt.com)
+'iQ&T':
+  regex: '(IFoo (?:U200|H55))(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Mantra (mantratec.com)
+Mantra:
+  regex: '(MFSTAB(?:_74G)?)(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: '$1'
+
+# Datalogic (datalogic.com)
+Datalogic:
+  regex: '(?:MEMOR 10)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Memor 10'
+
+# Naomi Phone
+Naomi Phone:
+  regex: '(?:NAOMIPHONE Ambar|DAMMAR)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'NAOMIPHONE Ambar(?:[);/ ]|$)'
+      model: 'Ambar'
+    - regex: 'DAMMAR(?:[);/ ]|$)'
+      model: 'Dammar'
+
+# Navitel (navitel.ru)
+Navitel:
+  regex: 'NAVITEL[ _]|(?:T737PRO|T505PRO)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'NAVITEL[ _](T70[07]) 3G(?:[);/ ]|$)'
+      model: '$1 3G'
+    - regex: 'NAVITEL[ _](T757)LTE(?:[);/ ]|$)'
+      model: '$1 LTE'
+    - regex: 'NAVITEL[ _](A73[0157]|A650)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'T(505|737)PRO(?:[);/ ]|$)'
+      model: 'T$1 Pro'
+    - regex: 'RE900 Full HD(?:[);/ ]|$)'  # combo device table/navigator and camera
+      model: 'RE900 Full HD'
+
+# Linnex (www.linnex.com)
+Linnex:
+  regex: 'LI(22)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Li $1'
+
+# Smartab
+Smartab:
+  regex: '(ST1009|ST7160)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# SuperTab (supertab-dz.com)
+SuperTab:
+  regex: 'SuperTab(A10|K7|S7G)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Suzuki (suzukitech.com)
+Suzuki:
+  regex: 'SUZUKI[ _]|(?:ECOPAD7|SUMOPad10)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'SUMOPAD(8100|10)(?:[);/ ]|$)'
+      model: 'SumoPad $1'
+    - regex: 'ECOPAD7'
+      model: 'ECOPad 7'
+
+# philips
+Philips:
+  regex: 'Philips|NETTV/|Xenium S[25]66|(?:PI3210G|TPM1[79]1E|70PUH6774_96|QM152E|QM16[134]E|TLE(?:821L|722G)|AND1E|S397|W5510|S410J)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:Philips[_ ])?Xenium[ _](S[25]66|V787)(?:[);/ ]|$)'
+      model: 'Xenium $1'
+    - regex: '(?:Philips[_ ])?(X818|X588)(?:[);/ ]|$)'
+      model: 'Xenium $1'
+    - regex: '(?:Philips[_ ])?(S397|W5510)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'AND1E(?: TV)?(?:[);/ ]|$)'
+      model: 'Android TV'
+      device: 'tv'
+    - regex: '(PI3210G)'
+      model: '$1'
+      device: 'tablet'
+    - regex: '(TPM1[79]1E)' # Smart Tv 2018/2019
+      model: '$1'
+      device: 'tv'
+    - regex: 'QM152E(?:[);/ ]|$)'
+      model: ''
+      device: 'tv'
+    - regex: '(QM16[134]E)'
+      model: '$1'
+      device: 'tv'
+    - regex: '(70PUH6774)_96'
+      model: '$1/96 4K UHD'
+      device: 'tv'
+    - regex: '(TLE821L)(?:[);/ ]|$)'
+      model: '$1 4G LTE'
+      device: 'tablet'
+    - regex: '(TLE722G)(?:[);/ ]|$)'
+      model: '$1'
+      device: 'tablet'
+    - regex: '(?:S410J)(?:[);/ ]|$)'
+      model: 'M9 Pro'
+      device: 'tablet'
+    - regex: 'Philips, BDP([0-9]{4})'
+      model: 'Blu-ray Player (BDP$1)'
+      device: 'tv'
+    - regex: 'Philips, ([a-z0-9-]+)'
+      model: '$1'
+      device: 'tv'
+    - regex: '(NETTV/[0-9\.]{5})'
+      model: 'NetTV Series'
+      device: 'tv'
+    - regex: 'Philips-FISIO ([a-z0-9]+)'
+      model: 'Fisio $1'
+    - regex: 'Philips[ _-]?([a-z0-9\-@]+)'
+      model: '$1'
+
+# INCAR
+INCAR:
+  regex: '(KZCAR)(?:[);/ ]|$)'
+  device: 'car browser'
+  model: '$1'
+
+# FaRao Pro (www.faraopro.jp)
+FaRao Pro:
+  regex: '(FTRW100)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Nabi
+Nabi:
+  regex: '(?:DMTAB-(?:IN08A|NV08B|NV2[04]A)|NBTY07SMKG|NBFP07PMKG|SNB02-NV7A|NABI2-NV7A)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'DMTAB-(?:IN08A|NV08B)'
+      model: 'Dream Tab HD 8.0"'
+    - regex: 'DMTAB-NV(2[04])A'
+      model: 'Big Tab HD $1.0"'
+    - regex: 'NBTY07SMKG'
+      model: 'Barbie Tab 7.0"'
+    - regex: 'NBFP07PMKG'
+      model: 'Fisher Price Learning Tab 7.0"'
+    - regex: 'SNB02-NV7A'
+      model: '2S Tab'
+    - regex: 'NABI2-NV7A'
+      model: '2 Tab'
+
+# StrawBerry
+StrawBerry:
+  regex: 'StrawBerry[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'StrawBerry[ _](SX|QX15)(?:[);/ ]|$)'
+      model: '$1'
+
+# STRONG (https://www.strong.tv/)
+STRONG:
+  regex: 'LEAP-S1'
+  device: 'tv'
+  models:
+    - regex: 'LEAP-S1'
+      model: 'LEAP-S1'
+
+# Gresso
+Gresso:
+  regex: 'Gresso[ _]|(?:REGAL R2)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'REGAL R2'
+      model: 'Regal R2'
+    - regex: 'Gresso[ _]Regal(?:[);/ ]|$)'
+      model: 'Regal'
+
+# Pendoo  (pendoo.tv)
+Pendoo:
+  regex: 'Pendoo|A5X MAX(?:[\.-]\w+)?\.01\.d4'
+  device: 'tv'
+  models:
+    - regex: 'Pendoo ?(T95Z|X10) PLUS'
+      model: '$1 Plus'
+    - regex: 'Pendoo ?X8PRO+'
+      model: 'X8 Pro+'
+    - regex: 'Pendoo[ \.]?(X9[29]|T95)'
+      model: '$1'
+    - regex: 'pendoo mini'
+      model: 'Mini'
+    - regex: 'A5X MAX(?:[\.-]\w+)?\.01\.d4'
+      model: 'A5X Max'
+
+# PiPO (pipo.com)
+PiPO:
+  regex: 'Pipo[_ ]|PipoM9Pro'
+  device: 'tablet'
+  models:
+    - regex: 'Pipo[_ ]([TP]9)'
+      model: '$1'
+    - regex: 'PipoM9Pro'
+      model: 'M9 Pro'
+    - regex: 'PIPO[_ ](X10|X9S)'  # combo device tv/tablet/pc
+      device: 'tv'
+      model: '$1'
+
+# Engel or Engel Axil (www.engelaxil.com)
+Engel:
+  regex: '(EN1007Q)plus(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1 Plus'
+
+# Genesis
+Genesis:
+  regex: '(SK-Mtek GT730[15])(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# InfoKit
+InfoKit:
+  regex: '(TVB-906X)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Blloc (blloc.com)
+Blloc:
+  regex: '(Zero18)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Huskee
+Huskee:
+  regex: 'VULKANO(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Vulkano'
+
+# SOLE
+SOLE:
+  regex: 'SOLE[_ ]POP[_ ]S([45]0)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Pop S$1'
+
+# SOLO
+SOLO:
+  regex: 'SOLO[_ ](Aspire(?: M)?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# OINOM
+OINOM:
+  regex: 'OINOM[_ ](V9D|V7H|V[679])(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Singtech (singtech.asia)
+Singtech:
+  regex: 'Singtech|(?:Sapphire[_ ](?:H50S|H7S?|H90)|Infinity_I(?:1|_Mix))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Sapphire[_ ](H50S|H7S?|H90)(?:[);/ ]|$)'
+      model: 'Sapphire $1'
+    - regex: 'Singtech[ _](Q2|S1)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Infinity_I1(?:[);/ ]|$)'
+      model: 'Infinity I1'
+    - regex: 'Infinity_I_Mix(?:[);/ ]|$)'
+      model: 'Infinity I Mix'
+
+# Sunny
+Sunny:
+  regex: '(?:SS4G9 Mira|SS4G7 Sole|SS4G1 Luna|SS4G8 Nora|SS4G6 Lola|SN7014S?|SN7016)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(SS4G9 Mira|SS4G7 Sole|SS4G1 Luna|SS4G8 Nora|SS4G6 Lola)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(SN7014S?|SN7016)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+
+# TEENO sub brand GOWN(HK)
+TEENO:
+  regex: 'TEENO'
+  device: 'smartphone'
+  models:
+    - regex: 'TEENO[_ ](S9|A1|S11)(?:[);/ ]|$)'
+      model: '$1'
+
+# v-mobile or Vmobile - sub brand GOWN(HK)
+v-mobile:
+  regex: 'Vmobile[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'Vmobile[ _](J7)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Vmobile XS Pro(?:[);/ ]|$)'
+      model: 'XS Pro'
+
+# OASYS (oasys.co)
+OASYS:
+  regex: '(TEG9300)(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: '$1'
+
+# Aspera (asperamobile.com)
+Aspera:
+  regex: 'ASPERA|(?:Wren)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'ASPERA[ _](R5h|R9|RT3|A4[02]|A50)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Wren(?:[);/ ]|$)'
+      model: 'Wren'
+
+# Vision Touch
+Vision Touch:
+  regex: 'Vision ?Touch'
+  device: 'smartphone'
+  models:
+    - regex: 'VisionTouchLife'
+      model: 'Life'
+    - regex: 'Inspire'
+      model: 'Inspire'
+
+NOBUX:
+  regex: 'SMART_VOLT_NX5(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Smart Volt NX5'
+
+# Hitachi
+Hitachi:
+  regex: 'HITACHI, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
+
+# Hitech or Hitech Mobile (hitech-mobiles.com)
+Hitech:
+  regex: '(Amaze[ _](?:S2_4G|S[56] 4G|S1|S[56](?: Plus)?))(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# F150 (sub brand Oukitel)
+F150:
+  regex: '(?:Bison2021|B2021|[HR]2022)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '([HR]2022)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(?:Bison2021|B2021)(?:[);/ ]|$)'
+      model: 'B2021'
+
+# BilimLang (bilimlang.com)
+BilimLand:
+  regex: 'BilimBook mini(?:[);/ ]|$)'
+  device: 'desktop'
+  model: 'BilimBook Mini'
+
+# Greentel (greentelmobile.com)
+Greentel:
+  regex: 'X1_Light_Lte(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'X1_Light_Lte'
+      model: 'X1 Light LTE'
+
+# Gretel:
+Gretel:
+  regex: 'Gretel|(?:GT6000)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(GT6000)'
+      model: '$1'
+    - regex: 'Gretel; (A[67])'
+      model: '$1'
+
+# Kyowon
+Kyowon:
+  regex: '(KA-E410W)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# LT Mobile or LT Electronics (lt-smartphone.com)
+LT Mobile:
+  regex: 'LT[ _-](?:NOTE 10[SM]|C3100|S10[ _]Lite)'
+  device: 'smartphone'
+  models:
+    - regex: 'LT[- ]NOTE (10[SM])'
+      model: 'Note $1'
+    - regex: 'LT C3100'
+      model: 'P9'
+    - regex: 'LT[ _]S10[ _]Lite'
+      model: 'S10 Lite'
+
+# ONYX BOOX (onyx-boox.ru)
+ONYX BOOX:
+  regex: 'KON_TIKI(2)?(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'Kon Tiki $1'
+
+# AIRON (airon.ua)
+AIRON:
+  regex: 'AIRBOOK PRO 8S(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'AirBook Pro 8S'
+
+# GFive or G'Five (www.gfivepakistan.com)
+GFive:
+  regex: '(?:PRESIDENT_GOLD_(9|10)|President Gpower 1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'PRESIDENT_GOLD_(9|10)'
+      model: 'President Gold $1'
+    - regex: 'President Gpower 1'
+      model: 'President GPower 1'
+
+# KINGZONE or KING ZONE
+KINGZONE:
+  regex: 'KINGZONE_|K1[_ ]turbo'
+  device: 'smartphone'
+  models:
+    - regex: 'KINGZONE_(N5)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'K1[_ ]turbo'
+      model: 'K1 Turbo'
+
+# MTech
+M-Tech:
+  regex: '(?:EROS 4G|MTECH (?:ACE9|TURBO L\d+|TEZ 4G|JAZBAA))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'EROS 4G'
+      model: 'Eros 4G'
+    - regex: 'ACE9'
+      model: 'Ace 9'
+    - regex: 'JAZBAA'
+      model: 'JAZBAA'
+    - regex: 'TEZ 4G'
+      model: 'TEZ 4G'
+    - regex: 'TURBO L(\d+)'
+      model: 'Turbo L$1'
+
+# Fantec Boogy
+Fantec:
+  regex: 'FAN-M300H(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'M300H'
+
+# AURIS Mobile (en.aurismobile.com.tr)
+AURIS:
+  regex: '(TB-703G)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# YUHO Mobile
+YUHO:
+  regex: 'YUHO_|(?:Netra(?:[_ ](?:Plus|Lite))?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'YUHO_(O2|H2|Y[123])_PRO'
+      model: '$1 Pro'
+    - regex: 'YUHO_Vast_Plus'
+      model: 'Vast Plus'
+    - regex: 'YUHO_Y1_ACE'
+      model: 'Y1 Ace'
+    - regex: 'YUHO_Y1_STAR'
+      model: 'Y1 Star'
+    - regex: 'YUHO_O1_LITE'
+      model: 'O1 Lite'
+    - regex: '(?:YUHO_)?(Vast2?|O[12]|Y2|Netra(?:[_ ](?:Plus|Lite))?)(?:[);/ ]|$)'
+      model: '$1'
+
+# F2 Mobile OR 2F Mobile (f2mexico.com)
+F2 Mobile:
+  regex: '(?:Z8PLUS|Z8POCKET|LT5216|F80s_plus|C8Finger|F80 PIABELLA)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Z8PLUS'
+      model: 'Z8 Plus'
+    - regex: 'Z8POCKET'
+      model: 'Z8 Pocket'
+    - regex: 'F80s_plus'
+      model: 'F80s Plus'
+    - regex: 'F80 PIABELLA'
+      model: 'F80 Piabella'
+    - regex: '(LT5216)'
+      model: '$1'
+    - regex: 'C8Finger'
+      model: 'C8 Finger'
+
+# Zaith
+Zaith:
+  regex: '(Z3211G)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Spectralink (spectralink.com)
+Spectralink:
+  regex: '(Versity 9640)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Vega
+Vega:
+  regex: 'Vega (Q7128)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Bleck (www.bleck.com.mx)
+Bleck:
+  regex: '(?:BE_(xl|se|o2|fr|et|dg)|BL-919845)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'BE_(xl|se|o2|fr|et|dg)(?:[);/ ]|$)'
+      model: 'BE $1'
+    - regex: 'BL-919845'
+      device: 'tablet'
+      model: 'BE clever 7.0"'
+
+# BS Mobile
+BS Mobile:
+  regex: '(?:RUNE III?)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'RUNE (III?)(?:[);/ ]|$)'
+      model: 'Rune $1'
+
+# RoyQueen
+RoyQueen:
+  regex: 'RQ[ -](Regal R8|713S)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'RQ (Regal R8)'
+      model: '$1'
+    - regex: 'RQ-(713S)'
+      device: 'tablet'
+      model: '$1'
+
+# Remdun (https://www.remdun.com/)
+Remdun:
+  regex: 'RD86E(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'RD86E(?:[);/ ]|$)'
+      model: 'RD86E'
+
+# Revo or RevoPhone or RevoPad (revophone.com)
+Revo:
+  regex: 'Revo[_ ](?:Youplus|555)|RevoYou'
+  device: 'smartphone'
+  models:
+    - regex: 'Revo_Youplus'
+      model: 'You Plus'
+    - regex: 'Revo[ _]?(You|555)'
+      model: '$1'
+
+# Axioo
+Axioo:
+  regex: 'PICOp(?:hone|ad)_'
+  device: 'smartphone'
+  models:
+    - regex: 'PICOphone_(L1|M4N|M4P_M3|M4U_M2_M)'
+      model: 'PicoPhone $1'
+    - regex: 'PICOphone_M2'
+      model: 'PicoPhone M2 M'
+    - regex: 'PICOpad_(7H_7)_3G'
+      device: 'tablet'
+      model: 'PicoPad $1 3G'
+
+# Pico (pico-interactive.com)
+Pico:
+  regex: 'Pico (G2 4K)(?:[);/ ]|$)'
+  device: 'wearable'
+  model: '$1'
+
+# STG Telecom (stgtelecom.com)
+STG Telecom:
+  regex: 'STG[ _](A[12] Pro|[AS]1|X[1-3]|X20|S[1-3]0|[BC]10)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Rivo
+Rivo:
+  regex: 'PHANTOM (?:PZ|RX)|RHYTHM RX'
+  device: 'smartphone'
+  models:
+    - regex: 'PHANTOM PZ ?(2[05]|[13]5|4|18)(?:[);/ ]|$)'
+      model: 'Phantom PZ$1'
+    - regex: 'PHANTOM RX ?(298|387)(?:[);/ ]|$)'
+      model: 'Phantom RX$1'
+    - regex: 'RHYTHM RX ?([15-9]0|[467]5|[12]80|150|[14]00)(?:[);/ ]|$)'
+      model: 'Rhythm RX$1'
+
+# Four Mobile or 4mobile
+Four Mobile:
+  regex: 'Four[ _]?(S600|S300I|S185|K500|S61)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Four[ _]?(S600|S300I|K500)'
+      model: '$1'
+    - regex: 'Four[ _]?S185'
+      model: 'S185 Sky 2'
+    - regex: 'Four[ _]?S61'
+      model: 'S61 Eco 2'
+
+# Seven Mobile or 7mobile (www.7mobileafrica.com)
+7 Mobile:
+  regex: '(SWEGUE|DRENA)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Swegue'
+      model: 'Swegue'
+    - regex: 'DRENA'
+      model: 'Drena'
+
+# UZ Mobile or Telecom Device Pro (idevice.uz)
+UZ Mobile:
+  regex: 'Uzbekistan(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Uzbekistan'
+
+# KREZ
+KREZ:
+  regex: 'KREZ[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'KREZ[_ ](SL502)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'KREZ[_ ](TM100[12]S8)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1 3G'
+
+# KRIP (https://www.krip.com/)
+KRIP:
+  regex: 'KRIP_|K(?:4[bm]|5[bdm]|6b|55h|57|65)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'K(4[bm]|5[bdm]|6b|55h|57|65)(?:[);/ ]|$)'
+      model: 'K$1'
+    - regex: 'KRIP_K4(?:[);/ ]|$)'
+      model: 'K4'
+
+# Kurio or KD Interactive (www.group-kd.com, kdplanet.com)
+Kurio:
+  regex: 'Kurio'
+  device: 'tablet'
+  models:
+    - regex: 'Kurio[_ ]?(10S|7S)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Kurio[_ ]?Phone(?:[);/ ]|$)'
+      device: 'smartphone'
+      model: 'Phone C14500'
+
+# Inch
+Inch:
+  regex: 'Inch (?:Regulus (?:7.85|II)|Avior 3)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(Regulus 7.85)'
+      model: '$1"'
+    - regex: '(Regulus II|Avior 3)'
+      model: '$1'
+
+# UTime
+UTime:
+  regex: 'UTIME[ _](U6|G7|U100|[TX]1|FX)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# L-Max or LMAX (lmax-mobile.com)
+L-Max:
+  regex: '(?:Sapphire 8|Sapphire[76]|Mega plus[23])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Mega plus([23])'
+      model: 'Mega Plus $1'
+    - regex: 'Sapphire ?([678])'
+      model: 'Sapphire $1'
+
+# Astro (astro.ua)
+Astro:
+  regex: 'Astro[- ](S451|S501)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# WIWA (www.wiwa.info.pl)
+WIWA:
+  regex: 'WIWA DREAM PLAYER(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'Dream Player TV'
+
+# FMT OR Future Mobile Technology
+FMT:
+  regex: '(?:16M4HI105024|FMT-NM7058-02|176HS1050(?:232|531)|175WT1050231|175HS1050231|175FT1050241)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '16M4HI105024'
+      model: 'Netsurfer Storm'
+    - regex: 'FMT-NM7058-02'
+      model: 'Flash'
+    - regex: '176HS1050531'
+      model: 'Falcon'
+    - regex: '176HS1050232'
+      model: 'B52'
+    - regex: '175WT1050231'
+      model: 'Eagle'
+    - regex: '175HS1050231'
+      model: 'Tomcat'
+    - regex: '175FT1050241'
+      model: 'Viper'
+
+# mPhone
+mPhone:
+  regex: 'mPhone ?([68]|7 Plus|7s)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Cobalt
+Cobalt:
+  regex: 'Cobalt[ _-](?:SM|T)'
+  device: 'smartphone'
+  models:
+    - regex: 'Cobalt[ _-]SM_(55?|6)'
+      model: 'SM$1'
+    - regex: 'Cobalt[ _-]T((?:7|10))[ _]3G'
+      device: 'tablet'
+      model: 'T$1 3G'
+    - regex: 'Cobalt[ _-]T((?:7|10))[ _]wifi'
+      device: 'tablet'
+      model: 'T$1 WiFi'
+
+# New Balance or NB
+New Balance:
+  regex: 'NB (RunIQ)(?:[);/ ]|$)'
+  device: 'wearable'
+  model: '$1'
+
+# AOYODKG
+AOYODKG:
+  regex: 'AOYODKG'
+  device: 'tablet'
+  models:
+    - regex: 'AOYODKG[_ ](A38)(?:[);/ ]|$)'
+      model: '$1'
+
+# Xtratech (xtratech.com)
+Xtratech:
+  regex: '(BRIO[_ ]X31)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# XGIMI (www.xgimi.com)
+XGIMI:
+  regex: 'XGIMI TV(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: '$1'
+
+# Raspberry (raspberrypi.org)
+Raspberry:
+  regex: 'Raspberry (Pi [0-9]+)(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: '$1'
+
+# Tambo
+Tambo:
+  regex: '(TA-(?:2[_ ](?:3G|Pro)|5[05][_ ]Power|[1-4]|[1246]0))(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Smooth Mobile (https://www.smoothmobile.us/)
+Smooth Mobile:
+  regex: 'Smooth ?(?:5.[05]|626|6.26 Lite|6.[15])(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Smooth (5.[05]|6.[15])(?:[);/ ]|$)'
+      model: 'Smooth $1'
+    - regex: 'Smooth626(?:[);/ ]|$)'
+      model: 'Smooth 6.26'
+    - regex: 'Smooth 6.26 Lite(?:[);/ ]|$)'
+      model: 'Smooth 6.26 Lite'
+
+# Smotreshka
+Smotreshka:
+  regex: 'Smotreshka Box (115NA|413NA|213a?)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Gooweel (gooweel.com)
+Gooweel:
+  regex: 'Gooweel| M5 Pro(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Gooweel; (S7);'
+      model: '$1'
+    - regex: 'M5 Pro'
+      model: 'M5 Pro'
+
+# Vargo or Ivargo
+Vargo:
+  regex: 'Vargo[; _]|(?:V210101)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(V210101)(?:[);/ ]|$)'
+      model: '$1'
+
+# Elekta (elektagulf.com)
+Elekta:
+  regex: 'ELED-(?:4[238]S[AM]{2}RT|5[05](?:CV_)?SMART_UHD|32SMART)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: 'ELED-(4[238])S[AM]{2}RT(?:[);/ ]|$)'
+      model: '$1" FHD LED Smart TV'
+    - regex: 'ELED-55CV_SMART_UHD(?:[);/ ]|$)'
+      model: '55" UHD Curved LED Smart TV'
+    - regex: 'ELED-(50)SMART_UHD(?:[);/ ]|$)'
+      model: '$1" UHD LED Smart TV'
+    - regex: 'ELED-(32)SMART(?:[);/ ]|$)'
+      model: '$1" HD LED Smart TV'
+
+# YASIN (yasintv.kz)
+YASIN:
+  regex: 'YASIN Android TV(?:[);/ ]|$)'
+  device: 'tv'
+  model: ''
+
+# Blow (blow.pl)
+Blow:
+  regex: '(?:LaserTAB10|PlatinumTAB10_4G_V\d)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'LaserTAB10'
+      model: 'Laser Tab 10'
+    - regex: 'PlatinumTAB10_4G_(V\d)'
+      model: 'Platinum Tab 10 4G $1'
+# FNF
+FNF:
+  regex: 'ifive(?:[_ ]mini[_ ][43]G?S|X2|Mini3|3| Air)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'ifive[_ ]mini[_ ]([43]G?S)'
+      model: 'iFive Mini $1'
+    - regex: 'ifive(X2|3)'
+      model: 'iFive $1'
+    - regex: 'ifiveMini3'
+      model: 'iFive Mini 3'
+    - regex: 'ifive Air'
+      model: 'iFive Air'
+
+# iMan
+iMan:
+  regex: '(i5800C|i6800)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Vava
+VAVA:
+  regex: 'VAVA[ _](X3)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# ivvi
+ivvi:
+  regex: 'ivvi[ _](F1S|F2C|V1M-S|V2|i1-S)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Dragon Touch (dragontouch.com)
+Dragon Touch:
+  regex: '(Notepad[_ ](?:K10|102))(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Dreamgate
+Dreamgate:
+  regex: 'Sens 5(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Sens 5(?:[);/ ]|$)'
+      model: 'Sens 5'
+
+# AOpen (www.aopen.com)
+AOpen:
+  regex: '(WT(?:22|19)M-FI)(?:[);/ ]|$)'
+  device: 'smart display'
+  model: 'eTILE $1'
+
+# AG or AG Mobile
+AG Mobile:
+  regex: '(Hashtag|Shine|Chacer)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# DIGIFORS (digifors.ru)
+DIGIFORS:
+  regex: 'DIGIFORS (400)(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'Smart $1'
+
+# DISH (https://www.dish.com/)
+DISH:
+  regex: 'WTCELERO5G(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'WTCELERO5G'
+      model: 'Celero 5G'
+
+# VIWA
+VIWA:
+  regex: '(?:LIGHT MINI|VIWA A5\+|LIGHT PLUS)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'LIGHT MINI'
+      model: 'Light Mini'
+    - regex: 'LIGHT PLUS'
+      model: 'Light Plus'
+    - regex: 'VIWA A5\+'
+      model: 'Light A5 Plus'
+
+# M-Horse (www.mhorse.com)
+M-Horse:
+  regex: 'M-HORSE|(?:Pure (?:3|2A?)|Pure ?1|Power1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Pure ?([13]|2A?)(?:[);/ ]|$)'
+      model: 'Pure $1'
+    - regex: 'Power1'
+      model: 'Power 1'
+
+# ProVision (www.provision.co.ir/en)
+ProVision:
+  regex: 'ProVision (S1)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# 'Sirin labs (sirinlabs.com)
+Sirin labs:
+  regex: '(?:FINNEY U1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Finney U1'
+
+# SK Broadband (https://www.skbroadband.com/)
+SK Broadband:
+  regex: 'BHX-UH200'
+  device: 'tv'
+  models:
+    - regex: 'BHX-UH200(?:[);/ ]|$)' # Humax
+      model: 'BHX-UH200'
+
+# Perfeo (perfeo.ru)
+Perfeo:
+  regex: 'Perfeo'
+  device: 'tv'
+  models:
+    - regex: 'Perfeo_PF_A4551'
+      model: 'CHRONO'
+    - regex: 'Perfeo_PF_A4552'
+      model: 'RATE'
+
+# CGV (www.cgv.fr)
+CGV:
+  regex: 'CGV_(Ultimate T8)'
+  device: 'smartphone'
+  model: '$1'
+
+# Telia (telia.se or telia.com)
+Telia:
+  regex: 'Telia box'
+  device: 'tv'
+  model: 'Box'
+
+# Canal Digital
+Canal Digital:
+  regex: 'S70CDS(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'OnePlace'
+
+# ZIFRO
+ZIFRO:
+  regex: 'ZIFRO|(?:ZT-97003G)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(ZT-9700)3G'
+      model: '$1 3G'
+
+# SmartBook
+SmartBook:
+  regex: 'SMARTBOOK S'
+  device: 'tablet'
+  models:
+    - regex: 'SMARTBOOK SB ?13'
+      model: 'SB13'
+    - regex: 'SMARTBOOK (S9Q9)'
+      model: '$1'
+
+# Kiowa
+Kiowa:
+  regex: '(?:[AS]5|X4)_CRISTAL(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(X4|[AS]5)_CRISTAL'
+      model: '$1 Cristal'
+
+# Sprint
+Sprint:
+  regex: 'AQT(100|8[02])(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'AQT$1'
+
+# Bundy Mobile (bundy-mobile.fr)
+Bundy:
+  regex: '(?:BTOUCH7_PLUS|SWEET 5\+ 2019|SWEET ?[56]\+)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SWEET 5\+ 2019'
+      model: 'Sweet 5 Plus (2019)'
+    - regex: 'SWEET ?([65])\+'
+      model: 'Sweet $1 Plus'
+    - regex: 'BTOUCH7_PLUS'
+      device: 'tablet'
+      model: 'B-Touch 7 Plus'
+
+# Covia (covia.net)
+Covia:
+  regex: '(CP-J55a|CP-J55aW|CP-J55aX)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Smart (smartgsmphone.com)
+Smart:
+  regex: '(Coral 4)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Stylo
+Stylo:
+  regex: 'STYLO|(?:TARISTAB[234]|Luna|CPE91|VS571|VS5502|S57_A[ZL]URE|INKOSI|Ithemba|S56 MIST|S55 Nova|S40_VISTA|S50_JADE|S64_ALPHA|S53_STARK|S40_LIFE|LIFE_2|S49[_ ](?:MONO|POISE|ECO))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'STYLO[ _](F1|Viva)'
+      model: '$1'
+    - regex: 'STYLO[ _]S9[_ ]TOPAZ'
+      model: 'S9 Topaz'
+    - regex: 'SV61 VECTOR\+'
+      model: 'SV61 Vector Plus'
+    - regex: 'SM61 MAGIC\+'
+      model: 'SM61 Magic Plus'
+    - regex: 'S57_AZURE'
+      model: 'S57 Azure'
+    - regex: 'S57_ALURE'
+      model: 'S57 Alure'
+    - regex: 'S56 MIST'
+      model: 'S56 Mist'
+    - regex: 'CPE91'
+      model: 'S54 Zen'
+    - regex: 'S55 Nova'
+      model: 'S55 Nova'
+    - regex: 'S40_VISTA'
+      model: 'S40 Vista'
+    - regex: 'S50_JADE'
+      model: 'S50 Jade'
+    - regex: 'Ithemba'
+      model: 'Ithemba'
+    - regex: 'S53_STARK'
+      model: 'S53 Stark'
+    - regex: 'S40_LIFE'
+      model: 'S40 Life'
+    - regex: 'LIFE_2'
+      model: 'Life 2'
+    - regex: 'S49[_ ]POISE'
+      model: 'S49 Poise'
+    - regex: 'S49[_ ]MONO'
+      model: 'S49 Mono'
+    - regex: 'S49[_ ]ECO'
+      model: 'S49 Eco'
+    - regex: 'S64_ALPHA'
+      model: 'S64 Alpha'
+    - regex: 'Luna'
+      model: 'Luna'
+    - regex: 'INKOSI'
+      model: 'Inkosi'
+    - regex: 'Stylo[_ ](521)'
+      model: '$1'
+    - regex: '(VS571|VS5502)'
+      model: '$1'
+    - regex: 'TARISTAB([2-4])'
+      device: 'tablet'
+      model: 'Taris Tab $1'
+
+# galaxy innovations or GI  (www.galaxy-innovations.ru)
+Galaxy Innovations:
+  regex: 'GI UNI2(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'Uni 2'
+
+# Benzo
+Benzo:
+  regex: '(Class S300 LTE)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Vexia (www.vexia.eu)
+Vexia:
+  regex: '(Zippers Tab 10i 3G)'
+  device: 'tablet'
+  model: '$1'
+
+# HiMax (himaxmobilebd.com)
+HiMax:
+  regex: ' HIMAX[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'POLYMER( X)?'
+      model: 'Polymer$1'
+    - regex: 'HIMAX[_ ]PURE[_ ]3S'
+      model: 'Pure 3S'
+
+# Packard Bell (sub brand Acer www.packardbell.com)
+Packard Bell:
+  regex: '(PB1009|M10[45]00|M7500|M7600-D|DAYTONA-G12|MONZA-T7)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'DAYTONA-G12'
+      device: 'smartphone'
+      model: 'Daytona G12'
+    - regex: 'MONZA-T7'
+      model: 'Monza T7'
+    - regex: '(PB1009|M10[45]00|M7500|M7600-D)(?:[);/ ]|$)'
+      model: '$1'
+
+# Qnet Mobile (qnetmobile.com)
+Qnet Mobile:
+  regex: ' Passion[ _]P|Hynex plus|Stark K1|Hynex H[356]|Levin V[12]'
+  device: 'smartphone'
+  models:
+    - regex: 'Passion[ _](P[0-9]+)'
+      model: 'Passion $1'
+    - regex: 'Hynex plus( 2)?'
+      model: 'Hynex Plus$1'
+    - regex: 'Stark K1'
+      model: 'Stark K1'
+    - regex: 'Hynex (H[356])\+'
+      model: 'Hynex $1 Plus'
+    - regex: 'Hynex (H[35])'
+      model: 'Hynex $1'
+    - regex: 'Levin (V[12])'
+      model: 'Levin $1'
+
+# Bluebird (www.bluebirdcorp.com)
+Bluebird:
+  regex: '(VF550|EF501R)(:_RU)?(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1' # terminal + smartphone
+
+# Mara or MaraPhones (maraphones.com)
+Mara:
+  regex: 'Mara(?: Phones)?[ _](Z1?|X1|S)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# BMAX (www.bmaxit.com)
+BMAX:
+  regex: 'I10(Plus)?_EEA(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'MaxPad I10 $1'
+
+# Geotex (geotex.tv)
+Geotex:
+  regex: '(GTX-R10i Pro)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# DING DING
+DING DING:
+  regex: 'DINGDING[ _-](SK\d)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Trident (www.trident.com.tr)
+Trident:
+  regex: '(A23 Max)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# OKSI
+OKSI:
+  regex: '(GEN-10)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Taiga System or TaigaPhone (taigaphone.ru)
+Taiga System:
+  regex: '(?:TP_1_3000)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'TaigaPhone 1'
+
+# Glofiish (glofiish.ua)
+Glofiish:
+  regex: '(?:Gpad_U)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'G Pad U'
+
+# Polar (polar.ru)
+Polar:
+  regex: 'Polar[_ ](P24L51T2CSM|P40L33T2CSM)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Polarline (sub brand Polar)
+PolarLine:
+  regex: 'PolarLine[_ ](32PL13TC-SM)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# MyGica (www.mygica.com)
+MyGica:
+  regex: 'MyGica[_ ]'
+  device: 'tv'
+  models:
+    - regex: 'HDR (Quad Core|Smart TV) Box'
+      model: 'HDR $1 Box'
+    - regex: 'Quad core Enjoy tv box'
+      model: 'Quad Core Enjoy TV Box'
+    - regex: 'ATV(19[60]0|495 Pro 16G)'
+      model: 'ATV$1'
+
+# Novex
+Novex:
+  regex: '(NWX-40F171MSY)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Epson (epson.com)
+Epson:
+  regex: 'Projector(?:[);/ ]|$)'
+  device: 'peripheral'
+  model: 'HA14A LCD Projector' # sti6200-d101
+
+# Awow or AWOW
+Awow:
+  regex: '(UTBook)'
+  device: 'tablet'
+  model: '$1'
+
+# Mitsui (www.diamond-electronics.com)
+Mitsui:
+  regex: '(MC32020)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Gocomma
+Gocomma:
+  regex: 'H1-C-ALADENG'
+  device: 'wearable'
+  model: 'W5'
+
+# LEMFO
+LEMFO:
+  regex: '(LEM14)(?:[);/ ]|$)'
+  device: 'wearable'
+  model: '$1'
+
+# Urovo (en.urovo.com)
+Urovo:
+  regex: '(?:DT[45]0)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(DT[45]0)'
+      device: 'peripheral'
+      model: '$1'
+
+# Neon IQ or NeonIQ
+Neon IQ:
+  regex: '(?:NQT-(?:101|7)[34]GIQ|NQT-7W)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'NQT-101([34])GIQ'
+      model: 'Tab 10.1" $1G'
+    - regex: 'NQT-7([34])GIQ'
+      model: 'Tab 7" $1G'
+    - regex: 'NQT-7W'
+      model: 'Tab 7" WiFi'
+
+# Aocos
+Aocos:
+  regex: 'AOCOS ([^);/]+)(?: Build|[);])'
+  device: 'tablet'
+  model: '$1'
+
+# Parrot Mobile
+Parrot Mobile:
+  regex: '(Xplorer_2)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Bubblegum (bubblegumtablets.co.za)
+Bubblegum:
+  regex: '(BUB6R-3T)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Erisson
+Erisson:
+  regex: '(42FLEA73T2SM)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Liberton (liberton.ua)
+Liberton:
+  regex: '((?:24|32)TP1HDTA1)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# Soho Style
+Soho Style:
+  regex: '(SS5214G)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Shivaki
+Shivaki:
+  regex: 'STV[-_](40LED25S|40LED42S|32LED42S|32LED30C)(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'STV-$1'
+
+# Meizu
+Meizu:
+  regex: 'Meizu|MZ-(?!Fast)[A-Z]|(?<!POCO )(M04[05]|MZ-16th(?: Plus)?|MZ-16[st]|M7[12]1C|M35[1356]|M612C|M578CA|M181[36]|M1822|M681C|M6T|MX[ -]?[2345](?: Pro)?|(?:MZ-)?m[1-6] note|M621C|M1852|M57[18]C|M3[ESX]|M3 Max|M031|m1 metal|M1 E|(?<!Nubia |STELLAR )M2|M2 E|M5s Build|PRO [567]|PRO 7-[HS]| 15 Lite| 16th|MZ-15 (?:Lite|Plus)|15 Plus|MZ-16 X| 16 X| 16T|MX6|16s Pro)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(?:MZ-)?M571C'
+      device: 'phablet'
+      model: 'M2 Note'
+    - regex: '(?:MZ-|Meizu-)?m([1-6])[_ ]note(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'M$1 Note'
+    - regex: '(?:MZ-)?M1 E(?:[);/ ]|$)'
+      model: 'M1E'
+    - regex: 'M2 E(?:[);/ ]|$)'
+      model: 'M2E'
+    - regex: '(?:MZ-)?M578C[A]?|M2(?:[);/ ]|$)'
+      model: 'M2'
+    - regex: 'M681C(?:[);/ ]|$)'
+      model: 'M3 Note'
+      device: 'phablet'
+    - regex: 'M621C(?:[);/ ]|$)'
+      model: 'M5 Note'
+      device: 'phablet'
+    - regex: 'M711C(?:[);/ ]|$)'
+      model: 'M6'
+    - regex: 'M721C(?:[);/ ]|$)'
+      model: 'M6 Note'
+      device: 'phablet'
+    - regex: '(M6T|MX6|M3E|M3X)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(?:MZ-)?M3S(?:[);/ ]|$)'
+      model: 'M3s'
+    - regex: '(?:MZ-)?M3 Max(?:[);/ ]|$)'
+      model: 'M3 Max'
+    - regex: 'M5S|M612C'
+      model: 'M5S'
+    - regex: '(M04[05]|MX[ -]?2)(?:[);/ ]|$)'
+      model: 'MX2'
+    - regex: '(M35[1356]|MX[ -]?3)(?:[);/ ]|$)'
+      model: 'MX3'
+    - regex: 'MX[ -]?4 Pro(?:[);/ ]|$)'
+      model: 'MX4 Pro'
+    - regex: 'MX[ -]?4(?:[);/ ]|$)'
+      model: 'MX4'
+    - regex: '(Meizu[- _])?MX[ -]?5(?:[);/ ]|$)'
+      model: 'MX5'
+    - regex: 'm1 metal'
+      model: 'M1 Metal'
+    - regex: 'M1813(?:[);/ ]|$)'
+      model: 'M8'
+    - regex: '(?:M1816|M8 lite)(?:[);/ ]|$)'
+      model: 'M8 Lite'
+    - regex: 'M8c Pro(?:[);/ ]|$)'
+      model: 'M8c Pro'
+    - regex: 'PRO 7-[HS](?:[);/ ]|$)'
+      model: 'PRO 7'
+    - regex: 'PRO ([76]) Plus(?:[);/ ]|$)'
+      model: 'PRO $1 Plus'
+    - regex: 'PRO ([567])'
+      model: 'PRO $1'
+    - regex: 'M031(?:[);/ ]|$)'
+      model: 'MX Dual Core'
+    - regex: 'M1852(?:[);/ ]|$)'
+      model: 'X8'
+    - regex: 'M1822(?:[);/ ]|$)'
+      model: 'Note 8'
+    - regex: '(?:MZ-)?16T(?:[);/ ]|$)'
+      model: '16T'
+    - regex: '(?:MZ-)?16th Plus(?:[);/ ]|$)'
+      model: '16th Plus'
+    - regex: '(?:MZ-)?15 Plus(?:[);/ ]|$)'
+      model: '15 Plus'
+    - regex: '(?:MZ-15 Lite| 15 Lite)(?:[);/ ]|$)'
+      model: '15 Lite'
+    - regex: 'MZ-16th| 16th(?:[);/ ]|$)'
+      model: '16th'
+    - regex: '(?:MZ-)?16 X(?:[);/ ]|$)'
+      model: '16X'
+    - regex: '(?:MZ-)?16s Pro(?:[);/ ]|$)'
+      model: '16s Pro'
+    - regex: 'meizu (17|C9) Pro(?:[);/ ]|$)'
+      model: '$1 Pro'
+    - regex: 'MZ-?M3(?:[);/ ]|$)'
+      model: 'M3'
+    - regex: '(?:Meizu[_ ])?note([89])(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'Note $1'
+
+    - regex: '(?:MZ-)?Meizu[_ ]([^/;]+) Build'
+      model: '$1'
+    - regex: '(?:MZ-)?Meizu[_ ]([a-z0-9_]+)'
+      model: '$1'
+    - regex: 'MZ-([^/;]+) Build'
+      model: '$1'
+
+# Atmaca Elektronik (http://www.atmacaelektronik.com.tr/)
+Atmaca Elektronik:
+  regex: 'ATMACA_'
+  device: 'tv'
+  model: ''
+
+# Atvio
+Atvio:
+  regex: '(100011886BK)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Alps
+Alps:
+  regex: '(?:FF-5000|ZQ8003)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(FF-5000)' # for Ford Mustang (FFKJ)
+      device: 'car browser'
+      model: '$1'
+    - regex: '(ZQ8003)'
+      device: 'car browser'
+      model: '$1'
+
+# Starwind (starwind.com.ru)
+Starwind:
+  regex: 'Smart_Starwind'
+  device: 'tv'
+  model: ''
+
+# QTECH (https://www.qtech.ru/en/)
+QTECH:
+  regex: '(QMP_K8)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Prology (www.prology.ru)
+Prology:
+  regex: '(MPC-(?:[57]0|65)|MPC-110DSP)(?:[);/ ]|$)'
+  device: 'car browser'
+  model: '$1'
+
+# Polestar (polestar.com)
+Polestar:
+  regex: 'Polestar(?:[);/ ]|$)'
+  device: 'car browser'
+  model: ''
+
+# Porsche (porsche.com)
+Porsche:
+  regex: 'Porsche Rear Seat Entertainment'
+  device: 'car browser'
+  model: ''
+
+# NavRoad (navroad.com)
+NavRoad:
+  regex: '(?:NEXO (?:Smarty|handy|SMART DUO|Evo)|MOVIO 2)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Nexo Smarty'
+      model: 'Nexo Smarty'
+    - regex: 'Nexo handy'
+      model: 'Nexo Handy'
+    - regex: 'NEXO SMART DUO'
+      device: 'tablet'
+      model: 'Nexo Smart Duo'
+    - regex: 'NEXO EVO'
+      device: 'tablet'
+      model: 'Nexo Evo'
+    - regex: 'MOVIO 2'
+      device: 'tablet'
+      model: 'Movio 2'
+
+# Smarty (smarty.by)
+Smarty:
+  regex: 'Smarty[_ ]'
+  device: 'tablet'
+  models:
+    - regex: 'Mini ?(7L?)'
+      model: 'Mini $1'
+    - regex: 'Maxi 10L'
+      model: 'Maxi 10L'
+
+# Leff
+Leff:
+  regex: '(32H520T)(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# DF or DFGroup (dfgroup.ru)
+DF:
+  regex: '(?:JAGUAR|SATURN|TIGER|PUMA)-0\dC?(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'JAGUAR-01'
+      model: 'Jaguar 01'
+    - regex: 'SATURN-(02C?)'
+      model: 'Saturn $1'
+    - regex: 'TIGER-01'
+      model: 'Tiger 01'
+    - regex: 'PUMA-01'
+      model: 'Puma 01'
+
+# BDQ or BDQ Mobile (bdqholdings.co.mz)
+BDQ:
+  regex: '(?:SMART_B19|Destiny)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'SMART_B19'
+      model: 'Smart B19'
+    - regex: 'Destiny'
+      device: 'tablet'
+      model: 'Destiny'
+
+# TuCEL
+TuCEL:
+  regex: '(TL554B|TC504B)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# FEONAL
+FEONAL:
+  regex: '(K118)_EEA(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Sunmi (www.sunmi.com)
+Sunmi:
+  regex: '(?:V1s-G|T2s_LITE)(?:[);/ ]|$)'
+  device: 'peripheral'
+  models:
+    - regex: 'T2s_LITE(?:[);/ ]|$)' # monoblock and terminal
+      device: 'smart display'
+      model: 'T2s Lite'
+    - regex: '(V1s)-G'
+      model: '$1'
+
+# iData (idataglobal.com)
+iData:
+  regex: 'iData (K1)'
+  device: 'peripheral'
+  model: '$1'
+
+# AIDATA
+AIDATA:
+  regex: '(?:AIDATA ELDE 10 TABLET|ADT_?1061(?:_1)?)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'ADT_?1061(?:_1)?'
+      model: 'ADT 1061'
+    - regex: 'ELDE 10'
+      model: 'ELDE 10'
+
+# Ematic (ematic.us)
+Ematic:
+  regex: '(EGQ101)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# GLONYX
+GLONYX:
+  regex: 'Quartz(T10-3)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'Quartz $1'
+
+# Zyrex
+Zyrex:
+  regex: 'ZT216'
+  device: 'tablet'
+  model: 'ZT216'
+
+# Orbita or Orbit
+Orbita:
+  regex: '(OT-DVB\d{2})(?:[);/ ]|$)'
+  device: 'tv'
+  model: '$1'
+
+# TAG Tech or TAG-Tech or Talal Abu-Ghazaleh Global (www.tagtech.global)
+TAG Tech:
+  regex: 'TAG[ -]TAB[ -]III?(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'TAG[ -]TAB[ -](III?)'
+      model: 'Tab $1'
+
+# DUNNS Mobile or DUNNS
+DUNNS Mobile:
+  regex: 'DUNNS[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'DUNNS[ _](?:MOBILE[ _])?(703GDC|AT1001)(?:[);/ ]|$)'
+      device: 'tablet'
+      model: '$1'
+
+# Amino or Aminocom (www.amino.tv)
+Amino:
+  regex: '(?:Amigo7x?(?:YUF|SCB)?)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: 'Amigo7x'
+      model: 'Amigo 7x'
+    - regex: 'Amigo7'
+      model: 'Amigo 7'
+
+# Saiet (acquistaonline.saiet.it)
+Saiet:
+  regex: '(?:STS570)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(STS570)'
+      model: 'Sicuro Smart $1'
+
+# Magicsee (magicsees.com)
+Magicsee:
+  regex: 'N5NOVA(?:[);/ ]|$)'
+  device: 'tv'
+  model: 'N5 Nova'
+
+# Obabox (www.obabox.com.br)
+Obabox:
+  regex: '(?:OBA_?(?:SMART_3|Conecta_Max|Conecta_4G))(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'OBASMART_3'
+      model: 'Smart 3'
+    - regex: 'OBA_(Conecta_(?:Max|4G))'
+      model: '$1'
+
+# iKon (ikonhome.com)
+iKon:
+  regex: '(IK-102[58]|IK-1106|IK-7108|IK-787)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# IRA or IRA (explore more) (wishtel.com)
+IRA:
+  regex: 'IRA_DUO(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'Duo Tablet'
+
+# Microtech (microtech.store)
+Microtech:
+  regex: '(?:ETL101AL)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: 'E-Tab LTE'
+
+# Gplus (gpluselectronics.com)
+Gplus:
+  regex: 'Gplus ([ZXP]10|N809)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Eurocase (eurocase.com)
+Eurocase:
+  regex: '(EUTB_758G?)'
+  device: 'tablet'
+  models:
+    - regex: 'EUTB_758G_TABI_Argos_KIDS'
+      model: 'TABI Argos Kids 758G'
+
+# VEON
+VEON:
+  regex: 'VEON[_ ](C8680)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# FiGi (figi-mobile.com)
+FiGi:
+  regex: 'Note_(?:[37]|11)_Pro(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'Note_([37]|11)_Pro'
+      device: 'phablet'
+      model: 'Note $1 Pro'
+
+# iSafe Mobile or i.safe (www.isafe-mobile.com)
+iSafe Mobile:
+  regex: '(IS655)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1.RG'
+
+# Tigers
+Tigers:
+  regex: 'TIS001[_-]'
+  decice: 'smartphone'
+  models:
+    - regex: 'TIS001[_-]S([34])(?:[);/ ]|$)'
+      model: 'TIS001 S$1'
+    - regex: 'TIS001[_-]T2(?:[);/ ]|$)'
+      model: 'TIS001 T2'
+
+# Redfox (redfox.global)
+Redfox:
+  regex: '(?:Wizpad_)?Valuer_V8'
+  decice: 'tablet'
+  models:
+    - regex: '(?:Wizpad_)?Valuer_V8'
+      model: 'Wizpad Valuer V8'
+
+# Vinabox (vinabox.tv)
+Vinabox:
+  regex: 'Vinabox'
+  device: 'tv'
+  models:
+    - regex: 'Vinabox[_ ]([^/;)]+)(?: Build|[);])'
+      model: '$1'
+
+# Vios
+Vios:
+  regex: 'VMP0617'
+  decice: 'smartphone'
+  models:
+    - regex: 'VMP0617(?:[);/ ]|$)'
+      model: 'VMP0617'
+
+# Beista
+Beista:
+  regex: '(X104)-EEA(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# YOTOPT (www.yotopt.com)
+YOTOPT:
+  regex: '(Y103)_EEA(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# Ookee
+Ookee:
+  regex: 'OokeeOne'
+  device: 'smartphone'
+  model: 'One'
+
+# TOSCIDO (www.toscido.com)
+TOSCIDO:
+  regex: '(T12|T151)-EEA(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# b2m:
+b2m:
+  regex: 'Decade 53(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'Decade 53'
+
+# Koslam
+Koslam:
+  regex: '(KL1071Z|KL1084)'
+  device: 'tablet'
+  model: '$1'
+
+# S2Tel
+S2Tel:
+  regex: 'S2TEL[ _-]'
+  device: 'smartphone'
+  models:
+    - regex: 'S2TEL-(Q8)'
+      device: 'tablet'
+      model: '$1'
+
+# Massgo
+Massgo:
+  regex: 'Massgo[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'Massgo[ _]VI2S'
+      model: 'Vi2 S'
+    - regex: 'Massgo[ _]([^/;)]+)(?: Build|[);])'
+      model: '$1'
+
+# Angelcare
+Angelcare:
+  regex: 'angelcare[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'F20 ?pro'
+      model: 'F20 Pro'
+    - regex: 'angelcare[ _]([^/;)]+)(?: Build|[);])'
+      model: '$1'
+
+# iPEGTOP
+iPEGTOP:
+  regex: 'IPEGTOP'
+  device: 'smartphone'
+  models:
+    - regex: 'iPEGTOP[ _](Z26)'
+      model: '$1'
+
+# Jedi
+Jedi:
+  regex: 'Remix (?:Pro|Mini)'
+  device: 'desktop'
+  models:
+    - regex: 'Remix Pro'
+      device: 'tablet'
+      model: 'Remix Pro'
+    - regex: 'Remix Mini'
+      model: 'Remix Mini'
+
+# Technopc (en.technopc.com.tr)
+Technopc:
+  regex: 'UP10SI[34]6LA(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: '(UP10SI[34]6LA)'
+      model: 'UltraPad $1'
+
+# OMIX or OMIX Mobile (omixmobile.com)
+OMIX:
+  regex: 'OMIX[ _]'
+  device: 'smartphone'
+  models:
+    - regex: 'X(\d*)'
+      model: 'X$1'
+
+# Nexa
+Nexa:
+  regex: 'Nexa[ _](?:Atlas|Vega N1)'
+  device: 'smartphone'
+  models:
+    - regex: 'Nexa[ _](Vega N1)'
+      model: '$1'
+    - regex: 'Nexa[ _](Atlas)'
+      device: 'tablet'
+      model: '$1'
+
+# Onkyo (eu.onkyo.com)
+Onkyo:
+  regex: '(DP-CMX1)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Royole (global.royole.com)
+Royole:
+  regex: 'Royole'
+  device: 'tablet'
+  models:
+    - regex: 'FlexPai 2'
+      model: 'FlexPai 2'
+    - regex: 'FlexPai'
+      model: 'FlexPai'
+
+# DORLAND (dorland-tech.com/)
+DORLAND:
+  regex: '(Aloha_5G)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Hamlet
+Hamlet:
+  regex: 'Hamlet[ _]'
+  device: 'tablet'
+  models:
+    - regex: '(?:Hamlet[ _])?XZPAD(412W)'
+      model: 'Zelig Pad $1'
+
+# Vorcom
+Vorcom:
+  regex: 'SXPro(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'SXPro'
+      model: 'SX Pro'
+
+# UNNO
+UNNO:
+  regex: 'UNNO[_ ]'
+  device: 'smartphone'
+  models:
+    - regex: 'UNNO[_ ]([^/;)]+)(?: Build|[);])'
+      model: '$1'
+
+# VDVD
+VDVD:
+  regex: 'VDVD[_ ](P20|IX21)(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Autan
+Autan:
+  regex: 'R2021W2(?:[);/ ]|$)'
+  device: 'wearable'
+  models:
+    - regex: '(R2021W2)' # Shenzhen Le Dai Technology
+      model: '$1'
+
+# ecom Pepperl+Fuchs
+ecom:
+  regex: '(Smart-Ex02|Ex-Handy 10)(?: (?:ROW|RUS))?(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# Devices with undectable brand, but detectable model
+Unknown:
+  regex: 'Plasma Mobile|WebTV/(\d+\.\d+)|(?:M10 Ultra|FO-R15|TVBOX|Smart[ _]?TV|SmartATV|M8S\+ 4K|PCBox|rk3368-box|H10 PLAY|Smart AIO TV|TVBOX_L|L-BOX|TVBOX-5G|mips.+(?:Opera TV|wireless|wired)|smartbox)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: 'WebTV/(\d+\.\d+)'
+      device: 'tv'
+      model: 'Web TV'
+    - regex: 'M10 Ultra(?:[);/ ]|$)'
+      device: 'phablet'
+      model: 'M10 Ultra' # clone xiaomi m10 ultra
+    - regex: 'FO-R15(?:[);/ ]|$)'
+      device: 'tv'
+      model: 'FO-R15'
+    - regex: '(Smart[ _]?TV|SmartATV|PCBox|rk3368-box|TVBOX|Smart AIO TV|TVBOX_L|L-BOX|TVBOX-5G)(?:[);/ ]|$)'
+      device: 'tv'
+      model: ''
+    - regex: 'M8S\+ 4K(?:[);/ ]|$)'
+      device: 'tv'
+      model: 'M8S+ 4K'
+    - regex: 'H10 PLAY(?:[);/ ]|$)'
+      device: 'tv'
+      model: 'H10 Play'
+    - regex: '(?:Opera TV|wireless|wired|smartbox)(?:[);/ ]|$)'
+      device: 'tv'
+      model: ''
diff --git a/priv/ua_inspector/device.portable_media_player.yml b/priv/ua_inspector/device.portable_media_player.yml
index 3972fe97f197a9d8c11e3672d0a77c367d50a6e4..d55a515d05aff4ea00cb5b8b102d67987dbea98c 100644
--- a/priv/ua_inspector/device.portable_media_player.yml
+++ b/priv/ua_inspector/device.portable_media_player.yml
@@ -9,18 +9,20 @@ Apple:
   regex: '(?:Apple-)?iPod'
   device: 'portable media player'
   models:
-    - regex: '(?:Apple-)?iPod1[C,]1'
+    - regex: '(?:Apple-)?iPod1[C,_]?1'
       model: 'iPod Touch 1G'
-    - regex: '(?:Apple-)?iPod2[C,]1'
+    - regex: '(?:Apple-)?iPod2[C,_]?1'
       model: 'iPod Touch 2G'
-    - regex: '(?:Apple-)?iPod3[C,]1'
+    - regex: '(?:Apple-)?iPod3[C,_]?1'
       model: 'iPod Touch 3'
-    - regex: '(?:Apple-)?iPod4[C,]1'
+    - regex: '(?:Apple-)?iPod4[C,_]?1'
       model: 'iPod Touch 4'
-    - regex: '(?:Apple-)?iPod5[C,]1'
+    - regex: '(?:Apple-)?iPod5[C,_]?1'
       model: 'iPod Touch 5'
-    - regex: '(?:Apple-)?iPod7[C,]1'
+    - regex: '(?:Apple-)?iPod7[C,_]?1'
       model: 'iPod Touch 6'
+    - regex: '(?:Apple-)?iPod9[C,_]?1'
+      model: 'iPod Touch 7'
     - regex: '(?:Apple-)?iPod'
       model: 'iPod Touch'
 
@@ -29,14 +31,24 @@ Cowon:
   device: 'portable media player'
   model: '$1'
 
+# FiiO (https://www.fiio.com/)
+FiiO:
+  regex: 'FiiO'
+  device: 'portable media player'
+  models:
+    - regex: 'M11 Plus LTD'
+      model: 'M11 Plus LTD'
+    - regex: 'M(1[57])'
+      model: 'M$1'
+
 Microsoft:
   regex: 'Microsoft ZuneHD'
   device: 'portable media player'
   model: 'Zune HD'
 
 Panasonic:
-  device: 'portable media player'
   regex: '(SV-MV100)'
+  device: 'portable media player'
   model: '$1'
 
 Samsung:
@@ -52,8 +64,33 @@ Samsung:
     - regex: 'YP-GI1'
       model: 'Galaxy Player 4.2'
     - regex: 'YP-GP1'
-      model: 'Galaxy Player 5.8 '
+      model: 'Galaxy Player 5.8'
     - regex: 'YP-G50'
       model: 'Galaxy Player 50'
     - regex: 'YP-GB70D'
-      model: 'Galaxy Player 70 Plus'
\ No newline at end of file
+      model: 'Galaxy Player 70 Plus'
+
+Wizz:
+  regex: '(DV-PTB1080)(?:[);/ ]|$)'
+  device: 'portable media player'
+  model: '$1'
+
+# Sonos (sonos.com)
+SONOS:
+  regex: 'Sonos/.+\((?:ZP.+)\)|Sonos;'
+  device: 'portable media player'
+  models:
+    - regex: '\((ZPS(?:[13569]|1[1-578]|2[03])|ZP90)\)'
+      model: '$1'
+    - regex: 'Sonos;Play5;'
+      model: 'Play:5'
+    - regex: 'Sonos;One;'
+      model: 'One'
+
+# Shanling
+Shanling:
+  regex: 'Shanling M6'
+  device: 'portable media player'
+  models:
+    - regex: 'Shanling (M6\(21\))'
+      model: '$1'
diff --git a/priv/ua_inspector/device.shell_tv.yml b/priv/ua_inspector/device.shell_tv.yml
new file mode 100644
index 0000000000000000000000000000000000000000..94db4119af009613377bfab0744af7d04af4b078
--- /dev/null
+++ b/priv/ua_inspector/device.shell_tv.yml
@@ -0,0 +1,117 @@
+###############
+# Device Detector - The Universal Device Detection library for parsing User Agents
+#
+# @link https://matomo.org
+# @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
+#
+#  ATTENTION: This file may only include tv user agents that contain '[a-z]+[ _]Shell[ _]\w{6}'
+#
+###############
+
+# Telefunken
+Telefunken:
+  regex: 'Telefunken Shell'
+  device: 'tv'
+  model: ''
+
+# JVC
+JVC:
+  regex: 'JVC Shell'
+  device: 'tv'
+  model: ''
+
+# Leff
+Leff:
+  regex: 'Leff Shell'
+  device: 'tv'
+  model: ''
+
+# Leben
+Leben:
+  regex: 'Leben Shell'
+  device: 'tv'
+  model: ''
+
+# Lumus
+Lumus:
+  regex: 'LUMUS Shell'
+  device: 'tv'
+  model: ''
+
+# Erisson
+Erisson:
+  regex: 'Erisson[_ ]Shell'
+  device: 'tv'
+  model: ''
+
+# BBK
+BBK:
+  regex: 'BBK shell'
+  device: 'tv'
+  model: ''
+
+# Novex
+Novex:
+  regex: 'Novex shell'
+  device: 'tv'
+  model: ''
+
+# Digma
+Digma:
+  regex: 'Digma Shell'
+  device: 'tv'
+  model: ''
+
+# AMCV
+AMCV:
+  regex: 'AMCV Shell'
+  device: 'tv'
+  model: ''
+
+# Mystery
+Mystery:
+  regex: 'Mystery Shell'
+  device: 'tv'
+  model: ''
+
+# ECON (econ.su)
+ECON:
+  regex: 'ECON Shell'
+  device: 'tv'
+  model: ''
+
+# Starwind (starwind.com.ru)
+Starwind:
+  regex: 'Starwind Shell'
+  device: 'tv'
+  model: ''
+
+# Kvant (tvkvant.ru)
+Kvant:
+  regex: 'Kvant Shell'
+  device: 'tv'
+  model: ''
+
+# Hi
+Hi:
+  regex: 'Hi Shell'
+  device: 'tv'
+  model: ''
+
+# AKIRA (myakira.com)
+AKIRA:
+  regex: 'AKIRA Shell'
+  device: 'tv'
+  model: ''
+
+# Loview
+Loview:
+  regex: 'Loview Shell'
+  device: 'tv'
+  model: ''
+
+# Yuno (yuno.bbk.ru)
+Yuno:
+  regex: 'Yuno Shell'
+  device: 'tv'
+  model: ''
diff --git a/priv/ua_inspector/device.televisions.yml b/priv/ua_inspector/device.televisions.yml
index ca9963ca487da00eff60e8555c683a5de5c1fca9..ec3f06a3024b51e4ae82186003391bcbe6ba0a73 100644
--- a/priv/ua_inspector/device.televisions.yml
+++ b/priv/ua_inspector/device.televisions.yml
@@ -16,6 +16,20 @@ Airties:
     - regex: 'Airties; ?([^);/]+)'
       model: '$1'
 
+# ALDI NORD
+'ALDI NORD':
+  regex: 'ALDINORD[;,]'
+  device: 'tv'
+  model: ''
+
+# ALDI SÜD
+'ALDI SÜD':
+  regex: 'ALDISUED[;,]'
+  device: 'tv'
+  models:
+    - regex: 'ALDISUED, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+
 # Altech UEC
 'Altech UEC':
   regex: 'Altech UEC'
@@ -24,12 +38,56 @@ Airties:
     - regex: 'Altech UEC; ?([^);/]+)'
       model: '$1'
 
+# AOC
+AOC:
+  regex: 'AOC'
+  device: 'tv'
+  models:
+    - regex: '(LE43S5970-20|S50856)'
+      model: '$1'
+
+# ARRIS
+ARRIS:
+  regex: 'ARRIS[;,]'
+  device: 'tv'
+  models:
+    - regex: 'FS-ARS-01B'
+      model: 'FS-ARS-01B'
+
+# Atvio
+Atvio:
+  regex: 'ATVIO'
+  device: 'tv'
+  models:
+    - regex: '55D1620'
+      model: '55D1620'
+
 # BangOlufsen
 BangOlufsen:
   regex: 'Bangolufsen'
   device: 'tv'
   model: 'BeoVision'
 
+# Blaupunkt
+Blaupunkt:
+  regex: 'Blaupunkt_UMC[;,]'
+  device: 'tv'
+  models:
+    - regex: 'LC-65CUG8052E'
+      model: 'LC-65CUG8052E'
+
+# Bush
+Bush:
+  regex: 'BUSH[;,]'
+  device: 'tv'
+  model: ''
+
+# Celcus
+Celcus:
+  regex: 'CELCUS[;,]'
+  device: 'tv'
+  model: ''
+
 # Changhong
 Changhong:
   regex: 'Changhong'
@@ -44,47 +102,149 @@ CreNova:
   device: 'tv'
   model: 'CNV001'
 
+# Digihome
+Digihome:
+  regex: 'DIGIHOME[;,]'
+  device: 'tv'
+  model: ''
+
 # DMM
 DMM:
   regex: 'DMM'
   device: 'tv'
   model: 'Dreambox'
 
+# ELECTRONIA
+ELECTRONIA:
+  regex: 'ELECTRONIA[;,]'
+  device: 'tv'
+  model: ''
+
+# Essentielb
+Essentielb:
+  regex: 'ESSENTIELB[;,]'
+  device: 'tv'
+  model: ''
+
+# Finlux
+Finlux:
+  regex: 'FINLUX[;,]'
+  device: 'tv'
+  model: ''
+
+# F&U (https://www.fandu.gr/)
+'F&U':
+  regex: 'FU[;,]'
+  device: 'tv'
+  model: ''
+
+# Fuego
+Fuego:
+  regex: 'FUEGO[;,]'
+  device: 'tv'
+  model: ''
+
+# GoGEN (https://www.gogen.cz/)
+GoGEN:
+  regex: 'GOGEN[;,]'
+  device: 'tv'
+  model: ''
+
 # Grundig
 Grundig:
   regex: '(OWB|Grundig|Arcelik)'
   device: 'tv'
+  models:
+    - regex: 'G7'
+      model: 'G7'
+
+# Haier
+Haier:
+  regex: '(?:HHW_)?HAIER'
+  device: 'tv'
+  models:
+    - regex: 'LE55X7000U'
+      model: 'LE55X7000U'
+
+# Hi-Level
+Hi-Level:
+  regex: 'HI-LEVEL[;,]'
+  device: 'tv'
   model: ''
 
 # Hisense
 Hisense:
-  regex: 'Hisense'
+  regex: 'Hisense|Eurofins_Digital_Testing'
   device: 'tv'
   models:
+    - regex: '50ADEVTOOL'
+      model: '50ADEVTOOL'
+    - regex: '50A683FEVS'
+      model: '50A683FEVS'
+    - regex: '55A6100EE'
+      model: '55A6100EE'
+    - regex: '55U62QGAVT'
+      model: '55U62QGAVT'
+    - regex: '50A6502EA'
+      model: '50A6502EA'
+    - regex: 'MICALIDVB6886'
+      model: 'MICALIDVB6886'
     - regex: '(L[A-Z]{2,3}[0-9]{2}[A-Z][0-9]{3,4}[A-Z]{0,6}[0-9]?[A-Z]?)'
       model: '$1'
     - regex: '(H[A-Z]?[0-9]{2}[A-Z][0-9]{3,4}[A-Z]{0,4})'
       model: '$1'
 
+# Hitachi
+Hitachi:
+  regex: 'Hitachi[;,]'
+  device: 'tv'
+  models:
+    - regex: '49D2900'
+      model: '49D2900'
+
+# Horizon
+Horizon:
+  regex: 'HORIZON[;,]'
+  device: 'tv'
+  model: ''
+
+# Hotel
+Hotel:
+  regex: 'HOTEL[;,]'
+  device: 'tv'
+  model: ''
+
 # Humax
 Humax:
-  regex: 'Humax'
+  regex: 'Humax|hdr1000s'
   device: 'tv'
   models:
     - regex: '(HD-FOX C|HD (FOX\+|NANO)|iCord (HD\+|MINI|Cable)|(CX|IR)HD-5100(C|S)|HM9503HD)'
       model: '$1'
     - regex: 'HMS1000S'
       model: 'HMS-1000S'
+    - regex: 'FVP4000T'
+      model: 'FVP-4000T'
+    - regex: 'HGS1000S'
+      model: 'HGS-1000S'
+    - regex: 'HDR1000S'
+      model: 'HDR-1000S'
+    - regex: 'HDR4000T'
+      model: 'HDR-4000T'
     - regex: 'Humax; ([^);/]+)'
       model: '$1'
 
+# Hyundai
+Hyundai:
+  regex: 'HYUNDAI[;,]'
+  device: 'tv'
+  model: ''
+
 # IKEA
 Ikea:
   regex: 'Ikea'
   device: 'tv'
-  models:
-    - regex: '(LF1V[0-9]{3})'
-      model: '$1'
+  model: ''
 
 # Intek
 Intek:
@@ -104,17 +264,83 @@ Inverto:
     - regex: '(Volksbox Web Edition|Volksbox Essential|Volksbox II|Volksbox)'
       model: '$1'
 
+# JVC
+JVC:
+  regex: 'AFTSO001|JVC[;,]'
+  device: 'tv'
+  models:
+    - regex: 'AFTSO001'
+      model: '4K (2019)'
+
+# Kalley
+Kalley:
+  regex: 'KALLEY[;,]'
+  device: 'tv'
+  models:
+    - regex: '32D1620'
+      model: '32D1620'
+
+# KUBO
+KUBO:
+  regex: 'KUBO[;,]'
+  device: 'tv'
+  model: ''
+
+# Laurus
+Laurus:
+  regex: 'LAURUS[;,]'
+  device: 'tv'
+  model: ''
+
 # LG
 LG:
   regex: 'LGE'
   device: 'tv'
   models:
+    - regex: 'XU43WT180N'
+      model: 'XU43WT180N'
+    - regex: '43LJ614V-ZA'
+      model: '43LJ614V-ZA'
+    - regex: '55SK850V-ZA'
+      model: '55SK850V-ZA'
+    - regex: 'KEY0000213F1z'
+      model: 'KEY0000213F1z'
+    - regex: 'KEY0000213F'
+      model: 'KEY0000213F'
+    - regex: 'KEY000000(2E|2F|3B|3F)'
+      model: 'KEY000000$1'
     - regex: '(NetCast [0-9]{1}.[0-9]{1}|GLOBAL_PLAT3)'
       model: '$1'
+    - regex: '(OLED[0-9]{2}[A-Z0-9]{3}[A-Z]{2})'
+      model: '$1'
     - regex: '(OLED[0-9]{2}[A-Z][0-9][A-Z])'
       model: '$1'
+    - regex: '(OLED[0-9]{2}[A-Z0-9]{2})'
+      model: '$1'
+    - regex: '([0-9]{2}[A-Z]{2}[0-9]{4}[A-Z0-9]{1}[A-Z]{2})'
+      model: '$1'
+    - regex: '([0-9]{2}NANO[0-9]{3}[A-Z]{2})'
+      model: '$1'
+    - regex: '([0-9]{2}NANO[0-9]{2})'
+      model: '$1'
     - regex: 'LGE;? ?([0-9]{2}[A-Z]{2}[0-9]{2,4}[A-Z]?)'
       model: '$1'
+    - regex: 'LM21U'
+      model: 'LM21U'
+    - regex: '32LM'
+      model: '32LM'
+
+# Lifemaxx
+Lifemaxx:
+  regex: 'Lifemaxx[;,]'
+  device: 'tv'
+  model: ''
+
+# Linsar
+Linsar:
+  regex: 'LINSAR[;,]'
+  device: 'tv'
+  model: ''
 
 # Loewe
 Loewe:
@@ -124,9 +350,23 @@ Loewe:
     - regex: '([A-Z]{2}[0-9]{3})'
       model: '$1'
 
+# Luxor
+Luxor:
+  regex: 'LUXOR[;,]'
+  device: 'tv'
+  model: ''
+
+# Manhattan (https://manhattan-tv.com/)
+Manhattan:
+  regex: 'Manhattan'
+  device: 'tv'
+  models:
+    - regex: 'T3'
+      model: 'T3'
+
 # MediaTek
 MediaTek:
-  regex: 'MTK'
+  regex: 'MTK|MediaTek;'
   device: 'tv'
   models:
     - regex: '(MT[0-9]{4})'
@@ -137,8 +377,38 @@ Medion:
   regex: 'Medion'
   device: 'tv'
   models:
-    - regex: '(MB[0-9]{2})'
-      model: '$1'
+    - regex: 'MEDION, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
+
+# Miray
+Miray:
+  regex: 'MIRAY'
+  device: 'tv'
+  models:
+    - regex: 'LEDM-322NIP'
+      model: 'LEDM-322NIP'
+
+# MStar
+MStar:
+  regex: 'MStar[;,]'
+  device: 'tv'
+  models:
+    - regex: '([24])KTV18'
+      model: '$1KTV18'
+
+# MTC
+MTC:
+  regex: 'MTC[;,]'
+  device: 'tv'
+  models:
+    - regex: '([24])K_Android_TV_V01'
+      model: '$1K Android TV'
+
+# Nordmende
+Nordmende:
+  regex: 'NORDMENDE[;,]'
+  device: 'tv'
+  model: ''
 
 # Metz
 Metz:
@@ -146,23 +416,31 @@ Metz:
   device: 'tv'
   model: ''
 
+# Ok
+Ok:
+  regex: 'OK[;,]'
+  device: 'tv'
+  model: ''
+
 # Panasonic
 Panasonic:
   regex: 'Panasonic'
   device: 'tv'
   models:
-    - regex: '(VIERA [0-9]{1,4})|(DIGA [A-Z]{1}[0-9]{4})'
+    - regex: 'VIERA (201[1-9])'
+      model: 'VIERA ($1)'
+    - regex: '(DIGA [A-Z]{1}[0-9]{4})'
       model: '$1'
     - regex: 'DIGA Webkit ([A-Z]{1}[0-9]{4})'
       model: 'DIGA $1'
+    - regex: 'SmartTV(201[89]|202[0-1])'
+      model: 'Smart TV ($1)'
 
 # PEAQ
 PEAQ:
   regex: 'PEAQ'
   device: 'tv'
-  models:
-    - regex: '(LF1V[0-9]{3})'
-      model: '$1'
+  model: ''
 
 # Philips
 Philips:
@@ -174,15 +452,69 @@ Philips:
     - regex: 'NETTV/[0-9\.]{5}'
       model: 'NetTV Series'
 
+# Polaroid
+Polaroid:
+  regex: 'POLAROID[;,]'
+  device: 'tv'
+  model: ''
+
+# PROFiLO
+PROFiLO:
+  regex: 'PROFILO[;,]'
+  device: 'tv'
+  model: ''
+
+# Qilive
+Qilive:
+  regex: 'QILIVE[;,]'
+  device: 'tv'
+  model: ''
+
+# REGAL
+REGAL:
+  regex: 'REGAL[;,]'
+  device: 'tv'
+  model: ''
+
+# Saba
+Saba:
+  regex: 'Saba[;,]'
+  device: 'tv'
+  model: ''
+
+# Salora
+Salora:
+  regex: 'Salora[;,]'
+  device: 'tv'
+  model: ''
+
 # Samsung
 Samsung:
   regex: 'Samsung|Maple_2011'
   device: 'tv'
   models:
-    - regex: 'SmartTV(201[2-9])'
-      model: 'Smart TV $1'
+    - regex: 'SmartTV(201[2-9]|202[0-1]):([^);/]+)'
+      model: '$2'
+    - regex: 'SmartTV(201[2-9]|202[0-1])'
+      model: 'Smart TV ($1)'
     - regex: 'Maple_2011'
-      model: 'Smart TV 2011'
+      model: 'Smart TV (2011)'
+
+# SCBC
+SCBC:
+  regex: 'SCBC[;,]'
+  device: 'tv'
+  models:
+    - regex: 'SCBC586'
+      model: 'SCBC586'
+    - regex: '43D1850'
+      model: '43D1850'
+
+# SEG
+SEG:
+  regex: 'SEG[;,]'
+  device: 'tv'
+  model: ''
 
 # Selevision
 Selevision:
@@ -196,13 +528,19 @@ Selevision:
 
 # Sharp
 Sharp:
-  regex: 'Sharp'
+  regex: '(?:UMC-)?Sharp'
   device: 'tv'
   models:
+    - regex: 'SHARP, ([a-z0-9_ \-]+), (?:wired|wireless)'
+      model: ''
     - regex: 'Sharp[,;] ?((?! |HbbTV)[^),;/]+)'
       model: '$1'
     - regex: '(LE[0-9]{3}[A-Z]{0,3})'
       model: '$1'
+    - regex: 'LC-([^);/]+)'
+      model: 'LC-$1'
+    - regex: 'BLA-43'
+      model: 'BLA-43'
 
 # Skyworth
 Skyworth:
@@ -212,9 +550,9 @@ Skyworth:
     - regex: 'Sky_worth;([^);/]+)'
       model: '$1'
 
-# Smart
-Smart:
-  regex: 'Smart[^a-z]'
+# Smart Electronic
+Smart Electronic:
+  regex: 'Smart[;,]'
   device: 'tv'
   models:
     - regex: 'Smart; ([^);/]+)'
@@ -227,9 +565,49 @@ Sony:
   regex: 'Sony'
   device: 'tv'
   models:
+    - regex: 'KDL-GR1'
+      model: 'KDL-GR1'
+    - regex: 'KDL-GN([56])'
+      model: 'KDL-GN$1'
+    - regex: 'BRAVIA (VH1|4K VH2)'
+      model: 'BRAVIA $1'
+    - regex: '(KDL?-?[0-9]{2}[A-Z]{1}[0-9]{4}[A-Z]{1})'
+      model: '$1'
+    - regex: '(KDL?-?[0-9]{2}[A-Z]{1}[0-9]{3}[A-Z]{1})'
+      model: '$1'
     - regex: '(KDL?-?[0-9]{2}[A-Z]{1,2}[0-9]{1,5})'
       model: '$1'
 
+# SWTV
+SWTV:
+  regex: 'SWTV[;,]'
+  device: 'tv'
+  models:
+    - regex: 'SKWE20E21'
+      model: 'SKWE20E21'
+
+# TD Systems
+'TD Systems':
+  regex: 'TDSystems[;,]'
+  device: 'tv'
+  models:
+    - regex: 'SmartTV(2019|2020)'
+      model: 'Smart TV ($1)'
+
+# Technicolor
+Technicolor:
+  regex: 'Technicolor'
+  device: 'tv'
+  models:
+    - regex: 'uzw4054ttg'
+      model: 'UZW4054TTG'
+
+# Technika
+Technika:
+  regex: 'TECHNIKA[;,]'
+  device: 'tv'
+  model: ''
+
 # TechniSat
 TechniSat:
   regex: 'TechniSat'
@@ -246,21 +624,24 @@ TechnoTrend:
     - regex: '([A-Z]{1}-[0-9]{3})'
       model: '$1'
 
+# Techwood
+Techwood:
+  regex: 'Techwood[;,]'
+  device: 'tv'
+  model: ''
+
 # Telefunken
 Telefunken:
   regex: 'Telefunken'
   device: 'tv'
-  models:
-    - regex: '(MB[0-9]{2})'
-      model: '$1'
+  model: ''
+
 # TCL
 TCL:
   regex: 'TCL'
   device: 'tv'
   models:
-    - regex: '(32D1820)'
-      model: '$1'
-    - regex: '(LF1V[0-9]{3})'
+    - regex: '(32D1820|(?:39|55)D2900|32D2930|(?:32|43)S4900)'
       model: '$1'
 
 # Thomson
@@ -280,25 +661,27 @@ Thomson:
       model: '$1 49.0"'
     - regex: '(T55D18[SD]FS-01B)'
       model: '$1 55.0"'
-    - regex: '(LF1V[0-9]{3})'
-      model: '$1'
+    - regex: '40FB5426'
+      model: '40FB5426'
+
+# TOKYO
+TOKYO:
+  regex: 'TOKYO[;,]'
+  device: 'tv'
+  models:
+    - regex: 'TOKTCLED32S'
+      model: 'TOKTCLED32S'
 
 # Toshiba
 Toshiba:
   regex: 'Toshiba'
   device: 'tv'
   models:
+    - regex: '40L2600'
+      model: '40L2600'
     - regex: '(([0-9]{2}|DTV_)[A-Z]{2}[0-9]{1,3})'
       model: '$1'
 
-# Vestel
-Vestel:
-  regex: 'Vestel'
-  device: 'tv'
-  models:
-    - regex: '(MB[0-9]{2})'
-      model: '$1'
-
 # Videoweb
 Videoweb:
   regex: 'videoweb|tv2n'
@@ -307,4 +690,34 @@ Videoweb:
     - regex: '(tv2n)'
       model: '$1'
     - regex: '(videowebtv)'
-      model: 'VideoWeb TV'
\ No newline at end of file
+      model: 'VideoWeb TV'
+
+# VOX (https://www.voxelectronics.com/)
+VOX:
+  regex: 'VOX[;,]'
+  device: 'tv'
+  model: ''
+
+# WELLINGTON
+WELLINGTON:
+  regex: 'WELLINGTON[;,]'
+  device: 'tv'
+  model: ''
+
+# X.Vision
+X.Vision:
+  regex: 'X-VISION[;,]'
+  device: 'tv'
+  model: ''
+
+# Vestel
+Vestel:
+  regex: '(?:Vestel.+VESTEL|VESTEL;)'
+  device: 'tv'
+  model: ''
+
+# Unknown
+Unknown:
+  regex: 'OEM, ([a-z0-9_ \-]+), (?:wired|wireless)'
+  device: 'tv'
+  model: ''
diff --git a/priv/ua_inspector/os.oss.yml b/priv/ua_inspector/os.oss.yml
index c2f01dd9998aad432febe9550298a32624eadff8..f0f52fab126ab7da98b40125991d9ae50a19a210 100644
--- a/priv/ua_inspector/os.oss.yml
+++ b/priv/ua_inspector/os.oss.yml
@@ -6,21 +6,80 @@
 ###############
 
 ##########
-# Tizen
+# COS (China Operating System - https://web.archive.org/web/20170825001023/http://www.china-cos.com/)
 ##########
-- regex: 'Tizen[ /]?(\d+[\.\d]+)?'
-  name: 'Tizen'
+- regex: ' COS like Android'
+  name: 'China OS'
+  version: ''
+
+##########
+# ClearOS Mobile (https://www.clearos.com/products/clearos-editions/clearos-mobile)
+##########
+- regex: 'Android (\d+[\.\d]*); ClearPHONE'
+  name: 'ClearOS Mobile'
   version: '$1'
 
+##########
+# Plasma Mobile (https://plasma-mobile.org/)
+##########
+- regex: 'Plasma Mobile'
+  name: 'Plasma Mobile'
+  version: ''
+
+##########
+# KreaTV
+##########
+- regex: 'KreaTV/0.0.0.0'
+  name: 'KreaTV'
+  version: ''
 
+- regex: 'KreaTV/(\d+[\.\d]+)'
+  name: 'KreaTV'
+  version: '$1'
 
 ##########
-## Sailfish OS
-###########
-- regex: 'Sailfish|Jolla'
-  name: 'Sailfish OS'
+# Opera TV (https://blogs.opera.com/news/2016/01/ces-2016-meet-opera-tv/)
+##########
+- regex: 'Linux (?:[^;]+); Opera TV(?: Store)?/|^Opera/\d+\.\d+ \(Linux mips'
+  name: 'Opera TV'
   version: ''
 
+##########
+# GridOS (https://web.archive.org/web/20111123141630/http://fusiongarage.com/grid-os/about)
+##########
+- regex: 'Grid OS (\d+[\.\d]+)'
+  name: 'GridOS'
+  version: '$1'
+
+##########
+# Caixa Mágica (https://caixamagica.pt/)
+##########
+- regex: 'CaixaMagica'
+  name: 'Caixa Mágica'
+  version: ''
+
+##########
+# Mageia (https://www.mageia.org/en/)
+##########
+- regex: 'Mageia; Linux'
+  name: 'Mageia'
+  version: ''
+
+##########
+# Whale OS (https://www.zeasn.com/)
+##########
+- regex: '(?:WH|WhaleTV/)(\d+[\.\d]+)'
+  name: 'Whale OS'
+  version: '$1'
+
+##########
+# Tizen
+##########
+- regex: 'Tizen[ /]?(\d+[\.\d]+)?'
+  name: 'Tizen'
+  version: '$1'
+
+
 ##########
 # YunOS (Android based)
 ##########
@@ -31,11 +90,14 @@
 ##########
 # Windows Mobile
 ##########
-- regex: '(?:Windows Phone (?:OS)?|wds)[ ]?(\d+[\.\d]+)'
+- regex: 'Windows Phone;FBSV/(\d+[\.\d]+)'
+  name: 'Windows Phone'
+  version: '$1'
+
+- regex: '(?:Windows Phone (?:OS)?|wds)[ /]?(\d+[\.\d]+)'
   name: 'Windows Phone'
   version: '$1'
-  
-  
+
 - regex: 'XBLWP7|Windows Phone'
   name: 'Windows Phone'
   version: ''
@@ -43,17 +105,15 @@
 - regex: 'Windows CE(?: (\d+[\.\d]+))?'
   name: 'Windows CE'
   version: '$1'
-  
-  
+
 - regex: '(?:IEMobile|Windows ?Mobile)(?: (\d+[\.\d]+))?'
   name: 'Windows Mobile'
   version: '$1'
-  
-  
+
 - regex: 'Windows NT 6.2; ARM;'
   name: 'Windows RT'
   version: ''
-  
+
 - regex: 'Windows NT 6.3; ARM;'
   name: 'Windows RT'
   version: '8.1'
@@ -75,6 +135,10 @@
 ##########
 # Custom Android Roms
 ##########
+- regex: 'HarmonyOS(?:[/ ](\d+[\.\d]+))?'
+  name: 'HarmonyOS'
+  version: '$1'
+
 - regex: 'RazoDroiD(?: v(\d+[\.\d]*))?'
   name: 'RazoDroiD'
   version: '$1'
@@ -95,9 +159,68 @@
   name: 'Fire OS'
   version: '$1'
 
+- regex: '.+FIRETVSTICK2018'
+  name: 'Fire OS'
+  version: '6'
+
+- regex: 'AFTSO001'
+  name: 'Fire OS'
+  version: '7'
+
+- regex: 'FydeOS'
+  name: 'FydeOS'
+  version: ''
+
+##########
+# Remix OS
+##########
+- regex: 'RemixOS|Remix (?:Pro|Mini)'
+  name: 'Remix OS'
+  versions:
+    - regex: 'RemixOS 5'
+      version: '1'
+    - regex: 'RemixOS 6|Remix Mini'
+      version: '2'
+    - regex: 'Remix Pro'
+      version: '3'
+
+##########
+# FreeBSD
+##########
+- regex: 'FreeBSD.+Android'
+  name: 'FreeBSD'
+  version: ''
+
+##########
+# Android TV (https://android.com/tv/)
+##########
+- regex: 'Linux; Andr0id[; ](\d+[\.\d]*)'
+  name: 'Android TV'
+  version: '$1'
+
+- regex: 'Android[; ](\d+[\.\d]*).+Android TV'
+  name: 'Android TV'
+  version: '$1'
+
 ##########
 # Android
 ##########
+- regex: 'Android Marshmallow'
+  name: 'Android'
+  version: '6'
+
+- regex: '(?:Podbean|Podimo)(?:.*)/Android'
+  name: 'Android'
+  version: ''
+
+- regex: 'Android OS/(\d+[\.\d]*)'
+  name: 'Android'
+  version: '$1'
+
+- regex: 'Pinterest for Android/.*; (\d(?:[\d\.]*))\)$'
+  name: 'Android'
+  version: '$1'
+
 - regex: 'Android; (\d+[\.\d]*); Mobile;'
   name: 'Android'
   version: '$1'
@@ -106,11 +229,23 @@
   name: 'Android'
   version: '$1'
 
-- regex: '(?:(?:Orca-)?Android|Adr)[ /](?:[a-z]+ )?(\d+[\.\d]*)'
+- regex: '(?:(?:Orca-)?(?<!like )Android|Adr|AOSP)[ /]?(?:[a-z]+ )?(\d+[\.\d]*)'
+  name: 'Android'
+  version: '$1'
+
+- regex: '(?:Allview_TX1_Quasar|Cosmote_My_mini_Tab) (\d+[\.\d]*)'
+  name: 'Android'
+  version: '$1'
+
+- regex: 'Android ?(?:jelly bean|Kit Kat|S.O. Ginger Bread|The FireCyano|:) (\d+[\.\d]*)'
+  name: 'Android'
+  version: '$1'
+
+- regex: '(?:Orca-Android|FB4A).*FBSV/(\d+[\.\d]*);'
   name: 'Android'
   version: '$1'
-  
-- regex: 'Android|Silk-Accelerated=[a-z]{4,5}'
+
+- regex: ' Adr |(?<!like )Android|Silk-Accelerated=[a-z]{4,5}'
   name: 'Android'
   version: ''
 
@@ -118,15 +253,26 @@
   name: 'Android'
   version: '$1'
 
-- regex: 'FB4A.*FBSV/(\d+[\.\d]*);'
+- regex: 'BeyondPod|AntennaPod|Podkicker|DoggCatcher|Player FM|okhttp|Podcatcher Deluxe|.+K_?Android_?TV_|Sonos/.+\(ACR_'
+  name: 'Android'
+  version: ''
+
+# Inverted Android
+- regex: 'Linux; diordnA[; ](\d+[\.\d]*)'
   name: 'Android'
   version: '$1'
 
-- regex: 'BeyondPod|AntennaPod|Podkicker|DoggCatcher|Player FM|okhttp|Podcatcher Deluxe'
+- regex: '^A/(\d+[\.\d]*)/'
   name: 'Android'
+  version: '$1'
+
+##########
+## Sailfish OS
+###########
+- regex: 'Sailfish|Jolla'
+  name: 'Sailfish OS'
   version: ''
-  
-  
+
 ##########
 # AmigaOS
 ##########
@@ -155,13 +301,103 @@
   name: 'MTK / Nucleus'
   version: '$1'
 
+##########
+# MRE / MAUI Runtime Environment
+##########
+- regex: 'MRE/(\d+)\.(\d+).*;MAUI'
+  name: 'MRE'
+  version: '$1.$2'
+
 ##########
 # Linux
 ##########
+# Linspire (https://www.linspirelinux.com/)
+- regex: 'Linspire'
+  name: 'Linspire'
+  version: ''
+
+# LindowsOS (https://web.archive.org/web/20040304161245/http://www.lindows.com/)
+- regex: 'LindowsOS'
+  name: 'LindowsOS'
+  version: ''
+
+# Zenwalk (http://www.zenwalk.org/)
+- regex: 'Zenwalk GNU Linux'
+  name: 'Zenwalk'
+  version: ''
+
+# Kanotix (http://www.kanotix.com/)
+- regex: 'Linux.+kanotix'
+  name: 'Kanotix'
+  version: ''
+
+# moonOS (https://www.moonos.org/)
+- regex: 'moonOS/(\d+.[\d.]+)'
+  name: 'moonOS'
+  version: '$1'
+
+# Foresight Linux (https://www.foresightlinux.org/)
+- regex: 'Foresight Linux'
+  name: 'Foresight Linux'
+  version: ''
+
+# Pardus (https://www.pardus.org.tr/)
+- regex: 'Pardus/(\d+.[\d.]+)'
+  name: 'Pardus'
+  version: '$1'
+
+# Pure OS (https://pureos.net/)
+- regex: 'Librem 5'
+  name: 'PureOS'
+  version: ''
+
+# OpenWrt (https://openwrt.org/)
+- regex: 'uclient-fetch'
+  name: 'OpenWrt'
+  version: ''
+
+# Roku OS (https://www.roku.com/how-it-works/roku-os)
+- regex: 'RokuOS/.+RokuOS (\d+.[\d.]+)'
+  name: 'Roku OS'
+  version: '$1'
+
+- regex: 'Roku(?:OS)?/(?:DVP|Pluto)?-?(\d+[\.\d]+)'
+  name: 'Roku OS'
+  version: '$1'
+
+- regex: 'Roku; (?:AP|UI); (\d+[\.\d]+)'
+  name: 'Roku OS'
+  version: '$1'
+
+# DVKBuntu (https://www.dvkbuntu.org/)
+- regex: 'dvkbuntu'
+  name: 'DVKBuntu'
+  version: ''
+
+# Lumin OS (https://developer.magicleap.com/en-us/learn/guides/lumin-os-release-notes-summary)
+- regex: 'Helio/(\d+[\.\d]+)'
+  name: 'Lumin OS'
+  version: '$1'
+
+# HasCodingOS (https://forum.hascoding.com/HasCodingOS)
+- regex: 'HasCodingOs (\d+[\.\d]+)'
+  name: 'HasCodingOS'
+  version: '$1'
+
+# PCLinuxOS (https://www.pclinuxos.com/)
+- regex: 'PCLinuxOS/(\d+[\.\d]+)'
+  name: 'PCLinuxOS'
+  version: '$1'
+
 - regex: '(Ordissimo|webissimo3)'
   name: 'Ordissimo'
   version: ''
 
+# Fenix (https://fenixlinux.com/)
+- regex: '(?:Win|Sistema )Fenix'
+  name: 'Fenix'
+  version: ''
+
 - regex: 'TOS; Linux'
   name: 'TmaxOS'
   version: ''
@@ -182,18 +418,41 @@
   name: '$1'
   version: '$2'
 
-- regex: '(Debian|Knoppix|Mint|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack)(?:(?: Enterprise)? Linux)?(?:[ /\-](\d+[\.\d]+))?'
+- regex: 'Deepin[ /](\d+[\.\d]+)'
+  name: 'Deepin'
+  version: '$1'
+
+- regex: '(Debian|Knoppix|Mint(?! Browser)|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack|Freebox)(?:(?: Enterprise)? Linux)?(?:[ /\-](\d+[\.\d]+))?'
   name: '$1'
   version: '$2'
 
-# generic linux match -> end of file
+- regex: 'OS ROSA; Linux'
+  name: 'Rosa'
+  version: ''
 
 ##########
 # webOS
 ##########
-- regex: '(?:webOS|web0S|Palm webOS)(?:/(\d+[\.\d]+))?'
+- regex: '(?:Web0S; .*WEBOS|webOS|web0S|Palm webOS|hpwOS)(?:[/]?(\d+[\.\d]+))?'
   name: 'webOS'
   version: '$1'
+  versions:
+    - regex: 'WEBOS(\d+[\.\d]+)'
+      version: '$1'
+    - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/79'
+      version: '6'
+    - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/68'
+      version: '5'
+    - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/53'
+      version: '4'
+    - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/38'
+      version: '3'
+    - regex: 'WEBOS1'
+      version: '1'
+    - regex: 'Web0S; Linux/SmartTV.+Safari/538'
+      version: '2'
+    - regex: 'Web0S; Linux/SmartTV.+Safari/537'
+      version: '1'
 
 - regex: '(?:PalmOS|Palm OS)(?:[/ ](\d+[\.\d]+))?|Palm'
   name: 'palmOS'
@@ -203,15 +462,33 @@
   name: 'palmOS'
   version: '$1'
 
-
 - regex: 'MorphOS(?:[ /](\d+[\.\d]+))?'
   name: 'MorphOS'
   version: '$1'
 
-  
 ##########
 # Windows
 ##########
+- regex: 'FBW.+FBSV/(\d+[\.\d]*);'
+  name: 'Windows'
+  version: '$1'
+
+- regex: 'Windows.+OS: (\d+[\.\d]*)'
+  name: 'Windows'
+  version: '$1'
+
+- regex: 'Windows;(\d+[\.\d]*);'
+  name: 'Windows'
+  version: '$1'
+
+- regex: 'mingw32|winhttp'
+  name: 'Windows'
+  version: ''
+
+- regex: '(?:Windows(?:-Update-Agent)?|Microsoft-(?:CryptoAPI|Delivery-Optimization|WebDAV-MiniRedir|WNS))/(\d+\.\d+)'
+  name: 'Windows'
+  version: '$1'
+
 - regex: 'CYGWIN_NT-10.0|Windows NT 10.0|Windows 10'
   name: 'Windows'
   version: '10'
@@ -228,7 +505,7 @@
   name: 'Windows'
   version: '8'
 
-- regex: 'CYGWIN_NT-6.1|Windows NT 6.1|Windows 7|win7'
+- regex: 'CYGWIN_NT-6.1|Windows NT 6.1|Windows 7|win7|Windows \(6.1'
   name: 'Windows'
   version: '7'
 
@@ -268,15 +545,10 @@
   name: 'Windows'
   version: '3.1'
 
-- regex: 'FBW.*FBSV/(\d+[\.\d]*);'
-  name: 'Windows'
-  version: '$1'
-
-- regex: 'Windows'
+- regex: 'Windows|.+win32|Win64|MSDW|HandBrake Win Upd|Microsoft BITS'
   name: 'Windows'
   version: ''
 
-
 ##########
 # Haiku OS
 ##########
@@ -284,261 +556,491 @@
   name: 'Haiku OS'
   version: ''
 
-  
 ##########
-# iOS
+# tvOS (https://developer.apple.com/tvos/)
 ##########
-- regex: 'CFNetwork/889'
-  name: 'iOS'
-  version: '11.1'
-
-- regex: 'CFNetwork/887.*(x86_64)'
-  name: 'Mac'
-  version: '10.13'
-
-- regex: 'CFNetwork/887'
-  name: 'iOS'
-  version: '11.0'
-
-- regex: 'CFNetwork/811.*(x86_64)'
-  name: 'Mac'
-  version: '10.12'
-
-- regex: 'CFNetwork/811'
-  name: 'iOS'
-  version: '10.3'
-
-- regex: 'CFNetwork/808\.3'
-  name: 'iOS'
-  version: '10.3'
+- regex: 'Apple ?TV.*CPU (?:iPhone )?OS ((?:9|1[0-5])[_\.]\d+(?:[_.]\d+)*)'
+  name: 'tvOS'
+  version: '$1'
 
-- regex: 'CFNetwork/808\.2'
-  name: 'iOS'
-  version: '10.2'
+- regex: 'iOS(?:; |/)((?:9|1[0-5]).\d+(?:[_\.]\d+)*) (?:model/)?AppleTV'
+  name: 'tvOS'
+  version: '$1'
 
-- regex: 'CFNetwork/808\.1'
-  name: 'iOS'
-  version: '10.1'
+##########
+# watchOS (https://developer.apple.com/watchos/)
+##########
+- regex: '(?:Watch1,[12]/|Watch OS,|watchOS[ /])(\d+[\.\d]*)'
+  name: 'watchOS'
+  version: '$1'
 
-- regex: 'CFNetwork/808\.0'
-  name: 'iOS'
-  version: '10.0'
+##########
+# iPadOS (https://www.apple.com/ipados/)
+##########
+- regex: 'FBMD/iPad;.*FBSV/ ?(1[345]).(\d+[\.\d]*);'
+  name: 'iPadOS'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/808'
-  name: 'iOS'
-  version: '10'
+- regex: 'iPad/(1[345]).(\d+[\.\d]*)'
+  name: 'iPadOS'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/758\.4\.3'
-  name: 'iOS'
-  version: '9.3.2'
+- regex: '^iPad(?:\d+[\,\d]*)/(1[345]).(\d+[\.\d]*)'
+  name: 'iPadOS'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/758\.3\.15'
-  name: 'iOS'
-  version: '9.3'
+- regex: 'iPad(?:; iOS|.+CPU OS) ((1[345])+(?:[_\.]\d+)*)'
+  name: 'iPadOS'
+  version: '$1'
 
-- regex: 'CFNetwork/758\.2\.[78]'
-  name: 'iOS'
-  version: '9.2'
+- regex: 'iOS/(1[345]).(\d+[\.\d]*).+Apple/iPad'
+  name: 'iPadOS'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/758\.1\.6'
-  name: 'iOS'
-  version: '9.1'
+- regex: 'iPhone OS,(1[345]).(\d+[\.\d]*).+iPad'
+  name: 'iPadOS'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/758\.0\.2'
+##########
+# iOS
+##########
+- regex: 'iPad/([89]|1[012]).(\d+[\.\d]*)'
   name: 'iOS'
-  version: '9.0'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/711\.5\.6'
+- regex: '^(?:iPad|iPhone)(?:\d+[\,\d]*)[/_](\d+[\.\d]+)'
   name: 'iOS'
-  version: '8.4.1'
+  version: '$1'
 
-- regex: 'CFNetwork/711\.4\.6'
+- regex: 'Pinterest for iOS/.*; (\d(?:[\d\.]*))[)]$'
   name: 'iOS'
-  version: '8.4'
+  version: '$1'
 
-- regex: 'CFNetwork/711\.3\.18'
+- regex: '(?:iPhone ?OS|iOS(?: Version)?)(?:/|; |,)(\d+[\.\d]+)'
   name: 'iOS'
-  version: '8.3'
+  version: '$1'
 
-- regex: 'CFNetwork/711\.2\.23'
+- regex: '^(?!com.apple.Safari.SearchHelper).*CFNetwork/.+ Darwin/(\d+[\.\d]+)(?!.*(?:x86_64|i386|PowerMac|Power%20Macintosh))'
   name: 'iOS'
-  version: '8.2'
-
-- regex: 'CFNetwork/711\.1\.1[26]'
+  versions:
+    - regex: 'Darwin/21.4.0'
+      version: '15.4'
+    - regex: 'Darwin/21.3.0'
+      version: '15.3'
+    - regex: 'Darwin/21.2.0'
+      version: '15.2'
+    - regex: 'Darwin/21.1.0'
+      version: '15.1'
+    - regex: 'Darwin/21.0.0'
+      version: '15.0'
+    - regex: 'Darwin/20.6.0'
+      version: '14.7'
+    - regex: 'Darwin/20.5.0'
+      version: '14.6'
+    - regex: 'Darwin/20.4.0'
+      version: '14.5'
+    - regex: 'Darwin/20.3.0'
+      version: '14.4'
+    - regex: 'Darwin/20.2.0'
+      version: '14.3'
+    - regex: 'Darwin/20.1.0'
+      version: '14.2'
+    - regex: 'Darwin/20.0.0'
+      version: '14.0'
+    - regex: 'Darwin/19.6.0'
+      version: '13.6'
+    - regex: 'Darwin/19.5.0'
+      version: '13.5'
+    - regex: 'Darwin/19.4.0'
+      version: '13.4'
+    - regex: 'Darwin/19.3.0'
+      version: '13.3.1'
+    - regex: 'Darwin/19.2.0'
+      version: '13.3'
+    - regex: 'Darwin/19.0.0'
+      version: '13.0'
+    - regex: 'Darwin/18.7.0'
+      version: '12.4'
+    - regex: 'Darwin/18.6.0'
+      version: '12.3'
+    - regex: 'Darwin/18.5.0'
+      version: '12.2'
+    - regex: 'Darwin/18.2.0'
+      version: '12.1'
+    - regex: 'Darwin/18.0.0'
+      version: '12.0'
+    - regex: 'Darwin/17.7.0'
+      version: '11.4.1'
+    - regex: 'Darwin/17.6.0'
+      version: '11.4'
+    - regex: 'Darwin/17.5.0'
+      version: '11.3'
+    - regex: 'Darwin/17.4.0'
+      version: '11.2.6'
+    - regex: 'Darwin/17.3.0'
+      version: '11.2'
+    - regex: 'CFNetwork/889'
+      version: '11.1'
+    - regex: 'CFNetwork/887'
+      version: '11.0'
+    - regex: 'CFNetwork/811'
+      version: '10.3'
+    - regex: 'CFNetwork/808\.3'
+      version: '10.3'
+    - regex: 'CFNetwork/808\.2'
+      version: '10.2'
+    - regex: 'CFNetwork/808\.1'
+      version: '10.1'
+    - regex: 'CFNetwork/808\.0'
+      version: '10.0'
+    - regex: 'CFNetwork/808'
+      version: '10'
+    - regex: 'CFNetwork/758\.5\.3'
+      version: '9.3.5'
+    - regex: 'CFNetwork/758\.4\.3'
+      version: '9.3.2'
+    - regex: 'CFNetwork/758\.3\.15'
+      version: '9.3'
+    - regex: 'CFNetwork/758\.2\.[78]'
+      version: '9.2'
+    - regex: 'CFNetwork/758\.1\.6'
+      version: '9.1'
+    - regex: 'CFNetwork/758\.0\.2'
+      version: '9.0'
+    - regex: 'CFNetwork/711\.5\.6'
+      version: '8.4.1'
+    - regex: 'CFNetwork/711\.4\.6'
+      version: '8.4'
+    - regex: 'CFNetwork/711\.3\.18'
+      version: '8.3'
+    - regex: 'CFNetwork/711\.2\.23'
+      version: '8.2'
+    - regex: 'CFNetwork/711\.1\.1[26]'
+      version: '8.1'
+    - regex: 'CFNetwork/711\.0\.6'
+      version: '8.0'
+    - regex: 'CFNetwork/672\.1'
+      version: '7.1'
+    - regex: 'CFNetwork/672\.0'
+      version: '7.0'
+    - regex: 'CFNetwork/609\.1'
+      version: '6.1'
+    - regex: 'CFNetwork/60[29]'
+      version: '6.0'
+    - regex: 'CFNetwork/548\.1'
+      version: '5.1'
+    - regex: 'CFNetwork/548\.0'
+      version: '5.0'
+    - regex: 'CFNetwork/485\.13'
+      version: '4.3'
+    - regex: 'CFNetwork/485\.12'
+      version: '4.2'
+    - regex: 'CFNetwork/485\.10'
+      version: '4.1'
+    - regex: 'CFNetwork/485\.2'
+      version: '4.0'
+    - regex: 'CFNetwork/467\.12'
+      version: '3.2'
+    - regex: 'CFNetwork/459'
+      version: '3.1'
+
+- regex: '(?:iPhone|iPod_touch)/(\d+[\.\d]*) hw/'
   name: 'iOS'
-  version: '8.1'
+  version: '$1'
 
-- regex: 'CFNetwork/711\.0\.6'
+- regex: 'iOS(\d+\.\d+\.\d+)'
   name: 'iOS'
-  version: '8.0'
+  version: '$1'
 
-- regex: 'CFNetwork/672\.1'
+- regex: 'iOS(\d+)\.(\d+)0'
   name: 'iOS'
-  version: '7.1'
+  version: '$1.$2'
 
-- regex: 'CFNetwork/672\.0'
+- regex: 'iPhone OS ([0-9]{1})([0-9]{1})([0-9]{1})'
   name: 'iOS'
-  version: '7.0'
+  version: '$1.$2.$3'
 
-- regex: 'CFNetwork/609\.1'
+- regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iOS)[ _/](\d+(?:[_\.]\d+)*)'
   name: 'iOS'
-  version: '6.1'
+  version: '$1'
 
-- regex: 'CFNetwork/60[29]'
+- regex: 'FBMD/iPhone;.*FBSV/ ?(\d+[\.\d]+);'
   name: 'iOS'
-  version: '6.0'
+  version: '$1'
 
-- regex: 'CFNetwork/548\.1'
+- regex: '(?:FBIOS|Messenger(?:Lite)?ForiOS).*FBSV/ ?(\d+[\.\d]*);'
   name: 'iOS'
-  version: '5.1'
+  version: '$1'
 
-- regex: 'CFNetwork/548\.0'
+- regex: 'iPhone OS,([\d\.]+).+(?:iPhone|iPod)'
   name: 'iOS'
-  version: '5.0'
+  version: '$1'
 
-- regex: 'CFNetwork/485\.13'
+- regex: 'iPad.+; (\d+[\.\d]+);'
   name: 'iOS'
-  version: '4.3'
+  version: '$1'
 
-- regex: 'CFNetwork/485\.12'
+- regex: 'iPhone.+; Version (\d+[\.\d]+)'
   name: 'iOS'
-  version: '4.2'
+  version: '$1'
 
-- regex: 'CFNetwork/485\.10'
+- regex: 'OS=iOS;OSVer=(\d+[\.\d]+);'
   name: 'iOS'
-  version: '4.1'
+  version: '$1'
 
-- regex: 'CFNetwork/485\.2'
+- regex: 'os=Apple-iOS.+osversion=(\d+[\.\d]+)/'
   name: 'iOS'
-  version: '4.0'
+  version: '$1'
 
-- regex: 'CFNetwork/467\.12'
+- regex: '(?:Apple-)?(?<!like )(?:iPhone|iPad|iPod)(?:.*Mac OS X.*Version/(\d+\.\d+)|; Opera)?'
   name: 'iOS'
-  version: '3.2'
+  version: '$1'
 
-- regex: 'CFNetwork/459'
+- regex: 'dv\(iPh.+ov\((\d+(?:[_\.]\d+)*)\);'
   name: 'iOS'
-  version: '3.1'
+  version: '$1'
 
-- regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iOS)[ _/](\d+(?:[_\.]\d+)*)'
+- regex: '(?:Podcasts/(?:[\d\.]+)|Instacast(?:HD)?/(?:\d\.[\d\.abc]+)|Pocket Casts, iOS|\(iOS\)|iOS; Opera|Overcast|Castro|Podcat|iCatcher|RSSRadio/|MobileSafari/)(?!.*x86_64)'
   name: 'iOS'
-  version: '$1'
+  version: ''
 
-- regex: 'FBIOS.*FBSV/(\d+[\.\d]*);'
+- regex: 'iTunes-(AppleTV|iPod|iPad|iPhone)/(?:[\d\.]+)'
   name: 'iOS'
-  version: '$1'
+  version: ''
 
-- regex: '(?:Apple-)?(?:iPhone|iPad|iPod)(?:.*Mac OS X.*Version/(\d+\.\d+)|; Opera)?'
+- regex: 'iOS/Version ([\d\.]+)'
   name: 'iOS'
   version: '$1'
 
-- regex: 'Podcasts/(?:[\d\.]+)|Instacast(?:HD)?/(?:\d\.[\d\.abc]+)|Pocket Casts, iOS|Overcast|Castro|Podcat|i[cC]atcher|RSSRadio/'
+- regex: 'Sonos/.+\(ICRU_'
   name: 'iOS'
   version: ''
 
-- regex: 'iTunes-(iPod|iPad|iPhone)/(?:[\d\.]+)'
+- regex: 'CaptiveNetworkSupport|AirPlay'
   name: 'iOS'
   version: ''
 
-
 ##########
 # Mac
 ##########
-
-- regex: 'CFNetwork/807'
+- regex: 'CFNetwork/.+ Darwin/(?:[\d\.]+).+(?:x86_64|i386|Power%20Macintosh)|(?:x86_64-apple-)?darwin(?:[\d\.]+)|PowerMac|com.apple.Safari.SearchHelper'
   name: 'Mac'
-  version: '10.12'
-
-- regex: 'CFNetwork/760'
+  versions:
+    - regex: '(?:x86_64-apple-)?Darwin/?21.4.0'
+      version: '12.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?21.3.0'
+      version: '12.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?21.2.0'
+      version: '12.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?21.1.0'
+      version: '12.0.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?21.0.0'
+      version: '12.0'
+    - regex: '(?:x86_64-apple-)?Darwin/?20.6.0'
+      version: '11.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?20.5.0'
+      version: '11.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?20.4.0'
+      version: '11.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?20.3.0'
+      version: '11.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?20.2.0.*'
+      version: '11.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?20.[01].0'
+      version: '11.0'
+    - regex: '(?:x86_64-apple-)?Darwin/?19.6.0'
+      version: '10.15.6'
+    - regex: '(?:x86_64-apple-)?Darwin/?19.5.0'
+      version: '10.15.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?19.4.0'
+      version: '10.15.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?19.3.0'
+      version: '10.15.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?19.2.0'
+      version: '10.15.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?19.0.0'
+      version: '10.15'
+    - regex: '(?:x86_64-apple-)?Darwin/?18.7.0'
+      version: '10.14'
+    - regex: '(?:x86_64-apple-)?Darwin/?18.6.0'
+      version: '10.14.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?18.5.0'
+      version: '10.14.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?18.2.0'
+      version: '10.14.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?18.0.0'
+      version: '10.14'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.7.0'
+      version: '10.13.6'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.6.0'
+      version: '10.13.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.5.0'
+      version: '10.13.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.4.0'
+      version: '10.13.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.3.0'
+      version: '10.13.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.2.0'
+      version: '10.13.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?17.0.0'
+      version: '10.13'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.7.0'
+      version: '10.12.6'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.6.0'
+      version: '10.12.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.5.0'
+      version: '10.12.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.4.0'
+      version: '10.12.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.3.0'
+      version: '10.12.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.2.0'
+      version: '10.12.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.1.0'
+      version: '10.12.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?16.0.0'
+      version: '10.12'
+    - regex: '(?:x86_64-apple-)?Darwin/?15.6.0'
+      version: '10.11.6'
+    - regex: '(?:x86_64-apple-)?Darwin/?15.5.0'
+      version: '10.11.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?15.4.0'
+      version: '10.11.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?15.3.0'
+      version: '10.11.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?15.2.0'
+      version: '10.11.2'
+    - regex: 'CFNetwork/760'
+      version: '10.11'
+    - regex: '(?:x86_64-apple-)?Darwin/?14.5.0'
+      version: '10.10.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?14.4.0'
+      version: '10.10.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?14.3.0'
+      version: '10.10.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?14.1.0'
+      version: '10.10.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?14.0.0'
+      version: '10.10'
+    - regex: '(?:x86_64-apple-)?Darwin/?13.4.0'
+      version: '10.9.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?13.3.0'
+      version: '10.9.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?13.2.0'
+      version: '10.9.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?13.1.0'
+      version: '10.9.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?13.0.0'
+      version: '10.9.0'
+    - regex: '(?:x86_64-apple-)?Darwin/?12.6.0'
+      version: '10.8.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?12.5.0'
+      version: '10.8.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?12.4.0'
+      version: '10.8.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?12.3.0'
+      version: '10.8.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?12.2.0'
+      version: '10.8.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?12.1.0'
+      version: '10.8.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?11.5.0'
+      version: '10.7.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?11.4.2'
+      version: '10.7.5'
+    - regex: '(?:x86_64-apple-)?Darwin/?11.4.0'
+      version: '10.7.4'
+    - regex: '(?:x86_64-apple-)?Darwin/?11.3.0'
+      version: '10.7.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?11.2.0'
+      version: '10.7.2'
+    - regex: '(?:x86_64-apple-)?Darwin/?11.1.0'
+      version: '10.7.1'
+    - regex: '(?:x86_64-apple-)?Darwin/?10.8.0'
+      version: '10.6.8'
+    - regex: '(?:x86_64-apple-)?Darwin/?10.7.[34]'
+      version: '10.6.7'
+    - regex: '(?:x86_64-apple-)?Darwin/?10.3.0'
+      version: '10.6.3'
+    - regex: '(?:x86_64-apple-)?Darwin/?10.0.0'
+      version: '10.6'
+    - regex: '(?:x86_64-apple-)?Darwin/?9.8.0'
+      version: '10.5.8'
+    - regex: '(?:x86_64-apple-)?Darwin/?9.7.1'
+      version: '10.5.7'
+    - regex: '(?:x86_64-apple-)?Darwin/?9.6.2'
+      version: '10.5.6'
+    - regex: '(?:x86_64-apple-)?Darwin/?9.5.[05]'
+      version: '10.5.5'
+
+- regex: 'Macintosh;Mac OS X \((\d+[\.\d]+)\);'
   name: 'Mac'
-  version: '10.11'
-
-- regex: 'CFNetwork/720'
-  name: 'Mac'
-  version: '10.10'
-
-- regex: 'CFNetwork/673'
-  name: 'Mac'
-  version: '10.9'
-
-- regex: 'CFNetwork/596'
-  name: 'Mac'
-  version: '10.8'
-
-- regex: 'CFNetwork/520'
-  name: 'Mac'
-  version: '10.7'
+  version: '$1'
 
-- regex: 'CFNetwork/454'
+- regex: 'Mac[ +]OS[ +]?X(?:[ /,](?:Version )?(\d+(?:[_\.]\d+)+))?'
   name: 'Mac'
-  version: '10.6'
+  version: '$1'
 
-- regex: 'CFNetwork/(?:438|422|339|330|221|220|217)'
+- regex: 'Mac (?:OS/)?(\d+(?:[_\.]\d+)+)'
   name: 'Mac'
-  version: '10.5'
+  version: '$1'
 
-- regex: 'CFNetwork/12[89]'
+- regex: '(?:macOS[/,]|Mac-)(\d+[\.\d]+)'
   name: 'Mac'
-  version: '10.4'
+  version: '$1'
 
-- regex: 'CFNetwork/1\.2'
+- regex: 'Macintosh; OS X (\d+[\.\d]+)'
   name: 'Mac'
-  version: '10.3'
+  version: '$1'
 
-- regex: 'CFNetwork/1\.1'
+- regex: 'Darwin|Macintosh|Mac_PowerPC|PPC|Mac PowerPC|iMac|MacBook|macOS|AppleExchangeWebServices|com.apple.trustd|Sonos/.+\(MDCR_'
   name: 'Mac'
-  version: '10.2'
+  version: ''
 
-- regex: 'Mac[ +]OS[ +]X(?:[ /](?:Version )?(\d+(?:[_\.]\d+)+))?'
-  name: 'Mac'
-  version: '$1'
-  
-- regex: 'Mac (\d+(?:[_\.]\d+)+)'
-  name: 'Mac'
+##########
+# SeewoOS
+##########
+- regex: 'SeewoOS x86_64 (\d+[\.\d]+)'
+  name: 'SeewoOS'
   version: '$1'
 
-- regex: 'Darwin|Macintosh|Mac_PowerPC|PPC|Mac PowerPC|iMac|MacBook'
-  name: 'Mac'
-  version: ''
-  
-  
-  
 ##########
 # ChromeOS
 ##########
-- regex: 'CrOS [a-z0-9_]+ .* Chrome/(\d+[\.\d]+)'
+- regex: 'CrOS [a-z0-9_]+ (\d+[\.\d]+)'
   name: 'Chrome OS'
   version: '$1'
-  
-  
-  
+
+##########
+# Fuchsia
+##########
+- regex: 'Fuchsia'
+  name: 'Fuchsia'
+  version: ''
+
 ##########
 # BlackBerry
 ##########
 - regex: '(?:BB10;.+Version|Black[Bb]erry[0-9a-z]+|Black[Bb]erry.+Version)/(\d+[\.\d]+)'
   name: 'BlackBerry OS'
   version: '$1'
-  
-  
+
 - regex: 'RIM Tablet OS (\d+[\.\d]+)'
   name: 'BlackBerry Tablet OS'
   version: '$1'
-  
-  
+
 - regex: 'RIM Tablet OS|QNX|Play[Bb]ook'
   name: 'BlackBerry Tablet OS'
   version: ''
-  
-  
+
 - regex: 'BlackBerry'
   name: 'BlackBerry OS'
   version: ''
-  
+
 - regex: 'bPod'
   name: 'BlackBerry OS'
   version: ''
 
-
 ##########
 # BeOS
 ##########
@@ -546,9 +1048,6 @@
   name: 'BeOS'
   version: ''
 
-
-
-
 ##########
 # Symbian
 ##########
@@ -556,48 +1055,38 @@
   name: 'Symbian^3'
   version: 'Anna'
 
-
 - regex: 'Symbian/3.+NokiaBrowser/7\.4'
   name: 'Symbian^3'
   version: 'Belle'
 
-
 - regex: 'Symbian/3'
   name: 'Symbian^3'
   version: ''
 
-
 - regex: '(?:Series ?60|SymbOS|S60)(?:[ /]?(\d+[\.\d]+|V\d+))?'
   name: 'Symbian OS Series 60'
   version: '$1'
 
-
 - regex: 'Series40'
   name: 'Symbian OS Series 40'
   version: ''
 
-
 - regex: 'SymbianOS/(\d+[\.\d]+)'
   name: 'Symbian OS'
   version: '$1'
-  
-  
+
 - regex: 'MeeGo|WeTab'
   name: 'MeeGo'
   version: ''
-  
-  
+
 - regex: 'Symbian(?: OS)?|SymbOS'
   name: 'Symbian OS'
   version: ''
-  
-  
+
 - regex: 'Nokia'
   name: 'Symbian'
   version: ''
 
-
-
 ##########
 # Firefox OS
 ##########
@@ -605,7 +1094,6 @@
   name: 'Firefox OS'
   version: ''
 
-
 ##########
 # RISC OS
 ##########
@@ -613,7 +1101,6 @@
   name: 'RISC OS'
   version: '$1'
 
-
 ##########
 # Inferno
 ##########
@@ -621,65 +1108,41 @@
   name: 'Inferno'
   version: '$1'
 
-
 ##########
 # Bada
 ##########
-- regex: 'bada(?:[ /](\d+[\.\d]+))'
+- regex: 'bada(?:[ /](\d+[\.\d]+))?'
   name: 'Bada'
   version: '$1'
-  
-  
-- regex: 'bada'
-  name: 'Bada'
-  version: ''
 
+##########
+# REX
+##########
+- regex: 'REX; U;'
+  name: 'REX'
+  version: ''
 
 ##########
 # Brew
 ##########
-- regex: '(?:Brew MP|BREW|BMP)(?:[ /](\d+[\.\d]+))'
+- regex: '(?:Brew(?!-Applet)(?: MP)?|BMP)(?:[ /](\d+[\.\d]+))?'
   name: 'Brew'
   version: '$1'
 
-
-- regex: 'Brew MP|BREW|BMP'
-  name: 'Brew'
-  version: ''
-
-  
 ##########
 # Web TV
 ##########
 - regex: 'GoogleTV(?:[ /](\d+[\.\d]+))?'
   name: 'Google TV'
   version: '$1'
-  
-  
+
 - regex: 'AppleTV(?:/?(\d+[\.\d]+))?'
-  name: 'Apple TV'
+  name: 'tvOS'
   version: '$1'
-  
-  
+
 - regex: 'WebTV/(\d+[\.\d]+)'
   name: 'WebTV'
   version: '$1'
-  
-
-##########
-# Remix OS
-##########
-- regex: 'RemixOS 5.1.1'
-  name: 'Remix OS'
-  version: '1'
-
-- regex: 'RemixOS 6.0'
-  name: 'Remix OS'
-  version: '2'
-
-- regex: 'RemixOS'
-  name: 'Remix OS'
-  version: ''
 
 
 ##########
@@ -688,54 +1151,43 @@
 - regex: '(?:SunOS|Solaris)(?:[/ ](\d+[\.\d]+))?'
   name: 'Solaris'
   version: '$1'
-  
-  
+
 - regex: 'AIX(?:[/ ]?(\d+[\.\d]+))?'
   name: 'AIX'
   version: '$1'
-  
-  
+
 - regex: 'HP-UX(?:[/ ]?(\d+[\.\d]+))?'
   name: 'HP-UX'
   version: '$1'
-  
-  
+
 - regex: 'FreeBSD(?:[/ ]?(\d+[\.\d]+))?'
   name: 'FreeBSD'
   version: '$1'
-  
-  
+
 - regex: 'NetBSD(?:[/ ]?(\d+[\.\d]+))?'
   name: 'NetBSD'
   version: '$1'
-  
-  
+
 - regex: 'OpenBSD(?:[/ ]?(\d+[\.\d]+))?'
   name: 'OpenBSD'
   version: '$1'
-  
-  
+
 - regex: 'DragonFly(?:[/ ]?(\d+[\.\d]+))?'
   name: 'DragonFly'
   version: '$1'
-  
-  
+
 - regex: 'Syllable(?:[/ ]?(\d+[\.\d]+))?'
   name: 'Syllable'
   version: '$1'
-  
-  
+
 - regex: 'IRIX(?:;64)?(?:[/ ]?(\d+[\.\d]+))'
   name: 'IRIX'
   version: '$1'
-  
-  
+
 - regex: 'OSF1(?:[/ ]?v?(\d+[\.\d]+))?'
   name: 'OSF1'
   version: '$1'
-  
-  
-  
+
 ##########
 # Gaming Console
 ##########
@@ -743,45 +1195,46 @@
   name: 'Nintendo'
   version: '$1'
 
-- regex: 'PlayStation ?([3|4])'
+- regex: 'PlayStation.+; Linux (\d+[\.\d]+)'
   name: 'PlayStation'
   version: '$1'
-  
-  
+
+- regex: 'PlayStation ?(\d)(?:[/ ](?:Pro )?(\d+[\.\d]+))?'
+  name: 'PlayStation'
+  version: '$1.$2'
+
 - regex: 'Xbox|KIN\.(?:One|Two)'
   name: 'Xbox'
   version: '360'
-  
-  
-  
+
 ##########
 # Mobile Gaming Console
 ##########
 - regex: 'Nitro|Nintendo ([3]?DS[i]?)'
   name: 'Nintendo Mobile'
   version: '$1'
-  
-  
+
 - regex: 'PlayStation ((?:Portable|Vita))'
   name: 'PlayStation Portable'
   version: '$1'
-  
-  
-  
+
 ##########
 # IBM
 ##########
 - regex: 'OS/2'
   name: 'OS/2'
   version: ''
-  
-
 
 ###########
 # Linux (Generic)
 ###########
-- regex: 'Linux(?:OS)?[^a-z]'
+- regex: 'Linux(?:OS)?[^a-z]|Cinnamon/(?:\d+[\.\d]+)'
   name: 'GNU/Linux'
   version: ''
 
-
+##########
+# Java ME (Java Platform, Micro Edition)
+##########
+- regex: 'Java ME|(J2ME|Profile)/MIDP|MIDP-(?:\d+[\.\d]+)/CLDC|Configuration/CLDC|Java; U; MIDP|MMP/\d.\d'
+  name: 'Java ME'
+  version: ''
diff --git a/priv/ua_inspector/short_codes.browser_families.yml b/priv/ua_inspector/short_codes.browser_families.yml
index f8ac065bf0b00be30988d328e729185fab005ed1..82861e991f75b1877b61a0b563a2cb7ad3d994fb 100644
--- a/priv/ua_inspector/short_codes.browser_families.yml
+++ b/priv/ua_inspector/short_codes.browser_families.yml
@@ -10,108 +10,176 @@
   - "AV"
   - "AW"
 - "Chrome":
-  - "CH"
+  - "1B"
+  - "2B"
+  - "7S"
+  - "A0"
+  - "AC"
+  - "AD"
+  - "AE"
+  - "AH"
+  - "AI"
+  - "AO"
+  - "AS"
   - "BA"
+  - "BM"
   - "BR"
+  - "C2"
+  - "C3"
+  - "C5"
+  - "C4"
+  - "C6"
   - "CC"
   - "CD"
-  - "CM"
-  - "CI"
+  - "CE"
   - "CF"
+  - "CG"
+  - "CH"
+  - "CI"
+  - "CL"
+  - "CM"
   - "CN"
-  - "CR"
   - "CP"
+  - "CR"
+  - "CV"
+  - "CW"
+  - "DA"
   - "DD"
-  - "IR"
-  - "RM"
-  - "AO"
-  - "TS"
-  - "VI"
-  - "PT"
-  - "AS"
-  - "TB"
-  - "AD"
-  - "SB"
-  - "WP"
+  - "DG"
+  - "DR"
+  - "EC"
+  - "EE"
+  - "EU"
+  - "EW"
+  - "FA"
+  - "FS"
+  - "GB"
+  - "GI"
+  - "H2"
+  - "HA"
+  - "HE"
+  - "HH"
+  - "HS"
   - "I3"
-  - "CV"
-  - "WH"
-  - "SZ"
-  - "QW"
-  - "LF"
+  - "IR"
+  - "JB"
+  - "KN"
   - "KW"
-  - "2B"
-  - "CE"
-  - "EC"
-  - "MT"
+  - "LF"
+  - "LL"
+  - "LO"
+  - "M1"
+  - "MA"
+  - "MD"
+  - "MR"
   - "MS"
-  - "HA"
-  - "OC"
+  - "MT"
   - "MZ"
-  - "BM"
-  - "KN"
+  - "NM"
+  - "NR"
+  - "O0"
+  - "O2"
+  - "O3"
+  - "OC"
+  - "PB"
+  - "PT"
+  - "QU"
+  - "QW"
+  - "RM"
+  - "S4"
+  - "S6"
+  - "S8"
+  - "S9"
+  - "SB"
+  - "SG"
+  - "SS"
+  - "SU"
+  - "SV"
   - "SW"
-  - "M1"
-  - "FA"
+  - "SY"
+  - "SZ"
+  - "T1"
   - "TA"
-  - "AH"
-  - "CL"
-  - "SU"
-  - "EU"
+  - "TB"
+  - "TG"
+  - "TR"
+  - "TS"
+  - "TU"
+  - "TV"
   - "UB"
-  - "LO"
+  - "UR"
+  - "VE"
   - "VG"
-  - "TV"
-  - "A0"
-  - "1B"
-  - "S4"
-  - "EE"
-  - "AE"
+  - "VI"
   - "VM"
-  - "O0"
-  - "TG"
-  - "GB"
-  - "SY"
-  - "HH"
-  - "YJ"
-  - "LL"
-  - "TU"
+  - "WP"
+  - "WH"
   - "XV"
-  - "C2"
-  - "QU"
+  - "YJ"
   - "YN"
+  - "FH"
+  - "B1"
+  - "BO"
+  - "HB"
+  - "PC"
+  - "LA"
+  - "LT"
+  - "PD"
+  - "HR"
+  - "HU"
+  - "HP"
+  - "IO"
+  - "TP"
+  - "CJ"
+  - "HQ"
+  - "HI"
+  - "NA"
+  - "BW"
+  - "YO"
+  - "DC"
+  - ""
 - "Firefox":
-  - "FF"
+  - "AX"
+  - "BI"
+  - "BF"
+  - "BH"
+  - "BN"
+  - "C0"
+  - "CU"
+  - "EI"
+  - "F1"
+  - "FB"
   - "FE"
+  - "FF"
   - "FM"
-  - "SX"
-  - "FB"
-  - "PX"
-  - "MB"
-  - "EI"
-  - "WF"
-  - "CU"
-  - "TF"
-  - "QM"
   - "FR"
-  - "I4"
+  - "FY"
   - "GZ"
-  - "MO"
-  - "F1"
-  - "BI"
+  - "I4"
+  - "IF"
+  - "IW"
+  - "LH"
+  - "LY"
+  - "MB"
   - "MN"
-  - "BH"
-  - "TO"
-  - "OS"
+  - "MO"
   - "MY"
-  - "FY"
-  - "AX"
-  - "C0"
-  - "LH"
+  - "OA"
+  - "OS"
+  - "PI"
+  - "PX"
+  - "QA"
+  - "QM"
   - "S5"
+  - "SX"
+  - "TF"
+  - "TO"
+  - "WF"
   - "ZV"
-  - "IW"
+  - ""
 - "Internet Explorer":
+  - "BZ"
+  - "CZ"
   - "IE"
   - "IM"
   - "PS"
@@ -122,23 +190,25 @@
 - "NetSurf":
   - "NE"
 - "Nokia Browser":
+  - "DO"
   - "NB"
   - "NO"
   - "NV"
-  - "DO"
 - "Opera":
-  - "OP"
-  - "OM"
+  - "O1"
+  - "OG"
+  - "OH"
   - "OI"
+  - "OM"
   - "ON"
   - "OO"
-  - "OG"
-  - "OH"
-  - "O1"
+  - "OP"
   - "OX"
 - "Safari":
-  - "SF"
   - "MF"
+  - "S7"
+  - "SF"
   - "SO"
+  - "PV"
 - "Sailfish Browser":
   - "SA"
diff --git a/priv/ua_inspector/short_codes.client_browsers.yml b/priv/ua_inspector/short_codes.client_browsers.yml
index 8237458935a3c9e87c17b9b410d8b6b3f0eddb46..9fe8cb41b7ac97741fb5a88b30f8151707642a9f 100644
--- a/priv/ua_inspector/short_codes.client_browsers.yml
+++ b/priv/ua_inspector/short_codes.client_browsers.yml
@@ -2,8 +2,10 @@
 - "2B": "2345 Browser"
 - "36": "360 Phone Browser"
 - "3B": "360 Browser"
+- "7B": "7654 Browser"
 - "AA": "Avant Browser"
 - "AB": "ABrowse"
+- "BW": "AdBlock Browser"
 - "AF": "ANT Fresco"
 - "AG": "ANTGalio"
 - "AL": "Aloha Browser"
@@ -17,10 +19,13 @@
 - "AX": "Arctic Fox"
 - "AV": "Amiga Voyager"
 - "AW": "Amiga Aweb"
+- "AI": "Arvin"
 - "A0": "Atom"
 - "AT": "Atomic Web Browser"
 - "AS": "Avast Secure Browser"
 - "VG": "AVG Secure Browser"
+- "AC": "Avira Scout"
+- "A1": "AwoX"
 - "BA": "Beaker Browser"
 - "BM": "Beamrise"
 - "BB": "BlackBerry Browser"
@@ -32,13 +37,21 @@
 - "BJ": "Bunjalloo"
 - "BL": "B-Line"
 - "BU": "Blue Browser"
+- "BO": "Bonsai"
+- "BN": "Borealis Navigator"
 - "BR": "Brave"
 - "BK": "BriskBard"
 - "BX": "BrowseX"
+- "BZ": "Browzar"
+- "BY": "Biyubi"
+- "BF": "Byffox"
 - "CA": "Camino"
 - "CL": "CCleaner"
+- "CJ": "ChanjetCloud"
+- "C6": "Chedot"
 - "C0": "Centaury"
 - "CC": "Coc Coc"
+- "C4": "CoolBrowser"
 - "C2": "Colibri"
 - "CD": "Comodo Dragon"
 - "C1": "Coast"
@@ -53,22 +66,35 @@
 - "CN": "CoolNovo"
 - "CO": "CometBird"
 - "CB": "COS Browser"
+- "CW": "Cornowser"
+- "C3": "Chim Lac"
 - "CP": "ChromePlus"
 - "CR": "Chromium"
+- "C5": "Chromium GOST"
 - "CY": "Cyberfox"
 - "CS": "Cheshire"
 - "CT": "Crusta"
+- "CG": "Craving Explorer"
+- "CZ": "Crazy Browser"
 - "CU": "Cunaguaro"
 - "CV": "Chrome Webview"
+- "YC": "CyBrowser"
 - "DB": "dbrowser"
+- "PD": "Peeps dBrowser"
+- "DC": "Decentr"
 - "DE": "Deepnet Explorer"
+- "DG": "deg-degan"
+- "DA": "Deledao"
 - "DT": "Delta Browser"
+- "DS": "DeskBrowse"
 - "DF": "Dolphin"
 - "DO": "Dorado"
+- "DR": "Dot Browser"
 - "DL": "Dooble"
 - "DI": "Dillo"
 - "DD": "DuckDuckGo Privacy Browser"
 - "EC": "Ecosia"
+- "EW": "Edge WebView"
 - "EI": "Epic"
 - "EL": "Elinks"
 - "EB": "Element Browser"
@@ -88,18 +114,33 @@
 - "FY": "Firefox Reality"
 - "FR": "Firefox Rocket"
 - "FL": "Flock"
+- "FO": "Flow"
 - "FM": "Firefox Mobile"
 - "FW": "Fireweb"
 - "FN": "Fireweb Navigator"
+- "FH": "Flash Browser"
+- "FS": "Flast"
 - "FU": "FreeU"
 - "GA": "Galeon"
+- "GH": "Ghostery Privacy Browser"
+- "GI": "GinxDroid Browser"
 - "GB": "Glass Browser"
 - "GE": "Google Earth"
+- "GP": "Google Earth Pro"
 - "GO": "GOG Galaxy"
+- "GR": "GoBrowser"
+- "HB": "Harman Browser"
+- "HS": "HasBrowser"
 - "HA": "Hawk Turbo Browser"
+- "HQ": "Hawk Quick Browser"
+- "HE": "Helio"
+- "HI": "Hi Browser"
 - "HO": "hola! Browser"
 - "HJ": "HotJava"
-- "HU": "Huawei Browser"
+- "HU": "Huawei Browser Mobile"
+- "HP": "Huawei Browser"
+- "IO": "iBrowser"
+- "IS": "iBrowser Mini"
 - "IB": "IBrowse"
 - "IC": "iCab"
 - "I2": "iCab Mobile"
@@ -112,7 +153,9 @@
 - "IE": "Internet Explorer"
 - "IM": "IE Mobile"
 - "IR": "Iron"
+- "JB": "Japan Browser"
 - "JS": "Jasmine"
+- "JA": "JavaFX"
 - "JI": "Jig Browser"
 - "JP": "Jig Browser Plus"
 - "JO": "Jio Browser"
@@ -123,19 +166,24 @@
 - "KP": "Kapiko"
 - "KN": "Kinza"
 - "KW": "Kiwi"
+- "KD": "Kode Browser"
 - "KY": "Kylo"
 - "KZ": "Kazehakase"
 - "LB": "Cheetah Browser"
+- "LA": "Lagatos Browser"
 - "LF": "LieBaoFast"
 - "LG": "LG Browser"
 - "LH": "Light"
 - "LI": "Links"
+- "IF": "Lolifox"
 - "LO": "Lovense Browser"
+- "LT": "LT Browser"
 - "LU": "LuaKit"
 - "LL": "Lulumi"
 - "LS": "Lunascape"
 - "LN": "Lunascape Lite"
 - "LX": "Lynx"
+- "MD": "Mandarin"
 - "M1": "mCent"
 - "MB": "MicroB"
 - "MC": "NCSA Mosaic"
@@ -149,7 +197,14 @@
 - "MN": "Minimo"
 - "MT": "Mint Browser"
 - "MX": "Maxthon"
+- "MA": "Maelstrom"
+- "NM": "MxNitro"
 - "MY": "Mypal"
+- "MR": "Monument Browser"
+- "MW": "MAUI WAP Browser"
+- "NA": "Navegador"
+- "NW": "Navigateur Web"
+- "NR": "NFS Browser"
 - "NB": "Nokia Browser"
 - "NO": "Nokia OSS Browser"
 - "NV": "Nokia Ovi Browser"
@@ -163,6 +218,8 @@
 - "OC": "Oculus Browser"
 - "O1": "Opera Mini iOS"
 - "OB": "Obigo"
+- "O2": "Odin"
+- "H2": "OceanHero"
 - "OD": "Odyssey Web Browser"
 - "OF": "Off By One"
 - "HH": "OhHai Browser"
@@ -175,11 +232,13 @@
 - "OP": "Opera"
 - "ON": "Opera Next"
 - "OO": "Opera Touch"
+- "OA": "Orca"
 - "OS": "Ordissimo"
 - "OR": "Oregano"
 - "O0": "Origin In-Game Overlay"
 - "OY": "Origyn Web Browser"
 - "OV": "Openwave Mobile Browser"
+- "O3": "OpenFin"
 - "OW": "OmniWeb"
 - "OT": "Otter Browser"
 - "PL": "Palm Blazer"
@@ -190,10 +249,21 @@
 - "PU": "Puffin"
 - "PW": "Palm WebPro"
 - "PA": "Palmscape"
+- "PE": "Perfect Browser"
+- "PH": "Phantom Browser"
 - "PX": "Phoenix"
+- "PB": "Phoenix Browser"
+- "PF": "PlayFree Browser"
+- "PK": "PocketBook Browser"
 - "PO": "Polaris"
 - "PT": "Polarity"
+- "LY": "PolyBrowser"
+- "PI": "PrivacyWall"
+- "PC": "PSI Secure Browser"
+- "RW": "Reqwireless WebViewer"
 - "PS": "Microsoft Edge"
+- "QA": "Qazweb"
+- "Q2": "QQ Browser Lite"
 - "Q1": "QQ Browser Mini"
 - "QQ": "QQ Browser"
 - "QT": "Qutebrowser"
@@ -206,30 +276,46 @@
 - "RM": "RockMelt"
 - "SB": "Samsung Browser"
 - "SA": "Sailfish Browser"
+- "S8": "Seewo Browser"
 - "SC": "SEMC-Browser"
 - "SE": "Sogou Explorer"
 - "SF": "Safari"
+- "PV": "Safari Technology Preview"
 - "S5": "Safe Exam Browser"
 - "SW": "SalamWeb"
+- "S9": "Secure Browser"
+- "SV": "SFive"
 - "SH": "Shiira"
 - "S1": "SimpleBrowser"
 - "SY": "Sizzy"
 - "SK": "Skyfire"
 - "SS": "Seraphic Sraf"
+- "KK": "SiteKiosk"
 - "SL": "Sleipnir"
+- "S6": "Slimjet"
+- "S7": "SP Browser"
+- "T1": "Stampy Browser"
+- "7S": "7Star"
+- "LE": "Smart Lenovo Browser"
+- "OZ": "Smooz"
 - "SN": "Snowshoe"
 - "SO": "Sogou Mobile Browser"
+- "B1": "Spectre Browser"
 - "S2": "Splash"
 - "SI": "Sputnik Browser"
 - "SR": "Sunrise"
 - "SP": "SuperBird"
 - "SU": "Super Fast Browser"
+- "HR": "Sushi Browser"
 - "S3": "surf"
+- "SG": "Stargon"
 - "S0": "START Internet Browser"
 - "S4": "Steam In-Game Overlay"
 - "ST": "Streamy"
 - "SX": "Swiftfox"
 - "SZ": "Seznam Browser"
+- "TP": "T+Browser"
+- "TR": "T-Browser"
 - "TO": "t-online.de Browser"
 - "TA": "Tao Browser"
 - "TF": "TenFourFox"
@@ -241,9 +327,12 @@
 - "TV": "TV Bro"
 - "UB": "UBrowser"
 - "UC": "UC Browser"
+- "UH": "UC Browser HD"
 - "UM": "UC Browser Mini"
 - "UT": "UC Browser Turbo"
+- "UR": "UR Browser"
 - "UZ": "Uzbl"
+- "VE": "Venus Browser"
 - "VI": "Vivaldi"
 - "VV": "vivo Browser"
 - "VB": "Vision Mobile Browser"
@@ -259,8 +348,12 @@
 - "YA": "Yandex Browser"
 - "YL": "Yandex Browser Lite"
 - "YN": "Yaani Browser"
+- "YB": "Yolo Browser"
+- "YO": "YouCare"
+- "XS": "xStand"
 - "XI": "Xiino"
 - "XV": "Xvast"
+- "ZE": "Zetakey"
 - "ZV": "Zvu"
 - "IA": "Iceape"
 - "SM": "SeaMonkey"
diff --git a/priv/ua_inspector/short_codes.device_brands.yml b/priv/ua_inspector/short_codes.device_brands.yml
deleted file mode 100644
index 7c62163bda64870b3d269003ab6f52011811db77..0000000000000000000000000000000000000000
--- a/priv/ua_inspector/short_codes.device_brands.yml
+++ /dev/null
@@ -1,742 +0,0 @@
-- "36": "360"
-- "88": "8848"
-- "3Q": "3Q"
-- "4G": "4Good"
-- "AE": "Ace"
-- "AA": "AllCall"
-- "3A": "AllDocube"
-- "AC": "Acer"
-- "00": "Accent"
-- "A9": "Advan"
-- "AD": "Advance"
-- "A3": "AGM"
-- "AZ": "Ainol"
-- "AI": "Airness"
-- "0A": "AIS"
-- "AW": "Aiwa"
-- "AK": "Akai"
-- "1A": "Alba"
-- "AL": "Alcatel"
-- "20": "Alcor"
-- "4A": "Aligator"
-- "A2": "Allview"
-- "A7": "Allwinner"
-- "A1": "Altech UEC"
-- "A5": "altron"
-- "3L": "Alfawise"
-- "AN": "Arnova"
-- "7A": "Anry"
-- "5A": "ArmPhone"
-- "2A": "Atom"
-- "KN": "Amazon"
-- "AG": "AMGOO"
-- "9A": "Amigoo"
-- "AO": "Amoi"
-- "3N": "Aoson"
-- "AP": "Apple"
-- "AR": "Archos"
-- "AS": "ARRIS"
-- "AB": "Arian Space"
-- "AT": "Airties"
-- "6A": "AT&T"
-- "A6": "Ark"
-- "A4": "Ask"
-- "8A": "Asano"
-- "A8": "Assistant"
-- "A0": "ANS"
-- "AU": "Asus"
-- "AH": "AVH"
-- "ZA": "Avenzo"
-- "AV": "Avvio"
-- "AX": "Audiovox"
-- "AY": "Axxion"
-- "AM": "Azumi Mobile"
-- "BB": "BBK"
-- "0B": "BB Mobile"
-- "BE": "Becker"
-- "B5": "Beeline"
-- "B0": "Beelink"
-- "BI": "Bird"
-- "1B": "Billion"
-- "BT": "Bitel"
-- "B8": "BIHEE"
-- "B7": "Bitmore"
-- "BG": "BGH"
-- "BL": "Beetel"
-- "BP": "Blaupunkt"
-- "B3": "Bluboo"
-- "BF": "Black Fox"
-- "B6": "BDF"
-- "BM": "Bmobile"
-- "BN": "Barnes & Noble"
-- "BO": "BangOlufsen"
-- "B9": "Bobarry"
-- "BQ": "BenQ"
-- "BS": "BenQ-Siemens"
-- "BU": "Blu"
-- "BD": "Bluegood"
-- "B2": "Blackview"
-- "B4": "bogo"
-- "BW": "Boway"
-- "BZ": "Bezkam"
-- "BX": "bq"
-- "BV": "Bravis"
-- "BR": "Brondi"
-- "B1": "Bush"
-- "CB": "CUBOT"
-- "CF": "Carrefour"
-- "CP": "Captiva"
-- "CS": "Casio"
-- "R4": "Casper"
-- "CA": "Cat"
-- "C9": "CAGI"
-- "CE": "Celkon"
-- "CC": "ConCorde"
-- "C2": "Changhong"
-- "2C": "Ghong"
-- "CH": "Cherry Mobile"
-- "1C": "Chuwi"
-- "L8": "Clarmin"
-- "CD": "Cloudfone"
-- "C0": "Clout"
-- "CK": "Cricket"
-- "C1": "Crosscall"
-- "CL": "Compal"
-- "CN": "CnM"
-- "CM": "Crius Mea"
-- "C3": "China Mobile"
-- "CR": "CreNova"
-- "0C": "Crony"
-- "CT": "Capitel"
-- "CQ": "Compaq"
-- "3C": "Contixo"
-- "CO": "Coolpad"
-- "C5": "Condor"
-- "CW": "Cowon"
-- "CU": "Cube"
-- "CY": "Coby Kyros"
-- "C6": "Comio"
-- "C7": "ComTrade Tesla"
-- "C8": "Concord"
-- "CX": "Crescent"
-- "C4": "Cyrus"
-- "CV": "CVTE"
-- "D5": "Daewoo"
-- "DA": "Danew"
-- "DT": "Datang"
-- "D7": "Datawind"
-- "D1": "Datsun"
-- "DE": "Denver"
-- "DW": "DeWalt"
-- "DX": "DEXP"
-- "DS": "Desay"
-- "DB": "Dbtel"
-- "DC": "DoCoMo"
-- "D9": "Dolamee"
-- "D0": "Doopro"
-- "DG": "Dialog"
-- "DI": "Dicam"
-- "D4": "Digi"
-- "D3": "Digicel"
-- "DD": "Digiland"
-- "D2": "Digma"
-- "D6": "Divisat"
-- "DL": "Dell"
-- "DN": "DNS"
-- "DM": "DMM"
-- "DO": "Doogee"
-- "DF": "Doffler"
-- "DV": "Doov"
-- "DP": "Dopod"
-- "DR": "Doro"
-- "D8": "Droxio"
-- "DU": "Dune HD"
-- "EB": "E-Boda"
-- "2E": "E-Ceros"
-- "5E": "2E"
-- "EA": "EBEST"
-- "EC": "Ericsson"
-- "E7": "Ergo"
-- "ED": "Energizer"
-- "E4": "Echo Mobiles"
-- "ES": "ECS"
-- "E6": "EE"
-- "EI": "Ezio"
-- "EM": "Eks Mobility"
-- "EL": "Elephone"
-- "4E": "Eltex"
-- "L0": "Element"
-- "EG": "Elenberg"
-- "EP": "Easypix"
-- "EK": "EKO"
-- "E1": "Energy Sistem"
-- "3E": "Enot"
-- "ER": "Ericy"
-- "EE": "Essential"
-- "EN": "Eton"
-- "E2": "Essentielb"
-- "1E": "Etuline"
-- "ET": "eTouch"
-- "EV": "Evertek"
-- "E3": "Evolio"
-- "EO": "Evolveo"
-- "EX": "Explay"
-- "E0": "EvroMedia"
-- "E5": "Extrem"
-- "EZ": "Ezze"
-- "E8": "E-tel"
-- "E9": "Evercoss"
-- "EU": "Eurostar"
-- "FA": "Fairphone"
-- "FM": "Famoco"
-- "FE": "Fengxiang"
-- "FI": "FiGO"
-- "F3": "FireFly Mobile"
-- "FL": "Fly"
-- "F1": "FinePower"
-- "FT": "Freetel"
-- "F7": "Fero"
-- "FR": "Forstar"
-- "FO": "Foxconn"
-- "F2": "FORME"
-- "FN": "FNB"
-- "FU": "Fujitsu"
-- "FD": "Fondi"
-- "GT": "G-TiDE"
-- "GM": "Garmin-Asus"
-- "GA": "Gateway"
-- "GD": "Gemini"
-- "GN": "General Mobile"
-- "GE": "Geotel"
-- "GH": "Ghia"
-- "GI": "Gionee"
-- "GG": "Gigabyte"
-- "GS": "Gigaset"
-- "GZ": "Ginzzu"
-- "G4": "Globex"
-- "GC": "GOCLEVER"
-- "GL": "Goly"
-- "GO": "Google"
-- "G5": "Gome"
-- "G1": "GoMobile"
-- "GR": "Gradiente"
-- "GP": "Grape"
-- "G6": "Gree"
-- "G0": "Goophone"
-- "GU": "Grundig"
-- "HF": "Hafury"
-- "HA": "Haier"
-- "HS": "Hasee"
-- "HE": "HannSpree"
-- "HI": "Hisense"
-- "HL": "Hi-Level"
-- "H2": "Highscreen"
-- "H1": "Hoffmann"
-- "HM": "Homtom"
-- "HO": "Hosin"
-- "HW": "How"
-- "HV": "Hotwav"
-- "HZ": "Hoozo"
-- "HP": "HP"
-- "HT": "HTC"
-- "HD": "Huadoo"
-- "HU": "Huawei"
-- "HX": "Humax"
-- "HY": "Hyrican"
-- "HN": "Hyundai"
-- "IG": "iGet"
-- "IA": "Ikea"
-- "IB": "iBall"
-- "3I": "i-Cherry"
-- "IJ": "i-Joy"
-- "IC": "iDroid"
-- "IY": "iBerry"
-- "7I": "iBrit"
-- "IH": "iHunt"
-- "IK": "iKoMo"
-- "IE": "iView"
-- "I8": "iVA"
-- "1I": "iMars"
-- "IM": "i-mate"
-- "2I": "iLife"
-- "I1": "iOcean"
-- "I2": "IconBIT"
-- "IL": "IMO Mobile"
-- "I7": "iLA"
-- "IW": "iNew"
-- "IP": "iPro"
-- "IF": "Infinix"
-- "I0": "InFocus"
-- "I5": "InnJoo"
-- "IN": "Innostream"
-- "IS": "Insignia"
-- "I4": "Inoi"
-- "IR": "iRola"
-- "IU": "iRulu"
-- "I6": "Irbis"
-- "II": "Inkti"
-- "IX": "Intex"
-- "4I": "Invin"
-- "IO": "i-mobile"
-- "IQ": "INQ"
-- "8Q": "IQM"
-- "IT": "Intek"
-- "IV": "Inverto"
-- "I3": "Impression"
-- "IZ": "iTel"
-- "0I": "iTruck"
-- "I9": "iZotron"
-- "JA": "JAY-Tech"
-- "JI": "Jiayu"
-- "JG": "Jinga"
-- "JO": "Jolla"
-- "J5": "Just5"
-- "JF": "JFone"
-- "JK": "JKL"
-- "KL": "Kalley"
-- "0K": "Klipad"
-- "K4": "Kaan"
-- "K7": "Kaiomy"
-- "K6": "Kanji"
-- "KA": "Karbonn"
-- "K5": "KATV1"
-- "KD": "KDDI"
-- "K1": "Kiano"
-- "KV": "Kivi"
-- "KI": "Kingsun"
-- "KC": "Kocaso"
-- "KG": "Kogan"
-- "KO": "Konka"
-- "KM": "Komu"
-- "KB": "Koobee"
-- "K9": "Kooper"
-- "KT": "K-Touch"
-- "KH": "KT-Tech"
-- "KK": "Kodak"
-- "KP": "KOPO"
-- "KW": "Konrow"
-- "KR": "Koridy"
-- "K2": "KRONO"
-- "KS": "Kempler & Strauss"
-- "K3": "Keneksi"
-- "K8": "Kuliao"
-- "KU": "Kumai"
-- "KY": "Kyocera"
-- "KZ": "Kazam"
-- "1K": "Kzen"
-- "KE": "Krüger&Matz"
-- "KX": "Kenxinda"
-- "LQ": "LAIQ"
-- "L2": "Landvo"
-- "L6": "Land Rover"
-- "LV": "Lava"
-- "LA": "Lanix"
-- "LK": "Lark"
-- "LC": "LCT"
-- "L5": "Leagoo"
-- "LD": "Ledstar"
-- "L1": "LeEco"
-- "L4": "Lemhoov"
-- "LE": "Lenovo"
-- "LN": "Lenco"
-- "LT": "Leotec"
-- "L7": "Lephone"
-- "LZ": "Lesia"
-- "LP": "Le Pan"
-- "LG": "LG"
-- "LI": "Lingwin"
-- "LO": "Loewe"
-- "LM": "Logicom"
-- "1L": "Logic"
-- "L3": "Lexand"
-- "LX": "Lexibook"
-- "LY": "LYF"
-- "LU": "Lumus"
-- "0L": "Lumigon"
-- "L9": "Luna"
-- "MN": "M4tel"
-- "XM": "Macoox"
-- "MJ": "Majestic"
-- "MA": "Manta Multimedia"
-- "6X": "Maxtron"
-- "5M": "Mann"
-- "2M": "Masstel"
-- "MW": "Maxwest"
-- "7M": "Maxcom"
-- "0D": "MAXVI"
-- "M0": "Maze"
-- "MB": "Mobistel"
-- "9M": "Mobo"
-- "0M": "Mecool"
-- "M3": "Mecer"
-- "MD": "Medion"
-- "M2": "MEEG"
-- "M1": "Meizu"
-- "3M": "Meitu"
-- "ME": "Metz"
-- "09": "meanIT"
-- "0E": "Melrose"
-- "MX": "MEU"
-- "MI": "MicroMax"
-- "8M": "Mito"
-- "1X": "Minix"
-- "M5": "MIXC"
-- "1Z": "MiXzo"
-- "MH": "Mobiola"
-- "4M": "Mobicel"
-- "M6": "Mobiistar"
-- "MC": "Mediacom"
-- "MK": "MediaTek"
-- "MO": "Mio"
-- "M7": "Miray"
-- "MM": "Mpman"
-- "LS": "MLS"
-- "M4": "Modecom"
-- "MF": "Mofut"
-- "MR": "Motorola"
-- "MV": "Movic"
-- "MS": "Microsoft"
-- "M9": "MTC"
-- "MP": "MegaFon"
-- "MZ": "MSI"
-- "MU": "Memup"
-- "MT": "Mitsubishi"
-- "ML": "MLLED"
-- "MQ": "M.T.T."
-- "N4": "MTN"
-- "MY": "MyPhone"
-- "3T": "MyTab"
-- "1M": "MYFON"
-- "MG": "MyWigo"
-- "M8": "Myria"
-- "6M": "Mystery"
-- "1R": "Multilaser"
-- "N3": "Navon"
-- "N7": "National"
-- "N5": "NOA"
-- "NE": "NEC"
-- "4N": "NextTab"
-- "5N": "Nos"
-- "1N": "Neomi"
-- "NF": "Neffos"
-- "NA": "Netgear"
-- "NU": "NeuImage"
-- "NG": "NGM"
-- "NZ": "NG Optics"
-- "N6": "Nobby"
-- "NO": "Nous"
-- "NI": "Nintendo"
-- "0N": "Newman"
-- "N1": "Noain"
-- "N2": "Nextbit"
-- "NK": "Nokia"
-- "NV": "Nvidia"
-- "NB": "Noblex"
-- "NM": "Nomi"
-- "2N": "Nomu"
-- "N0": "Nuvo"
-- "NL": "NUU Mobile"
-- "NY": "NYX Mobile"
-- "NN": "Nikon"
-- "N9": "Newland"
-- "NW": "Newgen"
-- "NS": "NewsMy"
-- "NX": "Nexian"
-- "N8": "NEXON"
-- "NT": "NextBook"
-- "O3": "O+"
-- "OB": "Obi"
-- "O1": "Odys"
-- "OD": "Onda"
-- "ON": "OnePlus"
-- "OX": "Onix"
-- "OH": "Openbox"
-- "OP": "OPPO"
-- "O4": "ONN"
-- "OR": "Orange"
-- "O5": "Orbic"
-- "OS": "Ordissimo"
-- "OT": "O2"
-- "OK": "Ouki"
-- "OE": "Oukitel"
-- "OU": "OUYA"
-- "OO": "Opsson"
-- "OV": "Overmax"
-- "30": "Ovvi"
-- "OY": "Oysters"
-- "O6": "Oyyu"
-- "OW": "öwn"
-- "O2": "Owwo"
-- "OZ": "OzoneHD"
-- "PN": "Panacom"
-- "PA": "Panasonic"
-- "PB": "PCBOX"
-- "PC": "PCD"
-- "PD": "PCD Argentina"
-- "PE": "PEAQ"
-- "PG": "Pentagram"
-- "PH": "Philips"
-- "4P": "Philco"
-- "1P": "Phicomm"
-- "PI": "Pioneer"
-- "PX": "Pixus"
-- "PL": "Polaroid"
-- "P5": "Polytron"
-- "P9": "Primepad"
-- "2P": "Prixton"
-- "P6": "Proline"
-- "PM": "Palm"
-- "0P": "POCO"
-- "3P": "Positivo BGH"
-- "PO": "phoneOne"
-- "5P": "Phonemax"
-- "PT": "Pantech"
-- "PY": "Ployer"
-- "P4": "Plum"
-- "P8": "PocketBook"
-- "PV": "Point of View"
-- "PP": "PolyPad"
-- "P2": "Pomp"
-- "P3": "PPTV"
-- "PS": "Positivo"
-- "PR": "Prestigio"
-- "6P": "Primux"
-- "P7": "Protruly"
-- "P1": "ProScan"
-- "PU": "PULID"
-- "QB": "Q.Bell"
-- "QI": "Qilive"
-- "QT": "Qtek"
-- "QH": "Q-Touch"
-- "QM": "QMobile"
-- "QA": "Quantum"
-- "QU": "Quechua"
-- "QO": "Qumo"
-- "RA": "Ramos"
-- "RE": "Realme"
-- "R8": "RED"
-- "R9": "Ravoz"
-- "RZ": "Razer"
-- "RC": "RCA Tablets"
-- "RB": "Readboy"
-- "RI": "Rikomagic"
-- "RN": "Rinno"
-- "RV": "Riviera"
-- "RM": "RIM"
-- "RK": "Roku"
-- "RO": "Rover"
-- "R6": "RoverPad"
-- "RR": "Roadrover"
-- "R1": "Rokit"
-- "R3": "Rombica"
-- "RT": "RT Project"
-- "RX": "Ritmix"
-- "R7": "Ritzviva"
-- "R5": "Ross&Moor"
-- "R2": "R-TV"
-- "RG": "RugGear"
-- "RU": "Runbo"
-- "RY": "Ryte"
-- "SQ": "Santin"
-- "SA": "Samsung"
-- "S0": "Sanei"
-- "CZ": "Schneider"
-- "SD": "Sega"
-- "SL": "Selfix"
-- "SE": "Sony Ericsson"
-- "01": "Senkatel"
-- "S1": "Sencor"
-- "SF": "Softbank"
-- "SX": "SFR"
-- "SG": "Sagem"
-- "SH": "Sharp"
-- "7S": "Shift Phones"
-- "3S": "Shuttle"
-- "SI": "Siemens"
-- "SJ": "Silent Circle"
-- "1S": "Sigma"
-- "SN": "Sendo"
-- "0S": "SEMP TCL"
-- "S6": "Senseit"
-- "EW": "Senwa"
-- "SW": "Sky"
-- "SK": "Skyworth"
-- "SC": "Smartfren"
-- "SO": "Sony"
-- "OI": "Sonim"
-- "X2": "Soundmax"
-- "8S": "Soyes"
-- "SP": "Spice"
-- "6S": "Spectrum"
-- "9S": "Sugar"
-- "5S": "Sunvell"
-- "0H": "Sunstech"
-- "SU": "SuperSonic"
-- "S5": "Supra"
-- "SV": "Selevision"
-- "SY": "Sanyo"
-- "SM": "Symphony"
-- "4S": "Syrox"
-- "SR": "Smart"
-- "S7": "Smartisan"
-- "S4": "Star"
-- "SB": "STF Mobile"
-- "S8": "STK"
-- "S9": "Savio"
-- "2S": "Starway"
-- "ST": "Storex"
-- "S2": "Stonex"
-- "S3": "SunVan"
-- "SZ": "Sumvision"
-- "SS": "SWISSMOBILITY"
-- "QS": "SQOOL"
-- "0W": "Swipe"
-- "10": "Simbans"
-- "X1": "Safaricom"
-- "TA": "Tesla"
-- "TK": "Takara"
-- "4T": "Tronsmart"
-- "5R": "Transpeed"
-- "T5": "TB Touch"
-- "TC": "TCL"
-- "T7": "Teclast"
-- "TE": "Telit"
-- "9T": "Tetratab"
-- "T4": "ThL"
-- "TH": "TiPhone"
-- "TB": "Tecno Mobile"
-- "TP": "TechPad"
-- "TD": "Tesco"
-- "T0": "TD Systems"
-- "TI": "TIANYU"
-- "2T": "Tinai"
-- "TG": "Telego"
-- "TL": "Telefunken"
-- "2L": "Tele2"
-- "T2": "Telenor"
-- "TM": "T-Mobile"
-- "TN": "Thomson"
-- "8T": "Time2"
-- "TQ": "Timovi"
-- "TY": "Tooky"
-- "0T": "Tone"
-- "T1": "Tolino"
-- "T9": "Top House"
-- "TO": "Toplux"
-- "7T": "Torex"
-- "T8": "Touchmate"
-- "TS": "Toshiba"
-- "TT": "TechnoTrend"
-- "T6": "TrekStor"
-- "T3": "Trevi"
-- "TU": "Tunisie Telecom"
-- "TR": "Turbo-X"
-- "1T": "Turbo"
-- "5T": "TurboKids"
-- "11": "True"
-- "TV": "TVC"
-- "TW": "TWM"
-- "6T": "Twoe"
-- "TX": "TechniSat"
-- "TZ": "teXet"
-- "UC": "U.S. Cellular"
-- "UH": "Uhappy"
-- "U1": "Uhans"
-- "UG": "Ugoos"
-- "UL": "Ulefone"
-- "UO": "Unnecto"
-- "UN": "Unowhy"
-- "US": "Uniscope"
-- "UX": "Unimax"
-- "UM": "UMIDIGI"
-- "UU": "Unonu"
-- "UK": "UTOK"
-- "UA": "Umax"
-- "UT": "UTStarcom"
-- "UZ": "Unihertz"
-- "VA": "Vastking"
-- "VD": "Videocon"
-- "VE": "Vertu"
-- "VN": "Venso"
-- "V5": "Vivax"
-- "0V": "Vipro"
-- "VI": "Vitelcom"
-- "V7": "Vinga"
-- "VK": "VK Mobile"
-- "VS": "ViewSonic"
-- "VH": "Vsmart"
-- "V9": "Vsun"
-- "V8": "Vesta"
-- "VT": "Vestel"
-- "VR": "Vernee"
-- "V4": "Verizon"
-- "VL": "Verykool"
-- "V6": "VGO TEL"
-- "VV": "Vivo"
-- "3V": "VVETIME"
-- "VX": "Vertex"
-- "V3": "Vinsoc"
-- "V2": "Vonino"
-- "1V": "Vontar"
-- "VG": "Vorago"
-- "2V": "Vorke"
-- "V1": "Voto"
-- "VO": "Voxtel"
-- "VF": "Vodafone"
-- "VM": "Vodacom"
-- "V0": "VKworld"
-- "VY": "Voyo"
-- "VZ": "Vizio"
-- "VW": "Videoweb"
-- "VU": "Vulcan"
-- "WA": "Walton"
-- "WF": "Wileyfox"
-- "WN": "Wink"
-- "WM": "Weimei"
-- "WE": "WellcoM"
-- "WY": "Wexler"
-- "W2": "Wigor"
-- "WI": "Wiko"
-- "WS": "Winds"
-- "WP": "Wieppo"
-- "WL": "Wolder"
-- "WG": "Wolfgang"
-- "WO": "Wonu"
-- "W1": "Woo"
-- "WX": "Woxter"
-- "WR": "Wortmann"
-- "XV": "X-View"
-- "XI": "Xiaomi"
-- "XL": "Xiaolajiao"
-- "XN": "Xion"
-- "XO": "Xolo"
-- "XR": "Xoro"
-- "XG": "Xgody"
-- "YA": "Yarvik"
-- "YD": "Yandex"
-- "Y2": "Yes"
-- "YE": "Yezz"
-- "Y1": "Yu"
-- "YU": "Yuandao"
-- "YS": "Yusun"
-- "YO": "Yota"
-- "YT": "Ytone"
-- "YX": "Yxtel"
-- "ZE": "Zeemi"
-- "ZK": "Zenek"
-- "ZF": "Zfiner"
-- "ZO": "Zonda"
-- "ZI": "Zidoo"
-- "ZX": "Ziox"
-- "ZP": "Zopo"
-- "ZT": "ZTE"
-- "ZU": "Zuum"
-- "ZN": "Zen"
-- "ZY": "Zync"
-- "ZQ": "ZYQ"
-- "XS": "Xshitou"
-- "XT": "X-TIGI"
-- "XB": "NEXBOX"
-- "X3": "X-BO"
-- "WB": "Web TV"
-- "XX": "Unknown"
diff --git a/priv/ua_inspector/short_codes.mobile_browsers.yml b/priv/ua_inspector/short_codes.mobile_browsers.yml
index b6426d96d6543e85c17d6105283a5a20b585db67..69a3746e1c569c38d1d60cfe61538acc5b91d53a 100644
--- a/priv/ua_inspector/short_codes.mobile_browsers.yml
+++ b/priv/ua_inspector/short_codes.mobile_browsers.yml
@@ -1,41 +1,65 @@
 - "36"
-- "OC"
-- "PU"
-- "SK"
-- "MF"
-- "OI"
-- "OM"
-- "DD"
-- "DB"
-- "ST"
+- "AH"
+- "AI"
 - "BL"
-- "IV"
-- "FM"
 - "C1"
-- "AL"
-- "SA"
-- "SB"
-- "FR"
-- "WP"
-- "HA"
-- "NX"
-- "HU"
-- "VV"
-- "RE"
+- "C4"
 - "CB"
-- "MZ"
-- "UM"
+- "CW"
+- "DB"
+- "DD"
+- "DT"
+- "EU"
+- "EZ"
 - "FK"
+- "FM"
+- "FR"
 - "FX"
-- "WI"
-- "MN"
+- "GH"
+- "GI"
+- "GR"
+- "HA"
+- "HU"
+- "IV"
+- "JB"
+- "KD"
 - "M1"
-- "AH"
+- "MF"
+- "MN"
+- "MZ"
+- "NX"
+- "OC"
+- "OI"
+- "OM"
+- "OZ"
+- "PU"
+- "PI"
+- "PE"
+- "QU"
+- "RE"
+- "S0"
+- "S7"
+- "SA"
+- "SB"
+- "SG"
+- "SK"
+- "ST"
 - "SU"
-- "EU"
-- "EZ"
+- "T1"
+- "UH"
+- "UM"
 - "UT"
-- "DT"
-- "S0"
-- "QU"
+- "VE"
+- "VV"
+- "WI"
+- "WP"
 - "YN"
+- "IO"
+- "IS"
+- "HQ"
+- "RW"
+- "HI"
+- "NA"
+- "BW"
+- "YO"
+- "PK"
diff --git a/priv/ua_inspector/short_codes.os_families.yml b/priv/ua_inspector/short_codes.os_families.yml
index ae35189aff5f4b3e3f71ec07b641eb165ab31aa7..0ba4138ccb24d430ee56684584514b7053f09d4d 100644
--- a/priv/ua_inspector/short_codes.os_families.yml
+++ b/priv/ua_inspector/short_codes.os_families.yml
@@ -7,11 +7,14 @@
   - "MLD"
   - "MCD"
   - "YNS"
+  - "GRI"
+  - "HAR"
+  - "ADR"
+  - "CLR"
+  - ""
 - "AmigaOS":
   - "AMG"
   - "MOR"
-- "Apple TV":
-  - "ATV"
 - "BlackBerry":
   - "BLB"
   - "QNX"
@@ -22,6 +25,8 @@
   - "HAI"
 - "Chrome OS":
   - "COS"
+  - "FYD"
+  - "SEE"
 - "Firefox OS":
   - "FOS"
   - "KOS"
@@ -34,6 +39,9 @@
   - "OS2"
 - "iOS":
   - "IOS"
+  - "ATV"
+  - "WAS"
+  - "IPA"
 - "RISC OS":
   - "ROS"
 - "GNU/Linux":
@@ -59,6 +67,32 @@
   - "SAF"
   - "ORD"
   - "TOS"
+  - "RSO"
+  - "DEE"
+  - "FRE"
+  - "MAG"
+  - "FEN"
+  - "CAI"
+  - "PCL"
+  - "HAS"
+  - "LOS"
+  - "DVK"
+  - "ROK"
+  - "OWR"
+  - "OTV"
+  - "KTV"
+  - "PUR"
+  - "PLA"
+  - "FUC"
+  - "PAR"
+  - "FOR"
+  - "MON"
+  - "KAN"
+  - "ZEN"
+  - "LND"
+  - "LNS"
+  - "CHN"
+  - ""
 - "Mac":
   - "MAC"
 - "Mobile Gaming Console":
@@ -68,6 +102,9 @@
 - "Real-time OS":
   - "MTK"
   - "TDX"
+  - "MRE"
+  - "JME"
+  - "REX"
 - "Other Mobile":
   - "WOS"
   - "POS"
@@ -103,3 +140,5 @@
   - "WCE"
   - "WRT"
   - "WIO"
+- "Other Smart TV":
+  - "WHS"
diff --git a/priv/ua_inspector/short_codes.oss.yml b/priv/ua_inspector/short_codes.oss.yml
index 31a0e1725a35f7eddfd697adace3c4111a0eeb03..89fd64e93a994ee4e4bbf8d7725f9c2623e09c3c 100644
--- a/priv/ua_inspector/short_codes.oss.yml
+++ b/priv/ua_inspector/short_codes.oss.yml
@@ -1,7 +1,8 @@
 - "AIX": "AIX"
 - "AND": "Android"
+- "ADR": "Android TV"
 - "AMG": "AmigaOS"
-- "ATV": "Apple TV"
+- "ATV": "tvOS"
 - "ARL": "Arch Linux"
 - "BTR": "BackTrack"
 - "SBA": "Bada"
@@ -9,52 +10,85 @@
 - "BLB": "BlackBerry OS"
 - "QNX": "BlackBerry Tablet OS"
 - "BMP": "Brew"
+- "CAI": "Caixa Mágica"
 - "CES": "CentOS"
+- "CLR": "ClearOS Mobile"
 - "COS": "Chrome OS"
+- "CHN": "China OS"
 - "CYN": "CyanogenMod"
 - "DEB": "Debian"
+- "DEE": "Deepin"
 - "DFB": "DragonFly"
+- "DVK": "DVKBuntu"
 - "FED": "Fedora"
+- "FEN": "Fenix"
 - "FOS": "Firefox OS"
 - "FIR": "Fire OS"
+- "FOR": "Foresight Linux"
+- "FRE": "Freebox"
 - "BSD": "FreeBSD"
+- "FYD": "FydeOS"
+- "FUC": "Fuchsia"
 - "GNT": "Gentoo"
+- "GRI": "GridOS"
 - "GTV": "Google TV"
 - "HPX": "HP-UX"
 - "HAI": "Haiku OS"
+- "IPA": "iPadOS"
+- "HAR": "HarmonyOS"
+- "HAS": "HasCodingOS"
 - "IRI": "IRIX"
 - "INF": "Inferno"
+- "JME": "Java ME"
 - "KOS": "KaiOS"
+- "KAN": "Kanotix"
 - "KNO": "Knoppix"
+- "KTV": "KreaTV"
 - "KBT": "Kubuntu"
 - "LIN": "GNU/Linux"
+- "LND": "LindowsOS"
+- "LNS": "Linspire"
 - "LBT": "Lubuntu"
+- "LOS": "Lumin OS"
 - "VLN": "VectorLinux"
 - "MAC": "Mac"
 - "MAE": "Maemo"
+- "MAG": "Mageia"
 - "MDR": "Mandriva"
 - "SMG": "MeeGo"
 - "MCD": "MocorDroid"
+- "MON": "moonOS"
 - "MIN": "Mint"
 - "MLD": "MildWild"
 - "MOR": "MorphOS"
 - "NBS": "NetBSD"
 - "MTK": "MTK / Nucleus"
+- "MRE": "MRE"
 - "WII": "Nintendo"
 - "NDS": "Nintendo Mobile"
 - "OS2": "OS/2"
 - "T64": "OSF1"
 - "OBS": "OpenBSD"
+- "OWR": "OpenWrt"
+- "OTV": "Opera TV"
 - "ORD": "Ordissimo"
+- "PAR": "Pardus"
+- "PCL": "PCLinuxOS"
+- "PLA": "Plasma Mobile"
 - "PSP": "PlayStation Portable"
 - "PS3": "PlayStation"
+- "PUR": "PureOS"
 - "RHT": "Red Hat"
 - "ROS": "RISC OS"
+- "ROK": "Roku OS"
+- "RSO": "Rosa"
 - "REM": "Remix OS"
+- "REX": "REX"
 - "RZD": "RazoDroiD"
 - "SAB": "Sabayon"
 - "SSE": "SUSE"
 - "SAF": "Sailfish OS"
+- "SEE": "SeewoOS"
 - "SLW": "Slackware"
 - "SOS": "Solaris"
 - "SYL": "Syllable"
@@ -67,7 +101,9 @@
 - "TIZ": "Tizen"
 - "TOS": "TmaxOS"
 - "UBT": "Ubuntu"
+- "WAS": "watchOS"
 - "WTV": "WebTV"
+- "WHS": "Whale OS"
 - "WIN": "Windows"
 - "WCE": "Windows CE"
 - "WIO": "Windows IoT"
@@ -76,7 +112,8 @@
 - "WRT": "Windows RT"
 - "XBX": "Xbox"
 - "XBT": "Xubuntu"
-- "YNS": "YunOs"
+- "YNS": "YunOS"
+- "ZEN": "Zenwalk"
 - "IOS": "iOS"
 - "POS": "palmOS"
 - "WOS": "webOS"