diff --git a/pom.xml b/pom.xml
index 0fc0b3f978b42663ab71b3fd65892b665df6c170..d286a90bcac4521abb2c4a4918fc3065deffc152 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,30 +4,23 @@
 	<modelVersion>4.0.0</modelVersion>
 
 	<groupId>org.springframework.samples</groupId>
-	<artifactId>spring-petclinic</artifactId>
-	<version>1.5.2</version>
-	<packaging>war</packaging>
+	<artifactId>spring-petclinic-rest</artifactId>
+	<version>2.1.5</version>
 
-	<name>petclinic</name>
-	<description>Spring petclinic project</description>
+	<description>REST version of the Spring Petclinic sample application</description>
+    <url>https://spring-petclinic.github.io/</url>
 
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>1.5.2.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
+		<version>2.1.5.RELEASE</version>
+		<relativePath/> <!-- lookup parent from Maven repository -->
 	</parent>
 
 	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<java.version>1.8</java.version>
-
         <spring-data-jdbc.version>1.2.1.RELEASE</spring-data-jdbc.version>
-		<cobertura.version>2.7</cobertura.version>
-
-        <start-class>org.springframework.samples.petclinic.PetClinicApplication</start-class>
-
+        <springfox-swagger.version>2.6.1</springfox-swagger.version>
+        <jacoco.version>0.8.2</jacoco.version>
 	</properties>
 
 	<!-- repository for springfox plugin -->
@@ -96,11 +89,6 @@
             </exclusions>
         </dependency>
 
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-tomcat</artifactId>
-			<scope>provided</scope>
-		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
@@ -129,12 +117,12 @@
 		<dependency>
 			<groupId>io.springfox</groupId>
 			<artifactId>springfox-swagger2</artifactId>
-			<version>2.6.1</version>
+			<version>${springfox-swagger.version}</version>
 		</dependency>
 	    <dependency>
         	<groupId>io.springfox</groupId>
         	<artifactId>springfox-swagger-ui</artifactId>
-        	<version>2.6.1</version>
+        	<version>${springfox-swagger.version}</version>
         </dependency>
 
         <dependency>
@@ -143,13 +131,6 @@
             <scope>test</scope>
         </dependency>
 
-        <dependency>
-        	<groupId>org.hamcrest</groupId>
-        	<artifactId>hamcrest-all</artifactId>
-        	<version>1.3</version>
-        	<scope>test</scope>
-        </dependency>
-
         <dependency>
             <groupId>javax.xml.bind</groupId>
             <artifactId>jaxb-api</artifactId>
@@ -162,25 +143,44 @@
 			<plugin>
 				<groupId>org.springframework.boot</groupId>
 				<artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <!-- Spring Boot Actuator displays build-related information
+                          if a META-INF/build-info.properties file is present -->
+                        <goals>
+                            <goal>build-info</goal>
+                        </goals>
+                        <configuration>
+                            <additionalProperties>
+                                <encoding.source>${project.build.sourceEncoding}</encoding.source>
+                                <encoding.reporting>${project.reporting.outputEncoding}</encoding.reporting>
+                                <java.source>${maven.compiler.source}</java.source>
+                                <java.target>${maven.compiler.target}</java.target>
+                            </additionalProperties>
+                        </configuration>
+                    </execution>
+                </executions>
 			</plugin>
-		</plugins>
-	</build>
-    <reporting>
-        <plugins>
-            <!-- integrate maven-cobertura-plugin to project site -->
+
             <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-                <version>${cobertura.version}</version>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>cobertura</report>
-                        </reports>
-                    </reportSet>
-                </reportSets>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>${jacoco.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>report</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                    </execution>
+                </executions>
             </plugin>
-        </plugins>
-    </reporting>
-    <url>demopetclinic</url>
+		</plugins>
+	</build>
 </project>
diff --git a/readme.md b/readme.md
index 98e7babf1d28f0aae65cdb1bfb90b4a27ff61df3..907390a979ed857c6dcf7ede6fd481a5c9a893b1 100644
--- a/readme.md
+++ b/readme.md
@@ -86,7 +86,7 @@ In its default configuration, Petclinic doesn't have authentication and authoriz
 ### Basic Authentication
 In order to use the basic authentication functionality, turn in on from the application.properties file
 ```
-basic.authentication.enabled=true
+petclinic.security.enable=true
 ```
 This will secure all APIs and in order to access them, basic authentication is required.
 Apart from authentication, APIs also require authorization. This is done via roles that a user can have.
@@ -95,7 +95,7 @@ The existing roles are listed below with the corresponding permissions
 * VET_ADMIN   -> PetTypeController, SpecialityController, VetController
 * ADMIN       -> UserController
 
-There is an existing user with the username admin and password admin that has access to all APIs.
+There is an existing user with the username `admin` and password `admin` that has access to all APIs.
  In order to add a new user, please use the following API:
 ```
 POST /api/users
@@ -139,7 +139,7 @@ File -> Import -> Maven -> Existing Maven project
 |--|--|
 | REST API controllers | [REST folder](src/main/java/org/springframework/samples/petclinic/rest) |
 | Service | [ClinicServiceImpl.java](src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java) |
-|JDBC | [jdbc folder](src/main/java/org/springframework/samples/petclinic/repository/jdb) |
+| JDBC | [jdbc folder](src/main/java/org/springframework/samples/petclinic/repository/jdbc) |
 | JPA | [jpa folder](src/main/java/org/springframework/samples/petclinic/repository/jpa) |
 | Spring Data JPA | [springdatajpa folder](src/main/java/org/springframework/samples/petclinic/repository/springdatajpa) |
 | Tests | [AbstractClinicServiceTests.java](src/test/java/org/springframework/samples/petclinic/service/AbstractClinicServiceTests.java) |
diff --git a/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java b/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
index a9b889779bf9e94bf29a25436cba16116a8b2700..e218be11b928b63686ab245b4f5ddff1c6ae4bc4 100644
--- a/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
+++ b/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
@@ -2,16 +2,10 @@ package org.springframework.samples.petclinic;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 
 @SpringBootApplication
 public class PetClinicApplication extends SpringBootServletInitializer {
-	
-	@Override
-	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
-		return application.sources(PetClinicApplication.class);
-	}
 
 	public static void main(String[] args) {
 		SpringApplication.run(PetClinicApplication.class, args);
diff --git a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
index e96be5b1189daaa188d4eb55868dd60f36b1c3ce..f97dd52b102349b83e9c23181c60683fe4de2f62 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
@@ -18,7 +18,7 @@ package org.springframework.samples.petclinic.model;
 import javax.persistence.Column;
 import javax.persistence.MappedSuperclass;
 
-import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
 
 
 /**
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Owner.java b/src/main/java/org/springframework/samples/petclinic/model/Owner.java
index eb68ced10d7d942c6c17a862f550f1e2109b22f5..e957e86aefd0762a13e521317892856d87c9aecd 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Owner.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Owner.java
@@ -28,8 +28,8 @@ import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotEmpty;
 
-import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.beans.support.MutableSortDefinition;
 import org.springframework.beans.support.PropertyComparator;
 import org.springframework.core.style.ToStringCreator;
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Person.java b/src/main/java/org/springframework/samples/petclinic/model/Person.java
index d3e03c0ddf61a9c3bf2209a13b88cc11f1a5c897..a0da6f697bbc839c22fd9fe944cf305722b254d1 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Person.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Person.java
@@ -18,7 +18,7 @@ package org.springframework.samples.petclinic.model;
 import javax.persistence.Column;
 import javax.persistence.MappedSuperclass;
 
-import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
 
 /**
  * Simple JavaBean domain object representing an person.
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Visit.java b/src/main/java/org/springframework/samples/petclinic/model/Visit.java
index bdf24b140aedf5032ff586b1af2229cb5803ef15..05a39cdc1681d13479461e6c1c28640ed6d94164 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Visit.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Visit.java
@@ -25,7 +25,7 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
-import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.samples.petclinic.rest.JacksonCustomVisitDeserializer;
 import org.springframework.samples.petclinic.rest.JacksonCustomVisitSerializer;
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java
index 98e3dcf0816c3d56475af2e4f4a72b6f48e86604..e4620c77d6cc68f08f2e9b5272a4fb3ae3c999b6 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java
@@ -23,7 +23,7 @@ import javax.persistence.Query;
 
 import org.springframework.context.annotation.Profile;
 import org.springframework.dao.DataAccessException;
-import org.springframework.orm.hibernate3.support.OpenSessionInViewFilter;
+import org.springframework.orm.hibernate5.support.OpenSessionInViewFilter;
 import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.repository.OwnerRepository;
 import org.springframework.stereotype.Repository;
@@ -80,7 +80,7 @@ public class JpaOwnerRepositoryImpl implements OwnerRepository {
         }
 
     }
-    
+
 	@SuppressWarnings("unchecked")
 	@Override
 	public Collection<Owner> findAll() throws DataAccessException {
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java
index dc0b0d4865073621fda49b3ba9f5ad59a01d31c4..2bfd1c78c9d3ca467dab2ed320f4225dd624acb9 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java
@@ -68,17 +68,15 @@ public class JpaPetTypeRepositoryImpl implements PetTypeRepository {
 	@Override
 	public void delete(PetType petType) throws DataAccessException {
 		this.em.remove(this.em.contains(petType) ? petType : this.em.merge(petType));
-		String petTypeId = petType.getId().toString();
+		Integer petTypeId = petType.getId();
 		
-		List<Pet> pets = new ArrayList<Pet>();
-		pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
+		List<Pet> pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
 		for (Pet pet : pets){
-			List<Visit> visits = new ArrayList<Visit>();
-			visits = pet.getVisits();
+			List<Visit> visits = pet.getVisits();
 			for (Visit visit : visits){
-				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId().toString()).executeUpdate();
+				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId()).executeUpdate();
 			}
-			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId().toString()).executeUpdate();
+			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId()).executeUpdate();
 		}
 		this.em.createQuery("DELETE FROM PetType pettype WHERE id=" + petTypeId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java
index 54248caf30856417ccd7697727d8a3aab5670cf7..e6ae41bb2d980d273cbf46c43f7973cd7c88db3d 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java
@@ -62,7 +62,7 @@ public class JpaSpecialtyRepositoryImpl implements SpecialtyRepository {
 	@Override
 	public void delete(Specialty specialty) throws DataAccessException {
 		this.em.remove(this.em.contains(specialty) ? specialty : this.em.merge(specialty));
-		String specId = specialty.getId().toString();
+		Integer specId = specialty.getId();
 		this.em.createNativeQuery("DELETE FROM vet_specialties WHERE specialty_id=" + specId).executeUpdate();
 		this.em.createQuery("DELETE FROM Specialty specialty WHERE id=" + specId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java
index e5f911c7b501fd2564854c0dec4abd21bb2769f4..f6779341adf53bd2dcbd32ac2a410eee5161ddb1 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java
@@ -78,11 +78,7 @@ public class JpaVisitRepositoryImpl implements VisitRepository {
 
 	@Override
 	public void delete(Visit visit) throws DataAccessException {
-		String visitId = visit.getId().toString();
-		this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visitId).executeUpdate();
-		if (em.contains(visit)) {
-			em.remove(visit);
-		}
+        this.em.remove(this.em.contains(visit) ? visit : this.em.merge(visit));
 	}
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java
index b269da83e4110eea3e77e969c6ccff8fccc0ce51..78c02b008d698d2ed06b2fa97b01fb22efba2311 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.Pet;
 @Profile("spring-data-jpa")
 public interface PetRepositoryOverride {
 	
-	public void delete(Pet pet);
+	void delete(Pet pet);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java
index 6414b77598e1ad46900b9abf35cbd60a841bcae2..a3b19e90d20b86aebc4c4d2f1e4e93f102e45629 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.PetType;
 @Profile("spring-data-jpa")
 public interface PetTypeRepositoryOverride {
 	
-	public void delete(PetType petType);
+	void delete(PetType petType);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java
index 39b195506c796f95b9fd13c16e1706e223d1d211..656d8efeaae7c991ae5141ea509381768842163c 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.Specialty;
 @Profile("spring-data-jpa")
 public interface SpecialtyRepositoryOverride {
 	
-	public void delete(Specialty specialty);
+	void delete(Specialty specialty);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java
index 09a69889527523dbd459d592874acc1db4e4c6e2..78c0093b7f6c40a92c3f03fb28eeda1c1f832bce 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java
@@ -36,9 +36,9 @@ public interface SpringDataOwnerRepository extends OwnerRepository, Repository<O
 
     @Override
     @Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName%")
-    public Collection<Owner> findByLastName(@Param("lastName") String lastName);
+    Collection<Owner> findByLastName(@Param("lastName") String lastName);
 
     @Override
     @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id")
-    public Owner findById(@Param("id") int id);
+    Owner findById(@Param("id") int id);
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java
index 753f9c95ed16eb53e45a6e99e3425740dfd3f1f7..23b7a68b200a33993513db2678fde558fc1c1fd1 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java
@@ -38,6 +38,9 @@ public class SpringDataPetRepositoryImpl implements PetRepositoryOverride {
 		String petId = pet.getId().toString();
 		this.em.createQuery("DELETE FROM Visit visit WHERE pet_id=" + petId).executeUpdate();
 		this.em.createQuery("DELETE FROM Pet pet WHERE id=" + petId).executeUpdate();
+        if (em.contains(pet)) {
+            em.remove(pet);
+        }
 	}
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java
index a9f86296ae61901eacb1596dab17126431bb2a1e..a02f9a447b496b3eef478e481515c573069cf191 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java
@@ -41,17 +41,16 @@ public class SpringDataPetTypeRepositoryImpl implements PetTypeRepositoryOverrid
 	@SuppressWarnings("unchecked")
 	@Override
 	public void delete(PetType petType) {
-		String petTypeId = petType.getId().toString();
+        this.em.remove(this.em.contains(petType) ? petType : this.em.merge(petType));
+		Integer petTypeId = petType.getId();
 		
-		List<Pet> pets = new ArrayList<Pet>();
-		pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
+		List<Pet> pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
 		for (Pet pet : pets){
-			List<Visit> visits = new ArrayList<Visit>();
-			visits = pet.getVisits();
+			List<Visit> visits = pet.getVisits();
 			for (Visit visit : visits){
-				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId().toString()).executeUpdate();
+				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId()).executeUpdate();
 			}
-			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId().toString()).executeUpdate();
+			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId()).executeUpdate();
 		}
 		this.em.createQuery("DELETE FROM PetType pettype WHERE id=" + petTypeId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java
index f0eb20e26c05a2c88a7eedc73a026ba14c36378b..012eb0ef4dd109399461675208184b0b24e85075 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java
@@ -35,7 +35,8 @@ public class SpringDataSpecialtyRepositoryImpl implements SpecialtyRepositoryOve
 
 	@Override
 	public void delete(Specialty specialty) {
-		String specId = specialty.getId().toString();
+        this.em.remove(this.em.contains(specialty) ? specialty : this.em.merge(specialty));
+		Integer specId = specialty.getId();
 		this.em.createNativeQuery("DELETE FROM vet_specialties WHERE specialty_id=" + specId).executeUpdate();
 		this.em.createQuery("DELETE FROM Specialty specialty WHERE id=" + specId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java
index a62ddb77c8688c120476c488609e0b0f4fdfdb68..52b08968a4ce467fb0567751291d9a4eacaeed4c 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java
@@ -38,6 +38,9 @@ public class SpringDataVisitRepositoryImpl implements VisitRepositoryOverride {
 	public void delete(Visit visit) throws DataAccessException {
 		String visitId = visit.getId().toString();
 		this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visitId).executeUpdate();
+        if (em.contains(visit)) {
+            em.remove(visit);
+        }
 	}
 
 
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java
index e4b9aa441bdebb379f44e283d7a074365fb8c642..7a622f3edd7876859bb0b477068eb59837d59b98 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.Visit;
 @Profile("spring-data-jpa")
 public interface VisitRepositoryOverride {
 	
-	public void delete(Visit visit);
+	void delete(Visit visit);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationAdapter.java b/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationConfig.java
similarity index 62%
rename from src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationAdapter.java
rename to src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationConfig.java
index b9c9dfb09fbd3acea2c91dc91ba263f071dd0572..8e18b4f127f2fcef355c77be56bf60386c6335b9 100644
--- a/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationAdapter.java
+++ b/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationConfig.java
@@ -4,38 +4,47 @@ import javax.sql.DataSource;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
 
 @Configuration
-@EnableWebSecurity
-@EnableGlobalMethodSecurity(prePostEnabled = true)
-@ConditionalOnProperty( "basic.authentication.enabled" )
-public class BasicAuthenticationAdapter extends WebSecurityConfigurerAdapter {
+@EnableGlobalMethodSecurity(prePostEnabled = true) // Enable @PreAuthorize method-level security
+@ConditionalOnProperty(name = "petclinic.security.enable", havingValue = "true")
+public class BasicAuthenticationConfig extends WebSecurityConfigurerAdapter {
 
     @Autowired
     private DataSource dataSource;
 
     @Override
     protected void configure(HttpSecurity http) throws Exception {
-        http.authorizeRequests()
-                .antMatchers("/securityNone").permitAll()
-                .anyRequest().authenticated()
-                .and()
-            .httpBasic().and()
-            .csrf().disable();
+        // @formatter:off
+        http
+            .authorizeRequests()
+                .anyRequest()
+                    .authenticated()
+                    .and()
+                .httpBasic()
+                    .and()
+                .csrf()
+                    .disable();
+        // @formatter:on
     }
 
     @Autowired
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
+        // @formatter:off
         auth
             .jdbcAuthentication()
                 .dataSource(dataSource)
                 .usersByUsernameQuery("select username,password,enabled from users where username=?")
                 .authoritiesByUsernameQuery("select username,role from roles where username=?");
+        // @formatter:on
     }
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java b/src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..8504a5c02a2ecf786cc340a133363af273a5834f
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java
@@ -0,0 +1,27 @@
+package org.springframework.samples.petclinic.security;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+/**
+ * Starting from Spring Boot 2, if Spring Security is present, endpoints are secured by default
+ * using Spring Security’s content-negotiation strategy.
+ */
+@Configuration
+@ConditionalOnProperty(name = "petclinic.security.enable", havingValue = "false")
+public class DisableSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        // @formatter:off
+        http
+            .authorizeRequests()
+                .anyRequest().permitAll()
+                .and()
+            .csrf()
+                .disable();
+        // @formatter:on
+    }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 77f1022a6db6dfcb1f3f690d8e2bbeaf881b1211..46c07b0c73c888922037af875c8e5b960d32f9d7 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -21,7 +21,7 @@ spring.profiles.active=hsqldb,spring-data-jpa
 # ------------------------------------------------
 
 server.port=9966
-server.context-path=/petclinic/
+server.servlet.context-path=/petclinic/
 
 spring.messages.basename=messages/messages
 
@@ -33,5 +33,4 @@ logging.level.org.springframework=INFO
 
 # enable the desired authentication type
 # by default the authentication is disabled
-security.ignored=/**
-basic.authentication.enabled=false
+petclinic.security.enable=false
diff --git a/src/main/resources/db/hsqldb/populateDB.sql b/src/main/resources/db/hsqldb/populateDB.sql
index 01a0f404cda03db7f52149519c2e110658f80346..e5ee7b90fb55ab921afaf0f4cc4145fea196a0bf 100644
--- a/src/main/resources/db/hsqldb/populateDB.sql
+++ b/src/main/resources/db/hsqldb/populateDB.sql
@@ -52,7 +52,7 @@ INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot');
 INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered');
 INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed');
 
-INSERT INTO users(username,password,enabled) VALUES ('admin','admin', true);
+INSERT INTO users(username,password,enabled) VALUES ('admin','{noop}admin', true);
 
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_OWNER_ADMIN');
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_VET_ADMIN');
diff --git a/src/main/resources/db/mysql/populateDB.sql b/src/main/resources/db/mysql/populateDB.sql
index 48a354697ceee8f0489d0a2c291632fd01b4e9a3..0bbcf4a87d377cfb7e99167102ed193b222a4d4a 100644
--- a/src/main/resources/db/mysql/populateDB.sql
+++ b/src/main/resources/db/mysql/populateDB.sql
@@ -52,7 +52,7 @@ INSERT IGNORE INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot');
 INSERT IGNORE INTO visits VALUES (3, 8, '2009-06-04', 'neutered');
 INSERT IGNORE INTO visits VALUES (4, 7, '2008-09-04', 'spayed');
 
-INSERT IGNORE INTO users(username,password,enabled) VALUES ('admin','admin', true);
+INSERT IGNORE INTO users(username,password,enabled) VALUES ('admin','{noop}admin', true);
 
 INSERT IGNORE INTO roles (username, role) VALUES ('admin', 'ROLE_OWNER_ADMIN');
 INSERT IGNORE INTO roles (username, role) VALUES ('admin', 'ROLE_VET_ADMIN');
diff --git a/src/main/resources/db/postgresql/populateDB.sql b/src/main/resources/db/postgresql/populateDB.sql
index 2c429485a28796d49457020f7d4298b7ee7be4a2..b1dfda8b4e46dea932aae30fe6ce8af694da3035 100644
--- a/src/main/resources/db/postgresql/populateDB.sql
+++ b/src/main/resources/db/postgresql/populateDB.sql
@@ -52,7 +52,7 @@ INSERT INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot') ON CONFLICT DO NOT
 INSERT INTO visits VALUES (3, 8, '2009-06-04', 'neutered') ON CONFLICT DO NOTHING;
 INSERT INTO visits VALUES (4, 7, '2008-09-04', 'spayed') ON CONFLICT DO NOTHING;
 
-INSERT INTO users(username,password,enabled) VALUES ('admin','admin', true) ON CONFLICT DO NOTHING;
+INSERT INTO users(username,password,enabled) VALUES ('admin','{noop}admin', true) ON CONFLICT DO NOTHING;
 
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_OWNER_ADMIN') ON CONFLICT DO NOTHING;
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_VET_ADMIN') ON CONFLICT DO NOTHING;
diff --git a/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java b/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java
index b836d0cc2bda6fad7a2dded46f69accf794b0ff2..75c3f32eb964f6e9b540aed0e6cc7469b5fac8ae 100644
--- a/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java
@@ -39,7 +39,7 @@ public class ValidatorTests {
         assertThat(constraintViolations.size()).isEqualTo(1);
         ConstraintViolation<Person> violation = constraintViolations.iterator().next();
         assertThat(violation.getPropertyPath().toString()).isEqualTo("firstName");
-        assertThat(violation.getMessage()).isEqualTo("may not be empty");
+        assertThat(violation.getMessage()).isEqualTo("must not be empty");
     }
 
 }
diff --git a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
index 50655895842775ddecc1877a3c36d30ca354fba3..a312decedceeeb6976a90bbb259528080cd8fb3e 100644
--- a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
@@ -20,9 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Collection;
 import java.util.Date;
 
-import org.junit.Before;
 import org.junit.Test;
-import org.mockito.MockitoAnnotations;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.model.Pet;
@@ -60,11 +58,6 @@ public abstract class AbstractClinicServiceTests {
     @Autowired
     protected ClinicService clinicService;
 
-    @Before
-    public void init() {
-        MockitoAnnotations.initMocks(this);
-    }
-
     @Test
     public void shouldFindOwnersByLastName() {
         Collection<Owner> owners = this.clinicService.findOwnerByLastName("Davis");
@@ -224,7 +217,7 @@ public abstract class AbstractClinicServiceTests {
         Pet pet = this.clinicService.findPetById(1);
         this.clinicService.deletePet(pet);
         try {
-        pet = this.clinicService.findPetById(1);
+            pet = this.clinicService.findPetById(1);
 		} catch (Exception e) {
 			pet = null;
 		}
@@ -466,10 +459,16 @@ public abstract class AbstractClinicServiceTests {
     @Test
     @Transactional
     public void shouldDeleteSpecialty(){
-    	Specialty specialty = this.clinicService.findSpecialtyById(1);
+        Specialty specialty = new Specialty();
+        specialty.setName("test");
+        this.clinicService.saveSpecialty(specialty);
+        Integer specialtyId = specialty.getId();
+        assertThat(specialtyId).isNotNull();
+    	specialty = this.clinicService.findSpecialtyById(specialtyId);
+        assertThat(specialty).isNotNull();
         this.clinicService.deleteSpecialty(specialty);
         try {
-        	specialty = this.clinicService.findSpecialtyById(1);
+        	specialty = this.clinicService.findSpecialtyById(specialtyId);
 		} catch (Exception e) {
 			specialty = null;
 		}
@@ -477,5 +476,4 @@ public abstract class AbstractClinicServiceTests {
     }
 
 
-
 }