diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpLinkAttrMaxLinkBandwidthTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpLinkAttrMaxLinkBandwidthTest.java
deleted file mode 100644
index e2ec877..0000000
--- a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpLinkAttrMaxLinkBandwidthTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2015-present 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.bgp;
-
-import org.junit.Test;
-import org.onosproject.bgpio.types.attr.BgpLinkAttrMaxLinkBandwidth;
-
-import com.google.common.testing.EqualsTester;
-
-/**
- * Test for BGP link max bandwidth attribute.
- */
-public class BgpLinkAttrMaxLinkBandwidthTest {
-    private final float val = 0x010203;
-    private final short valLen = 3;
-    private final float val1 = 0x01020304;
-    private final short val1Len = 4;
-
-    private final BgpLinkAttrMaxLinkBandwidth data = BgpLinkAttrMaxLinkBandwidth
-            .of(val, valLen);
-    private final BgpLinkAttrMaxLinkBandwidth sameAsData = BgpLinkAttrMaxLinkBandwidth
-            .of(val, valLen);
-    private final BgpLinkAttrMaxLinkBandwidth diffData = BgpLinkAttrMaxLinkBandwidth
-            .of(val1, val1Len);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(data, sameAsData)
-        .addEqualityGroup(diffData).testEquals();
-    }
-}
\ No newline at end of file
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpLinkAttrTeDefaultMetricTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpLinkAttrTeDefaultMetricTest.java
deleted file mode 100644
index 1aeb5bf..0000000
--- a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpLinkAttrTeDefaultMetricTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2015-present 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.bgp;
-
-import org.junit.Test;
-import org.onosproject.bgpio.types.attr.BgpLinkAttrTeDefaultMetric;
-
-import com.google.common.testing.EqualsTester;
-
-/**
- * Test for BGP link TE default metric attribute.
- */
-public class BgpLinkAttrTeDefaultMetricTest {
-    private final int val = 0x010203;
-    private final int val1 = 0x01020304;
-
-    private final BgpLinkAttrTeDefaultMetric data = BgpLinkAttrTeDefaultMetric
-            .of(val);
-    private final BgpLinkAttrTeDefaultMetric sameAsData = BgpLinkAttrTeDefaultMetric
-            .of(val);
-    private final BgpLinkAttrTeDefaultMetric diffData = BgpLinkAttrTeDefaultMetric
-            .of(val1);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(data, sameAsData)
-                .addEqualityGroup(diffData).testEquals();
-    }
-}
\ No newline at end of file
diff --git a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpPrefixAttrOpaqueDataTest.java b/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpPrefixAttrOpaqueDataTest.java
deleted file mode 100644
index 3bc3157..0000000
--- a/protocols/bgp/bgpio/src/test/java/org/onosproject/bgp/BgpPrefixAttrOpaqueDataTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2015-present 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.bgp;
-
-import org.junit.Test;
-import org.onosproject.bgpio.types.attr.BgpPrefixAttrOpaqueData;
-
-import com.google.common.testing.EqualsTester;
-
-/**
- * Test for prefix attribute opaque data Tlv.
- */
-public class BgpPrefixAttrOpaqueDataTest {
-    private final byte[] array = new byte[] {0x01, 0x02, 0x03, 0x04};
-    private final byte[] array1 = new byte[] {0x01, 0x02, 0x03, 0x01};
-
-    private final BgpPrefixAttrOpaqueData isisData = BgpPrefixAttrOpaqueData
-            .of(array);
-    private final BgpPrefixAttrOpaqueData sameAsIsisData = BgpPrefixAttrOpaqueData
-            .of(array);
-    private final BgpPrefixAttrOpaqueData isisDiff = BgpPrefixAttrOpaqueData
-            .of(array1);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(isisData, sameAsIsisData)
-                .addEqualityGroup(isisDiff).testEquals();
-    }
-}
\ No newline at end of file
