diff --git a/net/arp-scan/Makefile b/net/arp-scan/Makefile
new file mode 100644
index 000000000..f0e2e7338
--- /dev/null
+++ b/net/arp-scan/Makefile
@@ -0,0 +1,8 @@
+PLUGIN_NAME= ARP Scan
+PLUGIN_VERSION= 0.1
+PLUGIN_COMMENT= Get all peers connected to a LAN
+PLUGIN_MAINTAINER= giuseppe.demarco@unical.it
+PLUGIN_DEPENDS= arp-scan
+PLUGINS_DEVEL= yes
+
+.include "../../Mk/plugins.mk"
diff --git a/net/arp-scan/pkg-descr b/net/arp-scan/pkg-descr
new file mode 100644
index 000000000..71c2c3c88
--- /dev/null
+++ b/net/arp-scan/pkg-descr
@@ -0,0 +1,16 @@
+ARP Scan sends ARP packets to hosts on the local network and displays
+any responses that are received.
+
+The Address Resolution Protocol (ARP) uses a simple message format containing
+one address resolution request or response (usually IPv4).
+
+ARP Scan is a simple tool yet very powerful and it represent the only way
+to find a device using an arp response. Once you’ve found the MAC
+address, you can find more info about that device by matching that MAC
+address to it’s vendor.
+
+Arp scan techniques are very important to understand ARP/MAC responses
+for penetration tester and diagnosys purpose. It is the first tool for
+network monitoring, especially against ip collisions, arpspoof and all
+kind of hijack techniques, like Man-In-The-Middle Attack. It also helps
+in cases when someone is spoofing IP address and DoS-ing your server.
diff --git a/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/Api/ServiceController.php b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/Api/ServiceController.php
new file mode 100644
index 000000000..af7b58d6e
--- /dev/null
+++ b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/Api/ServiceController.php
@@ -0,0 +1,91 @@
+
+ * 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.
+ */
+
+namespace OPNsense\ARPscanner\Api;
+
+use \OPNsense\Base\ApiControllerBase;
+use \OPNsense\Core\Backend;
+
+class ServiceController extends ApiControllerBase
+{
+
+ public function startAction()
+ {
+ if ($this->request->isPost()) {
+ $ifname = escapeshellarg($_POST['interface']);
+ $networks = escapeshellarg($_POST['networks']);
+ //~ return 'arpscanner start '.$ifname.' '.$networks;
+ $backend = new Backend();
+ $result = json_decode(trim($backend->configdRun('arpscanner start '.$ifname.' '.$networks)), true);
+ return $result;
+ }
+ return array("message" => "unable to run config action");
+ }
+
+ public function statusAction()
+ {
+ if ($this->request->isPost()) {
+ $ifname = escapeshellarg($_POST['interface']);
+ //~ return 'arpscanner start '.$ifname.' '.$networks;
+ $backend = new Backend();
+ $result = json_decode(trim($backend->configdRun('arpscanner status '.$ifname)), true);
+ return $result;
+ }
+ return array("message" => "this action must be called using the POST method");
+ }
+
+ public function stopAction()
+ {
+ if ($this->request->isPost()) {
+ $ifname = escapeshellarg($_POST['interface']);
+ $backend = new Backend();
+ $bckresult = trim($backend->configdRun("arpscanner stop ".$ifname));
+ if ($bckresult !== null) {
+ // only return valid json type responses
+ return $bckresult;
+ }
+ return array("message" => "error");
+ }
+ }
+
+ public function checkAction()
+ {
+ if ($this->request->isPost()) {
+ $ifname = escapeshellarg($_POST['interface']);
+ // test: "configctl arpscanner check em0"
+ $backend = new Backend();
+ $bckresult = json_decode(trim($backend->configdRun("arpscanner check ".$ifname)), true);
+ if ($bckresult !== null) {
+ // only return valid json type responses
+ return $bckresult;
+ }
+ return array("message" => "error");
+ }
+ }
+
+}
diff --git a/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/Api/SettingsController.php b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/Api/SettingsController.php
new file mode 100644
index 000000000..9361fe723
--- /dev/null
+++ b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/Api/SettingsController.php
@@ -0,0 +1,103 @@
+
+ * 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.
+ *
+**/
+namespace OPNsense\ARPscanner\Api;
+
+use \OPNsense\Base\ApiControllerBase;
+use \OPNsense\ARPscanner\ARPscanner;
+use \OPNsense\Core\Config;
+use \OPNsense\Core\Backend;
+
+class SettingsController extends ApiControllerBase
+{
+ /* retrieve general settings
+ * @return array general settings
+ */
+ public function getAction()
+ {
+ // define list of configurable settings
+ $result = array();
+ if ($this->request->isGet()) {
+ $mdl = new ARPscanner();
+ $result['arpscanner'] = $mdl->getNodes();
+ // returns: {"arpscanner":{"general":{"interface":
+ // {"lan":{"value":"lan","selected":1}},"networks":
+ // {"10.0.1.0\/24":{"value":"10.0.1.0\/24","selected":1}}}}}
+
+ $backend = new Backend();
+ $bckresult = trim($backend->configdRun("arpscanner interfaces"));
+ $ifnames = json_decode($bckresult);
+
+ $result['arpscanner']['general']['interface'] = array();
+
+ if (is_array($ifnames) || is_object($ifnames))
+ {
+ foreach ($ifnames as &$arr) {
+ $ifname = $arr[0];
+ $result['arpscanner']['general']['interface'][$ifname] = array();
+ $result['arpscanner']['general']['interface'][$ifname]['value'] = join(", ", array($ifname, " (".$arr[2].")") );
+ }
+ }
+ // $result['arpscanner']['general']['networks'] = '192.168.1.0/24,172.16.45.0/25';
+ }
+ return $result;
+ }
+
+ /**
+ * update arpscan settings
+ * @return array status
+ */
+ public function setAction()
+ {
+ $result = array("result"=>"failed");
+ if ($this->request->isPost()) {
+ // load model and update with provided data
+ $mdl = new ARPscanner();
+ $mdl->setNodes($this->request->getPost("arpscanner"));
+
+ // perform validation
+ $valMsgs = $mdl->performValidation();
+ foreach ($valMsgs as $field => $msg) {
+ if (!array_key_exists("validations", $result)) {
+ $result["validations"] = array();
+ }
+ $result["validations"]["general.".$msg->getField()] = $msg->getMessage();
+ }
+
+ // serialize model to config and save
+ if ($valMsgs->count() == 0) {
+ $mdl->serializeToConfig();
+ Config::getInstance()->save();
+ $result["result"] = "saved";
+ }
+ }
+ return $result;
+ }
+
+
+}
diff --git a/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/IndexController.php b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/IndexController.php
new file mode 100644
index 000000000..ec5c9f438
--- /dev/null
+++ b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/IndexController.php
@@ -0,0 +1,51 @@
+
+ *
+ * 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.
+ *
+ */
+
+namespace OPNsense\ARPscanner;
+
+/**
+ * Class IndexController
+ * @package OPNsense\ARPscanner
+ */
+class IndexController extends \OPNsense\Base\IndexController
+{
+ /**
+ * ARP scanner index page
+ * @throws \Exception
+ */
+ public function indexAction()
+ {
+ $this->view->title = gettext('ARP Scan');
+ $this->view->general = $this->getForm("general");
+ $this->view->pick('OPNsense/ARPscanner/index');
+
+ $this->view->generalForm = $this->getForm("general");
+ }
+}
diff --git a/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/forms/general.xml b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/forms/general.xml
new file mode 100644
index 000000000..e7cd44a1d
--- /dev/null
+++ b/net/arp-scan/src/opnsense/mvc/app/controllers/OPNsense/ARPscanner/forms/general.xml
@@ -0,0 +1,15 @@
+