--- a/defaults.c
+++ b/defaults.c
@@ -49,7 +49,7 @@ const struct fw3_option fw3_flag_opts[]
 	FW3_OPT("synflood_rate",       limit,    defaults, syn_flood_rate),
 	FW3_OPT("synflood_burst",      int,      defaults, syn_flood_rate.burst),
 	
-	FW3_OPT("fullcone",           bool,     defaults, fullcone),
+	FW3_OPT("fullcone",           int,     defaults, fullcone),
 	
 	FW3_OPT("tcp_syncookies",      bool,     defaults, tcp_syncookies),
 	FW3_OPT("tcp_ecn",             int,      defaults, tcp_ecn),
--- a/options.h
+++ b/options.h
@@ -98,6 +98,13 @@ enum fw3_reject_code
 	__FW3_REJECT_CODE_MAX
 };
 
+enum fullcone_code
+{
+	FULLCONE_DISABLED = 0,
+	FULLCONE_CHION = 1,
+	FULLCONE_BCM = 2,
+};
+
 extern const char *fw3_flag_names[__FW3_FLAG_MAX];
 
 
@@ -297,7 +304,7 @@ struct fw3_defaults
 	enum fw3_reject_code any_reject_code;
 
 	bool syn_flood;
-	bool fullcone;
+	int fullcone;
 	struct fw3_limit syn_flood_rate;
 
 	bool tcp_syncookies;
--- a/zones.c
+++ b/zones.c
@@ -757,7 +757,7 @@ print_zone_rule(struct fw3_ipt_handle *h
 					r = fw3_ipt_rule_new(handle);
 					fw3_ipt_rule_src_dest(r, msrc, mdest);
 					/*FIXME: Workaround for FULLCONE-NAT*/
-					if(defs->fullcone)
+					if(defs->fullcone == FULLCONE_CHION)
 					{
 						warn("%s will enable FULLCONE-NAT", zone->name);
 						fw3_ipt_rule_target(r, "FULLCONENAT");
@@ -767,6 +767,12 @@ print_zone_rule(struct fw3_ipt_handle *h
 						fw3_ipt_rule_target(r, "FULLCONENAT");
 						fw3_ipt_rule_append(r, "zone_%s_prerouting", zone->name);
 					}
+					else if (defs->fullcone == FULLCONE_BCM)
+					{
+						fw3_ipt_rule_target(r, "MASQUERADE");
+						fw3_ipt_rule_extra(r, "--mode fullcone");
+						fw3_ipt_rule_append(r, "zone_%s_postrouting", zone->name);
+					}
 					else
 					{
 						fw3_ipt_rule_target(r, "MASQUERADE");
