diff --git a/message-channel/.gitignore b/message-channel/.gitignore
new file mode 100644
index 000000000..b83d22266
--- /dev/null
+++ b/message-channel/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/message-channel/etc/message-channel.png b/message-channel/etc/message-channel.png
new file mode 100644
index 000000000..7db473281
Binary files /dev/null and b/message-channel/etc/message-channel.png differ
diff --git a/message-channel/etc/message-channel.ucls b/message-channel/etc/message-channel.ucls
new file mode 100644
index 000000000..3ef0ed4bc
--- /dev/null
+++ b/message-channel/etc/message-channel.ucls
@@ -0,0 +1,320 @@
+
+
+ * The sending application doesn't necessarily know what particular application + * will end up retrieving it, but it can be assured that the application that + * retrieves the information is interested in that information. This is because + * the messaging system has different Message Channels for different types of + * information the applications want to communicate. When an application sends + * information, it doesn't randomly add the information to any channel available; + * it adds it to a channel whose specific purpose is to communicate that sort of + * information. Likewise, an application that wants to receive particular information + * doesn't pull info off some random channel; it selects what channel to get information + * from based on what type of information it wants. + *
+ * In this example we use Apache Camel to establish two different Message Channels. The first
+ * one reads from standard input and delivers messages to Direct endpoint. The second Message
+ * Channel is established from the Direct component to console output. No actual messages are sent,
+ * only the established routes are printed to standard output.
+ *
+ */
+public class App {
+
+ /**
+ * Program entry point
+ * @param args command line args
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+ CamelContext context = new DefaultCamelContext();
+
+ context.addRoutes(new RouteBuilder() {
+
+ @Override
+ public void configure() throws Exception {
+ from("stream:in").to("direct:greetings");
+ from("direct:greetings").to("stream:out");
+ }
+ });
+
+ context.start();
+ context.getRoutes().stream().forEach((r) -> System.out.println(r));
+ context.stop();
+ }
+}
diff --git a/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java
new file mode 100644
index 000000000..fa3af1161
--- /dev/null
+++ b/message-channel/src/test/java/com/iluwatar/message/channel/AppTest.java
@@ -0,0 +1,17 @@
+package com.iluwatar.message.channel;
+
+import org.junit.Test;
+
+/**
+ *
+ * Application test
+ *
+ */
+public class AppTest {
+
+ @Test
+ public void test() throws Exception {
+ String[] args = {};
+ App.main(args);
+ }
+}
diff --git a/pom.xml b/pom.xml
index 961d9b281..7b0d80bd8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@