diff --git a/controller/ofctrl.c b/controller/ofctrl.c
index c6b1272ba..7aac0128b 100644
--- a/controller/ofctrl.c
+++ b/controller/ofctrl.c
@@ -675,13 +675,11 @@ run_S_CLEAR_FLOWS(void)
     /* Clear existing groups, to match the state of the switch. */
     if (groups) {
         ovn_extend_table_clear(groups, true);
-        ovn_extend_table_reinit(groups, ovs_feature_max_select_groups_get());
     }
 
     /* Clear existing meters, to match the state of the switch. */
     if (meters) {
         ovn_extend_table_clear(meters, true);
-        ovn_extend_table_reinit(meters, ovs_feature_max_meters_get());
         ofctrl_meter_bands_clear();
     }
 
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 44605eb4e..98d95b1f3 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -5654,6 +5654,14 @@ main(int argc, char *argv[])
                                            br_int ? br_int->name : NULL)) {
                 VLOG_INFO("OVS feature set changed, force recompute.");
                 engine_set_force_recompute(true);
+                if (ovs_feature_set_discovered()) {
+                    lflow_output_data =
+                        engine_get_internal_data(&en_lflow_output);
+                    ovn_extend_table_reinit(&lflow_output_data->group_table,
+                                        ovs_feature_max_select_groups_get());
+                    ovn_extend_table_reinit(&lflow_output_data->meter_table,
+                                            ovs_feature_max_meters_get());
+                }
             }
 
             if (br_int && ovs_feature_set_discovered()) {
diff --git a/lib/extend-table.c b/lib/extend-table.c
index 7f2358778..87828772c 100644
--- a/lib/extend-table.c
+++ b/lib/extend-table.c
@@ -47,6 +47,7 @@ ovn_extend_table_init(struct ovn_extend_table *table, const char *table_name,
 void
 ovn_extend_table_reinit(struct ovn_extend_table *table, uint32_t n_ids)
 {
+    ovn_extend_table_clear(table, true);
     if (n_ids != table->n_ids) {
         id_pool_destroy(table->table_ids);
         table->table_ids = id_pool_create(1, n_ids);
diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
index 5acb380db..1f826b21c 100644
--- a/tests/ovn-controller.at
+++ b/tests/ovn-controller.at
@@ -2202,6 +2202,10 @@ OVS_APP_EXIT_AND_WAIT([ovn-controller])
 # The old OVS flows should remain (this is regardless of the configuration)
 AT_CHECK([ovs-ofctl dump-flows br-int | grep 10.1.2.3], [0], [ignore])
 
+# We should have 2 flows with groups
+AT_CHECK([ovs-ofctl dump-flows br-int | grep group | wc -l], [0], [2
+])
+
 # Make a change to the ls1-lp1's IP
 check ovn-nbctl --wait=sb lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.1.2.4"
 
@@ -2214,10 +2218,18 @@ sleep 2
 lflow_run_1=$(ovn-appctl -t ovn-controller coverage/read-counter lflow_run)
 AT_CHECK([ovs-ofctl dump-flows br-int | grep 10.1.2.3], [0], [ignore])
 
+# We should have 2 flows with groups
+AT_CHECK([ovs-ofctl dump-flows br-int | grep group | wc -l], [0], [2
+])
+
 sleep 5
 
 # Check after the wait
 OVS_WAIT_UNTIL([ovs-ofctl dump-flows br-int | grep 10.1.2.4])
+
+# We should have 2 flows with groups
+AT_CHECK([ovs-ofctl dump-flows br-int | grep group | wc -l], [0], [2
+])
 lflow_run_2=$(ovn-appctl -t ovn-controller coverage/read-counter lflow_run)
 
 # Verify that the flow compute completed during the wait (after the wait it
@@ -2230,7 +2242,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
 start_daemon ovs-vswitchd --enable-dummy=system -vvconn -vofproto_dpif -vunixctl
 OVS_WAIT_UNTIL([ovs-ofctl dump-flows br-int | grep 10.1.2.4])
 
-check ovn-nbctl --wait=hv lb-add lb3 2.2.2.2 10.1.2.5 \
+check ovn-nbctl --wait=hv lb-add lb3 3.3.3.3 10.1.2.5 \
 -- ls-lb-add ls1 lb3
 
 # There should be 3 group IDs allocated (this is to ensure the group ID
@@ -2238,6 +2250,10 @@ check ovn-nbctl --wait=hv lb-add lb3 2.2.2.2 10.1.2.5 \
 AT_CHECK([ovn-appctl -t ovn-controller group-table-list | awk '{print $2}' | sort | uniq | wc -l], [0], [3
 ])
 
+# We should have 3 flows with groups
+AT_CHECK([ovs-ofctl dump-flows br-int | grep group | wc -l], [0], [3
+])
+
 OVN_CLEANUP([hv1])
 AT_CLEANUP
 
