diff --git a/core/common/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java
index d46c301..923bdf2 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/FlowEntryCodec.java
@@ -17,6 +17,7 @@
 
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.core.CoreService;
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
@@ -34,9 +35,11 @@
     public ObjectNode encode(FlowEntry flowEntry, CodecContext context) {
         checkNotNull(flowEntry, "Flow entry cannot be null");
 
+        CoreService service = context.getService(CoreService.class);
+
         final ObjectNode result = context.mapper().createObjectNode()
                 .put("id", Long.toString(flowEntry.id().value()))
-                .put("appId", flowEntry.appId())
+                .put("appId", service.getAppId(flowEntry.appId()).name())
                 .put("groupId", flowEntry.groupId().id())
                 .put("priority", flowEntry.priority())
                 .put("timeout", flowEntry.timeout())
diff --git a/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java b/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java
index 9cb63e7..4fb5821 100644
--- a/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java
@@ -299,10 +299,12 @@
      */
     public static class FlowJsonMatcher extends TypeSafeMatcher<JsonObject> {
         private final FlowEntry flow;
+        private final String expectedAppId;
         private String reason = "";
 
-        public FlowJsonMatcher(FlowEntry flowValue) {
+        public FlowJsonMatcher(FlowEntry flowValue, String expectedAppIdValue) {
             flow = flowValue;
+            expectedAppId = expectedAppIdValue;
         }
 
         @Override
@@ -316,8 +318,8 @@
             }
 
             // check application id
-            final int jsonAppId = jsonFlow.get("appId").asInt();
-            if (jsonAppId != flow.appId()) {
+            final String jsonAppId = jsonFlow.get("appId").asString();
+            if (!jsonAppId.equals(expectedAppId)) {
                 reason = "appId " + Short.toString(flow.appId());
                 return false;
             }
@@ -399,8 +401,8 @@
      * @param flow flow object we are looking for
      * @return matcher
      */
-    private static FlowJsonMatcher matchesFlow(FlowEntry flow) {
-        return new FlowJsonMatcher(flow);
+    private static FlowJsonMatcher matchesFlow(FlowEntry flow, String expectedAppName) {
+        return new FlowJsonMatcher(flow, expectedAppName);
     }
 
     /**
@@ -430,7 +432,7 @@
                     flowFound = true;
 
                     //  We found the correct flow, check attribute values
-                    assertThat(jsonFlow, matchesFlow(flow));
+                    assertThat(jsonFlow, matchesFlow(flow, APP_ID.name()));
                 }
             }
             if (!flowFound) {
