diff --git a/core/api/src/main/java/org/onosproject/net/intent/IntentId.java b/core/api/src/main/java/org/onosproject/net/intent/IntentId.java
index e2e45b9..b9a30d2 100644
--- a/core/api/src/main/java/org/onosproject/net/intent/IntentId.java
+++ b/core/api/src/main/java/org/onosproject/net/intent/IntentId.java
@@ -28,7 +28,7 @@
     private final long value;
 
     /**
-     * Creates an intent identifier from the specified string representation.
+     * Creates an intent identifier from the specified long representation.
      *
      * @param value long value
      * @return intent identifier
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/DomainEdge.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/DomainEdge.java
new file mode 100644
index 0000000..d13955a
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/DomainEdge.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import org.onlab.graph.AbstractEdge;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.Objects;
+
+/**
+ * Representation of a connection between an intent domain and a device. This
+ * must happen using a connect point that is part of both the domain and the
+ * device.
+ */
+@Beta
+public class DomainEdge extends AbstractEdge<DomainVertex> {
+    ConnectPoint connectPoint;
+
+    public DomainEdge(DomainVertex src, DomainVertex dst, ConnectPoint connectPoint) {
+        super(src, dst);
+        this.connectPoint = connectPoint;
+    }
+
+    @Override
+    public int hashCode() {
+        return 43 * super.hashCode() + Objects.hash(connectPoint);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DomainEdge) {
+            final DomainEdge other = (DomainEdge) obj;
+            return super.equals(other) &&
+                    Objects.equals(this.connectPoint, other.connectPoint);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("src", src())
+                .add("dst", dst())
+                .add("connectPoint", connectPoint)
+                .toString();
+    }
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/DomainVertex.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/DomainVertex.java
new file mode 100644
index 0000000..82b4313
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/DomainVertex.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import org.onlab.graph.Vertex;
+import org.onosproject.net.DeviceId;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Representation of the intent domain or a device that is part of the intent
+ * domain graph.
+ */
+@Beta
+public class DomainVertex implements Vertex {
+    // FIXME we will want to add a type enum or subclasses for the two different types
+
+    // A domain vertex is either an intent domain or a device:
+    private final IntentDomainId id;
+    // ----- or -----
+    private final DeviceId deviceId;
+
+    // Serialization constructor
+    private DomainVertex() {
+        this.id = null;
+        this.deviceId = null;
+    }
+
+    DomainVertex(IntentDomainId id) {
+        this.id = checkNotNull(id, "Intent domain ID cannot be null.");
+        this.deviceId = null;
+    }
+
+    DomainVertex(DeviceId id) {
+        this.id = null;
+        this.deviceId = checkNotNull(id, "Device ID cannot be null.");
+    }
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomain.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomain.java
new file mode 100644
index 0000000..7450114
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomain.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Representation of an intent domain which includes the set of internal devices,
+ * the set of edge ports, and the implementation of the domain provider.
+ */
+@Beta
+public class IntentDomain {
+
+    private final IntentDomainId id;
+    private String name;
+
+    private Set<DeviceId> internalDevices;
+    private Set<ConnectPoint> edgePorts;
+
+    private IntentDomainProvider provider;
+
+    IntentDomain(IntentDomainId id, String name,
+                 Set<DeviceId> internalDevices,
+                 Set<ConnectPoint> edgePorts) {
+        this.id = id;
+        this.name = name;
+        this.internalDevices = internalDevices;
+        this.edgePorts = edgePorts;
+    }
+
+    /**
+     * Returns the id for the intent domain.
+     *
+     * @return intent domain id
+     */
+    public IntentDomainId id() {
+        return id;
+    }
+
+    /**
+     * Returns the friendly name for the intent domain.
+     *
+     * @return intent domain name
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Returns the set of internal devices for the intent domain (devices under
+     * exclusive control of the intent domain).
+     *
+     * @return set of internal devices
+     */
+    public Set<DeviceId> internalDevices() {
+        return internalDevices;
+    }
+
+    /**
+     * Returns the set of edge ports for the intent domain.
+     *
+     * @return set of edge ports
+     */
+    public Set<ConnectPoint> edgePorts() {
+        return edgePorts;
+    }
+
+    /**
+     * Returns the provider for the intent domain.
+     *
+     * @return intent domain provider
+     */
+    IntentDomainProvider provider() {
+        return provider;
+    }
+
+    /**
+     * Returns the status of the intent domain. An intent domain is active if it
+     * has an intent domain provider bound, and it is inactive if one is not bound.
+     *
+     * @return true if active; false otherwise
+     */
+    public boolean isActive() {
+        return provider != null;
+    }
+
+    /**
+     * Sets the provider for the intent domain if one is not already set.
+     *
+     * @param provider new intent domain provider
+     */
+    public void setProvider(IntentDomainProvider provider) {
+        // TODO consider checkState depending on caller
+        if (this.provider == null) {
+            this.provider = provider;
+        }
+    }
+
+    /**
+     * Unsets the provider for the intent domain if the given provider matches
+     * the existing provider.
+     *
+     * @param provider provider to unset
+     */
+    public void unsetProvider(IntentDomainProvider provider) {
+        // TODO consider checkState depending on caller
+        if (Objects.equals(this.provider, provider)) {
+            this.provider = null;
+        }
+    }
+
+    //TODO add remaining setters (we will probably want to link this to the network config)
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainAdminService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainAdminService.java
new file mode 100644
index 0000000..6833d38
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainAdminService.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.core.ApplicationId;
+
+/**
+ * Administrative interface for the intent domain service.
+ */
+@Beta
+public interface IntentDomainAdminService {
+
+    /**
+     * Register an application that provides intent domain service.
+     *
+     * @param applicationId application id
+     * @param provider intent domain provider
+     */
+    void registerApplication(ApplicationId applicationId, IntentDomainProvider provider);
+
+    /**
+     * Unregisters an application that provides intent domain service.
+     *
+     * @param applicationId application id
+     */
+    void unregisterApplication(ApplicationId applicationId);
+
+    /* TODO we may be able to accomplish the following through network config:
+    void createDomain(String domainId);
+    void removeDomain(String domainId);
+
+    void addInternalDeviceToDomain(IntentDomain domain, DeviceId deviceId);
+    void addPortToDomain(IntentDomain domain, ConnectPoint port);
+
+    void bindApplicationToDomain(String domain, IntentDomain implementation);
+    void unbindApplicationToDomain(String domain, IntentDomain implementation);
+    */
+}
+
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainConfig.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainConfig.java
new file mode 100644
index 0000000..19c1c86
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainConfig.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.incubator.net.config.Config;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+
+import java.util.Set;
+
+/**
+ * Configuration for an intent domain including a name, set of internal devices,
+ * set of edge ports, and the application bound to control the domain.
+ */
+@Beta
+public abstract class IntentDomainConfig extends Config<IntentDomainId> {
+
+    private static final String DOMAIN_NAME = "domainName";
+    private static final String APPLICATION_NAME = "applicationName";
+
+    /**
+     * Returns the friendly name for the domain.
+     *
+     * @return domain name
+     */
+    public String domainName() {
+        return get(DOMAIN_NAME, subject.toString());
+    }
+
+    /**
+     * Sets the friendly name for the domain.
+     *
+     * @param domainName new name for the domain; null to clear
+     * @return self
+     */
+    public IntentDomainConfig domainName(String domainName) {
+        return (IntentDomainConfig) setOrClear(DOMAIN_NAME, domainName);
+    }
+
+    /**
+     * Returns the friendly name for the domain.
+     *
+     * @return domain name
+     */
+    public String applicationName() {
+        return get(APPLICATION_NAME, null); //TODO maybe not null?
+    }
+
+    /**
+     * Sets the friendly name for the domain.
+     *
+     * @param applicationName new name for the domain; null to clear
+     * @return self
+     */
+    public IntentDomainConfig applicationName(String applicationName) {
+        return (IntentDomainConfig) setOrClear(APPLICATION_NAME, applicationName);
+    }
+
+    //TODO sets
+    abstract Set<DeviceId> internalDevices();
+    abstract Set<ConnectPoint> edgePorts();
+
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainId.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainId.java
new file mode 100644
index 0000000..554702a
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainId.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Intent domain identifier.
+ */
+@Beta
+public class IntentDomainId {
+
+    private final String id;
+
+    /**
+     * Creates an intent domain identifier from the specified string representation.
+     *
+     * @param value string value
+     * @return intent identifier
+     */
+    public static IntentDomainId valueOf(String value) {
+        return new IntentDomainId(value);
+    }
+
+    /**
+     * Constructor for serializer.
+     */
+    IntentDomainId() {
+        this.id = null;
+    }
+
+    /**
+     * Constructs the ID corresponding to a given string value.
+     *
+     * @param value the underlying value of this ID
+     */
+    IntentDomainId(String value) {
+        this.id = checkNotNull(value, "Intent domain ID cannot be null.");
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof IntentDomainId)) {
+            return false;
+        }
+        IntentDomainId that = (IntentDomainId) obj;
+        return Objects.equals(this.id, that.id);
+    }
+
+    @Override
+    public String toString() {
+        return id;
+    }
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainListener.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainListener.java
new file mode 100644
index 0000000..04080b2
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainListener.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Listener for intent domain events.
+ */
+@Beta
+public interface IntentDomainListener {
+    //TODO create event types
+    //extends EventListener<IntentDomainEvent>
+}
\ No newline at end of file
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainProvider.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainProvider.java
new file mode 100644
index 0000000..bfea73d
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainProvider.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * FIXME.
+ */
+@Beta
+public interface IntentDomainProvider {
+
+    /**
+     * Requests that the provider attempt to satisfy the intent primitive.
+     * The application must apply the context before the intent resource
+     * can be used. Request contexts can be explictly cancelled, or they will
+     * eventually time out so that resources can be reused.
+     *
+     * @param primitive intent primitive
+     * @return request contexts that contain resources to satisfy the intent
+     */
+    //TODO Consider an iterable and/or holds (only hold one or two reservation(s) at a time)
+    List<RequestContext> request(IntentPrimitive primitive);
+
+    /**
+     * Request that the provider attempt to modify an existing resource to satisfy
+     * a new intent primitive. The application must apply the context before
+     * the intent resource can be used.
+     *
+     * @param resource existing resource
+     * @param newPrimitive intent primitive
+     * @return request contexts that contain resources to satisfy the intent
+     */
+    List<RequestContext> modify(IntentResource resource, IntentPrimitive newPrimitive);
+
+    /**
+     * Requests that the provider release an intent resource.
+     *
+     * @param resource intent resource
+     */
+    void release(IntentResource resource);
+
+    /**
+     * Requests that the provider apply the intent resource in the request context.
+     *
+     * @param context request context
+     * @return intent resource that satisfies the intent
+     */
+    IntentResource apply(RequestContext context);
+
+    /**
+     * Requests that the provider cancel the request. Requests that are not applied
+     * will be eventually timed out by the provider.
+     *
+     * @param context request context
+     */
+    void cancel(RequestContext context);
+
+    /**
+     * Returns all intent resources held by the provider.
+     *
+     * @return set of intent resources
+     */
+    Set<IntentResource> getResources();
+}
+
+
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainService.java
new file mode 100644
index 0000000..41508ad
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentDomainService.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import org.onlab.graph.Graph;
+import org.onosproject.net.DeviceId;
+
+import java.util.Set;
+
+/**
+ * Service for that maintains a graph of intent domains and a registry of intent
+ * domain providers.
+ */
+@Beta
+public interface IntentDomainService {
+
+    /**
+     * Returns the intent domain for the given id.
+     *
+     * @param id id to look up
+     * @return the intent domain; null if none found
+     */
+    IntentDomain getDomain(IntentDomainId id);
+
+    /**
+     * Returns a set of all intent domains.
+     *
+     * @return set of intent domains
+     */
+    Set<IntentDomain> getDomains();
+
+    /**
+     * Returns any network domains associated with the given device id.
+     *
+     * @param deviceId device id to look up
+     * @return set of intent domain
+     */
+    Set<IntentDomain> getDomains(DeviceId deviceId);
+
+    /**
+     * Returns the graph of intent domains and connection devices.
+     *
+     * @return graph of network domains
+     */
+    Graph<DomainVertex, DomainEdge> getDomainGraph();
+
+    /**
+     * Adds the specified listener for intent domain events.
+     *
+     * @param listener listener to be added
+     */
+    void addListener(IntentDomainListener listener);
+
+    /**
+     * Removes the specified listener for intent domain events.
+     *
+     * @param listener listener to be removed
+     */
+    void removeListener(IntentDomainListener listener);
+}
+
+
+
+
+
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentPrimitive.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentPrimitive.java
new file mode 100644
index 0000000..d0824e5
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentPrimitive.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.core.ApplicationId;
+
+/**
+ * Abstract base class for intent primitives.
+ */
+@Beta
+public abstract class IntentPrimitive {
+
+    private final ApplicationId appId;
+
+    IntentPrimitive(ApplicationId appId) {
+        this.appId = appId;
+    }
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentResource.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentResource.java
new file mode 100644
index 0000000..a49bf95
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/IntentResource.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * The abstract base class for the resource that satisfies an intent primitive.
+ */
+@Beta
+public abstract class IntentResource {
+
+    private final IntentPrimitive primitive;
+
+    // TODO add other common fields
+    //String ingressTag;
+    //String egressTag;
+    //etc.
+
+    IntentResource(IntentPrimitive primitive) {
+        this.primitive = primitive;
+    }
+
+    public IntentPrimitive primitive() {
+        return primitive;
+    }
+
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/RequestContext.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/RequestContext.java
new file mode 100644
index 0000000..342f4d0
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/RequestContext.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 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.incubator.net.domain;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Context for intent primitive requests to an intent domain provider. A context
+ * must be explicitly applied before it can be used. The purpose of the request
+ * context is so that an application can coordinate multiple requests across multiple
+ * domains before committing. Contexts can be explicitly cancelled if they are not
+ * needed (due to a better context or incomplete path across domains); they can
+ * also be automatically cancelled by a provider after a short timeout.
+ */
+@Beta
+class RequestContext {
+    IntentDomain domain;
+    IntentResource resource;
+    //TODO other common parameters:
+    //String cost;
+
+    //TODO getters/setters
+}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/domain/package-info.java b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/package-info.java
new file mode 100644
index 0000000..b8340e0
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/domain/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * Subsystem for network intent domains.
+ */
+package org.onosproject.incubator.net.domain;
\ No newline at end of file
