diff --git a/BUCK b/BUCK
new file mode 100644
index 0000000..b37025a
--- /dev/null
+++ b/BUCK
@@ -0,0 +1,14 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+)
+
+onos_app (
+    title = 'CORD Configuration',
+    category = 'Utility',
+    url = 'http://onosproject.org',
+    description = 'CORD configuration meta application.',
+)
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0ae7ec1
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2015-present Open Networking Laboratory
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-apps</artifactId>
+        <version>1.7.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+
+    <artifactId>onos-cord-config</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>CORD configuration meta application</description>
+
+    <properties>
+        <onos.app.name>org.onosproject.cord-config</onos.app.name>
+        <onos.app.title>CORD Configuratuon Meta Application</onos.app.title>
+        <onos.app.category>Utility</onos.app.category>
+        <onos.app.url>http://opencord.org</onos.app.url>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>
diff --git a/src/main/java/org/onosproject/cordconfig/access/AccessAgentConfig.java b/src/main/java/org/onosproject/cordconfig/access/AccessAgentConfig.java
new file mode 100644
index 0000000..6dc5c9d
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/AccessAgentConfig.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordconfig.access;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Maps;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.Config;
+
+import java.util.Map;
+import java.util.Optional;
+
+import static org.onosproject.net.config.Config.FieldPresence.MANDATORY;
+import static org.onosproject.net.config.Config.FieldPresence.OPTIONAL;
+
+/**
+ * Represents configuration for an OLT agent.
+ */
+public class AccessAgentConfig extends Config<DeviceId> {
+
+    private static final String OLTS = "olts";
+    private static final String AGENT_MAC = "mac";
+
+    // TODO: Remove this, it is only useful as long as XOS doesn't manage this.
+    private static final String VTN_LOCATION = "vtn-location";
+
+    @Override
+    public boolean isValid() {
+        return hasOnlyFields(OLTS, AGENT_MAC, VTN_LOCATION) &&
+                isMacAddress(AGENT_MAC, MANDATORY) &&
+                isConnectPoint(VTN_LOCATION, OPTIONAL) &&
+                areOltsValid();
+    }
+
+    /**
+     * Gets the access agent configuration for this device.
+     *
+     * @return access agent configuration
+     */
+    public AccessAgentData getAgent() {
+        JsonNode olts = node.get(OLTS);
+        Map<ConnectPoint, MacAddress> oltMacInfo = Maps.newHashMap();
+        olts.fields().forEachRemaining(item -> oltMacInfo.put(
+                ConnectPoint.deviceConnectPoint(item.getKey()),
+                MacAddress.valueOf(item.getValue().asText())));
+
+        MacAddress agentMac = MacAddress.valueOf(node.path(AGENT_MAC).asText());
+
+        JsonNode vtn = node.path(VTN_LOCATION);
+        Optional<ConnectPoint> vtnLocation;
+        if (vtn.isMissingNode()) {
+            vtnLocation = Optional.empty();
+        } else {
+            vtnLocation = Optional.of(ConnectPoint.deviceConnectPoint(vtn.asText()));
+        }
+
+        return new AccessAgentData(subject(), oltMacInfo, agentMac, vtnLocation);
+    }
+
+    private boolean areOltsValid() {
+        JsonNode olts = node.get(OLTS);
+        if (!olts.isObject()) {
+            return false;
+        }
+        return Iterators.all(olts.fields(),
+                item -> ConnectPoint.deviceConnectPoint(item.getKey()) != null &&
+                        isMacAddress((ObjectNode) olts, item.getKey(), MANDATORY));
+    }
+}
diff --git a/src/main/java/org/onosproject/cordconfig/access/AccessAgentData.java b/src/main/java/org/onosproject/cordconfig/access/AccessAgentData.java
new file mode 100644
index 0000000..de7a342
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/AccessAgentData.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordconfig.access;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang3.tuple.Pair;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Information about an access agent.
+ */
+public class AccessAgentData {
+
+    private static final String DEVICE_ID_MISSING = "Device ID cannot be null";
+    private static final String OLT_INFO_MISSING = "OLT information cannot be null";
+    private static final String AGENT_MAC_MISSING = "Agent mac cannot be null";
+    private static final String VTN_MISSING = "VTN location cannot be null";
+
+    private static final int CHIP_PORT_RANGE_SIZE = 130;
+
+    private final Map<ConnectPoint, MacAddress> oltMacInfo;
+    private final MacAddress agentMac;
+    private final Optional<ConnectPoint> vtnLocation;
+    private final DeviceId deviceId;
+
+    // OLT chip information sorted by ascending MAC address
+    private final List<Pair<ConnectPoint, MacAddress>> sortedOltChips;
+
+    /**
+     * Constructs an agent configuration for a given device.
+     *
+     * @param deviceId    access device ID
+     * @param oltMacInfo  a map of olt chips and their mac address
+     * @param agentMac    the MAC address of the agent
+     * @param vtnLocation the location of the agent
+     */
+    public AccessAgentData(DeviceId deviceId, Map<ConnectPoint, MacAddress> oltMacInfo,
+                           MacAddress agentMac, Optional<ConnectPoint> vtnLocation) {
+        this.deviceId = checkNotNull(deviceId, DEVICE_ID_MISSING);
+        this.oltMacInfo = ImmutableMap.copyOf(checkNotNull(oltMacInfo, OLT_INFO_MISSING));
+        this.agentMac = checkNotNull(agentMac, AGENT_MAC_MISSING);
+        this.vtnLocation = checkNotNull(vtnLocation, VTN_MISSING);
+
+        this.sortedOltChips = oltMacInfo.entrySet().stream()
+                .sorted((e1, e2) -> Long.compare(e1.getValue().toLong(), e2.getValue().toLong()))
+                .map(e -> Pair.of(e.getKey(), e.getValue()))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Retrieves the access device ID.
+     *
+     * @return device ID
+     */
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Returns the mapping of OLT chips to MAC addresses. Each chip is
+     * symbolized by a connect point.
+     *
+     * @return a mapping of chips (as connect points) to MAC addresses
+     */
+    public Map<ConnectPoint, MacAddress> getOltMacInfo() {
+        return oltMacInfo;
+    }
+
+    /**
+     * Returns the agent's MAC address.
+     *
+     * @return a mac address
+     */
+    public MacAddress getAgentMac() {
+        return agentMac;
+    }
+
+    /**
+     * Returns the location of the agent.
+     *
+     * @return a connection point
+     */
+    public Optional<ConnectPoint> getVtnLocation() {
+        return vtnLocation;
+    }
+
+    /**
+     * Returns the point where the OLT is connected to the fabric given a
+     * connect point on the agent device.
+     *
+     * @param agentConnectPoint connect point on the agent device
+     * @return point were OLT is connected to fabric
+     */
+    public Optional<ConnectPoint> getOltConnectPoint(ConnectPoint agentConnectPoint) {
+        int index = ((int) agentConnectPoint.port().toLong()) / CHIP_PORT_RANGE_SIZE;
+
+        if (index >= sortedOltChips.size()) {
+            return Optional.empty();
+        }
+
+        return Optional.of(sortedOltChips.get(index).getKey());
+    }
+}
diff --git a/src/main/java/org/onosproject/cordconfig/access/AccessDeviceConfig.java b/src/main/java/org/onosproject/cordconfig/access/AccessDeviceConfig.java
new file mode 100644
index 0000000..47f35da
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/AccessDeviceConfig.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordconfig.access;
+
+import org.onosproject.net.DeviceId;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.onlab.packet.VlanId;
+
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.config.Config;
+
+import java.util.Optional;
+
+/**
+ * Config object for access device data.
+ */
+public class AccessDeviceConfig extends Config<DeviceId> {
+
+    private static final String UPLINK = "uplink";
+    private static final String VLAN = "vlan";
+    private static final String DEFAULT_VLAN = "defaultVlan";
+
+    /**
+     * Gets the access device configuration for this device.
+     *
+     * @return access device configuration
+     * @deprecated in Goldeneye release. Use {@link #getAccessDevice()} instead.
+     */
+    @Deprecated
+    public AccessDeviceData getOlt() {
+        return getAccessDevice();
+    }
+
+    /**
+     * Gets the access device configuration for this device.
+     *
+     * @return access device configuration
+     */
+    public AccessDeviceData getAccessDevice() {
+        PortNumber uplink = PortNumber.portNumber(node.path(UPLINK).asText());
+        VlanId vlan = VlanId.vlanId(Short.parseShort(node.path(VLAN).asText()));
+        JsonNode defaultVlanNode = node.path(DEFAULT_VLAN);
+
+        Optional<VlanId> defaultVlan;
+        if (defaultVlanNode.isMissingNode()) {
+            defaultVlan = Optional.empty();
+        } else {
+            defaultVlan = Optional.of(VlanId.vlanId(Short.parseShort(defaultVlanNode.asText())));
+        }
+
+        return new AccessDeviceData(subject(), uplink, vlan, defaultVlan);
+    }
+}
diff --git a/src/main/java/org/onosproject/cordconfig/access/AccessDeviceData.java b/src/main/java/org/onosproject/cordconfig/access/AccessDeviceData.java
new file mode 100644
index 0000000..74894d5
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/AccessDeviceData.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordconfig.access;
+
+import org.onlab.packet.VlanId;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import java.util.Optional;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Information about an access device.
+ */
+public class AccessDeviceData {
+    private static final String DEVICE_ID_MISSING = "Device ID cannot be null";
+    private static final String UPLINK_MISSING = "Uplink cannot be null";
+    private static final String VLAN_MISSING = "VLAN ID cannot be null";
+
+    private final DeviceId deviceId;
+    private final PortNumber uplink;
+    private final VlanId vlan;
+    private final Optional<VlanId> defaultVlan;
+
+    /**
+     * Class constructor.
+     *
+     * @param deviceId access device ID
+     * @param uplink uplink port number
+     * @param vlan device VLAN ID
+     * @param defaultVlan default device VLAN ID
+     */
+    public AccessDeviceData(DeviceId deviceId, PortNumber uplink, VlanId vlan,
+                            Optional<VlanId> defaultVlan) {
+        this.deviceId = checkNotNull(deviceId, DEVICE_ID_MISSING);
+        this.uplink = checkNotNull(uplink, UPLINK_MISSING);
+        this.vlan = checkNotNull(vlan, VLAN_MISSING);
+        this.defaultVlan = checkNotNull(defaultVlan);
+    }
+
+    /**
+     * Retrieves the access device ID.
+     *
+     * @return device ID
+     */
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Retrieves the uplink port number.
+     *
+     * @return port number
+     */
+    public PortNumber uplink() {
+        return uplink;
+    }
+
+    /**
+     * Retrieves the VLAN ID assigned to the device.
+     *
+     * @return VLAN ID
+     */
+    public VlanId vlan() {
+        return vlan;
+    }
+
+    /**
+     * Retrieves the default VLAN ID that will be used for this device.
+     *
+     * @return default VLAN ID
+     */
+    public Optional<VlanId> defaultVlan() {
+        return defaultVlan;
+    }
+}
diff --git a/src/main/java/org/onosproject/cordconfig/access/CordConfig.java b/src/main/java/org/onosproject/cordconfig/access/CordConfig.java
new file mode 100644
index 0000000..2bc47b4
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/CordConfig.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordconfig.access;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.basics.SubjectFactories;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Manages the common CORD configuration.
+ */
+@Service
+@Component(immediate = true)
+public class CordConfig implements CordConfigService {
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry networkConfig;
+
+    private Map<DeviceId, AccessDeviceData> accessDevices = new ConcurrentHashMap<>();
+    private Map<DeviceId, AccessAgentData> accessAgents = new ConcurrentHashMap<>();
+
+    private static final Class<AccessDeviceConfig> ACCESS_DEVICE_CONFIG_CLASS =
+            AccessDeviceConfig.class;
+    private static final String ACCESS_DEVICE_CONFIG_KEY = "accessDevice";
+
+    private ConfigFactory<DeviceId, AccessDeviceConfig> deviceConfigFactory =
+            new ConfigFactory<DeviceId, AccessDeviceConfig>(
+                    SubjectFactories.DEVICE_SUBJECT_FACTORY,
+                    ACCESS_DEVICE_CONFIG_CLASS, ACCESS_DEVICE_CONFIG_KEY) {
+                @Override
+                public AccessDeviceConfig createConfig() {
+                    return new AccessDeviceConfig();
+                }
+            };
+
+    private static final Class<AccessAgentConfig> ACCESS_AGENT_CONFIG_CLASS =
+            AccessAgentConfig.class;
+    private static final String ACCESS_AGENT_CONFIG_KEY = "accessAgent";
+
+    private ConfigFactory<DeviceId, AccessAgentConfig> agentConfigFactory =
+            new ConfigFactory<DeviceId, AccessAgentConfig>(
+                    SubjectFactories.DEVICE_SUBJECT_FACTORY,
+                    ACCESS_AGENT_CONFIG_CLASS, ACCESS_AGENT_CONFIG_KEY) {
+                @Override
+                public AccessAgentConfig createConfig() {
+                    return new AccessAgentConfig();
+                }
+            };
+
+    private InternalNetworkConfigListener configListener =
+            new InternalNetworkConfigListener();
+
+    @Activate
+    protected void activate() {
+        networkConfig.registerConfigFactory(deviceConfigFactory);
+        networkConfig.registerConfigFactory(agentConfigFactory);
+
+        networkConfig.addListener(configListener);
+
+        networkConfig.getSubjects(DeviceId.class, AccessDeviceConfig.class)
+                .forEach(this::addAccessDeviceConfig);
+
+        networkConfig.getSubjects(DeviceId.class, AccessAgentConfig.class)
+                .forEach(this::addAccessAgentConfig);
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        networkConfig.unregisterConfigFactory(deviceConfigFactory);
+        networkConfig.unregisterConfigFactory(agentConfigFactory);
+    }
+
+    private void addAccessDeviceConfig(DeviceId subject) {
+        AccessDeviceConfig config =
+                networkConfig.getConfig(subject, ACCESS_DEVICE_CONFIG_CLASS);
+        if (config != null) {
+            addAccessDevice(config);
+        }
+    }
+
+    private void addAccessDevice(AccessDeviceConfig config) {
+        AccessDeviceData accessDevice = config.getAccessDevice();
+        accessDevices.put(accessDevice.deviceId(), accessDevice);
+    }
+
+    private void removeAccessDeviceConfig(DeviceId subject) {
+        accessDevices.remove(subject);
+    }
+
+    private void addAccessAgentConfig(DeviceId subject) {
+        AccessAgentConfig config =
+                networkConfig.getConfig(subject, ACCESS_AGENT_CONFIG_CLASS);
+        if (config != null) {
+            addAccessAgent(config);
+        }
+    }
+
+    private void addAccessAgent(AccessAgentConfig config) {
+        AccessAgentData accessAgent = config.getAgent();
+        accessAgents.put(accessAgent.deviceId(), accessAgent);
+    }
+
+    private void removeAccessAgentConfig(DeviceId subject) {
+        accessAgents.remove(subject);
+    }
+
+    @Override
+    public Set<AccessDeviceData> getAccessDevices() {
+        return ImmutableSet.copyOf(accessDevices.values());
+    }
+
+    @Override
+    public Optional<AccessDeviceData> getAccessDevice(DeviceId deviceId) {
+        checkNotNull(deviceId, "Device ID cannot be null");
+        return Optional.ofNullable(accessDevices.get(deviceId));
+    }
+
+    @Override
+    public Set<AccessAgentData> getAccessAgents() {
+        return ImmutableSet.copyOf(accessAgents.values());
+    }
+
+    @Override
+    public Optional<AccessAgentData> getAccessAgent(DeviceId deviceId) {
+        checkNotNull(deviceId, "Device ID cannot be null");
+        return Optional.ofNullable(accessAgents.get(deviceId));
+    }
+
+    private class InternalNetworkConfigListener implements NetworkConfigListener {
+        @Override
+        public void event(NetworkConfigEvent event) {
+            switch (event.type()) {
+            case CONFIG_ADDED:
+            case CONFIG_UPDATED:
+                if (event.configClass().equals(ACCESS_DEVICE_CONFIG_CLASS)) {
+                    addAccessDeviceConfig((DeviceId) event.subject());
+                } else if (event.configClass().equals(ACCESS_AGENT_CONFIG_CLASS)) {
+                    addAccessAgentConfig((DeviceId) event.subject());
+                }
+                break;
+            case CONFIG_REMOVED:
+                if (event.configClass().equals(ACCESS_DEVICE_CONFIG_CLASS)) {
+                    removeAccessDeviceConfig((DeviceId) event.subject());
+                } else if (event.configClass().equals(ACCESS_AGENT_CONFIG_CLASS)) {
+                    removeAccessAgentConfig((DeviceId) event.subject());
+                }
+                break;
+            case CONFIG_REGISTERED:
+            case CONFIG_UNREGISTERED:
+            default:
+                break;
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/onosproject/cordconfig/access/CordConfigService.java b/src/main/java/org/onosproject/cordconfig/access/CordConfigService.java
new file mode 100644
index 0000000..fdab6c0
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/CordConfigService.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordconfig.access;
+
+import org.onosproject.net.DeviceId;
+
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * Provides access to the common CORD configuration.
+ */
+public interface CordConfigService {
+
+    /**
+     * Retrieves the set of all access devices in the system.
+     *
+     * @return set of access devices
+     */
+    Set<AccessDeviceData> getAccessDevices();
+
+    /**
+     * Retrieves the access device with the given device ID.
+     *
+     * @param deviceId device ID
+     * @return access device
+     */
+    Optional<AccessDeviceData> getAccessDevice(DeviceId deviceId);
+
+    /**
+     * Retrieves the set of all access agents in the system.
+     *
+     * @return set of access agents
+     */
+    Set<AccessAgentData> getAccessAgents();
+
+    /**
+     * Retrieves the access agent for the given device ID.
+     *
+     * @param deviceId device ID
+     * @return access agent
+     */
+    Optional<AccessAgentData> getAccessAgent(DeviceId deviceId);
+}
diff --git a/src/main/java/org/onosproject/cordconfig/access/package-info.java b/src/main/java/org/onosproject/cordconfig/access/package-info.java
new file mode 100644
index 0000000..55c553a
--- /dev/null
+++ b/src/main/java/org/onosproject/cordconfig/access/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Meta Application for hosting common cord configuration classes.
+ */
+package org.onosproject.cordconfig.access;
\ No newline at end of file
