diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntConfig.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntConfig.java
new file mode 100644
index 0000000..a3e6148
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntConfig.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2015-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.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Network-level INT configuration.
+ */
+@Beta
+public final class IntConfig {
+    /**
+     * Represents a type of telemetry spec to collect in the dataplane.
+     */
+    enum TelemetrySpec {
+        /**
+         * Embeds telemetry metadata according to the INT specification.
+         *
+         * @see <a href="https://github.com/p4lang/p4-applications/blob/master/docs/INT.pdf">
+         *     INT sepcification</a>
+         */
+        INT,
+        /**
+         * Embeds telemetry metadata according to the OAM specification.
+         *
+         * @see <a href="https://tools.ietf.org/html/draft-ietf-ippm-ioam-data">
+         *     Data fields for In-situ OAM</a>
+         */
+        IOAM
+    }
+
+    private final IpAddress collectorIp;
+    private final TpPort collectorPort;
+    private final MacAddress collectorNextHopMac;
+    private final IpAddress sinkIp;
+    private final MacAddress sinkMac;
+    private final TelemetrySpec spec;
+    private boolean enabled;
+
+    private IntConfig(IpAddress collectorIp, TpPort collectorPort, MacAddress collectorNextHopMac,
+                      IpAddress sinkIp, MacAddress sinkMac, TelemetrySpec spec, boolean enabled) {
+        this.collectorIp = collectorIp;
+        this.collectorPort = collectorPort;
+        this.collectorNextHopMac = collectorNextHopMac;
+        this.sinkIp = sinkIp;
+        this.sinkMac = sinkMac;
+        this.spec = spec;
+        this.enabled = enabled;
+    }
+
+    /**
+     * Returns IP address of the collector.
+     * This is the destination IP address that will be used for all INT reports
+     * generated by all sink devices.
+     *
+     * @return collector IP address
+     */
+    public IpAddress collectorIp() {
+        return collectorIp;
+    }
+
+    /**
+     * Returns UDP port number of the collector.
+     * This is the destination UDP port number that will be used for all INT reports
+     * generated by all sink devices.
+     *
+     * @return collector UDP port number
+     */
+    public TpPort collectorPort() {
+        return collectorPort;
+    }
+
+    /**
+     * Returns MAC address of next hop of INT report packets.
+     * This can be either MAC address of the collector or a router.
+     * This is an optional parameter, which means that the usage of this
+     * parameter depends on IntProgrammable implementation.
+     * (e.g., If a report packet needs to be routed to reach the collector,
+     * IntProgrammable will ignore this value and choose next hop router's MAC address.
+     * If a collector itself is the next hop of INT report packets, then
+     * this value will be used as a destination MAC address for all INT report packets.)
+     *
+     * @return MAC address of next hop of INT report packets
+     */
+    public MacAddress collectorNextHopMac() {
+        return collectorNextHopMac;
+    }
+
+    /**
+     * Returns IP address of the sink device.
+     * All sink devices share this address as the source IP address
+     * for all INT reports.
+     *
+     * @return sink device's IP address
+     */
+    public IpAddress sinkIp() {
+        return sinkIp;
+    }
+
+    /**
+     * Returns MAC address of the sink device.
+     * All sink devices share this address as the source MAC address
+     * for all INT reports.
+     *
+     * @return sink device's MAC address
+     */
+    public MacAddress sinkMac() {
+        return sinkMac;
+    }
+
+    /**
+     * Returns the type of telemetry spec as per {@link TelemetrySpec}.
+     *
+     * @return telemetry spec
+     */
+    public TelemetrySpec spec() {
+        return spec;
+    }
+
+    /**
+     * Returns the status of INT functionality.
+     *
+     * @return true if INT is enabled; false otherwise.
+     */
+    public boolean enabled() {
+        return enabled;
+    }
+
+    /**
+     * Returns a new builder.
+     *
+     * @return new builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * An IntConfig object builder.
+     */
+    public static final class Builder {
+
+        private IpAddress collectorIp;
+        private TpPort collectorPort;
+        private MacAddress collectorNextHopMac;
+        private IpAddress sinkIp;
+        private MacAddress sinkMac;
+        private TelemetrySpec spec = TelemetrySpec.INT;
+        private boolean enabled = false;
+
+        /**
+         * Assigns a collector IP address to the IntConfig object.
+         *
+         * @param collectorIp IP address of the collector
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder withCollectorIp(IpAddress collectorIp) {
+            this.collectorIp = collectorIp;
+            return this;
+        }
+
+        /**
+         * Assigns a collector UDP port to the IntConfig object.
+         *
+         * @param collectorPort UDP port number of the collector
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder withCollectorPort(TpPort collectorPort) {
+            this.collectorPort = collectorPort;
+            return this;
+        }
+
+        /**
+         * Assigns a MAC address of the next hop to the collector
+         * to the IntConfig object.
+         *
+         * @param collectorNextHopMac MAC address of the collector
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder withCollectorNextHopMac(MacAddress collectorNextHopMac) {
+            this.collectorNextHopMac = collectorNextHopMac;
+            return this;
+        }
+
+        /**
+         * Assigns an IP address of the sink device to the IntConfig object.
+         *
+         * @param sinkIp sink device's IP address
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder withSinkIp(IpAddress sinkIp) {
+            this.sinkIp = sinkIp;
+            return this;
+        }
+
+        /**
+         * Assigns a MAC address of the sink device to the IntConfig object.
+         *
+         * @param sinkMac sink device's MAC address
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder withSinkMac(MacAddress sinkMac) {
+            this.sinkMac = sinkMac;
+            return this;
+        }
+
+        /**
+         * Assigns the type of telemetry spec to the IntConfig object.
+         *
+         * @param spec telemetry spec
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder withTelemetrySpec(TelemetrySpec spec) {
+            this.spec = spec;
+            return this;
+        }
+
+        /**
+         * Assigns the status of INT.
+         * True to enable INT functionality, false otherwise.
+         *
+         * @param enabled the status of INT
+         * @return an IntConfig builder
+         */
+        public IntConfig.Builder enabled(boolean enabled) {
+            this.enabled = enabled;
+            return this;
+        }
+
+        /**
+         * Builds the IntConfig object.
+         *
+         * @return an IntConfig object
+         */
+        public IntConfig build() {
+            checkNotNull(collectorIp, "Collector IP should be specified.");
+            checkNotNull(collectorPort, "Collector port number should be specified.");
+            checkNotNull(collectorNextHopMac, "Next hop MAC address for report packets should be provided.");
+            checkNotNull(sinkIp, "Sink IP address for report packets should be specified.");
+            checkNotNull(sinkMac, "Sink MAC address for report packets should be specified.");
+            return new IntConfig(collectorIp, collectorPort, collectorNextHopMac,
+                                 sinkIp, sinkMac, spec, enabled);
+        }
+    }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntent.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntent.java
new file mode 100644
index 0000000..21d5381
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntent.java
@@ -0,0 +1,295 @@
+/*
+ * Copyright 2015-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.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents an INT monitoring intent. Each intent is made up of a traffic slice
+ * to be monitored, as a form of TrafficSelector, types of metadata to collect,
+ * and other required parameters (INT header type, INT Report type, and Telemetry mode).
+ *
+ * IntIntent is converted to a set of flow rules to be installed on each INT-capable
+ * switch in the network, by IntService.
+ *
+ * Terminologies and descriptions are borrowed from INT specification.
+ *
+ * @see <a href="https://github.com/p4lang/p4-applications/blob/master/docs/INT.pdf">
+ *     INT sepcification</a>
+ */
+@Beta
+public final class IntIntent {
+    /**
+     * Represents a type of INT metadata.
+     */
+    public enum IntMetadataType {
+        /**
+         * The unique ID of a switch.
+         */
+        SWITCH_ID,
+        /**
+         * The ports on which the INT packet was received and sent out.
+         */
+        L1_PORT_ID,
+        /**
+         * Time taken for the INT packet to be switched within the device.
+         */
+        HOP_LATENCY,
+        /**
+         * The build-up of traffic in the queue that the INT packet observes
+         * in the device while being forwarded.
+         */
+        QUEUE_OCCUPANCY,
+        /**
+         * The device local time when the INT packet was received on the ingress port.
+         */
+        INGRESS_TIMESTAMP,
+        /**
+         * The device local time when the INT packet was processed by the egress port.
+         */
+        EGRESS_TIMESTAMP,
+        /**
+         * The logical ports on which the INT packet was received and sent out.
+         */
+        L2_PORT_ID,
+        /**
+         * Current utilization of the egress port via witch the INT packet was sent out.
+         */
+        EGRESS_TX_UTIL
+    }
+
+    /**
+     * Represents an INT header type.
+     */
+    public enum IntHeaderType {
+        /**
+         * Intemediate devices must process this type of INT header.
+         */
+        HOP_BY_HOP,
+        /**
+         * Intemediate devices must ignore this type of INT header.
+         */
+        DESTINATION
+    }
+
+    /**
+     * Represents a type of telemetry report.
+     */
+    public enum IntReportType {
+        /**
+         * Report for flows matching certain definitions.
+         */
+        TRACKED_FLOW,
+        /**
+         * Reports for all dropeed packets matching a drop watchlist.
+         */
+        DROPPED_PACKET,
+        /**
+         * Reports for traffic entering a specific queue during a period of queue congestion.
+         */
+        CONGESTED_QUEUE
+    }
+
+    /**
+     * Represents telemetry mode.
+     */
+    public enum TelemetryMode {
+        /**
+         * Each network device generates its own telemetry reports.
+         */
+        POSTCARD,
+        /**
+         * Telemetry metadata is embedded in between the original
+         * headers of data packets as they traverse the network.
+         */
+        INBAND_TELEMETRY
+    }
+
+    private static final int DEFAULT_PRIORITY = 10;
+
+    // TrafficSelector to describe target flows to monitor
+    private final TrafficSelector selector;
+    // set of metadata type to collect
+    private final Set<IntMetadataType> metadataTypes;
+    // hop-by-hop or destination
+    private final IntHeaderType headerType;
+    // telemetry report types
+    private final Set<IntReportType> reportTypes;
+    // telemetry mode
+    private final TelemetryMode telemetryMode;
+
+    /**
+     * Creates an IntIntent.
+     *
+     * @param selector      the traffic selector that identifies traffic to enable INT
+     * @param metadataTypes the types of metadata to collect
+     * @param headerType    the type of INT header
+     * @param reportTypes   the types of report to be generated
+     * @param telemetryMode the telemetry mode
+     */
+    private IntIntent(TrafficSelector selector, Set<IntMetadataType> metadataTypes,
+                      IntHeaderType headerType, Set<IntReportType> reportTypes,
+                      TelemetryMode telemetryMode) {
+        this.selector = selector;
+        this.metadataTypes = new HashSet<>(metadataTypes);
+        this.headerType = headerType;
+        this.reportTypes = new HashSet<>(reportTypes);
+        this.telemetryMode = telemetryMode;
+    }
+
+    /**
+     * Returns traffic selector of this intent.
+     *
+     * @return traffic selector
+     */
+    public TrafficSelector selector() {
+        return selector;
+    }
+
+    /**
+     * Returns a set of metadata type to be collected by this intent.
+     *
+     * @return set of metadata type
+     */
+    public Set<IntMetadataType> metadataTypes() {
+        return metadataTypes;
+    }
+
+    /**
+     * Returns a INT header type specified in this intent.
+     *
+     * @return INT header type
+     */
+    public IntHeaderType headerType() {
+        return headerType;
+    }
+
+    /**
+     * Returns a set of report type to be generated.
+     *
+     * @return set of report type
+     */
+    public Set<IntReportType> reportTypes() {
+        return reportTypes;
+    }
+
+    /**
+     * Returns a telemetry mode specified in this intent.
+     *
+     * @return telemtry mode
+     */
+    public TelemetryMode telemetryMode() {
+        return telemetryMode;
+    }
+
+    /**
+     * Returns a new builder.
+     *
+     * @return new builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * An IntIntent builder.
+     */
+    public static final class Builder {
+        private TrafficSelector selector = DefaultTrafficSelector.emptySelector();
+        private Set<IntMetadataType> metadataTypes = new HashSet<>();
+        private IntHeaderType headerType = IntHeaderType.HOP_BY_HOP;
+        private Set<IntReportType> reportTypes = new HashSet<>();
+        private TelemetryMode telemetryMode = TelemetryMode.INBAND_TELEMETRY;
+
+        /**
+         * Assigns a selector to the IntIntent.
+         *
+         * @param selector a traffic selector
+         * @return an IntIntent builder
+         */
+        public IntIntent.Builder withSelector(TrafficSelector selector) {
+            this.selector = selector;
+            return this;
+        }
+
+        /**
+         * Add a metadata type to the IntIntent.
+         *
+         * @param metadataType a type of metadata to collect
+         * @return an IntIntent builder
+         */
+        public IntIntent.Builder withMetadataType(IntMetadataType metadataType) {
+            this.metadataTypes.add(metadataType);
+            return this;
+        }
+
+        /**
+         * Assigns a header type to the IntIntent.
+         *
+         * @param headerType a header type
+         * @return an IntIntent builder
+         */
+        public IntIntent.Builder withHeaderType(IntHeaderType headerType) {
+            this.headerType = headerType;
+            return this;
+        }
+
+        /**
+         * Add a report type to the IntIntent.
+         *
+         * @param reportType a type of report
+         * @return an IntIntent builder
+         */
+        public IntIntent.Builder withReportType(IntReportType reportType) {
+            this.reportTypes.add(reportType);
+            return this;
+        }
+
+        /**
+         * Assigns a telemetry mode to the IntIntent.
+         *
+         * @param telemetryMode a telemetry mode
+         * @return an IntIntent builder
+         */
+        public IntIntent.Builder withTelemetryMode(TelemetryMode telemetryMode) {
+            this.telemetryMode = telemetryMode;
+            return this;
+        }
+
+        /**
+         * Builds the IntIntent.
+         *
+         * @return an IntIntent
+         */
+        public IntIntent build() {
+            checkArgument(!selector.criteria().isEmpty(), "Empty selector cannot match any flow.");
+            checkArgument(!metadataTypes.isEmpty(), "Metadata types cannot be empty.");
+            checkNotNull(headerType, "Header type cannot be null.");
+            checkNotNull(!reportTypes.isEmpty(), "Report types cannot be empty.");
+            checkNotNull(telemetryMode, "Telemetry mode cannot be null.");
+
+            return new IntIntent(selector, metadataTypes, headerType, reportTypes, telemetryMode);
+        }
+    }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntentId.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntentId.java
new file mode 100644
index 0000000..293cbdb
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntIntentId.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2018-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.inbandtelemetry.api;
+
+import org.onlab.util.Identifier;
+
+/**
+ * Representation of a IntIntent ID.
+ */
+public final class IntIntentId extends Identifier<Long> {
+    private IntIntentId(long id) {
+        super(id);
+    }
+
+    /**
+     * Creates an IntIntent ID from a given long value.
+     *
+     * @param id long value
+     * @return IntIntent ID
+     */
+    public static IntIntentId valueOf(long id) {
+        return new IntIntentId(id);
+    }
+
+    /**
+     * Gets the IntIntent ID value.
+     *
+     * @return IntIntent ID value as long
+     */
+    public long value() {
+        return this.identifier;
+    }
+
+    @Override
+    public String toString() {
+        return Long.toHexString(this.identifier);
+    }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntObjective.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntObjective.java
new file mode 100644
index 0000000..da8dc29
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntObjective.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2018-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.inbandtelemetry.api;
+
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.inbandtelemetry.api.IntIntent.IntMetadataType;
+import static org.onosproject.inbandtelemetry.api.IntIntent.IntHeaderType;
+
+public final class IntObjective {
+
+    private static final int DEFAULT_PRIORITY = 10;
+
+    // TrafficSelector to describe target flows to monitor
+    private final TrafficSelector selector;
+    // Set of metadata types to collect
+    private final Set<IntMetadataType> metadataTypes;
+    // Type of header (either hop-by-hop or destination)
+    private final IntHeaderType headerType;
+
+    /**
+     * Creates an IntObjective.
+     *
+     * @param selector      the traffic selector that identifies traffic to enable INT
+     * @param metadataTypes a set of metadata types to collect
+     * @param headerType    the type of INT header
+     */
+    private IntObjective(TrafficSelector selector, Set<IntMetadataType> metadataTypes,
+                         IntHeaderType headerType) {
+        this.selector = selector;
+        this.metadataTypes = metadataTypes;
+        this.headerType = headerType;
+    }
+
+    /**
+     * Returns traffic selector of this objective.
+     *
+     * @return traffic selector
+     */
+    public TrafficSelector selector() {
+        return selector;
+    }
+
+    /**
+     * Returns a set of metadata types specified in this objective.
+     *
+     * @return instruction bitmap
+     */
+    public Set<IntMetadataType> metadataTypes() {
+        return metadataTypes;
+    }
+
+    /**
+     * Returns a INT header type specified in this objective.
+     *
+     * @return INT header type
+     */
+    public IntHeaderType headerType() {
+        return headerType;
+    }
+
+    /**
+     * An IntObjective builder.
+     */
+    public static final class Builder {
+        private TrafficSelector selector = DefaultTrafficSelector.emptySelector();
+        private Set<IntMetadataType> metadataTypes = new HashSet<>();
+        private IntHeaderType headerType = IntHeaderType.HOP_BY_HOP;
+
+        /**
+         * Assigns a selector to the IntObjective.
+         *
+         * @param selector a traffic selector
+         * @return an IntObjective builder
+         */
+        public IntObjective.Builder withSelector(TrafficSelector selector) {
+            this.selector = selector;
+            return this;
+        }
+
+        /**
+         * Add a metadata type to the IntObjective.
+         *
+         * @param metadataTypes a set of metadata types
+         * @return an IntObjective builder
+         */
+        public IntObjective.Builder withMetadataTypes(Set<IntMetadataType> metadataTypes) {
+            this.metadataTypes.addAll(metadataTypes);
+            return this;
+        }
+
+        /**
+         * Assigns a header type to the IntObjective.
+         *
+         * @param headerType a header type
+         * @return an IntObjective builder
+         */
+        public IntObjective.Builder withHeaderType(IntHeaderType headerType) {
+            this.headerType = headerType;
+            return this;
+        }
+
+        /**
+         * Builds the IntObjective.
+         *
+         * @return an IntObjective
+         */
+        public IntObjective build() {
+            checkArgument(!selector.criteria().isEmpty(), "Empty selector cannot match any flow.");
+            checkArgument(!metadataTypes.isEmpty(), "Metadata types cannot be empty");
+            checkNotNull(headerType, "Header type cannot be null.");
+
+            return new IntObjective(selector, metadataTypes, headerType);
+        }
+    }
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntProgrammable.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntProgrammable.java
new file mode 100644
index 0000000..452b787
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntProgrammable.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018-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.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.driver.HandlerBehaviour;
+
+import java.util.concurrent.CompletableFuture;
+
+@Beta
+public interface IntProgrammable extends HandlerBehaviour {
+
+    /**
+     * Initializes the pipeline, by installing required flow rules
+     * not relevant to specific watchlist, report and event.
+     */
+    void init();
+
+    /**
+     * Adds a given IntObjective to the device.
+     *
+     * @param obj an IntObjective
+     * @return true if the objective is successfully added; false otherwise.
+     */
+    CompletableFuture<Boolean> addIntObjective(IntObjective obj);
+
+    /**
+     * Removes a given IntObjective entry from the device.
+     *
+     * @param obj an IntObjective
+     * @return true if the objective is successfully removed; false otherwise.
+     */
+    CompletableFuture<Boolean> removeIntObjective(IntObjective obj);
+
+    /**
+     * Set up report-related configuration.
+     *
+     * @param config a configuration regarding to the collector
+     * @return true if the objective is successfully added; false otherwise.
+     */
+    CompletableFuture<Boolean> setupIntConfig(IntConfig config);
+
+    //TODO: [ONOS-7616] Design IntEvent and related APIs
+}
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntService.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntService.java
new file mode 100644
index 0000000..ef2e1ad
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/IntService.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2015-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.inbandtelemetry.api;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.DeviceId;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Service for controlling INT-capable pipelines.
+ */
+@Beta
+public interface IntService {
+    /**
+     * Represents the role of INT-capable devices.
+     */
+    enum IntDeviceRole {
+        /**
+         * Intermediate device to add its own INT metadata to an INT packet by
+         * following the INT instruction in the INT header.
+         */
+        TRANSIT,
+        /**
+         * A device that creates, inserts INT headers into the packet, and
+         * extracts the INT headers.
+         */
+        SOURCE_SINK
+    }
+
+    /**
+     * Starts the INT functionalities in all INT-capable devices.
+     * This will include populating tables to process INT packets.
+     */
+    void startInt();
+
+    /**
+     * Starts the INT functionalities in specified set of INT transit devices.
+     * <p>
+     * Note: this is an experimental API, which can be either changed or removed.
+     *
+     * @param transitDevices set of devices to start INT functionalities
+     */
+    void startInt(Set<DeviceId> transitDevices);
+
+    /**
+     * Stops the INT functionalities in all INT-capable devices.
+     */
+    void stopInt();
+
+    /**
+     * Stops the INT functionalities in specified set of INT transit devices.
+     * <p>
+     * Note: this is an experimental API, which can be either changed or removed.
+     *
+     * @param transitDevices set of devices to stop INT functionalities
+     */
+    void stopInt(Set<DeviceId> transitDevices);
+
+    /**
+     * Configures all INT-capable devices with given configuration.
+     *
+     * @param cfg configuration to set up
+     */
+    void setConfig(IntConfig cfg);
+
+    /**
+     * Retrieves the INT configuration.
+     *
+     * @return configuration
+     */
+    IntConfig getConfig();
+
+    /**
+     * Installs an IntIntent to devices.
+     *
+     * @param intIntent an IntIntent
+     * @return an IntIntent ID corresponding to given intIntent
+     */
+    IntIntentId installIntIntent(IntIntent intIntent);
+
+    /**
+     * Removes an IntIntent from devices.
+     *
+     * @param intentId ID of the intIntent to remove
+     */
+    void removeIntIntent(IntIntentId intentId);
+
+    /**
+     * Returns an IntIntent for given intent ID.
+     *
+     * @param intentId ID of the intIntent to retrieve
+     * @return an IntIntent
+     */
+    IntIntent getIntIntent(IntIntentId intentId);
+
+    /**
+     * Returns all IntIntents installed in the network.
+     *
+     * @return an IntIntent
+     */
+    Map<IntIntentId, IntIntent> getIntIntents();
+
+    //TODO: [ONOS-7616] Design IntEvent and related APIs
+}
\ No newline at end of file
diff --git a/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/package-info.java b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/package-info.java
new file mode 100644
index 0000000..9e80ee5
--- /dev/null
+++ b/apps/inbandtelemetry/api/src/main/java/org/onosproject/inbandtelemetry/api/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2015-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.
+ */
+
+/**
+ * Service to control a network of devices capable of collecting and exporting
+ * data plane telemetry via in-band mechanism.
+ */
+package org.onosproject.inbandtelemetry.api;
