diff --git a/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/ACL/ACL.xml b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/ACL/ACL.xml
new file mode 100644
index 000000000..a2aa1cba5
--- /dev/null
+++ b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/ACL/ACL.xml
@@ -0,0 +1,10 @@
+
+
+ Services: Ndproxy: General Settings
+ Allow access to Ndproxy General Settings
+
+ ui/ndproxy/general/*
+ api/ndproxy/general/*
+
+
+
diff --git a/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Menu/Menu.xml b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Menu/Menu.xml
new file mode 100644
index 000000000..32ba653a7
--- /dev/null
+++ b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Menu/Menu.xml
@@ -0,0 +1,5 @@
+
diff --git a/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Ndproxy.php b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Ndproxy.php
new file mode 100644
index 000000000..1db32ccfc
--- /dev/null
+++ b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Ndproxy.php
@@ -0,0 +1,66 @@
+general->enabled === '1') {
+ $requiredFields = [
+ 'ndproxy_uplink_interface',
+ 'ndproxy_downlink_mac_address',
+ 'ndproxy_uplink_ipv6_addresses'
+ ];
+
+ foreach ($requiredFields as $field) {
+ if (empty((string)$this->general->$field)) {
+ $messages->appendMessage(new Message(
+ gettext('Field is required to enable Ndproxy.'),
+ "general." . $field
+ ));
+ }
+ }
+ }
+ }
+
+ public function performValidation($validateFullModel = false)
+ {
+ $messages = parent::performValidation($validateFullModel);
+
+ $this->checkConfiguration($messages);
+
+ return $messages;
+ }
+}
diff --git a/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Ndproxy.xml b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Ndproxy.xml
new file mode 100644
index 000000000..1076dd811
--- /dev/null
+++ b/net/ndproxy/src/opnsense/mvc/app/models/OPNsense/Ndproxy/Ndproxy.xml
@@ -0,0 +1,27 @@
+
+ //OPNsense/ndproxy
+ ndproxy configuration model
+ 1.0
+
+
+
+ 0
+ Y
+
+
+
+
+ ipv6
+ ,
+ Y
+ Please enter one or multiple valid IPv6 addresses.
+
+
+ ipv6
+ ,
+ Y
+ Please enter one or multiple valid IPv6 addresses.
+
+
+
+
diff --git a/net/ndproxy/src/opnsense/mvc/app/views/OPNsense/Ndproxy/general.volt b/net/ndproxy/src/opnsense/mvc/app/views/OPNsense/Ndproxy/general.volt
new file mode 100644
index 000000000..5e212445b
--- /dev/null
+++ b/net/ndproxy/src/opnsense/mvc/app/views/OPNsense/Ndproxy/general.volt
@@ -0,0 +1,73 @@
+{#
+ # Copyright (c) 2024 Cedrik Pischem
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without modification,
+ # are permitted provided that the following conditions are met:
+ #
+ # 1. Redistributions of source code must retain the above copyright notice,
+ # this list of conditions and the following disclaimer.
+ #
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
+ # this list of conditions and the following disclaimer in the documentation
+ # and/or other materials provided with the distribution.
+ #
+ # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ # AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ # POSSIBILITY OF SUCH DAMAGE.
+ #}
+
+
+
+
+