From 521d01db950e357cf81ef78c50daf290e92b309c Mon Sep 17 00:00:00 2001
From: Costin Leau <cleau@vmware.com>
Date: Wed, 25 Nov 2009 18:45:52 +0000
Subject: [PATCH] SPR-6447 SPR-6448 + commit the gross of the files + added
 maven pom

---
 db/build.xml                                  |   85 ++
 db/dropTables.txt                             |    7 +
 db/emptyDB.txt                                |    7 +
 db/mysql/createDB.txt                         |    3 +
 db/mysql/dropDB.txt                           |    1 +
 db/mysql/initDB.txt                           |   58 +
 db/mysql/petclinic_db_setup_mysql.txt         |   22 +
 db/mysql/petclinic_tomcat_mysql.xml           |   64 +
 db/petclinic_tomcat_all.xml                   |  112 ++
 db/populateDB.txt                             |   53 +
 pom.xml                                       |  233 ++++
 readme.txt                                    |   18 +-
 .../samples/petclinic/BaseEntity.java         |   27 +
 .../samples/petclinic/Clinic.java             |   82 ++
 .../samples/petclinic/NamedEntity.java        |   28 +
 .../samples/petclinic/Owner.java              |  127 ++
 .../samples/petclinic/Person.java             |   32 +
 .../samples/petclinic/Pet.java                |   77 ++
 .../samples/petclinic/PetType.java            |    8 +
 .../samples/petclinic/Specialty.java          |   10 +
 .../samples/petclinic/Vet.java                |   52 +
 .../samples/petclinic/Vets.java               |   43 +
 .../samples/petclinic/Visit.java              |   70 +
 .../aspects/AbstractTraceAspect.java          |   31 +
 .../aspects/CallMonitoringAspect.java         |   81 ++
 .../petclinic/aspects/UsageLogAspect.java     |   48 +
 .../config/DbcpDataSourceFactory.java         |  261 ++++
 .../petclinic/hibernate/HibernateClinic.java  |   98 ++
 .../petclinic/hibernate/package-info.java     |    9 +
 .../samples/petclinic/jdbc/JdbcPet.java       |   35 +
 .../petclinic/jdbc/SimpleJdbcClinic.java      |  342 +++++
 .../petclinic/jdbc/SimpleJdbcClinicMBean.java |   20 +
 .../samples/petclinic/jdbc/package-info.java  |    9 +
 .../petclinic/jpa/EntityManagerClinic.java    |   96 ++
 .../samples/petclinic/jpa/package-info.java   |    9 +
 .../samples/petclinic/package-info.java       |    8 +
 ...entialsHSQLPlatformWithNativeSequence.java |   56 +
 .../petclinic/toplink/package-info.java       |   10 +
 .../samples/petclinic/util/EntityUtils.java   |   41 +
 .../petclinic/validation/OwnerValidator.java  |   43 +
 .../petclinic/validation/PetValidator.java    |   25 +
 .../petclinic/validation/VisitValidator.java  |   21 +
 .../petclinic/validation/package-info.java    |    9 +
 .../samples/petclinic/web/AddOwnerForm.java   |   65 +
 .../samples/petclinic/web/AddPetForm.java     |   77 ++
 .../samples/petclinic/web/AddVisitForm.java   |   69 +
 .../web/ClinicBindingInitializer.java         |   37 +
 .../petclinic/web/ClinicController.java       |   89 ++
 .../samples/petclinic/web/EditOwnerForm.java  |   65 +
 .../samples/petclinic/web/EditPetForm.java    |   80 ++
 .../samples/petclinic/web/FindOwnersForm.java |   74 ++
 .../samples/petclinic/web/PetTypeEditor.java  |   30 +
 .../samples/petclinic/web/VisitsAtomView.java |   82 ++
 .../samples/petclinic/web/package-info.java   |    8 +
 src/main/java/overview.html                   |    7 +
 src/main/resources/jdbc.properties            |   63 +
 src/main/resources/log4j.properties           |   18 +
 src/main/resources/messages.properties        |    8 +
 src/main/resources/messages_de.properties     |    8 +
 src/main/resources/messages_en.properties     |    1 +
 src/main/resources/petclinic.hbm.xml          |   74 ++
 src/main/webapp/META-INF/aop.xml              |   18 +
 src/main/webapp/META-INF/context.xml          |    7 +
 .../webapp/META-INF/hsqldb/dropTables.txt     |    7 +
 src/main/webapp/META-INF/hsqldb/initDB.txt    |   55 +
 .../webapp/META-INF/hsqldb/populateDB.txt     |   53 +
 src/main/webapp/META-INF/orm.xml              |  122 ++
 src/main/webapp/META-INF/persistence.xml      |   16 +
 .../WEB-INF/applicationContext-hibernate.xml  |   89 ++
 .../WEB-INF/applicationContext-jdbc.xml       |   85 ++
 .../webapp/WEB-INF/applicationContext-jpa.xml |  101 ++
 .../webapp/WEB-INF/classes/log4j.properties   |   18 +
 .../WEB-INF/classes/messages.properties       |    8 +
 .../WEB-INF/classes/messages_de.properties    |    8 +
 .../WEB-INF/classes/messages_en.properties    |    1 +
 src/main/webapp/WEB-INF/geronimo-web.xml      |    6 +
 .../webapp/WEB-INF/jsp/dataAccessFailure.jsp  |   19 +
 src/main/webapp/WEB-INF/jsp/footer.jsp        |   12 +
 src/main/webapp/WEB-INF/jsp/header.jsp        |   14 +
 src/main/webapp/WEB-INF/jsp/includes.jsp      |    5 +
 src/main/webapp/WEB-INF/jsp/owners/form.jsp   |   61 +
 src/main/webapp/WEB-INF/jsp/owners/list.jsp   |   34 +
 src/main/webapp/WEB-INF/jsp/owners/search.jsp |   26 +
 src/main/webapp/WEB-INF/jsp/owners/show.jsp   |  108 ++
 src/main/webapp/WEB-INF/jsp/pets/form.jsp     |   56 +
 .../webapp/WEB-INF/jsp/pets/visitForm.jsp     |   68 +
 .../webapp/WEB-INF/jsp/uncaughtException.jsp  |   49 +
 src/main/webapp/WEB-INF/jsp/vets.jsp          |   31 +
 src/main/webapp/WEB-INF/jsp/welcome.jsp       |   15 +
 src/main/webapp/WEB-INF/petclinic-servlet.xml |  110 ++
 src/main/webapp/WEB-INF/web.xml               |  161 +++
 src/main/webapp/html/tutorial.html            | 1153 +++++++++++++++++
 src/main/webapp/images/banner-graphic.png     |  Bin 0 -> 13773 bytes
 src/main/webapp/images/bullet-arrow.png       |  Bin 0 -> 2954 bytes
 src/main/webapp/images/pets.png               |  Bin 0 -> 55318 bytes
 src/main/webapp/images/springsource-logo.png  |  Bin 0 -> 4974 bytes
 src/main/webapp/images/submit-bg.png          |  Bin 0 -> 2820 bytes
 src/main/webapp/styles/petclinic.css          |  234 ++++
 .../petclinic/AbstractClinicTests.java        |  224 ++++
 .../samples/petclinic/OwnerTests.java         |   27 +
 .../samples/petclinic/PetClinicTestSuite.java |   29 +
 .../hibernate/HibernateClinicTests.java       |   20 +
 .../petclinic/jdbc/SimpleJdbcClinicTests.java |   19 +
 .../petclinic/jpa/AbstractJpaClinicTests.java |  199 +++
 .../jpa/EntityManagerClinicTests.java         |   51 +
 .../HibernateEntityManagerClinicTests.java    |   26 +
 .../jpa/OpenJpaEntityManagerClinicTests.java  |   27 +
 .../petclinic/web/VisitsAtomViewTest.java     |   90 ++
 src/test/resources/log4j.xml                  |   28 +
 .../petclinic/AbstractClinicTests-context.xml |   22 +
 .../HibernateClinicTests-context.xml          |   32 +
 .../jdbc/SimpleJdbcClinicTests-context.xml    |   11 +
 .../jpa/applicationContext-entityManager.xml  |   16 +
 .../applicationContext-hibernateAdapter.xml   |    9 +
 .../jpa/applicationContext-jpaCommon.xml      |   31 +
 .../jpa/applicationContext-openJpaAdapter.xml |    9 +
 .../jpa/applicationContext-toplinkAdapter.xml |    9 +
 117 files changed, 6945 insertions(+), 10 deletions(-)
 create mode 100644 db/build.xml
 create mode 100644 db/dropTables.txt
 create mode 100644 db/emptyDB.txt
 create mode 100644 db/mysql/createDB.txt
 create mode 100644 db/mysql/dropDB.txt
 create mode 100644 db/mysql/initDB.txt
 create mode 100644 db/mysql/petclinic_db_setup_mysql.txt
 create mode 100644 db/mysql/petclinic_tomcat_mysql.xml
 create mode 100644 db/petclinic_tomcat_all.xml
 create mode 100644 db/populateDB.txt
 create mode 100644 pom.xml
 create mode 100644 src/main/java/org/springframework/samples/petclinic/BaseEntity.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Clinic.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/NamedEntity.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Owner.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Person.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Pet.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/PetType.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Specialty.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Vet.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Vets.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/Visit.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/aspects/AbstractTraceAspect.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/aspects/CallMonitoringAspect.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/aspects/UsageLogAspect.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/config/DbcpDataSourceFactory.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/jdbc/JdbcPet.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicMBean.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/jdbc/package-info.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/jpa/package-info.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/package-info.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/toplink/EssentialsHSQLPlatformWithNativeSequence.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/toplink/package-info.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/validation/OwnerValidator.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/validation/PetValidator.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/validation/VisitValidator.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/validation/package-info.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/AddOwnerForm.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/AddPetForm.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/AddVisitForm.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/ClinicBindingInitializer.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/ClinicController.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/EditOwnerForm.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/EditPetForm.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/FindOwnersForm.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/PetTypeEditor.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java
 create mode 100644 src/main/java/org/springframework/samples/petclinic/web/package-info.java
 create mode 100644 src/main/java/overview.html
 create mode 100644 src/main/resources/jdbc.properties
 create mode 100644 src/main/resources/log4j.properties
 create mode 100644 src/main/resources/messages.properties
 create mode 100644 src/main/resources/messages_de.properties
 create mode 100644 src/main/resources/messages_en.properties
 create mode 100644 src/main/resources/petclinic.hbm.xml
 create mode 100644 src/main/webapp/META-INF/aop.xml
 create mode 100644 src/main/webapp/META-INF/context.xml
 create mode 100644 src/main/webapp/META-INF/hsqldb/dropTables.txt
 create mode 100644 src/main/webapp/META-INF/hsqldb/initDB.txt
 create mode 100644 src/main/webapp/META-INF/hsqldb/populateDB.txt
 create mode 100644 src/main/webapp/META-INF/orm.xml
 create mode 100644 src/main/webapp/META-INF/persistence.xml
 create mode 100644 src/main/webapp/WEB-INF/applicationContext-hibernate.xml
 create mode 100644 src/main/webapp/WEB-INF/applicationContext-jdbc.xml
 create mode 100644 src/main/webapp/WEB-INF/applicationContext-jpa.xml
 create mode 100644 src/main/webapp/WEB-INF/classes/log4j.properties
 create mode 100644 src/main/webapp/WEB-INF/classes/messages.properties
 create mode 100644 src/main/webapp/WEB-INF/classes/messages_de.properties
 create mode 100644 src/main/webapp/WEB-INF/classes/messages_en.properties
 create mode 100644 src/main/webapp/WEB-INF/geronimo-web.xml
 create mode 100644 src/main/webapp/WEB-INF/jsp/dataAccessFailure.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/footer.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/header.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/includes.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/owners/form.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/owners/list.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/owners/search.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/owners/show.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/pets/form.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/pets/visitForm.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/uncaughtException.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/vets.jsp
 create mode 100644 src/main/webapp/WEB-INF/jsp/welcome.jsp
 create mode 100644 src/main/webapp/WEB-INF/petclinic-servlet.xml
 create mode 100644 src/main/webapp/WEB-INF/web.xml
 create mode 100644 src/main/webapp/html/tutorial.html
 create mode 100644 src/main/webapp/images/banner-graphic.png
 create mode 100644 src/main/webapp/images/bullet-arrow.png
 create mode 100644 src/main/webapp/images/pets.png
 create mode 100644 src/main/webapp/images/springsource-logo.png
 create mode 100644 src/main/webapp/images/submit-bg.png
 create mode 100644 src/main/webapp/styles/petclinic.css
 create mode 100644 src/test/java/org/springframework/samples/petclinic/AbstractClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/OwnerTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/PetClinicTestSuite.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/hibernate/HibernateClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/jpa/AbstractJpaClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/jpa/EntityManagerClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/jpa/HibernateEntityManagerClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/jpa/OpenJpaEntityManagerClinicTests.java
 create mode 100644 src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java
 create mode 100644 src/test/resources/log4j.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/AbstractClinicTests-context.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/hibernate/HibernateClinicTests-context.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests-context.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-entityManager.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-hibernateAdapter.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-jpaCommon.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-openJpaAdapter.xml
 create mode 100644 src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-toplinkAdapter.xml

diff --git a/db/build.xml b/db/build.xml
new file mode 100644
index 00000000..b6d09936
--- /dev/null
+++ b/db/build.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+
+<project name="setupDB" basedir="." default="all">
+
+	<target name="dropHSQLTables" if="useHSQL">
+		<echo message="Drop tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}" onerror="continue">
+			<classpath>
+				<fileset dir="${spring.root}/lib">
+					<include name="hsqldb/hsqldb.jar" />
+				</fileset>
+			</classpath>
+			<transaction src="${db.dir}/dropTables.txt" />
+		</sql>
+	</target>
+
+	<target name="createHSQLTables" if="useHSQL">
+		<echo message="Create tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}" onerror="continue">
+			<classpath>
+				<fileset dir="${spring.root}/lib">
+					<include name="hsqldb/hsqldb.jar" />
+				</fileset>
+			</classpath>
+			<transaction src="${db.dir}/hsqldb/initDB.txt" />
+		</sql>
+	</target>
+
+	<target name="dropMYSQLTables" if="useMYSQL">
+		<echo message="Dropping tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}" onerror="continue">
+			<classpath>
+				<fileset dir="${db.dir}/mysql">
+					<include name="mysql*.jar" />
+				</fileset>
+			</classpath>
+			<transaction src="${db.dir}/dropTables.txt" />
+		</sql>
+	</target>
+
+	<target name="createMYSQLTables" if="useMYSQL">
+		<echo message="Creating tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}" onerror="continue">
+			<classpath>
+				<fileset dir="${db.dir}/mysql">
+					<include name="mysql*.jar" />
+				</fileset>
+			</classpath>
+			<transaction src="${db.dir}/mysql/initDB.txt" />
+		</sql>
+	</target>
+
+	<target name="emptyTables">
+		<echo message="Emptying tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}">
+			<classpath>
+				<fileset dir="${spring.root}/lib">
+					<include name="hsqldb/hsqldb.jar" />
+				</fileset>
+				<fileset dir="${db.dir}/mysql">
+					<include name="mysql*.jar" />
+				</fileset>
+			</classpath>
+			<transaction src="${db.dir}/emptyDB.txt" />
+		</sql>
+	</target>
+
+	<target name="populateTables">
+		<echo message="Populating tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}">
+			<classpath>
+				<fileset dir="${spring.root}/lib">
+					<include name="hsqldb/hsqldb.jar" />
+				</fileset>
+				<fileset dir="${db.dir}/mysql">
+					<include name="mysql*.jar" />
+				</fileset>
+			</classpath>
+			<transaction src="${db.dir}/populateDB.txt" />
+		</sql>
+	</target>
+
+	<target name="all" depends="dropHSQLTables,createHSQLTables,dropMYSQLTables,createMYSQLTables,emptyTables,populateTables" />
+
+</project>
\ No newline at end of file
diff --git a/db/dropTables.txt b/db/dropTables.txt
new file mode 100644
index 00000000..90ae6329
--- /dev/null
+++ b/db/dropTables.txt
@@ -0,0 +1,7 @@
+DROP TABLE visits;
+DROP TABLE pets;
+DROP TABLE owners;
+DROP TABLE types;
+DROP TABLE vet_specialties;
+DROP TABLE specialties;
+DROP TABLE vets;
diff --git a/db/emptyDB.txt b/db/emptyDB.txt
new file mode 100644
index 00000000..d5dd8728
--- /dev/null
+++ b/db/emptyDB.txt
@@ -0,0 +1,7 @@
+DELETE FROM vets;
+DELETE FROM specialties;
+DELETE FROM vet_specialties;
+DELETE FROM types;
+DELETE FROM owners;
+DELETE FROM pets;
+DELETE FROM visits;
diff --git a/db/mysql/createDB.txt b/db/mysql/createDB.txt
new file mode 100644
index 00000000..5b4b3859
--- /dev/null
+++ b/db/mysql/createDB.txt
@@ -0,0 +1,3 @@
+CREATE DATABASE petclinic;
+
+GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc';
\ No newline at end of file
diff --git a/db/mysql/dropDB.txt b/db/mysql/dropDB.txt
new file mode 100644
index 00000000..e1209da0
--- /dev/null
+++ b/db/mysql/dropDB.txt
@@ -0,0 +1 @@
+DROP DATABASE petclinic;
diff --git a/db/mysql/initDB.txt b/db/mysql/initDB.txt
new file mode 100644
index 00000000..0007ee3a
--- /dev/null
+++ b/db/mysql/initDB.txt
@@ -0,0 +1,58 @@
+USE petclinic;
+
+CREATE TABLE vets (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  first_name VARCHAR(30),
+  last_name VARCHAR(30),
+  INDEX(last_name)
+) engine=InnoDB;
+
+CREATE TABLE specialties (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  name VARCHAR(80),
+  INDEX(name)
+) engine=InnoDB;
+
+CREATE TABLE vet_specialties (
+  vet_id INT(4) UNSIGNED NOT NULL,
+  specialty_id INT(4) UNSIGNED NOT NULL
+) engine=InnoDB;
+ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets(id);
+ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties(id);
+
+CREATE TABLE types (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  name VARCHAR(80),
+  INDEX(name)
+) engine=InnoDB;
+
+CREATE TABLE owners (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  first_name VARCHAR(30),
+  last_name VARCHAR(30),
+  address VARCHAR(255),
+  city VARCHAR(80),
+  telephone VARCHAR(20),
+  INDEX(last_name)
+) engine=InnoDB;
+
+CREATE TABLE pets (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  name VARCHAR(30),
+  birth_date DATE,
+  type_id INT(4) UNSIGNED NOT NULL,
+  owner_id INT(4) UNSIGNED NOT NULL,
+  INDEX(name)
+) engine=InnoDB;
+ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners(id);
+ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types(id);
+CREATE INDEX pets_name ON pets(name);
+
+CREATE TABLE visits (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  pet_id INT(4) UNSIGNED NOT NULL,
+  visit_date DATE,
+  description VARCHAR(255),
+  INDEX(pet_id)
+) engine=InnoDB;
+ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets(id);
diff --git a/db/mysql/petclinic_db_setup_mysql.txt b/db/mysql/petclinic_db_setup_mysql.txt
new file mode 100644
index 00000000..66727e19
--- /dev/null
+++ b/db/mysql/petclinic_db_setup_mysql.txt
@@ -0,0 +1,22 @@
+================================================================================
+===        Spring PetClinic sample application - MySQL Configuration         ===
+================================================================================
+
+@author Sam Brannen
+
+--------------------------------------------------------------------------------
+
+1) Download and install the MySQL database (e.g., MySQL Community Server 5.1.x),
+   which can be found here: http://dev.mysql.com/downloads/
+
+2) Download Connector/J, the MySQL JDBC driver (e.g., Connector/J 5.1.x), which
+   can be found here: http://dev.mysql.com/downloads/connector/j/
+   Copy the Connector/J JAR file (e.g., mysql-connector-java-5.1.5-bin.jar) into
+   the db/mysql directory.
+
+3) Create the PetClinic database and user by executing the "db/mysql/createDB.txt"
+   script.
+
+4) Open "src/main/resources/jdbc.properties"; comment out all properties in the
+   "HSQL Settings" section; uncomment all properties in the "MySQL Settings"
+   section.
\ No newline at end of file
diff --git a/db/mysql/petclinic_tomcat_mysql.xml b/db/mysql/petclinic_tomcat_mysql.xml
new file mode 100644
index 00000000..d1c5a3b0
--- /dev/null
+++ b/db/mysql/petclinic_tomcat_mysql.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Context path="/petclinic" docBase="petclinic" debug="4" reloadable="true">
+  <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_petclinic_log." suffix=".txt" timestamp="true"/>
+
+  <!-- Define a database connection pool for MYSQL -->
+  <Resource name="jdbc/petclinicMYSQL" auth="Container" type="javax.sql.DataSource"/>
+  <ResourceParams name="jdbc/petclinicMYSQL">
+    <parameter>
+      <name>factory</name>
+      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+    </parameter>
+    
+    <parameter>
+      <name>driverClassName</name>
+      <value>org.gjt.mm.mysql.Driver</value>
+    </parameter>
+    <!--
+          The JDBC connection url for connecting to your MySQL dB.
+          The autoReconnect=true argument to the url makes sure that the
+          mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
+          connection.  mysqld by default closes idle connections after 8 hours.
+    -->
+    <parameter>
+      <name>url</name>
+      <value>jdbc:mysql://localhost:3306/petclinic?autoReconnect=true</value>
+    </parameter>
+    <parameter>
+      <name>username</name>
+      <value>pc</value>
+    </parameter>
+    <parameter>
+      <name>password</name>
+      <value>pc</value>
+    </parameter>
+    
+    <parameter>
+      <name>maxActive</name>
+      <value>50</value>
+    </parameter>
+    <parameter>
+      <name>maxIdle</name>
+      <value>10</value>
+    </parameter>
+    <parameter>
+      <name>maxWait</name>
+      <value>10000</value>
+    </parameter>
+    <parameter>
+      <name>removeAbandoned</name>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <name>removeAbandonedTimeout</name>
+      <value>60</value>
+    </parameter>
+    <parameter>
+      <name>logAbandoned</name>
+      <value>true</value>
+    </parameter>
+  </ResourceParams>
+
+  
+</Context>
diff --git a/db/petclinic_tomcat_all.xml b/db/petclinic_tomcat_all.xml
new file mode 100644
index 00000000..ed45c5cd
--- /dev/null
+++ b/db/petclinic_tomcat_all.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Context path="/petclinic" docBase="petclinic" debug="4" reloadable="true">
+  <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_petclinic_log." suffix=".txt" timestamp="true"/>
+
+  <!-- Define a database connection pool for HSQL -->
+  <!-- NOTE: make sure that a copy of hsqldb.jar is in the TOMCAT common/lib directory -->
+  <Resource name="jdbc/petclinicHSQL" auth="Container" type="javax.sql.DataSource"/>
+  <ResourceParams name="jdbc/petclinicHSQL">
+    <parameter>
+      <name>factory</name>
+      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+    </parameter>
+    
+    <parameter>
+      <name>driverClassName</name>
+      <value>org.hsqldb.jdbcDriver</value>
+    </parameter>
+    <parameter>
+      <name>url</name>
+      <value>jdbc:hsqldb:hsql://localhost:9001</value>
+    </parameter>
+    <parameter>
+      <name>username</name>
+      <value>sa</value>
+    </parameter>
+    
+    <parameter>
+      <name>maxActive</name>
+      <value>50</value>
+    </parameter>
+    <parameter>
+      <name>maxIdle</name>
+      <value>10</value>
+    </parameter>
+    <parameter>
+      <name>maxWait</name>
+      <value>10000</value>
+    </parameter>
+    <parameter>
+      <name>removeAbandoned</name>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <name>removeAbandonedTimeout</name>
+      <value>60</value>
+    </parameter>
+    <parameter>
+      <name>logAbandoned</name>
+      <value>true</value>
+    </parameter>
+  </ResourceParams>
+
+  <!-- Define a database connection pool for MYSQL -->
+  <Resource name="jdbc/petclinicMYSQL" auth="Container" type="javax.sql.DataSource"/>
+  <ResourceParams name="jdbc/petclinicMYSQL">
+    <parameter>
+      <name>factory</name>
+      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+    </parameter>
+    
+    <parameter>
+      <name>driverClassName</name>
+      <value>org.gjt.mm.mysql.Driver</value>
+    </parameter>
+    <!--
+          The JDBC connection url for connecting to your MySQL dB.
+          The autoReconnect=true argument to the url makes sure that the
+          mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
+          connection.  mysqld by default closes idle connections after 8 hours.
+    -->
+    <parameter>
+      <name>url</name>
+      <value>jdbc:mysql://localhost:3306/petclinic?autoReconnect=true</value>
+    </parameter>
+    <parameter>
+      <name>username</name>
+      <value>pc</value>
+    </parameter>
+    <parameter>
+      <name>password</name>
+      <value>pc</value>
+    </parameter>
+    
+    <parameter>
+      <name>maxActive</name>
+      <value>50</value>
+    </parameter>
+    <parameter>
+      <name>maxIdle</name>
+      <value>10</value>
+    </parameter>
+    <parameter>
+      <name>maxWait</name>
+      <value>10000</value>
+    </parameter>
+    <parameter>
+      <name>removeAbandoned</name>
+      <value>true</value>
+    </parameter>
+    <parameter>
+      <name>removeAbandonedTimeout</name>
+      <value>60</value>
+    </parameter>
+    <parameter>
+      <name>logAbandoned</name>
+      <value>true</value>
+    </parameter>
+  </ResourceParams>
+
+  
+</Context>
diff --git a/db/populateDB.txt b/db/populateDB.txt
new file mode 100644
index 00000000..1bf0c4a6
--- /dev/null
+++ b/db/populateDB.txt
@@ -0,0 +1,53 @@
+INSERT INTO vets VALUES (1, 'James', 'Carter');
+INSERT INTO vets VALUES (2, 'Helen', 'Leary');
+INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
+INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
+INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
+INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
+
+INSERT INTO specialties VALUES (1, 'radiology');
+INSERT INTO specialties VALUES (2, 'surgery');
+INSERT INTO specialties VALUES (3, 'dentistry');
+
+INSERT INTO vet_specialties VALUES (2, 1);
+INSERT INTO vet_specialties VALUES (3, 2);
+INSERT INTO vet_specialties VALUES (3, 3);
+INSERT INTO vet_specialties VALUES (4, 2);
+INSERT INTO vet_specialties VALUES (5, 1);
+
+INSERT INTO types VALUES (1, 'cat');
+INSERT INTO types VALUES (2, 'dog');
+INSERT INTO types VALUES (3, 'lizard');
+INSERT INTO types VALUES (4, 'snake');
+INSERT INTO types VALUES (5, 'bird');
+INSERT INTO types VALUES (6, 'hamster');
+
+INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
+INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
+INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
+INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
+INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
+INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
+INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
+INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
+INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
+INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
+
+INSERT INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1);
+INSERT INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2);
+INSERT INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3);
+INSERT INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3);
+INSERT INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4);
+INSERT INTO pets VALUES (6, 'George', '2000-01-20', 4, 5);
+INSERT INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6);
+INSERT INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6);
+INSERT INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7);
+INSERT INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8);
+INSERT INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9);
+INSERT INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10);
+INSERT INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10);
+
+INSERT INTO visits VALUES (1, 7, '1996-03-04', 'rabies shot');
+INSERT INTO visits VALUES (2, 8, '1996-03-04', 'rabies shot');
+INSERT INTO visits VALUES (3, 8, '1996-06-04', 'neutered');
+INSERT INTO visits VALUES (4, 7, '1996-09-04', 'spayed');
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..d9b79897
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.springframework.samples</groupId>
+	<artifactId>org.springframework.samples.petclinic</artifactId>
+	<name>petclinic-classic</name>
+	<packaging>war</packaging>
+	<version>1.0.0-SNAPSHOT</version>
+	<properties>
+		<spring.version>3.0.0.RC2</spring.version>
+		<slf4j.version>1.5.6</slf4j.version>
+	</properties>
+	<dependencies>
+		<dependency>
+			<groupId>com.oracle.toplink.essentials</groupId>
+			<artifactId>com.springsource.oracle.toplink.essentials</artifactId>
+			<version>2.0.0.b41-beta2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.syndication</groupId>
+			<artifactId>com.springsource.com.sun.syndication</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.persistence</groupId>
+			<artifactId>com.springsource.javax.persistence</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>com.springsource.javax.servlet</artifactId>
+			<version>2.5.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>com.springsource.javax.servlet.jsp</artifactId>
+			<version>2.1.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>com.springsource.javax.servlet.jsp.jstl</artifactId>
+			<version>1.2.0</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.xml.bind</groupId>
+			<artifactId>com.springsource.javax.xml.bind</artifactId>
+			<version>2.1.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>com.springsource.org.apache.commons.dbcp</artifactId>
+			<version>1.2.2.osgi</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.log4j</groupId>
+			<artifactId>com.springsource.org.apache.log4j</artifactId>
+			<version>1.2.15</version>
+		</dependency>		
+		<dependency>
+			<groupId>org.apache.openjpa</groupId>
+			<artifactId>com.springsource.org.apache.openjpa</artifactId>
+			<version>1.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taglibs</groupId>
+			<artifactId>com.springsource.org.apache.taglibs.standard</artifactId>
+			<version>1.1.2</version>
+		</dependency>		
+		<dependency>
+			<groupId>org.aspectj</groupId>
+			<artifactId>com.springsource.org.aspectj.weaver</artifactId>
+			<version>1.6.3.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>com.springsource.org.hibernate</artifactId>
+			<version>3.3.1.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>com.springsource.org.hibernate.ejb</artifactId>
+			<version>3.4.0.GA</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hsqldb</groupId>
+			<artifactId>com.springsource.org.hsqldb</artifactId>
+			<version>1.8.0.9</version>
+		</dependency>
+		<dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>com.springsource.org.jdom</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>org.springframework.asm</artifactId>
+			<version>${spring.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>org.springframework.orm</artifactId>
+			<version>${spring.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>org.springframework.oxm</artifactId>
+			<version>${spring.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>org.springframework.web.servlet</artifactId>
+			<version>${spring.version}</version>
+		</dependency>
+		<!-- Test dependencies -->
+		<dependency>
+			<groupId>org.junit</groupId>
+			<artifactId>com.springsource.org.junit</artifactId>
+			<version>4.5.0</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>org.springframework.test</artifactId>
+			<version>${spring.version}</version>
+            <scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.transaction</groupId>
+			<artifactId>com.springsource.javax.transaction</artifactId>
+			<version>1.1.0</version>
+            <scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>com.springsource.org.hibernate.annotations</artifactId>
+			<version>3.4.0.GA</version>
+			<scope>test</scope>
+		</dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>com.springsource.slf4j.api</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>com.springsource.slf4j.log4j</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.log4j</groupId>
+                    <artifactId>com.springsource.org.apache.log4j</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+	</dependencies>
+	<repositories>
+		<repository>
+			<id>com.springsource.repository.bundles.release</id>
+			<name>SpringSource Enterprise Bundle Repository - SpringSource Releases</name>
+			<url>http://repository.springsource.com/maven/bundles/release</url>
+		</repository>
+		<repository>
+			<id>com.springsource.repository.bundles.milestone</id>
+			<name>SpringSource Enterprise Bundle Repository - SpringSource Milestones</name>
+			<url>http://repository.springsource.com/maven/bundles/milestone</url>
+		</repository>
+		<repository>
+			<id>com.springsource.repository.bundles.external</id>
+			<name>SpringSource Enterprise Bundle Repository - External Releases</name>
+			<url>http://repository.springsource.com/maven/bundles/external</url>
+		</repository>
+		<repository>
+			<id>com.springsource.repository.bundles.snapshot</id>
+			<name>SpringSource Enterprise Bundle Repository - Snapshot Releases</name>
+			<url>http://repository.springsource.com/maven/bundles/snapshot</url>
+		</repository>
+        <repository>
+            <id>spring-release</id>
+            <name>Spring Portfolio Release Repository</name>
+            <url>http://maven.springframework.org/release</url>
+        </repository>
+        <repository>
+            <id>spring-external</id>
+            <name>Spring Portfolio External Repository</name>
+            <url>http://maven.springframework.org/external</url>
+        </repository>
+        <repository>
+            <id>spring-milestone</id>
+            <name>Spring Portfolio Milestone Repository</name>
+            <url>http://maven.springframework.org/milestone</url>
+        </repository>
+	</repositories>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>install</id>
+						<phase>install</phase>
+						<goals>
+							<goal>sources</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
index aee19b7f..ae1fb251 100644
--- a/readme.txt
+++ b/readme.txt
@@ -44,22 +44,20 @@ pooling.
 === Build and Deployment
 ==========================================================================
 
-The Spring PetClinic sample application is built using Spring Build, which
-is a custom build solution based on Ant and Ivy for dependency management.
-For deployment, the web application needs to be built with Apache Ant 1.6
-or higher. When the project is first built, Spring Build will use Ivy to
-automatically download all required dependencies. Thus the initial build
+The Spring PetClinic sample application is built using Maven.
+When the project is first built, Maven will automatically download all required
+dependencies (if these haven't been downloaded before). Thus the initial build
 may take a few minutes depending on the speed of your Internet connection,
 but subsequent builds will be much faster.
 
 Available build commands:
 
-- ant clean        --> cleans the project
-- ant clean test   --> cleans the project and runs all tests
-- ant clean jar    --> cleans the project and builds the WAR
+- mvn clean         --> cleans the project
+- mvn clean test    --> cleans the project and runs all tests
+- mvn clean package --> cleans the project and builds the WAR
 
-After building the project with "ant clean jar", you will find the
-resulting WAR file in the "target/artifacts" directory. By default, an
+After building the project with "mvn clean package", you will find the
+resulting WAR file in the "target/" directory. By default, an
 embedded HSQLDB instance in configured. No other steps are necessary to
 get the data source up and running: you can simply deploy the built WAR
 file directly to your Servlet container.
diff --git a/src/main/java/org/springframework/samples/petclinic/BaseEntity.java b/src/main/java/org/springframework/samples/petclinic/BaseEntity.java
new file mode 100644
index 00000000..bb68af4f
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/BaseEntity.java
@@ -0,0 +1,27 @@
+package org.springframework.samples.petclinic;
+
+/**
+ * Simple JavaBean domain object with an id property.
+ * Used as a base class for objects needing this property.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ */
+public class BaseEntity {
+
+	private Integer id;
+	
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public boolean isNew() {
+		return (this.id == null);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Clinic.java b/src/main/java/org/springframework/samples/petclinic/Clinic.java
new file mode 100644
index 00000000..e48e8507
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Clinic.java
@@ -0,0 +1,82 @@
+package org.springframework.samples.petclinic;
+
+import java.util.Collection;
+
+import org.springframework.dao.DataAccessException;
+
+/**
+ * The high-level PetClinic business interface.
+ *
+ * <p>This is basically a data access object.
+ * PetClinic doesn't have a dedicated business facade.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ */
+public interface Clinic {
+
+	/**
+	 * Retrieve all <code>Vet</code>s from the data store.
+	 * @return a <code>Collection</code> of <code>Vet</code>s
+	 */
+	Collection<Vet> getVets() throws DataAccessException;
+
+	/**
+	 * Retrieve all <code>PetType</code>s from the data store.
+	 * @return a <code>Collection</code> of <code>PetType</code>s
+	 */
+	Collection<PetType> getPetTypes() throws DataAccessException;
+
+	/**
+	 * Retrieve <code>Owner</code>s from the data store by last name,
+	 * returning all owners whose last name <i>starts</i> with the given name.
+	 * @param lastName Value to search for
+	 * @return a <code>Collection</code> of matching <code>Owner</code>s
+	 * (or an empty <code>Collection</code> if none found)
+	 */
+	Collection<Owner> findOwners(String lastName) throws DataAccessException;
+
+	/**
+	 * Retrieve an <code>Owner</code> from the data store by id.
+	 * @param id the id to search for
+	 * @return the <code>Owner</code> if found
+	 * @throws org.springframework.dao.DataRetrievalFailureException if not found
+	 */
+	Owner loadOwner(int id) throws DataAccessException;
+
+	/**
+	 * Retrieve a <code>Pet</code> from the data store by id.
+	 * @param id the id to search for
+	 * @return the <code>Pet</code> if found
+	 * @throws org.springframework.dao.DataRetrievalFailureException if not found
+	 */
+	Pet loadPet(int id) throws DataAccessException;
+
+	/**
+	 * Save an <code>Owner</code> to the data store, either inserting or updating it.
+	 * @param owner the <code>Owner</code> to save
+	 * @see BaseEntity#isNew
+	 */
+	void storeOwner(Owner owner) throws DataAccessException;
+
+	/**
+	 * Save a <code>Pet</code> to the data store, either inserting or updating it.
+	 * @param pet the <code>Pet</code> to save
+	 * @see BaseEntity#isNew
+	 */
+	void storePet(Pet pet) throws DataAccessException;
+
+	/**
+	 * Save a <code>Visit</code> to the data store, either inserting or updating it.
+	 * @param visit the <code>Visit</code> to save
+	 * @see BaseEntity#isNew
+	 */
+	void storeVisit(Visit visit) throws DataAccessException;
+
+	/**
+	 * Deletes a <code>Pet</code> from the data store.
+	 */
+	void deletePet(int id) throws DataAccessException;
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/NamedEntity.java
new file mode 100644
index 00000000..40c5931d
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/NamedEntity.java
@@ -0,0 +1,28 @@
+package org.springframework.samples.petclinic;
+
+/**
+ * Simple JavaBean domain object adds a name property to <code>BaseEntity</code>.
+ * Used as a base class for objects needing these properties.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ */
+public class NamedEntity extends BaseEntity {
+
+	private String name;
+	
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return this.name;
+	}
+
+	@Override
+	public String toString() {
+		return this.getName();
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Owner.java b/src/main/java/org/springframework/samples/petclinic/Owner.java
new file mode 100644
index 00000000..75ea3bc0
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Owner.java
@@ -0,0 +1,127 @@
+package org.springframework.samples.petclinic;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.beans.support.MutableSortDefinition;
+import org.springframework.beans.support.PropertyComparator;
+import org.springframework.core.style.ToStringCreator;
+
+/**
+ * Simple JavaBean domain object representing an owner.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ */
+public class Owner extends Person {
+
+	private String address;
+
+	private String city;
+
+	private String telephone;
+
+	private Set<Pet> pets;
+
+
+	public String getAddress() {
+		return this.address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public String getCity() {
+		return this.city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getTelephone() {
+		return this.telephone;
+	}
+
+	public void setTelephone(String telephone) {
+		this.telephone = telephone;
+	}
+
+	protected void setPetsInternal(Set<Pet> pets) {
+		this.pets = pets;
+	}
+
+	protected Set<Pet> getPetsInternal() {
+		if (this.pets == null) {
+			this.pets = new HashSet<Pet>();
+		}
+		return this.pets;
+	}
+
+	public List<Pet> getPets() {
+		List<Pet> sortedPets = new ArrayList<Pet>(getPetsInternal());
+		PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true));
+		return Collections.unmodifiableList(sortedPets);
+	}
+
+	public void addPet(Pet pet) {
+		getPetsInternal().add(pet);
+		pet.setOwner(this);
+	}
+
+	/**
+	 * Return the Pet with the given name, or null if none found for this Owner.
+	 *
+	 * @param name to test
+	 * @return true if pet name is already in use
+	 */
+	public Pet getPet(String name) {
+		return getPet(name, false);
+	}
+
+	/**
+	 * Return the Pet with the given name, or null if none found for this Owner.
+	 *
+	 * @param name to test
+	 * @return true if pet name is already in use
+	 */
+	public Pet getPet(String name, boolean ignoreNew) {
+		name = name.toLowerCase();
+		for (Pet pet : getPetsInternal()) {
+			if (!ignoreNew || !pet.isNew()) {
+				String compName = pet.getName();
+				compName = compName.toLowerCase();
+				if (compName.equals(name)) {
+					return pet;
+				}
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public String toString() {
+		return new ToStringCreator(this)
+
+		.append("id", this.getId())
+
+		.append("new", this.isNew())
+
+		.append("lastName", this.getLastName())
+
+		.append("firstName", this.getFirstName())
+
+		.append("address", this.address)
+
+		.append("city", this.city)
+
+		.append("telephone", this.telephone)
+
+		.toString();
+	}
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Person.java b/src/main/java/org/springframework/samples/petclinic/Person.java
new file mode 100644
index 00000000..da7974a7
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Person.java
@@ -0,0 +1,32 @@
+package org.springframework.samples.petclinic;
+
+/**
+ * Simple JavaBean domain object representing an person.
+ *
+ * @author Ken Krebs
+ */
+public class Person extends BaseEntity {
+
+	private String firstName;
+
+	private String lastName;
+
+	public String getFirstName() {
+		return this.firstName;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public String getLastName() {
+		return this.lastName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Pet.java b/src/main/java/org/springframework/samples/petclinic/Pet.java
new file mode 100644
index 00000000..f5294b5c
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Pet.java
@@ -0,0 +1,77 @@
+package org.springframework.samples.petclinic;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.beans.support.MutableSortDefinition;
+import org.springframework.beans.support.PropertyComparator;
+
+/**
+ * Simple JavaBean business object representing a pet.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ */
+public class Pet extends NamedEntity {
+
+	private Date birthDate;
+
+	private PetType type;
+
+	private Owner owner;
+
+	private Set<Visit> visits;
+
+
+	public void setBirthDate(Date birthDate) {
+		this.birthDate = birthDate;
+	}
+
+	public Date getBirthDate() {
+		return this.birthDate;
+	}
+
+	public void setType(PetType type) {
+		this.type = type;
+	}
+
+	public PetType getType() {
+		return this.type;
+	}
+
+	protected void setOwner(Owner owner) {
+		this.owner = owner;
+	}
+
+	public Owner getOwner() {
+		return this.owner;
+	}
+
+	protected void setVisitsInternal(Set<Visit> visits) {
+		this.visits = visits;
+	}
+
+	protected Set<Visit> getVisitsInternal() {
+		if (this.visits == null) {
+			this.visits = new HashSet<Visit>();
+		}
+		return this.visits;
+	}
+
+	public List<Visit> getVisits() {
+		List<Visit> sortedVisits = new ArrayList<Visit>(getVisitsInternal());
+		PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false));
+		return Collections.unmodifiableList(sortedVisits);
+	}
+
+	public void addVisit(Visit visit) {
+		getVisitsInternal().add(visit);
+		visit.setPet(this);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/PetType.java b/src/main/java/org/springframework/samples/petclinic/PetType.java
new file mode 100644
index 00000000..aaadc5c4
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/PetType.java
@@ -0,0 +1,8 @@
+package org.springframework.samples.petclinic;
+
+/**
+ * @author Juergen Hoeller
+ */
+public class PetType extends NamedEntity {
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Specialty.java b/src/main/java/org/springframework/samples/petclinic/Specialty.java
new file mode 100644
index 00000000..d19ccaba
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Specialty.java
@@ -0,0 +1,10 @@
+package org.springframework.samples.petclinic;
+
+/**
+ * Models a {@link Vet Vet's} specialty (for example, dentistry).
+ * 
+ * @author Juergen Hoeller
+ */
+public class Specialty extends NamedEntity {
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Vet.java b/src/main/java/org/springframework/samples/petclinic/Vet.java
new file mode 100644
index 00000000..9c7c8da0
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Vet.java
@@ -0,0 +1,52 @@
+package org.springframework.samples.petclinic;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.xml.bind.annotation.XmlElement;
+
+import org.springframework.beans.support.MutableSortDefinition;
+import org.springframework.beans.support.PropertyComparator;
+
+/**
+ * Simple JavaBean domain object representing a veterinarian.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ * @author Arjen Poutsma
+ */
+public class Vet extends Person {
+
+	private Set<Specialty> specialties;
+
+
+	protected void setSpecialtiesInternal(Set<Specialty> specialties) {
+		this.specialties = specialties;
+	}
+
+	protected Set<Specialty> getSpecialtiesInternal() {
+		if (this.specialties == null) {
+			this.specialties = new HashSet<Specialty>();
+		}
+		return this.specialties;
+	}
+
+	@XmlElement
+	public List<Specialty> getSpecialties() {
+		List<Specialty> sortedSpecs = new ArrayList<Specialty>(getSpecialtiesInternal());
+		PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true));
+		return Collections.unmodifiableList(sortedSpecs);
+	}
+
+	public int getNrOfSpecialties() {
+		return getSpecialtiesInternal().size();
+	}
+
+	public void addSpecialty(Specialty specialty) {
+		getSpecialtiesInternal().add(specialty);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Vets.java b/src/main/java/org/springframework/samples/petclinic/Vets.java
new file mode 100644
index 00000000..2e3b25e2
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Vets.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.samples.petclinic;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * Simple JavaBean domain object representing a list of veterinarians. Mostly here to be used for the 'vets'
+ * {@link org.springframework.web.servlet.view.xml.MarshallingView}.
+ *
+ * @author Arjen Poutsma
+ */
+@XmlRootElement
+public class Vets {
+
+	private List<Vet> vets;
+
+	@XmlElement
+	public List<Vet> getVetList() {
+		if (vets == null) {
+			vets = new ArrayList<Vet>();
+		}
+		return vets;
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/Visit.java b/src/main/java/org/springframework/samples/petclinic/Visit.java
new file mode 100644
index 00000000..c42bdcee
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/Visit.java
@@ -0,0 +1,70 @@
+package org.springframework.samples.petclinic;
+
+import java.util.Date;
+
+/**
+ * Simple JavaBean domain object representing a visit.
+ *
+ * @author Ken Krebs
+ */
+public class Visit extends BaseEntity {
+
+	/** Holds value of property date. */
+	private Date date;
+
+	/** Holds value of property description. */
+	private String description;
+
+	/** Holds value of property pet. */
+	private Pet pet;
+
+
+	/** Creates a new instance of Visit for the current date */
+	public Visit() {
+		this.date = new Date();
+	}
+
+
+	/** Getter for property date.
+	 * @return Value of property date.
+	 */
+	public Date getDate() {
+		return this.date;
+	}
+
+	/** Setter for property date.
+	 * @param date New value of property date.
+	 */
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+	/** Getter for property description.
+	 * @return Value of property description.
+	 */
+	public String getDescription() {
+		return this.description;
+	}
+
+	/** Setter for property description.
+	 * @param description New value of property description.
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	/** Getter for property pet.
+	 * @return Value of property pet.
+	 */
+	public Pet getPet() {
+		return this.pet;
+	}
+
+	/** Setter for property pet.
+	 * @param pet New value of property pet.
+	 */
+	public void setPet(Pet pet) {
+		this.pet = pet;
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/aspects/AbstractTraceAspect.java b/src/main/java/org/springframework/samples/petclinic/aspects/AbstractTraceAspect.java
new file mode 100644
index 00000000..26d32359
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/aspects/AbstractTraceAspect.java
@@ -0,0 +1,31 @@
+package org.springframework.samples.petclinic.aspects;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+
+/**
+ * Aspect to illustrate Spring-driven load-time weaving.
+ *
+ * @author Ramnivas Laddad
+ * @since 2.5
+ */
+@Aspect
+public abstract class AbstractTraceAspect {
+
+	private static final Log logger = LogFactory.getLog(AbstractTraceAspect.class);
+	
+	@Pointcut
+	public abstract void traced();
+	
+	@Before("traced()")
+	public void trace(JoinPoint.StaticPart jpsp) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("Entering " + jpsp.getSignature().toLongString());
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/aspects/CallMonitoringAspect.java b/src/main/java/org/springframework/samples/petclinic/aspects/CallMonitoringAspect.java
new file mode 100644
index 00000000..2de4cb41
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/aspects/CallMonitoringAspect.java
@@ -0,0 +1,81 @@
+package org.springframework.samples.petclinic.aspects;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+
+import org.springframework.jmx.export.annotation.ManagedAttribute;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+import org.springframework.util.StopWatch;
+
+/**
+ * Simple AspectJ aspect that monitors call count and call invocation time.
+ * Implements the CallMonitor management interface.
+ *
+ * @author Rob Harrop
+ * @author Juergen Hoeller
+ * @since 2.5
+ */
+@ManagedResource("petclinic:type=CallMonitor")
+@Aspect
+public class CallMonitoringAspect {
+
+	private boolean isEnabled = true;
+
+	private int callCount = 0;
+
+	private long accumulatedCallTime = 0;
+
+
+	@ManagedAttribute
+	public void setEnabled(boolean enabled) {
+		isEnabled = enabled;
+	}
+
+	@ManagedAttribute
+	public boolean isEnabled() {
+		return isEnabled;
+	}
+
+	@ManagedOperation
+	public void reset() {
+		this.callCount = 0;
+		this.accumulatedCallTime = 0;
+	}
+
+	@ManagedAttribute
+	public int getCallCount() {
+		return callCount;
+	}
+
+	@ManagedAttribute
+	public long getCallTime() {
+		return (this.callCount > 0 ? this.accumulatedCallTime / this.callCount : 0);
+	}
+
+
+	@Around("within(@org.springframework.stereotype.Service *)")
+	public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
+		if (this.isEnabled) {
+			StopWatch sw = new StopWatch(joinPoint.toShortString());
+
+			sw.start("invoke");
+			try {
+				return joinPoint.proceed();
+			}
+			finally {
+				sw.stop();
+				synchronized (this) {
+					this.callCount++;
+					this.accumulatedCallTime += sw.getTotalTimeMillis();
+				}
+			}
+		}
+
+		else {
+			return joinPoint.proceed();
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/aspects/UsageLogAspect.java b/src/main/java/org/springframework/samples/petclinic/aspects/UsageLogAspect.java
new file mode 100644
index 00000000..e326abfb
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/aspects/UsageLogAspect.java
@@ -0,0 +1,48 @@
+package org.springframework.samples.petclinic.aspects;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+
+/**
+ * Sample AspectJ annotation-style aspect that saves
+ * every owner name requested to the clinic.
+ *
+ * @author Rod Johnson
+ * @author Juergen Hoeller
+ * @since 2.0
+ */
+@Aspect
+public class UsageLogAspect {
+
+	private int historySize = 100;
+
+	// Of course saving all names is not suitable for
+	// production use, but this is a simple example.
+	private List<String> namesRequested = new ArrayList<String>(this.historySize);
+
+
+	public synchronized void setHistorySize(int historySize) {
+		this.historySize = historySize;
+		this.namesRequested = new ArrayList<String>(historySize);
+	}
+
+	@Before("execution(* *.findOwners(String)) && args(name)")
+	public synchronized void logNameRequest(String name) {
+		// Not the most efficient implementation,
+		// but we're aiming to illustrate the power of
+		// @AspectJ AOP, not write perfect code here :-)
+		if (this.namesRequested.size() > this.historySize) {
+			this.namesRequested.remove(0);
+		}
+		this.namesRequested.add(name);
+	}
+
+	public synchronized List<String> getNamesRequested() {
+		return Collections.unmodifiableList(this.namesRequested);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/config/DbcpDataSourceFactory.java b/src/main/java/org/springframework/samples/petclinic/config/DbcpDataSourceFactory.java
new file mode 100644
index 00000000..0454161e
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/config/DbcpDataSourceFactory.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2002-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.samples.petclinic.config;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.dbcp.BasicDataSource;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.core.io.Resource;
+
+/**
+ * A factory that creates a data source fit for use in a system environment. Creates a DBCP simple data source 
+ * from the provided connection properties.
+ *
+ * This factory returns a fully-initialized DataSource implementation. When the DataSource is returned, callers are
+ * guaranteed that the database schema and data will have been loaded by that time.
+ *
+ * Is a FactoryBean, for exposing the fully-initialized DataSource as a Spring bean. See {@link #getObject()}.
+ *
+ * @author Chris Beams
+ * @author Scott Andrews
+ */
+public class DbcpDataSourceFactory implements FactoryBean<DataSource>, DisposableBean {
+
+	// configurable properties
+
+	private String driverClassName;
+
+	private String url;
+
+	private String username;
+
+	private String password;
+
+	private boolean populate;
+
+	private Resource schemaLocation;
+
+	private Resource dataLocation;
+
+	private Resource dropLocation;
+
+	/**
+	 * The object created by this factory.
+	 */
+	private BasicDataSource dataSource;
+
+	public void setDriverClassName(String driverClassName) {
+		this.driverClassName = driverClassName;
+	}
+
+	/**
+	 * The data source connection URL
+	 */
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	/**
+	 * The data source username
+	 */
+	public void setUsername(String username) {
+		this.username = username;
+	}
+
+	/**
+	 *The data source password
+	 */
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	/**
+	 * Indicates that the data base should be populated from the schema and data locations
+	 */
+	public void setPopulate(boolean populate) {
+		this.populate = populate;
+	}
+
+	/**
+	 * Sets the location of the file containing the schema DDL to export to the database.
+	 * @param schemaLocation the location of the database schema DDL
+	 */
+	public void setSchemaLocation(Resource schemaLocation) {
+		this.schemaLocation = schemaLocation;
+	}
+
+	/**
+	 * Sets the location of the file containing the data to load into the database.
+	 * @param testDataLocation the location of the data file
+	 */
+	public void setDataLocation(Resource testDataLocation) {
+		this.dataLocation = testDataLocation;
+	}
+
+	/**
+	 * Sets the location of the file containing the drop scripts for the database.
+	 * @param testDataLocation the location of the data file
+	 */
+	public void setDropLocation(Resource testDropLocation) {
+		this.dropLocation = testDropLocation;
+	}
+
+	// implementing FactoryBean
+
+	// this method is called by Spring to expose the DataSource as a bean
+	public DataSource getObject() throws Exception {
+		if (dataSource == null) {
+			initDataSource();
+		}
+		return dataSource;
+	}
+
+	public Class<DataSource> getObjectType() {
+		return DataSource.class;
+	}
+
+	public boolean isSingleton() {
+		return true;
+	}
+
+	// implementing DisposableBean
+
+	public void destroy() throws Exception {
+		dataSource.close();
+	}
+
+	// internal helper methods
+
+	// encapsulates the steps involved in initializing the data source: creating it, and populating it
+	private void initDataSource() {
+		// create the database source first
+		this.dataSource = createDataSource();
+
+		if (this.populate) {
+			// now populate the database by loading the schema and data
+			populateDataSource();
+		}
+	}
+
+	private BasicDataSource createDataSource() {
+		BasicDataSource dataSource = new BasicDataSource();
+		dataSource.setDriverClassName(this.driverClassName);
+		dataSource.setUrl(this.url);
+		dataSource.setUsername(this.username);
+		dataSource.setPassword(this.password);
+		return dataSource;
+	}
+
+	private void populateDataSource() {
+		DatabasePopulator populator = new DatabasePopulator(dataSource);
+		if (dropLocation != null) {
+			try {
+				populator.populate(this.dropLocation);
+			} 
+			catch (Exception e) {
+			   	// ignore
+			}
+		}
+		populator.populate(this.schemaLocation);
+		populator.populate(this.dataLocation);
+	}
+
+	/**
+	 * Populates a in memory data source with data.
+	 */
+	private class DatabasePopulator {
+
+		private DataSource dataSource;
+
+		/**
+		 * Creates a new database populator.
+		 * @param dataSource the data source that will be populated.
+		 */
+		public DatabasePopulator(DataSource dataSource) {
+			this.dataSource = dataSource;
+		}
+
+		/**
+		 * Populate the database executing the statements in the provided resource against the database
+		 * @param sqlFile spring resource containing SQL to run against the db
+		 */
+		public void populate(Resource sqlFile) {
+			Connection connection = null;
+			try {
+				connection = dataSource.getConnection();
+				try {
+					String sql = parseSqlIn(sqlFile);
+					executeSql(sql, connection);
+				} catch (IOException e) {
+					throw new RuntimeException("I/O exception occurred accessing the database schema file", e);
+				} catch (SQLException e) {
+					throw new RuntimeException("SQL exception occurred exporting database schema", e);
+				}
+			} catch (SQLException e) {
+				throw new RuntimeException("SQL exception occurred acquiring connection", e);
+			} finally {
+				if (connection != null) {
+					try {
+						connection.close();
+					} catch (SQLException e) {
+					}
+				}
+			}
+		}
+
+		// utility method to read a .sql txt input stream
+		private String parseSqlIn(Resource resource) throws IOException {
+			InputStream is = null;
+			try {
+				is = resource.getInputStream();
+				BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+
+				StringWriter sw = new StringWriter();
+				BufferedWriter writer = new BufferedWriter(sw);
+
+				for (int c=reader.read(); c != -1; c=reader.read()) {
+					writer.write(c);
+				}
+				writer.flush();
+				return sw.toString();
+
+			} finally {
+				if (is != null) {
+					is.close();
+				}
+			}
+		}
+
+		// utility method to run the parsed sql
+		private void executeSql(String sql, Connection connection) throws SQLException {
+			Statement statement = connection.createStatement();
+			statement.execute(sql);
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java b/src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java
new file mode 100644
index 00000000..41163856
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java
@@ -0,0 +1,98 @@
+package org.springframework.samples.petclinic.hibernate;
+
+import java.util.Collection;
+
+import org.hibernate.SessionFactory;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.Vet;
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Hibernate implementation of the Clinic interface.
+ *
+ * <p>The mappings are defined in "petclinic.hbm.xml", located in the root of the
+ * class path.
+ *
+ * <p>Note that transactions are declared with annotations and that some methods
+ * contain "readOnly = true" which is an optimization that is particularly
+ * valuable when using Hibernate (to suppress unnecessary flush attempts for
+ * read-only operations).
+ *
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ * @author Mark Fisher
+ * @since 19.10.2003
+ */
+@Repository
+@Transactional
+public class HibernateClinic implements Clinic {
+
+	private SessionFactory sessionFactory;
+	
+	@Autowired
+	public HibernateClinic(SessionFactory sessionFactory) {
+		this.sessionFactory = sessionFactory;
+	}
+
+	@Transactional(readOnly = true)
+	@SuppressWarnings("unchecked")
+	public Collection<Vet> getVets() {
+		return sessionFactory.getCurrentSession().createQuery("from Vet vet order by vet.lastName, vet.firstName").list();
+	}
+
+	@Transactional(readOnly = true)
+	@SuppressWarnings("unchecked")
+	public Collection<PetType> getPetTypes() {
+		return sessionFactory.getCurrentSession().createQuery("from PetType type order by type.name").list();
+	}
+
+	@Transactional(readOnly = true)
+	@SuppressWarnings("unchecked")
+	public Collection<Owner> findOwners(String lastName) {
+		return sessionFactory.getCurrentSession().createQuery("from Owner owner where owner.lastName like :lastName")
+				.setString("lastName", lastName + "%").list();
+	}
+
+	@Transactional(readOnly = true)
+	public Owner loadOwner(int id) {
+		return (Owner) sessionFactory.getCurrentSession().load(Owner.class, id);
+	}
+
+	@Transactional(readOnly = true)
+	public Pet loadPet(int id) {
+		return (Pet) sessionFactory.getCurrentSession().load(Pet.class, id);
+	}
+
+	public void storeOwner(Owner owner) {
+		// Note: Hibernate3's merge operation does not reassociate the object
+		// with the current Hibernate Session. Instead, it will always copy the
+		// state over to a registered representation of the entity. In case of a
+		// new entity, it will register a copy as well, but will not update the
+		// id of the passed-in object. To still update the ids of the original
+		// objects too, we need to register Spring's
+		// IdTransferringMergeEventListener on our SessionFactory.
+		sessionFactory.getCurrentSession().merge(owner);
+	}
+
+	public void storePet(Pet pet) {
+		sessionFactory.getCurrentSession().merge(pet);
+	}
+
+	public void storeVisit(Visit visit) {
+		sessionFactory.getCurrentSession().merge(visit);
+	}
+
+	public void deletePet(int id) throws DataAccessException {
+		Pet pet = loadPet(id);
+		sessionFactory.getCurrentSession().delete(pet);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java b/src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java
new file mode 100644
index 00000000..e39ebac4
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java
@@ -0,0 +1,9 @@
+
+/**
+ *
+ * The classes in this package represent the Hibernate implementation
+ * of PetClinic's persistence layer.
+ *
+ */
+package org.springframework.samples.petclinic.hibernate;
+
diff --git a/src/main/java/org/springframework/samples/petclinic/jdbc/JdbcPet.java b/src/main/java/org/springframework/samples/petclinic/jdbc/JdbcPet.java
new file mode 100644
index 00000000..963ffdfe
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/jdbc/JdbcPet.java
@@ -0,0 +1,35 @@
+package org.springframework.samples.petclinic.jdbc;
+
+import org.springframework.samples.petclinic.Pet;
+
+/**
+ * Subclass of Pet that carries temporary id properties which
+ * are only relevant for a JDBC implmentation of the Clinic.
+ *
+ * @author Juergen Hoeller
+ * @see SimpleJdbcClinic
+ */
+class JdbcPet extends Pet {
+
+	private int typeId;
+
+	private int ownerId;
+
+
+	public void setTypeId(int typeId) {
+		this.typeId = typeId;
+	}
+
+	public int getTypeId() {
+		return this.typeId;
+	}
+
+	public void setOwnerId(int ownerId) {
+		this.ownerId = ownerId;
+	}
+
+	public int getOwnerId() {
+		return this.ownerId;
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java b/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java
new file mode 100644
index 00000000..587acecb
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java
@@ -0,0 +1,342 @@
+package org.springframework.samples.petclinic.jdbc;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper;
+import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
+import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
+import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
+import org.springframework.jmx.export.annotation.ManagedOperation;
+import org.springframework.jmx.export.annotation.ManagedResource;
+import org.springframework.orm.ObjectRetrievalFailureException;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.Specialty;
+import org.springframework.samples.petclinic.Vet;
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.samples.petclinic.util.EntityUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * A simple JDBC-based implementation of the {@link Clinic} interface.
+ *
+ * <p>This class uses Java 5 language features and the {@link SimpleJdbcTemplate}
+ * plus {@link SimpleJdbcInsert}. It also takes advantage of classes like
+ * {@link BeanPropertySqlParameterSource} and
+ * {@link ParameterizedBeanPropertyRowMapper} which provide automatic mapping
+ * between JavaBean properties and JDBC parameters or query results.
+ *
+ * <p>SimpleJdbcClinic is a rewrite of the AbstractJdbcClinic which was the base
+ * class for JDBC implementations of the Clinic interface for Spring 2.0.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ * @author Rob Harrop
+ * @author Sam Brannen
+ * @author Thomas Risberg
+ * @author Mark Fisher
+ */
+@Service
+@ManagedResource("petclinic:type=Clinic")
+public class SimpleJdbcClinic implements Clinic, SimpleJdbcClinicMBean {
+
+	private final Log logger = LogFactory.getLog(getClass());
+
+	private SimpleJdbcTemplate simpleJdbcTemplate;
+
+	private SimpleJdbcInsert insertOwner;
+	private SimpleJdbcInsert insertPet;
+	private SimpleJdbcInsert insertVisit;
+
+	private final List<Vet> vets = new ArrayList<Vet>();
+
+
+	@Autowired
+	public void init(DataSource dataSource) {
+		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
+
+		this.insertOwner = new SimpleJdbcInsert(dataSource)
+			.withTableName("owners")
+			.usingGeneratedKeyColumns("id");
+		this.insertPet = new SimpleJdbcInsert(dataSource)
+			.withTableName("pets")
+			.usingGeneratedKeyColumns("id");
+		this.insertVisit = new SimpleJdbcInsert(dataSource)
+			.withTableName("visits")
+			.usingGeneratedKeyColumns("id");
+	}
+
+
+	/**
+	 * Refresh the cache of Vets that the Clinic is holding.
+	 * @see org.springframework.samples.petclinic.Clinic#getVets()
+	 */
+	@ManagedOperation
+	@Transactional(readOnly = true)
+	public void refreshVetsCache() throws DataAccessException {
+		synchronized (this.vets) {
+			this.logger.info("Refreshing vets cache");
+
+			// Retrieve the list of all vets.
+			this.vets.clear();
+			this.vets.addAll(this.simpleJdbcTemplate.query(
+					"SELECT id, first_name, last_name FROM vets ORDER BY last_name,first_name",
+					ParameterizedBeanPropertyRowMapper.newInstance(Vet.class)));
+
+			// Retrieve the list of all possible specialties.
+			final List<Specialty> specialties = this.simpleJdbcTemplate.query(
+					"SELECT id, name FROM specialties",
+					ParameterizedBeanPropertyRowMapper.newInstance(Specialty.class));
+
+			// Build each vet's list of specialties.
+			for (Vet vet : this.vets) {
+				final List<Integer> vetSpecialtiesIds = this.simpleJdbcTemplate.query(
+						"SELECT specialty_id FROM vet_specialties WHERE vet_id=?",
+						new ParameterizedRowMapper<Integer>() {
+							public Integer mapRow(ResultSet rs, int row) throws SQLException {
+								return Integer.valueOf(rs.getInt(1));
+							}},
+						vet.getId().intValue());
+				for (int specialtyId : vetSpecialtiesIds) {
+					Specialty specialty = EntityUtils.getById(specialties, Specialty.class, specialtyId);
+					vet.addSpecialty(specialty);
+				}
+			}
+		}
+	}
+
+
+	// START of Clinic implementation section *******************************
+
+	@Transactional(readOnly = true)
+	public Collection<Vet> getVets() throws DataAccessException {
+		synchronized (this.vets) {
+			if (this.vets.isEmpty()) {
+				refreshVetsCache();
+			}
+			return this.vets;
+		}
+	}
+
+	@Transactional(readOnly = true)
+	public Collection<PetType> getPetTypes() throws DataAccessException {
+		return this.simpleJdbcTemplate.query(
+				"SELECT id, name FROM types ORDER BY name",
+				ParameterizedBeanPropertyRowMapper.newInstance(PetType.class));
+	}
+
+	/**
+	 * Loads {@link Owner Owners} from the data store by last name, returning
+	 * all owners whose last name <i>starts</i> with the given name; also loads
+	 * the {@link Pet Pets} and {@link Visit Visits} for the corresponding
+	 * owners, if not already loaded.
+	 */
+	@Transactional(readOnly = true)
+	public Collection<Owner> findOwners(String lastName) throws DataAccessException {
+		List<Owner> owners = this.simpleJdbcTemplate.query(
+				"SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE last_name like ?",
+				ParameterizedBeanPropertyRowMapper.newInstance(Owner.class),
+				lastName + "%");
+		loadOwnersPetsAndVisits(owners);
+		return owners;
+	}
+
+	/**
+	 * Loads the {@link Owner} with the supplied <code>id</code>; also loads
+	 * the {@link Pet Pets} and {@link Visit Visits} for the corresponding
+	 * owner, if not already loaded.
+	 */
+	@Transactional(readOnly = true)
+	public Owner loadOwner(int id) throws DataAccessException {
+		Owner owner;
+		try {
+			owner = this.simpleJdbcTemplate.queryForObject(
+					"SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE id=?",
+					ParameterizedBeanPropertyRowMapper.newInstance(Owner.class),
+					id);
+		}
+		catch (EmptyResultDataAccessException ex) {
+			throw new ObjectRetrievalFailureException(Owner.class, new Integer(id));
+		}
+		loadPetsAndVisits(owner);
+		return owner;
+	}
+
+	@Transactional(readOnly = true)
+	public Pet loadPet(int id) throws DataAccessException {
+		JdbcPet pet;
+		try {
+			pet = this.simpleJdbcTemplate.queryForObject(
+					"SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE id=?",
+					new JdbcPetRowMapper(),
+					id);
+		}
+		catch (EmptyResultDataAccessException ex) {
+			throw new ObjectRetrievalFailureException(Pet.class, new Integer(id));
+		}
+		Owner owner = loadOwner(pet.getOwnerId());
+		owner.addPet(pet);
+		pet.setType(EntityUtils.getById(getPetTypes(), PetType.class, pet.getTypeId()));
+		loadVisits(pet);
+		return pet;
+	}
+
+	@Transactional
+	public void storeOwner(Owner owner) throws DataAccessException {
+		if (owner.isNew()) {
+			Number newKey = this.insertOwner.executeAndReturnKey(
+					new BeanPropertySqlParameterSource(owner));
+			owner.setId(newKey.intValue());
+		}
+		else {
+			this.simpleJdbcTemplate.update(
+					"UPDATE owners SET first_name=:firstName, last_name=:lastName, address=:address, " +
+					"city=:city, telephone=:telephone WHERE id=:id",
+					new BeanPropertySqlParameterSource(owner));
+		}
+	}
+
+	@Transactional
+	public void storePet(Pet pet) throws DataAccessException {
+		if (pet.isNew()) {
+			Number newKey = this.insertPet.executeAndReturnKey(
+					createPetParameterSource(pet));
+			pet.setId(newKey.intValue());
+		}
+		else {
+			this.simpleJdbcTemplate.update(
+					"UPDATE pets SET name=:name, birth_date=:birth_date, type_id=:type_id, " +
+					"owner_id=:owner_id WHERE id=:id",
+					createPetParameterSource(pet));
+		}
+	}
+
+	@Transactional
+	public void storeVisit(Visit visit) throws DataAccessException {
+		if (visit.isNew()) {
+			Number newKey = this.insertVisit.executeAndReturnKey(
+					createVisitParameterSource(visit));
+			visit.setId(newKey.intValue());
+		}
+		else {
+			throw new UnsupportedOperationException("Visit update not supported");
+		}
+	}
+
+	public void deletePet(int id) throws DataAccessException {
+		this.simpleJdbcTemplate.update("DELETE FROM pets WHERE id=?", id);
+	}
+
+	// END of Clinic implementation section ************************************
+
+
+	/**
+	 * Creates a {@link MapSqlParameterSource} based on data values from the
+	 * supplied {@link Pet} instance.
+	 */
+	private MapSqlParameterSource createPetParameterSource(Pet pet) {
+		return new MapSqlParameterSource()
+			.addValue("id", pet.getId())
+			.addValue("name", pet.getName())
+			.addValue("birth_date", pet.getBirthDate())
+			.addValue("type_id", pet.getType().getId())
+			.addValue("owner_id", pet.getOwner().getId());
+	}
+
+	/**
+	 * Creates a {@link MapSqlParameterSource} based on data values from the
+	 * supplied {@link Visit} instance.
+	 */
+	private MapSqlParameterSource createVisitParameterSource(Visit visit) {
+		return new MapSqlParameterSource()
+			.addValue("id", visit.getId())
+			.addValue("visit_date", visit.getDate())
+			.addValue("description", visit.getDescription())
+			.addValue("pet_id", visit.getPet().getId());
+	}
+
+	/**
+	 * Loads the {@link Visit} data for the supplied {@link Pet}.
+	 */
+	private void loadVisits(JdbcPet pet) {
+		final List<Visit> visits = this.simpleJdbcTemplate.query(
+				"SELECT id, visit_date, description FROM visits WHERE pet_id=?",
+				new ParameterizedRowMapper<Visit>() {
+					public Visit mapRow(ResultSet rs, int row) throws SQLException {
+						Visit visit = new Visit();
+						visit.setId(rs.getInt("id"));
+						visit.setDate(rs.getTimestamp("visit_date"));
+						visit.setDescription(rs.getString("description"));
+						return visit;
+					}
+				},
+				pet.getId().intValue());
+		for (Visit visit : visits) {
+			pet.addVisit(visit);
+		}
+	}
+
+	/**
+	 * Loads the {@link Pet} and {@link Visit} data for the supplied
+	 * {@link Owner}.
+	 */
+	private void loadPetsAndVisits(final Owner owner) {
+		final List<JdbcPet> pets = this.simpleJdbcTemplate.query(
+				"SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE owner_id=?",
+				new JdbcPetRowMapper(),
+				owner.getId().intValue());
+		for (JdbcPet pet : pets) {
+			owner.addPet(pet);
+			pet.setType(EntityUtils.getById(getPetTypes(), PetType.class, pet.getTypeId()));
+			loadVisits(pet);
+		}
+	}
+
+	/**
+	 * Loads the {@link Pet} and {@link Visit} data for the supplied
+	 * {@link List} of {@link Owner Owners}.
+	 *
+	 * @param owners the list of owners for whom the pet and visit data should be loaded
+	 * @see #loadPetsAndVisits(Owner)
+	 */
+	private void loadOwnersPetsAndVisits(List<Owner> owners) {
+		for (Owner owner : owners) {
+			loadPetsAndVisits(owner);
+		}
+	}
+
+	/**
+	 * {@link ParameterizedRowMapper} implementation mapping data from a
+	 * {@link ResultSet} to the corresponding properties of the {@link JdbcPet} class.
+	 */
+	private class JdbcPetRowMapper implements ParameterizedRowMapper<JdbcPet> {
+
+		public JdbcPet mapRow(ResultSet rs, int rownum) throws SQLException {
+			JdbcPet pet = new JdbcPet();
+			pet.setId(rs.getInt("id"));
+			pet.setName(rs.getString("name"));
+			pet.setBirthDate(rs.getDate("birth_date"));
+			pet.setTypeId(rs.getInt("type_id"));
+			pet.setOwnerId(rs.getInt("owner_id"));
+			return pet;
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicMBean.java b/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicMBean.java
new file mode 100644
index 00000000..c9a7a784
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicMBean.java
@@ -0,0 +1,20 @@
+package org.springframework.samples.petclinic.jdbc;
+
+/**
+ * Interface that defines a cache refresh operation.
+ * To be exposed for management via JMX.
+ * 
+ * @author Rob Harrop
+ * @author Juergen Hoeller
+ * @see SimpleJdbcClinic
+ */
+public interface SimpleJdbcClinicMBean {
+
+	/**
+	 * Refresh the cache of Vets that the Clinic is holding.
+	 * @see org.springframework.samples.petclinic.Clinic#getVets()
+	 * @see SimpleJdbcClinic#refreshVetsCache()
+	 */
+	void refreshVetsCache();
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/jdbc/package-info.java b/src/main/java/org/springframework/samples/petclinic/jdbc/package-info.java
new file mode 100644
index 00000000..6ec278b4
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/jdbc/package-info.java
@@ -0,0 +1,9 @@
+
+/**
+ *
+ * The classes in this package represent the JDBC implementation
+ * of PetClinic's persistence layer.
+ *
+ */
+package org.springframework.samples.petclinic.jdbc;
+
diff --git a/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java b/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java
new file mode 100644
index 00000000..92fe1e24
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java
@@ -0,0 +1,96 @@
+package org.springframework.samples.petclinic.jpa;
+
+import java.util.Collection;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.Vet;
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.dao.DataAccessException;
+
+/**
+ * JPA implementation of the Clinic interface using EntityManager.
+ *
+ * <p>The mappings are defined in "orm.xml" located in the META-INF directory.
+ *
+ * @author Mike Keith
+ * @author Rod Johnson
+ * @author Sam Brannen
+ * @since 22.4.2006
+ */
+@Repository
+@Transactional
+public class EntityManagerClinic implements Clinic {
+
+	@PersistenceContext
+	private EntityManager em;
+
+
+	@Transactional(readOnly = true)
+	@SuppressWarnings("unchecked")
+	public Collection<Vet> getVets() {
+		return this.em.createQuery("SELECT vet FROM Vet vet ORDER BY vet.lastName, vet.firstName").getResultList();
+	}
+
+	@Transactional(readOnly = true)
+	@SuppressWarnings("unchecked")
+	public Collection<PetType> getPetTypes() {
+		return this.em.createQuery("SELECT ptype FROM PetType ptype ORDER BY ptype.name").getResultList();
+	}
+
+	@Transactional(readOnly = true)
+	@SuppressWarnings("unchecked")
+	public Collection<Owner> findOwners(String lastName) {
+		Query query = this.em.createQuery("SELECT owner FROM Owner owner WHERE owner.lastName LIKE :lastName");
+		query.setParameter("lastName", lastName + "%");
+		return query.getResultList();
+	}
+
+	@Transactional(readOnly = true)
+	public Owner loadOwner(int id) {
+		return this.em.find(Owner.class, id);
+	}
+
+	@Transactional(readOnly = true)
+	public Pet loadPet(int id) {
+		return this.em.find(Pet.class, id);
+	}
+
+	public void storeOwner(Owner owner) {
+		// Consider returning the persistent object here, for exposing
+		// a newly assigned id using any persistence provider...
+		Owner merged = this.em.merge(owner);
+		this.em.flush();
+		owner.setId(merged.getId());
+	}
+
+	public void storePet(Pet pet) {
+		// Consider returning the persistent object here, for exposing
+		// a newly assigned id using any persistence provider...
+		Pet merged = this.em.merge(pet);
+		this.em.flush();
+		pet.setId(merged.getId());
+	}
+
+	public void storeVisit(Visit visit) {
+		// Consider returning the persistent object here, for exposing
+		// a newly assigned id using any persistence provider...
+		Visit merged = this.em.merge(visit);
+		this.em.flush();
+		visit.setId(merged.getId());
+	}
+
+	public void deletePet(int id) throws DataAccessException {
+		Pet pet = loadPet(id);
+		this.em.remove(pet);
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/jpa/package-info.java b/src/main/java/org/springframework/samples/petclinic/jpa/package-info.java
new file mode 100644
index 00000000..8093784e
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/jpa/package-info.java
@@ -0,0 +1,9 @@
+
+/**
+ *
+ * The classes in this package represent the JPA implementation
+ * of PetClinic's persistence layer.
+ *
+ */
+package org.springframework.samples.petclinic.jpa;
+
diff --git a/src/main/java/org/springframework/samples/petclinic/package-info.java b/src/main/java/org/springframework/samples/petclinic/package-info.java
new file mode 100644
index 00000000..f2cc3691
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/package-info.java
@@ -0,0 +1,8 @@
+
+/**
+ *
+ * The classes in this package represent PetClinic's business layer.
+ *
+ */
+package org.springframework.samples.petclinic;
+
diff --git a/src/main/java/org/springframework/samples/petclinic/toplink/EssentialsHSQLPlatformWithNativeSequence.java b/src/main/java/org/springframework/samples/petclinic/toplink/EssentialsHSQLPlatformWithNativeSequence.java
new file mode 100644
index 00000000..1086591d
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/toplink/EssentialsHSQLPlatformWithNativeSequence.java
@@ -0,0 +1,56 @@
+package org.springframework.samples.petclinic.toplink;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import oracle.toplink.essentials.exceptions.ValidationException;
+import oracle.toplink.essentials.platform.database.HSQLPlatform;
+import oracle.toplink.essentials.queryframework.ValueReadQuery;
+
+/**
+ * Subclass of the TopLink Essentials default HSQLPlatform class, using native
+ * HSQLDB identity columns for id generation.
+ *
+ * <p>Necessary for PetClinic's default data model, which relies on identity
+ * columns: this is uniformly used across all persistence layer implementations
+ * (JDBC, Hibernate, and JPA).
+ *
+ * @author Juergen Hoeller
+ * @author <a href="mailto:james.x.clark@oracle.com">James Clark</a>
+ * @since 1.2
+ */
+public class EssentialsHSQLPlatformWithNativeSequence extends HSQLPlatform {
+
+	private static final long serialVersionUID = -55658009691346735L;
+
+
+	public EssentialsHSQLPlatformWithNativeSequence() {
+		// setUsesNativeSequencing(true);
+	}
+
+	@Override
+	public boolean supportsNativeSequenceNumbers() {
+		return true;
+	}
+
+	@Override
+	public boolean shouldNativeSequenceAcquireValueAfterInsert() {
+		return true;
+	}
+
+	@Override
+	public ValueReadQuery buildSelectQueryForNativeSequence() {
+		return new ValueReadQuery("CALL IDENTITY()");
+	}
+
+	@Override
+	public void printFieldIdentityClause(Writer writer) throws ValidationException {
+		try {
+			writer.write(" IDENTITY");
+		}
+		catch (IOException ex) {
+			throw ValidationException.fileError(ex);
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/toplink/package-info.java b/src/main/java/org/springframework/samples/petclinic/toplink/package-info.java
new file mode 100644
index 00000000..3bcc9add
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/toplink/package-info.java
@@ -0,0 +1,10 @@
+
+/**
+ *
+ * The classes in this package provide support for using the TopLink
+ * implementation with PetClinic's EntityManagerClinic.
+ * 
+ *
+ */
+package org.springframework.samples.petclinic.toplink;
+
diff --git a/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java b/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java
new file mode 100644
index 00000000..16df5fa9
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java
@@ -0,0 +1,41 @@
+
+package org.springframework.samples.petclinic.util;
+
+import java.util.Collection;
+
+import org.springframework.orm.ObjectRetrievalFailureException;
+import org.springframework.samples.petclinic.BaseEntity;
+
+/**
+ * Utility methods for handling entities. Separate from the BaseEntity class
+ * mainly because of dependency on the ORM-associated
+ * ObjectRetrievalFailureException.
+ *
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ * @since 29.10.2003
+ * @see org.springframework.samples.petclinic.BaseEntity
+ */
+public abstract class EntityUtils {
+
+	/**
+	 * Look up the entity of the given class with the given id in the given
+	 * collection.
+	 *
+	 * @param entities the collection to search
+	 * @param entityClass the entity class to look up
+	 * @param entityId the entity id to look up
+	 * @return the found entity
+	 * @throws ObjectRetrievalFailureException if the entity was not found
+	 */
+	public static <T extends BaseEntity> T getById(Collection<T> entities, Class<T> entityClass, int entityId)
+			throws ObjectRetrievalFailureException {
+		for (T entity : entities) {
+			if (entity.getId().intValue() == entityId && entityClass.isInstance(entity)) {
+				return entity;
+			}
+		}
+		throw new ObjectRetrievalFailureException(entityClass, new Integer(entityId));
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/validation/OwnerValidator.java b/src/main/java/org/springframework/samples/petclinic/validation/OwnerValidator.java
new file mode 100644
index 00000000..04b6b7d5
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/validation/OwnerValidator.java
@@ -0,0 +1,43 @@
+package org.springframework.samples.petclinic.validation;
+
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.Errors;
+
+/**
+ * <code>Validator</code> for <code>Owner</code> forms.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ */
+public class OwnerValidator {
+
+	public void validate(Owner owner, Errors errors) {
+		if (!StringUtils.hasLength(owner.getFirstName())) {
+			errors.rejectValue("firstName", "required", "required");
+		}
+		if (!StringUtils.hasLength(owner.getLastName())) {
+			errors.rejectValue("lastName", "required", "required");
+		}
+		if (!StringUtils.hasLength(owner.getAddress())) {
+			errors.rejectValue("address", "required", "required");
+		}
+		if (!StringUtils.hasLength(owner.getCity())) {
+			errors.rejectValue("city", "required", "required");
+		}
+
+		String telephone = owner.getTelephone();
+		if (!StringUtils.hasLength(telephone)) {
+			errors.rejectValue("telephone", "required", "required");
+		}
+		else {
+			for (int i = 0; i < telephone.length(); ++i) {
+				if ((Character.isDigit(telephone.charAt(i))) == false) {
+					errors.rejectValue("telephone", "nonNumeric", "non-numeric");
+					break;
+				}
+			}
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/validation/PetValidator.java b/src/main/java/org/springframework/samples/petclinic/validation/PetValidator.java
new file mode 100644
index 00000000..8ad6eb0a
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/validation/PetValidator.java
@@ -0,0 +1,25 @@
+package org.springframework.samples.petclinic.validation;
+
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.Errors;
+
+/**
+ * <code>Validator</code> for <code>Pet</code> forms.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ */
+public class PetValidator {
+
+	public void validate(Pet pet, Errors errors) {
+		String name = pet.getName();
+		if (!StringUtils.hasLength(name)) {
+			errors.rejectValue("name", "required", "required");
+		}
+		else if (pet.isNew() && pet.getOwner().getPet(name, true) != null) {
+			errors.rejectValue("name", "duplicate", "already exists");
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/validation/VisitValidator.java b/src/main/java/org/springframework/samples/petclinic/validation/VisitValidator.java
new file mode 100644
index 00000000..35c80baf
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/validation/VisitValidator.java
@@ -0,0 +1,21 @@
+package org.springframework.samples.petclinic.validation;
+
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.Errors;
+
+/**
+ * <code>Validator</code> for <code>Visit</code> forms.
+ *
+ * @author Ken Krebs
+ * @author Juergen Hoeller
+ */
+public class VisitValidator {
+
+	public void validate(Visit visit, Errors errors) {
+		if (!StringUtils.hasLength(visit.getDescription())) {
+			errors.rejectValue("description", "required", "required");
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/validation/package-info.java b/src/main/java/org/springframework/samples/petclinic/validation/package-info.java
new file mode 100644
index 00000000..7db2ee52
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/validation/package-info.java
@@ -0,0 +1,9 @@
+
+/**
+ *
+ * The classes in this package represent the set of Validator objects 
+ * the Business Layer makes available to the Presentation Layer.
+ *
+ */
+package org.springframework.samples.petclinic.validation;
+
diff --git a/src/main/java/org/springframework/samples/petclinic/web/AddOwnerForm.java b/src/main/java/org/springframework/samples/petclinic/web/AddOwnerForm.java
new file mode 100644
index 00000000..cd830aff
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/AddOwnerForm.java
@@ -0,0 +1,65 @@
+
+package org.springframework.samples.petclinic.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.validation.OwnerValidator;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.support.SessionStatus;
+
+/**
+ * JavaBean form controller that is used to add a new <code>Owner</code> to the
+ * system.
+ * 
+ * @author Juergen Hoeller
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+@RequestMapping("/owners/new")
+@SessionAttributes(types = Owner.class)
+public class AddOwnerForm {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public AddOwnerForm(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@InitBinder
+	public void setAllowedFields(WebDataBinder dataBinder) {
+		dataBinder.setDisallowedFields("id");
+	}
+
+	@RequestMapping(method = RequestMethod.GET)
+	public String setupForm(Model model) {
+		Owner owner = new Owner();
+		model.addAttribute(owner);
+		return "owners/form";
+	}
+
+	@RequestMapping(method = RequestMethod.POST)
+	public String processSubmit(@ModelAttribute Owner owner, BindingResult result, SessionStatus status) {
+		new OwnerValidator().validate(owner, result);
+		if (result.hasErrors()) {
+			return "owners/form";
+		}
+		else {
+			this.clinic.storeOwner(owner);
+			status.setComplete();
+			return "redirect:/owners/" + owner.getId();
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/AddPetForm.java b/src/main/java/org/springframework/samples/petclinic/web/AddPetForm.java
new file mode 100644
index 00000000..586cf3d6
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/AddPetForm.java
@@ -0,0 +1,77 @@
+
+package org.springframework.samples.petclinic.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.validation.PetValidator;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.support.SessionStatus;
+
+/**
+ * JavaBean form controller that is used to add a new <code>Pet</code> to the
+ * system.
+ * 
+ * @author Juergen Hoeller
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+@RequestMapping("/owners/{ownerId}/pets/new")
+@SessionAttributes("pet")
+public class AddPetForm {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public AddPetForm(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@ModelAttribute("types")
+	public Collection<PetType> populatePetTypes() {
+		return this.clinic.getPetTypes();
+	}
+
+	@InitBinder
+	public void setAllowedFields(WebDataBinder dataBinder) {
+		dataBinder.setDisallowedFields("id");
+	}
+
+	@RequestMapping(method = RequestMethod.GET)
+	public String setupForm(@PathVariable("ownerId") int ownerId, Model model) {
+		Owner owner = this.clinic.loadOwner(ownerId);
+		Pet pet = new Pet();
+		owner.addPet(pet);
+		model.addAttribute("pet", pet);
+		return "pets/form";
+	}
+
+	@RequestMapping(method = RequestMethod.POST)
+	public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
+		new PetValidator().validate(pet, result);
+		if (result.hasErrors()) {
+			return "pets/form";
+		}
+		else {
+			this.clinic.storePet(pet);
+			status.setComplete();
+			return "redirect:/owners/" + pet.getOwner().getId();
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/AddVisitForm.java b/src/main/java/org/springframework/samples/petclinic/web/AddVisitForm.java
new file mode 100644
index 00000000..68368644
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/AddVisitForm.java
@@ -0,0 +1,69 @@
+
+package org.springframework.samples.petclinic.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.samples.petclinic.validation.VisitValidator;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.support.SessionStatus;
+
+/**
+ * JavaBean form controller that is used to add a new <code>Visit</code> to the
+ * system.
+ * 
+ * @author Juergen Hoeller
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+@RequestMapping("/owners/*/pets/{petId}/visits/new")
+@SessionAttributes("visit")
+public class AddVisitForm {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public AddVisitForm(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@InitBinder
+	public void setAllowedFields(WebDataBinder dataBinder) {
+		dataBinder.setDisallowedFields("id");
+	}
+
+	@RequestMapping(method = RequestMethod.GET)
+	public String setupForm(@PathVariable("petId") int petId, Model model) {
+		Pet pet = this.clinic.loadPet(petId);
+		Visit visit = new Visit();
+		pet.addVisit(visit);
+		model.addAttribute("visit", visit);
+		return "pets/visitForm";
+	}
+
+	@RequestMapping(method = RequestMethod.POST)
+	public String processSubmit(@ModelAttribute("visit") Visit visit, BindingResult result, SessionStatus status) {
+		new VisitValidator().validate(visit, result);
+		if (result.hasErrors()) {
+			return "pets/visitForm";
+		}
+		else {
+			this.clinic.storeVisit(visit);
+			status.setComplete();
+			return "redirect:/owners/" + visit.getPet().getOwner().getId();
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/ClinicBindingInitializer.java b/src/main/java/org/springframework/samples/petclinic/web/ClinicBindingInitializer.java
new file mode 100644
index 00000000..2d2a8bdc
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/ClinicBindingInitializer.java
@@ -0,0 +1,37 @@
+package org.springframework.samples.petclinic.web;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.CustomDateEditor;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.support.WebBindingInitializer;
+import org.springframework.web.context.request.WebRequest;
+
+/**
+ * Shared WebBindingInitializer for PetClinic's custom editors.
+ *
+ * <p>Alternatively, such init-binder code may be put into
+ * {@link org.springframework.web.bind.annotation.InitBinder}
+ * annotated methods on the controller classes themselves.
+ *
+ * @author Juergen Hoeller
+ */
+public class ClinicBindingInitializer implements WebBindingInitializer {
+
+	@Autowired
+	private Clinic clinic;
+
+	public void initBinder(WebDataBinder binder, WebRequest request) {
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+		dateFormat.setLenient(false);
+		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
+		binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
+		binder.registerCustomEditor(PetType.class, new PetTypeEditor(this.clinic));
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java b/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java
new file mode 100644
index 00000000..e93ae8f6
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java
@@ -0,0 +1,89 @@
+
+package org.springframework.samples.petclinic.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Vets;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+/**
+ * Annotation-driven <em>MultiActionController</em> that handles all non-form
+ * URL's.
+ *
+ * @author Juergen Hoeller
+ * @author Mark Fisher
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+public class ClinicController {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public ClinicController(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	/**
+	 * Custom handler for the welcome view.
+	 * <p>
+	 * Note that this handler relies on the RequestToViewNameTranslator to
+	 * determine the logical view name based on the request URL: "/welcome.do"
+	 * -&gt; "welcome".
+	 */
+	@RequestMapping("/")
+	public String welcomeHandler() {
+		return "welcome";
+	}
+
+	/**
+	 * Custom handler for displaying vets.
+	 *
+	 * <p>Note that this handler returns a plain {@link ModelMap} object instead of
+	 * a ModelAndView, thus leveraging convention-based model attribute names.
+	 * It relies on the RequestToViewNameTranslator to determine the logical
+	 * view name based on the request URL: "/vets.do" -&gt; "vets".
+	 *
+	 * @return a ModelMap with the model attributes for the view
+	 */
+	@RequestMapping("/vets")
+	public ModelMap vetsHandler() {
+		Vets vets = new Vets();
+		vets.getVetList().addAll(this.clinic.getVets());
+		return new ModelMap(vets);
+	}
+
+	/**
+	 * Custom handler for displaying an owner.
+	 *
+	 * @param ownerId the ID of the owner to display
+	 * @return a ModelMap with the model attributes for the view
+	 */
+	@RequestMapping("/owners/{ownerId}")
+	public ModelAndView ownerHandler(@PathVariable("ownerId") int ownerId) {
+		ModelAndView mav = new ModelAndView("owners/show");
+		mav.addObject(this.clinic.loadOwner(ownerId));
+		return mav;
+	}
+
+	/**
+	 * Custom handler for displaying an list of visits.
+	 *
+	 * @param petId the ID of the pet whose visits to display
+	 * @return a ModelMap with the model attributes for the view
+	 */
+	@RequestMapping(value="/owners/*/pets/{petId}/visits", method=RequestMethod.GET)
+	public ModelAndView visitsHandler(@PathVariable int petId) {
+		ModelAndView mav = new ModelAndView("visits");
+		mav.addObject("visits", this.clinic.loadPet(petId).getVisits());
+		return mav;
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/EditOwnerForm.java b/src/main/java/org/springframework/samples/petclinic/web/EditOwnerForm.java
new file mode 100644
index 00000000..0b65de51
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/EditOwnerForm.java
@@ -0,0 +1,65 @@
+
+package org.springframework.samples.petclinic.web;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.validation.OwnerValidator;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.support.SessionStatus;
+
+/**
+ * JavaBean Form controller that is used to edit an existing <code>Owner</code>.
+ * 
+ * @author Juergen Hoeller
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+@RequestMapping("/owners/{ownerId}/edit")
+@SessionAttributes(types = Owner.class)
+public class EditOwnerForm {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public EditOwnerForm(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@InitBinder
+	public void setAllowedFields(WebDataBinder dataBinder) {
+		dataBinder.setDisallowedFields("id");
+	}
+
+	@RequestMapping(method = RequestMethod.GET)
+	public String setupForm(@PathVariable("ownerId") int ownerId, Model model) {
+		Owner owner = this.clinic.loadOwner(ownerId);
+		model.addAttribute(owner);
+		return "owners/form";
+	}
+
+	@RequestMapping(method = RequestMethod.PUT)
+	public String processSubmit(@ModelAttribute Owner owner, BindingResult result, SessionStatus status) {
+		new OwnerValidator().validate(owner, result);
+		if (result.hasErrors()) {
+			return "owners/form";
+		}
+		else {
+			this.clinic.storeOwner(owner);
+			status.setComplete();
+			return "redirect:/owners/" + owner.getId();
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/EditPetForm.java b/src/main/java/org/springframework/samples/petclinic/web/EditPetForm.java
new file mode 100644
index 00000000..1a7fd6ed
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/EditPetForm.java
@@ -0,0 +1,80 @@
+
+package org.springframework.samples.petclinic.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.validation.PetValidator;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.SessionAttributes;
+import org.springframework.web.bind.support.SessionStatus;
+
+/**
+ * JavaBean Form controller that is used to edit an existing <code>Pet</code>.
+ * 
+ * @author Juergen Hoeller
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+@RequestMapping("/owners/*/pets/{petId}/edit")
+@SessionAttributes("pet")
+public class EditPetForm {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public EditPetForm(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@ModelAttribute("types")
+	public Collection<PetType> populatePetTypes() {
+		return this.clinic.getPetTypes();
+	}
+
+	@InitBinder
+	public void setAllowedFields(WebDataBinder dataBinder) {
+		dataBinder.setDisallowedFields("id");
+	}
+
+	@RequestMapping(method = RequestMethod.GET)
+	public String setupForm(@PathVariable("petId") int petId, Model model) {
+		Pet pet = this.clinic.loadPet(petId);
+		model.addAttribute("pet", pet);
+		return "pets/form";
+	}
+
+	@RequestMapping(method = { RequestMethod.PUT, RequestMethod.POST })
+	public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) {
+		new PetValidator().validate(pet, result);
+		if (result.hasErrors()) {
+			return "pets/form";
+		}
+		else {
+			this.clinic.storePet(pet);
+			status.setComplete();
+			return "redirect:/owners/" + pet.getOwner().getId();
+		}
+	}
+
+	@RequestMapping(method = RequestMethod.DELETE)
+	public String deletePet(@PathVariable int petId) {
+		Pet pet = this.clinic.loadPet(petId);
+		this.clinic.deletePet(petId);
+		return "redirect:/owners/" + pet.getOwner().getId();
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/FindOwnersForm.java b/src/main/java/org/springframework/samples/petclinic/web/FindOwnersForm.java
new file mode 100644
index 00000000..eb93faba
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/FindOwnersForm.java
@@ -0,0 +1,74 @@
+
+package org.springframework.samples.petclinic.web;
+
+import java.util.Collection;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+/**
+ * JavaBean Form controller that is used to search for <code>Owner</code>s by
+ * last name.
+ * 
+ * @author Juergen Hoeller
+ * @author Ken Krebs
+ * @author Arjen Poutsma
+ */
+@Controller
+public class FindOwnersForm {
+
+	private final Clinic clinic;
+
+
+	@Autowired
+	public FindOwnersForm(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@InitBinder
+	public void setAllowedFields(WebDataBinder dataBinder) {
+		dataBinder.setDisallowedFields("id");
+	}
+
+	@RequestMapping(value = "/owners/search", method = RequestMethod.GET)
+	public String setupForm(Model model) {
+		model.addAttribute("owner", new Owner());
+		return "owners/search";
+	}
+
+	@RequestMapping(value = "/owners", method = RequestMethod.GET)
+	public String processSubmit(Owner owner, BindingResult result, Model model) {
+
+		// allow parameterless GET request for /owners to return all records
+		if (owner.getLastName() == null) {
+			owner.setLastName(""); // empty string signifies broadest possible search
+		}
+
+		// find owners by last name
+		Collection<Owner> results = this.clinic.findOwners(owner.getLastName());
+		if (results.size() < 1) {
+			// no owners found
+			result.rejectValue("lastName", "notFound", "not found");
+			return "owners/search";
+		}
+		if (results.size() > 1) {
+			// multiple owners found
+			model.addAttribute("selections", results);
+			return "owners/list";
+		}
+		else {
+			// 1 owner found
+			owner = results.iterator().next();
+			return "redirect:/owners/" + owner.getId();
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetTypeEditor.java b/src/main/java/org/springframework/samples/petclinic/web/PetTypeEditor.java
new file mode 100644
index 00000000..812b648d
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/PetTypeEditor.java
@@ -0,0 +1,30 @@
+package org.springframework.samples.petclinic.web;
+
+import java.beans.PropertyEditorSupport;
+
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.PetType;
+
+/**
+ * @author Mark Fisher
+ * @author Juergen Hoeller
+ */
+public class PetTypeEditor extends PropertyEditorSupport {
+
+	private final Clinic clinic;
+
+
+	public PetTypeEditor(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@Override
+	public void setAsText(String text) throws IllegalArgumentException {
+		for (PetType type : this.clinic.getPetTypes()) {
+			if (type.getName().equals(text)) {
+				setValue(type);
+			}
+		}
+	}
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java b/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java
new file mode 100644
index 00000000..e9da832e
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/VisitsAtomView.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.samples.petclinic.web;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.sun.syndication.feed.atom.Content;
+import com.sun.syndication.feed.atom.Entry;
+import com.sun.syndication.feed.atom.Feed;
+
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.web.servlet.view.feed.AbstractAtomFeedView;
+
+/**
+ * A view creating a Atom representation from a list of Visit objects. 
+ * 
+ * @author Alef Arendsen
+ * @author Arjen Poutsma
+ */
+public class VisitsAtomView extends AbstractAtomFeedView {
+
+	@Override
+	protected void buildFeedMetadata(Map<String, Object> model, Feed feed, HttpServletRequest request) {
+		feed.setId("tag:springsource.com");
+		feed.setTitle("Pet Clinic Visits");
+		@SuppressWarnings("unchecked")
+		List<Visit> visits = (List<Visit>) model.get("visits");
+		for (Visit visit : visits) {
+			Date date = visit.getDate();
+			if (feed.getUpdated() == null || date.compareTo(feed.getUpdated()) > 0) {
+				feed.setUpdated(date);
+			}
+		}
+	}
+
+	@Override
+	protected List<Entry> buildFeedEntries(Map<String, Object> model,
+			HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+		@SuppressWarnings("unchecked")
+		List<Visit> visits = (List<Visit>) model.get("visits");
+		List<Entry> entries = new ArrayList<Entry>(visits.size());
+
+		for (Visit visit : visits) {
+			Entry entry = new Entry();
+			String date = String.format("%1$tY-%1$tm-%1$td", visit.getDate());
+			// see http://diveintomark.org/archives/2004/05/28/howto-atom-id#other
+			entry.setId(String.format("tag:springsource.com,%s:%d", date, visit.getId()));
+			entry.setTitle(String.format("%s visit on %s", visit.getPet().getName(), date));
+			entry.setUpdated(visit.getDate());
+
+			Content summary = new Content();
+			summary.setValue(visit.getDescription());
+			entry.setSummary(summary);
+
+			entries.add(entry);
+		}
+
+		return entries;
+
+	}
+	
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/web/package-info.java b/src/main/java/org/springframework/samples/petclinic/web/package-info.java
new file mode 100644
index 00000000..c909ccf7
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/web/package-info.java
@@ -0,0 +1,8 @@
+
+/**
+ *
+ * The classes in this package represent PetClinic's web presentation layer.
+ *
+ */
+package org.springframework.samples.petclinic.web;
+
diff --git a/src/main/java/overview.html b/src/main/java/overview.html
new file mode 100644
index 00000000..1eb7a2e8
--- /dev/null
+++ b/src/main/java/overview.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<p>
+The Spring Data Binding framework, an internal library used by Spring Web Flow.
+</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties
new file mode 100644
index 00000000..e039cdf1
--- /dev/null
+++ b/src/main/resources/jdbc.properties
@@ -0,0 +1,63 @@
+# Properties file with JDBC and JPA settings.
+#
+# Applied by <context:property-placeholder location="jdbc.properties"/> from
+# various application context XML files (e.g., "applicationContext-*.xml").
+# Targeted at system administrators, to avoid touching the context XML files.
+
+
+#-------------------------------------------------------------------------------
+# Common Settings
+
+hibernate.generate_statistics=true
+hibernate.show_sql=true
+jpa.showSql=true
+
+
+#-------------------------------------------------------------------------------
+# HSQL Settings
+
+jdbc.driverClassName=org.hsqldb.jdbcDriver
+jdbc.url=jdbc:hsqldb:mem:petclinic
+jdbc.username=sa
+jdbc.password=
+
+# Properties that control the population of schema and data for a new data source
+jdbc.populate=true
+jdbc.schemaLocation=classpath:/META-INF/hsqldb/initDB.txt
+jdbc.dataLocation=classpath:/META-INF/hsqldb/populateDB.txt
+jdbc.dropLocation=classpath:/META-INF/hsqldb/dropTables.txt
+
+# Property that determines which Hibernate dialect to use
+# (only applied with "applicationContext-hibernate.xml")
+hibernate.dialect=org.hibernate.dialect.HSQLDialect
+
+# Property that determines which JPA DatabasePlatform to use with TopLink Essentials
+jpa.databasePlatform=org.springframework.samples.petclinic.toplink.EssentialsHSQLPlatformWithNativeSequence
+
+# Property that determines which database to use with an AbstractJpaVendorAdapter
+jpa.database=HSQL
+
+
+#-------------------------------------------------------------------------------
+# MySQL Settings
+
+#jdbc.driverClassName=com.mysql.jdbc.Driver
+#jdbc.url=jdbc:mysql://localhost:3306/petclinic
+#jdbc.username=pc
+#jdbc.password=pc
+
+# Properties that control the population of schema and data for a new data source
+#jdbc.populate=false
+#jdbc.schemaLocation=
+#jdbc.dataLocation=
+#jdbc.dropLocation=
+
+# Property that determines which Hibernate dialect to use
+# (only applied with "applicationContext-hibernate.xml")
+#hibernate.dialect=org.hibernate.dialect.MySQLDialect
+
+# Property that determines which JPA DatabasePlatform to use with TopLink Essentials
+#jpa.databasePlatform=oracle.toplink.essentials.platform.database.MySQL4Platform
+
+# Property that determines which database to use with an AbstractJpaVendorAdapter
+#jpa.database=MYSQL
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
new file mode 100644
index 00000000..ebee551a
--- /dev/null
+++ b/src/main/resources/log4j.properties
@@ -0,0 +1,18 @@
+# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
+# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
+log4j.rootLogger=INFO, stdout, logfile
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
+
+log4j.appender.logfile=org.apache.log4j.RollingFileAppender
+log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log
+log4j.appender.logfile.MaxFileSize=512KB
+# Keep three backup files.
+log4j.appender.logfile.MaxBackupIndex=3
+# Pattern to output: date priority [category] - message
+log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
+log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
+
+log4j.logger.org.springframework.samples.petclinic.aspects=DEBUG
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
new file mode 100644
index 00000000..173417a1
--- /dev/null
+++ b/src/main/resources/messages.properties
@@ -0,0 +1,8 @@
+welcome=Welcome
+required=is required
+notFound=has not been found
+duplicate=is already in use
+nonNumeric=must be all numeric
+duplicateFormSubmission=Duplicate form submission is not allowed
+typeMismatch.date=invalid date
+typeMismatch.birthDate=invalid date
diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties
new file mode 100644
index 00000000..124bee48
--- /dev/null
+++ b/src/main/resources/messages_de.properties
@@ -0,0 +1,8 @@
+welcome=Willkommen
+required=muss angegeben werden
+notFound=wurde nicht gefunden
+duplicate=ist bereits vergeben
+nonNumeric=darf nur numerisch sein
+duplicateFormSubmission=Wiederholtes Absenden des Formulars ist nicht erlaubt
+typeMismatch.date=ungültiges Datum
+typeMismatch.birthDate=ungültiges Datum
diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties
new file mode 100644
index 00000000..05d519bb
--- /dev/null
+++ b/src/main/resources/messages_en.properties
@@ -0,0 +1 @@
+# This file is intentionally empty. Message look-ups will fall back to the default "messages.properties" file.
\ No newline at end of file
diff --git a/src/main/resources/petclinic.hbm.xml b/src/main/resources/petclinic.hbm.xml
new file mode 100644
index 00000000..f9a993cf
--- /dev/null
+++ b/src/main/resources/petclinic.hbm.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
+		"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+  - Mapping file for the Hibernate implementation of the Clinic interface.
+	-->
+<hibernate-mapping auto-import="true" default-lazy="false">
+
+	<class name="org.springframework.samples.petclinic.Vet" table="vets">
+		<id name="id" column="id">
+			<generator class="identity"/>
+		</id>
+		<property name="firstName" column="first_name"/>
+		<property name="lastName" column="last_name"/>
+		<set name="specialtiesInternal" table="vet_specialties">
+			<key column="vet_id"/>
+			<many-to-many column="specialty_id" class="org.springframework.samples.petclinic.Specialty"/>
+		</set>
+	</class>
+
+	<class name="org.springframework.samples.petclinic.Specialty" table="specialties">
+		<id name="id" column="id">
+			<generator class="identity"/>
+		</id>
+		<property name="name" column="name"/>
+	</class>
+
+	<class name="org.springframework.samples.petclinic.Owner" table="owners">
+		<id name="id" column="id">
+			<generator class="identity"/>
+		</id>
+		<property name="firstName" column="first_name"/>
+		<property name="lastName" column="last_name"/>
+		<property name="address" column="address"/>
+		<property name="city" column="city"/>
+		<property name="telephone" column="telephone"/>
+		<set name="petsInternal" inverse="true" cascade="all">
+			<key column="owner_id"/>
+			<one-to-many class="org.springframework.samples.petclinic.Pet"/>
+		</set>
+	</class>
+
+	<class name="org.springframework.samples.petclinic.Pet" table="pets">
+		<id name="id" column="id">
+			<generator class="identity"/>
+		</id>
+		<property name="name" column="name"/>
+		<property name="birthDate" column="birth_date" type="date"/>
+		<many-to-one name="owner" column="owner_id" class="org.springframework.samples.petclinic.Owner"/>
+		<many-to-one name="type" column="type_id" class="org.springframework.samples.petclinic.PetType"/>
+		<set name="visitsInternal" inverse="true" cascade="all">
+			<key column="pet_id"/>
+			<one-to-many class="org.springframework.samples.petclinic.Visit"/>
+		</set>
+	</class>
+
+	<class name="org.springframework.samples.petclinic.PetType" table="types">
+		<id name="id" column="id">
+			<generator class="identity"/>
+		</id>
+		<property name="name" column="name"/>
+	</class>
+
+	<class name="org.springframework.samples.petclinic.Visit" table="visits">
+		<id name="id" column="id">
+			<generator class="identity"/>
+		</id>
+		<property name="date" column="visit_date" type="date"/>
+		<property name="description" column="description"/>
+		<many-to-one name="pet" column="pet_id" class="org.springframework.samples.petclinic.Pet"/>
+	</class>
+
+</hibernate-mapping>
diff --git a/src/main/webapp/META-INF/aop.xml b/src/main/webapp/META-INF/aop.xml
new file mode 100644
index 00000000..b49ffd8b
--- /dev/null
+++ b/src/main/webapp/META-INF/aop.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<!-- Custom aspects for the PetClinic sample application -->
+<aspectj>
+
+	<weaver>
+		<include within="org.springframework.samples.petclinic..*"/>
+	</weaver>
+
+	<aspects>
+		<aspect name="org.springframework.samples.petclinic.aspects.UsageLogAspect"/>
+		<concrete-aspect name="org.springframework.samples.petclinic.aspects.ApplicationTraceAspect"
+				extends="org.springframework.samples.petclinic.aspects.AbstractTraceAspect">
+			<pointcut name="traced" expression="execution(* org.springframework.samples..*.*(..))"/>
+		</concrete-aspect>
+	</aspects>
+
+</aspectj>
diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml
new file mode 100644
index 00000000..d5deabaf
--- /dev/null
+++ b/src/main/webapp/META-INF/context.xml
@@ -0,0 +1,7 @@
+<!-- Tomcat context descriptor used for specifying a custom ClassLoader -->
+<Context path="/petclinic" reloadable="false">
+	<!-- please note that useSystemClassLoaderAsParent is available since Tomcat 5.5.20 / remove if previous versions are being used -->
+	<!--  
+	<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" useSystemClassLoaderAsParent="false"/>
+	-->
+</Context>
diff --git a/src/main/webapp/META-INF/hsqldb/dropTables.txt b/src/main/webapp/META-INF/hsqldb/dropTables.txt
new file mode 100644
index 00000000..90ae6329
--- /dev/null
+++ b/src/main/webapp/META-INF/hsqldb/dropTables.txt
@@ -0,0 +1,7 @@
+DROP TABLE visits;
+DROP TABLE pets;
+DROP TABLE owners;
+DROP TABLE types;
+DROP TABLE vet_specialties;
+DROP TABLE specialties;
+DROP TABLE vets;
diff --git a/src/main/webapp/META-INF/hsqldb/initDB.txt b/src/main/webapp/META-INF/hsqldb/initDB.txt
new file mode 100644
index 00000000..a75bfbbd
--- /dev/null
+++ b/src/main/webapp/META-INF/hsqldb/initDB.txt
@@ -0,0 +1,55 @@
+CREATE TABLE vets (
+	id INTEGER NOT NULL IDENTITY PRIMARY KEY,
+	first_name VARCHAR(30),
+	last_name VARCHAR(30)
+);
+CREATE INDEX vets_last_name ON vets(last_name);
+
+CREATE TABLE specialties (
+	id INTEGER NOT NULL IDENTITY PRIMARY KEY,
+	name VARCHAR(80)
+);
+CREATE INDEX specialties_name ON specialties(name);
+
+CREATE TABLE vet_specialties (
+	vet_id INTEGER NOT NULL,
+	specialty_id INTEGER NOT NULL
+);
+alter table vet_specialties add constraint fk_vet_specialties_vets foreign key (vet_id) references vets(id);
+alter table vet_specialties add constraint fk_vet_specialties_specialties foreign key (specialty_id) references specialties(id);
+
+CREATE TABLE types (
+	id INTEGER NOT NULL IDENTITY PRIMARY KEY,
+	name VARCHAR(80)
+);
+CREATE INDEX types_name ON types(name);
+
+CREATE TABLE owners (
+	id INTEGER NOT NULL IDENTITY PRIMARY KEY,
+	first_name VARCHAR(30),
+	last_name VARCHAR(30),
+	address VARCHAR(255),
+	city VARCHAR(80),
+	telephone VARCHAR(20)
+);
+CREATE INDEX owners_last_name ON owners(last_name);
+
+CREATE TABLE pets (
+	id INTEGER NOT NULL IDENTITY PRIMARY KEY,
+	name VARCHAR(30),
+	birth_date DATE,
+	type_id INTEGER NOT NULL,
+	owner_id INTEGER NOT NULL
+);
+alter table pets add constraint fk_pets_owners foreign key (owner_id) references owners(id);
+alter table pets add constraint fk_pets_types foreign key (type_id) references types(id);
+CREATE INDEX pets_name ON pets(name);
+
+CREATE TABLE visits (
+	id INTEGER NOT NULL IDENTITY PRIMARY KEY,
+	pet_id INTEGER NOT NULL,
+	visit_date DATE,
+	description VARCHAR(255)
+);
+alter table visits add constraint fk_visits_pets foreign key (pet_id) references pets(id);
+CREATE INDEX visits_pet_id ON visits(pet_id);
diff --git a/src/main/webapp/META-INF/hsqldb/populateDB.txt b/src/main/webapp/META-INF/hsqldb/populateDB.txt
new file mode 100644
index 00000000..1bf0c4a6
--- /dev/null
+++ b/src/main/webapp/META-INF/hsqldb/populateDB.txt
@@ -0,0 +1,53 @@
+INSERT INTO vets VALUES (1, 'James', 'Carter');
+INSERT INTO vets VALUES (2, 'Helen', 'Leary');
+INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
+INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
+INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
+INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
+
+INSERT INTO specialties VALUES (1, 'radiology');
+INSERT INTO specialties VALUES (2, 'surgery');
+INSERT INTO specialties VALUES (3, 'dentistry');
+
+INSERT INTO vet_specialties VALUES (2, 1);
+INSERT INTO vet_specialties VALUES (3, 2);
+INSERT INTO vet_specialties VALUES (3, 3);
+INSERT INTO vet_specialties VALUES (4, 2);
+INSERT INTO vet_specialties VALUES (5, 1);
+
+INSERT INTO types VALUES (1, 'cat');
+INSERT INTO types VALUES (2, 'dog');
+INSERT INTO types VALUES (3, 'lizard');
+INSERT INTO types VALUES (4, 'snake');
+INSERT INTO types VALUES (5, 'bird');
+INSERT INTO types VALUES (6, 'hamster');
+
+INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
+INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
+INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
+INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
+INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
+INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
+INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
+INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
+INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
+INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
+
+INSERT INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1);
+INSERT INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2);
+INSERT INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3);
+INSERT INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3);
+INSERT INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4);
+INSERT INTO pets VALUES (6, 'George', '2000-01-20', 4, 5);
+INSERT INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6);
+INSERT INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6);
+INSERT INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7);
+INSERT INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8);
+INSERT INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9);
+INSERT INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10);
+INSERT INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10);
+
+INSERT INTO visits VALUES (1, 7, '1996-03-04', 'rabies shot');
+INSERT INTO visits VALUES (2, 8, '1996-03-04', 'rabies shot');
+INSERT INTO visits VALUES (3, 8, '1996-06-04', 'neutered');
+INSERT INTO visits VALUES (4, 7, '1996-09-04', 'spayed');
diff --git a/src/main/webapp/META-INF/orm.xml b/src/main/webapp/META-INF/orm.xml
new file mode 100644
index 00000000..d7c8f704
--- /dev/null
+++ b/src/main/webapp/META-INF/orm.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
+		version="1.0">
+
+	<persistence-unit-metadata>
+		<xml-mapping-metadata-complete/>
+		<persistence-unit-defaults>
+			<access>PROPERTY</access>
+		</persistence-unit-defaults>
+	</persistence-unit-metadata>
+
+	<package>org.springframework.samples.petclinic</package>
+
+	<mapped-superclass class="BaseEntity">
+		<attributes>
+			<id name="id">
+				<generated-value strategy="IDENTITY"/>
+			</id>
+			<transient name="new"/>
+		</attributes>
+	</mapped-superclass>
+
+	<mapped-superclass class="NamedEntity">
+		<attributes>
+			<basic name="name">
+				<column name="NAME"/>
+			</basic>
+		</attributes>
+	</mapped-superclass>
+
+	<mapped-superclass class="Person">
+		<attributes>
+			<basic name="firstName">
+				<column name="FIRST_NAME"/>
+			</basic>
+			<basic name="lastName">
+				<column name="LAST_NAME"/>
+			</basic>
+		</attributes>
+	</mapped-superclass>
+
+	<entity class="Vet">
+		<table name="VETS"/>
+		<attributes>
+			<many-to-many name="specialtiesInternal" target-entity="Specialty" fetch="EAGER">
+				<join-table name="VET_SPECIALTIES">
+					<join-column name="VET_ID"/>
+					<inverse-join-column name="SPECIALTY_ID"/>
+				</join-table>
+			</many-to-many>
+			<transient name="specialties"/>
+			<transient name="nrOfSpecialties"/>
+		</attributes>
+	</entity>
+
+	<entity class="Specialty">
+		<table name="SPECIALTIES"/>
+	</entity>
+
+	<entity class="Owner">
+		<table name="OWNERS"/>
+		<attributes>
+			<basic name="address"/>
+			<basic name="city"/>
+			<basic name="telephone"/>
+			<one-to-many name="petsInternal" target-entity="Pet" mapped-by="owner" fetch="EAGER">
+				<cascade>
+					<cascade-all/>
+				</cascade>
+			</one-to-many>
+			<transient name="pets"/>
+		</attributes>
+	</entity>
+
+	<entity class="Pet">
+		<table name="PETS"/>
+		<attributes>
+			<basic name="birthDate">
+				<column name="BIRTH_DATE"/>
+				<temporal>DATE</temporal>
+			</basic>
+			<many-to-one name="owner" fetch="EAGER">
+				<cascade>
+					<cascade-all/>
+				</cascade>
+			</many-to-one>
+			<many-to-one name="type" fetch="EAGER">
+				<cascade>
+					<cascade-all/>
+				</cascade>
+			</many-to-one>
+			<one-to-many name="visitsInternal" target-entity="Visit" mapped-by="pet" fetch="EAGER">
+				<cascade>
+					<cascade-all/>
+				</cascade>
+			</one-to-many>
+			<transient name="visits"/>
+		</attributes>
+	</entity>
+
+	<entity class="PetType">
+		<table name="TYPES"/>
+	</entity>
+
+	<entity class="Visit">
+		<table name="VISITS"/>
+		<attributes>
+			<basic name="date">
+				<column name="VISIT_DATE"/>
+				<temporal>DATE</temporal>
+			</basic>
+			<many-to-one name="pet" fetch="EAGER">
+				<cascade>
+					<cascade-all/>
+				</cascade>
+			</many-to-one>
+		</attributes>
+	</entity>
+
+</entity-mappings>
diff --git a/src/main/webapp/META-INF/persistence.xml b/src/main/webapp/META-INF/persistence.xml
new file mode 100644
index 00000000..86bf7c11
--- /dev/null
+++ b/src/main/webapp/META-INF/persistence.xml
@@ -0,0 +1,16 @@
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
+		version="1.0">
+
+	<persistence-unit name="PetClinic" transaction-type="RESOURCE_LOCAL">
+
+		<!-- Explicitly define mapping file path, else Hibernate won't find the default -->
+		<mapping-file>META-INF/orm.xml</mapping-file>
+
+		<!-- Prevent annotation scanning. In this app we are purely driven by orm.xml -->
+		<exclude-unlisted-classes>true</exclude-unlisted-classes>
+
+	</persistence-unit>
+
+</persistence>
diff --git a/src/main/webapp/WEB-INF/applicationContext-hibernate.xml b/src/main/webapp/WEB-INF/applicationContext-hibernate.xml
new file mode 100644
index 00000000..bfc166db
--- /dev/null
+++ b/src/main/webapp/WEB-INF/applicationContext-hibernate.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	Application context definition for PetClinic on Hibernate.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
+		xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
+		xsi:schemaLocation="
+			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
+			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+	<!-- ========================= RESOURCE DEFINITIONS ========================= -->
+
+	<!-- Configurer that replaces ${...} placeholders with values from a properties file -->
+	<!-- (in this case, JDBC-related settings for the dataSource definition below) -->
+	<context:property-placeholder location="classpath:jdbc.properties"/>
+
+	<!--
+		Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation
+		for the required JAR files. Alternatively you can use another connection pool
+		such as C3P0, similarly configured using Spring.
+	-->
+	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
+			p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}"
+			p:password="${jdbc.password}"/>
+
+	<!-- JNDI DataSource for JEE environments -->
+	<!--
+		<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/>
+	-->
+
+	<!-- Hibernate SessionFactory -->
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
+			p:dataSource-ref="dataSource" p:mappingResources="petclinic.hbm.xml">
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
+				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
+				<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
+			</props>
+		</property>
+		<property name="eventListeners">
+			<map>
+				<entry key="merge">
+					<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
+				</entry>
+			</map>
+		</property>
+	</bean>
+
+	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
+	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
+			p:sessionFactory-ref="sessionFactory"/>
+
+	<!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
+	<!--
+	<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
+	-->
+
+
+	<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
+
+	<!--
+		Activates various annotations to be detected in bean classes:
+		Spring's @Required and @Autowired, as well as JSR 250's @Resource.
+	-->
+	<context:annotation-config/>
+
+	<!--
+		Instruct Spring to perform declarative transaction management
+		automatically on annotated classes.
+	-->
+	<tx:annotation-driven/>
+
+	<!--
+		Exporter that exposes the Hibernate statistics service via JMX. Autodetects the
+		service MBean, using its bean name as JMX object name.
+	-->
+	<context:mbean-export/>
+
+	<!-- PetClinic's central data access object: Hibernate implementation -->
+	<bean id="clinic" class="org.springframework.samples.petclinic.hibernate.HibernateClinic"/>
+
+	<!-- Hibernate's JMX statistics service -->
+	<bean name="petclinic:type=HibernateStatistics" class="org.hibernate.jmx.StatisticsService" autowire="byName"/>
+
+</beans>
diff --git a/src/main/webapp/WEB-INF/applicationContext-jdbc.xml b/src/main/webapp/WEB-INF/applicationContext-jdbc.xml
new file mode 100644
index 00000000..69a2b1f5
--- /dev/null
+++ b/src/main/webapp/WEB-INF/applicationContext-jdbc.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	Application context definition for PetClinic on JDBC.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
+		xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
+		xmlns:tx="http://www.springframework.org/schema/tx"
+		xsi:schemaLocation="
+			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
+			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+	<!-- ========================= RESOURCE DEFINITIONS ========================= -->
+
+	<!-- Configurer that replaces ${...} placeholders with values from a properties file -->
+	<!-- (in this case, JDBC-related settings for the dataSource definition below) -->
+	<context:property-placeholder location="classpath:jdbc.properties"/>
+
+	<!--
+		Spring FactoryBean that creates a DataSource using Apache Commons DBCP for connection 
+		pooling. See Commons DBCP documentation for the required JAR files.  This factory bean
+		can populate the data source with a schema and data scripts if configured to do so.
+		
+		An alternate factory bean can be created for different connection pool implementations,
+		C3P0 for example.
+	-->
+	<bean id="dataSource" class="org.springframework.samples.petclinic.config.DbcpDataSourceFactory"
+			p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" 
+			p:username="${jdbc.username}" p:password="${jdbc.password}" p:populate="${jdbc.populate}"
+			p:schemaLocation="${jdbc.schemaLocation}" p:dataLocation="${jdbc.dataLocation}"/>
+
+	<!-- JNDI DataSource for JEE environments -->
+	<!--
+	<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/>
+	-->
+
+	<!-- Transaction manager for a single JDBC DataSource (alternative to JTA) -->
+	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
+			p:dataSource-ref="dataSource"/>
+
+	<!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->
+	<!--
+	<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
+	-->
+
+
+	<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
+
+	<!--
+		Activates various annotations to be detected in bean classes: Spring's
+		@Required and @Autowired, as well as JSR 250's @PostConstruct,
+		@PreDestroy and @Resource (if available) and JPA's @PersistenceContext
+		and @PersistenceUnit (if available).
+	-->
+	<context:annotation-config/>
+
+	<!--
+		Instruct Spring to retrieve and apply @AspectJ aspects which are defined
+		as beans in this context (such as the CallMonitoringAspect below).
+	-->
+	<aop:aspectj-autoproxy/>
+
+	<!--
+		Instruct Spring to perform automatic transaction management on annotated classes.
+		The SimpleJdbcClinic implementation declares @Transactional annotations.
+		"proxy-target-class" is set because of SimpleJdbcClinic's @ManagedOperation usage.
+	-->
+	<tx:annotation-driven/>
+
+	<!--
+		Exporter that exposes the Clinic DAO and the CallMonitoringAspect via JMX,
+		based on the @ManagedResource, @ManagedAttribute, and @ManagedOperation annotations.
+	-->
+	<context:mbean-export/>
+
+	<!-- PetClinic's central data access object using Spring's SimpleJdbcTemplate -->
+	<bean id="clinic" class="org.springframework.samples.petclinic.jdbc.SimpleJdbcClinic"/>
+
+	<!-- Call monitoring aspect that monitors call count and call invocation time -->
+	<bean id="callMonitor" class="org.springframework.samples.petclinic.aspects.CallMonitoringAspect"/>
+
+</beans>
diff --git a/src/main/webapp/WEB-INF/applicationContext-jpa.xml b/src/main/webapp/WEB-INF/applicationContext-jpa.xml
new file mode 100644
index 00000000..25374e9a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/applicationContext-jpa.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	Application context definition for PetClinic on JPA.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
+		xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
+		xmlns:tx="http://www.springframework.org/schema/tx"
+		xsi:schemaLocation="
+			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
+			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+	<!-- ========================= RESOURCE DEFINITIONS ========================= -->
+
+	<!--
+		Activates a load-time weaver for the context. Any bean within the context that
+		implements LoadTimeWeaverAware (such as LocalContainerEntityManagerFactoryBean)
+		will receive a reference to the autodetected load-time weaver.
+	-->
+	<context:load-time-weaver/>
+
+	<!-- Configurer that replaces ${...} placeholders with values from a properties file -->
+	<!-- (in this case, JDBC-related settings for the dataSource definition below) -->
+	<context:property-placeholder location="classpath:jdbc.properties"/>
+
+	<!--
+		Uses Apache Commons DBCP for connection pooling. See Commons DBCP documentation
+		for the required JAR files. Alternatively you can use another connection pool
+		such as C3P0, similarly configured using Spring.
+	-->
+	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
+			p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}"
+			p:password="${jdbc.password}"/>
+
+	<!-- JNDI DataSource for JEE environments -->
+	<!--
+	<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/>
+	-->
+
+	<!-- JPA EntityManagerFactory -->
+	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
+			p:dataSource-ref="dataSource">
+		<property name="jpaVendorAdapter">
+			<bean class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter"
+					p:databasePlatform="${jpa.databasePlatform}" p:showSql="${jpa.showSql}"/>
+			<!--
+			<bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"
+					p:database="${jpa.database}" p:showSql="${jpa.showSql}"/>
+			-->
+			<!--
+			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
+					p:database="${jpa.database}" p:showSql="${jpa.showSql}"/>
+			-->
+		</property>
+	</bean>
+
+	<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) -->
+	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
+			p:entityManagerFactory-ref="entityManagerFactory"/>
+
+
+	<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
+
+	<!--
+		Activates various annotations to be detected in bean classes: Spring's
+		@Required and @Autowired, as well as JSR 250's @PostConstruct,
+		@PreDestroy and @Resource (if available) and JPA's @PersistenceContext
+		and @PersistenceUnit (if available).
+	-->
+	<context:annotation-config/>
+
+	<!--
+		Instruct Spring to perform declarative transaction management
+		automatically on annotated classes.
+	-->
+	<tx:annotation-driven mode="aspectj"/>
+
+	<!--
+		Simply defining this bean will cause requests to owner names to be saved.
+		This aspect is defined in petclinic.jar's META-INF/aop.xml file.
+		Note that we can dependency inject this bean like any other bean.
+	-->
+	<bean class="org.springframework.samples.petclinic.aspects.UsageLogAspect" p:historySize="300"/>
+
+	<!--
+		Post-processor to perform exception translation on @Repository classes (from native
+		exceptions such as JPA PersistenceExceptions to Spring's DataAccessException hierarchy).
+	-->
+	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
+
+	<!--
+		Will automatically be transactional due to @Transactional.
+		EntityManager will be auto-injected due to @PersistenceContext.
+		PersistenceExceptions will be auto-translated due to @Repository.
+	-->
+	<bean id="clinic" class="org.springframework.samples.petclinic.jpa.EntityManagerClinic"/>
+
+</beans>
diff --git a/src/main/webapp/WEB-INF/classes/log4j.properties b/src/main/webapp/WEB-INF/classes/log4j.properties
new file mode 100644
index 00000000..ebee551a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/classes/log4j.properties
@@ -0,0 +1,18 @@
+# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
+# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
+log4j.rootLogger=INFO, stdout, logfile
+
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
+
+log4j.appender.logfile=org.apache.log4j.RollingFileAppender
+log4j.appender.logfile.File=${petclinic.root}/WEB-INF/petclinic.log
+log4j.appender.logfile.MaxFileSize=512KB
+# Keep three backup files.
+log4j.appender.logfile.MaxBackupIndex=3
+# Pattern to output: date priority [category] - message
+log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
+log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
+
+log4j.logger.org.springframework.samples.petclinic.aspects=DEBUG
diff --git a/src/main/webapp/WEB-INF/classes/messages.properties b/src/main/webapp/WEB-INF/classes/messages.properties
new file mode 100644
index 00000000..173417a1
--- /dev/null
+++ b/src/main/webapp/WEB-INF/classes/messages.properties
@@ -0,0 +1,8 @@
+welcome=Welcome
+required=is required
+notFound=has not been found
+duplicate=is already in use
+nonNumeric=must be all numeric
+duplicateFormSubmission=Duplicate form submission is not allowed
+typeMismatch.date=invalid date
+typeMismatch.birthDate=invalid date
diff --git a/src/main/webapp/WEB-INF/classes/messages_de.properties b/src/main/webapp/WEB-INF/classes/messages_de.properties
new file mode 100644
index 00000000..124bee48
--- /dev/null
+++ b/src/main/webapp/WEB-INF/classes/messages_de.properties
@@ -0,0 +1,8 @@
+welcome=Willkommen
+required=muss angegeben werden
+notFound=wurde nicht gefunden
+duplicate=ist bereits vergeben
+nonNumeric=darf nur numerisch sein
+duplicateFormSubmission=Wiederholtes Absenden des Formulars ist nicht erlaubt
+typeMismatch.date=ungültiges Datum
+typeMismatch.birthDate=ungültiges Datum
diff --git a/src/main/webapp/WEB-INF/classes/messages_en.properties b/src/main/webapp/WEB-INF/classes/messages_en.properties
new file mode 100644
index 00000000..05d519bb
--- /dev/null
+++ b/src/main/webapp/WEB-INF/classes/messages_en.properties
@@ -0,0 +1 @@
+# This file is intentionally empty. Message look-ups will fall back to the default "messages.properties" file.
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/geronimo-web.xml b/src/main/webapp/WEB-INF/geronimo-web.xml
new file mode 100644
index 00000000..b5d88e1e
--- /dev/null
+++ b/src/main/webapp/WEB-INF/geronimo-web.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.0"
+		 configId="org/springframework/samples/petclinic">
+	<context-root>/petclinic</context-root>
+	<context-priority-classloader>true</context-priority-classloader>
+</web-app>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/jsp/dataAccessFailure.jsp b/src/main/webapp/WEB-INF/jsp/dataAccessFailure.jsp
new file mode 100644
index 00000000..256cca17
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/dataAccessFailure.jsp
@@ -0,0 +1,19 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+<%
+Exception ex = (Exception) request.getAttribute("exception");
+%>
+
+<h2>Data access failure: <%= ex.getMessage() %></h2>
+<p/>
+
+<%
+ex.printStackTrace(new java.io.PrintWriter(out));
+%>
+
+<p/>
+<br/>
+<a href="<spring:url value="/" htmlEscape="true" />">Home</a>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/footer.jsp b/src/main/webapp/WEB-INF/jsp/footer.jsp
new file mode 100644
index 00000000..52aaffc4
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/footer.jsp
@@ -0,0 +1,12 @@
+
+  <table class="footer">
+    <tr>
+      <td><a href="<spring:url value="/" htmlEscape="true" />">Home</a></td>
+      <td align="right"><img src="<spring:url value="/static/images/springsource-logo.png" htmlEscape="true" />" alt="Sponsored by SpringSource"/></td>
+    </tr>
+  </table>
+
+  </div>
+</body>
+
+</html>
diff --git a/src/main/webapp/WEB-INF/jsp/header.jsp b/src/main/webapp/WEB-INF/jsp/header.jsp
new file mode 100644
index 00000000..49393d36
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/header.jsp
@@ -0,0 +1,14 @@
+<!--
+	PetClinic :: a Spring Framework demonstration
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+  <link rel="stylesheet" href="<spring:url value="/static/styles/petclinic.css" htmlEscape="true" />" type="text/css"/>
+  <title>PetClinic :: a Spring Framework demonstration</title>	
+</head>
+
+<body>
+
+  <div id="main">
diff --git a/src/main/webapp/WEB-INF/jsp/includes.jsp b/src/main/webapp/WEB-INF/jsp/includes.jsp
new file mode 100644
index 00000000..96c3e304
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/includes.jsp
@@ -0,0 +1,5 @@
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
diff --git a/src/main/webapp/WEB-INF/jsp/owners/form.jsp b/src/main/webapp/WEB-INF/jsp/owners/form.jsp
new file mode 100644
index 00000000..1670a7c1
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/owners/form.jsp
@@ -0,0 +1,61 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+<c:choose>
+	<c:when test="${owner.new}"><c:set var="method" value="post"/></c:when>
+	<c:otherwise><c:set var="method" value="put"/></c:otherwise>
+</c:choose>
+
+<h2><c:if test="${owner.new}">New </c:if>Owner:</h2>
+<form:form modelAttribute="owner" method="${method}">
+  <table>
+    <tr>
+      <th>
+        First Name: <form:errors path="firstName" cssClass="errors"/>
+        <br/>
+        <form:input path="firstName" size="30" maxlength="80"/>
+      </th>
+    </tr>
+    <tr>
+      <th>
+        Last Name: <form:errors path="lastName" cssClass="errors"/>
+        <br/>
+        <form:input path="lastName" size="30" maxlength="80"/>
+      </th>
+    </tr>
+    <tr>
+      <th>
+        Address: <form:errors path="address" cssClass="errors"/>
+        <br/>
+        <form:input path="address" size="30" maxlength="80"/>
+      </th>
+    </tr>
+    <tr>
+      <th>
+        City: <form:errors path="city" cssClass="errors"/>
+        <br/>
+        <form:input path="city" size="30" maxlength="80"/>
+      </th>
+    </tr>
+    <tr>
+      <th>
+        Telephone: <form:errors path="telephone" cssClass="errors"/>
+        <br/>
+        <form:input path="telephone" size="20" maxlength="20"/>
+      </th>
+    </tr>
+    <tr>
+      <td>
+        <c:choose>
+          <c:when test="${owner.new}">
+            <p class="submit"><input type="submit" value="Add Owner"/></p>
+          </c:when>
+          <c:otherwise>
+            <p class="submit"><input type="submit" value="Update Owner"/></p>
+          </c:otherwise>
+        </c:choose>
+      </td>
+    </tr>
+  </table>
+</form:form>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/owners/list.jsp b/src/main/webapp/WEB-INF/jsp/owners/list.jsp
new file mode 100644
index 00000000..44fc3cac
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/owners/list.jsp
@@ -0,0 +1,34 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+<h2>Owners:</h2>
+
+<table>
+  <thead>
+    <th>Name</th>
+    <th>Address</th>
+    <th>City</th>
+    <th>Telephone</th>
+    <th>Pets</th>
+  </thead>
+  <c:forEach var="owner" items="${selections}">
+    <tr>
+      <td>
+          <spring:url value="owners/{ownerId}" var="ownerUrl">
+              <spring:param name="ownerId" value="${owner.id}"/>
+          </spring:url>
+          <a href="${fn:escapeXml(ownerUrl)}">${owner.firstName} ${owner.lastName}</a>
+      </td>
+      <td>${owner.address}</td>
+      <td>${owner.city}</td>
+      <td>${owner.telephone}</td>
+      <td>
+        <c:forEach var="pet" items="${owner.pets}">
+          ${pet.name} &nbsp;
+        </c:forEach>
+      </td>
+    </tr>
+  </c:forEach>
+</table>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/owners/search.jsp b/src/main/webapp/WEB-INF/jsp/owners/search.jsp
new file mode 100644
index 00000000..b972390a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/owners/search.jsp
@@ -0,0 +1,26 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+
+<h2>Find Owners:</h2>
+
+<spring:url value="/owners" var="formUrl"/>
+<form:form modelAttribute="owner" action="${fn:escapeXml(formUrl)}" method="get">
+  <table>
+    <tr>
+      <th>
+        Last Name: <form:errors path="*" cssClass="errors"/>
+        <br/> 
+        <form:input path="lastName" size="30" maxlength="80" />
+      </th>
+    </tr>
+    <tr>
+      <td><p class="submit"><input type="submit" value="Find Owners"/></p></td>
+    </tr>
+  </table>
+</form:form>
+
+<br/>
+<a href='<spring:url value="/owners/new" htmlEscape="true"/>'>Add Owner</a>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/owners/show.jsp b/src/main/webapp/WEB-INF/jsp/owners/show.jsp
new file mode 100644
index 00000000..9767c18a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/owners/show.jsp
@@ -0,0 +1,108 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+<h2>Owner Information</h2>
+
+  <table>
+    <tr>
+      <th>Name</th>
+      <td><b>${owner.firstName} ${owner.lastName}</b></td>
+    </tr>
+    <tr>
+      <th>Address</th>
+      <td>${owner.address}</td>
+    </tr>
+    <tr>
+      <th>City</th>
+      <td>${owner.city}</td>
+    </tr>
+    <tr>
+      <th>Telephone </th>
+      <td>${owner.telephone}</td>
+    </tr>
+  </table>
+  <table class="table-buttons">
+    <tr>
+      <td colspan="2" align="center">
+        <spring:url value="{ownerId}/edit" var="editUrl">
+        	<spring:param name="ownerId" value="${owner.id}" />
+        </spring:url>
+        <a href="${fn:escapeXml(editUrl)}">Edit Owner</a>
+      </td>
+      <td>
+        <spring:url value="{ownerId}/pets/new" var="addUrl">
+        	<spring:param name="ownerId" value="${owner.id}" />
+        </spring:url>
+        <a href="${fn:escapeXml(addUrl)}">Add New Pet</a>
+      </td>
+    </tr>
+  </table>
+
+  <h2>Pets and Visits</h2>
+
+  <c:forEach var="pet" items="${owner.pets}">
+    <table width="94%">
+      <tr>
+        <td valign="top">
+          <table>
+            <tr>
+              <th>Name</th>
+              <td><b>${pet.name}</b></td>
+            </tr>
+            <tr>
+              <th>Birth Date</th>
+              <td><fmt:formatDate value="${pet.birthDate}" pattern="yyyy-MM-dd"/></td>
+            </tr>
+            <tr>
+              <th>Type</th>
+              <td>${pet.type.name}</td>
+            </tr>
+          </table>
+        </td>
+        <td valign="top">
+          <table>
+            <thead>
+              <th>Visit Date</th>
+              <th>Description</th>
+            </thead>
+            <c:forEach var="visit" items="${pet.visits}">
+              <tr>
+                <td><fmt:formatDate value="${visit.date}" pattern="yyyy-MM-dd"/></td>
+                <td>${visit.description}</td>
+              </tr>
+            </c:forEach>
+          </table>
+        </td>
+      </tr>
+    </table>
+    <table class="table-buttons">
+      <tr>
+        <td>
+          <spring:url value="{ownerId}/pets/{petId}/edit" var="petUrl">
+            <spring:param name="ownerId" value="${owner.id}"/>
+            <spring:param name="petId" value="${pet.id}"/>
+          </spring:url>
+          <a href="${fn:escapeXml(petUrl)}">Edit Pet</a>
+        </td>
+        <td></td>
+        <td>
+          <spring:url value="{ownerId}/pets/{petId}/visits/new" var="visitUrl">
+            <spring:param name="ownerId" value="${owner.id}"/>
+            <spring:param name="petId" value="${pet.id}"/>
+          </spring:url>
+          <a href="${fn:escapeXml(visitUrl)}">Add Visit</a>
+        </td>
+        <td></td>
+        <td>
+          <spring:url value="{ownerId}/pets/{petId}/visits.atom" var="feedUrl">
+            <spring:param name="ownerId" value="${owner.id}"/>
+            <spring:param name="petId" value="${pet.id}"/>
+          </spring:url>
+          <a href="${fn:escapeXml(feedUrl)}" rel="alternate" type="application/atom+xml">Atom Feed</a>
+        </td>
+      </tr>
+    </table>
+  </c:forEach>
+  
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/pets/form.jsp b/src/main/webapp/WEB-INF/jsp/pets/form.jsp
new file mode 100644
index 00000000..459ec63b
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/pets/form.jsp
@@ -0,0 +1,56 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+<c:choose>
+	<c:when test="${pet.new}"><c:set var="method" value="post"/></c:when>
+	<c:otherwise><c:set var="method" value="put"/></c:otherwise>
+</c:choose>
+
+<h2><c:if test="${pet.new}">New </c:if>Pet</h2>
+
+<b>Owner:</b> ${pet.owner.firstName} ${pet.owner.lastName}
+<br/>
+<form:form modelAttribute="pet" method="${method}">
+  <table>
+    <tr>
+      <th>
+        Name: <form:errors path="name" cssClass="errors"/>
+        <br/>
+        <form:input path="name" size="30" maxlength="30"/>
+      </th>
+    </tr>
+    <tr>
+      <th>
+        Birth Date: <form:errors path="birthDate" cssClass="errors"/>
+        <br/>
+        <form:input path="birthDate" size="10" maxlength="10"/> (yyyy-mm-dd)
+      </th>
+    </tr>
+    <tr>
+      <th>
+        Type: <form:errors path="type" cssClass="errors"/>
+        <br/>
+        <form:select path="type" items="${types}"/>
+      </th>
+    </tr>
+    <tr>
+      <td>
+        <c:choose>
+          <c:when test="${pet.new}">
+            <p class="submit"><input type="submit" value="Add Pet"/></p>
+          </c:when>
+          <c:otherwise>
+            <p class="submit"><input type="submit" value="Update Pet"/></p>
+          </c:otherwise>
+        </c:choose>
+      </td>
+    </tr>
+  </table>
+</form:form>
+
+<c:if test="${!pet.new}">
+  <form:form method="delete">
+    <p class="submit"><input type="submit" value="Delete Pet"/></p>
+  </form:form>
+</c:if>    
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/pets/visitForm.jsp b/src/main/webapp/WEB-INF/jsp/pets/visitForm.jsp
new file mode 100644
index 00000000..b1207a00
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/pets/visitForm.jsp
@@ -0,0 +1,68 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+<h2><c:if test="${visit.new}">New </c:if>Visit:</h2>
+
+<form:form modelAttribute="visit">
+  <b>Pet:</b>
+  <table width="333">
+    <thead>
+      <th>Name</th>
+      <th>Birth Date</th>
+      <th>Type</th>
+      <th>Owner</th>
+    </thead>
+    <tr>
+      <td>${visit.pet.name}</td>
+      <td><fmt:formatDate value="${visit.pet.birthDate}" pattern="yyyy-MM-dd"/></td>
+      <td>${visit.pet.type.name}</td>
+      <td>${visit.pet.owner.firstName} ${visit.pet.owner.lastName}</td>
+    </tr>
+  </table>
+
+  <table width="333">
+    <tr>
+      <th>
+        Date:
+        <br/><form:errors path="date" cssClass="errors"/>
+      </th>
+      <td>
+        <form:input path="date" size="10" maxlength="10"/> (yyyy-mm-dd)
+      </td>
+    <tr/>
+    <tr>
+      <th valign="top">
+        Description:
+        <br/><form:errors path="description" cssClass="errors"/>
+      </th>
+      <td>
+        <form:textarea path="description" rows="10" cols="25"/>
+      </td>
+    </tr>
+    <tr>
+      <td colspan="2">
+        <input type="hidden" name="petId" value="${visit.pet.id}"/>
+        <p class="submit"><input type="submit" value="Add Visit"/></p>
+      </td>
+    </tr>
+  </table>
+</form:form>
+
+<br/>
+<b>Previous Visits:</b>
+<table width="333">
+  <tr>
+    <th>Date</th>
+    <th>Description</th>
+  </tr>
+  <c:forEach var="visit" items="${visit.pet.visits}">
+    <c:if test="${!visit.new}">
+      <tr>
+        <td><fmt:formatDate value="${visit.date}" pattern="yyyy-MM-dd"/></td>
+        <td>${visit.description}</td>
+      </tr>
+    </c:if>
+  </c:forEach>
+</table>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/uncaughtException.jsp b/src/main/webapp/WEB-INF/jsp/uncaughtException.jsp
new file mode 100644
index 00000000..e97fdf37
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/uncaughtException.jsp
@@ -0,0 +1,49 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+<h2/>Internal error</h2>
+<p/>
+
+<% 
+try {
+	// The Servlet spec guarantees this attribute will be available
+	Throwable exception = (Throwable) request.getAttribute("javax.servlet.error.exception"); 
+
+	if (exception != null) {
+		if (exception instanceof ServletException) {
+			// It's a ServletException: we should extract the root cause
+			ServletException sex = (ServletException) exception;
+			Throwable rootCause = sex.getRootCause();
+			if (rootCause == null)
+				rootCause = sex;
+			out.println("** Root cause is: "+ rootCause.getMessage());
+			rootCause.printStackTrace(new java.io.PrintWriter(out)); 
+		}
+		else {
+			// It's not a ServletException, so we'll just show it
+			exception.printStackTrace(new java.io.PrintWriter(out)); 
+		}
+	} 
+	else  {
+    	out.println("No error information available");
+	} 
+
+	// Display cookies
+	out.println("\nCookies:\n");
+	Cookie[] cookies = request.getCookies();
+	if (cookies != null) {
+    	for (int i = 0; i < cookies.length; i++) {
+      		out.println(cookies[i].getName() + "=[" + cookies[i].getValue() + "]");
+		}
+	}
+	    
+} catch (Exception ex) { 
+	ex.printStackTrace(new java.io.PrintWriter(out));
+}
+%>
+
+<p/>
+<br/>
+
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/vets.jsp b/src/main/webapp/WEB-INF/jsp/vets.jsp
new file mode 100644
index 00000000..cff2154f
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/vets.jsp
@@ -0,0 +1,31 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+<h2>Veterinarians:</h2>
+
+<table>
+  <thead>
+    <th>Name</th>
+    <th>Specialties</th>
+  </thead>
+  <c:forEach var="vet" items="${vets.vetList}">
+    <tr>
+      <td>${vet.firstName} ${vet.lastName}</td>
+      <td>
+	    <c:forEach var="specialty" items="${vet.specialties}">
+          ${specialty.name}
+        </c:forEach>
+        <c:if test="${vet.nrOfSpecialties == 0}">none</c:if>
+      </td>
+    </tr>
+  </c:forEach>
+</table>
+<table class="table-buttons">
+  <tr>
+    <td>
+      <a href="<spring:url value="/vets.xml" htmlEscape="true" />">View as XML</a>
+    </td>
+  </tr>
+</table>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/jsp/welcome.jsp b/src/main/webapp/WEB-INF/jsp/welcome.jsp
new file mode 100644
index 00000000..1b07c65c
--- /dev/null
+++ b/src/main/webapp/WEB-INF/jsp/welcome.jsp
@@ -0,0 +1,15 @@
+<%@ include file="/WEB-INF/jsp/includes.jsp" %>
+<%@ include file="/WEB-INF/jsp/header.jsp" %>
+
+<img src="<spring:url value="/static/images/pets.png" htmlEscape="true" />" align="right" style="position:relative;right:30px;">
+<h2><fmt:message key="welcome"/></h2>
+
+<ul>
+  <li><a href="<spring:url value="/owners/search" htmlEscape="true" />">Find owner</a></li>
+  <li><a href="<spring:url value="/vets" htmlEscape="true" />">Display all veterinarians</a></li>
+  <li><a href="<spring:url value="/static/html/tutorial.html" htmlEscape="true" />">Tutorial</a></li>
+</ul>
+
+<p>&nbsp;</p>
+
+<%@ include file="/WEB-INF/jsp/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/petclinic-servlet.xml b/src/main/webapp/WEB-INF/petclinic-servlet.xml
new file mode 100644
index 00000000..3c05fc30
--- /dev/null
+++ b/src/main/webapp/WEB-INF/petclinic-servlet.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	- DispatcherServlet application context for PetClinic's web tier.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
+		xmlns:oxm="http://www.springframework.org/schema/oxm"
+		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+				http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd">
+
+	<!--
+		- The controllers are autodetected POJOs labeled with the @Controller annotation.
+	-->
+	<context:component-scan base-package="org.springframework.samples.petclinic.web"/>
+
+	<!--
+		- The form-based controllers within this application provide @RequestMapping 
+		- annotations at the type level for path mapping URLs and @RequestMapping 
+		- at the method level for request type mappings (e.g., GET and POST). 
+		- In contrast, ClinicController - which is not form-based - provides 
+		- @RequestMapping only at the method level for path mapping URLs.
+		-
+		- DefaultAnnotationHandlerMapping is driven by these annotations and is 
+		- enabled by default with Java 5+.
+	-->
+	
+	<!--
+		- This bean processes annotated handler methods, applying PetClinic-specific PropertyEditors
+		- for request parameter binding. It overrides the default AnnotationMethodHandlerAdapter.
+	-->
+	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
+		<property name="webBindingInitializer">
+			<bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer"/>
+		</property>
+	</bean>
+
+	<!--
+		- This bean resolves specific types of exceptions to corresponding logical 
+		- view names for error views. The default behaviour of DispatcherServlet 
+		- is to propagate all exceptions to the servlet container: this will happen 
+		- here with all other types of exceptions.
+	-->
+	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
+		<property name="exceptionMappings">
+			<props>
+				<prop key="org.springframework.web.servlet.PageNotFound">pageNotFound</prop>
+				<prop key="org.springframework.dao.DataAccessException">dataAccessFailure</prop>
+				<prop key="org.springframework.transaction.TransactionException">dataAccessFailure</prop>
+			</props>
+		</property>
+	</bean>
+
+	<!--
+		- This view resolver delegates to the InternalResourceViewResolver and BeanNameViewResolver,
+		- and uses the requested media type to pick a matching view. When the media type is 'text/html',
+		- it will delegate to the InternalResourceViewResolver's JstlView, otherwise to the
+		- BeanNameViewResolver. Note the use of the expression language to refer to the contentType
+		- property of the vets view bean, setting it to 'application/vnd.springsource.samples.petclinic+xml'.
+	-->
+	<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
+		<property name="mediaTypes">
+			<map>
+				<entry key="xml" value="#{vets.contentType}"/>
+				<entry key="atom" value="#{visits.contentType}"/>
+			</map>
+		</property>
+		<property name="order" value="0"/>
+	</bean>
+	
+	<!--
+		- The BeanNameViewResolver is used to pick up the visits view name (below).
+		- It has the order property set to 2, which means that this will
+		- be the first view resolver to be used after the delegating content
+		- negotiating view resolver.
+	 -->
+	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1"/>
+	<!--
+
+		- This bean configures the 'prefix' and 'suffix' properties of
+		- InternalResourceViewResolver, which resolves logical view names
+		- returned by Controllers. For example, a logical view name of "vets"
+		- will be mapped to "/WEB-INF/jsp/vets.jsp".
+	-->
+	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/"
+			p:suffix=".jsp" p:order="2"/>
+
+	<!--
+		- The AtomView rendering a Atom feed of the visits
+	 -->
+	<bean id="visits" class="org.springframework.samples.petclinic.web.VisitsAtomView"/>
+
+	<bean id="vets" class="org.springframework.web.servlet.view.xml.MarshallingView">
+		<property name="contentType" value="application/vnd.springsource.samples.petclinic+xml"/>
+		<property name="marshaller" ref="marshaller"/>
+	</bean>
+
+	<oxm:jaxb2-marshaller id="marshaller">
+		<oxm:class-to-be-bound name="org.springframework.samples.petclinic.Vets"/>
+	</oxm:jaxb2-marshaller>
+
+	<!--
+		- Message source for this context, loaded from localized "messages_xx" files.
+		- Could also reside in the root application context, as it is generic,
+		- but is currently just used within PetClinic's web tier.
+	-->
+	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
+			p:basename="messages"/>
+
+</beans>
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..06a6a311
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+	<display-name>Spring PetClinic</display-name>
+
+	<description>Spring PetClinic sample application</description>
+
+	<!--
+		Key of the system property that should specify the root directory of this
+		web app. Applied by WebAppRootListener or Log4jConfigListener.
+	-->
+	<context-param>
+		<param-name>webAppRootKey</param-name>
+		<param-value>petclinic.root</param-value>
+	</context-param>
+	
+	
+
+	<!--
+		Location of the Log4J config file, for initialization and refresh checks.
+		Applied by Log4jConfigListener.
+	-->
+	<context-param>
+		<param-name>log4jConfigLocation</param-name>
+		<param-value>/WEB-INF/classes/log4j.properties</param-value>
+	</context-param>
+
+	<!--
+		- Location of the XML file that defines the root application context.
+		- Applied by ContextLoaderServlet.
+		-
+		- Can be set to:
+		- "/WEB-INF/applicationContext-hibernate.xml" for the Hibernate implementation,
+		- "/WEB-INF/applicationContext-jpa.xml" for the JPA one, or
+		- "/WEB-INF/applicationContext-jdbc.xml" for the JDBC one.
+	-->
+	<context-param>
+		<param-name>contextConfigLocation</param-name>
+
+		<param-value>/WEB-INF/applicationContext-jdbc.xml</param-value>
+		<!--
+		<param-value>/WEB-INF/applicationContext-hibernate.xml</param-value>
+		<param-value>/WEB-INF/applicationContext-jpa.xml</param-value>
+		-->
+
+		<!--
+			To use the JPA variant above, you will need to enable Spring load-time
+			weaving in your server environment. See PetClinic's readme and/or
+			Spring's JPA documentation for information on how to do this.
+		-->
+	</context-param>
+
+	<!--
+		- Configures Log4J for this web app.
+		- As this context specifies a context-param "log4jConfigLocation", its file path
+		- is used to load the Log4J configuration, including periodic refresh checks.
+		-
+		- Would fall back to default Log4J initialization (non-refreshing) if no special
+		- context-params are given.
+		-
+		- Exports a "web app root key", i.e. a system property that specifies the root
+		- directory of this web app, for usage in log file paths.
+		- This web app specifies "petclinic.root" (see log4j.properties file).
+	-->
+	<!-- Leave the listener commented-out if using JBoss -->
+	<!--
+	<listener>
+		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
+	</listener>
+	-->
+
+	<!--
+		- Loads the root application context of this web app at startup,
+		- by default from "/WEB-INF/applicationContext.xml".
+		- Note that you need to fall back to Spring's ContextLoaderServlet for
+		- J2EE servers that do not follow the Servlet 2.4 initialization order.
+		-
+		- Use WebApplicationContextUtils.getWebApplicationContext(servletContext)
+		- to access it anywhere in the web application, outside of the framework.
+		-
+		- The root context is the parent of all servlet-specific contexts.
+		- This means that its beans are automatically available in these child contexts,
+		- both for getBean(name) calls and (external) bean references.
+	-->
+	<listener>
+		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+	</listener>
+	
+	<!--
+	 - Map static resources to the default servlet
+	 - examples:
+	 -     http://localhost:8080/static/images/pets.png
+	 -     http://localhost:8080/static/styles/petclinic.css
+	-->
+	<servlet-mapping>
+		<servlet-name>default</servlet-name>
+		<url-pattern>/static/*</url-pattern>
+	</servlet-mapping>
+	
+	<!--
+		- Servlet that dispatches request to registered handlers (Controller implementations).
+		- Has its own application context, by default defined in "{servlet-name}-servlet.xml",
+		- i.e. "petclinic-servlet.xml".
+		-
+		- A web app can contain any number of such servlets.
+		- Note that this web app has a shared root application context, serving as parent
+		- of all DispatcherServlet contexts.
+	-->
+	<servlet>
+		<servlet-name>petclinic</servlet-name>
+		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+		<load-on-startup>2</load-on-startup>
+	</servlet>
+
+	<!--
+		- Maps the petclinic dispatcher to "*.do". All handler mappings in
+		- petclinic-servlet.xml will by default be applied to this subpath.
+		- If a mapping isn't a /* subpath, the handler mappings are considered
+		- relative to the web app root.
+		-
+		- NOTE: A single dispatcher can be mapped to multiple paths, like any servlet.
+	-->
+	<servlet-mapping>
+		<servlet-name>petclinic</servlet-name>
+		<url-pattern>/</url-pattern>
+	</servlet-mapping>
+
+    <filter>
+        <filter-name>httpMethodFilter</filter-name>
+        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>httpMethodFilter</filter-name>
+        <servlet-name>petclinic</servlet-name>
+    </filter-mapping>
+    
+	<session-config>
+		<session-timeout>10</session-timeout>
+	</session-config>
+
+	<error-page>
+		<exception-type>java.lang.Exception</exception-type>
+		<!-- Displays a stack trace -->
+		<location>/WEB-INF/jsp/uncaughtException.jsp</location>
+	</error-page>
+
+	<!--
+		- Reference to PetClinic database.
+		- Only needed if not using a local DataSource but a JNDI one instead.
+	-->
+	<!--
+	<resource-ref>
+		<res-ref-name>jdbc/petclinic</res-ref-name>
+		<res-type>javax.sql.DataSource</res-type>
+		<res-auth>Container</res-auth>
+	</resource-ref>
+	-->
+	
+</web-app>
diff --git a/src/main/webapp/html/tutorial.html b/src/main/webapp/html/tutorial.html
new file mode 100644
index 00000000..acc261fb
--- /dev/null
+++ b/src/main/webapp/html/tutorial.html
@@ -0,0 +1,1153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+	<title>The Spring PetClinic Application</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+	<link rel="stylesheet" href="../styles/petclinic.css" type="text/css">
+</head>
+
+<body>
+
+<div id="main">
+
+	<h1>The Spring PetClinic Application</h1>
+
+   <!--
+   <table class="updated">
+   <tr><td>Updated:</td><td>25.NOV.2009</td><td>Costin Leau(<strong>Work In Progress: not yet fully updated regarding Spring 3.0</strong>)</td></tr>
+	<tr><td></td><td>11.OCT.2009</td><td>Sam Brannen</td></tr>
+	<tr><td></td><td>21.OCT.2007</td><td>Sam Brannen</td></tr>
+	<tr><td></td><td>30.JUN.2006</td><td>Costin Leau</td></tr>
+	<tr><td></td><td>01.DEC.2004</td><td>Ken Krebs</td></tr>
+	<tr><td></td><td>16.AUG.2003</td><td>Ken Krebs</td></tr>
+	</table>
+    -->
+
+<!-- === INTRODUCTION ====================================================== -->
+	<h2>Introduction</h2>
+
+	<p>
+		The Spring Framework is a collection of small, well-focused, loosely coupled Java
+		frameworks that can be used independently or collectively to build
+		industrial strength applications of many different types. The PetClinic
+		sample application is designed to show how the Spring
+		application frameworks can be used to build simple, but powerful
+		database-oriented applications. It will demonstrate the use
+		of Spring's core functionality:
+	</p>
+
+	<ul>
+	  <li>JavaBeans based application configuration using Inversion-Of-Control</li>
+	  <li>Model-View-Controller web Presentation Layer</li>
+	  <li>Practical database access through JDBC, Hibernate, or Java Persistence API</li>
+	  <li>Application monitoring based on JMX</li>
+	  <li>Declarative Transaction Management using AOP</li>
+	  <li>Data Validation that supports but is not dependent on the Presentation Layer</li>
+	</ul>
+
+	<p>
+		The Spring frameworks provide a great deal of useful infrastructure to
+		simplify the tasks faced by application developers. This infrastructure
+		helps developers to create applications that are:
+	</p>
+
+	<ul>
+	  <li>
+	  	<span style="font-weight: bold; text-decoration: underline;">concise</span>
+		by handling a lot of the complex control flow that is needed to use the
+		Java API's, such as JDBC, JNDI, JTA, RMI, and EJB.
+	  </li>
+	  <li>
+	  	<span style="font-weight: bold; text-decoration: underline;">flexible</span>
+		by simplifying the process of external application configuration
+		through the use of Reflection and JavaBeans. This allows the developer to
+		achieve a clean separation of configuration data from application code.
+		All application and web application objects, including validators,
+		workflow controllers, and views, are JavaBeans that can be configured
+		externally.</li>
+	  <li>
+	  	<span style="font-weight: bold; text-decoration: underline;">testable</span>
+		by supplying an interface based design to maximize pluggability. This
+		facilitates unit testing of Business Logic without requiring the
+		presence of application or live database servers.</li>
+	  <li>
+	  	<span style="font-weight: bold; text-decoration: underline;">maintainable</span>
+		by facilitating a clean separation of the application layers. It most
+		importantly helps maintain the independence of the Business Layer
+		from the Presentation layer. PetClinic demonstrates the use of a
+		Model-View-Controller
+		based web presentation framework that can work seamlessly with many
+		different types of view technologies. The Spring web application
+		framework helps developers to implement their Presentation as a clean
+		and thin layer focused on its main missions of translating user actions
+		into application events and rendering model data.</li>
+	</ul>
+
+	<p>
+		It is assumed that users of this tutorial will have a basic knowledge
+		of object-oriented design, Java, Servlets, JSP, and relational
+		databases. It also assumes a basic knowledge of the use of a Java EE web
+		application container.
+	</p>
+
+	<p>
+		Since the purpose of the sample application is tutorial in nature, the
+		implementation presented here will of course provide only a small
+		subset of the functionality that would be needed by a real world version of a
+		PetClinic application.
+	</p>
+
+<!-- === REQUIREMENTS ====================================================== -->
+	<h2>PetClinic Sample Application Requirements</h2>
+
+	<p>
+		The application requirement is for an information system that is
+		accessible through a web browser. The users of the application are
+		employees of the clinic who in the course of their work need to view
+		and manage information regarding the veterinarians, the clients, and their
+		pets. The sample application supports the following:
+	</p>
+
+	<h3>Use Cases</h3>
+	<ul>
+	  <li>View a list of veterinarians and their specialties</li>
+	  <li>View information pertaining to a pet owner</li>
+	  <li>Update the information pertaining to a pet owner</li>
+	  <li>Add a new pet owner to the system</li>
+	  <li>View information pertaining to a pet</li>
+	  <li>Update the information pertaining to a pet</li>
+	  <li>Add a new pet to the system</li>
+	  <li>View information pertaining to a pet's visitation history</li>
+	  <li>Add information pertaining to a visit to the pet's visitation history</li>
+	</ul>
+
+	<h3>Business Rules</h3>
+	<ol>
+	  <li>An owner may not have multiple pets with the same case-insensitive name.</li>
+	</ol>
+
+<!-- === DESIGN AND IMPLEMENTATION ========================================= -->
+	<h2>PetClinic Sample Application Design &amp; Implementation</h2>
+
+	<h3>Server Technology</h3>
+	<p>
+		The sample application should be usable with any Java EE web application
+		container that is compatible with the Servlet 2.4 and JSP 2.0
+		specifications. Some of the deployment files provided are designed
+		specifically for Apache Tomcat. These files specify container-supplied
+		connection-pooled data sources. It is not necessary to use these files.
+		The application has been configured by default to use a data source
+		with connection pooling. Configuration details are
+		provided in the Developer Instructions section. The view technologies
+		that are to be used for rendering the application are Java Server Pages
+		(JSP) along with the Java Standard Tag Library (JSTL).
+	</p>
+
+	<h3>Database Technology</h3>
+	<p>
+		The sample application uses a relational database for data storage.
+		Support has been provided for a choice of 1 of 2 database selections,
+		MySql or HypersonicSQL. HypersonicSQL version 1.8.0 is the default
+		choice. It is possible to
+		easily configure the application to use either database. Configuration
+		details are provided in the Developer Instructions section.
+	</p>
+
+	<h3>Development Environment</h3>
+	<p>
+		A copy of the Spring runtime library jar file is provided with the
+		sample application along with some of the other required jar files. The
+		developer will need to obtain the following tools externally, all of
+		which are freely available:
+	</p>
+
+	<ul>
+	  <li>Java SDK 1.5.x</li>
+	  <li>Maven  2.0.10+</li>
+	  <li>Ant  1.7.1 (for executing scripts, if needed, against the in-memory database)</li>
+	  <li>Tomcat 6.x.x, or some other Java Servlet container</li>
+	  <li>(Optional) MySQL 5.x with MySQL Connector/J 5.x</li>
+	</ul>
+
+	<p>
+		<strong>NOTE:</strong> The version numbers listed are those that were used
+		in the development of the PetClinic application. Other versions of the same
+		tools may or may not work.
+	</p>
+
+	<p>
+		Download links for the various tools needed are provided in the Developer
+		Instructions section.
+	</p>
+
+	<h3>PetClinic Database</h3>
+	<p>
+		The following is an overview of the database schema used in PetClinic.
+		Detailed field descriptions can be found in the
+		<span style="font-weight: bold; font-style: italic;">"initDB.txt"</span>
+		SQL script files in the database-specific "db" sub-directories. All "id" key
+		fields are of Java type <span style="font-weight: bold; font-style: italic;">int</span>.
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">owners</span><br>
+		&nbsp;&nbsp;&nbsp; PRIMARY KEY <span style="font-weight: bold;">id</span>
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">types</span><br>
+		&nbsp;&nbsp;&nbsp; PRIMARY KEY <span style="font-weight: bold;">id</span>
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">pets</span><br>
+		&nbsp;&nbsp;&nbsp; PRIMARY KEY <span style="font-weight: bold;">id</span><br>
+		&nbsp;&nbsp;&nbsp; FOREIGN KEY <span style="font-weight: bold;">type_id</span>
+		references the <span style="font-weight: bold; font-style: italic;">types</span>
+		table<span style="font-weight: bold;"> id</span> field<br>
+		&nbsp;&nbsp;&nbsp; FOREIGN KEY <span style="font-weight: bold;">owner_id</span>
+		references the <span style="font-weight: bold; font-style: italic;">owners</span>
+		table <span style="font-weight: bold;">id</span> field
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">vets</span><br>
+		&nbsp;&nbsp;&nbsp; PRIMARY KEY <span style="font-weight: bold;">id</span>
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">specialties</span><br>
+		&nbsp;&nbsp;&nbsp; PRIMARY KEY <span style="font-weight: bold;">id</span><br>
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">vet_specialties</span> -
+		a link table for <span style="font-weight: bold; font-style: italic;">vets</span>
+		and their <span style="font-weight: bold; font-style: italic;">specialties</span><br>
+		&nbsp;&nbsp;&nbsp; FOREIGN KEY <span style="font-weight: bold;">vet_id</span>
+		references the <span style="font-weight: bold; font-style: italic;">vets</span>
+		table<span style="font-weight: bold;"> id</span> field<br>
+		&nbsp;&nbsp;&nbsp; FOREIGN KEY <span style="font-weight: bold;">specialty_id</span>
+		references the <span style="font-weight: bold; font-style: italic;">specialties</span>
+		table <span style="font-weight: bold;">id</span> field
+	</p>
+
+	<p>
+		TABLE: <span style="font-weight: bold; font-style: italic;">visits</span><br>
+		&nbsp;&nbsp;&nbsp; PRIMARY KEY <span style="font-weight: bold;">id</span><br>
+		&nbsp;&nbsp;&nbsp; FOREIGN KEY <span style="font-weight: bold;">pet_id</span>
+		references the <span style="font-weight: bold; font-style: italic;">pets</span>
+		table <span style="font-weight: bold;">id</span> field
+	</p>
+
+	<h3>Directory Structure</h3>
+
+	<p>
+		d-- indicates a directory holding source code, configuration files, etc.<br>
+		D-- indicates a directory that is created by the build script
+	</p>
+
+	<p>
+		d-- <span style="font-weight: bold; font-style: italic;">petclinic</span>:
+		the root directory of the project contains build related files<br>
+
+		&nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">src</span>: contains
+		Java source code files and ORM configuration files<br>
+
+		&nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">war</span>: contains
+		the web application resource files<br>
+
+		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">html</span>: contains
+		tutorial files<br>
+
+		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D-- <span style="font-weight: bold; font-style: italic;">docs</span>: contains
+		Javadoc files<br>
+
+		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">web-inf</span>:
+		contains web application configuration files and application context
+		files<br>
+
+		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+		d-- <span style="font-weight: bold; font-style: italic;">jsp</span>:
+		contains Java Server Page files<br>
+
+		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+		D--<span style="font-weight: bold;"> <span style="font-style: italic;">lib</span></span>:
+		contains application dependencies<br>
+
+		&nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">test</span>: contains
+		testing related
+		Java source code files<br>
+
+		&nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">db</span>: contains
+		database SQL scripts and other related files/directories<br>
+
+		&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">hsqldb</span>:
+		contains files related to HSQL, contains scripts and a&nbsp;Tomcat
+		context definition file<br>
+
+		&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; d-- <span style="font-weight: bold; font-style: italic;">mysql</span>:
+		contains files related to MySQL, contains scripts and a Tomcat context
+		definition file<br>
+
+		&nbsp;&nbsp;&nbsp; D-- <span style="font-weight: bold; font-style: italic;">.classes</span>:
+		contains compiled Java class files<br>
+
+		&nbsp;&nbsp;&nbsp; D-- <span style="font-weight: bold; font-style: italic;">.testclasses</span>:
+		contains compiled testing related Java class files<br>
+
+		&nbsp;&nbsp;&nbsp; D-- <span style="font-weight: bold; font-style: italic;">junit-reports</span>:
+		contains generated xml-formatted test reports<br>
+
+		&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; D-- <span style="font-weight: bold; font-style: italic;">reports/html</span>:
+		contains generated html-formatted test reports<br>
+
+		&nbsp;&nbsp;&nbsp; D-- <span style="font-weight: bold; font-style: italic;">dist</span>: contains
+		packaged archives of files
+	</p>
+
+<!-- === DESIGN ============================================================ -->
+	<h2>PetClinic Application Design</h2>
+
+	<h3>Logging</h3>
+	<p>
+		Spring supports the use of the Apache Commons Logging API. This API
+		provides the ability to use Java 1.4 loggers, the simple Commons loggers,
+		and Apache log4j loggers. PetClinic uses log4j to provide sophisticated
+		and configurable logging capabilities. The file,
+		<span style="font-weight: bold; font-style: italic;">src/main/resources/log4j.properties</span>
+		configures the definition of <strong>log4j</strong>loggers.
+	</p>
+
+	<h3>Business Layer</h3>
+	<p>
+		The Business Layer consists of a number of basic JavaBean classes
+		representing the application domain objects and associated validation
+		objects that are used by the Presentation Layer. The validation objects
+		used in PetClinic are all implementations of the
+		<strong>org.springframework.validation.Validator</strong> interface.
+	</p>
+
+	<ul>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Entity</span>
+		is a simple JavaBean superclass used for all persistable objects.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.NamedEntity</span>
+		is an extension of <span style="font-weight: bold;">Entity</span> that adds a name property.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Specialty</span>
+		is an extension of <span style="font-weight: bold;">NamedEntity</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.PetType</span>
+		is an extension of <span style="font-weight: bold;">NamedEntity</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Person</span> is
+		an extension of <span style="font-weight: bold;">Entity</span> that provides a superclass for all objects that
+		implement the notion of a person.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Vet</span> is
+		an extension of <span style="font-weight: bold;">Person</span> that implements a
+		veterinarian. It holds a <span style="font-weight: bold;">List</span> of
+		specialties that the <span style="font-weight: bold;">Vet</span> is capable of.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Owner</span>
+		is an extension of <span style="font-weight: bold;">Person</span> that implements a pet owner.
+		It holds a <span style="font-weight: bold;">List</span> of pets owned.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Pet</span>
+		is an extension of <span style="font-weight: bold;">NamedEntity</span> that
+		implements a pet. It holds a <span style="font-weight: bold;">List</span> of
+		visits made concerning the pet.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.Visit</span>
+		is a simple JavaBean that implements the notion of a clinic visit
+		for a pet. </li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.util.EntityUtils</span>
+	  	provides utility methods for handling entities.</li>
+	</ul>
+
+	<ul>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.validation.OwnerValidator</span>
+		is a Spring <span style="font-weight: bold;">Validator</span> that
+		verifies correct data entry for the Add and Edit Owner forms.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.validation.PetValidator</span>
+		is a Spring <span style="font-weight: bold;">Validator</span> that
+		verifies correct data entry for the Add and Edit Pet forms.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.validation.VisitValidator</span>
+		is a Spring <span style="font-weight: bold;">Validator</span> that
+		verifies correct data entry for the AddVisit form.</li>
+	</ul>
+
+	<h3>Business / Persistence Layer</h3>
+
+	<p>
+		Since the PetClinic application is all about database access and there is
+		very little business logic in the application outside of that, there is
+		no separation of the primary Business and Persistence Layer API's.
+		While this design technique should not be used for an application with more
+		complex business logic, it is acceptable here because all of the
+		non-persistence related business rules have been implemented in
+		business objects and have not leaked into the Persistence Layer. The most
+		important facet of the design is that the Business and Persistence
+		Layers are <strong>COMPLETELY</strong> independent of the Presentation Layer.
+	</p>
+
+	<p>
+		The Persistence Layer can be configured to use either HSQL or MySQL
+		with any one of the following data access technologies aided by
+		infrastructure provided by Spring:
+	</p>
+
+	<ul>
+	  <li>JDBC</li>
+	  <li>Hibernate 3</li>
+	  <li>Java Persistence API</li>
+	</ul>
+
+	<p>
+		<span style="font-weight: bold;">NOTE:</span> Spring also provides
+		infrastructure for using other
+		<strong>O</strong>bject/<strong>R</strong>elational <strong>M</strong>apping
+		frameworks such as JDO and iBATIS SqlMaps, but these are not demonstrated in PetClinic.
+		(See the 'jpetstore' sample application that ships with the full Spring Framework
+		distribution for an example of using iBatis and Spring.)
+	</p>
+
+	<p>
+		One of the key elements provided by Spring is the use of a common set
+		of meaningful data access exceptions that can be used regardless of
+		which database or access strategy is used. All of these exceptions
+		derive from <strong>org.springframework.dao.DataAccessException</strong>.
+		Since most exceptions encountered during database access are indicative
+		of programming errors, <strong>DataAccessException</strong> is an
+		abstract <strong>RuntimeException</strong> whose derivatives only need
+		to be caught by application code to handle recoverable errors when it
+		makes sense to do so. This greatly simplifies application code compared
+		to, for example, code using JDBC directly where <strong>SqlExceptions</strong>
+		must be caught and database specific error codes must be decoded.
+		Examination of the PetClinic source code will show that the
+		persistence-oriented code is completely focused on the relevant
+		transfer of data to/from the referenced objects without extraneous
+		error handling.
+	</p>
+
+	<p>
+		The high-level business/persistence API for PetClinic is the
+		<span style="font-weight: bold;">org.springframework.samples.petclinic.Clinic</span>
+		interface. Each persistence strategy in PetClinic is a different implementation of the
+		<span style="font-weight: bold;">Clinic</span> interface. In each case, the
+		<span style="font-weight: bold;">Clinic</span> implementation is fronted by
+		a transactional proxy, configured via the
+		<span style="font-weight: bold;">@Transactional</span> annotation, that also
+		implements <span style="font-weight: bold;">Clinic</span>. These objects
+		are standard Java dynamic proxies which are created by an instance of
+		<span style="font-weight: bold;">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span>.
+		These proxies are configured in the respective application context file
+		via <strong>&lt;tx:annotation-driven /&gt;</strong> and specify that all
+		<span style="font-weight: bold;">Clinic</span> methods are run in a
+		transactional context. The transaction managers used in PetClinic are all
+		implementations of the
+		<span style="font-weight: bold;">org.springframework.transaction.PlatformTransactionManager</span>
+		interface. All of the implementations are by default configured
+		to use a local <span style="font-weight: bold;">DataSource</span> that
+		will work in any environment through the use of an instance of
+		<span style="font-weight: bold;">org.springframework.jdbc.datasource.DriverManagerDataSource</span>.
+		While this is appropriate for use in a demo or single user
+		program, a connection pooling <span style="font-weight: bold;">DataSource</span>,
+		such as an instance of <span style="font-weight: bold;">org.apache.commons.dbcp.BasicDataSource</span>,
+		is more appropriate for use in a multi-user application. Another
+		alternative is to obtain one through the Java EE environment
+		using an instance of
+		<span style="font-weight: bold;">org.springframework.jndi.JndiObjectFactoryBean</span>.
+	</p>
+
+	<h3>JDBC Clinic Implementation</h3>
+	<p>
+		Spring provides a number of high-level database
+		access convenience classes in the package
+		<span style="font-weight: bold;">org.springframework.jdbc.object</span>.
+		These classes and the lower-level Spring classes that they use in the
+		<span style="font-weight: bold;">org.springframework.jdbc.core</span> package
+		provide a higher level of abstraction for using JDBC that keeps the developer
+		from having to correctly implement the handling of the checked
+		<span style="font-weight: bold;">SqlExceptions</span> with ugly error-prone
+		nested try-catch-finally blocks. Using the classes in this package
+		allows the developer to focus efforts on the functionality being
+		implemented rather than the mechanics of error handling. When using
+		these classes, it is the responsibility of the developer to provide the
+		SQL needed and to map the parameters to/from the respective domain
+		object. This typically is done by extending one of the
+		<span style="font-weight: bold;">org.springframework.jdbc.object</span> classes,
+		initializing its SQL, and overriding a method that takes care of
+		the mapping. In this way, the developer gets to focus on implementing
+		functionality rather than application plumbing. These classes also
+		take care of closing connections to prevent hard to find resource
+		leakage problems. It should be noted that instances of these classes
+		are lightweight, reusable, and threadsafe.
+	</p>
+
+	<p>
+		The JDBC implementation of the Clinic interface is
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.jdbc.SimpleJdbcClinic</span>,
+		which uses Java 5 language features,
+		<strong>org.springframework.jdbc.core.simple.SimpleJdbcTemplate</strong>, and
+		<strong>org.springframework.jdbc.core.simple.SimpleJdbcInsert</strong>.
+		It also takes advantage of classes like
+		<strong>org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource</strong> and
+		<strong>org.springframework.jdbc.core.simple.ParameterizedBeanPropertyRowMapper</strong>
+		which provide automatic mapping between JavaBean properties and JDBC
+		parameters or query results. SimpleJdbcClinic is a rewrite of the
+		AbstractJdbcClinic which was the base class for JDBC implementations of
+		the Clinic interface for Spring 2.0.
+	</p>
+
+	<p>
+		The transaction manager used in the JDBC Clinic Implementation is an
+		instance of <span style="font-weight: bold;">org.springframework.jdbc.datasource.DataSourceTransactionManager</span>
+		that can be used for local transactions.
+	</p>
+
+	<h3>Hibernate 3 Clinic Implementation</h3>
+	<p>
+		The Hibernate 3 implementation of the <span style="font-weight: bold;">Clinic</span>
+		interface is
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.hibernate.HibernateClinic</span>.
+		To simplify using Hibernate, Spring provides the
+		<span style="font-weight: bold;">org.springframework.orm.hibernate3.LocalSessionFactoryBean</span>.
+		The Hibernate configuration is provided by the file <span style="font-style: italic;">src/main/resources/petclinic.hbm.xml</span>.
+	</p>
+
+	<h3>Java Persistence API (JPA) Clinic Implementation</h3>
+	<p>
+		The JPA implementation of the <span style="font-weight: bold;">Clinic</span>
+		interface is
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.jpa.EntityManagerClinic</span>,
+		which is based on native JPA usage combined with Spring's
+		<span style="font-weight: bold;">@Repository</span> and
+		<span style="font-weight: bold;">@Transactional</span> annotations but
+		otherwise has no dependencies on any Spring API's.
+		To simplify JPA usage, Spring provides (among other classes) the
+		<span style="font-weight: bold;">org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean</span>.
+		The JPA configuration is provided by
+		<span style="font-style: italic;">src/main/resources/META-INF/orm.xml</span> and
+		<span style="font-style: italic;"> src/main/resources/META-INF/persistence.xml.</span>
+	</p>
+
+	<h3>ApplicationContext</h3>
+	<p>
+		A Spring <span style="font-weight: bold;">org.springframework.context.ApplicationContext</span> object
+		provides a map of user-defined JavaBeans that specify either a singleton
+		object or the initial construction of prototype instances. These beans
+		constitute the <span style="font-weight: bold;">Business/Persistence
+		Layer</span> of PetClinic. The following beans are defined in all 3
+		versions (1 per access strategy) of the PetClinic
+		<span style="font-style: italic;">src/main/webapp/WEB-INF/applicationContext-*.xml</span>
+		file:
+	</p>
+
+	<ol>
+	  <li>A <span style="font-weight: bold; font-style: italic;">PropertyPlaceholderConfigurer</span>,
+	    which is configured via
+	    <strong>&lt;context:property-placeholder ... /&gt;</strong> and
+	    is a singleton bean that replaces ${...} placeholders with values from a
+		properties file, in this case, JDBC-related settings for the
+		<span style="font-weight: bold; font-style: italic;">dataSource</span> bean
+		described below
+		(see <span style="font-weight: bold; font-style: italic;">src/main/resources/jdbc.properties</span>).
+	  </li>
+	  <li><span style="font-weight: bold; font-style: italic;">dataSource</span>,
+		which is a singleton bean that defines the implementation of the source
+		of database connections used by the application.
+	  </li>
+	  <li><span style="font-weight: bold; font-style: italic;">transactionManager</span>,
+		which is a singleton bean that defines the implementation of the transaction
+		management strategy for the application.
+	  </li>
+	  <li><span style="font-weight: bold; font-style: italic;">clinic</span>,
+		which is a singleton bean that defines the implementation of the
+		<span style="font-weight: bold;">Clinic</span> interface that provides the
+		primary Business Layer API of the application.
+	  </li>
+	</ol>
+
+	<h3>Presentation Layer</h3>
+	<p>
+		The Presentation Layer is implemented as a Java EE Web Application and
+		provides a very thin and concise Model-View-Controller type user
+		interface to the Business and Persistence Layers.
+	</p>
+
+	<p>
+		The PetClinic web application is configured via the following files:
+	</p>
+
+	<ul>
+	  <li><span style="font-weight: bold; font-style: italic;">src/main/webapp/WEB-INF/web.xml</span>:
+		the web application configuration file.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">src/main/webapp/WEB-INF/petclinic-servlet.xml</span>:
+		configures the petclinic dispatcher servlet and the other controllers
+		and forms that it uses. The beans defined in this file reference the
+		Business/Persistence Layer beans defined in
+		<span style="font-style: italic;">applicationContext-*.xml.</span></li>
+	  <li><span style="font-weight: bold; font-style: italic;">src/main/resources/messages*.properties</span>:
+		configures the definition of internationalizable message resources.</li>
+	</ul>
+
+	<p>
+		Examine the comments provided in each of these files for a more
+		in-depth understanding of the details of how the application is
+		configured.
+	</p>
+
+	<h3>General</h3>
+
+	<ul>
+	  <li>In <span style="font-weight: bold; font-style: italic;">web.xml</span>,
+		a context-param, "<span style="font-weight: bold;">webAppRootkey</span>",
+		provides the key for a system property that specifies the root directory
+		for the web application. This parameter,
+		<span style="font-weight: bold;">"petclinic.root"</span>, can be used to aid
+		in configuring the application.</li>
+	  <li>In <span style="font-weight: bold; font-style: italic;">web.xml</span>,
+		a <span style="font-weight: bold;">org.springframework.web.context.ContextLoaderListener</span>
+		is defined that loads the root <span style="font-weight: bold;">ApplicationContext</span>
+		object of this webapp at startup, by default from the designated
+		<span style="font-weight: bold; font-style: italic;">/WEB-INF/applicationContext-*.xml</span>.
+		The root <span style="font-weight: bold;">org.springframework.web.context.WebApplicationContext</span>
+		of PetClinic is an instance of
+		<span style="font-weight: bold;">org.springframework.web.context.support.XmlWebApplicationContext</span>
+		and is the parent of all servlet-specific <span style="font-weight: bold;">ApplicationContexts</span>.
+		The Spring root <span style="font-weight: bold;">ApplicationContext</span> object
+		provides a map of user-defined JavaBeans that can be used in any and
+		all layers of the application. Beans defined in the root
+		<span style="font-weight: bold;">ApplicationContext</span> are automatically
+		available in all child <span style="font-weight: bold;">ApplicationContext</span>
+		objects as (external) bean references. Beans defined in an
+		<span style="font-weight: bold;">ApplicationContext</span> can also be
+		accessed directly by Java code through
+		<span style="font-style: italic;">getBean(name)</span> method calls.
+	  </li>
+
+	  <li>In <span style="font-weight: bold; font-style: italic;">web.xml</span>,
+		a <span style="font-weight: bold;">Servlet</span> named
+		<span style="font-weight: bold;">"petclinic"</span> is specified to act as
+		a dispatcher for the entire application. This
+		<span style="font-weight: bold;">org.springframework.web.servlet.DispatcherServlet</span>
+		is used to handle all URL's matching the pattern <span style="font-weight: bold;">"*.do"</span>.
+		As with any <span style="font-weight: bold;">Servlet</span>, multiple URL mappings may
+		be defined. It is also possible to define multiple instances of
+		<span style="font-weight: bold;">DispatcherServlet</span>. Each
+		<span style="font-weight: bold;">DispatcherServlet</span> dispatches
+		requests to registered handlers (<span style="font-weight: bold;">Controller</span>
+		interface implementations or POJOs annotated with <strong>@Controller</strong>)
+		indirectly through a
+		<span style="font-weight: bold;">org.springframework.web.servlet.handler.HandlerMapping</span>
+		implementation. Each <span style="font-weight: bold;">DispatcherServlet</span>
+		has its own <span style="font-weight: bold;">ApplicationContext</span>,
+		by default defined in <span style="font-weight: bold;">"{servlet-name}-servlet.xml"</span>.
+		In this case, it is in the file <span style="font-weight: bold;">"petclinic-servlet.xml"</span>.
+		This <span style="font-weight: bold;">ApplicationContext</span> is
+		used to specify the various web application user interface beans and
+		the URL mappings that are used by the <span style="font-weight: bold;">DispatcherServlet</span>
+		to control the handling of requests.
+	  </li>
+	</ul>
+
+	<p>
+		The files <span style="font-weight: bold; font-style: italic;">web.xml</span> and
+		<span style="font-weight: bold; font-style: italic;">log4j.properties</span> specify
+		the configuration of logging in the system:
+	</p>
+
+	<ul>
+	  <li>In <span style="font-weight: bold; font-style: italic;">web.xml</span>,
+		a <span style="font-weight: bold;">"log4jConfigLocation"</span> context-param
+		is specified that sets the location of the
+		<span style="font-weight: bold;">log4j</span> configuration file. The
+		default location for this file is
+		<span style="font-weight: bold; font-style: italic;">/WEB-INF/classes/log4j.properties</span>.
+		Specifying this parameter explicitly allows the location to be changed
+		from the default and is also used to cause periodic
+		<span style="font-weight: bold;">log4j</span> configuration refresh checks.</li>
+	  <li>In <span style="font-weight: bold; font-style: italic;">web.xml</span>,
+		a <span style="font-weight: bold;">Log4jConfigListener</span> is
+		specified that will initialize <span style="font-weight: bold;">log4j</span> using
+		the specified configuration file when the web app starts. The
+		<span style="font-weight: bold;">Log4jConfigListener</span> is commented out
+		in the file because of a conflict when using JBoss. It should also be
+		noted that if the container initializes Servlets before Listeners as
+		some pre-Servlet 2.4 containers do, a <b>Log4jConfigServlet</b> should
+		be used instead.</li>
+	  <li>In <span style="font-weight: bold; font-style: italic;">log4j.properties</span>,
+		the following loggers are specified:
+		<ul>
+			<li><span style="font-weight: bold; font-style: italic;">"stdout"</span> provides
+				logging messages to the container's log file.</li>
+			<li><span style="font-weight: bold; font-style: italic;">"logfile"</span> provides
+				logging messages to a rolling file that is specified using the
+				previously defined "petclinic.root".</li>
+		</ul>
+	  </li>
+	</ul>
+
+	<p>
+		Examination and study of these logging files will provide insight into
+		the operation of the Spring framework and the application as well as
+		valuable troubleshooting information should something not work
+		correctly.
+	</p>
+
+	<h3>DispatcherServlet</h3>
+	<p>
+		The following beans are accessible to the
+		<span style="font-weight: bold;">DispatcherServlet</span> and are defined
+		in the PetClinic
+		<span style="font-weight: bold; font-style: italic;">petclinic-servlet.xml</span>
+		file. This dispatcher uses these definitions to delegate actual display
+		and form processing tasks to implementations of the Spring
+		<span style="font-weight: bold;">org.springframework.web.servlet.mvc.Controller</span>
+		interface. The <span style="font-weight: bold;">DispatcherServlet</span>
+		acts as the main application <span style="font-weight: bold;">Front Controller</span>
+		and is responsible for dispatching all requests to the appropriate
+		<span style="font-weight: bold;">Controller</span> indirectly through a URL
+		mapping handler. These <span style="font-weight: bold;">Controllers</span> are
+		responsible for the mechanics of interaction with the user and ultimately
+		delegate action to the Business/Persistence Layers.
+	</p>
+
+	<ul>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">messageSource</span>
+		is a singleton bean that defines a message source for this
+		<span style="font-weight: bold;">ApplicationContext</span>. Messages are
+		loaded from localized <span style="font-weight: bold;">"messages_xx"</span>
+		files in the classpath, such as
+		<span style="font-weight: bold; font-style: italic;">"/WEB-INF/classes/messages.properties"</span>
+		or <span style="font-weight: bold; font-style: italic;">"/WEB-INF/classes/messages_de.properties"</span>.
+		<span style="font-style: italic;">getMessage()</span> calls to this context
+		will use this source. Child contexts can have their own message sources,
+		which will inherit all messages from this source and are able to define new
+		messages and override ones defined in the primary message source.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">InternalResourceViewResolver</span>
+		is a singleton bean that defines the view mappings used by the dispatcher.
+		Specifically, logical view names returned by Controllers will be mapped to
+		physical paths using the configured 'prefix' and 'suffix' properties. For
+		example, a logical view name of "vets" will be mapped to "/WEB-INF/jsp/vets.jsp".
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">SimpleMappingExceptionResolver</span>
+		is a singleton bean that defines how exceptions are propagated. Exceptions
+		encountered that are not specified are propagated to the servlet container.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">&lt;context:component-scan ... /&gt;</span>
+		is used to autodetect the controllers in the
+		<strong>org.springframework.samples.petclinic.web</strong> package, which
+		are POJOs labeled with the <strong>@Controller</strong> annotation.
+		<ul>
+			<li>
+				<strong>ClinicController</strong> is a singleton, annotation-driven
+				<em>MultiActionController</em> that is used by the dispatcher to handle
+				non-form based display tasks. A method is provided to handle each
+				type of request that is supported.
+			</li>
+			<li>
+				In addition, there are 6 singleton, annotation-driven <em>Form</em> controllers,
+				which are used to handle the various Search, Add and Edit form processing
+				tasks for the dispatcher.
+			</li>
+	  	</ul>
+	  </li>
+	  <li>
+		The form-based controllers within the PetClinic application provide
+		<strong>@RequestMapping</strong> annotations at the type level for path
+		mapping URLs and @RequestMapping at the method level for request type
+		mappings (e.g., GET and POST). In contrast, <strong>ClinicController</strong>
+		&ndash; which is not form-based &ndash; provides  @RequestMapping only at
+		the method level for path mapping URLs.
+		<strong>DefaultAnnotationHandlerMapping</strong> is driven by these
+		annotations and is enabled by default with Java 5+.
+	  </li>
+	</ul>
+
+	<h3>Views</h3>
+	<p>
+		The <span style="font-weight: bold;">Controllers</span> used by the
+		dispatcher handle the work flow of the application. The actual display
+		tasks are delegated by the <span style="font-weight: bold;">Controllers</span>
+		to implementations of the Spring <span style="font-weight: bold;">View
+		</span>interface. These <span style="font-weight: bold;">View</span> objects are
+		themselves beans that can render a particular type of view. The
+		handling <span style="font-weight: bold;">Controller</span> supplies the
+		<span style="font-weight: bold;">View</span> with a data model to render.
+		The data model is provided to the <span style="font-weight: bold;">View</span>
+		as a <span style="font-weight: bold;">Map</span> of objects.
+		<span style="font-weight: bold;">Views</span> are only responsible for
+		rendering a display of the data model and performing any display logic
+		that is particular to the type of <span style="font-weight: bold;">View</span>
+		being rendered. Spring provides support for rendering many different types of
+		views: JSP, XSLT, PDF, Velocity templates, Excel files, and others. By
+		using a <span style="font-weight: bold;">View</span> mapping strategy,
+		Spring supplies the developer with a great deal of flexibility in supporting
+		easily configurable view substitution.
+	</p>
+	<p>
+		<strong>ClinicController</strong> relies on
+		<strong>RequestToViewNameTranslator</strong> to automatically infer the
+		logical view name from the incoming request URL; whereas, all <em>Form</em>
+		controllers in the PetClinic application return logical view names as Strings.
+		These logical view names are then mapped to physical paths via the
+		configured <strong>InternalResourceViewResolver</strong> (see the
+		DispatcherServlet section above for further details). Logical view names that
+		are prepended with <em>&quot;redirect:&quot;</em> will be resolved to instances
+		of <strong>RedirectView</strong>, which simply redirects to another URL.
+		The other resolved <strong>View</strong>s will be instances of
+		<strong>JstlView</strong>, which provides some handy support for
+		internationalization &amp; localization in JSP pages that use JSTL.
+	</p>
+
+	<h3>Messages</h3>
+	<p>
+		The <span style="font-weight: bold; font-style: italic;">messages*.properties</span>
+		files are loaded from the classpath to provide localized messages for
+		the supported languages. PetClinic supplies a localized
+		<strong>"welcome"</strong> message as well as localized form entry error
+		messages in the default (i.e., English) and German properties files.
+		See the "countries" sample application for a more detailed example of Spring's
+		support for internationalization.
+	</p>
+
+	<h3>Presentation Layer classes</h3>
+	<ul>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.ClinicController</span>
+		is an annotation-driven, POJO <em>MultiActionController</em>
+		that is used to handle simple display-oriented URLs.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.FindOwnersForm</span>
+		is an annotation-driven, POJO <em>Form</em> controller that is used to search for
+		<strong>Owner</strong>s by last name.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.AddOwnerForm</span>
+		is an annotation-driven, POJO <em>Form</em> controller that is used to add a new <strong>Owner</strong>
+		to the system.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.EditOwnerForm</span>
+		is an annotation-driven, POJO <em>Form</em> controller that is used to edit an existing <strong>Owner</strong>.
+		A copy of the existing <strong>Owner</strong> is used for editing.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.AddPetForm</span>
+		is an annotation-driven, POJO <em>Form</em> controller that is used to add a new <strong>Pet</strong>
+		to an existing <strong>Owner</strong>.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.EditPetForm</span>
+		is an annotation-driven, POJO <em>Form</em> controller that is used to edit an existing <strong>Pet</strong>.
+		A copy of the existing <strong>Pet</strong> is used for editing.
+	  </li>
+	  <li>
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.web.AddVisitForm</span>
+		is an annotation-driven, POJO <em>Form</em> controller that is used to add a new <strong>Visit</strong>
+		to an existing <strong>Pet</strong>.
+	  </li>
+	</ul>
+
+	<h3>Logical Views &amp; Implemented Use Cases</h3>
+
+	<ul>
+	  <li><span style="font-weight: bold; font-style: italic;">welcome</span> is
+		the "home" screen. It provides links to display a list of all vets,
+		find an owner, or view documentation.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">vets</span> displays
+		all vets and their specialties.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">findOwners</span>
+		is used to find owners by last name.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">findOwnersRedirect</span>
+		redirects to findOwner.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">selectOwner</span>
+		allows user to select from a list of multiple owners with the same last
+		name.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">owner</span> displays
+		a owner's data and a list of the owner's pets and their data.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">ownerRedirect</span>
+		redirects to owner.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">owner</span> supports
+		<span style="font-weight: bold; font-style: italic;">AddOwnerForm</span>
+		and <span style="font-weight: bold; font-style: italic;">EditOwnerForm</span></li>
+	  <li><span style="font-weight: bold; font-style: italic;">pet</span> supports
+	  	<span style="font-weight: bold; font-style: italic;">AddPetForm</span>
+		and <span style="font-weight: bold; font-style: italic;">web.EditPetForm</span></li>
+	  <li><span style="font-weight: bold; font-style: italic;">visit</span> supports
+	  	<span style="font-weight: bold; font-style: italic;">AddVisitForm</span></li>
+	  <li><span style="font-weight: bold; font-style: italic;">dataAccessFailure</span>
+		displays a stacktrace</li>
+	</ul>
+
+	<h3>Java Server Pages</h3>
+
+	<ul>
+	  <li><span style="font-weight: bold; font-style: italic;">index.jsp</span>
+	    redirects to the "welcome" page.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">includes.jsp</span> is
+		statically included in <span style="text-decoration: underline;">all</span>
+		JSP's used in the application. It specifies the taglibs that are in use.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">header.jsp</span> and
+	  	<span style="font-style: italic; font-weight: bold;">footer.jsp</span>
+		display info common to virtually all pages. Spring also supplies
+		support for the integration of <a href="http://www.lifl.fr/%7Edumoulin/tiles">Tiles</a>
+		(included in Struts) but this is not used in PetClinic.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">dataAccessFailure.jsp</span>
+	  	is the error page configured via
+		<span style="font-weight: bold; font-style: italic;">SimpleMappingExceptionResolver</span>,
+		which displays a stack trace and normally wouldn't be used in a production
+		version of an application. It can be seen in action by entering a URL of
+		"editOwner.do" or "editPet.do" with an invalid request parameter, for example:
+		<a href="http://localhost:8080/org.springframework.samples.petclinic/owner.do?ownerId=-1">/petclinic/owner.do?ownerId=-1</a>.
+		The handlers for these URLs normally expect to see a respective "ownerId" or "petId"
+		request parameter corresponding to an Owner or Pet in the database. Thus,
+		these handlers will throw a <strong>DataAccessException</strong> when such
+		a request parameter is provided which references a non-existing entity.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">uncaughtException.jsp</span>
+		is the <span style="font-weight: bold; font-style: italic;">web.xml</span> configured
+		"error-page". It displays a stack trace and normally wouldn't be used
+		in a production version of an application. It can be seen in action by
+		entering a URL of "editOwner.do" or "editPet.do" without a valid request
+		parameter, for example:
+		<a href="http://localhost:8080/org.springframework.samples.petclinic/owner.do">/petclinic/owner.do</a>.
+		The handlers for these URLs normally expect to see a respective "ownerId" or "petId"
+		request parameter and throw a <strong>ServletException</strong> when such
+		a request parameter is not found.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">welcome.jsp</span> implements
+	  	<span style="font-weight: bold; font-style: italic;">welcome</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">vets.jsp</span> implements
+	  	<span style="font-weight: bold; font-style: italic;">vets</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">findOwners.jsp</span> implements
+		<span style="font-weight: bold; font-style: italic;">findOwners</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">owners.jsp</span> implements
+		<span style="font-weight: bold; font-style: italic;">selectOwner</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">owner.jsp</span> implements
+		<span style="font-weight: bold; font-style: italic;">owner</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">ownerForm.jsp</span> implements
+		<span style="font-weight: bold; font-style: italic;">ownerForm</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">petForm.jsp</span> implements
+	  	<span style="font-weight: bold; font-style: italic;">petForm</span>.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">visitForm.jsp</span> implements
+		<span style="font-weight: bold; font-style: italic;">visitForm</span>.</li>
+	</ul>
+
+	<p>
+		The following items should be noted regarding the web application
+		implementation design:
+	</p>
+
+	<ol>
+	  <li>all JSP's are stored under <span style="font-weight: bold; font-style: italic;">/WEB-INF/jsp</span> except
+		for <span style="font-weight: bold; font-style: italic;">index.jsp</span> which
+		is the configured "welcome-file"</li>
+	  <li>The use of JSP technology in the application is not exposed to
+		the user, i.e., the end user never sees a URL ending in
+		<span style="font-weight: bold; font-style: italic;">".jsp".</span></li>
+	  <li>By convention, all URL's in the application ending in
+		<span style="font-weight: bold; font-style: italic;">".do"</span> are
+		handled by web application controllers. Static html pages ending in
+		<span style="font-weight: bold; font-style: italic;">".html"</span>, such as
+		Javadoc, will be directly served to the end user.</li>
+	  <li>The results of all form entries are handled using browser round
+		trip redirection to minimize possible end user confusion.</li>
+	  <li>All pages are extremely simple JSP implementations that focus
+		only on providing the necessary functionality.</li>
+	  <li>References to <span style="font-weight: bold;">Entity</span> objects
+		are passed around in the application by supplying the object's <code>ID</code>
+		as a request parameter.</li>
+	</ol>
+
+	<h3>Testing</h3>
+	<ul>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.OwnerTests</span>
+	  	is a simple JUnit 4 based TestCase that supports Business Rule #1.</li>
+	  <li><span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.AbstractClinicTests</span>
+		is a JUnit 4 based TestCase requiring a live database connection that is
+		used to confirm correct operation of the database access objects in the
+		various implementations of the <strong>Clinic</strong> interface.
+		&quot;AbstractClinicTests-context.xml&quot; declares a common
+		<strong>javax.sql.DataSource</strong>. Subclasses specify additional
+		context locations which declare a
+		<strong>org.springframework.transaction.PlatformTransactionManager</strong>
+		and a concrete implementation of <strong>Clinic</strong>.
+		<p>
+			AbstractClinicTests extends
+			<strong>AbstractTransactionalJUnit4SpringContextTests</strong>,
+			one of the valuable testing support classes provided by the
+			<em>Spring TestContext Framework</em> found in the
+			<code>org.springframework.test.context</code> package. The
+			annotation-driven configuration used here represents best practice for
+			integration tests with Spring. Note, however, that
+			AbstractTransactionalJUnit4SpringContextTests serves only as a convenience
+			for extension. For example, if you do not wish for your test classes to be
+			tied to a Spring-specific class hierarchy, you may configure your tests with
+			annotations such as <strong>@ContextConfiguration</strong>,
+			<strong>@TestExecutionListeners</strong>, <strong>@Transactional</strong>, etc.
+		</p>
+		<p>
+			AbstractClinicTests and its subclasses benefit from the following services
+			provided by the Spring TestContext Framework:
+		</p>
+		<ul>
+			<li><strong>Spring IoC container caching</strong> which spares us
+				unnecessary set up time between test execution.</li>
+			<li><strong>Dependency Injection</strong> of test fixture instances,
+				meaning that we don't need to perform application context lookups. See the
+				use of <strong>@Autowired</strong> on the <code>clinic</code> instance
+				variable, which uses autowiring <em>by type</em>. As an alternative, we
+				could annotate <code>clinic</code> with JSR 250's
+				<strong>@Resource</strong> to achieve dependency injection <em>by name</em>.
+				<em>(see: <strong>@ContextConfiguration</strong>,
+				<strong>DependencyInjectionTestExecutionListener</strong>)</em></li>
+			<li><strong>Transaction management</strong>, meaning each test method is
+				executed in its own transaction, which is automatically rolled back by
+				default. Thus, even if tests insert or otherwise change database state, there
+				is no need for a teardown or cleanup script.
+				<em>(see: <strong>@TransactionConfiguration</strong>,
+				<strong>@Transactional</strong>, <strong>TransactionalTestExecutionListener</strong>)</em></li>
+			<li><strong>Useful inherited protected fields</strong>, such as a
+				<strong>SimpleJdbcTemplate</strong> that can be used to verify
+				database state after test operations or to verify the results of
+				queries performed by application code. An
+				<strong>ApplicationContext</strong> is also inherited and can be
+				used for explicit bean lookup if necessary.
+				<em>(see: <strong>AbstractJUnit4SpringContextTests</strong>,
+				<strong>AbstractTransactionalJUnit4SpringContextTests</strong>)</em></li>
+		</ul>
+		<p>
+			The <em>Spring TestContext Framework</em> and related unit and
+			integration testing support classes are shipped in
+			<code>spring-test.jar</code>.
+		</p>
+
+	  </li>
+	</ul>
+
+	<h3>Downloads</h3>
+	<ul>
+	  <li>Download and install the
+	  	<a href="http://www.springsource.com/download/community?project=Spring%20Framework" target="_blank">Spring Framework</a>
+	  	(the PetClinic sample application is included)</li>
+	  <li>Download and install a <a href="http://java.sun.com/" target="_blank">Java</a>
+		Software Developer Kit, version 1.5 or later</li>
+	  <li>Download and install <a href="http://maven.apache.org" target="_blank">Apache Maven</a>,
+		preferably version 2.0.10 or later</li>
+	  <li>Download and install <a href="http://ant.apache.org" target="_blank">Apache Ant</a>,
+		preferably version 1.7.1 or later</li>
+	  <li>Download and install <a href="http://jakarta.apache.org/tomcat/index.html" target="_blank">Apache Tomcat</a>,
+		preferably version 6.0.20 or later</li>
+	  <li>Download and install <a href="http://dev.mysql.com/downloads/" target="_blank">MySQL</a>,
+		preferably version 5.1.x or later (optional)</li>
+	  <li><a href="http://hsqldb.sourceforge.net/" target="_blank">Hypersonic SQL</a>, and
+	  	<a href="http://hibernate.org/" target="_blank">Hibernate</a> are provided with the
+		application.</li>
+	  <li>PetClinic and Spring use the <a href="http://www.apache.org/" target="_blank">Apache</a>
+		<a href="http://commons.apache.org/logging/" target="_blank">Commons Logging</a>
+		and <a href="http://logging.apache.org/log4j/" target="_blank">log4j</a>
+		packages.</li>
+	</ul>
+
+	<h3>Maven Setup</h3>
+	<p>
+		Make sure that the Maven executable is in your command shell path.
+	</p>
+
+	<h3>MYSQL Setup (optional)</h3>
+	<p>
+		Add the PetClinic database to a running MySQL server by following the
+		explicit instructions found in
+		<span style="font-weight: bold; font-style: italic;">db/mysql/petclinic_db_setup_mysql.txt</span>.
+		PetClinic expects by default to be able to access the server via the
+		standard port <code>3306</code>. To use a different port, it will be
+		necessary to change the PetClinic Database Setup.
+	</p>
+
+	<h3>PetClinic Database Setup</h3>
+	<p>
+		To use a Java EE server supplied connection-pooled data source with
+		Tomcat, it will be necessary to use and possibly edit the appropriate
+		context definition file for the petclinic webapp. To use it, deploy a
+		copy of the appropriate context definition file in Tomcat's webapps
+		directory and restart the server. Consult the Tomcat log files if
+		something goes wrong when starting either Tomcat or the PetClinic
+		application. The context files are named
+		<span style="font-weight: bold; font-style: italic;">petclinic_tomcat_*.xml</span>,
+		where <strong>*</strong> is either &quot;hsqldb&quot; or &quot;mysql&quot;.
+		There is a context file supplied for each
+		database in its respective directory. There is also a context file
+		<span style="font-weight: bold; font-style: italic;">db/petclinic_tomcat_all.xml</span>
+		that will provide a JNDI connection-pooled DataSource for all supported
+		databases. Should you use this file, you must of course make sure that all the
+		database servers are running when you restart Tomcat.
+	</p>
+
+	<p>
+		<a name="dbNotes"></a>
+		<span style="font-weight: bold;">NOTES:</span>
+	</p>
+
+	<ol>
+	  <li>Should you deploy one of the context files or define a context in
+		Tomcat's <span style="font-weight: bold; font-style: italic;">server.xml</span>,
+		Tomcat will not automatically deploy the webapp from the
+		<span style="font-weight: bold; font-style: italic;">petclinic.war</span> file.
+		The webapp will then need to be manually extracted to the target
+		directory.</li>
+	  <li>The context files will also configure logging to supply a
+		separate log file for the petclinic context. This will separate the
+		container logging for petclinic from that of the other webapps. This
+		should not be confused with the application log file provided through
+		<span style="font-weight: bold;">log4j.</span></li>
+	  <li>An Ant script (<span style="font-weight: bold; font-style: italic;">db/build.xml</span>)
+		has been provided that can be used to re-initialize either database. To
+		select or configure the data source and database used for the webapp and
+		for testing, you will need to edit the following files:
+		<ul>
+		  <li><span style="font-weight: bold; font-style: italic;">src/main/webapp/WEB-INF/applicationContext-*.xml</span>:
+			for configuring the DataSource in the webapp</li>
+		  <li><span style="font-weight: bold; font-style: italic;">src/main/resources/jdbc.properties</span>:
+			for configuring JDBC connection settings for both the webapp and testing</li>
+		  <li><span style="font-weight: bold; font-style: italic;">build.properties</span>:
+			for running the &quot;tests&quot; target in Ant</li>
+		</ul>
+	  </li>
+	</ol>
+
+	<h3>Building the PetClinic Application</h3>
+	<p>
+		Open a command line shell and navigate to the directory containing
+		PetClinic. Make sure the database is running and execute
+		&quot;mvn clean package&quot;. This will run clean and compile everything
+		and execute the tests, including integration tests against an in-memory
+		database.
+	</p>
+
+	<h3>Deploying the PetClinic Application</h3>
+	<p>
+		Deploy the web application to the server in the usual way (see
+		<a href="#dbNotes">notes</a> regarding database setup). If you need
+		instructions for web application deployment, see the Tomcat
+		documentation for details. The Web Application aRchive file is
+		<span style="font-weight: bold; font-style: italic;">org.springframework.samples.petclinic.war</span>
+		and can be found in the
+		<span style="font-weight: bold; font-style: italic;">target/artifacts</span> directory.
+	</p>
+
+	<h3>Using the PetClinic Application</h3>
+	<p>
+		Make sure the PetClinic web application is running and browse to
+		<a href="http://localhost:8080/org.springframework.samples.petclinic/">http://localhost:8080/org.springframework.samples.petclinic/</a>.
+	</p>
+
+  <table class="footer">
+    <tr>
+      <td><a href="../welcome.do">Home</a></td>
+      <td align="right"><img src="../images/springsource-logo.png"/></td>
+	</tr>
+  </table>
+  </div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/images/banner-graphic.png b/src/main/webapp/images/banner-graphic.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6d01d5885266efbf4dc99431576a13dee5725e4
GIT binary patch
literal 13773
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
Ig$;cF2cd0;U;qFB

literal 0
HcmV?d00001

diff --git a/src/main/webapp/images/bullet-arrow.png b/src/main/webapp/images/bullet-arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..5909c25b397bb899de0dc010cb1b564b90175893
GIT binary patch
literal 2954
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
A_5c6?

literal 0
HcmV?d00001

diff --git a/src/main/webapp/images/pets.png b/src/main/webapp/images/pets.png
new file mode 100644
index 0000000000000000000000000000000000000000..0fe63c282b189268e53aa34cf523f32ad7772401
GIT binary patch
literal 55318
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

literal 0
HcmV?d00001

diff --git a/src/main/webapp/images/springsource-logo.png b/src/main/webapp/images/springsource-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..e170f8abf778b24ed1de11dad6f1444e849269ba
GIT binary patch
literal 4974
zcmV-!6OrtRP)<h;3K|Lk000e1NJLTq005H!000mO0ssI2ouk?`00009a7bBm000XU
z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag
z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V
z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H
zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T
zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j
zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p
z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i
z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i
z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf
z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G
zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u
zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm
z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v
zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW
zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo
z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X
zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t
z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl
zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4
z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_
zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l
znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U
zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0
zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O
zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p
z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya?
z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y
zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB
zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt
z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc=
zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C
z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB
zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe
zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0
z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ
zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$
z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4
z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu
zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu
z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E
ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw
zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX
z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&
z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01
z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R
z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw
zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD
zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3|
zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy
zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z
zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h
z1DNytV>2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F}
z000P?Nkl<Zc-rh)TWlL?6+ZT4ev*z`W=xrQ8OPfpu1&3h#@;sGZ4<UN8#$sfLaGE?
z34sJcV!6EVf_Ok%7D3^KrK?3;9#FfxQVL7kMMk2Qx~@<YwBA-pQw_E3jdxtfY3ylZ
zJBcT8#<7Qo6OD|MxDl7VNIeghJ^#6U=klNb{9}t@81RTb*kpiV0ZZFM>!Y}QU}<rs
z`l~;`{K}iJH=C9D%AX!(?!!T6-}vqRQ{FRweDSGIJ<&9pihA~)!V9eoUFNrPsa)6V
ztequ<ykBtDf~r+D(Jh)!<Xf`n78x6}a}5B%JNV9Q<x&{{I6JpPweMwc8qLNxUi{wq
zH+~0TdHu}g{lX`2-TlhidNE&mm2~ZWjQtYn+PjfCwV);@5?WP5$#5jRbC>?-nNthu
zzh!P(<{kV_GMBoOlBeamUIzf0&?irw?7%$r_7nhwMngM+^d1N2`@jFu`Afe6X3w5I
z_7Q)$vhrq0`$v~`w_!B$rB|0$r`^3j>>>NQu&!B-4M)NNkiL^{Ei^)i88uzkwW`*N
zTi5kUsnS~DYC)w5ZStrEb-VJ{s+v~S%vCIEUDvk@U*~$)bzPp8#eOj`7|?ZHz9n~-
zZOvJm7x>fkLcS$43=@uo2_dOFsaCZQ-Pzl9f(|?Wt~&eD#g}0>2LLPD(!GTOZ+~Eb
z0RR>Ywcf1O8)fDGOFrS3T>zjKRk2@0-=qNv04|)rz}OfpG|vG~U@$QG_N0<g>Uy2A
zF~OrjwV<YwDFCSJb(+wlk<oIgJbrB)&HE4g0U(`BYgLW0G15Vau`%&jobTn;q8dCJ
zRAv-S({x>DY|Ln6G%=n~G78G_z3t(+e(gG1kq%1fWLoGG0)qhnh+d3}{UQR^sv2Sg
z073{dTsVJ$CbTKb*|~Tu&f3{Zse)Fd0Vy7fn>?X#h!7Hw#myZS3Wv(&GT+N%aJ)V*
z0OWJ|sT)&TRig>*J>caXd^{F^_G`~#n$?1eYSCH$VZYf4gg(LR^Cl(|G@&b{3I?{#
z*=QnWXFtBUvfOAk*0rVcS6}=2*S}4uUo?%n1*~8+8qL*e?VtL(N}WD^TG#bVI+LHx
zFD)+Z`RE=(2-fe&i4g!u%1Oq?+@8FB<g-T(J#}c|{z4|5;q2VPgN5Pa!~Q{kHj||Z
zold4*`&=U@Mntz*Tdm!E>!$aBH#8d3s@m<z+k#8TWpjc{IQYcDx!fE8jGP#8d)@N1
zOi@%)PD%%*&}c~4_1bE!ty}seUuZN`Tdid?S<eAaI+^x;+NT!ObTS<r3SvxqdV2D+
z`D`YepUu}+Ypk86D9V&wUR=&)b5562$tZ4*TN;qi5bxlXjB@OmW5J<dE}J8S%%o;&
zwc2Q8G%y&Dr)AMCQWTZVWR;AfRkiM(Zi=E}(HI7&*=WksGHYiG_X=1*cuu2Q(Je{?
zQc_M5LPkD6A`M7{km<>3x5xeD(38A_zxmcplxn4)yz*1SN~w$Y4Z{G6lC$zxpLuTg
zu9byq!fGJ^Kv{RK8_S&Sh!p?=gMp#rLwqkkH#---7{#sabUDo}m`bK-LOWefLWtAl
z#FFGVj(6~c5QbsudYxgIbTXY7PpAbIYabJUpOsPt4e<_MEvlNP#jnK2<Kvhc)6kav
z5St9z<?LKtujg}lWkwPDgx2#f6b=QC204yPB~#IhQ3Q#yqFcn~jD`?)n|?x*x?Zo8
zD{X2qI6|K=H#--L#;^~gQy!lOyUvy!5)D;K6|rArYz!fUvvZYFWiB@tzY<4180uE~
z%zppM+A3wG005}2#rtz-|MKg{KlU9$aRxL2z<_ni(%nrtHf{w@moqRJ2uH$<jcHYf
z2hZjXwwZ=Q!~Vm5UDp#631vp<%*=6|G$2U>((v(NXP=WM^bQXU*3Jrjf-<AzXY*KF
zCJ{nJw-_7>MovcRdVO<Hc4CDl^yccp;6zSFu+#pR1Bl=f(DzU{#M;@m)h|E&#YVH?
z;CN`P0|0b0uUvg?Ro^4nPd1vX77JCY-|MEG-K5V70P!nv^s`c`VEe|C0|yqG&|aSx
zD_z(1d@jG`q?fvr65Zl(XqfNi@c_g8;b$vEp-)hYDq~}?*m(zUD#xRH^Yo$Xdg@LJ
z&l{)9IX63J7QQ(GT#sKz%-D_53sY9;6LvDtJNukUM!`LePp(9-U~tN%vR2htJImTx
zT*YY)z1R*v-^*jC#Z}hM;>5%|c&(~!h9vFtjrfl--MgUK+<1QiV1Xv{5idZ~fF^+P
z_}=F>ZUvgA#ba^PlIRwvZcHU65{Zcf&LfPC@f`3ZCK9a^N}EY}TAsQw#n>2K*N2Y}
zmrLbzGA&Qb$lnUl>+@<=EqXC(&e^P;#p#A7G{?11T)2dKFky*_gxD{(?G?4CnmWaP
z5qD&p>_f@p^JrCV{Mxu#oprr#28Xq?(tuPcRT2}4bTW;D5AWdlUVc0L{y~2{7Dr%0
zpAa}4n7lE0Y3vd*w-(>Vn-Pok?6-b);qRA!@P{9(_w!KGzWar5b`xu^blWf*&E~4-
zu@^Yz2mpX#7=~e#7D~nWVrij-KgZ6E&EB0Y&KHdqT3cH)8MdV2e6cuRTw7afeX<?%
z+S*zxbF1|>sxDVs^%UoeW9P=I%hk=C=!Lm7c5dw5ci!!QVM|n|(Xn%5D2o8v;I*mk
zfZvSFb{=g>f4gxNo+gp!Ppvl^50>LsW!FS{xVZRNlVRf>%I3QTA*AiTLI@%DP7P=C
z{ief>r%itcPR7Qx_Ge{A;d{5fn{W2Q?8!T%N~wYaJzfS-whh3RfIC}hTisG&8;u_N
z+~qTu?=2LqmU?k9>Tx{(3GNhS?J*fFTmDz@(3|i3NI1Lh<gLno;00d8akAg}E4Tk2
sEv-~{_w2G*ws^g4dGs&Ohm`&`0AF19UjV*Mq5uE@07*qoM6N<$f@3s&R{#J2

literal 0
HcmV?d00001

diff --git a/src/main/webapp/images/submit-bg.png b/src/main/webapp/images/submit-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..10a94371b642251703b0c2439d5e62578f8e6e5a
GIT binary patch
literal 2820
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
WST*12Q+YoC0000<MNUMnLSTY2GCOYo

literal 0
HcmV?d00001

diff --git a/src/main/webapp/styles/petclinic.css b/src/main/webapp/styles/petclinic.css
new file mode 100644
index 00000000..e12f96af
--- /dev/null
+++ b/src/main/webapp/styles/petclinic.css
@@ -0,0 +1,234 @@
+/* main elements */
+
+body,div,td {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 12px;
+	color: #666;
+}
+
+body {
+	background-color: #fff;
+	background-image: url(../images/banner-graphic.png);
+	background-position: top center;
+	background-repeat: no-repeat;
+	text-align: center;
+	min-width: 600px;
+	margin-top: 60px;
+	margin-left: auto;
+	margin-right: auto;
+}
+
+div {
+	margin: 5px 25px 5px 25px;
+	text-align: left;
+}
+
+/* header and footer elements */
+
+#main {
+  	margin:0 auto;
+  	position:relative;
+  	top: 35px;
+  	left:0px;
+  	width:560px;
+  	text-align:left;
+}
+
+.footer {
+	background:#fff;
+	border:none;
+	margin-top:20px;
+	border-top:1px solid #999999;
+	width:100%;
+}
+
+.footer td {color:#999999;}
+
+.footer a:link {color: #7db223;}
+
+	
+/* text styles */
+
+h1,h2,h3 {
+	font-family: Helvetica, sans-serif;
+	color: #7db223;
+}
+
+h1 {
+	font-size: 20px;
+	line-height: 26px;
+}
+
+h2 {
+	font-size: 18px;
+	line-height: 24px;
+}
+
+h3 {
+	font-size: 15px;
+	line-height: 21px;
+	color:#555;
+}
+
+h4 {
+	font-size: 14px;
+	line-height: 20px;
+}
+
+.errors {
+	color: red;
+	font-weight: bold;
+}
+
+a {
+	text-decoration: underline;
+	font-size: 13px;
+}
+
+a:link {
+	color: #7db223;
+}
+
+a:hover {
+	color: #456314;
+}
+
+a:active {
+	color: #7db223;
+}
+
+a:visited {
+	color: #7db223;
+}
+
+ul {
+	list-style: disc url(../images/bullet-arrow.png);
+}
+
+li {
+	padding-top: 5px;
+	text-align: left;
+}
+
+li ul {
+	list-style: square url(../images/bullet-arrow.png);
+}
+
+li ul li ul {
+	list-style: circle none;
+}
+
+/* table elements */
+
+table {
+	background: #d6e2c3;
+	margin: 3px 0 0 0;
+	border: 4px solid #d6e2c3;
+	border-collapse: collapse;
+}
+
+table table {
+	margin: -5px 0;
+	border: 0px solid #e0e7d3;
+	width: 100%;
+}
+
+table td,table th {
+	padding: 8px;
+}
+
+table th {
+	font-size: 12px;
+	text-align: left;
+	font-weight: bold;
+}
+
+table thead {
+	font-weight: bold;
+	font-style: italic;
+	background-color: #c2ceaf;
+}
+
+table a:link {color: #303030;}
+
+caption {
+	caption-side: top;
+	width: auto;
+	text-align: left;
+	font-size: 12px;
+	color: #848f73;
+	padding-bottom: 4px;
+}
+
+fieldset {
+	background: #e0e7d3;
+	padding: 8px;
+	padding-bottom: 22px;
+	border: none;
+	width: 560px;
+}
+
+fieldset label {
+	width: 70px;
+	float: left;
+	margin-top: 1.7em;
+	margin-left: 20px;
+}
+
+fieldset textfield {
+	margin: 3px;
+	height: 20px;
+	background: #e0e7d3;
+}
+
+fieldset textarea {
+	margin: 3px;
+	height: 165px;
+	background: #e0e7d3;
+}
+
+fieldset input {
+	margin: 3px;
+	height: 20px;
+	background: #e0e7d3;
+}
+
+fieldset table {
+	width: 100%;
+}
+
+fieldset th {
+	padding-left: 25px;
+}
+
+.table-buttons {
+	background-color:#fff;
+	border:none;
+}
+
+.table-buttons td {
+	border:none;
+}
+
+.submit input {
+	background:url(../images/submit-bg.png) repeat-x;
+    border: 2px outset #d7b9c9;
+	color:#383838;
+	padding:2px 10px;
+	font-size:11px;
+	text-transform:uppercase;
+	font-weight:bold;
+}
+
+.updated {
+	background:#ecf1e5;
+	font-size:11px;
+	margin-left:2px;
+	border:4px solid #ecf1e5;
+}
+
+.updated td {
+	padding:2px 8px;
+	font-size:11px;
+	color:#888888;
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/AbstractClinicTests.java b/src/test/java/org/springframework/samples/petclinic/AbstractClinicTests.java
new file mode 100644
index 00000000..a6986918
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/AbstractClinicTests.java
@@ -0,0 +1,224 @@
+package org.springframework.samples.petclinic;
+
+import java.util.Collection;
+import java.util.Date;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.samples.petclinic.util.EntityUtils;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
+
+/**
+ * <p>
+ * Base class for {@link Clinic} integration tests.
+ * </p>
+ * <p>
+ * &quot;AbstractClinicTests-context.xml&quot; declares a common
+ * {@link javax.sql.DataSource DataSource}. Subclasses should specify
+ * additional context locations which declare a
+ * {@link org.springframework.transaction.PlatformTransactionManager PlatformTransactionManager}
+ * and a concrete implementation of {@link Clinic}.
+ * </p>
+ * <p>
+ * This class extends {@link AbstractTransactionalJUnit4SpringContextTests},
+ * one of the valuable testing support classes provided by the
+ * <em>Spring TestContext Framework</em> found in the
+ * <code>org.springframework.test.context</code> package. The
+ * annotation-driven configuration used here represents best practice for
+ * integration tests with Spring. Note, however, that
+ * AbstractTransactionalJUnit4SpringContextTests serves only as a convenience
+ * for extension. For example, if you do not wish for your test classes to be
+ * tied to a Spring-specific class hierarchy, you may configure your tests with
+ * annotations such as {@link ContextConfiguration @ContextConfiguration},
+ * {@link org.springframework.test.context.TestExecutionListeners @TestExecutionListeners},
+ * {@link org.springframework.transaction.annotation.Transactional @Transactional},
+ * etc.
+ * </p>
+ * <p>
+ * AbstractClinicTests and its subclasses benefit from the following services
+ * provided by the Spring TestContext Framework:
+ * </p>
+ * <ul>
+ * <li><strong>Spring IoC container caching</strong> which spares us
+ * unnecessary set up time between test execution.</li>
+ * <li><strong>Dependency Injection</strong> of test fixture instances,
+ * meaning that we don't need to perform application context lookups. See the
+ * use of {@link Autowired @Autowired} on the <code>clinic</code> instance
+ * variable, which uses autowiring <em>by type</em>. As an alternative, we
+ * could annotate <code>clinic</code> with
+ * {@link javax.annotation.Resource @Resource} to achieve dependency injection
+ * <em>by name</em>.
+ * <em>(see: {@link ContextConfiguration @ContextConfiguration},
+ * {@link org.springframework.test.context.support.DependencyInjectionTestExecutionListener DependencyInjectionTestExecutionListener})</em></li>
+ * <li><strong>Transaction management</strong>, meaning each test method is
+ * executed in its own transaction, which is automatically rolled back by
+ * default. Thus, even if tests insert or otherwise change database state, there
+ * is no need for a teardown or cleanup script.
+ * <em>(see: {@link org.springframework.test.context.transaction.TransactionConfiguration @TransactionConfiguration},
+ * {@link org.springframework.transaction.annotation.Transactional @Transactional},
+ * {@link org.springframework.test.context.transaction.TransactionalTestExecutionListener TransactionalTestExecutionListener})</em></li>
+ * <li><strong>Useful inherited protected fields</strong>, such as a
+ * {@link org.springframework.jdbc.core.simple.SimpleJdbcTemplate SimpleJdbcTemplate}
+ * that can be used to verify database state after test operations or to verify
+ * the results of queries performed by application code. An
+ * {@link org.springframework.context.ApplicationContext ApplicationContext} is
+ * also inherited and can be used for explicit bean lookup if necessary.
+ * <em>(see: {@link org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests AbstractJUnit4SpringContextTests},
+ * {@link AbstractTransactionalJUnit4SpringContextTests})</em></li>
+ * </ul>
+ * <p>
+ * The Spring TestContext Framework and related unit and integration testing
+ * support classes are shipped in <code>spring-test.jar</code>.
+ * </p>
+ *
+ * @author Ken Krebs
+ * @author Rod Johnson
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ */
+@ContextConfiguration
+public abstract class AbstractClinicTests extends AbstractTransactionalJUnit4SpringContextTests {
+
+	@Autowired
+	protected Clinic clinic;
+
+
+	@Test
+	public void getVets() {
+		Collection<Vet> vets = this.clinic.getVets();
+		// Use the inherited countRowsInTable() convenience method (from
+		// AbstractTransactionalJUnit4SpringContextTests) to verify the results.
+		assertEquals("JDBC query must show the same number of vets", super.countRowsInTable("VETS"), vets.size());
+		Vet v1 = EntityUtils.getById(vets, Vet.class, 2);
+		assertEquals("Leary", v1.getLastName());
+		assertEquals(1, v1.getNrOfSpecialties());
+		assertEquals("radiology", (v1.getSpecialties().get(0)).getName());
+		Vet v2 = EntityUtils.getById(vets, Vet.class, 3);
+		assertEquals("Douglas", v2.getLastName());
+		assertEquals(2, v2.getNrOfSpecialties());
+		assertEquals("dentistry", (v2.getSpecialties().get(0)).getName());
+		assertEquals("surgery", (v2.getSpecialties().get(1)).getName());
+	}
+
+	@Test
+	public void getPetTypes() {
+		Collection<PetType> petTypes = this.clinic.getPetTypes();
+		assertEquals("JDBC query must show the same number of pet types", super.countRowsInTable("TYPES"),
+				petTypes.size());
+		PetType t1 = EntityUtils.getById(petTypes, PetType.class, 1);
+		assertEquals("cat", t1.getName());
+		PetType t4 = EntityUtils.getById(petTypes, PetType.class, 4);
+		assertEquals("snake", t4.getName());
+	}
+
+	@Test
+	public void findOwners() {
+		Collection<Owner> owners = this.clinic.findOwners("Davis");
+		assertEquals(2, owners.size());
+		owners = this.clinic.findOwners("Daviss");
+		assertEquals(0, owners.size());
+	}
+
+	@Test
+	public void loadOwner() {
+		Owner o1 = this.clinic.loadOwner(1);
+		assertTrue(o1.getLastName().startsWith("Franklin"));
+		Owner o10 = this.clinic.loadOwner(10);
+		assertEquals("Carlos", o10.getFirstName());
+
+		// XXX: Add programmatic support for ending transactions with the
+		// TestContext Framework.
+
+		// Check lazy loading, by ending the transaction:
+		// endTransaction();
+
+		// Now Owners are "disconnected" from the data store.
+		// We might need to touch this collection if we switched to lazy loading
+		// in mapping files, but this test would pick this up.
+		o1.getPets();
+	}
+
+	@Test
+	public void insertOwner() {
+		Collection<Owner> owners = this.clinic.findOwners("Schultz");
+		int found = owners.size();
+		Owner owner = new Owner();
+		owner.setLastName("Schultz");
+		this.clinic.storeOwner(owner);
+		// assertTrue(!owner.isNew()); -- NOT TRUE FOR TOPLINK (before commit)
+		owners = this.clinic.findOwners("Schultz");
+		assertEquals("Verifying number of owners after inserting a new one.", found + 1, owners.size());
+	}
+
+	@Test
+	public void updateOwner() throws Exception {
+		Owner o1 = this.clinic.loadOwner(1);
+		String old = o1.getLastName();
+		o1.setLastName(old + "X");
+		this.clinic.storeOwner(o1);
+		o1 = this.clinic.loadOwner(1);
+		assertEquals(old + "X", o1.getLastName());
+	}
+
+	@Test
+	public void loadPet() {
+		Collection<PetType> types = this.clinic.getPetTypes();
+		Pet p7 = this.clinic.loadPet(7);
+		assertTrue(p7.getName().startsWith("Samantha"));
+		assertEquals(EntityUtils.getById(types, PetType.class, 1).getId(), p7.getType().getId());
+		assertEquals("Jean", p7.getOwner().getFirstName());
+		Pet p6 = this.clinic.loadPet(6);
+		assertEquals("George", p6.getName());
+		assertEquals(EntityUtils.getById(types, PetType.class, 4).getId(), p6.getType().getId());
+		assertEquals("Peter", p6.getOwner().getFirstName());
+	}
+
+	@Test
+	public void insertPet() {
+		Owner o6 = this.clinic.loadOwner(6);
+		int found = o6.getPets().size();
+		Pet pet = new Pet();
+		pet.setName("bowser");
+		Collection<PetType> types = this.clinic.getPetTypes();
+		pet.setType(EntityUtils.getById(types, PetType.class, 2));
+		pet.setBirthDate(new Date());
+		o6.addPet(pet);
+		assertEquals(found + 1, o6.getPets().size());
+		// both storePet and storeOwner are necessary to cover all ORM tools
+		this.clinic.storePet(pet);
+		this.clinic.storeOwner(o6);
+		// assertTrue(!pet.isNew()); -- NOT TRUE FOR TOPLINK (before commit)
+		o6 = this.clinic.loadOwner(6);
+		assertEquals(found + 1, o6.getPets().size());
+	}
+
+	@Test
+	public void updatePet() throws Exception {
+		Pet p7 = this.clinic.loadPet(7);
+		String old = p7.getName();
+		p7.setName(old + "X");
+		this.clinic.storePet(p7);
+		p7 = this.clinic.loadPet(7);
+		assertEquals(old + "X", p7.getName());
+	}
+
+	@Test
+	public void insertVisit() {
+		Pet p7 = this.clinic.loadPet(7);
+		int found = p7.getVisits().size();
+		Visit visit = new Visit();
+		p7.addVisit(visit);
+		visit.setDescription("test");
+		// both storeVisit and storePet are necessary to cover all ORM tools
+		this.clinic.storeVisit(visit);
+		this.clinic.storePet(p7);
+		// assertTrue(!visit.isNew()); -- NOT TRUE FOR TOPLINK (before commit)
+		p7 = this.clinic.loadPet(7);
+		assertEquals(found + 1, p7.getVisits().size());
+	}
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/OwnerTests.java b/src/test/java/org/springframework/samples/petclinic/OwnerTests.java
new file mode 100644
index 00000000..84b5f62c
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/OwnerTests.java
@@ -0,0 +1,27 @@
+package org.springframework.samples.petclinic;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+/**
+ * JUnit test for the {@link Owner} class.
+ *
+ * @author Ken Krebs
+ */
+public class OwnerTests {
+
+	@Test
+	public void testHasPet() {
+		Owner owner = new Owner();
+		Pet fido = new Pet();
+		fido.setName("Fido");
+		assertNull(owner.getPet("Fido"));
+		assertNull(owner.getPet("fido"));
+		owner.addPet(fido);
+		assertEquals(fido, owner.getPet("Fido"));
+		assertEquals(fido, owner.getPet("fido"));
+	}
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/PetClinicTestSuite.java b/src/test/java/org/springframework/samples/petclinic/PetClinicTestSuite.java
new file mode 100644
index 00000000..d5619939
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/PetClinicTestSuite.java
@@ -0,0 +1,29 @@
+package org.springframework.samples.petclinic;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+import org.springframework.samples.petclinic.hibernate.HibernateClinicTests;
+import org.springframework.samples.petclinic.jdbc.SimpleJdbcClinicTests;
+import org.springframework.samples.petclinic.jpa.EntityManagerClinicTests;
+import org.springframework.samples.petclinic.jpa.HibernateEntityManagerClinicTests;
+import org.springframework.samples.petclinic.jpa.OpenJpaEntityManagerClinicTests;
+import org.springframework.samples.petclinic.web.VisitsAtomViewTest;
+
+/**
+ * JUnit 4 based test suite for all PetClinic tests.
+ *
+ * @author Sam Brannen
+ */
+@RunWith(Suite.class)
+@SuiteClasses({
+	OwnerTests.class,
+	SimpleJdbcClinicTests.class,
+	HibernateClinicTests.class,
+	EntityManagerClinicTests.class,
+	HibernateEntityManagerClinicTests.class,
+	OpenJpaEntityManagerClinicTests.class,
+	VisitsAtomViewTest.class
+})
+public class PetClinicTestSuite {
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/hibernate/HibernateClinicTests.java b/src/test/java/org/springframework/samples/petclinic/hibernate/HibernateClinicTests.java
new file mode 100644
index 00000000..3c275c82
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/hibernate/HibernateClinicTests.java
@@ -0,0 +1,20 @@
+package org.springframework.samples.petclinic.hibernate;
+
+import org.springframework.samples.petclinic.AbstractClinicTests;
+import org.springframework.test.context.ContextConfiguration;
+
+/**
+ * <p>
+ * Integration tests for the {@link HibernateClinic} implementation.
+ * </p>
+ * <p>
+ * "HibernateClinicTests-context.xml" determines the actual beans to test.
+ * </p>
+ *
+ * @author Juergen Hoeller
+ * @author Sam Brannen
+ */
+@ContextConfiguration
+public class HibernateClinicTests extends AbstractClinicTests {
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests.java b/src/test/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests.java
new file mode 100644
index 00000000..709100d1
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests.java
@@ -0,0 +1,19 @@
+package org.springframework.samples.petclinic.jdbc;
+
+import org.springframework.samples.petclinic.AbstractClinicTests;
+import org.springframework.test.context.ContextConfiguration;
+
+/**
+ * <p>
+ * Integration tests for the {@link SimpleJdbcClinic} implementation.
+ * </p>
+ * <p>
+ * "SimpleJdbcClinicTests-context.xml" determines the actual beans to test.
+ * </p>
+ *
+ * @author Thomas Risberg
+ */
+@ContextConfiguration
+public class SimpleJdbcClinicTests extends AbstractClinicTests {
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/jpa/AbstractJpaClinicTests.java b/src/test/java/org/springframework/samples/petclinic/jpa/AbstractJpaClinicTests.java
new file mode 100644
index 00000000..251af819
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/jpa/AbstractJpaClinicTests.java
@@ -0,0 +1,199 @@
+
+package org.springframework.samples.petclinic.jpa;
+
+import java.util.Collection;
+import java.util.Date;
+
+import javax.persistence.EntityManager;
+
+import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
+import org.springframework.samples.petclinic.Clinic;
+import org.springframework.samples.petclinic.Owner;
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.Vet;
+import org.springframework.samples.petclinic.Visit;
+import org.springframework.samples.petclinic.util.EntityUtils;
+import org.springframework.test.annotation.ExpectedException;
+import org.springframework.test.jpa.AbstractJpaTests;
+
+/**
+ * <p>
+ * This class extends {@link AbstractJpaTests}, one of the valuable test
+ * superclasses provided in the <code>org.springframework.test</code> package.
+ * This represents best practice for integration tests with Spring for JPA based
+ * tests which require <em>shadow class loading</em>. For all other types of
+ * integration testing, the <em>Spring TestContext Framework</em> is
+ * preferred.
+ * </p>
+ * <p>
+ * AbstractJpaTests and its superclasses provide the following services:
+ * <ul>
+ * <li>Injects test dependencies, meaning that we don't need to perform
+ * application context lookups. See the setClinic() method. Injection uses
+ * autowiring by type.</li>
+ * <li>Executes each test method in its own transaction, which is automatically
+ * rolled back by default. This means that even if tests insert or otherwise
+ * change database state, there is no need for a teardown or cleanup script.</li>
+ * <li>Provides useful inherited protected fields, such as a
+ * {@link SimpleJdbcTemplate} that can be used to verify database state after
+ * test operations, or verify the results of queries performed by application
+ * code. Alternatively, you can use protected convenience methods such as
+ * {@link #countRowsInTable(String)}, {@link #deleteFromTables(String[])},
+ * etc. An ApplicationContext is also inherited, and can be used for explicit
+ * lookup if necessary.</li>
+ * </ul>
+ * <p>
+ * {@link AbstractJpaTests} and related classes are shipped in
+ * <code>spring-test.jar</code>.
+ * </p>
+ *
+ * @author Rod Johnson
+ * @author Sam Brannen
+ * @see AbstractJpaTests
+ */
+public abstract class AbstractJpaClinicTests extends AbstractJpaTests {
+
+	protected Clinic clinic;
+
+
+	/**
+	 * This method is provided to set the Clinic instance being tested by the
+	 * Dependency Injection injection behaviour of the superclass from the
+	 * <code>org.springframework.test</code> package.
+	 *
+	 * @param clinic clinic to test
+	 */
+	public void setClinic(Clinic clinic) {
+		this.clinic = clinic;
+	}
+
+	@ExpectedException(IllegalArgumentException.class)
+	public void testBogusJpql() {
+		this.sharedEntityManager.createQuery("SELECT RUBBISH FROM RUBBISH HEAP").executeUpdate();
+	}
+
+	public void testApplicationManaged() {
+		EntityManager appManaged = this.entityManagerFactory.createEntityManager();
+		appManaged.joinTransaction();
+	}
+
+	public void testGetVets() {
+		Collection<Vet> vets = this.clinic.getVets();
+		// Use the inherited countRowsInTable() convenience method (from
+		// AbstractTransactionalDataSourceSpringContextTests) to verify the
+		// results.
+		assertEquals("JDBC query must show the same number of vets", super.countRowsInTable("VETS"), vets.size());
+		Vet v1 = EntityUtils.getById(vets, Vet.class, 2);
+		assertEquals("Leary", v1.getLastName());
+		assertEquals(1, v1.getNrOfSpecialties());
+		assertEquals("radiology", (v1.getSpecialties().get(0)).getName());
+		Vet v2 = EntityUtils.getById(vets, Vet.class, 3);
+		assertEquals("Douglas", v2.getLastName());
+		assertEquals(2, v2.getNrOfSpecialties());
+		assertEquals("dentistry", (v2.getSpecialties().get(0)).getName());
+		assertEquals("surgery", (v2.getSpecialties().get(1)).getName());
+	}
+
+	public void testGetPetTypes() {
+		Collection<PetType> petTypes = this.clinic.getPetTypes();
+		assertEquals("JDBC query must show the same number of pet types", super.countRowsInTable("TYPES"),
+				petTypes.size());
+		PetType t1 = EntityUtils.getById(petTypes, PetType.class, 1);
+		assertEquals("cat", t1.getName());
+		PetType t4 = EntityUtils.getById(petTypes, PetType.class, 4);
+		assertEquals("snake", t4.getName());
+	}
+
+	public void testFindOwners() {
+		Collection<Owner> owners = this.clinic.findOwners("Davis");
+		assertEquals(2, owners.size());
+		owners = this.clinic.findOwners("Daviss");
+		assertEquals(0, owners.size());
+	}
+
+	public void testLoadOwner() {
+		Owner o1 = this.clinic.loadOwner(1);
+		assertTrue(o1.getLastName().startsWith("Franklin"));
+		Owner o10 = this.clinic.loadOwner(10);
+		assertEquals("Carlos", o10.getFirstName());
+
+		// Check lazy loading, by ending the transaction
+		endTransaction();
+
+		// Now Owners are "disconnected" from the data store.
+		// We might need to touch this collection if we switched to lazy loading
+		// in mapping files, but this test would pick this up.
+		o1.getPets();
+	}
+
+	public void testInsertOwner() {
+		Collection<Owner> owners = this.clinic.findOwners("Schultz");
+		int found = owners.size();
+		Owner owner = new Owner();
+		owner.setLastName("Schultz");
+		this.clinic.storeOwner(owner);
+		// assertTrue(!owner.isNew()); -- NOT TRUE FOR TOPLINK (before commit)
+		owners = this.clinic.findOwners("Schultz");
+		assertEquals(found + 1, owners.size());
+	}
+
+	public void testUpdateOwner() throws Exception {
+		Owner o1 = this.clinic.loadOwner(1);
+		String old = o1.getLastName();
+		o1.setLastName(old + "X");
+		this.clinic.storeOwner(o1);
+		o1 = this.clinic.loadOwner(1);
+		assertEquals(old + "X", o1.getLastName());
+	}
+
+	public void testLoadPet() {
+		Collection<PetType> types = this.clinic.getPetTypes();
+		Pet p7 = this.clinic.loadPet(7);
+		assertTrue(p7.getName().startsWith("Samantha"));
+		assertEquals(EntityUtils.getById(types, PetType.class, 1).getId(), p7.getType().getId());
+		assertEquals("Jean", p7.getOwner().getFirstName());
+		Pet p6 = this.clinic.loadPet(6);
+		assertEquals("George", p6.getName());
+		assertEquals(EntityUtils.getById(types, PetType.class, 4).getId(), p6.getType().getId());
+		assertEquals("Peter", p6.getOwner().getFirstName());
+	}
+
+	public void testInsertPet() {
+		Owner o6 = this.clinic.loadOwner(6);
+		int found = o6.getPets().size();
+		Pet pet = new Pet();
+		pet.setName("bowser");
+		Collection<PetType> types = this.clinic.getPetTypes();
+		pet.setType(EntityUtils.getById(types, PetType.class, 2));
+		pet.setBirthDate(new Date());
+		o6.addPet(pet);
+		assertEquals(found + 1, o6.getPets().size());
+		this.clinic.storeOwner(o6);
+		// assertTrue(!pet.isNew()); -- NOT TRUE FOR TOPLINK (before commit)
+		o6 = this.clinic.loadOwner(6);
+		assertEquals(found + 1, o6.getPets().size());
+	}
+
+	public void testUpdatePet() throws Exception {
+		Pet p7 = this.clinic.loadPet(7);
+		String old = p7.getName();
+		p7.setName(old + "X");
+		this.clinic.storePet(p7);
+		p7 = this.clinic.loadPet(7);
+		assertEquals(old + "X", p7.getName());
+	}
+
+	public void testInsertVisit() {
+		Pet p7 = this.clinic.loadPet(7);
+		int found = p7.getVisits().size();
+		Visit visit = new Visit();
+		p7.addVisit(visit);
+		visit.setDescription("test");
+		this.clinic.storePet(p7);
+		// assertTrue(!visit.isNew()); -- NOT TRUE FOR TOPLINK (before commit)
+		p7 = this.clinic.loadPet(7);
+		assertEquals(found + 1, p7.getVisits().size());
+	}
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/jpa/EntityManagerClinicTests.java b/src/test/java/org/springframework/samples/petclinic/jpa/EntityManagerClinicTests.java
new file mode 100644
index 00000000..67c472fd
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/jpa/EntityManagerClinicTests.java
@@ -0,0 +1,51 @@
+package org.springframework.samples.petclinic.jpa;
+
+import java.util.List;
+
+import org.springframework.samples.petclinic.aspects.UsageLogAspect;
+
+/**
+ * <p>
+ * Tests for the DAO variant based on the shared EntityManager approach. Uses
+ * TopLink Essentials (the reference implementation) for testing.
+ * </p>
+ * <p>
+ * Specifically tests usage of an <code>orm.xml</code> file, loaded by the
+ * persistence provider through the Spring-provided persistence unit root URL.
+ * </p>
+ *
+ * @author Rod Johnson
+ * @author Juergen Hoeller
+ */
+public class EntityManagerClinicTests extends AbstractJpaClinicTests {
+
+	private UsageLogAspect usageLogAspect;
+
+	public void setUsageLogAspect(UsageLogAspect usageLogAspect) {
+		this.usageLogAspect = usageLogAspect;
+	}
+
+	@Override
+	protected String[] getConfigPaths() {
+		return new String[] {
+			"applicationContext-jpaCommon.xml",
+			"applicationContext-toplinkAdapter.xml",
+			"applicationContext-entityManager.xml"
+		};
+	}
+
+	public void testUsageLogAspectIsInvoked() {
+		String name1 = "Schuurman";
+		String name2 = "Greenwood";
+		String name3 = "Leau";
+
+		assertTrue(this.clinic.findOwners(name1).isEmpty());
+		assertTrue(this.clinic.findOwners(name2).isEmpty());
+
+		List<String> namesRequested = this.usageLogAspect.getNamesRequested();
+		assertTrue(namesRequested.contains(name1));
+		assertTrue(namesRequested.contains(name2));
+		assertFalse(namesRequested.contains(name3));
+	}
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/jpa/HibernateEntityManagerClinicTests.java b/src/test/java/org/springframework/samples/petclinic/jpa/HibernateEntityManagerClinicTests.java
new file mode 100644
index 00000000..d95b452e
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/jpa/HibernateEntityManagerClinicTests.java
@@ -0,0 +1,26 @@
+package org.springframework.samples.petclinic.jpa;
+
+/**
+ * <p>
+ * Tests for the DAO variant based on the shared EntityManager approach, using
+ * Hibernate EntityManager for testing instead of the reference implementation.
+ * </p>
+ * <p>
+ * Specifically tests usage of an <code>orm.xml</code> file, loaded by the
+ * persistence provider through the Spring-provided persistence unit root URL.
+ * </p>
+ *
+ * @author Juergen Hoeller
+ */
+public class HibernateEntityManagerClinicTests extends EntityManagerClinicTests {
+
+	@Override
+	protected String[] getConfigPaths() {
+		return new String[] {
+			"applicationContext-jpaCommon.xml",
+			"applicationContext-hibernateAdapter.xml",
+			"applicationContext-entityManager.xml"
+		};
+	}
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/jpa/OpenJpaEntityManagerClinicTests.java b/src/test/java/org/springframework/samples/petclinic/jpa/OpenJpaEntityManagerClinicTests.java
new file mode 100644
index 00000000..98e38ed6
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/jpa/OpenJpaEntityManagerClinicTests.java
@@ -0,0 +1,27 @@
+
+package org.springframework.samples.petclinic.jpa;
+
+/**
+ * <p>
+ * Tests for the DAO variant based on the shared EntityManager approach, using
+ * Apache OpenJPA for testing instead of the reference implementation.
+ * </p>
+ * <p>
+ * Specifically tests usage of an <code>orm.xml</code> file, loaded by the
+ * persistence provider through the Spring-provided persistence unit root URL.
+ * </p>
+ *
+ * @author Juergen Hoeller
+ */
+public class OpenJpaEntityManagerClinicTests extends EntityManagerClinicTests {
+
+	@Override
+	protected String[] getConfigPaths() {
+		return new String[] {
+			"applicationContext-jpaCommon.xml",
+			"applicationContext-openJpaAdapter.xml",
+			"applicationContext-entityManager.xml"
+		};
+	}
+
+}
diff --git a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java
new file mode 100644
index 00000000..1e82e1d5
--- /dev/null
+++ b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2002-2009 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.samples.petclinic.web;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.sun.syndication.feed.atom.Entry;
+import com.sun.syndication.feed.atom.Feed;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.springframework.samples.petclinic.Pet;
+import org.springframework.samples.petclinic.PetType;
+import org.springframework.samples.petclinic.Visit;
+
+/**
+ * @author Arjen Poutsma
+ */
+public class VisitsAtomViewTest {
+
+	private VisitsAtomView visitView;
+
+	private Map<String, Object> model;
+
+	private Feed feed;
+
+	@Before
+	public void setUp() {
+		visitView = new VisitsAtomView();
+		PetType dog = new PetType();
+		dog.setName("dog");
+		Pet bello = new Pet();
+		bello.setName("Bello");
+		bello.setType(dog);
+		Visit belloVisit = new Visit();
+		belloVisit.setPet(bello);
+		belloVisit.setDate(new Date(2009, 0, 1));
+		belloVisit.setDescription("Bello visit");
+		Pet wodan = new Pet();
+		wodan.setName("Wodan");
+		wodan.setType(dog);
+		Visit wodanVisit = new Visit();
+		wodanVisit.setPet(wodan);
+		wodanVisit.setDate(new Date(2009, 0, 2));
+		wodanVisit.setDescription("Wodan visit");
+		List<Visit> visits = new ArrayList<Visit>();
+		visits.add(belloVisit);
+		visits.add(wodanVisit);
+
+		model = new HashMap<String, Object>();
+		model.put("visits", visits);
+		feed = new Feed();
+
+	}
+
+	@Test
+	public void buildFeedMetadata() {
+		visitView.buildFeedMetadata(model, feed, null);
+
+		assertNotNull("No id set", feed.getId());
+		assertNotNull("No title set", feed.getTitle());
+		assertEquals("Invalid update set", new Date(2009, 0, 2), feed.getUpdated());
+	}
+
+	@Test
+	public void buildFeedEntries() throws Exception {
+		List<Entry> entries = visitView.buildFeedEntries(model, null, null);
+		assertEquals("Invalid amount of entries", 2, entries.size());
+	}
+}
diff --git a/src/test/resources/log4j.xml b/src/test/resources/log4j.xml
new file mode 100644
index 00000000..767b96d6
--- /dev/null
+++ b/src/test/resources/log4j.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appenders -->
+	<appender name="console" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
+		</layout>
+	</appender>
+
+	<logger name="org.springframework.beans">
+		<level value="warn" />
+	</logger>
+
+	<logger name="org.springframework.binding">
+		<level value="debug" />
+	</logger>
+
+	<!-- Root Logger -->
+	<root>
+		<priority value="warn" />
+		<appender-ref ref="console" />
+	</root>
+	
+</log4j:configuration>
\ No newline at end of file
diff --git a/src/test/resources/org/springframework/samples/petclinic/AbstractClinicTests-context.xml b/src/test/resources/org/springframework/samples/petclinic/AbstractClinicTests-context.xml
new file mode 100644
index 00000000..3f79cbc0
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/AbstractClinicTests-context.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+	<context:property-placeholder location="classpath:/jdbc.properties"/>
+
+	<context:annotation-config/>
+
+	<tx:annotation-driven/>
+
+	<bean id="dataSource" class="org.springframework.samples.petclinic.config.DbcpDataSourceFactory"
+			p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" 
+			p:username="${jdbc.username}" p:password="${jdbc.password}" p:populate="${jdbc.populate}"
+			p:schemaLocation="${jdbc.schemaLocation}" p:dataLocation="${jdbc.dataLocation}"
+			p:dropLocation="${jdbc.dropLocation}"/>
+	
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/hibernate/HibernateClinicTests-context.xml b/src/test/resources/org/springframework/samples/petclinic/hibernate/HibernateClinicTests-context.xml
new file mode 100644
index 00000000..7320035c
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/hibernate/HibernateClinicTests-context.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<bean class="org.springframework.samples.petclinic.hibernate.HibernateClinic">
+		<constructor-arg ref="sessionFactory"/>
+	</bean>
+
+	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
+		p:dataSource-ref="dataSource" p:mappingResources="petclinic.hbm.xml">
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
+				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
+			</props>
+		</property>
+		<property name="eventListeners">
+			<map>
+				<entry key="merge">
+					<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
+				</entry>
+			</map>
+		</property>
+	</bean>
+
+	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
+		p:sessionFactory-ref="sessionFactory" />
+
+	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
+
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests-context.xml b/src/test/resources/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests-context.xml
new file mode 100644
index 00000000..81a53698
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinicTests-context.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
+		p:dataSource-ref="dataSource" />
+
+	<bean class="org.springframework.samples.petclinic.jdbc.SimpleJdbcClinic" />
+
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-entityManager.xml b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-entityManager.xml
new file mode 100644
index 00000000..a9d25738
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-entityManager.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
+
+	<aop:aspectj-autoproxy />
+
+	<bean class="org.springframework.samples.petclinic.aspects.UsageLogAspect" p:historySize="300" />
+
+	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
+
+	<bean id="clinic" class="org.springframework.samples.petclinic.jpa.EntityManagerClinic" />
+
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-hibernateAdapter.xml b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-hibernateAdapter.xml
new file mode 100644
index 00000000..447d1bce
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-hibernateAdapter.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
+		p:database="${jpa.database}" p:showSql="${jpa.showSql}" />
+
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-jpaCommon.xml b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-jpaCommon.xml
new file mode 100644
index 00000000..b873dfc4
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-jpaCommon.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	xsi:schemaLocation="
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+	<context:property-placeholder location="classpath:/jdbc.properties" />
+
+	<tx:annotation-driven />
+
+	<bean id="dataSource" class="org.springframework.samples.petclinic.config.DbcpDataSourceFactory"
+			p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" 
+			p:username="${jdbc.username}" p:password="${jdbc.password}" p:populate="${jdbc.populate}"
+			p:schemaLocation="${jdbc.schemaLocation}" p:dataLocation="${jdbc.dataLocation}"
+			p:dropLocation="${jdbc.dropLocation}"/>
+	
+	<!-- Note: the specific "jpaAdapter" bean sits in adapter context file -->
+	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
+		p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
+		<property name="loadTimeWeaver">
+			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
+		</property>
+	</bean>
+
+	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
+		p:entityManagerFactory-ref="entityManagerFactory" />
+
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-openJpaAdapter.xml b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-openJpaAdapter.xml
new file mode 100644
index 00000000..8f6f7c44
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-openJpaAdapter.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" p:database="${jpa.database}"
+		p:showSql="${jpa.showSql}" />
+
+</beans>
diff --git a/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-toplinkAdapter.xml b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-toplinkAdapter.xml
new file mode 100644
index 00000000..ac031de8
--- /dev/null
+++ b/src/test/resources/org/springframework/samples/petclinic/jpa/applicationContext-toplinkAdapter.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
+
+	<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter"
+		p:databasePlatform="${jpa.databasePlatform}" p:showSql="${jpa.showSql}" />
+
+</beans>
-- 
GitLab