diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapDeserializer.java b/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapDeserializer.java
index 2a3a64c..5bb1dac 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapDeserializer.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapDeserializer.java
@@ -26,7 +26,6 @@
 import org.codehaus.jackson.map.ObjectMapper;
 
 import java.io.IOException;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
diff --git a/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapSerializer.java b/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapSerializer.java
index c2ea824..3e9f5c6 100644
--- a/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapSerializer.java
+++ b/adapters/mso-adapters-rest-interface/src/main/java/org/openecomp/mso/adapters/json/MapSerializer.java
@@ -19,7 +19,6 @@
  */
 package org.openecomp.mso.adapters.json;
 
-import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.map.JsonSerializer;
 import org.codehaus.jackson.map.SerializerProvider;
@@ -47,12 +46,9 @@
 public class MapSerializer extends JsonSerializer<Map<String, String>> {
 	@Override
 	public void serialize(Map<String, String> map, JsonGenerator jsonGenerator,
-			SerializerProvider serializerProvider) throws IOException,
-			JsonGenerationException {
-
+			SerializerProvider serializerProvider) throws IOException {
 		jsonGenerator.writeStartObject();
 		jsonGenerator.writeArrayFieldStart("entry");
-
 		for (Map.Entry<String,String> entry : map.entrySet()) {
 			String key = entry.getKey();
 			String value = entry.getValue();
@@ -61,7 +57,6 @@
 			jsonGenerator.writeStringField("value", value);
 			jsonGenerator.writeEndObject();
 		}
-
 		jsonGenerator.writeEndArray();
 		jsonGenerator.writeEndObject();
 	}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/AdapterRestInterfaceTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/AdapterRestInterfaceTest.java
deleted file mode 100644
index 00c853b..0000000
--- a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/AdapterRestInterfaceTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
- * ================================================================================
- * 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.
- * ============LICENSE_END=========================================================
- */
-
-package org.openecomp.mso.adapters;
-
-import java.io.IOException;
-import java.util.HashMap;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.openecomp.mso.adapters.json.MapSerializer;
-
-public class AdapterRestInterfaceTest {
-
-	@Test
-	public final void mapSerializerTest() {
-		MapSerializer mapSerializer = new MapSerializer();
-		mapSerializer.isUnwrappingSerializer();
-		mapSerializer.toString();
-		mapSerializer.unwrappingSerializer();
-		JsonGenerator jsonGenerator = Mockito.mock(JsonGenerator.class);
-		SerializerProvider serializerProvider = Mockito
-				.mock(SerializerProvider.class);
-		try {
-			mapSerializer.serialize(new HashMap(), jsonGenerator, serializerProvider);
-		} catch (IOException e) {
-		}
-	}
-
-}
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/BeanTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/BeanTest.java
index 984ba1b..5c3470a 100644
--- a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/BeanTest.java
+++ b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/BeanTest.java
@@ -17,14 +17,12 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.openecomp.mso.test;
+package org.openecomp.mso.adapters;
 
 import java.lang.reflect.Method;
-import java.lang.reflect.Parameter;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashMap;
-
 import org.junit.Test;
 import org.openecomp.mso.adapters.nwrest.ContrailNetwork;
 import org.openecomp.mso.adapters.nwrest.CreateNetworkError;
@@ -34,7 +32,6 @@
 import org.openecomp.mso.adapters.nwrest.DeleteNetworkRequest;
 import org.openecomp.mso.adapters.nwrest.DeleteNetworkResponse;
 import org.openecomp.mso.adapters.nwrest.NetworkExceptionResponse;
-import org.openecomp.mso.adapters.nwrest.NetworkRequestCommon;
 import org.openecomp.mso.adapters.nwrest.NetworkTechnology;
 import org.openecomp.mso.adapters.nwrest.ProviderVlanNetwork;
 import org.openecomp.mso.adapters.nwrest.QueryNetworkResponse;
@@ -74,7 +71,6 @@
 import org.openecomp.mso.adapters.vnfrest.UpdateVolumeGroupResponse;
 import org.openecomp.mso.adapters.vnfrest.VfModuleExceptionResponse;
 import org.openecomp.mso.adapters.vnfrest.VfModuleRollback;
-import org.openecomp.mso.adapters.vnfrest.VfResponseCommon;
 import org.openecomp.mso.adapters.vnfrest.VolumeGroupRollback;
 import org.openecomp.mso.entity.MsoRequest;
 
diff --git a/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/json/MapSerializerTest.java b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/json/MapSerializerTest.java
new file mode 100644
index 0000000..f903f21
--- /dev/null
+++ b/adapters/mso-adapters-rest-interface/src/test/java/org/openecomp/mso/adapters/json/MapSerializerTest.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.mso.adapters.json;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.junit.Test;
+
+public class MapSerializerTest {
+
+    private static final String JSON_FIELD_NAME_1 = "testKey1";
+    private static final String JSON_VALUE_1 = "testValue1";
+    private static final String JSON_FIELD_NAME_2 = "testKey2";
+    private static final String JSON_VALUE_2 = "testValue2";
+
+    @Test
+    public void serializationWritesTheProperFieldsToJson() throws Exception {
+        JsonGenerator jsonGeneratorMock = mock(JsonGenerator.class);
+        MapSerializer testedObject = new MapSerializer();
+        testedObject.serialize(prepareMap(), jsonGeneratorMock, mock(SerializerProvider.class));
+        verify(jsonGeneratorMock).writeStringField("key", JSON_FIELD_NAME_1);
+        verify(jsonGeneratorMock).writeStringField("value", JSON_VALUE_1);
+        verify(jsonGeneratorMock).writeStringField("key", JSON_FIELD_NAME_2);
+        verify(jsonGeneratorMock).writeStringField("value", JSON_VALUE_2);
+    }
+
+    private Map<String, String> prepareMap() {
+        Map<String, String> map = new HashMap<>();
+        map.put(JSON_FIELD_NAME_1, JSON_VALUE_1);
+        map.put(JSON_FIELD_NAME_2, JSON_VALUE_2);
+        return map;
+    }
+}
