diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java
new file mode 100644
index 0000000..79182da
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2021-present Open Networking Foundation
+ *
+ * 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.kubevirtnetworking.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.hamcrest.MatcherAssert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.MockCodecContext;
+import org.onosproject.core.CoreService;
+import org.onosproject.kubevirtnetworking.api.DefaultKubevirtFloatingIp;
+import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onosproject.kubevirtnetworking.codec.KubevirtFloatingIpJsonMatcher.matchesKubevirtFloatingIp;
+import static org.onosproject.net.NetTestTools.APP_ID;
+
+/**
+ * Unit tests for KubevirtFloatingIp codec.
+ */
+public final class KubevirtFloatingIpCodecTest {
+
+    MockCodecContext context;
+
+    JsonCodec<KubevirtFloatingIp> kubevirtFloatingIpCodec;
+
+    final CoreService mockCoreService = createMock(CoreService.class);
+    private static final String REST_APP_ID = "org.onosproject.rest";
+
+    @Before
+    public void setUp() {
+        context = new MockCodecContext();
+        kubevirtFloatingIpCodec = new KubevirtFloatingIpCodec();
+
+        assertThat(kubevirtFloatingIpCodec, notNullValue());
+        expect(mockCoreService.registerApplication(REST_APP_ID))
+                .andReturn(APP_ID).anyTimes();
+        replay(mockCoreService);
+        context.registerService(CoreService.class, mockCoreService);
+    }
+
+    /**
+     * Tests the kubevirt floating IP encoding.
+     */
+    @Test
+    public void testKubevirtFloatingIpEncode() {
+        KubevirtFloatingIp floatingIp = DefaultKubevirtFloatingIp.builder()
+                .id("fip-id")
+                .routerName("router-1")
+                .floatingIp(IpAddress.valueOf("10.10.10.10"))
+                .podName("pod-1")
+                .fixedIp(IpAddress.valueOf("20.20.20.20"))
+                .build();
+
+        ObjectNode floatingIpJson = kubevirtFloatingIpCodec.encode(floatingIp, context);
+        assertThat(floatingIpJson, matchesKubevirtFloatingIp(floatingIp));
+    }
+
+    @Test
+    public void testKubevirtFloatingIpDecode() throws IOException {
+        KubevirtFloatingIp floatingIp = getKubevirtFloatingIp("KubevirtFloatingIp.json");
+
+        assertEquals("fip-1", floatingIp.id());
+        assertEquals("router-1", floatingIp.routerName());
+        assertEquals("10.10.10.10", floatingIp.floatingIp().toString());
+        assertEquals("pod-1", floatingIp.podName());
+        assertEquals("20.20.20.20", floatingIp.fixedIp().toString());
+    }
+
+    private KubevirtFloatingIp getKubevirtFloatingIp(String resourceName) throws IOException {
+        InputStream jsonStream = KubevirtFloatingIpCodecTest.class.getResourceAsStream(resourceName);
+        JsonNode json = context.mapper().readTree(jsonStream);
+        MatcherAssert.assertThat(json, notNullValue());
+        KubevirtFloatingIp fip = kubevirtFloatingIpCodec.decode((ObjectNode) json, context);
+        assertThat(fip, notNullValue());
+        return fip;
+    }
+}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java
new file mode 100644
index 0000000..0bcfa0a
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2021-present Open Networking Foundation
+ *
+ * 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.kubevirtnetworking.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
+
+/**
+ * Hamcrest matcher for kubevirt router interface.
+ */
+public final class KubevirtFloatingIpJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private final KubevirtFloatingIp floatingIp;
+    private static final String ID = "id";
+    private static final String ROUTER_NAME = "routerName";
+    private static final String POD_NAME = "podName";
+    private static final String FLOATING_IP = "floatingIp";
+    private static final String FIXED_IP = "fixedIp";
+
+    private KubevirtFloatingIpJsonMatcher(KubevirtFloatingIp floatingIp) {
+        this.floatingIp = floatingIp;
+    }
+
+    @Override
+    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+
+        // check ID
+        String jsonId = jsonNode.get(ID).asText();
+        String id = floatingIp.id();
+        if (!jsonId.equals(id)) {
+            description.appendText("ID was " + jsonId);
+            return false;
+        }
+
+        // check router name
+        String jsonRouterName = jsonNode.get(ROUTER_NAME).asText();
+        String routerName = floatingIp.routerName();
+        if (!jsonRouterName.equals(routerName)) {
+            description.appendText("Router name was " + jsonRouterName);
+            return false;
+        }
+
+        // check floating IP
+        String jsonFip = jsonNode.get(FLOATING_IP).asText();
+        String fip = floatingIp.floatingIp().toString();
+        if (!jsonFip.equals(fip)) {
+            description.appendText("Floating IP was " + jsonFip);
+            return false;
+        }
+
+        // check POD name
+        JsonNode jsonPodName = jsonNode.get(POD_NAME);
+        if (jsonPodName != null) {
+            if (!floatingIp.podName().equals(jsonPodName.asText())) {
+                description.appendText("POD name was " + jsonPodName);
+                return false;
+            }
+        }
+
+        // check fixed IP
+        JsonNode jsonFixedIp = jsonNode.get(FIXED_IP);
+        if (jsonFixedIp != null) {
+            if (!floatingIp.fixedIp().toString().equals(jsonFixedIp.asText())) {
+                description.appendText("Fixed IP was " + jsonFixedIp);
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText(floatingIp.toString());
+    }
+
+    /**
+     * Factory to allocate a kubevirt floating IP matcher.
+     *
+     * @param fip kubevirt floating IP object we are looking for
+     * @return matcher
+     */
+    public static KubevirtFloatingIpJsonMatcher matchesKubevirtFloatingIp(KubevirtFloatingIp fip) {
+        return new KubevirtFloatingIpJsonMatcher(fip);
+    }
+}
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java
index 8a7e553..2bc222e 100644
--- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/impl/KubevirtRouterManagerTest.java
@@ -29,7 +29,9 @@
 import org.onosproject.core.CoreServiceAdapter;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.event.Event;
+import org.onosproject.kubevirtnetworking.api.DefaultKubevirtFloatingIp;
 import org.onosproject.kubevirtnetworking.api.DefaultKubevirtRouter;
+import org.onosproject.kubevirtnetworking.api.KubevirtFloatingIp;
 import org.onosproject.kubevirtnetworking.api.KubevirtPeerRouter;
 import org.onosproject.kubevirtnetworking.api.KubevirtRouter;
 import org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent;
@@ -41,6 +43,11 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_ASSOCIATED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_CREATED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_DISASSOCIATED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_REMOVED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_UPDATED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_CREATED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_REMOVED;
 import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_UPDATED;
@@ -53,10 +60,13 @@
     private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
 
     private static final String ROUTER_NAME = "router-1";
+    private static final String POD_NAME = "pod-1";
     private static final String UPDATED_DESCRIPTION = "router-updated";
-
     private static final MacAddress UPDATED_MAC = MacAddress.valueOf("FF:FF:FF:FF:FF:FF");
 
+    private static final String FLOATING_IP_ID = "fip-1";
+    private static final String UNKNOWN_ID = "unknown";
+
     private static final KubevirtRouter ROUTER = DefaultKubevirtRouter.builder()
             .name(ROUTER_NAME)
             .description(ROUTER_NAME)
@@ -77,6 +87,20 @@
                     MacAddress.valueOf("11:22:33:44:55:66")))
             .build();
 
+    private static final KubevirtFloatingIp FLOATING_IP_DISASSOCIATED = DefaultKubevirtFloatingIp.builder()
+            .id(FLOATING_IP_ID)
+            .routerName(ROUTER_NAME)
+            .floatingIp(IpAddress.valueOf("10.10.10.10"))
+            .build();
+
+    private static final KubevirtFloatingIp FLOATING_IP_ASSOCIATED = DefaultKubevirtFloatingIp.builder()
+            .id(FLOATING_IP_ID)
+            .routerName(ROUTER_NAME)
+            .floatingIp(IpAddress.valueOf("10.10.10.10"))
+            .fixedIp(IpAddress.valueOf("20.20.20.20"))
+            .podName(POD_NAME)
+            .build();
+
     private final TestKubevirtRouterListener testListener = new TestKubevirtRouterListener();
 
     private KubevirtRouterManager target;
@@ -202,10 +226,140 @@
         target.updateRouter(null);
     }
 
+    /**
+     * Tests if getting all floating IPs returns the correct set of floating IPs.
+     */
+    @Test
+    public void testGetFloatingIps() {
+        createBasicFloatingIpDisassociated();
+        assertEquals("Number of floating IPs did not match", 1, target.floatingIps().size());
+    }
+
+    /**
+     * Tests if getting a floating IP with ID returns the correct floating IP.
+     */
+    @Test
+    public void testGetFloatingIpById() {
+        createBasicFloatingIpDisassociated();
+        assertNotNull("Floating IP did not match", target.floatingIp(FLOATING_IP_ID));
+        assertNull("Floating IP did not match", target.floatingIp(UNKNOWN_ID));
+    }
+
+    /**
+     * Tests if getting a floating IP with POD name returns the correct floating IP.
+     */
+    @Test
+    public void testGetFloatingIpByPodName() {
+        createBasicFloatingIpAssociated();
+        assertNotNull("Floating IP did not match", target.floatingIpByPodName(POD_NAME));
+        assertNull("Floating IP did not match", target.floatingIpByPodName(UNKNOWN_ID));
+    }
+
+    /**
+     * Tests if getting floating IPs with router name returns the correct floating IPs.
+     */
+    @Test
+    public void testGetFloatingIpsByRouterName() {
+        createBasicFloatingIpDisassociated();
+        assertEquals("Number of floating IPs did not match", 1,
+                target.floatingIpsByRouter(ROUTER_NAME).size());
+    }
+
+    /**
+     * Tests creating and removing a floating IP, and checks if it triggers proper events.
+     */
+    @Test
+    public void testCreateAndRemoveFloatingIp() {
+        target.createFloatingIp(FLOATING_IP_DISASSOCIATED);
+        assertEquals("Number of floating IP did not match", 1, target.floatingIps().size());
+        assertNotNull("Floating IP was not created", target.floatingIp(FLOATING_IP_ID));
+
+        target.removeFloatingIp(FLOATING_IP_ID);
+        assertEquals("Number of floating IP did not match", 0, target.floatingIps().size());
+        assertNull("Floating IP was not created", target.floatingIp(FLOATING_IP_ID));
+
+        validateEvents(KUBEVIRT_FLOATING_IP_CREATED, KUBEVIRT_FLOATING_IP_REMOVED);
+    }
+
+    /**
+     * Tests associating a floating IP, and checks if it triggers proper events.
+     */
+    @Test
+    public void testAssociateFloatingIp() {
+        target.createFloatingIp(FLOATING_IP_DISASSOCIATED);
+        assertEquals("Number of floating IP did not match", 1, target.floatingIps().size());
+        assertNotNull("Floating IP was not created", target.floatingIp(FLOATING_IP_ID));
+
+        target.updateFloatingIp(FLOATING_IP_ASSOCIATED);
+        assertEquals("Number of floating IP did not match", 1, target.floatingIps().size());
+        assertNotNull("Floating IP was not created", target.floatingIp(FLOATING_IP_ID));
+
+        validateEvents(KUBEVIRT_FLOATING_IP_CREATED, KUBEVIRT_FLOATING_IP_UPDATED,
+                KUBEVIRT_FLOATING_IP_ASSOCIATED);
+    }
+
+    /**
+     * Tests disassociating a floating IP, and checks if it triggers proper events.
+     */
+    @Test
+    public void testDisassociateFloatingIp() {
+        target.createFloatingIp(FLOATING_IP_ASSOCIATED);
+        assertEquals("Number of floating IP did not match", 1, target.floatingIps().size());
+        assertNotNull("Floating IP was not created", target.floatingIp(FLOATING_IP_ID));
+
+        target.updateFloatingIp(FLOATING_IP_DISASSOCIATED);
+        assertEquals("Number of floating IP did not match", 1, target.floatingIps().size());
+        assertNotNull("Floating IP was not created", target.floatingIp(FLOATING_IP_ID));
+
+        validateEvents(KUBEVIRT_FLOATING_IP_CREATED, KUBEVIRT_FLOATING_IP_UPDATED,
+                KUBEVIRT_FLOATING_IP_DISASSOCIATED);
+    }
+
+    /**
+     * Tests if creating a null floating IP fails with an exception.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testCreateNullFloatingIp() {
+        target.createFloatingIp(null);
+    }
+
+    /**
+     * Tests if creating a duplicate floating IP fails with an exception.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateDuplicateFloatingIp() {
+        target.createFloatingIp(FLOATING_IP_ASSOCIATED);
+        target.createFloatingIp(FLOATING_IP_DISASSOCIATED);
+    }
+
+    /**
+     * Tests if removing floating IP with null ID fails with an exception.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveFloatingIpWithNull() {
+        target.removeFloatingIp(null);
+    }
+
+    /**
+     * Tests if updating an unregistered floating IP fails with an exception.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testUpdateUnregisteredFloatingIp() {
+        target.updateFloatingIp(FLOATING_IP_ASSOCIATED);
+    }
+
     private void createBasicRouters() {
         target.createRouter(ROUTER);
     }
 
+    private void createBasicFloatingIpDisassociated() {
+        target.createFloatingIp(FLOATING_IP_DISASSOCIATED);
+    }
+
+    private void createBasicFloatingIpAssociated() {
+        target.createFloatingIp(FLOATING_IP_ASSOCIATED);
+    }
+
     private static class TestCoreService extends CoreServiceAdapter {
 
         @Override
