diff --git a/apps/mappingmanagement/api/src/test/java/org/onosproject/mapping/codec/MappingValueCodecTest.java b/apps/mappingmanagement/api/src/test/java/org/onosproject/mapping/codec/MappingValueCodecTest.java
new file mode 100644
index 0000000..22fa13a
--- /dev/null
+++ b/apps/mappingmanagement/api/src/test/java/org/onosproject/mapping/codec/MappingValueCodecTest.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2017-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.mapping.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.CodecManager;
+import org.onosproject.mapping.DefaultMappingTreatment;
+import org.onosproject.mapping.DefaultMappingValue;
+import org.onosproject.mapping.MappingTreatment;
+import org.onosproject.mapping.MappingValue;
+import org.onosproject.mapping.actions.MappingAction;
+import org.onosproject.mapping.actions.MappingActions;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.mapping.instructions.MappingInstructions;
+import org.onosproject.mapping.MappingCodecRegistrator;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit tests for MappingValueCodec.
+ */
+public class MappingValueCodecTest {
+
+    private static final String TREATMENTS = "treatments";
+    private static final String ADDRESS = "address";
+    private static final String IPV4_STRING = "1.2.3.4";
+    private static final String PORT_STRING = "32";
+    private static final IpPrefix IPV4_PREFIX =
+            IpPrefix.valueOf(IPV4_STRING + "/" + PORT_STRING);
+
+    private static final int UNICAST_WEIGHT = 1;
+    private static final int UNICAST_PRIORITY = 1;
+    private static final int MULTICAST_WEIGHT = 2;
+    private static final int MULTICAST_PRIORITY = 2;
+
+    private CodecContext context;
+    private JsonCodec<MappingValue> valueCodec;
+    private MappingCodecRegistrator registrator;
+
+    /**
+     * Sets up for each test.
+     * Creates a context and fetches the mapping value codec.
+     */
+    @Before
+    public void setUp() {
+        CodecManager manager = new CodecManager();
+        registrator = new MappingCodecRegistrator();
+        registrator.codecService = manager;
+        registrator.activate();
+
+        context = new MappingCodecContextAdapter(registrator.codecService);
+        valueCodec = context.codec(MappingValue.class);
+        assertThat(valueCodec, notNullValue());
+    }
+
+    /**
+     * Deactivates the codec registrator.
+     */
+    @After
+    public void tearDown() {
+        registrator.deactivate();
+    }
+
+    /**
+     * Tests encoding of a mapping value object.
+     */
+    @Test
+    public void testMapingValueEncode() {
+        MappingInstruction unicastWeight = MappingInstructions.unicastWeight(UNICAST_WEIGHT);
+        MappingInstruction unicastPriority = MappingInstructions.unicastPriority(UNICAST_PRIORITY);
+        MappingInstruction multicastWeight = MappingInstructions.multicastWeight(MULTICAST_WEIGHT);
+        MappingInstruction multicastPriority = MappingInstructions.multicastPriority(MULTICAST_PRIORITY);
+
+        MappingAddress address = MappingAddresses.ipv4MappingAddress(IPV4_PREFIX);
+
+        MappingTreatment treatment = DefaultMappingTreatment.builder()
+                                        .add(unicastWeight)
+                                        .add(unicastPriority)
+                                        .add(multicastWeight)
+                                        .add(multicastPriority)
+                                        .withAddress(address)
+                                        .build();
+
+        MappingAction action = MappingActions.noAction();
+
+        MappingValue value = DefaultMappingValue.builder()
+                                        .add(treatment)
+                                        .withAction(action)
+                                        .build();
+
+        ObjectNode valueJson = valueCodec.encode(value, context);
+        assertThat(valueJson, MappingValueJsonMatcher.matchesMappingValue(value));
+    }
+
+    /**
+     * Tests decoding of a mapping value JSON object.
+     */
+    @Test
+    public void testMappingValueDecode() throws IOException {
+        MappingValue value = getValue("MappingValue.json");
+        assertThat(value.treatments().get(0).address().toString(),
+                            is("IPV4:" + IPV4_STRING + "/" + PORT_STRING));
+    }
+
+
+    /**
+     * Hamcrest matcher for mapping value.
+     */
+    public static final class MappingValueJsonMatcher
+            extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+        private final MappingValue mappingValue;
+
+        /**
+         * A default constructor.
+         *
+         * @param mappingValue mapping value
+         */
+        private MappingValueJsonMatcher(MappingValue mappingValue) {
+            this.mappingValue = mappingValue;
+        }
+
+        @Override
+        protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+
+            // check mapping treatments
+            final JsonNode jsonTreatments = jsonNode.get(TREATMENTS);
+            if (mappingValue.treatments().size() != jsonTreatments.size()) {
+                description.appendText("mapping treatments array size of " +
+                        Integer.toString(mappingValue.treatments().size()));
+                return false;
+            }
+
+            for (final MappingTreatment treatment : mappingValue.treatments()) {
+                boolean treatmentFound = false;
+                for (int treatmentIdx = 0; treatmentIdx < jsonTreatments.size();
+                        treatmentIdx++) {
+                    final String jsonAddress =
+                            jsonTreatments.get(treatmentIdx).get(ADDRESS)
+                                    .get(MappingAddressCodec.IPV4).textValue();
+                    final String address = treatment.address().toString();
+                    if (address.contains(jsonAddress)) {
+                        treatmentFound = true;
+                    }
+                }
+
+                if (!treatmentFound) {
+                    description.appendText("mapping treatment " + treatment.toString());
+                    return false;
+                }
+            }
+
+            // check mapping action
+            final JsonNode jsonActionNode = jsonNode.get(MappingValueCodec.ACTION);
+
+            assertThat(jsonActionNode, MappingActionJsonMatcher.matchesAction(mappingValue.action()));
+
+            return true;
+        }
+
+        @Override
+        public void describeTo(Description description) {
+            description.appendText(mappingValue.toString());
+        }
+
+        /**
+         * Factory to allocate a mapping value.
+         *
+         * @param mappingValue mapping value object we are looking for
+         * @return matcher
+         */
+        static MappingValueJsonMatcher matchesMappingValue(MappingValue mappingValue) {
+            return new MappingValueJsonMatcher(mappingValue);
+        }
+    }
+
+    /**
+     * Reads in a mapping value from the given resource and decodes it.
+     *
+     * @param resourceName resource to use to read the JSON for the rule
+     * @return decoded mappingKey
+     * @throws IOException if processing the resource fails
+     */
+    private MappingValue getValue(String resourceName) throws IOException {
+        InputStream jsonStream = MappingValueCodecTest.class.getResourceAsStream(resourceName);
+        JsonNode json = context.mapper().readTree(jsonStream);
+        assertThat(json, notNullValue());
+        MappingValue value = valueCodec.decode((ObjectNode) json, context);
+        assertThat(value, notNullValue());
+        return value;
+    }
+}
