diff --git a/2019-08/spring-16/.gitignore b/2019-08/spring-16/.gitignore
new file mode 100644
index 00000000..fbe7a1ed
--- /dev/null
+++ b/2019-08/spring-16/.gitignore
@@ -0,0 +1,7 @@
+.idea/
+*.iml
+
+target/
+
+/node_modules
+/output
diff --git a/2019-08/spring-16/pom.xml b/2019-08/spring-16/pom.xml
new file mode 100644
index 00000000..a8c68d2b
--- /dev/null
+++ b/2019-08/spring-16/pom.xml
@@ -0,0 +1,28 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-framework-16
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.3.RELEASE
+
+
+
+
+ io.reactivex.rxjava2
+ rxjava
+
+
+ com.google.guava
+ guava
+ 27.1-jre
+
+
+
diff --git a/2019-08/spring-16/src/main/java/ru/otus/CreateExamples.java b/2019-08/spring-16/src/main/java/ru/otus/CreateExamples.java
new file mode 100644
index 00000000..285c5d71
--- /dev/null
+++ b/2019-08/spring-16/src/main/java/ru/otus/CreateExamples.java
@@ -0,0 +1,35 @@
+package ru.otus;
+
+import io.reactivex.Observable;
+
+@SuppressWarnings("ResultOfMethodCallIgnored")
+public class CreateExamples {
+
+ public static void main(String[] args) {
+ final Observable obs = deferExample();
+ obs.forEach(System.out::println);
+ obs.forEach(System.out::println);
+ }
+
+ public static Observable justExample() {
+ return Observable.just("one", "two", "three");
+ }
+
+ public static Observable createExample() {
+ return Observable.create(emitter -> {
+ if (emitter.isDisposed()) {
+ return;
+ }
+ emitter.onNext("one");
+ emitter.onNext("two");//!
+ emitter.onNext("three");
+ if (!emitter.isDisposed()) {
+ emitter.onComplete();
+ }
+ });
+ }
+
+ public static Observable deferExample() {
+ return Observable.defer(() -> Observable.just("one", "two", "three"));
+ }
+}
diff --git a/2019-08/spring-16/src/main/java/ru/otus/LiveLikeExample.java b/2019-08/spring-16/src/main/java/ru/otus/LiveLikeExample.java
new file mode 100644
index 00000000..3f8e31d4
--- /dev/null
+++ b/2019-08/spring-16/src/main/java/ru/otus/LiveLikeExample.java
@@ -0,0 +1,26 @@
+package ru.otus;
+
+import io.reactivex.Observable;
+
+import java.io.IOException;
+
+public class LiveLikeExample {
+
+ public static void main(String[] args) throws IOException {
+
+ System.in.read();
+ }
+
+ static Observable getName() {
+ return Observable.just("Jake");
+ }
+
+ static Observable getSurname() {
+ return Observable.just("Foo");
+ }
+
+ static Observable save(String fullName) {
+ System.out.println(fullName + " saved!");
+ return Observable.just("OK!");
+ }
+}
diff --git a/2019-08/spring-16/src/main/java/ru/otus/OperatorsExample.java b/2019-08/spring-16/src/main/java/ru/otus/OperatorsExample.java
new file mode 100644
index 00000000..b98b4a3b
--- /dev/null
+++ b/2019-08/spring-16/src/main/java/ru/otus/OperatorsExample.java
@@ -0,0 +1,75 @@
+package ru.otus;
+
+import com.google.common.collect.ImmutableList;
+import io.reactivex.Observable;
+import io.reactivex.ObservableTransformer;
+import io.reactivex.Observer;
+import io.reactivex.Scheduler;
+import io.reactivex.schedulers.Schedulers;
+import io.reactivex.subjects.*;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class OperatorsExample {
+ public static void main(String[] args) throws Exception {
+ publisherExample();
+ System.in.read();
+ }
+
+ public static void simpleExample() throws Exception {
+ List words = ImmutableList.of(
+ new Person("John", "Dow", "male", LocalDate.of(1992, 3, 12)),
+ new Person("Jane", "Dow", "female", LocalDate.of(2001, 6, 23)),
+ new Person("Howard", "Lovecraft", "male", LocalDate.of(1890, 8, 20)),
+ new Person("Joanne", "Rowling", "female", LocalDate.of(1965, 6, 31)));
+ Observable.fromIterable(words)
+ .map(p -> p.getFirstName() + " " + p.getLastName())
+ .toList()
+ .subscribe(System.out::println);
+ }
+
+ public static void publisherExample() throws Exception {
+ final Observable ob = magicPublisher();
+ System.out.println("First subscribed");
+ ob.subscribe(System.out::println);
+ Thread.sleep(5000);
+ System.out.println("Second subscribed");
+ ob.subscribe(System.out::println);
+ }
+
+ public static Observable magicPublisher() {
+ Random r = new Random(1);
+ AtomicInteger i = new AtomicInteger();
+ final Observable obs = Observable.generate(emitter ->
+ emitter.onNext("" + i.incrementAndGet()))
+ .concatMap(s -> Observable.just(s).delay(r.nextInt(1000), TimeUnit.MILLISECONDS))
+ .subscribeOn(Schedulers.newThread());
+ PublishSubject subject = PublishSubject.create();
+// BehaviorSubject subject = BehaviorSubject.create();
+// AsyncSubject subject = AsyncSubject.create();
+// CompletableFuture.runAsync(() -> {
+// try {
+// Thread.sleep(7000);
+// } catch (InterruptedException e) {
+// e.printStackTrace();
+// }
+// subject.onComplete();
+// });
+// ReplaySubject subject = ReplaySubject.create();
+ obs.subscribe(subject);
+ return subject;
+ }
+
+ //composeExmaple
+ private static ObservableTransformer filterAndUpperCase() {
+ return upstream -> upstream
+ .filter(s -> s.length() >= 4)
+ .map(String::toUpperCase);
+ }
+}
diff --git a/2019-08/spring-16/src/main/java/ru/otus/Person.java b/2019-08/spring-16/src/main/java/ru/otus/Person.java
new file mode 100644
index 00000000..72d3f520
--- /dev/null
+++ b/2019-08/spring-16/src/main/java/ru/otus/Person.java
@@ -0,0 +1,66 @@
+package ru.otus;
+
+import java.time.LocalDate;
+import java.util.Objects;
+
+public class Person {
+ private String firstName;
+ private String lastName;
+ private String gender;
+ private LocalDate birth;
+
+ public Person(String firstName, String lastName, String gender, LocalDate birth) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.gender = gender;
+ this.birth = birth;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getGender() {
+ return gender;
+ }
+
+ public void setGender(String gender) {
+ this.gender = gender;
+ }
+
+ public LocalDate getBirth() {
+ return birth;
+ }
+
+ public void setBirth(LocalDate birth) {
+ this.birth = birth;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Person person = (Person) o;
+ return Objects.equals(firstName, person.firstName) &&
+ Objects.equals(lastName, person.lastName) &&
+ Objects.equals(gender, person.gender) &&
+ Objects.equals(birth, person.birth);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, lastName, gender, birth);
+ }
+}
diff --git a/2019-08/spring-16/src/main/java/ru/otus/comparison/AsyncComparison.java b/2019-08/spring-16/src/main/java/ru/otus/comparison/AsyncComparison.java
new file mode 100644
index 00000000..5b0b227a
--- /dev/null
+++ b/2019-08/spring-16/src/main/java/ru/otus/comparison/AsyncComparison.java
@@ -0,0 +1,40 @@
+package ru.otus.comparison;
+
+import io.reactivex.Observable;
+import io.reactivex.schedulers.Schedulers;
+
+import java.io.IOException;
+
+public class AsyncComparison {
+
+ public static void main(String[] args) throws IOException {
+ final long timeStarted = System.currentTimeMillis();
+ final Observable obs = controller();
+ obs.subscribe(System.out::println);
+ System.out.println("Wait time " + (System.currentTimeMillis() - timeStarted));
+ System.in.read();
+ }
+
+ static Observable controller() {
+ return service();
+ }
+
+ static Observable service() {
+ return repository();
+ }
+
+ static Observable repository() {
+ return database();
+ }
+
+ static Observable database() {
+ return Observable.defer(() -> {
+ try {
+ Thread.sleep(4000);
+ } catch (Exception e) {
+ System.out.println("Don't do this");
+ }
+ return Observable.just("Hello world");
+ }).subscribeOn(Schedulers.newThread());
+ }
+}
diff --git a/2019-08/spring-16/src/main/java/ru/otus/comparison/SyncComparison.java b/2019-08/spring-16/src/main/java/ru/otus/comparison/SyncComparison.java
new file mode 100644
index 00000000..c2bf7077
--- /dev/null
+++ b/2019-08/spring-16/src/main/java/ru/otus/comparison/SyncComparison.java
@@ -0,0 +1,31 @@
+package ru.otus.comparison;
+
+public class SyncComparison {
+
+ public static void main(String[] args) {
+ final long timeStarted = System.currentTimeMillis();
+ System.out.println(controller());
+ System.out.println(System.currentTimeMillis() - timeStarted);
+ }
+
+ static String controller() {
+ return service();
+ }
+
+ static String service() {
+ return repository();
+ }
+
+ static String repository() {
+ return database();
+ }
+
+ static String database() {
+ try {
+ Thread.sleep(4000);
+ } catch (Exception e) {
+ System.out.println("Don't do this");
+ }
+ return "Hello world";
+ }
+}