diff --git a/jaxrs/paramconverter/README.adoc b/jaxrs/paramconverter/README.adoc
new file mode 100644
index 000000000..767aa3c76
--- /dev/null
+++ b/jaxrs/paramconverter/README.adoc
@@ -0,0 +1,7 @@
+= JAX-RS ParamConverter and ParamConverterProvider
+
+This example demonstrate the use of a +ParamConverter+ / +ParamConverterProvider+ to set the request parameters in a user bean
+that has no constructor with a single +String+ argument, nor +fromValue(String)+ or +valueOf(String)+ methods.
+The +ParamConverter+ is registered by a +ParamConverterProvider+ annotated with +@Provider+.
+
+The +ParamConverter+ applies to JAX-RS Resource Method parameters annotated with +@MatrixParam+, +@QueryParam+, +@PathParam+, +@CookieParam+ and +@HeaderParam+.
\ No newline at end of file
diff --git a/jaxrs/paramconverter/pom.xml b/jaxrs/paramconverter/pom.xml
new file mode 100644
index 000000000..815858725
--- /dev/null
+++ b/jaxrs/paramconverter/pom.xml
@@ -0,0 +1,15 @@
+
+ 4.0.0
+
+ org.javaee7.jaxrs
+ jaxrs-samples
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+
+ org.javaee7.jaxrs
+ paramconverter
+ 1.0-SNAPSHOT
+ war
+
diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyApplication.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyApplication.java
new file mode 100644
index 000000000..6bc998305
--- /dev/null
+++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyApplication.java
@@ -0,0 +1,12 @@
+package org.javaee7.jaxrs.paramconverter;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+/**
+ * @author Arun Gupta
+ */
+@ApplicationPath("webresources")
+public class MyApplication extends Application {
+
+}
diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBean.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBean.java
new file mode 100644
index 000000000..f8928c706
--- /dev/null
+++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBean.java
@@ -0,0 +1,30 @@
+package org.javaee7.jaxrs.paramconverter;
+
+/**
+ * @author Xavier Coulon
+ *
+ */
+public class MyBean {
+
+ private String value;
+
+ /**
+ * @return the value
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * @param value the value to set
+ */
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return getValue();
+ }
+
+}
diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBeanConverterProvider.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBeanConverterProvider.java
new file mode 100644
index 000000000..82e213b96
--- /dev/null
+++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyBeanConverterProvider.java
@@ -0,0 +1,40 @@
+package org.javaee7.jaxrs.paramconverter;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import javax.ws.rs.ext.ParamConverter;
+import javax.ws.rs.ext.ParamConverterProvider;
+import javax.ws.rs.ext.Provider;
+
+/**
+ * @author Xavier Coulon
+ */
+@Provider
+public class MyBeanConverterProvider implements ParamConverterProvider {
+
+ @Override
+ public ParamConverter getConverter(Class clazz, Type type, Annotation[] annotations) {
+ if (clazz.getName().equals(MyBean.class.getName())) {
+
+ return new ParamConverter() {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T fromString(String value) {
+ MyBean bean = new MyBean();
+ bean.setValue(value);
+ return (T) bean;
+ }
+
+ @Override
+ public String toString(T bean) {
+ return ((MyBean)bean).getValue();
+ }
+
+ };
+ }
+ return null;
+ }
+
+}
diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java
new file mode 100644
index 000000000..7843a0a58
--- /dev/null
+++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java
@@ -0,0 +1,42 @@
+package org.javaee7.jaxrs.paramconverter;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+
+import javax.ws.rs.ext.ParamConverter;
+import javax.ws.rs.ext.ParamConverterProvider;
+import javax.ws.rs.ext.Provider;
+
+/**
+ * @author Xavier Coulon
+ *
+ */
+@Provider
+public class MyConverterProvider implements ParamConverterProvider {
+
+ @Override
+ public ParamConverter getConverter(final Class rawType, final Type genericType,
+ final Annotation[] annotations) {
+ if (rawType.getName().equals(MyBean.class.getName())) {
+ return new ParamConverter() {
+
+ @Override
+ public T fromString(String value) {
+ MyBean myBean = new MyBean();
+ myBean.setValue(value);
+ return rawType.cast(myBean);
+ }
+
+ @Override
+ public String toString(T myBean) {
+ if (myBean == null) {
+ return null;
+ }
+ return myBean.toString();
+ }
+ };
+ }
+ return null;
+ }
+
+}
diff --git a/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyResource.java b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyResource.java
new file mode 100644
index 000000000..cdb26dd6d
--- /dev/null
+++ b/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyResource.java
@@ -0,0 +1,30 @@
+package org.javaee7.jaxrs.paramconverter;
+
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * @author Arun Gupta
+ * @author Xavier coulon
+ */
+@Path("/endpoint")
+public class MyResource {
+
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getWithQuery(@DefaultValue("bar") @QueryParam("search") MyBean myBean) {
+ return myBean.getValue();
+ }
+
+ @GET
+ @Path("/{id}")
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getByPath(@PathParam("id") MyBean myBean) {
+ return myBean.getValue();
+ }
+}
diff --git a/jaxrs/paramconverter/src/test/java/org/javaee7/jaxrs/paramconverter/MyResourceTest.java b/jaxrs/paramconverter/src/test/java/org/javaee7/jaxrs/paramconverter/MyResourceTest.java
new file mode 100644
index 000000000..9c5bf56b0
--- /dev/null
+++ b/jaxrs/paramconverter/src/test/java/org/javaee7/jaxrs/paramconverter/MyResourceTest.java
@@ -0,0 +1,63 @@
+package org.javaee7.jaxrs.paramconverter;
+
+import static org.junit.Assert.assertEquals;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * @author Arun Gupta
+ * @author Xavier Coulon
+ */
+@RunWith(Arquillian.class)
+public class MyResourceTest {
+
+ @Deployment(testable = false)
+ public static WebArchive createDeployment() {
+ return ShrinkWrap.create(WebArchive.class)
+ .addClasses(MyApplication.class, MyResource.class, MyBeanConverterProvider.class, MyBean.class);
+ }
+ private static WebTarget target;
+
+ @ArquillianResource
+ private URL base;
+
+ @Before
+ public void setUpClass() throws MalformedURLException {
+ Client client = ClientBuilder.newClient();
+ target = client.target(URI.create(new URL(base, "webresources/endpoint").toExternalForm()));
+ }
+
+ @Test
+ public void testRequestWithQueryParam() {
+ String r = target.queryParam("search", "foo").request().get(String.class);
+ assertEquals("foo", r);
+ }
+
+ @Test
+ public void testRequestWithNoQueryParam() {
+ String r = target.request().get(String.class);
+ assertEquals("bar", r);
+ }
+
+ @Test
+ public void testRequestWithPathParam() {
+ String r = target.path("/foo").request().get(String.class);
+ assertEquals("foo", r);
+ }
+
+}
diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index 90e7e5acc..738af323f 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -32,6 +32,7 @@
link
mapping-exceptions
+ paramconverter
readerwriter
readerwriter-json
request-binding