diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
index 4ba6a5d..0ae2d82 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
@@ -123,7 +123,7 @@
         }
 
         ArrayNode instr = mapper.createArrayNode();
-        for (Instruction i : flow.treatment().instructions()) {
+        for (Instruction i : flow.treatment().allInstructions()) {
             instr.add(i.toString());
         }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java
index 89877dd..f4f4d06 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java
@@ -354,8 +354,8 @@
             if (!ci.selector().criteria().isEmpty()) {
                 print("    selector=%s", ci.selector().criteria());
             }
-            if (!ci.treatment().instructions().isEmpty()) {
-                print("    treatment=%s", ci.treatment().instructions());
+            if (!ci.treatment().allInstructions().isEmpty()) {
+                print("    treatment=%s", ci.treatment().allInstructions());
             }
             if (ci.constraints() != null && !ci.constraints().isEmpty()) {
                 print("    constraints=%s", ci.constraints());
@@ -423,8 +423,8 @@
             if (!ci.selector().criteria().isEmpty()) {
                 result.put("selector", ci.selector().criteria().toString());
             }
-            if (!ci.treatment().instructions().isEmpty()) {
-                result.put("treatment", ci.treatment().instructions().toString());
+            if (!ci.treatment().allInstructions().isEmpty()) {
+                result.put("treatment", ci.treatment().allInstructions().toString());
             }
         }
 
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index 5b2343e..da3cac6 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -32,6 +32,8 @@
 import java.util.List;
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Default traffic treatment implementation.
  */
@@ -52,7 +54,7 @@
      * @param instructions treatment instructions
      */
     private DefaultTrafficTreatment(List<Instruction> instructions) {
-        this.immediate = ImmutableList.copyOf(instructions);
+        this.immediate = ImmutableList.copyOf(checkNotNull(instructions));
         this.deferred = ImmutableList.of();
         this.hasClear = false;
         this.table = null;
@@ -62,19 +64,14 @@
                                    List<Instruction> immediate,
                                    Instructions.TableTypeTransition table,
                                    boolean clear) {
-        this.immediate = ImmutableList.copyOf(immediate);
-        this.deferred = ImmutableList.copyOf(deferred);
+        this.immediate = ImmutableList.copyOf(checkNotNull(immediate));
+        this.deferred = ImmutableList.copyOf(checkNotNull(deferred));
         this.table = table;
         this.hasClear = clear;
 
     }
 
     @Override
-    public List<Instruction> instructions() {
-        return immediate;
-    }
-
-    @Override
     public List<Instruction> deferred() {
         return deferred;
     }
@@ -184,7 +181,7 @@
         // Creates a new builder based off an existing treatment
         //FIXME only works for immediate instruction sets.
         private Builder(TrafficTreatment treatment) {
-            for (Instruction instruction : treatment.instructions()) {
+            for (Instruction instruction : treatment.immediate()) {
                 add(instruction);
             }
         }
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index 0732e35..a2254fa 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -32,14 +32,6 @@
 public interface TrafficTreatment {
 
     /**
-     * Returns list of instructions on how to treat traffic.
-     *
-     * @return list of treatment instructions
-     */
-    @Deprecated
-    List<Instruction> instructions();
-
-    /**
      * Returns the list of treatment instructions that will be applied
      * further down the pipeline.
      * @return list of treatment instructions
diff --git a/core/api/src/main/java/org/onosproject/net/flowext/DefaultFlowRuleExt.java b/core/api/src/main/java/org/onosproject/net/flowext/DefaultFlowRuleExt.java
index 721cced..c72d4db 100644
--- a/core/api/src/main/java/org/onosproject/net/flowext/DefaultFlowRuleExt.java
+++ b/core/api/src/main/java/org/onosproject/net/flowext/DefaultFlowRuleExt.java
@@ -102,7 +102,7 @@
                 .add("deviceId", deviceId())
                 .add("priority", priority())
                 .add("selector", selector().criteria())
-                .add("treatment", treatment() == null ? "N/A" : treatment().instructions())
+                .add("treatment", treatment() == null ? "N/A" : treatment().allInstructions())
                         //.add("created", created)
                 .add("flowEntryExtension", flowEntryExtension)
                 .toString();
diff --git a/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java b/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java
index ff1271e..e4910d5 100644
--- a/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java
+++ b/core/api/src/main/java/org/onosproject/net/group/DefaultGroupBucket.java
@@ -15,15 +15,17 @@
  */
 package org.onosproject.net.group;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Objects;
-
 import org.onosproject.core.GroupId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.instructions.Instruction;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Group bucket implementation. A group bucket is collection of
@@ -206,9 +208,12 @@
         }
         if (obj instanceof DefaultGroupBucket) {
             DefaultGroupBucket that = (DefaultGroupBucket) obj;
+            List<Instruction> myInstructions = this.treatment.allInstructions();
+            List<Instruction> theirInstructions = that.treatment.allInstructions();
+
             return Objects.equals(type, that.type) &&
-                   this.treatment.instructions().containsAll(that.treatment.instructions()) &&
-                   that.treatment.instructions().containsAll(this.treatment.instructions());
+                   myInstructions.containsAll(theirInstructions) &&
+                   theirInstructions.containsAll(myInstructions);
         }
         return false;
     }
diff --git a/core/api/src/test/java/org/onosproject/net/flow/DefaultTrafficTreatmentTest.java b/core/api/src/test/java/org/onosproject/net/flow/DefaultTrafficTreatmentTest.java
index 1086585..ad04602 100644
--- a/core/api/src/test/java/org/onosproject/net/flow/DefaultTrafficTreatmentTest.java
+++ b/core/api/src/test/java/org/onosproject/net/flow/DefaultTrafficTreatmentTest.java
@@ -75,14 +75,24 @@
 
         final TrafficTreatment treatment1 = builder1.build();
 
-        final List<Instruction> instructions1 = treatment1.instructions();
+        final List<Instruction> instructions1 = treatment1.immediate();
         assertThat(instructions1, hasSize(9));
 
         builder1.drop();
         builder1.add(instruction1);
 
-        final List<Instruction> instructions2 = builder1.build().instructions();
+        final List<Instruction> instructions2 = builder1.build().immediate();
         assertThat(instructions2, hasSize(11));
+
+        builder1.deferred()
+                .popVlan()
+                .pushVlan()
+                .setVlanId(VlanId.vlanId((short) 5));
+
+        final List<Instruction> instructions3 = builder1.build().immediate();
+        assertThat(instructions3, hasSize(11));
+        final List<Instruction> instructions4 = builder1.build().deferred();
+        assertThat(instructions4, hasSize(3));
     }
 
     /**
diff --git a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
index 4ae09fb..14abd83 100644
--- a/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
+++ b/core/api/src/test/java/org/onosproject/net/intent/IntentTestsMocks.java
@@ -93,18 +93,13 @@
      */
     public static class MockTreatment implements TrafficTreatment {
         @Override
-        public List<Instruction> instructions() {
-            return new ArrayList<>();
-        }
-
-        @Override
         public List<Instruction> deferred() {
             return null;
         }
 
         @Override
         public List<Instruction> immediate() {
-            return null;
+            return new ArrayList<>();
         }
 
         @Override
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
index 786c461..23dae38 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/TrafficTreatmentCodec.java
@@ -36,12 +36,17 @@
         final ObjectNode result = context.mapper().createObjectNode();
         final ArrayNode jsonInstructions = result.putArray("instructions");
 
-        if (treatment.instructions() != null) {
-            final JsonCodec<Instruction> instructionCodec =
-                    context.codec(Instruction.class);
-            for (final Instruction instruction : treatment.instructions()) {
-                jsonInstructions.add(instructionCodec.encode(instruction, context));
-            }
+        final JsonCodec<Instruction> instructionCodec =
+                context.codec(Instruction.class);
+
+        for (final Instruction instruction : treatment.immediate()) {
+            jsonInstructions.add(instructionCodec.encode(instruction, context));
+        }
+
+        final ArrayNode jsonDeferred = result.putArray("deferred");
+
+        for (final Instruction instruction : treatment.deferred()) {
+            jsonDeferred.add(instructionCodec.encode(instruction, context));
         }
 
         return result;
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/IntentJsonMatcher.java b/core/common/src/test/java/org/onosproject/codec/impl/IntentJsonMatcher.java
index 5ae8f20..d30999d 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/IntentJsonMatcher.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/IntentJsonMatcher.java
@@ -370,7 +370,7 @@
         // check treatment
         final JsonNode jsonTreatment = jsonIntent.get("treatment");
         final TrafficTreatment treatment = connectivityIntent.treatment();
-        final List<Instruction> instructions = treatment.instructions();
+        final List<Instruction> instructions = treatment.immediate();
         final JsonNode jsonInstructions = jsonTreatment.get("instructions");
         if (jsonInstructions.size() != instructions.size()) {
             description.appendText("size of instructions array is "
diff --git a/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java b/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
index 881961f..6669578 100644
--- a/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
@@ -557,11 +557,6 @@
         }
 
         @Override
-        public List<Instruction> instructions() {
-            return null;
-        }
-
-        @Override
         public List<Instruction> deferred() {
             return null;
         }
diff --git a/core/net/src/test/java/org/onosproject/net/host/impl/HostMonitorTest.java b/core/net/src/test/java/org/onosproject/net/host/impl/HostMonitorTest.java
index 03276941..e8fccde 100644
--- a/core/net/src/test/java/org/onosproject/net/host/impl/HostMonitorTest.java
+++ b/core/net/src/test/java/org/onosproject/net/host/impl/HostMonitorTest.java
@@ -156,8 +156,8 @@
         OutboundPacket packet = packetService.packets.get(0);
 
         // Check the output port is correct
-        assertEquals(1, packet.treatment().instructions().size());
-        Instruction instruction = packet.treatment().instructions().get(0);
+        assertEquals(1, packet.treatment().immediate().size());
+        Instruction instruction = packet.treatment().immediate().get(0);
         assertTrue(instruction instanceof OutputInstruction);
         OutputInstruction oi = (OutputInstruction) instruction;
         assertEquals(portNum, oi.port());
@@ -225,8 +225,8 @@
         OutboundPacket packet = packetService.packets.get(0);
 
         // Check the output port is correct
-        assertEquals(1, packet.treatment().instructions().size());
-        Instruction instruction = packet.treatment().instructions().get(0);
+        assertEquals(1, packet.treatment().immediate().size());
+        Instruction instruction = packet.treatment().immediate().get(0);
         assertTrue(instruction instanceof OutputInstruction);
         OutputInstruction oi = (OutputInstruction) instruction;
         assertEquals(portNum, oi.port());
diff --git a/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java b/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java
index 09f4f14..5a4eb8b 100644
--- a/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/proxyarp/impl/ProxyArpManagerTest.java
@@ -503,9 +503,9 @@
     private void verifyPacketOut(Ethernet expected, ConnectPoint outPort,
             OutboundPacket actual) {
         assertArrayEquals(expected.serialize(), actual.data().array());
-        assertEquals(1, actual.treatment().instructions().size());
+        assertEquals(1, actual.treatment().immediate().size());
         assertEquals(outPort.deviceId(), actual.sendThrough());
-        Instruction instruction = actual.treatment().instructions().get(0);
+        Instruction instruction = actual.treatment().immediate().get(0);
         assertTrue(instruction instanceof OutputInstruction);
         assertEquals(outPort.port(), ((OutputInstruction) instruction).port());
     }
diff --git a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleStatisticStore.java b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleStatisticStore.java
index 9cfa41d..e4bf7dd 100644
--- a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleStatisticStore.java
+++ b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleStatisticStore.java
@@ -155,15 +155,7 @@
     private ConnectPoint buildConnectPoint(FlowRule rule) {
         PortNumber port = getOutput(rule);
 
-        boolean hasGoto = rule.treatment().instructions()
-                .stream()
-                .anyMatch(i -> (i instanceof Instructions.GroupInstruction)
-                        || (i instanceof Instructions.TableTypeTransition));
-
         if (port == null) {
-            if (!hasGoto) {
-                log.debug("Rule {} has no output.", rule);
-            }
             return null;
         }
         ConnectPoint cp = new ConnectPoint(rule.deviceId(), port);
@@ -171,7 +163,7 @@
     }
 
     private PortNumber getOutput(FlowRule rule) {
-        for (Instruction i : rule.treatment().instructions()) {
+        for (Instruction i : rule.treatment().immediate()) {
             if (i.type() == Instruction.Type.OUTPUT) {
                 Instructions.OutputInstruction out = (Instructions.OutputInstruction) i;
                 return out.port();
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
index e308299..d6ff82c 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java
@@ -138,7 +138,7 @@
         if (treatment == null) {
             return acts;
         }
-        for (Instruction i : treatment.instructions()) {
+        for (Instruction i : treatment.immediate()) {
             switch (i.type()) {
             case DROP:
                 log.warn("Saw drop action; assigning drop action");
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
index 1554fa3..61757bd 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
@@ -186,24 +186,6 @@
         return fm;
     }
 
-
-    private List<OFInstruction> buildInstructions() {
-        List<OFInstruction> instructions = new LinkedList<>();
-        if (treatment == null) {
-            return instructions;
-        }
-        for (Instruction i : treatment.instructions()) {
-            switch (i.type()) {
-                case TABLE:
-                    instructions.add(buildTableGoto(((Instructions.TableTypeTransition) i)));
-                    break;
-                default:
-                    break;
-            }
-        }
-        return instructions;
-    }
-
     private List<OFAction> buildActions(List<Instruction> treatments) {
         List<OFAction> actions = new LinkedList<>();
         boolean tableFound = false;
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
index 25ece46..cd88017 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
@@ -184,7 +184,7 @@
             return actions;
         }
 
-        for (Instruction i : treatment.instructions()) {
+        for (Instruction i : treatment.allInstructions()) {
             switch (i.type()) {
                 case DROP:
                     log.warn("Saw drop action; assigning drop action");
diff --git a/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowCorePacketContext.java b/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowCorePacketContext.java
index a5d7a68..5b7487b 100644
--- a/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowCorePacketContext.java
+++ b/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowCorePacketContext.java
@@ -55,7 +55,7 @@
     }
 
     private void sendPacket(Ethernet eth) {
-        List<Instruction> ins = treatmentBuilder().build().instructions();
+        List<Instruction> ins = treatmentBuilder().build().allInstructions();
         OFPort p = null;
         //TODO: support arbitrary list of treatments must be supported in ofPacketContext
         for (Instruction i : ins) {
diff --git a/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java b/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java
index 8cae352..0cf67f4 100644
--- a/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java
+++ b/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java
@@ -113,7 +113,7 @@
         //Ethernet eth = new Ethernet();
         //eth.deserialize(packet.data().array(), 0, packet.data().array().length);
         OFPortDesc p = null;
-        for (Instruction inst : packet.treatment().instructions()) {
+        for (Instruction inst : packet.treatment().allInstructions()) {
             if (inst.type().equals(Instruction.Type.OUTPUT)) {
                 p = portDesc(((OutputInstruction) inst).port());
                 OFPacketOut po = packetOut(sw, packet.data().array(), p.getPortNo());
diff --git a/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java b/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java
index a02690f..64e045d 100644
--- a/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java
@@ -298,12 +298,12 @@
             if (flow.treatment() != null) {
                 final JsonObject jsonTreatment = jsonFlow.get("treatment").asObject();
                 final JsonArray jsonInstructions = jsonTreatment.get("instructions").asArray();
-                if (flow.treatment().instructions().size() != jsonInstructions.size()) {
+                if (flow.treatment().immediate().size() != jsonInstructions.size()) {
                     reason = "instructions array size of " +
-                            Integer.toString(flow.treatment().instructions().size());
+                            Integer.toString(flow.treatment().immediate().size());
                     return false;
                 }
-                for (final Instruction instruction : flow.treatment().instructions()) {
+                for (final Instruction instruction : flow.treatment().immediate()) {
                     boolean instructionFound = false;
                     for (int instructionIndex = 0; instructionIndex < jsonInstructions.size(); instructionIndex++) {
                         final String jsonType =
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
index 7ffc275..50e39d7 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
@@ -534,7 +534,7 @@
         PortNumber out = link.src().port();
         for (FlowEntry entry : entries) {
             TrafficTreatment treatment = entry.treatment();
-            for (Instruction instruction : treatment.instructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
                 if (instruction.type() == Instruction.Type.OUTPUT &&
                         ((OutputInstruction) instruction).port().equals(out)) {
                     count++;
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java
index b9b50ca..b48231e 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessages.java
@@ -528,7 +528,7 @@
         PortNumber out = link.src().port();
         for (FlowEntry entry : entries) {
             TrafficTreatment treatment = entry.treatment();
-            for (Instruction instruction : treatment.instructions()) {
+            for (Instruction instruction : treatment.allInstructions()) {
                 if (instruction.type() == Instruction.Type.OUTPUT &&
                         ((OutputInstruction) instruction).port().equals(out)) {
                     count++;
