diff --git a/neutron/agent/dhcp/agent.py b/neutron/agent/dhcp/agent.py
index d298d4f36f1..ee3c8e74263 100644
--- a/neutron/agent/dhcp/agent.py
+++ b/neutron/agent/dhcp/agent.py
@@ -221,21 +221,18 @@ class DhcpAgent(manager.Manager):
                 sid_subnets[subnet.get('segment_id')].append(subnet)
         if sid_subnets:
             ret = []
+
+            # TODO(sahid): This whole block bellow should be removed in future,
+            # when we know that all environements have migrated to at least
+            # zed.  This is expected to help for environements that already
+            # have deployed RPN. First, disable the dhcp agent for the
+            # network. Then the process will recreate it considering a dhcp
+            # agent per segmentation id.
+            if action in ['enable', 'disable']:
+                self._call_driver(
+                    'disable', network, segment=None, block=True)
+
             for seg_id, subnets in sid_subnets.items():
-
-                # TODO(sahid): This whole block bellow should be removed in
-                # future, when we know that all environements have migrated to
-                # at least zed.  This is expected to help for environements
-                # that already have deployed RPN.  For any first segment
-                # associated to a subnet we want to disable its dhcp
-                # agent. Then the process will recreate it considering a dhcp
-                # agent per segmentation id.
-                segment = sid_segment.get(seg_id)
-                if segment and segment.segment_index == 0:
-                    if action in ['enable', 'disable']:
-                        self._call_driver(
-                            'disable', network, segment=None, block=True)
-
                 net_seg = copy.deepcopy(network)
                 net_seg.subnets = subnets
                 ret.append(self._call_driver(
diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py
index d53cb5cbd8b..7ad51c764b8 100644
--- a/neutron/tests/unit/agent/dhcp/test_agent.py
+++ b/neutron/tests/unit/agent/dhcp/test_agent.py
@@ -373,6 +373,34 @@ class TestDhcpAgent(base.BaseTestCase):
                                             mock.ANY,
                                             None)
 
+    def test_call_driver_enable_with_segments(self):
+        seg0 = dhcp.DictModel(id='seg0', segment_index=0)
+        seg1 = dhcp.DictModel(id='seg1', segment_index=1)
+
+        sub0 = dhcp.DictModel(id='sub0', segment_id=seg0.id)
+        sub1 = dhcp.DictModel(id='sub1', segment_id=seg1.id)
+
+        network = dhcp.NetModel(
+            id=FAKE_NETWORK_UUID,
+            project_id=FAKE_PROJECT_ID,
+            admin_state_up=True,
+            subnets=[sub0, sub1],
+            # We don't know order of segments stored.
+            segments=[seg1, seg0])
+
+        agent = dhcp_agent.DhcpAgent(cfg.CONF)
+        with mock.patch.object(agent,
+                               '_call_driver') as _call_driver:
+            self.assertTrue(agent.call_driver('enable', network))
+            # The public function call_driver() is calling the private
+            # _call_driver().
+            _call_driver.assert_has_calls([
+                mock.call("disable", network, segment=None, block=True),
+                # It is not possible to assert on 'network' as there is a copy
+                # happening. The copy will be removed, see bug #2051729.
+                mock.call("enable", mock.ANY, segment=seg0),
+                mock.call("enable", mock.ANY, segment=seg1)])
+
     def test_call_driver_no_network(self):
         network = None
         dhcp = dhcp_agent.DhcpAgent(cfg.CONF)