diff --git a/schools/src/main/java/com/lambdaschool/schools/config/SwaggerWebMVC.java b/schools/src/main/java/com/lambdaschool/schools/config/SwaggerWebMVC.java
new file mode 100644
index 00000000..4550117f
--- /dev/null
+++ b/schools/src/main/java/com/lambdaschool/schools/config/SwaggerWebMVC.java
@@ -0,0 +1,35 @@
+package com.lambdaschool.schools.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * The application turns off any automatic web page generate done by Spring. This is done to improve exception handling.
+ * However, we do need some web page generate done for Swagger, so we do that here.
+ */
+@Configuration
+public class SwaggerWebMVC
+ implements WebMvcConfigurer
+{
+ /**
+ * Adds the Swagger web pages to Spring.
+ * This still gives the following warning
+ *
+ * No mapping for GET /
+ * No mapping for GET /csrf
+ *
+ * All works though
+ *
+ * @param registry the place that holds the web pages for Spring
+ */
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry)
+ {
+ registry.addResourceHandler("swagger-ui.html")
+ .addResourceLocations("classpath:/META-INF/resources/");
+
+ registry.addResourceHandler("/webjars/**")
+ .addResourceLocations("classpath:/META-INF/resources/webjars/");
+ }
+}
\ No newline at end of file
diff --git a/schools/src/main/java/com/lambdaschool/schools/exceptions/CustomErrorDetails.java b/schools/src/main/java/com/lambdaschool/schools/exceptions/CustomErrorDetails.java
new file mode 100644
index 00000000..2af782f6
--- /dev/null
+++ b/schools/src/main/java/com/lambdaschool/schools/exceptions/CustomErrorDetails.java
@@ -0,0 +1,45 @@
+package com.lambdaschool.schools.exceptions;
+
+import com.lambdaschool.schools.services.HelperFunctions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.WebRequest;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Component
+public class CustomErrorDetails extends DefaultErrorAttributes
+{
+ @Autowired
+ HelperFunctions helperFunctions;
+
+ @Override
+ public Map getErrorAttributes(
+ WebRequest webRequest,
+ boolean includeStackTrace)
+ {
+ // title
+ // status
+ // detail
+ // timestamp
+ // developermessage
+ //
+ // errors
+
+ Map errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
+ Map errorDetails = new LinkedHashMap<>();
+
+ errorDetails.put("title", errorAttributes.get("error"));
+ errorDetails.put("status", errorAttributes.get("status"));
+ errorDetails.put("detail", errorAttributes.get("message"));
+ errorDetails.put("timestamp", errorAttributes.get("timestamp"));
+ errorDetails.put("developerMessage", "path: " + errorAttributes.get("path"));
+
+ errorDetails.put("errors", helperFunctions.getConstraintViolation(this.getError(webRequest)));
+
+ return errorDetails;
+ }
+}
\ No newline at end of file
diff --git a/schools/src/main/java/com/lambdaschool/schools/exceptions/ResourceNotFoundException.java b/schools/src/main/java/com/lambdaschool/schools/exceptions/ResourceNotFoundException.java
new file mode 100644
index 00000000..2d1a3967
--- /dev/null
+++ b/schools/src/main/java/com/lambdaschool/schools/exceptions/ResourceNotFoundException.java
@@ -0,0 +1,8 @@
+package com.lambdaschool.schools.exceptions;
+
+public class ResourceNotFoundException extends RuntimeException {
+
+ public ResourceNotFoundException(String message) {
+ super("Error from a lambda school app: " + message);
+ }
+}
diff --git a/schools/src/main/java/com/lambdaschool/schools/handlers/RestExceptionHandler.java b/schools/src/main/java/com/lambdaschool/schools/handlers/RestExceptionHandler.java
new file mode 100644
index 00000000..fcbdd159
--- /dev/null
+++ b/schools/src/main/java/com/lambdaschool/schools/handlers/RestExceptionHandler.java
@@ -0,0 +1,572 @@
+package com.lambdaschool.schools.handlers;
+
+
+import com.lambdaschool.schools.exceptions.ResourceNotFoundException;
+import com.lambdaschool.schools.models.ErrorDetail;
+import com.lambdaschool.schools.services.HelperFunctions;
+import org.springframework.beans.ConversionNotSupportedException;
+import org.springframework.beans.TypeMismatchException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageNotWritableException;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpMediaTypeNotAcceptableException;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingPathVariableException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.ServletRequestBindingException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
+import org.springframework.web.multipart.support.MissingServletRequestPartException;
+import org.springframework.web.servlet.NoHandlerFoundException;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * This is the driving class when an exception occurs. All exceptions are handled here.
+ * This class is shared across all controllers due to the annotation RestControllerAdvice;
+ * this class gives advice to all controllers on how to handle exceptions.
+ * Due to the annotation Order(Ordered.HIGHEST_PRECEDENCE), this class takes precedence over all other controller advisors.
+ */
+@Order(Ordered.HIGHEST_PRECEDENCE)
+@RestControllerAdvice
+public class RestExceptionHandler
+ extends ResponseEntityExceptionHandler
+{
+ /**
+ * Connects this class with the Helper Functions
+ */
+ @Autowired
+ private HelperFunctions helperFunctions;
+
+ /**
+ * The constructor for the RestExceptionHandler. Currently we do not do anything special. We just call the parent constructor.
+ */
+ public RestExceptionHandler()
+ {
+ super();
+ }
+
+ /**
+ * Our custom handling of ResourceNotFoundExceptions. This gets thrown manually by our application.
+ *
+ * @param rnfe All the information about the exception that is thrown.
+ * @return The error details for displaying to the client plus the status Not Found.
+ */
+ @ExceptionHandler(ResourceNotFoundException.class)
+ public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException rnfe)
+ {
+ ErrorDetail errorDetail = new ErrorDetail();
+ errorDetail.setTimestamp(new Date());
+ errorDetail.setStatus(HttpStatus.NOT_FOUND.value());
+ errorDetail.setTitle("Resource Not Found");
+ errorDetail.setDetail(rnfe.getMessage());
+ errorDetail.setDeveloperMessage(rnfe.getClass()
+ .getName());
+ errorDetail.setErrors(helperFunctions.getConstraintViolation(rnfe));
+
+ return new ResponseEntity<>(errorDetail,
+ null,
+ HttpStatus.NOT_FOUND);
+ }
+
+
+
+ /**
+ * All other exceptions not handled elsewhere are handled by this method.
+ *
+ * @param ex The actual exception used to get error messages
+ * @param body The body of this request. Not used in this method.
+ * @param headers Headers that are involved in this request. Not used in this method.
+ * @param status The Http Status generated by the exception. Forwarded to the client.
+ * @param request The request that was made by the client. Not used in this method.
+ * @return The error details to display to the client plus the status that from the exception.
+ */
+ @Override
+ protected ResponseEntity