diff --git a/CONTRIBUTED.md b/CONTRIBUTED.md
index 458322fc10..2af7aa017f 100644
--- a/CONTRIBUTED.md
+++ b/CONTRIBUTED.md
@@ -59,7 +59,8 @@ luci-theme-edge source: [garypang13/luci-theme-edge](https://github.com//garypan
luci-app-beardropper source: [NateLol/natelol](https://github.com/NateLol/natelol).
luci-app-vssr source: [jerrykuku/luci-app-vssr](https://github.com/jerrykuku/luci-app-vssr).
luci-proto-modemmanager source: [nickberry17/luci-proto-modemmanager](https://github.com/nickberry17/luci-proto-modemmanager).
-luci-theme-infinityfreedom source: [xiaoqingfengATGH/luci-theme-infinityfreedom](https://github.com/xiaoqingfengATGH/luci-theme-infinityfreedom).
+luci-theme-infinityfreedom source: [xiaoqingfengATGH/luci-theme-infinityfreedom](https://github.com/xiaoqingfengATGH/luci-theme-infinityfreedom).
+luci-proto-minieap source: [ysc3839/luci-proto-minieap](https://github.com/ysc3839/luci-proto-minieap).
## License
### Depend on their own License.
diff --git a/package/ctcgfw/luci-proto-minieap/Makefile b/package/ctcgfw/luci-proto-minieap/Makefile
new file mode 100644
index 0000000000..f1e0a1f1da
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/Makefile
@@ -0,0 +1,16 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=luci-proto-minieap
+PKG_VERSION:=2.1
+PKG_RELEASE:=1
+PKG_MAINTAINER:=Richard Yu
+PKG_LICENSE:=GPLv3
+PKG_LICENSE_FILES:=LICENSE
+
+LUCI_TITLE:=LuCI support for MiniEAP
+LUCI_DEPENDS:=
+LUCI_PKGARCH:=all
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/package/ctcgfw/luci-proto-minieap/luasrc/model/cbi/admin_network/proto_minieap.lua b/package/ctcgfw/luci-proto-minieap/luasrc/model/cbi/admin_network/proto_minieap.lua
new file mode 100644
index 0000000000..a56fecadfa
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/luasrc/model/cbi/admin_network/proto_minieap.lua
@@ -0,0 +1,100 @@
+local map, section, net = ...
+
+local l = section.tab_names
+for i, v in ipairs(l) do
+ if v == "firewall" then
+ table.remove(l, i)
+ break
+ end
+end
+section.tabs["firewall"] = nil
+
+l = section.tabs["advanced"].childs
+for i, v in ipairs(l) do
+ if v.option == "delegate" then
+ table.remove(l, i)
+ break
+ end
+end
+
+section:tab("rjv3", translate("RJv3 Plugin Settings"), nil)
+
+local i = #section.tab_names
+local t = section.tab_names
+t[i], t[i-1] = t[i-1], t[i]
+
+local o = section:taboption("general", Value, "username", translate("Username"))
+
+o = section:taboption("general", Value, "password", translate("Password"))
+o.password = true
+
+o = section:taboption("general", DynamicList, "module", translate("Packet plugins"))
+o.rmempty = true
+o.datatype = "list(string)"
+o:value("rjv3", "rjv3")
+o:value("printer", "printer")
+
+o = section:taboption("advanced", Value, "max_fail", translate("Max fail"))
+o.datatype = "uinteger"
+o.placeholder = "3"
+
+o = section:taboption("advanced", Value, "max_retries", translate("Max retries"))
+o.datatype = "uinteger"
+o.placeholder = "3"
+
+o = section:taboption("advanced", Flag, "no_auto_reauth", translate("No auto reauth"))
+
+o = section:taboption("advanced", Value, "wait_after_fail", translate("Wait after fail"))
+o.datatype = "uinteger"
+o.placeholder = "30"
+
+o = section:taboption("advanced", Value, "stage_timeout", translate("Stage timeout"))
+o.datatype = "uinteger"
+o.placeholder = "5"
+
+o = section:taboption("advanced", Value, "auth_round", translate("Auth Round"))
+o.datatype = "uinteger"
+o.placeholder = "1"
+
+o = section:taboption("advanced", Value, "log_file", translate("Log file"))
+o.placeholder = "/var/log/minieap.log"
+
+-- rjv3 plugin
+o = section:taboption("rjv3", Value, "heartbeat", translate("Heartbeat interval"))
+o.datatype = "uinteger"
+o.placeholder = "60"
+
+o = section:taboption("rjv3", ListValue, "eap_bcast_addr", translate("EAP broadcast address"))
+o:value(0, translate("Standard")) -- BROADCAST_STANDARD
+o:value(1, translate("RJ private")) -- BROADCAST_RJ
+-- o:value(2, translate("BROADCAST_CER")) -- BROADCAST_CER
+
+o = section:taboption("rjv3", ListValue, "dhcp_type", translate("DHCP type"))
+o:value(0, translate("Disabled")) -- DHCP_NONE
+o:value(1, translate("Double Auth")) -- DHCP_DOUBLE_AUTH
+o:value(2, translate("DHCP After Auth")) -- DHCP_AFTER_AUTH
+o:value(3, translate("DHCP Before Auth")) -- DHCP_BEFORE_AUTH
+
+o = section:taboption("rjv3", DynamicList, "rj_option", translate("RJ option"))
+o.rmempty = true
+o.placeholder = ":[:r]"
+
+o = section:taboption("rjv3", Value, "service", translate("Service name"))
+o.placeholder = "internet"
+
+o = section:taboption("rjv3", Value, "version_str", translate("Version string"))
+o.placeholder = "RG-SU For Linux V1.0"
+
+o = section:taboption("rjv3", Value, "dhcp_script", translate("DHCP script"))
+
+o = section:taboption("rjv3", Value, "fake_dns1", translate("Fake DNS 1"))
+o.datatype = "ip4addr"
+
+o = section:taboption("rjv3", Value, "fake_dns2", translate("Fake DNS 2"))
+o.datatype = "ip4addr"
+
+o = section:taboption("rjv3", Value, "fake_serial", translate("Fake HDD serial"))
+
+o = section:taboption("rjv3", Value, "max_dhcp_count", translate("Max DHCP count"))
+o.datatype = "uinteger"
+o.placeholder = "3"
diff --git a/package/ctcgfw/luci-proto-minieap/luasrc/model/network/proto_minieap.lua b/package/ctcgfw/luci-proto-minieap/luasrc/model/network/proto_minieap.lua
new file mode 100644
index 0000000000..ee5705bb1d
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/luasrc/model/network/proto_minieap.lua
@@ -0,0 +1,20 @@
+local netmod = luci.model.network
+
+local proto = netmod:register_protocol("minieap")
+
+function proto.get_i18n(self)
+ return luci.i18n.translate("MiniEAP client")
+end
+
+function proto.is_installed(self)
+ return nixio.fs.access("/lib/netifd/proto/minieap.sh")
+end
+
+function proto.opkg_package(self)
+ return "minieap"
+end
+
+if netmod["register_error_code"] then
+ netmod:register_error_code("MISSING_USER_OR_PASS", luci.i18n.translate("Missing username or password"))
+ netmod:register_error_code("EXIT_FAILURE", luci.i18n.translate("Program exited with failure. See system log for more information."))
+end
diff --git a/package/ctcgfw/luci-proto-minieap/po/templates/minieap.pot b/package/ctcgfw/luci-proto-minieap/po/templates/minieap.pot
new file mode 100644
index 0000000000..028bd27f0a
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/po/templates/minieap.pot
@@ -0,0 +1,95 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Auth Round"
+msgstr ""
+
+msgid "DHCP After Auth"
+msgstr ""
+
+msgid "DHCP Before Auth"
+msgstr ""
+
+msgid "DHCP script"
+msgstr ""
+
+msgid "DHCP type"
+msgstr ""
+
+msgid "Disabled"
+msgstr ""
+
+msgid "Double Auth"
+msgstr ""
+
+msgid "EAP broadcast address"
+msgstr ""
+
+msgid "Fake DNS 1"
+msgstr ""
+
+msgid "Fake DNS 2"
+msgstr ""
+
+msgid "Fake HDD serial"
+msgstr ""
+
+msgid "Heartbeat interval"
+msgstr ""
+
+msgid "Log file"
+msgstr ""
+
+msgid "Max DHCP count"
+msgstr ""
+
+msgid "Max fail"
+msgstr ""
+
+msgid "Max retries"
+msgstr ""
+
+msgid "MiniEAP client"
+msgstr ""
+
+msgid "Missing username or password"
+msgstr ""
+
+msgid "No auto reauth"
+msgstr ""
+
+msgid "Packet plugins"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Program exited with failure. See system log for more information."
+msgstr ""
+
+msgid "RJ option"
+msgstr ""
+
+msgid "RJ private"
+msgstr ""
+
+msgid "RJv3 Plugin Settings"
+msgstr ""
+
+msgid "Service name"
+msgstr ""
+
+msgid "Stage timeout"
+msgstr ""
+
+msgid "Standard"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "Version string"
+msgstr ""
+
+msgid "Wait after fail"
+msgstr ""
diff --git a/package/ctcgfw/luci-proto-minieap/po/zh-cn/minieap.po b/package/ctcgfw/luci-proto-minieap/po/zh-cn/minieap.po
new file mode 100644
index 0000000000..95b6526a23
--- /dev/null
+++ b/package/ctcgfw/luci-proto-minieap/po/zh-cn/minieap.po
@@ -0,0 +1,95 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "Auth Round"
+msgstr "认证次数"
+
+msgid "DHCP After Auth"
+msgstr "认证后 DHCP"
+
+msgid "DHCP Before Auth"
+msgstr "认证前 DHCP"
+
+msgid "DHCP script"
+msgstr "DHCP 脚本"
+
+msgid "DHCP type"
+msgstr "DHCP 方式"
+
+msgid "Disabled"
+msgstr "禁用"
+
+msgid "Double Auth"
+msgstr "二次认证"
+
+msgid "EAP broadcast address"
+msgstr "EAP 广播地址"
+
+msgid "Fake DNS 1"
+msgstr "自定义主 DNS 地址"
+
+msgid "Fake DNS 2"
+msgstr "自定义次 DNS 地址"
+
+msgid "Fake HDD serial"
+msgstr "自定义硬盘序列号"
+
+msgid "Heartbeat interval"
+msgstr "心跳间隔"
+
+msgid "Log file"
+msgstr "日志文件"
+
+msgid "Max DHCP count"
+msgstr "最大 DHCP 次数"
+
+msgid "Max fail"
+msgstr "最大失败次数"
+
+msgid "Max retries"
+msgstr "最大重试次数"
+
+msgid "MiniEAP client"
+msgstr "MiniEAP 客户端"
+
+msgid "Missing username or password"
+msgstr "用户名或密码为空"
+
+msgid "No auto reauth"
+msgstr "不自动重新认证"
+
+msgid "Packet plugins"
+msgstr "数据包插件"
+
+msgid "Password"
+msgstr "密码"
+
+msgid "Program exited with failure. See system log for more information."
+msgstr "程序出错退出。查看系统日志获取更多信息。"
+
+msgid "RJ option"
+msgstr "锐捷选项"
+
+msgid "RJ private"
+msgstr "锐捷私有"
+
+msgid "RJv3 Plugin Settings"
+msgstr "RJv3 插件设置"
+
+msgid "Service name"
+msgstr "服务名称"
+
+msgid "Stage timeout"
+msgstr "阶段超时"
+
+msgid "Standard"
+msgstr "标准"
+
+msgid "Username"
+msgstr "用户名"
+
+msgid "Version string"
+msgstr "版本字符串"
+
+msgid "Wait after fail"
+msgstr "失败后等待时间"