diff --git a/apps/routing/src/main/java/org/onosproject/routing/config/Configuration.java b/apps/routing/src/main/java/org/onosproject/routing/config/Configuration.java
new file mode 100644
index 0000000..9ae69f8
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/config/Configuration.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2014 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.routing.config;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.onosproject.routingapi.config.BgpPeer;
+import org.onosproject.routingapi.config.BgpSpeaker;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Contains the configuration data for SDN-IP that has been read from a
+ * JSON-formatted configuration file.
+ */
+public class Configuration {
+    // We call the BGP routers in our SDN network the BGP speakers, and call
+    // the BGP routers outside our SDN network the BGP peers.
+    private List<BgpSpeaker> bgpSpeakers;
+    private List<BgpPeer> peers;
+
+    /**
+     * Default constructor.
+     */
+    public Configuration() {
+    }
+
+    /**
+     * Gets a list of bgpSpeakers in the system, represented by
+     * {@link BgpSpeaker} objects.
+     *
+     * @return the list of BGP speakers
+     */
+    public List<BgpSpeaker> getBgpSpeakers() {
+        return Collections.unmodifiableList(bgpSpeakers);
+    }
+
+    /**
+     * Sets a list of bgpSpeakers in the system.
+     *
+     * @param bgpSpeakers the list of BGP speakers
+     */
+    @JsonProperty("bgpSpeakers")
+    public void setBgpSpeakers(List<BgpSpeaker> bgpSpeakers) {
+        this.bgpSpeakers = bgpSpeakers;
+    }
+
+    /**
+     * Gets a list of BGP peers we are configured to peer with. Peers are
+     * represented by {@link BgpPeer} objects.
+     *
+     * @return the list of BGP peers
+     */
+    public List<BgpPeer> getPeers() {
+        return Collections.unmodifiableList(peers);
+    }
+
+    /**
+     * Sets a list of BGP peers we are configured to peer with.
+     *
+     * @param peers the list of BGP peers
+     */
+    @JsonProperty("bgpPeers")
+    public void setPeers(List<BgpPeer> peers) {
+        this.peers = peers;
+    }
+
+}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/config/HostToInterfaceAdaptor.java b/apps/routing/src/main/java/org/onosproject/routing/config/HostToInterfaceAdaptor.java
new file mode 100644
index 0000000..98b7914
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/config/HostToInterfaceAdaptor.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2014 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.routing.config;
+
+import com.google.common.collect.Sets;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.net.host.PortAddresses;
+import org.onosproject.routingapi.config.Interface;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Adapts PortAddresses data from the HostService into Interface data used by
+ * the routing module.
+ */
+public class HostToInterfaceAdaptor {
+
+    private final HostService hostService;
+
+    public HostToInterfaceAdaptor(HostService hostService) {
+        this.hostService = checkNotNull(hostService);
+    }
+
+    public Set<Interface> getInterfaces() {
+        Set<PortAddresses> addresses = hostService.getAddressBindings();
+        Set<Interface> interfaces = Sets.newHashSetWithExpectedSize(addresses.size());
+        for (PortAddresses a : addresses) {
+            interfaces.add(new Interface(a));
+        }
+        return interfaces;
+    }
+
+    public Interface getInterface(ConnectPoint connectPoint) {
+        checkNotNull(connectPoint);
+
+        Set<PortAddresses> portAddresses =
+                hostService.getAddressBindingsForPort(connectPoint);
+
+        for (PortAddresses addresses : portAddresses) {
+            if (addresses.connectPoint().equals(connectPoint)) {
+                return new Interface(addresses);
+            }
+        }
+
+        return null;
+    }
+
+    public Interface getMatchingInterface(IpAddress ipAddress) {
+        checkNotNull(ipAddress);
+
+        for (PortAddresses portAddresses : hostService.getAddressBindings()) {
+            for (InterfaceIpAddress ia : portAddresses.ipAddresses()) {
+                if (ia.subnetAddress().contains(ipAddress)) {
+                    return new Interface(portAddresses);
+                }
+            }
+        }
+
+        return null;
+    }
+
+}
diff --git a/apps/routing/src/main/java/org/onosproject/routing/config/RoutingConfigurationImpl.java b/apps/routing/src/main/java/org/onosproject/routing/config/RoutingConfigurationImpl.java
new file mode 100644
index 0000000..6ca0155
--- /dev/null
+++ b/apps/routing/src/main/java/org/onosproject/routing/config/RoutingConfigurationImpl.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2014 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.routing.config;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.host.HostService;
+import org.onosproject.routingapi.config.BgpPeer;
+import org.onosproject.routingapi.config.BgpSpeaker;
+import org.onosproject.routingapi.config.Interface;
+import org.onosproject.routingapi.config.RoutingConfigurationService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Implementation of RoutingConfigurationService which reads routing
+ * configuration from a file.
+ */
+@Component(immediate = true)
+@Service
+public class RoutingConfigurationImpl implements RoutingConfigurationService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String CONFIG_DIR = "../config";
+    private static final String DEFAULT_CONFIG_FILE = "sdnip.json";
+    private String configFileName = DEFAULT_CONFIG_FILE;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostService hostService;
+
+    private Map<String, BgpSpeaker> bgpSpeakers = new ConcurrentHashMap<>();
+    private Map<IpAddress, BgpPeer> bgpPeers = new ConcurrentHashMap<>();
+
+    private HostToInterfaceAdaptor hostAdaptor;
+
+    @Activate
+    public void activate() {
+        readConfiguration();
+        hostAdaptor = new HostToInterfaceAdaptor(hostService);
+        log.info("Routing configuration service started");
+    }
+
+    /**
+     * Reads SDN-IP related information contained in the configuration file.
+     *
+     * @param configFilename the name of the configuration file for the SDN-IP
+     * application
+     */
+    private void readConfiguration(String configFilename) {
+        File configFile = new File(CONFIG_DIR, configFilename);
+        ObjectMapper mapper = new ObjectMapper();
+
+        try {
+            log.info("Loading config: {}", configFile.getAbsolutePath());
+            Configuration config = mapper.readValue(configFile,
+                                                    Configuration.class);
+            for (BgpSpeaker speaker : config.getBgpSpeakers()) {
+                bgpSpeakers.put(speaker.name(), speaker);
+            }
+            for (BgpPeer peer : config.getPeers()) {
+                bgpPeers.put(peer.ipAddress(), peer);
+            }
+        } catch (FileNotFoundException e) {
+            log.warn("Configuration file not found: {}", configFileName);
+        } catch (IOException e) {
+            log.error("Error loading configuration", e);
+        }
+    }
+
+    /**
+     * Instructs the configuration reader to read the configuration from the file.
+     */
+    public void readConfiguration() {
+        readConfiguration(configFileName);
+    }
+
+    @Override
+    public Map<String, BgpSpeaker> getBgpSpeakers() {
+        return Collections.unmodifiableMap(bgpSpeakers);
+    }
+
+    @Override
+    public Map<IpAddress, BgpPeer> getBgpPeers() {
+        return Collections.unmodifiableMap(bgpPeers);
+    }
+
+    @Override
+    public Set<Interface> getInterfaces() {
+        return hostAdaptor.getInterfaces();
+    }
+
+    @Override
+    public Interface getInterface(ConnectPoint connectPoint) {
+        return hostAdaptor.getInterface(connectPoint);
+    }
+
+    @Override
+    public Interface getMatchingInterface(IpAddress ipAddress) {
+        return hostAdaptor.getMatchingInterface(ipAddress);
+    }
+
+}
