diff --git a/package/gluon-simple-tc/Makefile b/package/gluon-simple-tc/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c496682d94bd3d2f83712e0dcb8988340cf15ec1
--- /dev/null
+++ b/package/gluon-simple-tc/Makefile
@@ -0,0 +1,36 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-simple-tc
+PKG_VERSION:=1
+PKG_RELEASE:=1
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/gluon-simple-tc
+  SECTION:=gluon
+  CATEGORY:=Gluon
+  TITLE:=Bandwidth limit support
+  DEPENDS:=+gluon-core +tc +kmod-sched
+endef
+
+define Package/gluon-simple-tc/description
+	Gluon community wifi mesh firmware framework: tc support
+endef
+
+define Build/Prepare
+	mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+define Package/gluon-simple-tc/install
+	$(CP) ./files/* $(1)/
+endef
+
+$(eval $(call BuildPackage,gluon-simple-tc))
diff --git a/package/gluon-simple-tc/files/etc/config/gluon-simple-tc b/package/gluon-simple-tc/files/etc/config/gluon-simple-tc
new file mode 100644
index 0000000000000000000000000000000000000000..b24df115058f503274534525a4b9ab3cd32fa176
--- /dev/null
+++ b/package/gluon-simple-tc/files/etc/config/gluon-simple-tc
@@ -0,0 +1,7 @@
+# Example config
+
+config interface 'example'
+       option enabled '0'
+       option ifname 'eth0'
+       option limit_egress '1000' # 1000 Kbit/s
+       option limit_ingress '5000' # 5000 Kbit/s
\ No newline at end of file
diff --git a/package/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc b/package/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc
new file mode 100644
index 0000000000000000000000000000000000000000..e5ea8f750224cc5ede53650efc84bdd3f1dfcf6e
--- /dev/null
+++ b/package/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc
@@ -0,0 +1,30 @@
+[ "$ACTION" = 'add' ] || exit 0
+
+config_load gluon-simple-tc
+
+
+tc_interface() {
+	local iface="$1"
+
+	config_get ifname "$iface" ifname
+
+	[ "$INTERFACE" = "$ifname" ] || return
+
+	config_get_bool enabled "$iface" enabled 0
+
+	[ "$enabled" -eq 1 ] || return
+
+	config_get limit_egress "$iface" limit_egress
+	config_get limit_ingress "$iface" limit_ingress
+
+	if [ "$limit_egress" ]; then
+		tc qdisc add dev "$INTERFACE" root tbf rate "${limit_egress}kbit" latency 50ms burst 2k
+	fi
+
+	if [ "$limit_ingress" ]; then
+		tc qdisc add dev "$INTERFACE" handle ffff: ingress
+		tc filter add dev "$INTERFACE" parent ffff: u32 match u8 00 00 at 0 police rate "${limit_ingress}kbit" burst 10k drop flowid :1
+	fi
+}
+
+config_foreach tc_interface 'interface'
diff --git a/package/gluon-simple-tc/files/etc/modules-boot.d/30-gluon-simple-tc b/package/gluon-simple-tc/files/etc/modules-boot.d/30-gluon-simple-tc
new file mode 120000
index 0000000000000000000000000000000000000000..44318d6ea823b4a9d4081929f2c12472dc368c48
--- /dev/null
+++ b/package/gluon-simple-tc/files/etc/modules-boot.d/30-gluon-simple-tc
@@ -0,0 +1 @@
+../modules.d/30-gluon-simple-tc
\ No newline at end of file
diff --git a/package/gluon-simple-tc/files/etc/modules.d/30-gluon-simple-tc b/package/gluon-simple-tc/files/etc/modules.d/30-gluon-simple-tc
new file mode 100644
index 0000000000000000000000000000000000000000..87cb79f9a7af7f34c3f9358146d3ae61e55038d3
--- /dev/null
+++ b/package/gluon-simple-tc/files/etc/modules.d/30-gluon-simple-tc
@@ -0,0 +1,4 @@
+sch_ingress
+sch_tbf
+cls_u32
+act_police