diff --git a/netbox/templates/ipam/vlantranslationpolicy.html b/netbox/templates/ipam/vlantranslationpolicy.html
new file mode 100644
index 000000000..616205428
--- /dev/null
+++ b/netbox/templates/ipam/vlantranslationpolicy.html
@@ -0,0 +1,37 @@
+{% extends 'generic/object.html' %}
+{% load helpers %}
+{% load plugins %}
+{% load render_table from django_tables2 %}
+{% load i18n %}
+
+{% block content %}
+
+
+
+
+
+
+ {% trans "DNS Name" %} |
+ {{ object.name|placeholder }} |
+
+
+ {% trans "Description" %} |
+ {{ object.description|placeholder }} |
+
+
+
+ {% plugin_left_page object %}
+
+
+ {% include 'inc/panels/tags.html' %}
+ {% include 'inc/panels/custom_fields.html' %}
+ {% include 'inc/panels/comments.html' %}
+ {% plugin_right_page object %}
+
+
+
+
+ {% plugin_full_width_page object %}
+
+
+{% endblock %}
diff --git a/netbox/templates/ipam/vlantranslationrule.html b/netbox/templates/ipam/vlantranslationrule.html
new file mode 100644
index 000000000..646e88b2b
--- /dev/null
+++ b/netbox/templates/ipam/vlantranslationrule.html
@@ -0,0 +1,41 @@
+{% extends 'generic/object.html' %}
+{% load helpers %}
+{% load plugins %}
+{% load render_table from django_tables2 %}
+{% load i18n %}
+
+{% block content %}
+
+
+
+
+
+
+ {% trans "Policy" %} |
+ {{ object.policy|placeholder }} |
+
+
+ {% trans "Local VID" %} |
+ {{ object.local_vid|placeholder }} |
+
+
+ {% trans "Remote VID" %} |
+ {{ object.remote_vid|placeholder }} |
+
+
+
+ {% plugin_left_page object %}
+
+
+ {% include 'inc/panels/tags.html' %}
+ {% include 'inc/panels/custom_fields.html' %}
+ {% include 'inc/panels/comments.html' %}
+ {% plugin_right_page object %}
+
+
+
+
+ {% plugin_full_width_page object %}
+
+
+{% endblock %}
diff --git a/netbox/virtualization/migrations/0041_vminterface_vlan_translation_policy.py b/netbox/virtualization/migrations/0041_vminterface_vlan_translation_policy.py
new file mode 100644
index 000000000..cc28e43cc
--- /dev/null
+++ b/netbox/virtualization/migrations/0041_vminterface_vlan_translation_policy.py
@@ -0,0 +1,20 @@
+# Generated by Django 5.0.9 on 2024-10-08 17:12
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ipam', '0071_vlantranslationpolicy_vlantranslationrule'),
+ ('virtualization', '0040_convert_disk_size'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='vminterface',
+ name='vlan_translation_policy',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='ipam.vlantranslationpolicy'),
+ ),
+ ]
diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py
index 0767b2c13..bb03784da 100644
--- a/netbox/virtualization/models/virtualmachines.py
+++ b/netbox/virtualization/models/virtualmachines.py
@@ -368,6 +368,13 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin):
object_id_field='assigned_object_id',
related_query_name='vminterface',
)
+ vlan_translation_policy = models.ForeignKey(
+ to='ipam.VLANTranslationPolicy',
+ on_delete=models.SET_NULL,
+ null=True,
+ blank=True,
+ verbose_name=_('VLAN Translation Policy'),
+ )
class Meta(ComponentModel.Meta):
verbose_name = _('interface')