diff --git a/networkd/tasks/vlan.yml b/networkd/tasks/vlan.yml
index b8f6d15a4bd2a8c3b61ef903cd81ef2a82c13968..093acbf628430961894406720e57184ff7582cb2 100644
--- a/networkd/tasks/vlan.yml
+++ b/networkd/tasks/vlan.yml
@@ -34,7 +34,7 @@
     group: root
     mode: '0644'
   with_items: "{{ vlan.vlans }}"
-  when: item.bridge
+  when: item.bridge | default(False)
   notify:
     - restart networkd
 - name: ensure bridge networks are configured
@@ -45,6 +45,6 @@
     group: root
     mode: '0644'
   with_items: "{{ vlan.vlans }}"
-  when: item.bridge
+  when: item.bridge | default(False)
   notify:
     - restart networkd
diff --git a/networkd/templates/20-wired-routed.network.j2 b/networkd/templates/20-wired-routed.network.j2
index 6161bd248d2bec5b0f632da75947eced71a9dc96..cb4257f0be64be2da79637b1df498042cb329816 100644
--- a/networkd/templates/20-wired-routed.network.j2
+++ b/networkd/templates/20-wired-routed.network.j2
@@ -1,6 +1,7 @@
 {% if not network is defined %}
 {% set network = item.1 %}
 {% endif %}
+
 [Match]
 Name={{ network.interfaces|default([network.interface])|join(' ') }}
 
@@ -16,12 +17,15 @@ LinkLocalAddressing={{ network.link_local_addressing }}
 {% for server in network.nameservers|default(nameservers) %}
 DNS={{ server }}
 {% endfor %}
-{% if networkd_ipfwd %}
+{% if networkd_ipfwd or network.networkd_ipfwd|default(false) %}
 IPForward=yes
 {% endif %}
 {% for key, value in (network.settings|default({})).items() %}
 {{ key }}={{ value }}
 {% endfor %}
+{% for vlan in network.vlans|default([]) %}
+VLAN=vl-{{ vlan.name }}
+{% endfor %}
 
 {% for route in network.routes|default([{'gateway': network.gateway}]) %}
 [Route]
diff --git a/networkd/templates/20-wired-vlan.network.j2 b/networkd/templates/20-wired-vlan.network.j2
index 4b7052153a9bae40c7c8ddcdfa1065e05c218e6a..fea42ca1851c82a9dc6a364f78d0526e78703e0e 100644
--- a/networkd/templates/20-wired-vlan.network.j2
+++ b/networkd/templates/20-wired-vlan.network.j2
@@ -1,3 +1,8 @@
+{% if item.1.addresses | default(False) %}
+{% set network = item.1 %}
+{% include "20-wired-routed.network.j2" %}
+{% else %}
+
 [Match]
 Name={{ item.1.interface }}
 
@@ -9,3 +14,4 @@ BindCarrier={{ item.1.interface }}
 {% if networkd_ipfwd %}
 IPForward=yes
 {% endif %}
+{% endif %}
diff --git a/networkd/templates/vlan.network.j2 b/networkd/templates/vlan.network.j2
index 6b7c90f0c527a78b4175a1af7f280a205aae62cd..bcb92b60643a036b7f87ddf8d4c081c07625d522 100644
--- a/networkd/templates/vlan.network.j2
+++ b/networkd/templates/vlan.network.j2
@@ -1,4 +1,4 @@
-{% if item.bridge %}
+{% if item.bridge | default(False) %}
 [Match]
 Name=vl-{{ item.name }}
 
@@ -9,8 +9,11 @@ Bridge=vmbr-{{ item.name }}
 	'interface': 'vl-' + item.name,
 	'addresses': item.addresses|default([item.address] if item.address is defined else []),
 	'nameservers': item.nameservers|default([]),
+	'networkd_ipfwd': item.networkd_ipfwd|default(false),
 	'routes': item.routes|default([{'gateway': item.gateway}] if item.gateway is defined else []),
-	'link_local_addressing': item.link_local_addressing|default(None)
+	'link_local_addressing': item.link_local_addressing|default(None),
+	'settings': item.settings|default({}),
+	'custom': item.custom|default([])
 	} %}
 {% include "20-wired-routed.network.j2" %}
 {% endif %}