diff --git a/style/icons/shield40_tw_expressway.svg b/style/icons/shield40_tw_expressway.svg
new file mode 100644
index 000000000..d6f0c4f45
--- /dev/null
+++ b/style/icons/shield40_tw_expressway.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/style/icons/shield40_tw_freeway.svg b/style/icons/shield40_tw_freeway.svg
new file mode 100644
index 000000000..565586fe5
--- /dev/null
+++ b/style/icons/shield40_tw_freeway.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/style/icons/shield40_tw_provincial.svg b/style/icons/shield40_tw_provincial.svg
new file mode 100644
index 000000000..fa4a9f41d
--- /dev/null
+++ b/style/icons/shield40_tw_provincial.svg
@@ -0,0 +1,6 @@
+
+
diff --git a/style/js/shield_defs.js b/style/js/shield_defs.js
index c92d94b6f..07e6242b7 100644
--- a/style/js/shield_defs.js
+++ b/style/js/shield_defs.js
@@ -609,6 +609,41 @@ export function loadShields(shieldImages) {
shields["US:WA:Business"] = banneredShield(shields["US:WA"], ["BUS"]);
shields["US:WA:Alternate"] = banneredShield(shields["US:WA"], ["ALT"]);
+ // Asia
+ shields["TW:freeway"] = {
+ backgroundImage: shieldImages.shield40_tw_freeway,
+ textLayoutConstraint: ShieldText.ellipseTextConstraint,
+ textColor: "black",
+ padding: {
+ left: 4,
+ right: 4,
+ top: 4,
+ bottom: 4,
+ },
+ };
+ shields["TW:provincial"] = {
+ backgroundImage: shieldImages.shield40_tw_provincial,
+ textLayoutConstraint: ShieldText.southHalfellipseTextConstraint,
+ textColor: "white",
+ padding: {
+ left: 2,
+ right: 2,
+ top: 2,
+ bottom: 10,
+ },
+ };
+ shields["TW:expressway"] = {
+ backgroundImage: shieldImages.shield40_tw_expressway,
+ textLayoutConstraint: ShieldText.southHalfellipseTextConstraint,
+ textColor: "white",
+ padding: {
+ left: 2,
+ right: 2,
+ top: 2,
+ bottom: 10,
+ },
+ };
+
// Europe
shields["e-road"] = {
backgroundImage: [