diff --git a/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java b/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java
index 3e20c5d..93b59eb 100644
--- a/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java
+++ b/web/api/src/main/java/org/onosproject/rest/IntentsWebResource.java
@@ -22,6 +22,8 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
@@ -54,16 +56,24 @@
     /**
      * Gets a single intent by Id.
      *
-     * @param key Id to look up
+     * @param appId the Application ID
+     * @param key the Intent key value to look up
      * @return intent data
      */
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    @Path("{id}")
-    public Response getIntentById(@PathParam("id") String key) {
-        final Intent intent = nullIsNotFound(get(IntentService.class)
-                        .getIntent(Key.of(key, null)),
-                INTENT_NOT_FOUND);
+    @Path("{appId}/{key}")
+    public Response getIntentById(@PathParam("appId") Short appId,
+                                  @PathParam("key") String key) {
+        final ApplicationId app = get(CoreService.class).getAppId(appId);
+
+        Intent intent = get(IntentService.class).getIntent(Key.of(key, app));
+        if (intent == null) {
+            intent = get(IntentService.class)
+                    .getIntent(Key.of(Long.valueOf(key), app));
+        }
+        nullIsNotFound(intent, INTENT_NOT_FOUND);
+
         final ObjectNode root;
         if (intent instanceof HostToHostIntent) {
             root = codec(HostToHostIntent.class).encode((HostToHostIntent) intent, this);
diff --git a/web/api/src/test/java/org/onosproject/rest/IntentsResourceTest.java b/web/api/src/test/java/org/onosproject/rest/IntentsResourceTest.java
index d7c288e..7a2ce15 100644
--- a/web/api/src/test/java/org/onosproject/rest/IntentsResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/IntentsResourceTest.java
@@ -32,6 +32,7 @@
 import org.onosproject.codec.CodecService;
 import org.onosproject.codec.impl.CodecManager;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.core.IdGenerator;
 import org.onosproject.net.NetworkResource;
@@ -63,6 +64,7 @@
 @Ignore
 public class IntentsResourceTest extends ResourceTest {
     final IntentService mockIntentService = createMock(IntentService.class);
+    final CoreService mockCoreService = createMock(CoreService.class);
     final HashSet<Intent> intents = new HashSet<>();
     private static final ApplicationId APP_ID = new DefaultApplicationId(1, "test");
     private IdGenerator mockGenerator;
@@ -105,6 +107,7 @@
             this.id = id;
         }
 
+        @Override
         public String toString() {
             return "Resource " + Integer.toString(id);
         }
@@ -260,14 +263,14 @@
     @Before
     public void setUpTest() {
         expect(mockIntentService.getIntents()).andReturn(intents).anyTimes();
-
         // Register the services needed for the test
         final CodecManager codecService =  new CodecManager();
         codecService.activate();
         ServiceDirectory testDirectory =
                 new TestServiceDirectory()
                         .add(IntentService.class, mockIntentService)
-                        .add(CodecService.class, codecService);
+                        .add(CodecService.class, codecService)
+                        .add(CoreService.class, mockCoreService);
 
         BaseResource.setServiceDirectory(testDirectory);
 
@@ -344,10 +347,15 @@
         expect(mockIntentService.getIntent(Key.of(0, APP_ID)))
                 .andReturn(intent)
                 .anyTimes();
+        expect(mockIntentService.getIntent(Key.of("0", APP_ID)))
+                .andReturn(intent)
+                .anyTimes();
         replay(mockIntentService);
-
+        expect(mockCoreService.getAppId(APP_ID.id()))
+                .andReturn(APP_ID).anyTimes();
+        replay(mockCoreService);
         final WebResource rs = resource();
-        final String response = rs.path("intents/0").get(String.class);
+        final String response = rs.path("intents/1/0").get(String.class);
         final JsonObject result = JsonObject.readFrom(response);
         assertThat(result, matchesIntent(intent));
     }
