diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 7a88366..13782c7 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -75,10 +75,10 @@
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.intent.PointToPointIntent;
 import org.onosproject.net.intent.SinglePointToMultiPointIntent;
 import org.onosproject.net.intent.util.IntentMiniSummary;
-import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.key.DeviceKey;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.meter.Band;
@@ -87,12 +87,9 @@
 import org.onosproject.net.packet.PacketRequest;
 import org.onosproject.net.pi.model.PiActionModel;
 import org.onosproject.net.pi.model.PiActionParamModel;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
-import org.onosproject.net.pi.model.PiHeaderModel;
-import org.onosproject.net.pi.model.PiHeaderTypeModel;
+import org.onosproject.net.pi.model.PiMatchFieldModel;
 import org.onosproject.net.pi.model.PiPipeconf;
 import org.onosproject.net.pi.model.PiPipelineModel;
-import org.onosproject.net.pi.model.PiTableMatchFieldModel;
 import org.onosproject.net.pi.model.PiTableModel;
 import org.onosproject.net.region.Region;
 import org.onosproject.net.statistic.Load;
@@ -186,13 +183,10 @@
         registerCodec(TransportEndpointDescription.class, new TransportEndpointDescriptionCodec());
         registerCodec(PacketRequest.class, new PacketRequestCodec());
         registerCodec(PiActionModel.class, new PiActionModelCodec());
-        registerCodec(PiHeaderModel.class, new PiHeaderModelCodec());
         registerCodec(PiPipelineModel.class, new PiPipelineModelCodec());
         registerCodec(PiPipeconf.class, new PiPipeconfCodec());
         registerCodec(PiTableModel.class, new PiTableModelCodec());
-        registerCodec(PiTableMatchFieldModel.class, new PiTableMatchFieldModelCodec());
-        registerCodec(PiHeaderFieldTypeModel.class, new PiHeaderFieldTypeModelCodec());
-        registerCodec(PiHeaderTypeModel.class, new PiHeaderTypeModelCodec());
+        registerCodec(PiMatchFieldModel.class, new PiMatchFieldModelCodec());
         registerCodec(PiActionParamModel.class, new PiActionParamModelCodec());
         log.info("Started");
     }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
index da34c5e..37a173d 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/FlowRuleCodec.java
@@ -27,7 +27,7 @@
 import org.onosproject.net.flow.IndexTableId;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.pi.runtime.PiTableId;
+import org.onosproject.net.pi.model.PiTableId;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.nullIsIllegal;
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java
index 10cef43..dd7b336 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiActionModelCodec.java
@@ -33,7 +33,7 @@
     @Override
     public ObjectNode encode(PiActionModel action, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, action.name());
+        result.put(NAME, action.id().toString());
         ArrayNode params = result.putArray(PARAMS);
         action.params().forEach(param -> {
             ObjectNode paramData = context.encode(param, PiActionParamModel.class);
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java
index ac553fe..17f797a 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiActionParamModelCodec.java
@@ -32,7 +32,7 @@
     @Override
     public ObjectNode encode(PiActionParamModel param, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, param.name());
+        result.put(NAME, param.id().toString());
         result.put(BIT_WIDTH, param.bitWidth());
         return result;
     }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderModelCodec.java
deleted file mode 100644
index 7bcd134..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderModelCodec.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2017-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderModel;
-import org.onosproject.net.pi.model.PiHeaderTypeModel;
-
-/**
- * Codec for PiHeaderModel.
- */
-public class PiHeaderModelCodec extends JsonCodec<PiHeaderModel> {
-    private static final String NAME = "name";
-    private static final String TYPE = "type";
-    private static final String IS_META = "isMetadata";
-    private static final String INDEX = "index";
-
-    @Override
-    public ObjectNode encode(PiHeaderModel header, CodecContext context) {
-        ObjectNode result = context.mapper().createObjectNode();
-        ObjectNode headerTypeData = context.encode(header.type(), PiHeaderTypeModel.class);
-        result.put(NAME, header.name());
-        result.set(TYPE, headerTypeData);
-        result.put(IS_META, header.isMetadata());
-        result.put(INDEX, header.index());
-        return result;
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderTypeModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderTypeModelCodec.java
deleted file mode 100644
index 1065a94..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderTypeModelCodec.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2017-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
-import org.onosproject.net.pi.model.PiHeaderTypeModel;
-
-/**
- * Codec for PiHeaderTypeModel.
- */
-public class PiHeaderTypeModelCodec extends JsonCodec<PiHeaderTypeModel> {
-    private static final String NAME = "name";
-    private static final String FIELDS = "fields";
-
-    @Override
-    public ObjectNode encode(PiHeaderTypeModel headerType, CodecContext context) {
-        ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, headerType.name());
-        ArrayNode fields = result.putArray(FIELDS);
-
-        headerType.fields().forEach(field -> {
-            fields.add(context.encode(field, PiHeaderFieldTypeModel.class));
-        });
-
-        return result;
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderFieldTypeModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiMatchFieldModelCodec.java
similarity index 65%
rename from core/common/src/main/java/org/onosproject/codec/impl/PiHeaderFieldTypeModelCodec.java
rename to core/common/src/main/java/org/onosproject/codec/impl/PiMatchFieldModelCodec.java
index 09a1566..6d6dad4 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiHeaderFieldTypeModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiMatchFieldModelCodec.java
@@ -19,20 +19,19 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
+import org.onosproject.net.pi.model.PiMatchFieldModel;
 
 /**
- * Codec for PiHeaderFieldTypeModel.
+ * Codec for PiMatchFieldModel.
  */
-public class PiHeaderFieldTypeModelCodec extends JsonCodec<PiHeaderFieldTypeModel> {
-    private static final String NAME = "name";
-    private static final String BIT_WIDTH = "bitWidth";
-
+public class PiMatchFieldModelCodec extends JsonCodec<PiMatchFieldModel> {
+    private static final String MATCH_TYPE = "matchType";
+    private static final String FIELD = "field";
     @Override
-    public ObjectNode encode(PiHeaderFieldTypeModel headerFieldType, CodecContext context) {
+    public ObjectNode encode(PiMatchFieldModel matchFieldModel, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        result.put(NAME, headerFieldType.name());
-        result.put(BIT_WIDTH, headerFieldType.bitWidth());
+        result.put(MATCH_TYPE, matchFieldModel.matchType().toString());
+        result.put(FIELD, matchFieldModel.id().toString());
         return result;
     }
 }
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java
index 6b42c8d..28a7010 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiPipelineModelCodec.java
@@ -21,7 +21,6 @@
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.net.pi.model.PiActionModel;
-import org.onosproject.net.pi.model.PiHeaderModel;
 import org.onosproject.net.pi.model.PiPipelineModel;
 import org.onosproject.net.pi.model.PiTableModel;
 
@@ -29,19 +28,17 @@
  * Codec for PiPipelineModel.
  */
 public class PiPipelineModelCodec extends JsonCodec<PiPipelineModel> {
-    private static final String HEADERS = "headers";
     private static final String ACTIONS = "actions";
     private static final String TABLES = "tables";
 
     @Override
     public ObjectNode encode(PiPipelineModel pipeline, CodecContext context) {
         ObjectNode result = context.mapper().createObjectNode();
-        ArrayNode headers = result.putArray(HEADERS);
-        pipeline.headers().stream()
-                .map(header -> context.encode(header, PiHeaderModel.class))
-                .forEach(headers::add);
         ArrayNode actions = result.putArray(ACTIONS);
-        pipeline.actions().stream()
+        pipeline.tables()
+                .stream()
+                .flatMap(piTableModel -> piTableModel.actions().stream())
+                .distinct()
                 .map(action -> context.encode(action, PiActionModel.class))
                 .forEach(actions::add);
         ArrayNode tables = result.putArray(TABLES);
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiTableMatchFieldModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiTableMatchFieldModelCodec.java
deleted file mode 100644
index a94bcba..0000000
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiTableMatchFieldModelCodec.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2017-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.codec.impl;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.codec.CodecContext;
-import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiHeaderFieldTypeModel;
-import org.onosproject.net.pi.model.PiHeaderModel;
-import org.onosproject.net.pi.model.PiTableMatchFieldModel;
-
-/**
- * Codec for PiTableMatchFieldModel.
- */
-public class PiTableMatchFieldModelCodec extends JsonCodec<PiTableMatchFieldModel> {
-    private static final String MATCH_TYPE = "matchType";
-    private static final String HEADER = "header";
-    private static final String FIELD = "field";
-    @Override
-    public ObjectNode encode(PiTableMatchFieldModel tableMatchField, CodecContext context) {
-        ObjectNode result = context.mapper().createObjectNode();
-        result.put(MATCH_TYPE, tableMatchField.matchType().toString());
-        PiHeaderModel header = tableMatchField.field().header();
-        PiHeaderFieldTypeModel field = tableMatchField.field().type();
-        ObjectNode headerData = context.encode(header, PiHeaderModel.class);
-        ObjectNode headerFieldData = context.encode(field, PiHeaderFieldTypeModel.class);
-        result.set(HEADER, headerData);
-        result.set(FIELD, headerFieldData);
-        return result;
-    }
-}
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java
index 052e083..adf8bd7 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PiTableModelCodec.java
@@ -20,7 +20,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
-import org.onosproject.net.pi.model.PiTableMatchFieldModel;
+import org.onosproject.net.pi.model.PiMatchFieldModel;
 import org.onosproject.net.pi.model.PiTableModel;
 
 /**
@@ -40,21 +40,21 @@
 
         ObjectNode result = context.mapper().createObjectNode();
 
-        result.put(NAME, table.name());
+        result.put(NAME, table.id().toString());
         result.put(MAX_SIZE, table.maxSize());
-        result.put(HAS_COUNTERS, table.hasCounters());
+        result.put(HAS_COUNTERS, table.counters().size() > 0);
         result.put(SUPPORT_AGING, table.supportsAging());
 
         ArrayNode matchFields = result.putArray(MATCH_FIELDS);
         table.matchFields().forEach(matchField -> {
             ObjectNode matchFieldData =
-                    context.encode(matchField, PiTableMatchFieldModel.class);
+                    context.encode(matchField, PiMatchFieldModel.class);
             matchFields.add(matchFieldData);
         });
 
         ArrayNode actions = result.putArray(ACTIONS);
         table.actions().forEach(action -> {
-            actions.add(action.name());
+            actions.add(action.id().toString());
         });
 
         return result;
