diff --git a/README.md b/README.md
index 21bd7500..d74a0f4b 100644
--- a/README.md
+++ b/README.md
@@ -117,6 +117,7 @@ This category targets developers and architects who have a good understanding of
* **cafe-scripted** - Scripted implementation of the classic **cafe** sample application. Supports **JavaScript**, **Groovy**, **Ruby**, and **Python**.
* **loan-broker** - Simulates a simple banking application (Uses **Gateway**, **Chain**, **Header Enricher**, **Recipient List Router**, **Aggregator**) see [Appendix A of the reference documentation](http://docs.spring.io/spring-integration/reference/html/samples.html) for more details
* **loanshark** This extension to the loan broker sample shows how to exchange messages between Spring Integration applications (and other technologies) using **UDP**.
+ **file-split-ftp** - Reads a file; splits into 3 based on contents; sends files over ftp; sends email with results.
#Contributing
diff --git a/applications/file-split-ftp/.gitignore b/applications/file-split-ftp/.gitignore
new file mode 100644
index 00000000..ce3767e5
--- /dev/null
+++ b/applications/file-split-ftp/.gitignore
@@ -0,0 +1,7 @@
+/target/
+.classpath
+.project
+.settings
+.factorypath
+.mvn
+mvnw*
diff --git a/applications/file-split-ftp/README.adoc b/applications/file-split-ftp/README.adoc
new file mode 100644
index 00000000..e70160fc
--- /dev/null
+++ b/applications/file-split-ftp/README.adoc
@@ -0,0 +1,21 @@
+:imagesdir: ./images
+
+= File Split and FTP Sample
+
+- Looks for files `*.txt` in `/tmp/in`
+- Reads file and writes to 3 files based on account (first 4 bytes in file)
+- FileSplitter -> router [lines -> `lines`], [file marks -> `marks`]
+- `marks` filters on EOF marker (drops SOF)
+- pubsub [flush files], [ftp (x3)], [email result]
+- Exceptions go to `tfrErrors` - sends failure email
+- input file is renamed, based on final dispostion
+
+Test cases are provided for happy path and failure scenarios
+
+Run `ApplicationTests` as a JUnit test from your IDE.
+
+= Flow Visualization
+
+image::flo1.png[]
+
+image::flo2.png[]
diff --git a/applications/file-split-ftp/images/flo1.png b/applications/file-split-ftp/images/flo1.png
new file mode 100644
index 00000000..5643320f
Binary files /dev/null and b/applications/file-split-ftp/images/flo1.png differ
diff --git a/applications/file-split-ftp/images/flo2.png b/applications/file-split-ftp/images/flo2.png
new file mode 100644
index 00000000..383e1d54
Binary files /dev/null and b/applications/file-split-ftp/images/flo2.png differ
diff --git a/applications/file-split-ftp/pom.xml b/applications/file-split-ftp/pom.xml
new file mode 100644
index 00000000..002e98f8
--- /dev/null
+++ b/applications/file-split-ftp/pom.xml
@@ -0,0 +1,151 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.4.0.RELEASE
+
+ org.springframework.integration.samples
+ file-split-ftp
+ 4.3.0.BUILD-SNAPSHOT
+ File Split FTP
+ File Split FTP
+ http://projects.spring.io/spring-integration
+
+ SpringIO
+ https://spring.io
+
+
+
+ The Apache Software License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+ garyrussell
+ Gary Russell
+ grussell@pivotal.io
+
+ project lead
+
+
+
+ markfisher
+ Mark Fisher
+ mfisher@pivotal.io
+
+ project founder and lead emeritus
+
+
+
+ ghillert
+ Gunnar Hillert
+ ghillert@pivotal.io
+
+
+ abilan
+ Artem Bilan
+ abilan@pivotal.io
+
+
+
+ scm:git:scm:git:git://github.com/spring-projects/spring-integration-samples.git
+ scm:git:scm:git:ssh://git@github.com:spring-projects/spring-integration-samples.git
+ https://github.com/spring-projects/spring-integration-samples
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ compile
+
+
+ org.springframework.boot
+ spring-boot-starter-integration
+ compile
+
+
+ org.springframework.integration
+ spring-integration-ftp
+ 4.3.2.RELEASE
+ compile
+
+
+ org.springframework.integration
+ spring-integration-http
+ 4.3.2.RELEASE
+ compile
+
+
+ org.springframework.integration
+ spring-integration-mail
+ 4.3.2.RELEASE
+ compile
+
+
+ org.springframework.integration
+ spring-integration-test
+ 5.0.0.BUILD-SNAPSHOT
+ compile
+
+
+ javax.mail
+ javax.mail-api
+ 1.5.5
+ compile
+
+
+ com.sun.mail
+ javax.mail
+ 1.5.5
+ compile
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+ test
+
+
+ org.mockito
+ mockito-core
+ 1.10.19
+ test
+
+
+ org.springframework
+ spring-test
+ 4.3.2.RELEASE
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ repo.spring.io.milestone
+ Spring Framework Maven Milestone Repository
+ https://repo.spring.io/libs-milestone
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/applications/file-split-ftp/src/main/java/org/springframework/integration/samples/filesplit/Application.java b/applications/file-split-ftp/src/main/java/org/springframework/integration/samples/filesplit/Application.java
new file mode 100644
index 00000000..d7e93f79
--- /dev/null
+++ b/applications/file-split-ftp/src/main/java/org/springframework/integration/samples/filesplit/Application.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2002-2016 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.samples.filesplit;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.aopalliance.intercept.MethodInterceptor;
+import org.apache.commons.net.ftp.FTPFile;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.mail.MailProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.IntegrationFlows;
+import org.springframework.integration.dsl.core.Pollers;
+import org.springframework.integration.dsl.file.Files;
+import org.springframework.integration.dsl.mail.Mail;
+import org.springframework.integration.file.FileHeaders;
+import org.springframework.integration.file.FileWritingMessageHandler;
+import org.springframework.integration.file.remote.session.SessionFactory;
+import org.springframework.integration.file.splitter.FileSplitter;
+import org.springframework.integration.file.support.FileExistsMode;
+import org.springframework.integration.ftp.session.DefaultFtpSessionFactory;
+import org.springframework.integration.http.config.EnableIntegrationGraphController;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.MessageHeaders;
+import org.springframework.messaging.MessagingException;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+@SpringBootApplication
+@EnableIntegrationGraphController
+public class Application {
+
+ private static final String EMAIL_SUCCESS_SUFFIX = "emailSuccessSuffix";
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @Autowired
+ private MailProperties mailProperties;
+
+ /**
+ * Poll for files, add an error channel, split into lines route the start/end markers
+ * to {@link #markers()} and the lines to {@link #lines()}.
+ * @return the flow.
+ */
+ @Bean
+ public IntegrationFlow fromFile() {
+ return IntegrationFlows.from(Files.inboundAdapter(new File("/tmp/in"))
+ .preventDuplicates(false)
+ .patternFilter("*.txt"), e -> e.poller(Pollers.fixedDelay(5000)))
+ .enrichHeaders(h -> h.header(MessageHeaders.ERROR_CHANNEL, "tfrErrors.input"))
+ .handle(Files.splitter(true, true))
+ .