diff --git a/0001-northd-Fix-the-missing-force_snat_for_lb-flows-when-.patch b/0001-northd-Fix-the-missing-force_snat_for_lb-flows-when-.patch
new file mode 100644
index 0000000..d5effc8
--- /dev/null
+++ b/0001-northd-Fix-the-missing-force_snat_for_lb-flows-when-.patch
@@ -0,0 +1,406 @@
+From ec4f7228c1b828974ec2909bd108af6a94c3ebc9 Mon Sep 17 00:00:00 2001
+From: Numan Siddique ct_snat;
.
+
++ If the Gateway router is configured with
++ lb_force_snat_ip=router_ip
then for every logical router
++ port P attached to the Gateway router with the router ip
++ B, a priority-110 flow is added with the match
++ inport == P && ip4.dst == B
or
++ inport == P && ip6.dst == B
++ with an action ct_snat;
.
++
+ If the Gateway router has been configured to force SNAT any
+ previously load-balanced packets to B, a priority-100 flow
+diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
+index c1614d8fd..05541506d 100644
+--- a/northd/ovn-northd.c
++++ b/northd/ovn-northd.c
+@@ -8800,7 +8800,7 @@ get_force_snat_ip(struct ovn_datapath *od, const char *key_type,
+ static void
+ add_router_lb_flow(struct hmap *lflows, struct ovn_datapath *od,
+ struct ds *match, struct ds *actions, int priority,
+- bool lb_force_snat_ip, struct ovn_lb_vip *lb_vip,
++ bool force_snat_for_lb, struct ovn_lb_vip *lb_vip,
+ const char *proto, struct nbrec_load_balancer *lb,
+ struct shash *meter_groups, struct sset *nat_entries)
+ {
+@@ -8809,7 +8809,7 @@ add_router_lb_flow(struct hmap *lflows, struct ovn_datapath *od,
+
+ /* A match and actions for new connections. */
+ char *new_match = xasprintf("ct.new && %s", ds_cstr(match));
+- if (lb_force_snat_ip) {
++ if (force_snat_for_lb) {
+ char *new_actions = xasprintf("flags.force_snat_for_lb = 1; %s",
+ ds_cstr(actions));
+ ovn_lflow_add_with_hint(lflows, od, S_ROUTER_IN_DNAT, priority,
+@@ -8822,7 +8822,7 @@ add_router_lb_flow(struct hmap *lflows, struct ovn_datapath *od,
+
+ /* A match and actions for established connections. */
+ char *est_match = xasprintf("ct.est && %s", ds_cstr(match));
+- if (lb_force_snat_ip) {
++ if (force_snat_for_lb) {
+ ovn_lflow_add_with_hint(lflows, od, S_ROUTER_IN_DNAT, priority,
+ est_match,
+ "flags.force_snat_for_lb = 1; ct_dnat;",
+@@ -8899,7 +8899,7 @@ add_router_lb_flow(struct hmap *lflows, struct ovn_datapath *od,
+ ds_put_format(&undnat_match, ") && outport == %s && "
+ "is_chassis_resident(%s)", od->l3dgw_port->json_key,
+ od->l3redirect_port->json_key);
+- if (lb_force_snat_ip) {
++ if (force_snat_for_lb) {
+ ovn_lflow_add_with_hint(lflows, od, S_ROUTER_OUT_UNDNAT, 120,
+ ds_cstr(&undnat_match),
+ "flags.force_snat_for_lb = 1; ct_dnat;",
+@@ -9379,6 +9379,13 @@ build_lrouter_force_snat_flows_op(struct ovn_port *op,
+ ds_clear(match);
+ ds_clear(actions);
+
++ ds_put_format(match, "inport == %s && ip4.dst == %s",
++ op->json_key, op->lrp_networks.ipv4_addrs[0].addr_s);
++ ovn_lflow_add(lflows, op->od, S_ROUTER_IN_UNSNAT, 110,
++ ds_cstr(match), "ct_snat;");
++
++ ds_clear(match);
++
+ /* Higher priority rules to force SNAT with the router port ip.
+ * This only takes effect when the packet has already been
+ * load balanced once. */
+@@ -9404,6 +9411,13 @@ build_lrouter_force_snat_flows_op(struct ovn_port *op,
+ ds_clear(match);
+ ds_clear(actions);
+
++ ds_put_format(match, "inport == %s && ip6.dst == %s",
++ op->json_key, op->lrp_networks.ipv6_addrs[0].addr_s);
++ ovn_lflow_add(lflows, op->od, S_ROUTER_IN_UNSNAT, 110,
++ ds_cstr(match), "ct_snat;");
++
++ ds_clear(match);
++
+ /* Higher priority rules to force SNAT with the router port ip.
+ * This only takes effect when the packet has already been
+ * load balanced once. */
+@@ -11156,11 +11170,15 @@ build_lrouter_ipv4_ip_input(struct ovn_port *op,
+ * also a SNAT IP. Those are dropped later, in stage
+ * "lr_in_arp_resolve", if unSNAT was unsuccessful.
+ *
++ * If op->pd->lb_force_snat_router_ip is true, it means the IP of the
++ * router port is also SNAT IP.
++ *
+ * Priority 60.
+ */
+- build_lrouter_drop_own_dest(op, S_ROUTER_IN_IP_INPUT, 60, false,
+- lflows);
+-
++ if (!op->od->lb_force_snat_router_ip) {
++ build_lrouter_drop_own_dest(op, S_ROUTER_IN_IP_INPUT, 60, false,
++ lflows);
++ }
+ /* ARP / ND handling for external IP addresses.
+ *
+ * DNAT and SNAT IP addresses are external IP addresses that need ARP
+@@ -11860,8 +11878,10 @@ build_lrouter_nat_defrag_and_lb(struct ovn_datapath *od,
+ ds_put_format(match, " && is_chassis_resident(%s)",
+ od->l3redirect_port->json_key);
+ }
++ bool force_snat_for_lb =
++ lb_force_snat_ip || od->lb_force_snat_router_ip;
+ add_router_lb_flow(lflows, od, match, actions, prio,
+- lb_force_snat_ip, lb_vip, proto,
++ force_snat_for_lb, lb_vip, proto,
+ nb_lb, meter_groups, &nat_entries);
+ }
+ }
+diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
+index 3592c046d..11ca6e456 100644
+--- a/tests/ovn-northd.at
++++ b/tests/ovn-northd.at
+@@ -2577,11 +2577,21 @@ check ovn-nbctl lsp-set-type public-lr0 router
+ check ovn-nbctl lsp-set-addresses public-lr0 router
+ check ovn-nbctl lsp-set-options public-lr0 router-port=lr0-public
+
++check ovn-nbctl lb-add lb1 10.0.0.10:80 10.0.0.4:8080
++check ovn-nbctl lr-lb-add lr0 lb1
+ check ovn-nbctl set logical_router lr0 options:chassis=ch1
+
+ ovn-sbctl dump-flows lr0 > lr0flows
+ AT_CAPTURE_FILE([lr0flows])
+
++AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
++ table=5 (lr_in_unsnat ), priority=0 , match=(1), action=(next;)
++])
++
++AT_CHECK([grep "lr_in_dnat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
++])
++
++
+ AT_CHECK([grep "lr_out_snat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
+ ])
+
+@@ -2590,6 +2600,18 @@ check ovn-nbctl --wait=sb set logical_router lr0 options:lb_force_snat_ip="20.0.
+ ovn-sbctl dump-flows lr0 > lr0flows
+ AT_CAPTURE_FILE([lr0flows])
+
++
++AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
++ table=5 (lr_in_unsnat ), priority=0 , match=(1), action=(next;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(ip4 && ip4.dst == 20.0.0.4), action=(ct_snat;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(ip6 && ip6.dst == aef0::4), action=(ct_snat;)
++])
++
++AT_CHECK([grep "lr_in_dnat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
++ table=6 (lr_in_dnat ), priority=120 , match=(ct.est && ip && ip4.dst == 10.0.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_dnat;)
++ table=6 (lr_in_dnat ), priority=120 , match=(ct.new && ip && ip4.dst == 10.0.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb(backends=10.0.0.4:8080);)
++])
++
+ AT_CHECK([grep "lr_out_snat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
+ table=1 (lr_out_snat ), priority=100 , match=(flags.force_snat_for_lb == 1 && ip4), action=(ct_snat(20.0.0.4);)
+ table=1 (lr_out_snat ), priority=100 , match=(flags.force_snat_for_lb == 1 && ip6), action=(ct_snat(aef0::4);)
+@@ -2600,6 +2622,21 @@ check ovn-nbctl --wait=sb set logical_router lr0 options:lb_force_snat_ip="route
+ ovn-sbctl dump-flows lr0 > lr0flows
+ AT_CAPTURE_FILE([lr0flows])
+
++AT_CHECK([grep "lr_in_ip_input" lr0flows | grep "priority=60" | sort], [0], [dnl
++])
++
++AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
++ table=5 (lr_in_unsnat ), priority=0 , match=(1), action=(next;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-public" && ip4.dst == 172.168.0.100), action=(ct_snat;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-sw0" && ip4.dst == 10.0.0.1), action=(ct_snat;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-sw1" && ip4.dst == 20.0.0.1), action=(ct_snat;)
++])
++
++AT_CHECK([grep "lr_in_dnat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
++ table=6 (lr_in_dnat ), priority=120 , match=(ct.est && ip && ip4.dst == 10.0.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_dnat;)
++ table=6 (lr_in_dnat ), priority=120 , match=(ct.new && ip && ip4.dst == 10.0.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb(backends=10.0.0.4:8080);)
++])
++
+ AT_CHECK([grep "lr_out_snat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
+ table=1 (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-public"), action=(ct_snat(172.168.0.100);)
+ table=1 (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-sw0"), action=(ct_snat(10.0.0.1);)
+@@ -2611,6 +2648,10 @@ check ovn-nbctl --wait=sb remove logical_router lr0 options chassis
+ ovn-sbctl dump-flows lr0 > lr0flows
+ AT_CAPTURE_FILE([lr0flows])
+
++AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
++ table=5 (lr_in_unsnat ), priority=0 , match=(1), action=(next;)
++])
++
+ AT_CHECK([grep "lr_out_snat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
+ ])
+
+@@ -2620,6 +2661,19 @@ check ovn-nbctl --wait=sb add logical_router_port lr0-sw1 networks "bef0\:\:1/64
+ ovn-sbctl dump-flows lr0 > lr0flows
+ AT_CAPTURE_FILE([lr0flows])
+
++AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
++ table=5 (lr_in_unsnat ), priority=0 , match=(1), action=(next;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-public" && ip4.dst == 172.168.0.100), action=(ct_snat;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-sw0" && ip4.dst == 10.0.0.1), action=(ct_snat;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-sw1" && ip4.dst == 20.0.0.1), action=(ct_snat;)
++ table=5 (lr_in_unsnat ), priority=110 , match=(inport == "lr0-sw1" && ip6.dst == bef0::1), action=(ct_snat;)
++])
++
++AT_CHECK([grep "lr_in_dnat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
++ table=6 (lr_in_dnat ), priority=120 , match=(ct.est && ip && ip4.dst == 10.0.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_dnat;)
++ table=6 (lr_in_dnat ), priority=120 , match=(ct.new && ip && ip4.dst == 10.0.0.10 && tcp && tcp.dst == 80), action=(flags.force_snat_for_lb = 1; ct_lb(backends=10.0.0.4:8080);)
++])
++
+ AT_CHECK([grep "lr_out_snat" lr0flows | grep force_snat_for_lb | sort], [0], [dnl
+ table=1 (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-public"), action=(ct_snat(172.168.0.100);)
+ table=1 (lr_out_snat ), priority=110 , match=(flags.force_snat_for_lb == 1 && ip4 && outport == "lr0-sw0"), action=(ct_snat(10.0.0.1);)
+diff --git a/tests/system-ovn.at b/tests/system-ovn.at
+index f29234432..9819573bb 100644
+--- a/tests/system-ovn.at
++++ b/tests/system-ovn.at
+@@ -2224,6 +2224,144 @@ tcp,orig=(src=172.16.1.2,dst=192.168.2.2,sport=