diff --git a/test/int/test_replication.py b/test/int/test_replication.py
index 38cecd0b362098a5f48e13157c896174acce29f1..a8741c0dadb192954212451b1788670ac198bac8 100644
--- a/test/int/test_replication.py
+++ b/test/int/test_replication.py
@@ -165,3 +165,41 @@ def test_bucket_rebalancing(cluster: Cluster):
 
     i3 = cluster.add_instance()
     wait_has_buckets(i3, 1000)
+
+
+def test_bucket_rebalancing_respects_replication_factor(cluster: Cluster):
+    peer, *_ = cluster.deploy(instance_count=4, init_replication_factor=2)
+
+    # wait for buckets to be rebalanced between 2 replicasets 1500 each
+    for i in cluster.instances:
+        wait_has_buckets(i, 1500)
+
+    # check vshard routes requests to both replicasets
+    reached_instances = set()
+    for bucket_id in [1, 3000]:
+        info = peer.call("vshard.router.callro", bucket_id, "picolib.peer_info")
+        reached_instances.add(info["instance_id"])
+    assert len(reached_instances) == 2
+
+    # add an instance to a new replicaset
+    i5 = cluster.add_instance(wait_online=True)
+
+    # buckets do not start rebalancing until new replicaset is full
+    wait_has_buckets(i5, 0)
+    for i in cluster.instances:
+        if i.instance_id != i5.instance_id:
+            wait_has_buckets(i, 1500)
+
+    # add another instance to new replicaset, it's now full
+    cluster.add_instance(wait_online=True)
+
+    # buckets now must be rebalanced between 3 replicasets 1000 each
+    for i in cluster.instances:
+        wait_has_buckets(i, 1000)
+
+    # check vshard routes requests to all 3 replicasets
+    reached_instances = set()
+    for bucket_id in [1, 1500, 3000]:
+        info = peer.call("vshard.router.callro", bucket_id, "picolib.peer_info")
+        reached_instances.add(info["instance_id"])
+    assert len(reached_instances) == 3