diff --git a/www/web-proxy-useracl/src/opnsense/mvc/app/models/OPNsense/ProxyUserACL/Menu/Menu.xml b/www/web-proxy-useracl/src/opnsense/mvc/app/models/OPNsense/ProxyUserACL/Menu/Menu.xml
new file mode 100644
index 000000000..143224b91
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/mvc/app/models/OPNsense/ProxyUserACL/Menu/Menu.xml
@@ -0,0 +1,8 @@
+
+
diff --git a/www/web-proxy-useracl/src/opnsense/mvc/app/models/OPNsense/ProxyUserACL/ProxyUserACL.php b/www/web-proxy-useracl/src/opnsense/mvc/app/models/OPNsense/ProxyUserACL/ProxyUserACL.php
new file mode 100644
index 000000000..9474512a8
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/mvc/app/models/OPNsense/ProxyUserACL/ProxyUserACL.php
@@ -0,0 +1,37 @@
+
+ //OPNsense/ProxyUserACL
+ 1.0.0
+
+ Group and User ACL settings
+
+
+
+
+
+
+ Y
+
+
+ Y
+
+
+ N
+
+
+ Y
+ Black
+
+ Black
+ White
+
+
+
+ 0
+ Y
+
+
+ Y
+ group
+
+ Group
+ User
+
+
+
+
+
+
+
diff --git a/www/web-proxy-useracl/src/opnsense/mvc/app/views/OPNsense/ProxyUserACL/index.volt b/www/web-proxy-useracl/src/opnsense/mvc/app/views/OPNsense/ProxyUserACL/index.volt
new file mode 100644
index 000000000..2dc5d5094
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/mvc/app/views/OPNsense/ProxyUserACL/index.volt
@@ -0,0 +1,155 @@
+{#
+Copyright (C) 2017 Smart-Soft
+
+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.
+
+#}
+
+
+
+
+
+
+
+
+
+
+
{{ lang._('Number') }}
+
{{ lang._('Group') }}
+
{{ lang._('Black') }}
+
{{ lang._('Name') }}
+
{{ lang._('Domains') }}
+
{{ lang._('Priority') }}
+
{{ lang._('Commands') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{{ partial("layout_partials/base_dialog",['fields':formDialogACL,'id':'DialogACL','label':lang._('Edit user/group white and black lists')]) }}
diff --git a/www/web-proxy-useracl/src/opnsense/scripts/OPNsense/ProxyUserACL/reconfigure.php b/www/web-proxy-useracl/src/opnsense/scripts/OPNsense/ProxyUserACL/reconfigure.php
new file mode 100755
index 000000000..f52c40fec
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/scripts/OPNsense/ProxyUserACL/reconfigure.php
@@ -0,0 +1,43 @@
+#!/usr/bin/env php
+object()->system->domain);
+
+array_map('unlink', glob("/usr/local/etc/squid/ACL_*.txt"));
+foreach ($mdlProxyUserACL->getNodeByReference('general.ACLs.ACL')->getNodes() as $acl) {
+ file_put_contents("/usr/local/etc/squid/ACL_" . $acl["Priority"] . ".txt", $acl["Name"] . "\n" . ($acl["Group"]["user"]["selected"] == "1" ? $acl["Name"] . "@" . $domain . "\n" : ""));
+}
diff --git a/www/web-proxy-useracl/src/opnsense/service/conf/actions.d/actions_proxyuseracl.conf b/www/web-proxy-useracl/src/opnsense/service/conf/actions.d/actions_proxyuseracl.conf
new file mode 100644
index 000000000..cd4219fc0
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/service/conf/actions.d/actions_proxyuseracl.conf
@@ -0,0 +1,5 @@
+[reconfigure]
+command:/usr/local/opnsense/scripts/OPNsense/ProxyUserACL/reconfigure.php
+parameters:
+type:script
+message:reconfigure proxy
diff --git a/www/web-proxy-useracl/src/opnsense/service/templates/OPNsense/ProxyUserACL/+TARGETS b/www/web-proxy-useracl/src/opnsense/service/templates/OPNsense/ProxyUserACL/+TARGETS
new file mode 100644
index 000000000..20b764aa7
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/service/templates/OPNsense/ProxyUserACL/+TARGETS
@@ -0,0 +1 @@
+ProxyUserACL.conf:/usr/local/etc/squid/auth/ProxyUserACL.conf
\ No newline at end of file
diff --git a/www/web-proxy-useracl/src/opnsense/service/templates/OPNsense/ProxyUserACL/ProxyUserACL.conf b/www/web-proxy-useracl/src/opnsense/service/templates/OPNsense/ProxyUserACL/ProxyUserACL.conf
new file mode 100644
index 000000000..c8811c5d3
--- /dev/null
+++ b/www/web-proxy-useracl/src/opnsense/service/templates/OPNsense/ProxyUserACL/ProxyUserACL.conf
@@ -0,0 +1,93 @@
+{% set ldap = [] %}
+{% set local = [] %}
+{% if helpers.exists('OPNsense.proxy.forward.authentication.method') and OPNsense.proxy.forward.authentication.method != '' %}
+{% for method in OPNsense.proxy.forward.authentication.method.split(",") %}
+{% if method == "Local Database" %}
+{% if local.append("1") %}
+{% endif %}
+{% else %}
+{% for server in helpers.toList('system.authserver') %}
+{% if server.type == 'ldap' and server.name == method %}
+{% if ldap.append(server) %}
+{% endif %}
+{% endif %}
+{% endfor %}
+{% endif %}
+{% endfor %}
+{% endif %}
+
+{% if helpers.exists('OPNsense.ProxyUserACL.general.ACLs.ACL') %}
+{% for ACL in helpers.toList('OPNsense.ProxyUserACL.general.ACLs.ACL') %}
+{% if ACL.Group == "group" %}
+{% if ldap|length == 1 %}
+{% if helpers.exists('OPNsense.ProxySSO.EnableSSO') and OPNsense.ProxySSO.EnableSSO == '1' %}
+external_acl_type ext_group_ldap_{{ ACL.Priority}} ttl=300 negative_ttl=60 %LOGIN /usr/local/libexec/squid/ext_kerberos_ldap_group_acl -a -t {{ ACL.Hex }} -D {{ system.domain|upper }}
+acl group_ldap_{{ACL.Priority}} external ext_group_ldap_{{ ACL.Priority }}
+{% else %}
+{% for authcn in ldap[0].ldap_authcn.split(";") %}
+{% if ldap[0].ldap_attr_user == 'cn' %}
+external_acl_type ext_ldap_{{ ACL.Priority }}_{{ loop.index }} ttl=300 negative_ttl=60 %LOGIN /usr/local/libexec/squid/ext_ldap_group_acl -R -b "{{ldap[0].ldap_basedn}}" -f "(&(cn=%a)(memberUid=%u))" -D "{{ldap[0].ldap_binddn}}" -w "{{ldap[0].ldap_bindpw}}" -p "{{ldap[0].ldap_port}}" "{{ldap[0].host}}"
+{% else %}
+external_acl_type ext_ldap_{{ ACL.Priority }}_{{ loop.index }} ttl=300 negative_ttl=60 %LOGIN /usr/local/libexec/squid/ext_ldap_group_acl -R -b "{{ldap[0].ldap_basedn}}" -f "(&({{ldap[0].ldap_attr_user}}=%u)(memberOf=cn=%a,{{authcn}}))" -D "{{ldap[0].ldap_binddn}}" -w "{{ldap[0].ldap_bindpw}}" -p "{{ldap[0].ldap_port}}" "{{ldap[0].host}}"
+{% endif %}
+acl group_ldap_{{ACL.Priority}}_{{ loop.index }} external ext_ldap_{{ ACL.Priority }}_{{ loop.index }} "/usr/local/etc/squid/ACL_{{ ACL.Priority }}.txt"
+{% endfor %}
+{% endif %}
+{% endif %}
+{% if local|length == 1 %}
+external_acl_type ext_group_local_{{ ACL.Priority }} ttl=300 negative_ttl=60 %LOGIN /usr/local/libexec/squid/ext_unix_group_acl -p
+acl group_local_{{ACL.Priority}} external ext_group_local_{{ ACL.Priority }} "/usr/local/etc/squid/ACL_{{ ACL.Priority }}.txt"
+{% endif %}
+{% else %}
+acl user_{{ACL.Priority}} proxy_auth "/usr/local/etc/squid/ACL_{{ ACL.Priority }}.txt"
+{% endif %}
+{% if ldap|length == 1 or local|length == 1 %}
+{% for element in ACL.Domains.split(",") %}
+{% if '^' in element or '\\' in element or '$' in element or '[' in element %}
+acl domains_{{ACL.Priority}} url_regex {{element}}
+{% else %}
+acl domains_{{ACL.Priority}} url_regex {{element|replace(".","\.")}}
+{% endif %}
+{% endfor %}
+{% endif %}
+{% endfor %}
+{% endif %}
+
+{% if helpers.exists('OPNsense.ProxyUserACL.general.ACLs.ACL') and (ldap|length == 1 or local|length == 1) %}
+{% for priority in range(0,helpers.toList('OPNsense.ProxyUserACL.general.ACLs.ACL')|length) %}
+{% for ACL in helpers.toList('OPNsense.ProxyUserACL.general.ACLs.ACL') %}
+{% if ACL.Priority == priority|string %}
+{% if ACL.Group == "group" %}
+{% if ldap|length == 1 %}
+{% if helpers.exists('OPNsense.proxy.forward.icap.enable') and OPNsense.proxy.forward.icap.enable == '1' %}
+adaptation_access response_mod {{ACL.Black}} group_ldap_{{ACL.Priority}} domains_{{ACL.Priority}}
+adaptation_access request_mod {{ACL.Black}} group_ldap_{{ACL.Priority}} domains_{{ACL.Priority}}
+{% endif %}
+{% if helpers.exists('OPNsense.ProxySSO.EnableSSO') and OPNsense.ProxySSO.EnableSSO == '1' %}
+http_access {{ACL.Black}} group_ldap_{{ACL.Priority}} domains_{{ACL.Priority}}
+{% else %}
+{% for authcn in ldap[0].ldap_authcn.split(";") %}
+http_access {{ACL.Black}} group_ldap_{{ACL.Priority}}_{{ loop.index }} domains_{{ACL.Priority}}
+{% endfor %}
+{% endif %}
+{% endif %}
+{% if local|length == 1 %}
+{% if helpers.exists('OPNsense.proxy.forward.icap.enable') and OPNsense.proxy.forward.icap.enable == '1' %}
+adaptation_access response_mod {{ACL.Black}} group_local_{{ACL.Priority}} domains_{{ACL.Priority}}
+adaptation_access request_mod {{ACL.Black}} group_local_{{ACL.Priority}} domains_{{ACL.Priority}}
+{% endif %}
+http_access {{ACL.Black}} group_local_{{ACL.Priority}} domains_{{ACL.Priority}}
+{% endif %}
+{% else %}
+{% if helpers.exists('OPNsense.proxy.forward.icap.enable') and OPNsense.proxy.forward.icap.enable == '1' %}
+adaptation_access response_mod {{ACL.Black}} user_{{ACL.Priority}} domains_{{ACL.Priority}}
+adaptation_access request_mod {{ACL.Black}} user_{{ACL.Priority}} domains_{{ACL.Priority}}
+{% endif %}
+http_access {{ACL.Black}} user_{{ACL.Priority}} domains_{{ACL.Priority}}
+{% endif %}
+{% break %}
+{% endif %}
+{% endfor %}
+{% endfor %}
+{% endif %}
+