diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java
index 26c6a84..4d3cc6a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/ECHostStore.java
@@ -206,8 +206,9 @@
                 checkState(Objects.equals(hostId.vlanId(), existingHost.vlan()),
                         "Existing and new VLANs differ.");
 
-                Set<IpAddress> addresses = new HashSet<>(existingHost.ipAddresses());
+                Set<IpAddress> addresses = existingHost.ipAddresses();
                 if (addresses != null && addresses.contains(ipAddress)) {
+                    addresses = new HashSet<>(existingHost.ipAddresses());
                     addresses.remove(ipAddress);
                     return new DefaultHost(existingHost.providerId(),
                             hostId,
diff --git a/core/store/dist/src/test/java/org/onosproject/store/host/impl/ECHostStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/host/impl/ECHostStoreTest.java
new file mode 100644
index 0000000..a7077a8
--- /dev/null
+++ b/core/store/dist/src/test/java/org/onosproject/store/host/impl/ECHostStoreTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.store.host.impl;
+
+import junit.framework.TestCase;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.host.DefaultHostDescription;
+import org.onosproject.net.host.HostDescription;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.Timestamp;
+import org.onosproject.store.service.LogicalClockService;
+import org.onosproject.store.service.TestStorageService;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Tests for the ECHostStore.
+ */
+public class ECHostStoreTest extends TestCase {
+
+    private ECHostStore ecXHostStore;
+
+    private static final HostId HOSTID = HostId.hostId(MacAddress.valueOf("1a:1a:1a:1a:1a:1a"));
+
+    private static final IpAddress IP1 = IpAddress.valueOf("10.2.0.2");
+    private static final IpAddress IP2 = IpAddress.valueOf("10.2.0.3");
+
+    private static final ProviderId PID = new ProviderId("of", "foo");
+
+    @Before
+    public void setUp() {
+        ecXHostStore = new ECHostStore();
+
+        ecXHostStore.storageService = new TestStorageService();
+        ecXHostStore.clockService = new TestLogicalClockService();
+        ecXHostStore.activate();
+    }
+
+    @After
+    public void tearDown() {
+        ecXHostStore.deactivate();
+    }
+
+    /**
+     * Tests the removeIp method call.
+     */
+    @Test
+    public void testRemoveIp() {
+        Set<IpAddress> ips = new HashSet<>();
+        ips.add(IP1);
+        ips.add(IP2);
+
+        HostDescription description = new DefaultHostDescription(HOSTID.mac(),
+                                                                    HOSTID.vlanId(),
+                                                                    HostLocation.NONE,
+                                                                    ips);
+        ecXHostStore.createOrUpdateHost(PID, HOSTID, description, false);
+        ecXHostStore.removeIp(HOSTID, IP1);
+        Host host = ecXHostStore.getHost(HOSTID);
+
+        assertFalse(host.ipAddresses().contains(IP1));
+        assertTrue(host.ipAddresses().contains(IP2));
+    }
+
+    /**
+     * Mocks the LogicalClockService class.
+     */
+    class TestLogicalClockService implements LogicalClockService {
+        @Override
+        public Timestamp getTimestamp() {
+            return null;
+        }
+    }
+}
\ No newline at end of file
