diff --git a/patches/packages/to-upstream/0001-firewall-accept-and-drop-chains-added-option-to-set-.patch b/patches/packages/to-upstream/0001-firewall-accept-and-drop-chains-added-option-to-set-.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cb61a271ad75931910ff86e8597775b2c13e2b01
--- /dev/null
+++ b/patches/packages/to-upstream/0001-firewall-accept-and-drop-chains-added-option-to-set-.patch
@@ -0,0 +1,245 @@
+From d2205f8c9b36516bcbcd7e3b1a018638dd277fa3 Mon Sep 17 00:00:00 2001
+From: Stepan Henek <stepan.henek@nic.cz>
+Date: Tue, 12 Jun 2018 14:36:58 +0200
+Subject: [PATCH] firewall: accept and drop chains added + option to set uci
+ config directory added
+
+---
+ .../01-accept-and-reject-chains-added.patch   | 160 ++++++++++++++++++
+ .../02-uci_config_dir-option-added.patch      |  57 +++++++
+ 2 files changed, 217 insertions(+)
+ create mode 100644 package/network/config/firewall/patches/01-accept-and-reject-chains-added.patch
+ create mode 100644 package/network/config/firewall/patches/02-uci_config_dir-option-added.patch
+
+diff --git a/package/network/config/firewall/patches/01-accept-and-reject-chains-added.patch b/package/network/config/firewall/patches/01-accept-and-reject-chains-added.patch
+new file mode 100644
+index 0000000000..1a3970b58e
+--- /dev/null
++++ b/package/network/config/firewall/patches/01-accept-and-reject-chains-added.patch
+@@ -0,0 +1,160 @@
++diff --git a/defaults.c b/defaults.c
++index 11fbf0d..d252301 100644
++--- a/defaults.c
+++++ b/defaults.c
++@@ -24,6 +24,8 @@
++ 
++ static const struct fw3_chain_spec default_chains[] = {
++ 	C(ANY, FILTER, UNSPEC,        "reject"),
+++	C(ANY, FILTER, UNSPEC,        "accept"),
+++	C(ANY, FILTER, UNSPEC,        "drop"),
++ 	C(ANY, FILTER, CUSTOM_CHAINS, "input_rule"),
++ 	C(ANY, FILTER, CUSTOM_CHAINS, "output_rule"),
++ 	C(ANY, FILTER, CUSTOM_CHAINS, "forwarding_rule"),
++@@ -286,6 +288,14 @@ fw3_print_default_head_rules(struct fw3_ipt_handle *handle,
++ 		fw3_ipt_rule_addarg(r, false, "--reject-with", "port-unreach");
++ 		fw3_ipt_rule_append(r, "reject");
++ 
+++		r = fw3_ipt_rule_new(handle);
+++		fw3_ipt_rule_target(r, "ACCEPT");
+++		fw3_ipt_rule_append(r, "accept");
+++
+++		r = fw3_ipt_rule_new(handle);
+++		fw3_ipt_rule_target(r, "DROP");
+++		fw3_ipt_rule_append(r, "drop");
+++
++ 		break;
++ 
++ 	case FW3_TABLE_NAT:
++@@ -308,48 +318,47 @@ fw3_print_default_head_rules(struct fw3_ipt_handle *handle,
++ 	}
++ }
++ 
+++static inline void prepare_tails(struct fw3_ipt_handle *handle,
+++								 const char* base_chain_name, enum fw3_flag target_flag) {
+++	char *target_chain_name = NULL;
+++
+++	switch (target_flag) {
+++		case FW3_FLAG_REJECT:
+++			target_chain_name = "reject";
+++			break;
+++		case FW3_FLAG_DROP:
+++			target_chain_name = "drop";
+++			break;
+++		case FW3_FLAG_ACCEPT:
+++			target_chain_name = "accept";
+++			break;
+++		default:
+++			return;
+++	}
+++
+++	struct fw3_ipt_rule *r;
+++	r = fw3_ipt_rule_new(handle);
+++
+++	if (!r)
+++		return;
+++
+++	fw3_ipt_rule_target(r, target_chain_name);
+++	fw3_ipt_rule_append(r, base_chain_name);
+++
+++}
+++
++ void
++ fw3_print_default_tail_rules(struct fw3_ipt_handle *handle,
++                              struct fw3_state *state, bool reload)
++ {
++ 	struct fw3_defaults *defs = &state->defaults;
++-	struct fw3_ipt_rule *r;
++ 
++ 	if (handle->table != FW3_TABLE_FILTER)
++ 		return;
++ 
++-	if (defs->policy_input == FW3_FLAG_REJECT)
++-	{
++-		r = fw3_ipt_rule_new(handle);
++-
++-		if (!r)
++-			return;
++-
++-		fw3_ipt_rule_target(r, "reject");
++-		fw3_ipt_rule_append(r, "INPUT");
++-	}
++-
++-	if (defs->policy_output == FW3_FLAG_REJECT)
++-	{
++-		r = fw3_ipt_rule_new(handle);
++-
++-		if (!r)
++-			return;
++-
++-		fw3_ipt_rule_target(r, "reject");
++-		fw3_ipt_rule_append(r, "OUTPUT");
++-	}
++-
++-	if (defs->policy_forward == FW3_FLAG_REJECT)
++-	{
++-		r = fw3_ipt_rule_new(handle);
++-
++-		if (!r)
++-			return;
++-
++-		fw3_ipt_rule_target(r, "reject");
++-		fw3_ipt_rule_append(r, "FORWARD");
++-	}
+++	prepare_tails(handle, "INPUT", defs->policy_input);
+++	prepare_tails(handle, "OUTPUT", defs->policy_output);
+++	prepare_tails(handle, "FORWARD", defs->policy_forward);
++ }
++ 
++ static void
++diff --git a/rules.c b/rules.c
++index 5e1d5f3..a62aae4 100644
++--- a/rules.c
+++++ b/rules.c
++@@ -377,10 +377,14 @@ static void set_target(struct fw3_ipt_rule *r, struct fw3_rule *rule)
++ 		fw3_ipt_rule_target(r, "zone_%s_dest_%s", rule->dest.name, name);
++ 	else if (need_src_action_chain(rule))
++ 		fw3_ipt_rule_target(r, "zone_%s_src_%s", rule->src.name, name);
++-	else if (strcmp(name, "REJECT"))
++-		fw3_ipt_rule_target(r, name);
++-	else
+++	else if (!strcmp(name, "REJECT"))
++ 		fw3_ipt_rule_target(r, "reject");
+++	else if (!strcmp(name, "ACCEPT"))
+++		fw3_ipt_rule_target(r, "accept");
+++	else if (!strcmp(name, "DROP"))
+++		fw3_ipt_rule_target(r, "drop");
+++	else
+++		fw3_ipt_rule_target(r, name);
++ }
++ 
++ static void
++diff --git a/zones.c b/zones.c
++index 505ab20..47cf85b 100644
++--- a/zones.c
+++++ b/zones.c
++@@ -421,7 +421,7 @@ print_interface_rule(struct fw3_ipt_handle *handle, struct fw3_state *state,
++ 	};
++ 
++ #define jump_target(t) \
++-	((t == FW3_FLAG_REJECT) ? "reject" : fw3_flag_names[t])
+++	((t == FW3_FLAG_DROP) ? "drop" : (t == FW3_FLAG_ACCEPT) ? "accept" : ((t == FW3_FLAG_REJECT) ? "reject" : fw3_flag_names[t]))
++ 
++ 	if (handle->table == FW3_TABLE_FILTER)
++ 	{
++@@ -637,13 +637,13 @@ print_zone_rule(struct fw3_ipt_handle *handle, struct fw3_state *state,
++ 			r = fw3_ipt_rule_new(handle);
++ 			fw3_ipt_rule_extra(r, "-m conntrack --ctstate DNAT");
++ 			fw3_ipt_rule_comment(r, "Accept port redirections");
++-			fw3_ipt_rule_target(r, fw3_flag_names[FW3_FLAG_ACCEPT]);
+++			fw3_ipt_rule_target(r, jump_target(FW3_FLAG_ACCEPT));
++ 			fw3_ipt_rule_append(r, "zone_%s_input", zone->name);
++ 
++ 			r = fw3_ipt_rule_new(handle);
++ 			fw3_ipt_rule_extra(r, "-m conntrack --ctstate DNAT");
++ 			fw3_ipt_rule_comment(r, "Accept port forwards");
++-			fw3_ipt_rule_target(r, fw3_flag_names[FW3_FLAG_ACCEPT]);
+++			fw3_ipt_rule_target(r, jump_target(FW3_FLAG_ACCEPT));
++ 			fw3_ipt_rule_append(r, "zone_%s_forward", zone->name);
++ 		}
++ 
+diff --git a/package/network/config/firewall/patches/02-uci_config_dir-option-added.patch b/package/network/config/firewall/patches/02-uci_config_dir-option-added.patch
+new file mode 100644
+index 0000000000..d1571600eb
+--- /dev/null
++++ b/package/network/config/firewall/patches/02-uci_config_dir-option-added.patch
+@@ -0,0 +1,57 @@
++diff --git a/main.c b/main.c
++index 1410fef..f2eaa5d 100644
++--- a/main.c
+++++ b/main.c
++@@ -38,6 +38,7 @@ static enum fw3_family print_family = FW3_FAMILY_ANY;
++ static struct fw3_state *run_state = NULL;
++ static struct fw3_state *cfg_state = NULL;
++ 
+++static char *uci_config_dir = "/etc/config/";
++ 
++ static bool
++ build_state(bool runtime)
++@@ -51,6 +52,7 @@ build_state(bool runtime)
++ 		error("Out of memory");
++ 
++ 	state->uci = uci_alloc_context();
+++	uci_set_confdir(state->uci, uci_config_dir);
++ 
++ 	if (!state->uci)
++ 		error("Out of memory");
++@@ -508,11 +510,11 @@ lookup_zone(const char *zone, const char *device)
++ static int
++ usage(void)
++ {
++-	fprintf(stderr, "fw3 [-4] [-6] [-q] print\n");
++-	fprintf(stderr, "fw3 [-q] {start|stop|flush|reload|restart}\n");
++-	fprintf(stderr, "fw3 [-q] network {net}\n");
++-	fprintf(stderr, "fw3 [-q] device {dev}\n");
++-	fprintf(stderr, "fw3 [-q] zone {zone} [dev]\n");
+++	fprintf(stderr, "fw3 [-u <uci_conf_dir>] [-4] [-6] [-q] print\n");
+++	fprintf(stderr, "fw3 [-u <uci_conf_dir>] [-q] {start|stop|flush|reload|restart}\n");
+++	fprintf(stderr, "fw3 [-u <uci_conf_dir>] [-q] network {net}\n");
+++	fprintf(stderr, "fw3 [-u <uci_conf_dir>] [-q] device {dev}\n");
+++	fprintf(stderr, "fw3 [-u <uci_conf_dir>] [-q] zone {zone} [dev]\n");
++ 
++ 	return 1;
++ }
++@@ -524,7 +526,7 @@ int main(int argc, char **argv)
++ 	enum fw3_family family = FW3_FAMILY_ANY;
++ 	struct fw3_defaults *defs = NULL;
++ 
++-	while ((ch = getopt(argc, argv, "46dqh")) != -1)
+++	while ((ch = getopt(argc, argv, "46dqu:h")) != -1)
++ 	{
++ 		switch (ch)
++ 		{
++@@ -544,6 +546,10 @@ int main(int argc, char **argv)
++ 			if (freopen("/dev/null", "w", stderr)) {}
++ 			break;
++ 
+++		case 'u':
+++			uci_config_dir = optarg;
+++			break;
+++
++ 		case 'h':
++ 			rv = usage();
++ 			goto out;
+-- 
+2.17.1
+