diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/BadRequestMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/BadRequestMapper.java
index fcef3b1..89b1368 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/BadRequestMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/BadRequestMapper.java
@@ -16,11 +16,14 @@
 package org.onosproject.rest.exceptions;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+
 import java.io.IOException;
 
 /**
  * Mapper for IO exceptions to the BAD_REQUEST response code.
  */
+@Provider
 public class BadRequestMapper extends AbstractMapper<IOException> {
     @Override
     protected Response.Status responseStatus() {
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/EntityNotFoundMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/EntityNotFoundMapper.java
index 63e24b9..9e42a56 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/EntityNotFoundMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/EntityNotFoundMapper.java
@@ -18,10 +18,12 @@
 import org.onlab.util.ItemNotFoundException;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 /**
  * Mapper for service not found exceptions to the NOT_FOUND response code.
  */
+@Provider
 public class EntityNotFoundMapper extends AbstractMapper<ItemNotFoundException> {
     @Override
     protected Response.Status responseStatus() {
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalArgumentExceptionMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalArgumentExceptionMapper.java
index 6a381f7..2d7a1ea 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalArgumentExceptionMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalArgumentExceptionMapper.java
@@ -16,10 +16,12 @@
 package org.onosproject.rest.exceptions;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 /**
  * Mapper for illegal argument exceptions to the BAD_REQUEST response code.
  */
+@Provider
 public class IllegalArgumentExceptionMapper extends AbstractMapper<IllegalArgumentException> {
     @Override
     protected Response.Status responseStatus() {
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalStateExceptionMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalStateExceptionMapper.java
index f20daf5..a9f977c 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalStateExceptionMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/IllegalStateExceptionMapper.java
@@ -16,10 +16,12 @@
 package org.onosproject.rest.exceptions;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 /**
  * Mapper for illegal state exceptions to the BAD_REQUEST response code.
  */
+@Provider
 public class IllegalStateExceptionMapper extends AbstractMapper<IllegalStateException> {
     @Override
     protected Response.Status responseStatus() {
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/NotFoundMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/NotFoundMapper.java
index 1c4135e..2bf3614 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/NotFoundMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/NotFoundMapper.java
@@ -16,12 +16,14 @@
 package org.onosproject.rest.exceptions;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 import com.sun.jersey.api.NotFoundException;
 
 /**
  * Mapper for api not found exceptions to the NOT_FOUND response code.
  */
+@Provider
 public class NotFoundMapper extends AbstractMapper<NotFoundException> {
 
     @Override
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/ServerErrorMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/ServerErrorMapper.java
index 4904c85..5a9050d 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/ServerErrorMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/ServerErrorMapper.java
@@ -16,10 +16,12 @@
 package org.onosproject.rest.exceptions;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 /**
  * Mapper for service not found exceptions to the INTERNAL_SERVER_ERROR response code.
  */
+@Provider
 public class ServerErrorMapper extends AbstractMapper<RuntimeException> {
     @Override
     protected Response.Status responseStatus() {
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/ServiceNotFoundMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/ServiceNotFoundMapper.java
index 0932bc4..69e5508 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/ServiceNotFoundMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/ServiceNotFoundMapper.java
@@ -18,10 +18,12 @@
 import org.onlab.osgi.ServiceNotFoundException;
 
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 /**
  * Mapper for service not found exceptions to the SERVICE_UNAVAILABLE response code.
  */
+@Provider
 public class ServiceNotFoundMapper extends AbstractMapper<ServiceNotFoundException> {
     @Override
     protected Response.Status responseStatus() {
diff --git a/web/api/src/main/java/org/onosproject/rest/exceptions/WebApplicationExceptionMapper.java b/web/api/src/main/java/org/onosproject/rest/exceptions/WebApplicationExceptionMapper.java
index f47e604..86d8434 100644
--- a/web/api/src/main/java/org/onosproject/rest/exceptions/WebApplicationExceptionMapper.java
+++ b/web/api/src/main/java/org/onosproject/rest/exceptions/WebApplicationExceptionMapper.java
@@ -17,10 +17,12 @@
 
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
 
 /**
  * Exception mapper for WebApplicationExceptions.
  */
+@Provider
 public class WebApplicationExceptionMapper extends AbstractMapper<WebApplicationException> {
 
     /**
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 7fc7b5d..4943705 100644
--- a/web/api/src/test/java/org/onosproject/rest/IntentsResourceTest.java
+++ b/web/api/src/test/java/org/onosproject/rest/IntentsResourceTest.java
@@ -331,15 +331,29 @@
         expect(mockIntentService.getIntent(Key.of("0", APP_ID)))
                 .andReturn(intent)
                 .anyTimes();
+        expect(mockIntentService.getIntent(Key.of(0, APP_ID)))
+                .andReturn(intent)
+                .anyTimes();
+        expect(mockIntentService.getIntent(Key.of("0x0", APP_ID)))
+                .andReturn(null)
+                .anyTimes();
         replay(mockIntentService);
         expect(mockCoreService.getAppId(APP_ID.name()))
                 .andReturn(APP_ID).anyTimes();
         replay(mockCoreService);
         final WebResource rs = resource();
+
+        // Test get using key string
         final String response = rs.path("intents/" + APP_ID.name()
                 + "/0").get(String.class);
         final JsonObject result = JsonObject.readFrom(response);
         assertThat(result, matchesIntent(intent));
+
+        // Test get using numeric value
+        final String responseNumeric = rs.path("intents/" + APP_ID.name()
+                + "/0x0").get(String.class);
+        final JsonObject resultNumeric = JsonObject.readFrom(responseNumeric);
+        assertThat(resultNumeric, matchesIntent(intent));
     }
 
     /**
@@ -390,6 +404,23 @@
     }
 
     /**
+     * Tests creating an intent with POST and illegal JSON.
+     */
+    @Test
+    public void testBadPost() {
+        replay(mockCoreService);
+        replay(mockIntentService);
+
+        String json = "this is invalid!";
+        WebResource rs = resource();
+
+        ClientResponse response = rs.path("intents")
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .post(ClientResponse.class, json);
+        assertThat(response.getStatus(), is(HttpURLConnection.HTTP_BAD_REQUEST));
+    }
+
+    /**
      * Tests removing an intent with DELETE.
      */
     @Test
@@ -429,4 +460,33 @@
                 .delete(ClientResponse.class);
         assertThat(response.getStatus(), is(HttpURLConnection.HTTP_NO_CONTENT));
     }
+
+    /**
+     * Tests removal of a non existent intent with DELETE.
+     */
+    @Test
+    public void testBadRemove() {
+        final ApplicationId appId = new DefaultApplicationId(2, "app");
+
+        expect(mockCoreService.getAppId("app"))
+                .andReturn(appId).once();
+        replay(mockCoreService);
+
+        expect(mockIntentService.getIntent(Key.of(2, appId)))
+                .andReturn(null)
+                .once();
+        expect(mockIntentService.getIntent(Key.of("0x2", appId)))
+                .andReturn(null)
+                .once();
+
+        replay(mockIntentService);
+
+        WebResource rs = resource();
+
+        ClientResponse response = rs.path("intents/app/0x2")
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .delete(ClientResponse.class);
+        assertThat(response.getStatus(), is(HttpURLConnection.HTTP_NO_CONTENT));
+    }
+
 }
