diff --git a/2023-11/spring-30-endpoints-flow-components/.gitignore b/2023-11/spring-30-endpoints-flow-components/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/pom.xml b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/pom.xml
new file mode 100644
index 00000000..6c20857a
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/pom.xml
@@ -0,0 +1,48 @@
+
+
+ 4.0.0
+
+ ru.otus
+ endpoints-flow-components-exercise
+ 1.0-SNAPSHOT
+
+
+ ru.otus
+ endpoints-flow-components
+ 1.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-integration
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/App.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/App.java
new file mode 100644
index 00000000..994b4482
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/App.java
@@ -0,0 +1,17 @@
+package ru.otus.spring.integration;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
+
+import ru.otus.spring.integration.services.OrderService;
+
+
+@SpringBootApplication
+public class App {
+ public static void main(String[] args) {
+ ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args);
+ OrderService orderService = ctx.getBean(OrderService.class);
+ orderService.startGenerateOrdersLoop();
+ }
+}
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java
new file mode 100644
index 00000000..3d9183a7
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/config/IntegrationConfig.java
@@ -0,0 +1,32 @@
+package ru.otus.spring.integration.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.integration.dsl.IntegrationFlow;
+import org.springframework.integration.dsl.MessageChannelSpec;
+import org.springframework.integration.dsl.MessageChannels;
+
+@SuppressWarnings("unused")
+@Configuration
+public class IntegrationConfig {
+ @Bean
+ public MessageChannelSpec, ?> itemsChannel() {
+ return MessageChannels.queue(10);
+ }
+
+ @Bean
+ public MessageChannelSpec, ?> foodChannel() {
+ return MessageChannels.publishSubscribe();
+ }
+
+ // TODO: create default poller
+
+ @Bean
+ public IntegrationFlow cafeFlow() {
+ return IntegrationFlow.from(itemsChannel())
+ // TODO: cook OrderItem in the kitchen
+ // TODO*: add splitter and aggregator
+ // TODO: forward it to the publish subscriber channel
+ .get();
+ }
+}
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/domain/Food.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/domain/Food.java
new file mode 100644
index 00000000..23f7a1b9
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/domain/Food.java
@@ -0,0 +1,15 @@
+package ru.otus.spring.integration.domain;
+
+
+public class Food {
+
+ private final String name;
+
+ public Food(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/domain/OrderItem.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/domain/OrderItem.java
new file mode 100644
index 00000000..992bf044
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/domain/OrderItem.java
@@ -0,0 +1,14 @@
+package ru.otus.spring.integration.domain;
+
+public class OrderItem {
+
+ private final String itemName;
+
+ public OrderItem(String itemName) {
+ this.itemName = itemName;
+ }
+
+ public String getItemName() {
+ return itemName;
+ }
+}
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/Cafe.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/Cafe.java
new file mode 100644
index 00000000..b0af720f
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/Cafe.java
@@ -0,0 +1,12 @@
+package ru.otus.spring.integration.services;
+
+
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+// TODO: add messaging gateway annotation
+public interface Cafe {
+
+ // TODO: add gateway annotation with required channels
+ Food process(OrderItem orderItem);
+}
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/CafeGateway.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
new file mode 100644
index 00000000..5b11b23d
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/CafeGateway.java
@@ -0,0 +1,12 @@
+package ru.otus.spring.integration.services;
+
+
+import ru.otus.spring.integration.domain.Food;
+import ru.otus.spring.integration.domain.OrderItem;
+
+// TODO: add messaging gateway annotation
+public interface CafeGateway {
+
+ // TODO: add gateway annotation with required channels
+ Food process(OrderItem orderItem);
+}
diff --git a/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/CafeService.java b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/CafeService.java
new file mode 100644
index 00000000..6b3b8629
--- /dev/null
+++ b/2023-11/spring-30-endpoints-flow-components/endpoints-flow-components-exercise/src/main/java/ru/otus/spring/integration/services/CafeService.java
@@ -0,0 +1,17 @@
+package ru.otus.spring.integration.services;
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.integration.annotation.Gateway;
+import org.springframework.integration.annotation.MessagingGateway;
+
+import ru.otus.spring.integration.domain.OrderItem;
+
+@MessagingGateway
+public interface CafeService {
+
+ @Gateway(requestChannel = "itemsChannel", replyChannel = "foodChannel")
+ List