diff --git a/publish-subscribe/.gitignore b/publish-subscribe/.gitignore
new file mode 100644
index 000000000..b83d22266
--- /dev/null
+++ b/publish-subscribe/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/publish-subscribe/etc/publish-subscribe.png b/publish-subscribe/etc/publish-subscribe.png
new file mode 100644
index 000000000..99867da66
Binary files /dev/null and b/publish-subscribe/etc/publish-subscribe.png differ
diff --git a/publish-subscribe/etc/publish-subscribe.ucls b/publish-subscribe/etc/publish-subscribe.ucls
new file mode 100644
index 000000000..1b121506e
--- /dev/null
+++ b/publish-subscribe/etc/publish-subscribe.ucls
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/publish-subscribe/index.md b/publish-subscribe/index.md
new file mode 100644
index 000000000..efd40f021
--- /dev/null
+++ b/publish-subscribe/index.md
@@ -0,0 +1,17 @@
+---
+layout: pattern
+title: Publish Subscribe
+folder: publish-subscribe
+permalink: /patterns/publish-subscribe/
+categories: Integration
+tags: Java
+---
+
+**Intent:** When applications communicate using a messaging system they do it by using logical addresses
+of the system, so called Publish Subscribe Channel. The publisher broadcasts a message to all registered Subscriber.
+
+
+
+**Applicability:** Use the Publish Subscribe Channel pattern when
+
+* two or more applications need to communicate using a messaging system for broadcasts.
diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml
new file mode 100644
index 000000000..04b76690a
--- /dev/null
+++ b/publish-subscribe/pom.xml
@@ -0,0 +1,24 @@
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.7.0
+
+ publish-subscribe
+
+
+ org.apache.camel
+ camel-core
+
+
+ org.apache.camel
+ camel-stream
+
+
+ junit
+ junit
+
+
+
\ No newline at end of file
diff --git a/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java b/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java
new file mode 100644
index 000000000..1f433f517
--- /dev/null
+++ b/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java
@@ -0,0 +1,55 @@
+package com.iluwatar.publish.subscribe;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+
+/**
+ *
+ * When applications communicate with each other using a messaging system
+ * they first need to establish a communication channel that will carry the
+ * data. Message Channel decouples Message producers (publisher) and consumers (subscriber).
+ *
+ * The sending application doesn't necessarily know what particular applications
+ * 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 different Message Channels. The first
+ * one reads from standard input and delivers messages to Direct endpoints (Publish; Broadcast). The other Message
+ * Channels are established from the Direct component to different Endpoints (Subscriber). 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")
+ .multicast()
+ .to("direct:greetings1", "direct:greetings2", "direct:greetings3");
+ }
+ });
+
+ context.start();
+ context.getRoutes().stream().forEach((r) -> System.out.println(r));
+ context.stop();
+ }
+}
diff --git a/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java b/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java
new file mode 100644
index 000000000..743e4200d
--- /dev/null
+++ b/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java
@@ -0,0 +1,17 @@
+package com.iluwatar.publish.subscribe;
+
+import org.junit.Test;
+
+/**
+ *
+ * Application test
+ *
+ */
+public class AppTest {
+
+ @Test
+ public void test() throws Exception {
+ String[] args = {};
+ App.main(args);
+ }
+}
\ No newline at end of file