diff --git a/package/lean/luci-app-pppoe-relay/Makefile b/package/lean/luci-app-pppoe-relay/Makefile
new file mode 100644
index 000000000..d65d987eb
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/Makefile
@@ -0,0 +1,18 @@
+# Copyright (C) 2016 Openwrt.org
+#
+# This is free software, licensed under the Apache License, Version 2.0 .
+#
+
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI support for PPPoE Relay
+LUCI_DEPENDS:=+rp-pppoe-common +rp-pppoe-relay
+LUCI_PKGARCH:=all
+PKG_VERSION:=1.0
+PKG_RELEASE:=2
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
+
+
diff --git a/package/lean/luci-app-pppoe-relay/luasrc/controller/pppoe-relay.lua b/package/lean/luci-app-pppoe-relay/luasrc/controller/pppoe-relay.lua
new file mode 100644
index 000000000..f3a2760e7
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/luasrc/controller/pppoe-relay.lua
@@ -0,0 +1,10 @@
+module("luci.controller.pppoe-relay",package.seeall)
+
+function index()
+ if not nixio.fs.access("/etc/config/pppoe-relay")then
+ return
+end
+
+entry({"admin","services","pppoe-relay"},cbi("pppoe-relay"),_("PPPoE Relay"),90).dependent=true
+
+end
\ No newline at end of file
diff --git a/package/lean/luci-app-pppoe-relay/luasrc/model/cbi/pppoe-relay.lua b/package/lean/luci-app-pppoe-relay/luasrc/model/cbi/pppoe-relay.lua
new file mode 100644
index 000000000..c43127ec9
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/luasrc/model/cbi/pppoe-relay.lua
@@ -0,0 +1,56 @@
+local s=require"luci.sys"
+local net = require "luci.model.network".init()
+local ifaces = s.net:devices()
+local m,s,o
+
+m=Map("pppoe-relay",translate("PPPoE Relay"))
+m.description = translate("Opening the PPPoE relay allows devices in the Intranet to create a separate PPPoE connection that can cross NAT.")
+s=m:section(TypedSection,"service")
+s.addremove=true
+s.anonymous=true
+s.template="cbi/tblsection"
+
+o=s:option(Flag,"enabled",translate("Enabled"))
+o.rmempty=false
+
+o=s:option(ListValue,"server_interface",translate("Server Interface"))
+for _, iface in ipairs(ifaces) do
+ if not (iface == "lo" or iface:match("^ifb.*") or iface:match("gre*")) then
+ local nets = net:get_interface(iface)
+ nets = nets and nets:get_networks() or {}
+ for k, v in pairs(nets) do
+ nets[k] = nets[k].sid
+ end
+ nets = table.concat(nets, ",")
+ o:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
+ end
+end
+o.rmempty=true
+
+o=s:option(ListValue,"client_interface",translate("Client Interface"))
+for _, iface in ipairs(ifaces) do
+ if not (iface == "lo" or iface:match("^ifb.*") or iface:match("gre*")) then
+ local nets = net:get_interface(iface)
+ nets = nets and nets:get_networks() or {}
+ for k, v in pairs(nets) do
+ nets[k] = nets[k].sid
+ end
+ nets = table.concat(nets, ",")
+ o:value(iface, ((#nets > 0) and "%s (%s)" % {iface, nets} or iface))
+ end
+end
+o.rmempty=true
+
+o=s:option(Button,"is_run",translate("Check"))
+function o.write(self, section)
+ local server_interface = m.uci:get('pppoe-relay',section,"server_interface")
+ local client_interface = m.uci:get('pppoe-relay',section,"client_interface")
+ isrun=luci.sys.call("ps | grep '/usr/sbin/pppoe-relay -S "..server_interface.." -C "..client_interface.."' | grep -v 'grep' >/dev/null")
+ if isrun == 1 then
+ o.description = ""
+ else
+ o.description = ""
+ end
+end
+
+return m
diff --git a/package/lean/luci-app-pppoe-relay/po/zh-cn/pppoe-relay.po b/package/lean/luci-app-pppoe-relay/po/zh-cn/pppoe-relay.po
new file mode 100644
index 000000000..e1a0c1034
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/po/zh-cn/pppoe-relay.po
@@ -0,0 +1,23 @@
+msgid "PPPoE Relay"
+msgstr "PPPoE 穿透"
+
+msgid "Opening the PPPoE relay allows devices in the Intranet to create a separate PPPoE connection that can cross NAT."
+msgstr "开启 PPPoE 中继允许内网中的设备创建一个可穿过 NAT 的独立 PPPoE 连接"
+
+msgid "Enable or disable the PPPoE Relay"
+msgstr "启用或禁用PPPoE穿透"
+
+msgid "Server Interface"
+msgstr "服务端接口"
+
+msgid "Specify the PPPoE server interface"
+msgstr "指定PPPoE服务器接口"
+
+msgid "Client Interface"
+msgstr "客户端接口"
+
+msgid "Specify the PPPoE client interface"
+msgstr "指定PPPoE客户端接口"
+
+msgid "Enabled"
+msgstr "启用"
\ No newline at end of file
diff --git a/package/lean/luci-app-pppoe-relay/root/etc/config/pppoe-relay b/package/lean/luci-app-pppoe-relay/root/etc/config/pppoe-relay
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/root/etc/config/pppoe-relay
@@ -0,0 +1 @@
+
diff --git a/package/lean/luci-app-pppoe-relay/root/etc/init.d/pppoe-relay b/package/lean/luci-app-pppoe-relay/root/etc/init.d/pppoe-relay
new file mode 100755
index 000000000..ca069d155
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/root/etc/init.d/pppoe-relay
@@ -0,0 +1,29 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2018 Lienol
+
+START=99
+STOP=16
+
+setup_service() {
+ local section="$1"
+ config_get enabled "$section" enabled
+ [ "$enabled" -eq 0 ] && return 0
+ config_get server_interface "$section" server_interface
+ config_get client_interface "$section" client_interface
+ [ -n "$server_interface" ] || return 0
+ [ -n "$client_interface" ] || return 0
+
+ is_run=$(ps | grep "/usr/sbin/pppoe-relay -S $server_interface -C $client_interface" | grep -v "grep")
+ [ -z "$is_run" ] && {
+ /usr/sbin/pppoe-relay -S $server_interface -C $client_interface
+ }
+}
+
+start() {
+ config_load pppoe-relay
+ config_foreach setup_service service
+}
+
+stop() {
+ killall -9 pppoe-relay
+}
diff --git a/package/lean/luci-app-pppoe-relay/root/etc/uci-defaults/luci-app-pppoe-relay b/package/lean/luci-app-pppoe-relay/root/etc/uci-defaults/luci-app-pppoe-relay
new file mode 100755
index 000000000..287888b28
--- /dev/null
+++ b/package/lean/luci-app-pppoe-relay/root/etc/uci-defaults/luci-app-pppoe-relay
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+uci -q batch <<-EOF >/dev/null
+ delete ucitrack.@pppoe-relay[-1]
+ add ucitrack pppoe-relay
+ set ucitrack.@pppoe-relay[-1].init=pppoe-relay
+ commit ucitrack
+EOF
+
+rm -f /tmp/luci-indexcache
+exit 0