diff --git a/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java b/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java
index 943068b4d8b10c998af006a61f716d203fdffcdc..a49745d009c389af72bbf23a7d1cddf61f88fed3 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/advice/ExceptionControllerAdvice.java
@@ -52,10 +52,17 @@ public class ExceptionControllerAdvice {
         return ResponseEntity.badRequest().body(respJSONstring);
     }
 
+    /**
+     * Handles exception thrown by Bean Validation on controller methods parameters
+     *
+     * @param ex      The thrown exception
+     * @param request the current web request
+     * @return an empty response entity
+     */
     @ExceptionHandler(MethodArgumentNotValidException.class)
     @ResponseStatus(code = BAD_REQUEST)
     @ResponseBody
-    public ResponseEntity<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, WebRequest request) {
+    public ResponseEntity<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, WebRequest request) {
         BindingErrorsResponse errors = new BindingErrorsResponse();
         BindingResult bindingResult = ex.getBindingResult();
         HttpHeaders headers = new HttpHeaders();
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java
index 3bb2b6488fc3fb7e99016c1417a92c59bd1e5e3c..80ce1e5a9da7bbacc00ecab3850b28069373d687 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java
@@ -16,6 +16,7 @@
 
 package org.springframework.samples.petclinic.rest.controller;
 
+import io.swagger.annotations.ApiParam;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -29,10 +30,14 @@ import org.springframework.samples.petclinic.rest.api.OwnersApi;
 import org.springframework.samples.petclinic.rest.dto.*;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.util.UriComponentsBuilder;
 
 import javax.transaction.Transactional;
+import javax.validation.constraints.Min;
 import java.util.Collection;
 import java.util.List;
 
@@ -117,9 +122,9 @@ public class OwnerRestController implements OwnersApi {
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/owners/{ownerId}", method = RequestMethod.DELETE, produces = "application/json")
     @Transactional
-    public ResponseEntity<Void> deleteOwner(@PathVariable("ownerId") int ownerId) {
+    @Override
+    public ResponseEntity<OwnerDto> deleteOwner(@Min(0) @ApiParam(value = "The ID of the owner.", required = true) @PathVariable("ownerId") Integer ownerId) {
         Owner owner = this.clinicService.findOwnerById(ownerId);
         if (owner == null) {
             return new ResponseEntity<>(HttpStatus.NOT_FOUND);
@@ -145,7 +150,7 @@ public class OwnerRestController implements OwnersApi {
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
     @Override
-    public ResponseEntity<VisitDto> addVisit(Integer ownerId, Integer petId, VisitFieldsDto visitFieldsDto) {
+    public ResponseEntity<VisitDto> addVisitToOwner(Integer ownerId, Integer petId, VisitFieldsDto visitFieldsDto) {
         HttpHeaders headers = new HttpHeaders();
         Visit visit = visitMapper.toVisit(visitFieldsDto);
         Pet pet = new Pet();
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java
index 5d75adaf979182dd4439deb0d7b90599ea8402ba..10311d24222e3250e22c67feaf9778f9fddb146f 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java
@@ -17,25 +17,20 @@
 package org.springframework.samples.petclinic.rest.controller;
 
 import io.swagger.annotations.ApiParam;
-import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.samples.petclinic.mapper.PetMapper;
 import org.springframework.samples.petclinic.model.Pet;
 import org.springframework.samples.petclinic.rest.api.PetsApi;
 import org.springframework.samples.petclinic.rest.dto.PetDto;
-import org.springframework.samples.petclinic.rest.dto.PetTypeDto;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
 import javax.transaction.Transactional;
 import javax.validation.Valid;
 import javax.validation.constraints.Min;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 
 /**
@@ -44,7 +39,7 @@ import java.util.List;
 
 @RestController
 @CrossOrigin(exposedHeaders = "errors, content-type")
-@RequestMapping("api/pets")
+@RequestMapping("api")
 public class PetRestController implements PetsApi {
 
     private final ClinicService clinicService;
@@ -57,18 +52,16 @@ public class PetRestController implements PetsApi {
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/{petId}", method = RequestMethod.GET, produces = "application/json")
     @Override
-    public ResponseEntity<PetDto> getPet(@Min(0)@ApiParam(value = "The ID of the pet.",required=true) @PathVariable("petId") Integer petId){
+    public ResponseEntity<PetDto> getPet(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("petId") Integer petId) {
         PetDto pet = petMapper.toPetDto(this.clinicService.findPetById(petId));
         if (pet == null) {
-            return new ResponseEntity<PetDto>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
-        return new ResponseEntity<PetDto>(pet, HttpStatus.OK);
+        return new ResponseEntity<>(pet, HttpStatus.OK);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
     @Override
     public ResponseEntity<List<PetDto>> listPets() {
         List<PetDto> pets = new ArrayList<>(petMapper.toPetsDto(this.clinicService.findAllPets()));
@@ -78,17 +71,10 @@ public class PetRestController implements PetsApi {
         return new ResponseEntity<>(pets, HttpStatus.OK);
     }
 
-    @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/pettypes", method = RequestMethod.GET, produces = "application/json")
-    public ResponseEntity<Collection<PetTypeDto>> getPetTypes() {
-        return new ResponseEntity<Collection<PetTypeDto>>(petMapper.toPetTypeDtos(this.clinicService.findPetTypes()), HttpStatus.OK);
-    }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/{petId}", method = RequestMethod.PUT, produces = "application/json")
     @Override
-    public ResponseEntity<PetDto> updatePet(@Min(0)@ApiParam(value = "The ID of the pet.",required=true) @PathVariable("petId") Integer petId,@ApiParam(value = "The pet" ,required=true )  @Valid @RequestBody PetDto petDto) {
-        BindingErrorsResponse errors = new BindingErrorsResponse();
+    public ResponseEntity<PetDto> updatePet(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("petId") Integer petId, @ApiParam(value = "The pet", required = true) @Valid @RequestBody PetDto petDto) {
         Pet currentPet = this.clinicService.findPetById(petId);
         if (currentPet == null) {
             return new ResponseEntity<>(HttpStatus.NOT_FOUND);
@@ -101,10 +87,9 @@ public class PetRestController implements PetsApi {
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/{petId}", method = RequestMethod.DELETE, produces = "application/json")
     @Transactional
     @Override
-    public ResponseEntity<PetDto> deletePet(@Min(0)@ApiParam(value = "The ID of the pet.",required=true) @PathVariable("petId") Integer petId) {
+    public ResponseEntity<PetDto> deletePet(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("petId") Integer petId) {
         Pet pet = this.clinicService.findPetById(petId);
         if (pet == null) {
             return new ResponseEntity<>(HttpStatus.NOT_FOUND);
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java
index 88f98544140b8acc7250e100c1d0d5182bf54f8a..98fdb53c9deaa5e911b21f49b25b40840240c62b 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java
@@ -52,8 +52,7 @@ public class PetTypeRestController implements PettypesApi {
     @PreAuthorize("hasAnyRole(@roles.OWNER_ADMIN, @roles.VET_ADMIN)")
     @Override
     public ResponseEntity<List<PetTypeDto>> listPetTypes() {
-        List<PetType> petTypes = new ArrayList<>();
-        petTypes.addAll(this.clinicService.findAllPetTypes());
+        List<PetType> petTypes = new ArrayList<>(this.clinicService.findAllPetTypes());
         if (petTypes.isEmpty()) {
             return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
@@ -83,7 +82,6 @@ public class PetTypeRestController implements PettypesApi {
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
     @Override
     public ResponseEntity<PetTypeDto> updatePetType(@Min(0) @ApiParam(value = "The ID of the pet type.", required = true) @PathVariable("petTypeId") Integer petTypeId, @ApiParam(value = "The pet type", required = true) @Valid @RequestBody PetTypeDto petTypeDto) {
-
         PetType currentPetType = this.clinicService.findPetTypeById(petTypeId);
         if (currentPetType == null) {
             return new ResponseEntity<>(HttpStatus.NOT_FOUND);
@@ -94,7 +92,6 @@ public class PetTypeRestController implements PettypesApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/pettypes/{petTypeId}", method = RequestMethod.DELETE, produces = "application/json")
     @Transactional
     @Override
     public ResponseEntity<PetTypeDto> deletePetType(@Min(0) @ApiParam(value = "The ID of the pet type.", required = true) @PathVariable("petTypeId") Integer petTypeId) {
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java
index 6ebf9896c5793831d00fe107ef06acfc9cfa6346..51f8dfa81e61c97c999274a417380d3ed9149aaf 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java
@@ -41,7 +41,7 @@ import java.util.List;
 
 @RestController
 @CrossOrigin(exposedHeaders = "errors, content-type")
-@RequestMapping("api/specialties")
+@RequestMapping("api")
 public class SpecialtyRestController implements SpecialtiesApi {
 
     private final ClinicService clinicService;
@@ -54,7 +54,6 @@ public class SpecialtyRestController implements SpecialtiesApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
     @Override
     public ResponseEntity<List<SpecialtyDto>> listSpecialties() {
         List<SpecialtyDto> specialties = new ArrayList<SpecialtyDto>();
@@ -66,7 +65,6 @@ public class SpecialtyRestController implements SpecialtiesApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/{specialtyId}", method = RequestMethod.GET, produces = "application/json")
     @Override
     public ResponseEntity<SpecialtyDto> getSpecialty(@Min(0) @ApiParam(value = "The ID of the pet.", required = true) @PathVariable("specialtyId") Integer specialtyId) {
         Specialty specialty = this.clinicService.findSpecialtyById(specialtyId);
@@ -77,10 +75,8 @@ public class SpecialtyRestController implements SpecialtiesApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
     @Override
     public ResponseEntity<SpecialtyDto> addSpecialty(@ApiParam(value = "The specialty", required = true) @Valid @RequestBody SpecialtyDto specialtyDto) {
-        BindingErrorsResponse errors = new BindingErrorsResponse();
         HttpHeaders headers = new HttpHeaders();
         Specialty specialty = specialtyMapper.toSpecialty(specialtyDto);
         this.clinicService.saveSpecialty(specialty);
@@ -89,7 +85,6 @@ public class SpecialtyRestController implements SpecialtiesApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/{specialtyId}", method = RequestMethod.PUT, produces = "application/json")
     @Override
     public ResponseEntity<SpecialtyDto> updateSpecialty(@Min(0) @ApiParam(value = "The ID of the specialty.", required = true) @PathVariable("specialtyId") Integer specialtyId, @ApiParam(value = "The pet", required = true) @Valid @RequestBody SpecialtyDto specialtyDto) {
         Specialty currentSpecialty = this.clinicService.findSpecialtyById(specialtyId);
@@ -102,7 +97,6 @@ public class SpecialtyRestController implements SpecialtiesApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/{specialtyId}", method = RequestMethod.DELETE, produces = "application/json")
     @Transactional
     @Override
     public ResponseEntity<SpecialtyDto> deleteSpecialty(@Min(0) @ApiParam(value = "The ID of the specialty.", required = true) @PathVariable("specialtyId") Integer specialtyId) {
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java
index 1c499cb9649aff246670063fbdc4164f503c061c..2a5d024f1cab046a18fa484de7c7d991b0880a1d 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/UserRestController.java
@@ -19,20 +19,22 @@ package org.springframework.samples.petclinic.rest.controller;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.samples.petclinic.rest.api.UsersApi;
-import org.springframework.samples.petclinic.rest.dto.UserDto;
 import org.springframework.samples.petclinic.mapper.UserMapper;
 import org.springframework.samples.petclinic.model.User;
+import org.springframework.samples.petclinic.rest.api.UsersApi;
+import org.springframework.samples.petclinic.rest.dto.UserDto;
 import org.springframework.samples.petclinic.service.UserService;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 
 @RestController
 @CrossOrigin(exposedHeaders = "errors, content-type")
-@RequestMapping("api/users")
+@RequestMapping("api")
 public class UserRestController implements UsersApi {
 
     private final UserService userService;
@@ -45,7 +47,6 @@ public class UserRestController implements UsersApi {
 
 
     @PreAuthorize( "hasRole(@roles.ADMIN)" )
-    @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
     @Override
     public ResponseEntity<UserDto> addUser(@RequestBody @Valid UserDto userDto) {
         HttpHeaders headers = new HttpHeaders();
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java
index 9c67a1c31a19456d92acf4047b3fc49ddeb9ecd2..78e6e78313b3cc35aafd0badf2931f62f796582c 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java
@@ -67,7 +67,6 @@ public class VetRestController implements VetsApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/vets/{vetId}", method = RequestMethod.GET, produces = "application/json")
     @Override
     public ResponseEntity<VetDto> getVet(@Min(0)@ApiParam(value = "The ID of the vet.",required=true) @PathVariable("vetId") Integer vetId)  {
         Vet vet = this.clinicService.findVetById(vetId);
@@ -78,7 +77,6 @@ public class VetRestController implements VetsApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/vets", method = RequestMethod.POST, produces = "application/json")
     @Override
     public ResponseEntity<VetDto> addVet(@ApiParam(value = "The vet" ,required=true )  @Valid @RequestBody VetDto vetDto) {
         HttpHeaders headers = new HttpHeaders();
@@ -89,7 +87,6 @@ public class VetRestController implements VetsApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/vets/{vetId}", method = RequestMethod.PUT, produces = "application/json")
     @Override
     public ResponseEntity<VetDto> updateVet(@Min(0)@ApiParam(value = "The ID of the vet.",required=true) @PathVariable("vetId") Integer vetId,@ApiParam(value = "The vet" ,required=true )  @Valid @RequestBody VetDto vetDto)  {
         Vet currentVet = this.clinicService.findVetById(vetId);
@@ -107,7 +104,6 @@ public class VetRestController implements VetsApi {
     }
 
     @PreAuthorize("hasRole(@roles.VET_ADMIN)")
-    @RequestMapping(value = "/vets/{vetId}", method = RequestMethod.DELETE, produces = "application/json")
     @Transactional
     @Override
     public ResponseEntity<VetDto> deleteVet(@Min(0)@ApiParam(value = "The ID of the vet.",required=true) @PathVariable("vetId") Integer vetId) {
diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java
index 1bad23b49b0c117603bd0ba29f000b559f238377..e0c0b2ad3e5d48a101642a8a7896346ceb5bedf7 100644
--- a/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java
+++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java
@@ -16,22 +16,24 @@
 
 package org.springframework.samples.petclinic.rest.controller;
 
+import io.swagger.annotations.ApiParam;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.samples.petclinic.rest.dto.VisitDto;
 import org.springframework.samples.petclinic.mapper.VisitMapper;
 import org.springframework.samples.petclinic.model.Visit;
+import org.springframework.samples.petclinic.rest.api.VisitsApi;
+import org.springframework.samples.petclinic.rest.dto.VisitDto;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.util.UriComponentsBuilder;
 
 import javax.transaction.Transactional;
 import javax.validation.Valid;
+import javax.validation.constraints.Min;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.List;
 
 /**
  * @author Vitaliy Fedoriv
@@ -39,8 +41,8 @@ import java.util.Collection;
 
 @RestController
 @CrossOrigin(exposedHeaders = "errors, content-type")
-@RequestMapping("api/visits")
-public class VisitRestController {
+@RequestMapping("api")
+public class VisitRestController implements VisitsApi {
 
     private final ClinicService clinicService;
 
@@ -53,54 +55,39 @@ public class VisitRestController {
 
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
-    public ResponseEntity<Collection<VisitDto>> getAllVisitDtos() {
-        Collection<Visit> visits = new ArrayList<>();
-
-        visits.addAll(this.clinicService.findAllVisits());
+    @Override
+    public ResponseEntity<List<VisitDto>> listVisits() {
+        List<Visit> visits = new ArrayList<>(this.clinicService.findAllVisits());
         if (visits.isEmpty()) {
-            return new ResponseEntity<Collection<VisitDto>>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
-        return new ResponseEntity<Collection<VisitDto>>(visitMapper.toVisitsDto(visits), HttpStatus.OK);
+        return new ResponseEntity<>(new ArrayList<>(visitMapper.toVisitsDto(visits)), HttpStatus.OK);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/{visitId}", method = RequestMethod.GET, produces = "application/json")
-    public ResponseEntity<VisitDto> getVisitDto(@PathVariable("visitId") int visitId) {
+    @Override
+    public ResponseEntity<VisitDto> getVisit(@Min(0) @ApiParam(value = "The ID of the visit.", required = true) @PathVariable("visitId") Integer visitId) {
         Visit visit = this.clinicService.findVisitById(visitId);
         if (visit == null) {
-            return new ResponseEntity<VisitDto>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
-        return new ResponseEntity<VisitDto>(visitMapper.toVisitDto(visit), HttpStatus.OK);
+        return new ResponseEntity<>(visitMapper.toVisitDto(visit), HttpStatus.OK);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json")
-    public ResponseEntity<VisitDto> addVisit(@RequestBody @Valid VisitDto visitDto, BindingResult bindingResult, UriComponentsBuilder ucBuilder) {
-        BindingErrorsResponse errors = new BindingErrorsResponse();
+    @Override
+    public ResponseEntity<VisitDto> addVisit(@ApiParam(value = "The visit", required = true) @Valid @RequestBody VisitDto visitDto) {
         HttpHeaders headers = new HttpHeaders();
-        if (bindingResult.hasErrors() || (visitDto == null)) {
-            errors.addAllErrors(bindingResult);
-            headers.add("errors", errors.toJSON());
-            return new ResponseEntity<VisitDto>(headers, HttpStatus.BAD_REQUEST);
-        }
         Visit visit = visitMapper.toVisit(visitDto);
         this.clinicService.saveVisit(visit);
         visitDto = visitMapper.toVisitDto(visit);
-        headers.setLocation(ucBuilder.path("/api/visits/{id}").buildAndExpand(visit.getId()).toUri());
+        headers.setLocation(UriComponentsBuilder.newInstance().path("/api/visits/{id}").buildAndExpand(visit.getId()).toUri());
         return new ResponseEntity<>(visitDto, headers, HttpStatus.CREATED);
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/{visitId}", method = RequestMethod.PUT, produces = "application/json")
-    public ResponseEntity<VisitDto> updateVisit(@PathVariable("visitId") int visitId, @RequestBody @Valid VisitDto visitDto, BindingResult bindingResult) {
-        BindingErrorsResponse errors = new BindingErrorsResponse();
-        HttpHeaders headers = new HttpHeaders();
-        if (bindingResult.hasErrors() || (visitDto == null)) {
-            errors.addAllErrors(bindingResult);
-            headers.add("errors", errors.toJSON());
-            return new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST);
-        }
+    @Override
+    public ResponseEntity<VisitDto> updateVisit(@Min(0) @ApiParam(value = "The ID of the visit.", required = true) @PathVariable("visitId") Integer visitId, @ApiParam(value = "The visit", required = true) @Valid @RequestBody VisitDto visitDto) {
         Visit currentVisit = this.clinicService.findVisitById(visitId);
         if (currentVisit == null) {
             return new ResponseEntity<>(HttpStatus.NOT_FOUND);
@@ -112,12 +99,12 @@ public class VisitRestController {
     }
 
     @PreAuthorize("hasRole(@roles.OWNER_ADMIN)")
-    @RequestMapping(value = "/{visitId}", method = RequestMethod.DELETE, produces = "application/json")
     @Transactional
-    public ResponseEntity<Void> deleteVisit(@PathVariable("visitId") int visitId) {
+    @Override
+    public ResponseEntity<VisitDto> deleteVisit(@Min(0) @ApiParam(value = "The ID of the visit.", required = true) @PathVariable("visitId") Integer visitId) {
         Visit visit = this.clinicService.findVisitById(visitId);
         if (visit == null) {
-            return new ResponseEntity<Void>(HttpStatus.NOT_FOUND);
+            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
         }
         this.clinicService.deleteVisit(visit);
         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
diff --git a/src/main/resources/openapi.yml b/src/main/resources/openapi.yml
index 67df4474842e5ea5b4e5d04d21e593b311bbc5d3..9bac1e38c2e0affdb4f0d7999ff7693910111c8e 100755
--- a/src/main/resources/openapi.yml
+++ b/src/main/resources/openapi.yml
@@ -230,6 +230,60 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/RestError'
+
+    delete:
+      tags:
+        - owner
+      operationId: deleteOwner
+      summary: Delete an owner by ID
+      description: Returns the owner or a 404 error.
+      parameters:
+        - name: ownerId
+          in: path
+          description: The ID of the owner.
+          required: true
+          schema:
+            type: integer
+            format: int32
+            minimum: 0
+            example: 1
+      responses:
+        200:
+          description: Owner details found and returned.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Owner'
+        304:
+          description: Not modified.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+        400:
+          description: Bad request.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        404:
+          description: Owner  not found.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        500:
+          description: Server error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
   /owners/{ownerId}/pets:
     post:
       tags:
@@ -268,7 +322,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet not found.
           content:
             application/json:
               schema:
@@ -331,7 +385,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet not found.
           content:
             application/json:
               schema:
@@ -400,7 +454,7 @@ paths:
     post:
       tags:
         - visit
-      operationId: addVisit
+      operationId: addVisitToOwner
       summary: Adds a vet visit
       description: Records the details of a new vet visit.
       parameters:
@@ -694,7 +748,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet type not found.
           content:
             application/json:
               schema:
@@ -779,7 +833,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet not found.
           content:
             application/json:
               schema:
@@ -833,7 +887,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet not found.
           content:
             application/json:
               schema:
@@ -893,7 +947,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet not found.
           content:
             application/json:
               schema:
@@ -946,7 +1000,258 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Pet not found.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        500:
+          description: Server error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+  /visits:
+    get:
+      tags:
+        - visit
+      operationId: listVisits
+      summary: Lists visits
+      description: Returns an array of visit .
+      responses:
+        200:
+          description: visits found and returned.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/Visit'
+        304:
+          description: Not modified.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+        500:
+          description: Server error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+    post:
+      tags:
+        - visit
+      operationId: addVisit
+      summary: Create a visit
+      description: Creates a visit.
+      requestBody:
+        description: The visit
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/Visit'
+        required: true
+      responses:
+        200:
+          description: visit created successfully.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Visit'
+        304:
+          description: Not modified.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+        400:
+          description: Bad request.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        404:
+          description: Visit not found.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        500:
+          description: Server error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+  /visits/{visitId}:
+    get:
+      tags:
+        - visit
+      operationId: getVisit
+      summary: Get a visit by ID
+      description: Returns the visit or a 404 error.
+      parameters:
+        - name: visitId
+          in: path
+          description: The ID of the visit.
+          required: true
+          schema:
+            type: integer
+            format: int32
+            minimum: 0
+            example: 1
+      responses:
+        200:
+          description: Visit details found and returned.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Visit'
+        304:
+          description: Not modified.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+        400:
+          description: Bad request.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        404:
+          description: Visit not found.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        500:
+          description: Server error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+    put:
+      tags:
+        - visit
+      operationId: updateVisit
+      summary: Update a visit by ID
+      description: Returns the visit or a 404 error.
+      parameters:
+        - name: visitId
+          in: path
+          description: The ID of the visit.
+          required: true
+          schema:
+            type: integer
+            format: int32
+            minimum: 0
+            example: 1
+      requestBody:
+        description: The visit
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/Visit'
+        required: true
+      responses:
+        200:
+          description: Visit details found and returned.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Visit'
+        304:
+          description: Not modified.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+        400:
+          description: Bad request.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        404:
+          description: Visit not found.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        500:
+          description: Server error.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+    delete:
+      tags:
+        - visit
+      operationId: deleteVisit
+      summary: Delete a visit by ID
+      description: Returns the visit or a 404 error.
+      parameters:
+        - name: visitId
+          in: path
+          description: The ID of the visit.
+          required: true
+          schema:
+            type: integer
+            format: int32
+            minimum: 0
+            example: 1
+      responses:
+        200:
+          description: Visit details found and returned.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/Visit'
+        304:
+          description: Not modified.
+          headers:
+            ETag:
+              description: An ID for this version of the response.
+              schema:
+                type: string
+        400:
+          description: Bad request.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/RestError'
+        404:
+          description: Visit not found.
           content:
             application/json:
               schema:
@@ -1030,7 +1335,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Specialty not found.
           content:
             application/json:
               schema:
@@ -1282,7 +1587,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Vet not found.
           content:
             application/json:
               schema:
@@ -1336,7 +1641,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Vet not found.
           content:
             application/json:
               schema:
@@ -1396,7 +1701,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Vet not found.
           content:
             application/json:
               schema:
@@ -1449,7 +1754,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/RestError'
         404:
-          description: Owner not found.
+          description: Vet not found.
           content:
             application/json:
               schema:
diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java
index 63ab72d69c392ba4e99e022dcb6e02e00b834a26..6f0bcff39a2f350364174342e885f526153c4328 100644
--- a/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/OwnerRestControllerTests.java
@@ -25,15 +25,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.MediaType;
+import org.springframework.samples.petclinic.mapper.OwnerMapper;
 import org.springframework.samples.petclinic.mapper.VisitMapper;
-import org.springframework.samples.petclinic.model.Visit;
+import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice;
 import org.springframework.samples.petclinic.rest.dto.OwnerDto;
 import org.springframework.samples.petclinic.rest.dto.PetDto;
 import org.springframework.samples.petclinic.rest.dto.PetTypeDto;
 import org.springframework.samples.petclinic.rest.dto.VisitDto;
-import org.springframework.samples.petclinic.mapper.OwnerMapper;
-import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig;
 import org.springframework.security.test.context.support.WithMockUser;
@@ -339,8 +338,8 @@ class OwnerRestControllerTests {
         ObjectMapper mapper = new ObjectMapper();
         mapper.registerModule(new JavaTimeModule());
         String newOwnerAsJSON = mapper.writeValueAsString(newOwnerDto);
-        given(this.clinicService.findOwnerById(-1)).willReturn(null);
-        this.mockMvc.perform(delete("/api/owners/-1")
+        given(this.clinicService.findOwnerById(999)).willReturn(null);
+        this.mockMvc.perform(delete("/api/owners/999")
                 .content(newOwnerAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(status().isNotFound());
     }
diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java
index 7a17ed72a293e90d5acedf8007a9dc4a3594d82b..fbe963b8a10cd0ca19b823a07f04a76538074398 100644
--- a/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/PetRestControllerTests.java
@@ -25,20 +25,18 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.MediaType;
+import org.springframework.samples.petclinic.mapper.PetMapper;
+import org.springframework.samples.petclinic.model.Pet;
 import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice;
-import org.springframework.samples.petclinic.rest.controller.PetRestController;
 import org.springframework.samples.petclinic.rest.dto.OwnerDto;
 import org.springframework.samples.petclinic.rest.dto.PetDto;
 import org.springframework.samples.petclinic.rest.dto.PetTypeDto;
-import org.springframework.samples.petclinic.mapper.PetMapper;
-import org.springframework.samples.petclinic.model.Pet;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig;
 import org.springframework.security.test.context.support.WithMockUser;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
 import java.text.SimpleDateFormat;
@@ -215,7 +213,7 @@ class PetRestControllerTests {
         ObjectMapper mapper = new ObjectMapper();
         mapper.registerModule(new JavaTimeModule());
         String newPetAsJSON = mapper.writeValueAsString(newPet);
-        given(this.clinicService.findPetById(-1)).willReturn(null);
+        given(this.clinicService.findPetById(999)).willReturn(null);
         this.mockMvc.perform(delete("/api/pets/999")
             .content(newPetAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
             .andExpect(status().isNotFound());
diff --git a/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java b/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java
index 0cad10e3f223270fddd909652c653998bbfe02c1..74217cc5f7480256a3a0536f108b2dc2d20a3408 100644
--- a/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/rest/controller/VisitRestControllerTests.java
@@ -31,7 +31,6 @@ import org.springframework.samples.petclinic.model.Pet;
 import org.springframework.samples.petclinic.model.PetType;
 import org.springframework.samples.petclinic.model.Visit;
 import org.springframework.samples.petclinic.rest.advice.ExceptionControllerAdvice;
-import org.springframework.samples.petclinic.rest.controller.VisitRestController;
 import org.springframework.samples.petclinic.service.ClinicService;
 import org.springframework.samples.petclinic.service.clinicService.ApplicationTestConfig;
 import org.springframework.security.test.context.support.WithMockUser;
@@ -131,8 +130,8 @@ class VisitRestControllerTests {
     @Test
     @WithMockUser(roles="OWNER_ADMIN")
     void testGetVisitNotFound() throws Exception {
-    	given(this.clinicService.findVisitById(-1)).willReturn(null);
-        this.mockMvc.perform(get("/api/visits/-1")
+        given(this.clinicService.findVisitById(999)).willReturn(null);
+        this.mockMvc.perform(get("/api/visits/999")
         	.accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isNotFound());
     }
@@ -246,8 +245,8 @@ class VisitRestControllerTests {
     	ObjectMapper mapper = new ObjectMapper();
         mapper.registerModule(new JavaTimeModule());
         String newVisitAsJSON = mapper.writeValueAsString(visitMapper.toVisitDto(newVisit));
-    	given(this.clinicService.findVisitById(-1)).willReturn(null);
-    	this.mockMvc.perform(delete("/api/visits/-1")
+        given(this.clinicService.findVisitById(999)).willReturn(null);
+        this.mockMvc.perform(delete("/api/visits/999")
     		.content(newVisitAsJSON).accept(MediaType.APPLICATION_JSON_VALUE).contentType(MediaType.APPLICATION_JSON_VALUE))
         	.andExpect(status().isNotFound());
     }