diff --git a/spring-5-webflux/pom.xml b/spring-5-webflux/pom.xml
new file mode 100644
index 0000000000..d7fb7b7930
--- /dev/null
+++ b/spring-5-webflux/pom.xml
@@ -0,0 +1,70 @@
+
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-5-webflux
+ 1.0-SNAPSHOT
+
+ spring-5-webflux
+
+ http://www.baeldung.com
+
+
+ UTF-8
+ 1.8
+ 1.8
+ 2.0.2.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ junit
+ junit
+ test
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+
+
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/responsestatus/ResponseStatusController.java b/spring-5-webflux/src/main/java/com/baeldung/spring/responsestatus/ResponseStatusController.java
new file mode 100644
index 0000000000..bc4f628ab1
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/responsestatus/ResponseStatusController.java
@@ -0,0 +1,64 @@
+package com.baeldung.spring.responsestatus;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
+
+@RequestMapping("/statuses")
+@RestController
+public class ResponseStatusController {
+
+ @GetMapping(value = "/ok", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+ public Flux ok() {
+ return Flux.just("ok");
+ }
+
+ @GetMapping(value = "/no-content", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+ @ResponseStatus(HttpStatus.NO_CONTENT)
+ public Flux noContent() {
+ return Flux.empty();
+ }
+
+ @GetMapping(value = "/accepted", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+ public Flux accepted(ServerHttpResponse response) {
+ response.setStatusCode(HttpStatus.ACCEPTED);
+ return Flux.just("accepted");
+ }
+
+ @GetMapping(value = "/bad-request")
+ public Mono badRequest() {
+ return Mono.error(new IllegalArgumentException());
+ }
+
+ @ResponseStatus(value = HttpStatus.BAD_REQUEST, reason = "Illegal arguments")
+ @ExceptionHandler(IllegalArgumentException.class)
+ public void illegalArgument() {
+
+ }
+
+ @GetMapping(value = "/unauthorized")
+ public ResponseEntity> unathorized() {
+ return ResponseEntity
+ .status(HttpStatus.UNAUTHORIZED)
+ .header("X-Reason", "user-invalid")
+ .body(Mono.just("unauthorized"));
+ }
+
+ @Bean
+ public RouterFunction notFound() {
+ return RouterFunctions.route(GET("/statuses/not-found"), request -> ServerResponse
+ .notFound()
+ .build());
+ }
+
+}
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/responsestatus/SpringResponseStatusApp.java b/spring-5-webflux/src/main/java/com/baeldung/spring/responsestatus/SpringResponseStatusApp.java
new file mode 100644
index 0000000000..1d90511d9d
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/responsestatus/SpringResponseStatusApp.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.responsestatus;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringResponseStatusApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringResponseStatusApp.class, args);
+ }
+}
diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/responsestatus/ResponseStatusControllerTests.java b/spring-5-webflux/src/test/java/com/baeldung/spring/responsestatus/ResponseStatusControllerTests.java
new file mode 100644
index 0000000000..5112c8ceb2
--- /dev/null
+++ b/spring-5-webflux/src/test/java/com/baeldung/spring/responsestatus/ResponseStatusControllerTests.java
@@ -0,0 +1,70 @@
+package com.baeldung.spring.responsestatus;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class ResponseStatusControllerTests {
+
+ @Autowired
+ private WebTestClient testClient;
+
+ @Test
+ public void whenCallRest_thenStatusIsOk() {
+ testClient.get()
+ .uri("/statuses/ok")
+ .exchange()
+ .expectStatus()
+ .isOk();
+ }
+
+ @Test
+ public void whenCallRest_thenStatusIsNoContent() {
+ testClient.get()
+ .uri("/statuses/no-content")
+ .exchange()
+ .expectStatus()
+ .isNoContent();
+ }
+
+ @Test
+ public void whenCallRest_thenStatusIsAccepted() {
+ testClient.get()
+ .uri("/statuses/accepted")
+ .exchange()
+ .expectStatus()
+ .isAccepted();
+ }
+
+ @Test
+ public void whenCallRest_thenStatusIsBadRequest() {
+ testClient.get()
+ .uri("/statuses/bad-request")
+ .exchange()
+ .expectStatus()
+ .isBadRequest();
+ }
+
+ @Test
+ public void whenCallRest_thenStatusIsUnauthorized() {
+ testClient.get()
+ .uri("/statuses/unauthorized")
+ .exchange()
+ .expectStatus()
+ .isUnauthorized();
+ }
+
+ @Test
+ public void whenCallRest_thenStatusIsNotFound() {
+ testClient.get()
+ .uri("/statuses/not-found")
+ .exchange()
+ .expectStatus()
+ .isNotFound();
+ }
+}