diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMapping.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMapping.java
index 5c98fee..a6836f8 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMapping.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMapping.java
@@ -127,8 +127,8 @@
         private MappingId id;
         private ApplicationId appId;
         private DeviceId deviceId;
-        private MappingKey key = new DefaultMappingKey();
-        private MappingValue value = new DefaultMappingValue();
+        private MappingKey key = DefaultMappingKey.builder().build();
+        private MappingValue value = DefaultMappingValue.builder().build();
 
         @Override
         public Mapping.Builder withId(long id) {
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java
index a7c3f7f..e18435b 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingKey.java
@@ -15,14 +15,95 @@
  */
 package org.onosproject.mapping;
 
+import com.google.common.base.MoreObjects;
 import org.onosproject.mapping.addresses.MappingAddress;
 
+import java.util.Objects;
+
 /**
  * Default mapping key implementation.
  */
-public class DefaultMappingKey implements MappingKey {
+public final class DefaultMappingKey implements MappingKey {
+
+    private final MappingAddress address;
+
+    /**
+     * Create a new mapping key from the specified mapping address.
+     *
+     * @param address a mapping address
+     */
+    private DefaultMappingKey(MappingAddress address) {
+        this.address = address;
+    }
+
     @Override
     public MappingAddress address() {
-        return null;
+        return address;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(address);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultMappingKey) {
+            DefaultMappingKey that = (DefaultMappingKey) obj;
+            return Objects.equals(address, that.address);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("address", address)
+                .toString();
+    }
+
+    /**
+     * Returns a new mapping key builder.
+     *
+     * @return mapping key builder
+     */
+    public static MappingKey.Builder builder() {
+        return new Builder();
+    }
+
+    public static MappingKey.Builder builder(MappingKey key) {
+        return new Builder(key);
+    }
+
+    /**
+     * Builds a mapping key.
+     */
+    public static final class Builder implements MappingKey.Builder {
+
+        private MappingAddress address;
+
+        // creates a new builder
+        private Builder() {
+        }
+
+        // creates a new builder based off an existing mapping key
+        private Builder(MappingKey key) {
+            this.address = key.address();
+        }
+
+        @Override
+        public MappingKey.Builder withAddress(MappingAddress address) {
+            this.address = address;
+            return this;
+        }
+
+        @Override
+        public MappingKey build() {
+
+            return new DefaultMappingKey(address);
+        }
     }
 }
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingTreatment.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingTreatment.java
new file mode 100644
index 0000000..4b2ef12
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingTreatment.java
@@ -0,0 +1,213 @@
+/*
+ * 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;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.mapping.instructions.MappingInstructions;
+import org.onosproject.mapping.instructions.MulticastMappingInstruction;
+import org.onosproject.mapping.instructions.MulticastMappingInstruction.MulticastType;
+import org.onosproject.mapping.instructions.UnicastMappingInstruction;
+import org.onosproject.mapping.instructions.UnicastMappingInstruction.UnicastType;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Default implementation of mapping treatment.
+ */
+public final class DefaultMappingTreatment implements MappingTreatment {
+
+    private final List<MappingInstruction> instructions;
+    private final MappingAddress address;
+
+    /**
+     * Create a new mapping treatment from the specified list of mapping instructions.
+     *
+     * @param instructions mapping instructions
+     */
+    private DefaultMappingTreatment(MappingAddress address,
+                                    List<MappingInstruction> instructions) {
+        this.address = address;
+        this.instructions = ImmutableList.copyOf(checkNotNull(instructions));
+    }
+
+    @Override
+    public MappingAddress address() {
+        return address;
+    }
+
+    @Override
+    public List<MappingInstruction> instructions() {
+        return ImmutableList.copyOf(instructions);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(address, instructions);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultMappingTreatment) {
+            DefaultMappingTreatment that = (DefaultMappingTreatment) obj;
+            return Objects.equals(address, that.address) &&
+                    Objects.equals(instructions, that.instructions);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("address", address)
+                .add("mapping instructions", instructions)
+                .toString();
+    }
+
+    /**
+     * Returns a new mapping treatment builder.
+     *
+     * @return mapping treatment builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Returns a new mapping treatment builder primed to produce entities
+     * patterned after the supplied mapping treatment.
+     *
+     * @param treatment base mapping treatment
+     * @return mapping treatment builder
+     */
+    public static Builder builder(MappingTreatment treatment) {
+        return new Builder(treatment);
+    }
+
+    /**
+     * Builds a mapping treatment.
+     */
+    public static final class Builder implements MappingTreatment.Builder {
+
+        private List<MappingInstruction> instructions = Lists.newArrayList();
+        private MappingAddress address;
+        private Map<UnicastType, Integer> unicastTypeMap = Maps.newConcurrentMap();
+        private Map<MulticastType, Integer> multicastTypeMap = Maps.newConcurrentMap();
+
+        // creates a new builder
+        private Builder() {
+            initTypeMap();
+        }
+
+        // creates a new builder based off an existing mapping treatment
+        private Builder(MappingTreatment treatment) {
+            treatment.instructions().forEach(i -> instructions.add(i));
+            address = treatment.address();
+            initTypeMap();
+        }
+
+        /**
+         * Initializes type map.
+         */
+        private void initTypeMap() {
+            unicastTypeMap.put(UnicastType.WEIGHT, 0);
+            unicastTypeMap.put(UnicastType.PRIORITY, 0);
+            multicastTypeMap.put(MulticastType.WEIGHT, 0);
+            multicastTypeMap.put(MulticastType.PRIORITY, 0);
+        }
+
+        @Override
+        public Builder withAddress(MappingAddress address) {
+            this.address = address;
+            return this;
+        }
+
+        @Override
+        public Builder add(MappingInstruction instruction) {
+
+            switch (instruction.type()) {
+                case UNICAST:
+                    unicastTypeMap.compute(((UnicastMappingInstruction)
+                            instruction).subtype(), (k, v) -> v + 1);
+                    instructions.add(instruction);
+                    break;
+                case MULTICAST:
+                    multicastTypeMap.compute(((MulticastMappingInstruction)
+                            instruction).subtype(), (k, v) -> v + 1);
+                    instructions.add(instruction);
+                    break;
+                case EXTENSION:
+                    instructions.add(instruction);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unknown mapping " +
+                            "instruction type: " + instruction.type());
+            }
+
+            return this;
+        }
+
+        @Override
+        public Builder setUnicastWeight(int weight) {
+            return add(MappingInstructions.unicastWeight(weight));
+        }
+
+        @Override
+        public Builder setUnicastPriority(int priority) {
+            return add(MappingInstructions.unicastPriority(priority));
+        }
+
+        @Override
+        public Builder setMulticastWeight(int weight) {
+            return add(MappingInstructions.multicastWeight(weight));
+        }
+
+        @Override
+        public Builder setMulticastPriority(int priority) {
+            return add(MappingInstructions.multicastPriority(priority));
+        }
+
+        @Override
+        public Builder extension(ExtensionTreatment extension, DeviceId deviceId) {
+            return add(MappingInstructions.extension(extension, deviceId));
+        }
+
+        @Override
+        public MappingTreatment build() {
+
+            unicastTypeMap.forEach((k, v) -> checkArgument(v <= 1,
+                    "Should not specify more than one " + k.toString()));
+            multicastTypeMap.forEach((k, v) -> checkArgument(v <= 1,
+                    "Should not specify more than one " + k.toString()));
+
+            return new DefaultMappingTreatment(address, instructions);
+        }
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java
index d38b782..28f7119 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/DefaultMappingValue.java
@@ -15,23 +15,137 @@
  */
 package org.onosproject.mapping;
 
-import org.onosproject.mapping.addresses.MappingAddress;
-import org.onosproject.mapping.instructions.MappingInstruction;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.onosproject.mapping.actions.MappingAction;
+import org.onosproject.mapping.actions.MappingActions;
 
 import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Default mapping value implementation.
  */
-public class DefaultMappingValue implements MappingValue {
+public final class DefaultMappingValue implements MappingValue {
 
-    @Override
-    public MappingAddress address() {
-        return null;
+    private final MappingAction action;
+    private final List<MappingTreatment> treatments;
+
+    /**
+     * Creates a new mapping value from the specified mapping action and a
+     * list of mapping treatments.
+     *
+     * @param action     mapping action
+     * @param treatments a collection of mapping treatment
+     */
+    private DefaultMappingValue(MappingAction action,
+                                List<MappingTreatment> treatments) {
+        this.action = action;
+        this.treatments = ImmutableList.copyOf(checkNotNull(treatments));
     }
 
     @Override
-    public List<MappingInstruction> instructions() {
-        return null;
+    public MappingAction action() {
+        return action;
+    }
+
+    @Override
+    public List<MappingTreatment> treatments() {
+        return ImmutableList.copyOf(treatments);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(action, treatments);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultMappingValue) {
+            DefaultMappingValue that = (DefaultMappingValue) obj;
+            return Objects.equals(action, that.action) &&
+                    Objects.equals(treatments, that.treatments);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("action", action)
+                .add("treatments", treatments)
+                .toString();
+    }
+
+    /**
+     * Returns a new mapping value builder.
+     *
+     * @return mapping value builder
+     */
+    public static MappingValue.Builder builder() {
+        return new DefaultMappingValue.Builder();
+    }
+
+    /**
+     * Returns a new mapping value builder primed to produce entities
+     * patterned after the supplied mapping value.
+     *
+     * @param value base mapping value
+     * @return mapping value builder
+     */
+    public static MappingValue.Builder builder(MappingValue value) {
+        return new Builder(value);
+    }
+
+    /**
+     * Builds a mapping value.
+     */
+    public static final class Builder implements MappingValue.Builder {
+
+        private MappingAction action;
+        private List<MappingTreatment> treatments = Lists.newArrayList();
+
+        // creates a new builder
+        private Builder() {
+        }
+
+        // creates a new builder based off an existing mapping value
+        private Builder(MappingValue value) {
+            value.treatments().forEach(t -> treatments.add(t));
+            action = value.action();
+        }
+
+        @Override
+        public Builder withAction(MappingAction action) {
+            this.action = action;
+            return this;
+        }
+
+        @Override
+        public Builder add(MappingTreatment treatment) {
+            treatments.add(treatment);
+            return this;
+        }
+
+        @Override
+        public MappingValue build() {
+
+            // if no action has been specified, we simply assign noAction
+            if (action == null) {
+                action = MappingActions.noAction();
+            }
+
+            // FIXME: we will check the number of treatment later
+            // checkArgument(treatments.size() >= 1,
+            //        "Must specify more than one mapping treatment");
+
+            return new DefaultMappingValue(action, treatments);
+        }
     }
 }
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingTreatment.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingTreatment.java
new file mode 100644
index 0000000..9116267
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingTreatment.java
@@ -0,0 +1,110 @@
+/*
+ * 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;
+
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+
+import java.util.List;
+
+/**
+ * Abstraction of mapping treatment.
+ */
+public interface MappingTreatment {
+
+    /**
+     * Obtains a mapping address.
+     *
+     * @return a mapping address
+     */
+    MappingAddress address();
+
+    /**
+     * Obtains a collection of mapping instructions.
+     *
+     * @return a collection of mapping instructions
+     */
+    List<MappingInstruction> instructions();
+
+    interface Builder {
+
+        /**
+         * Specifies a mapping address.
+         *
+         * @param address mapping address
+         * @return a mapping treatment builder
+         */
+        Builder withAddress(MappingAddress address);
+
+        /**
+         * Specifies a collection of mapping instructions.
+         *
+         * @param instruction a mapping instruction
+         * @return a mapping treatment builder
+         */
+        Builder add(MappingInstruction instruction);
+
+        /**
+         * Adds an unicast weight instruction.
+         *
+         * @param weight unicast weight value
+         * @return a mapping treatment builder
+         */
+        Builder setUnicastWeight(int weight);
+
+        /**
+         * Adds an unicast priority instruction.
+         *
+         * @param priority unicast priority value
+         * @return a mapping treatment builder
+         */
+        Builder setUnicastPriority(int priority);
+
+        /**
+         * Adds a multicast weight instruction.
+         *
+         * @param weight multicast weight value
+         * @return a mapping treatment builder
+         */
+        Builder setMulticastWeight(int weight);
+
+        /**
+         * Adds a multicast priority instruction.
+         *
+         * @param priority multicast priority value
+         * @return a mapping treatment builder
+         */
+        Builder setMulticastPriority(int priority);
+
+        /**
+         * uses an extension treatment.
+         *
+         * @param extension extension treatment
+         * @param deviceId  device identifier
+         * @return a treatment builder
+         */
+        Builder extension(ExtensionTreatment extension, DeviceId deviceId);
+
+        /**
+         * Builds an immutable mapping treatment.
+         *
+         * @return a mapping treatment
+         */
+        MappingTreatment build();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java
index 07f4594..69741d8 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingValue.java
@@ -15,8 +15,7 @@
  */
 package org.onosproject.mapping;
 
-import org.onosproject.mapping.addresses.MappingAddress;
-import org.onosproject.mapping.instructions.MappingInstruction;
+import org.onosproject.mapping.actions.MappingAction;
 
 import java.util.List;
 
@@ -26,36 +25,36 @@
 public interface MappingValue {
 
     /**
-     * Obtains a mapping address.
+     * Obtains a mapping action.
      *
-     * @return a mapping address
+     * @return a mapping action
      */
-    MappingAddress address();
+    MappingAction action();
 
     /**
      * Obtains a collection of mapping instructions.
      *
      * @return a collection of mapping instructions
      */
-    List<MappingInstruction> instructions();
+    List<MappingTreatment> treatments();
 
     interface Builder {
 
         /**
-         * Specifies the mapping address.
+         * Specifies a mapping action.
          *
-         * @param address mapping address
+         * @param action mapping action
          * @return a mapping value builder
          */
-        Builder withAddress(MappingAddress address);
+        Builder withAction(MappingAction action);
 
         /**
-         * Specifies a collection of mapping instructions.
+         * Specifies a collection of mapping treatment.
          *
-         * @param instructions a collection of mapping instructions
+         * @param treatment a mapping treatment
          * @return a mapping value builder
          */
-        Builder withInstructions(List<MappingInstruction> instructions);
+        Builder add(MappingTreatment treatment);
 
         /**
          * Builds an immutable mapping value.
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/DropMappingAction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/DropMappingAction.java
new file mode 100644
index 0000000..c38b57a
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/DropMappingAction.java
@@ -0,0 +1,56 @@
+/*
+ * 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.actions;
+
+import java.util.Objects;
+
+/**
+ * Represents a Drop Action mapping.
+ */
+public final class DropMappingAction implements MappingAction {
+
+    /**
+     * Default constructor of DropMappingAction.
+     */
+    DropMappingAction() {
+    }
+
+    @Override
+    public Type type() {
+        return Type.DROP;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DropMappingAction) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/ForwardMappingAction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/ForwardMappingAction.java
new file mode 100644
index 0000000..93a7150
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/ForwardMappingAction.java
@@ -0,0 +1,56 @@
+/*
+ * 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.actions;
+
+import java.util.Objects;
+
+/**
+ * Represents a Forward Action mapping.
+ */
+public final class ForwardMappingAction implements MappingAction {
+
+    /**
+     * Default constructor of ForwardMappingAction.
+     */
+    ForwardMappingAction() {
+    }
+
+    @Override
+    public Type type() {
+        return Type.FORWARD;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ForwardMappingAction) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/MappingAction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/MappingAction.java
new file mode 100644
index 0000000..16047f6
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/MappingAction.java
@@ -0,0 +1,55 @@
+/*
+ * 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.actions;
+
+/**
+ * Presentation of a single mapping action.
+ */
+public interface MappingAction {
+
+    /**
+     * Represents the type of mapping action.
+     */
+    enum Type {
+
+        /**
+         * Signifies that the traffic requires no action.
+         */
+        NO_ACTION,
+
+        /**
+         * Signifies that the traffic requires native forwarding.
+         */
+        NATIVE_FORWARD,
+
+        /**
+         * Signifies that the traffic requires forwarding with mapping information.
+         */
+        FORWARD,
+
+        /**
+         * Signifies that the traffic should be dropped.
+         */
+        DROP
+    }
+
+    /**
+     * Returns the type of mapping action.
+     *
+     * @return type of mapping action
+     */
+    Type type();
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/MappingActions.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/MappingActions.java
new file mode 100644
index 0000000..676d65b
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/MappingActions.java
@@ -0,0 +1,63 @@
+/*
+ * 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.actions;
+
+/**
+ * Factory class for creating various mapping actions.
+ */
+public final class MappingActions {
+
+    /**
+     * Prevents instantiation from external.
+     */
+    private MappingActions() {}
+
+    /**
+     * Creates a drop mapping action.
+     *
+     * @return a drop mapping action
+     */
+    public static DropMappingAction drop() {
+        return new DropMappingAction();
+    }
+
+    /**
+     * Creates a forward mapping action.
+     *
+     * @return a forward mapping action
+     */
+    public static ForwardMappingAction forward() {
+        return new ForwardMappingAction();
+    }
+
+    /**
+     * Creates a native forward mapping action.
+     *
+     * @return a native forward mapping action
+     */
+    public static NativeForwardMappingAction nativeForward() {
+        return new NativeForwardMappingAction();
+    }
+
+    /**
+     * Creates a no action.
+     *
+     * @return a no action
+     */
+    public static NoMappingAction noAction() {
+        return new NoMappingAction();
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/NativeForwardMappingAction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/NativeForwardMappingAction.java
new file mode 100644
index 0000000..a2a9a21
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/NativeForwardMappingAction.java
@@ -0,0 +1,56 @@
+/*
+ * 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.actions;
+
+import java.util.Objects;
+
+/**
+ * Represents a Native Forward Action mapping.
+ */
+public final class NativeForwardMappingAction implements MappingAction {
+
+    /**
+     * Default constructor of NativeForwardMappingAction.
+     */
+    NativeForwardMappingAction() {
+    }
+
+    @Override
+    public Type type() {
+        return Type.NATIVE_FORWARD;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof NativeForwardMappingAction) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/NoMappingAction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/NoMappingAction.java
new file mode 100644
index 0000000..b4eb75c
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/NoMappingAction.java
@@ -0,0 +1,56 @@
+/*
+ * 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.actions;
+
+import java.util.Objects;
+
+/**
+ * Represents a No Action mapping.
+ */
+public final class NoMappingAction implements MappingAction {
+
+    /**
+     * Default constructor of NoMappingAction.
+     */
+    NoMappingAction() {
+    }
+
+    @Override
+    public Type type() {
+        return Type.NO_ACTION;
+    }
+
+    @Override
+    public String toString() {
+        return type().toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof NoMappingAction) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/package-info.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/package-info.java
new file mode 100644
index 0000000..0c5bec5
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/actions/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Mapping action package.
+ */
+package org.onosproject.mapping.actions;
\ No newline at end of file
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/ActionMappingInstruction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/ActionMappingInstruction.java
deleted file mode 100644
index 9a17f9d..0000000
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/ActionMappingInstruction.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * 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.instructions;
-
-import java.util.Objects;
-
-/**
- * Abstraction of an action mapping instruction.
- */
-public abstract class ActionMappingInstruction implements MappingInstruction {
-
-    /**
-     * Represents the type of mapping action.
-     */
-    public enum ActionType {
-
-        /**
-         * Signifies that the traffic requires no action.
-         */
-        NO_ACTION,
-
-        /**
-         * Signifies that the traffic requires native forwarding.
-         */
-        NATIVE_FORWARD,
-
-        /**
-         * Signifies that the traffic requires forwarding with mapping information.
-         */
-        FORWARD,
-
-        /**
-         * Signifies that the traffic should be dropped.
-         */
-        DROP
-    }
-
-    public abstract ActionType subtype();
-
-    @Override
-    public final Type type() {
-        return Type.ACTION;
-    }
-
-    /**
-     * Represents a No Action mapping instruction.
-     */
-    public static final class NoActionMappingInstruction
-                                            extends ActionMappingInstruction {
-
-        NoActionMappingInstruction() {
-        }
-
-        @Override
-        public ActionType subtype() {
-            return ActionType.NO_ACTION;
-        }
-
-        @Override
-        public String toString() {
-            return subtype().toString();
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(type(), subtype());
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof NoActionMappingInstruction) {
-                return true;
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Represents a Native Forward mapping instruction.
-     */
-    public static final class NativeForwardMappingInstruction
-                                            extends ActionMappingInstruction {
-
-        NativeForwardMappingInstruction() {
-        }
-
-        @Override
-        public ActionType subtype() {
-            return ActionType.NATIVE_FORWARD;
-        }
-
-        @Override
-        public String toString() {
-            return subtype().toString();
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(type(), subtype());
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof NativeForwardMappingInstruction) {
-                return true;
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Represents a Forward mapping instruction.
-     */
-    public static final class ForwardMappingInstruction
-                                            extends ActionMappingInstruction {
-
-        ForwardMappingInstruction() {
-        }
-
-        @Override
-        public ActionType subtype() {
-            return ActionType.FORWARD;
-        }
-
-        @Override
-        public String toString() {
-            return subtype().toString();
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(type(), subtype());
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof ForwardMappingInstruction) {
-                return true;
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Represents a Drop mapping instruction.
-     */
-    public static final class DropMappingInstruction
-                                            extends ActionMappingInstruction {
-
-        DropMappingInstruction() {
-        }
-
-        @Override
-        public ActionType subtype() {
-            return ActionType.DROP;
-        }
-
-        @Override
-        public String toString() {
-            return subtype().toString();
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(type(), subtype());
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj instanceof DropMappingInstruction) {
-                return true;
-            }
-            return false;
-        }
-    }
-}
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstruction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstruction.java
index 81faf05..fc3e340 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstruction.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstruction.java
@@ -36,20 +36,15 @@
         MULTICAST,
 
         /**
-         * Signifies that the traffic should be treated with a certain action.
-         */
-        ACTION,
-
-        /**
          * Signifies that an extension instruction will be used.
          */
         EXTENSION
     }
 
     /**
-     * Returns the type of instruction.
+     * Returns the type of mapping instruction.
      *
-     * @return type of instruction
+     * @return type of mapping instruction
      */
     Type type();
 }
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstructions.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstructions.java
index 0360b44..63e65af 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstructions.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/MappingInstructions.java
@@ -81,42 +81,6 @@
     }
 
     /**
-     * Creates no action mapping instruction.
-     *
-     * @return an action mapping instruction
-     */
-    public static ActionMappingInstruction noAction() {
-        return new ActionMappingInstruction.NoActionMappingInstruction();
-    }
-
-    /**
-     * Creates native forward mapping instruction.
-     *
-     * @return an action mapping instruction
-     */
-    public static ActionMappingInstruction nativeForwardAction() {
-        return new ActionMappingInstruction.NativeForwardMappingInstruction();
-    }
-
-    /**
-     * Creates forward mapping instruction.
-     *
-     * @return an action mapping instruction
-     */
-    public static ActionMappingInstruction forwardAction() {
-        return new ActionMappingInstruction.ForwardMappingInstruction();
-    }
-
-    /**
-     * Creates drop mapping instruction.
-     *
-     * @return an action mapping instruction
-     */
-    public static ActionMappingInstruction dropAction() {
-        return new ActionMappingInstruction.DropMappingInstruction();
-    }
-
-    /**
      * Creates an extension mapping instruction.
      *
      * @param extension extension mapping instruction
