diff --git a/2019-11/spring-15/spring-mvc-class-work/.gitignore b/2019-11/spring-15/spring-mvc-class-work/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/.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/2019-11/spring-15/spring-mvc-class-work/pom.xml b/2019-11/spring-15/spring-mvc-class-work/pom.xml
new file mode 100644
index 00000000..233d2cd2
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/pom.xml
@@ -0,0 +1,17 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-mvc-class-work
+ 1.0
+
+ pom
+
+
+ spring-mvc-exercise
+ spring-mvc-solution
+
+
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/.gitignore b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/.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/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/pom.xml b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/pom.xml
new file mode 100644
index 00000000..7d6549b9
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-mvc-exercise
+ 1.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.4.RELEASE
+
+
+
+ 11
+ 11
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.data
+ spring-data-keyvalue
+ 2.2.4.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..f38e5ae4
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,28 @@
+package ru.otus.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.map.repository.config.EnableMapRepositories;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import javax.annotation.PostConstruct;
+
+@EnableMapRepositories
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class);
+ }
+
+ @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
+ @Autowired
+ private PersonRepository repository;
+
+ @PostConstruct
+ public void init() {
+ repository.save(new Person("Pushkin"));
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java
new file mode 100644
index 00000000..77b6ca94
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Email {
+
+ private int id;
+
+ private String email;
+
+ public Email(String email) {
+ this.email = email;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..d11ee7bb
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,37 @@
+package ru.otus.spring.domain;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.keyvalue.annotation.KeySpace;
+
+@KeySpace("person")
+public class Person {
+
+ @Id
+ private int id;
+ private String name;
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ public Person(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java
new file mode 100644
index 00000000..e81aa243
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java
@@ -0,0 +1,11 @@
+package ru.otus.spring.repostory;
+
+import org.springframework.data.repository.PagingAndSortingRepository;
+import ru.otus.spring.domain.Person;
+
+import java.util.List;
+
+public interface PersonRepository extends PagingAndSortingRepository {
+
+ List findAll();
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java
new file mode 100644
index 00000000..3d98ee4a
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java
@@ -0,0 +1,7 @@
+package ru.otus.spring.rest;
+
+public class NotFoundException extends RuntimeException{
+
+ public NotFoundException() {
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java
new file mode 100644
index 00000000..8a5dbf35
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java
@@ -0,0 +1,19 @@
+package ru.otus.spring.rest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PersonController {
+
+ private final PersonRepository repository;
+
+ public PersonController(PersonRepository repository) {
+ this.repository = repository;
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java
new file mode 100644
index 00000000..12c33816
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016 Russian Post
+ *
+ * This source code is Russian Post Confidential Proprietary.
+ * This software is protected by copyright. All rights and titles are reserved.
+ * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software.
+ * Otherwise this violation would be treated by law and would be subject to legal prosecution.
+ * Legal use of the software provides receipt of a license from the right name only.
+ */
+package ru.otus.spring.rest;
+
+import ru.otus.spring.domain.Person;
+
+/**
+ * DTO that represents Account
+ */
+@SuppressWarnings("all")
+public class PersonDto {
+
+ private int id;
+ private String name;
+
+ public PersonDto() {
+ }
+
+ public PersonDto(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public static Person toDomainObject(PersonDto dto) {
+ return new Person(dto.getId(), dto.getName());
+ }
+
+ public static PersonDto toDto(Person account) {
+ return new PersonDto(account.getId(), account.getName());
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/.gitignore b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/.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/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/pom.xml b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/pom.xml
new file mode 100644
index 00000000..a1c12688
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-mvc-solution
+ 1.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.4.RELEASE
+
+
+
+ 11
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.data
+ spring-data-keyvalue
+ 2.2.4.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/Main.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..f38e5ae4
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,28 @@
+package ru.otus.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.map.repository.config.EnableMapRepositories;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import javax.annotation.PostConstruct;
+
+@EnableMapRepositories
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class);
+ }
+
+ @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
+ @Autowired
+ private PersonRepository repository;
+
+ @PostConstruct
+ public void init() {
+ repository.save(new Person("Pushkin"));
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/domain/Email.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/domain/Email.java
new file mode 100644
index 00000000..77b6ca94
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/domain/Email.java
@@ -0,0 +1,20 @@
+package ru.otus.spring.domain;
+
+public class Email {
+
+ private int id;
+
+ private String email;
+
+ public Email(String email) {
+ this.email = email;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/domain/Person.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/domain/Person.java
new file mode 100644
index 00000000..d11ee7bb
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/domain/Person.java
@@ -0,0 +1,37 @@
+package ru.otus.spring.domain;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.keyvalue.annotation.KeySpace;
+
+@KeySpace("person")
+public class Person {
+
+ @Id
+ private int id;
+ private String name;
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ public Person(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java
new file mode 100644
index 00000000..e81aa243
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java
@@ -0,0 +1,11 @@
+package ru.otus.spring.repostory;
+
+import org.springframework.data.repository.PagingAndSortingRepository;
+import ru.otus.spring.domain.Person;
+
+import java.util.List;
+
+public interface PersonRepository extends PagingAndSortingRepository {
+
+ List findAll();
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java
new file mode 100644
index 00000000..3d98ee4a
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/NotFoundException.java
@@ -0,0 +1,7 @@
+package ru.otus.spring.rest;
+
+public class NotFoundException extends RuntimeException{
+
+ public NotFoundException() {
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/PersonController.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/PersonController.java
new file mode 100644
index 00000000..e6309f8b
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/PersonController.java
@@ -0,0 +1,71 @@
+package ru.otus.spring.rest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import ru.otus.spring.domain.Person;
+import ru.otus.spring.repostory.PersonRepository;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+public class PersonController {
+
+ private final PersonRepository repository;
+
+ public PersonController(PersonRepository repository) {
+ this.repository = repository;
+ }
+
+ @RequestMapping(
+ value = "/person",
+ method = RequestMethod.GET
+ )
+ public List get() {
+ return repository.findAll().stream()
+ .map(PersonDto::toDto)
+ .collect(Collectors.toList());
+ }
+
+ @RequestMapping(
+ value = "/person/{id}",
+ method = RequestMethod.GET
+ )
+ public PersonDto get(
+ @PathVariable("id") int id
+ ) {
+ Person person = repository.findById(id).orElseThrow(NotFoundException::new);
+ return PersonDto.toDto(person);
+ }
+
+ @RequestMapping(
+ value = "/person",
+ method = RequestMethod.POST
+ )
+ public @ResponseBody PersonDto create(@RequestBody PersonDto dto) {
+ Person account = PersonDto.toDomainObject(dto);
+ Person accountWithId = repository.save(account);
+ return PersonDto.toDto(accountWithId);
+ }
+
+ @DeleteMapping("/person/{id}")
+ public void delete(@PathVariable("id") int id) {
+ repository.deleteById(id);
+ }
+
+ @PutMapping("/person/{id}/holder")
+ public void changeName(
+ @PathVariable("id") int id,
+ @RequestParam("name") String name
+ ) {
+ Person person = repository.findById(id).orElseThrow(NotFoundException::new);
+ person.setName(name);
+ repository.save(person);
+ }
+
+ @ExceptionHandler(NotFoundException.class)
+ public ResponseEntity handleNotEnoughFunds(NotFoundException ex) {
+ return ResponseEntity.badRequest().body("Not found");
+ }
+}
diff --git a/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/PersonDto.java b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/PersonDto.java
new file mode 100644
index 00000000..12c33816
--- /dev/null
+++ b/2019-11/spring-15/spring-mvc-class-work/spring-mvc-solution/src/main/java/ru/otus/spring/rest/PersonDto.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016 Russian Post
+ *
+ * This source code is Russian Post Confidential Proprietary.
+ * This software is protected by copyright. All rights and titles are reserved.
+ * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software.
+ * Otherwise this violation would be treated by law and would be subject to legal prosecution.
+ * Legal use of the software provides receipt of a license from the right name only.
+ */
+package ru.otus.spring.rest;
+
+import ru.otus.spring.domain.Person;
+
+/**
+ * DTO that represents Account
+ */
+@SuppressWarnings("all")
+public class PersonDto {
+
+ private int id;
+ private String name;
+
+ public PersonDto() {
+ }
+
+ public PersonDto(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public static Person toDomainObject(PersonDto dto) {
+ return new Person(dto.getId(), dto.getName());
+ }
+
+ public static PersonDto toDto(Person account) {
+ return new PersonDto(account.getId(), account.getName());
+ }
+}