diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 570d696..29b3836 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -38,6 +38,7 @@
 import org.onosproject.incubator.net.dpi.ProtocolStatInfoCodec;
 import org.onosproject.incubator.net.dpi.TrafficStatInfo;
 import org.onosproject.incubator.net.dpi.TrafficStatInfoCodec;
+import org.onosproject.incubator.net.routing.Route;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualDevice;
 import org.onosproject.incubator.net.virtual.VirtualHost;
@@ -48,13 +49,13 @@
 import org.onosproject.net.Annotations;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
+import org.onosproject.net.DisjointPath;
+import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostLocation;
 import org.onosproject.net.Link;
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.Path;
-import org.onosproject.net.DisjointPath;
-import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.Port;
 import org.onosproject.net.behaviour.protection.TransportEndpointDescription;
 import org.onosproject.net.device.PortStatistics;
@@ -95,7 +96,8 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
+import static org.onosproject.security.AppPermission.Type.CODEC_READ;
+import static org.onosproject.security.AppPermission.Type.CODEC_WRITE;
 
 /**
  * Implementation of the JSON codec brokering service.
@@ -171,6 +173,7 @@
         registerCodec(FilteredConnectPoint.class, new FilteredConnectPointCodec());
         registerCodec(TransportEndpointDescription.class, new TransportEndpointDescriptionCodec());
         registerCodec(PacketRequest.class, new PacketRequestCodec());
+        registerCodec(Route.class, new RouteCodec());
         log.info("Started");
     }
 
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/RouteCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/RouteCodec.java
new file mode 100644
index 0000000..14b9a52
--- /dev/null
+++ b/core/common/src/main/java/org/onosproject/codec/impl/RouteCodec.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2017-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.codec.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.incubator.net.routing.Route;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Codec to encode and decode a unicast route to and from JSON.
+ */
+public class RouteCodec extends JsonCodec<Route> {
+
+    private static final String SOURCE = "source";
+    private static final String PREFIX = "prefix";
+    private static final String NEXT_HOP = "nextHop";
+
+    @Override
+    public ObjectNode encode(Route route, CodecContext context) {
+        checkNotNull(route);
+        ObjectNode root = context.mapper().createObjectNode()
+                .put(SOURCE, route.source().toString())
+                .put(PREFIX, route.prefix().toString())
+                .put(NEXT_HOP, route.nextHop().toString());
+
+        return root;
+    }
+
+    @Override
+    public Route decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        IpPrefix prefix = IpPrefix.valueOf(json.path(PREFIX).asText());
+        IpAddress nextHop = IpAddress.valueOf(json.path(NEXT_HOP).asText());
+
+        // Routes through the REST API are created as STATIC, so we ignore
+        // the source parameter if it is specified in the JSON.
+        Route route = new Route(Route.Source.STATIC, prefix, nextHop);
+
+        return route;
+    }
+}
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/CoreWebApplication.java b/web/api/src/main/java/org/onosproject/rest/resources/CoreWebApplication.java
index 6cd7884..0e615bf 100644
--- a/web/api/src/main/java/org/onosproject/rest/resources/CoreWebApplication.java
+++ b/web/api/src/main/java/org/onosproject/rest/resources/CoreWebApplication.java
@@ -52,7 +52,8 @@
                 VirtualNetworkWebResource.class,
                 MastershipWebResource.class,
                 InvalidConfigExceptionMapper.class,
-                DpisWebResource.class
+                DpisWebResource.class,
+                RouteWebResource.class
         );
     }
 }
diff --git a/web/api/src/main/java/org/onosproject/rest/resources/RouteWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/RouteWebResource.java
new file mode 100644
index 0000000..3a5751b
--- /dev/null
+++ b/web/api/src/main/java/org/onosproject/rest/resources/RouteWebResource.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2017-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.rest.resources;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.incubator.net.routing.ResolvedRoute;
+import org.onosproject.incubator.net.routing.Route;
+import org.onosproject.incubator.net.routing.RouteAdminService;
+import org.onosproject.incubator.net.routing.RouteService;
+import org.onosproject.rest.AbstractWebResource;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Manage the unicast routing information.
+ */
+@Path("route")
+public class RouteWebResource extends AbstractWebResource {
+
+    /**
+     * Get all unicast routes.
+     * Returns array of all known unicast routes.
+     *
+     * @return 200 OK with array of all known unicast routes
+     * @onos.rsModel RoutesGet
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response getRoutes() {
+        RouteService service = get(RouteService.class);
+        ObjectNode root = mapper().createObjectNode();
+        service.getRouteTables().forEach(table -> {
+            List<Route> routes = service.getRoutes(table).stream()
+                    .flatMap(ri -> ri.allRoutes().stream())
+                    .map(ResolvedRoute::route)
+                    .collect(Collectors.toList());
+            root.put(table.name(), codec(Route.class).encode(routes, this));
+        });
+        return ok(root).build();
+    }
+
+    /**
+     * Create new unicast route.
+     * Creates a new route in the unicast RIB. Routes created through the REST
+     * API are always created as STATIC routes, so there is no need to specify
+     * the type.
+     *
+     * @onos.rsModel RoutePost
+     * @param route unicast route JSON
+     * @return status of the request - CREATED if the JSON is correct,
+     * BAD_REQUEST if the JSON is invalid
+     */
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response createRoute(InputStream route) {
+        RouteAdminService service = get(RouteAdminService.class);
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(route);
+            Route r = codec(Route.class).decode(jsonTree, this);
+            service.update(Collections.singletonList(r));
+        } catch (IOException ex) {
+            throw new IllegalArgumentException(ex);
+        }
+
+        return Response
+                .created(URI.create(""))
+                .build();
+    }
+
+    /**
+     * Remove a unicast route.
+     * Removes a route from the unicast RIB.
+     *
+     * @param route unicast route JSON
+     * @return 204 NO CONTENT
+     * @onos.rsModel RoutePost
+     */
+    @DELETE
+    @Consumes(MediaType.APPLICATION_JSON)
+    public Response deleteRoute(InputStream route) {
+        RouteAdminService service = get(RouteAdminService.class);
+        try {
+            ObjectNode jsonTree = (ObjectNode) mapper().readTree(route);
+            Route r = codec(Route.class).decode(jsonTree, this);
+            service.withdraw(Collections.singletonList(r));
+        } catch (IOException ex) {
+            throw new IllegalArgumentException(ex);
+        }
+        return Response.noContent().build();
+    }
+}
diff --git a/web/api/src/main/resources/definitions/RoutePost.json b/web/api/src/main/resources/definitions/RoutePost.json
new file mode 100644
index 0000000..c55578a
--- /dev/null
+++ b/web/api/src/main/resources/definitions/RoutePost.json
@@ -0,0 +1,20 @@
+{
+  "type": "object",
+  "title": "route",
+  "required": [
+    "prefix",
+    "nextHop"
+  ],
+  "properties": {
+    "prefix": {
+      "type": "string",
+      "example": "10.1.1.0/24",
+      "description": "Route prefix"
+    },
+    "nextHop": {
+      "type": "string",
+      "example": "1.1.1.1",
+      "description": "Next hop IP address"
+    }
+  }
+}
diff --git a/web/api/src/main/resources/definitions/RoutesGet.json b/web/api/src/main/resources/definitions/RoutesGet.json
new file mode 100644
index 0000000..0ddb67d
--- /dev/null
+++ b/web/api/src/main/resources/definitions/RoutesGet.json
@@ -0,0 +1,76 @@
+{
+  "type": "object",
+  "title": "routes",
+  "required": [
+    "ipv4",
+    "ipv6"
+  ],
+  "properties": {
+    "ipv4": {
+      "type": "array",
+      "xml": {
+        "name": "ipv4",
+        "wrapped": true
+      },
+      "items": {
+        "type": "object",
+        "title": "route",
+        "required": [
+          "source",
+          "prefix",
+          "nextHop"
+        ],
+        "properties": {
+          "source": {
+            "type": "string",
+            "example": "STATIC",
+            "description": "Route source"
+          },
+          "prefix": {
+            "type": "string",
+            "example": "10.1.1.0/24",
+            "description": "Route prefix"
+          },
+          "nextHop": {
+            "type": "string",
+            "example": "1.1.1.1",
+            "description": "Next hop IP address"
+          }
+        }
+      }
+    },
+    "ipv6": {
+      "type": "array",
+      "xml": {
+        "name": "ipv6",
+        "wrapped": true
+      },
+      "items": {
+        "type": "object",
+        "title": "route",
+        "required": [
+          "source",
+          "prefix",
+          "nextHop"
+        ],
+        "properties": {
+          "source": {
+            "type": "string",
+            "example": "STATIC",
+            "description": "Route source"
+          },
+          "prefix": {
+            "type": "string",
+            "example": "1111::/64",
+            "description": "Route prefix"
+          },
+          "nextHop": {
+            "type": "string",
+            "example": "2222::1",
+            "description": "Next hop IP address"
+          }
+        }
+      }
+    }
+  }
+}
