diff --git a/org.springframework.integration.http/src/main/java/org/springframework/integration/http/DataBindingRequestMapper.java b/org.springframework.integration.http/src/main/java/org/springframework/integration/http/DataBindingRequestMapper.java
new file mode 100644
index 0000000000..a34535f598
--- /dev/null
+++ b/org.springframework.integration.http/src/main/java/org/springframework/integration/http/DataBindingRequestMapper.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * 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.springframework.integration.http;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.integration.core.Message;
+import org.springframework.integration.message.MessageBuilder;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.ServletRequestDataBinder;
+import org.springframework.web.bind.support.WebBindingInitializer;
+import org.springframework.web.servlet.handler.DispatcherServletWebRequest;
+
+/**
+ * RequestMapper implementation that binds the request parameter map to a
+ * target instance. The target instance may be a non-singleton bean as
+ * specified by the {@link #setTargetBeanName(String) 'targetBeanName'}
+ * property. Otherwise, this transformer's target type must provide a
+ * default no-arg constructor.
+ *
+ * @author Mark Fisher
+ * @since 1.0.2
+ */
+public class DataBindingRequestMapper implements RequestMapper, BeanFactoryAware, InitializingBean {
+
+ private final Class> targetType;
+
+ private volatile String targetBeanName;
+
+ private volatile WebBindingInitializer webBindingInitializer;
+
+ private volatile BeanFactory beanFactory;
+
+ private volatile boolean validated;
+
+
+ public DataBindingRequestMapper(Class> targetType) {
+ Assert.notNull(targetType, "targetType must not be null");
+ this.targetType = targetType;
+ }
+
+
+ /**
+ * Specify the name of a bean definition to use when creating the target
+ * instance. The bean must not be a singleton, and it must be
+ * compatible with the {@link #targetType}.
+ *
If no 'targetBeanName' value is provided, the target type must
+ * provide a default, no-arg constructor.
+ */
+ public void setTargetBeanName(String targetBeanName) {
+ this.targetBeanName = targetBeanName;
+ }
+
+ /**
+ * Specify an optional {@link WebBindingInitializer} to be invoked prior
+ * to the request binding process.
+ */
+ public void setWebBindingInitializer(WebBindingInitializer webBindingInitializer) {
+ this.webBindingInitializer = webBindingInitializer;
+ }
+
+ /**
+ * Provides the {@link BeanFactory} necessary to look up a
+ * {@link #setTargetBeanName(String) 'targetBeanName'} if specified.
+ * This method is typically invoked automatically by the container.
+ */
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+ this.beanFactory = beanFactory;
+ }
+
+ public final void afterPropertiesSet() {
+ this.validateTargetBeanIfNecessary();
+ }
+
+ private void validateTargetBeanIfNecessary() {
+ if (this.targetBeanName != null && !this.validated) {
+ Assert.notNull(this.beanFactory, "beanFactory is required for binding to a bean");
+ if (this.beanFactory.isSingleton(this.targetBeanName)) {
+ throw new IllegalArgumentException("binding target bean must not be a singleton");
+ }
+ this.validated = true;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Message> mapRequest(HttpServletRequest request) throws Exception {
+ ServletRequestDataBinder binder = new ServletRequestDataBinder(getTarget());
+ this.initBinder(binder, request);
+ binder.bind(request);
+ // this will immediately throw any bind Exceptions
+ Map map = binder.close();
+ Object payload = map.get(ServletRequestDataBinder.DEFAULT_OBJECT_NAME);
+ return MessageBuilder.withPayload(payload).build();
+ }
+
+ private void initBinder(ServletRequestDataBinder binder, HttpServletRequest request) {
+ if (this.webBindingInitializer != null) {
+ this.webBindingInitializer.initBinder(binder, new DispatcherServletWebRequest(request));
+ }
+ }
+
+ private Object getTarget() throws InstantiationException, IllegalAccessException {
+ if (this.targetBeanName != null) {
+ this.validateTargetBeanIfNecessary();
+ return this.beanFactory.getBean(this.targetBeanName, this.targetType);
+ }
+ return this.targetType.newInstance();
+ }
+
+}
diff --git a/org.springframework.integration.http/src/main/java/org/springframework/integration/http/DefaultRequestMapper.java b/org.springframework.integration.http/src/main/java/org/springframework/integration/http/DefaultRequestMapper.java
new file mode 100644
index 0000000000..84af1a9697
--- /dev/null
+++ b/org.springframework.integration.http/src/main/java/org/springframework/integration/http/DefaultRequestMapper.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * 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.springframework.integration.http;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.integration.core.Message;
+import org.springframework.integration.message.MessageBuilder;
+
+/**
+ * Default implementation of {@link RequestMapper} for inbound HttpServletRequests.
+ * The request will be mapped according to the following rules:
+ *
+ *
For a GET request, the parameter Map will be copied as the payload.
+ * The map's keys will be Strings, and the values will be String arrays
+ * as described for {@link ServletRequest#getParameterMap()}.
+ *
For other request types, the request body will be used as the payload
+ * and the type will depend on the Content-Type header value. If it
+ * begins with "text", a String will be created. If the Content-Type
+ * is "application/x-java-serialized-object", the request body will be
+ * expected to contain a Serializable Object, and that will be used as
+ * the message payload. Otherwise, the payload will be a byte array.
+ * The parameter Map values will then be added as Message headers.
+ *
+ * In both cases, the original request headers will be passed in the
+ * MessageHeaders. Likewise, the following headers will be added:
+ *