diff --git a/pom.xml b/pom.xml
index 37a6b6a..24353a4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,11 +83,6 @@
commons-collections4
4.4
-
- org.apache.httpcomponents.client5
- httpclient5
- 5.2.1
-
diff --git a/src/main/java/zw/qantra/tm/exceptions/ApiException.java b/src/main/java/zw/qantra/tm/exceptions/ApiException.java
new file mode 100755
index 0000000..8f11093
--- /dev/null
+++ b/src/main/java/zw/qantra/tm/exceptions/ApiException.java
@@ -0,0 +1,15 @@
+package zw.qantra.tm.exceptions;
+
+public class ApiException extends RuntimeException {
+
+ private String message;
+
+ public ApiException(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/src/main/java/zw/qantra/tm/exceptions/GeneralExceptionHandler.java b/src/main/java/zw/qantra/tm/exceptions/GeneralExceptionHandler.java
new file mode 100755
index 0000000..d5380d2
--- /dev/null
+++ b/src/main/java/zw/qantra/tm/exceptions/GeneralExceptionHandler.java
@@ -0,0 +1,99 @@
+package zw.qantra.tm.exceptions;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
+import zw.qantra.tm.rest.ApiResponse;
+
+import java.time.Instant;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * * Handle all exceptions and java bean validation errors
+ * for all endpoints' income data that use the @Valid annotation
+ *
+ * @author Ehab Qadah
+ */
+@ControllerAdvice
+public class GeneralExceptionHandler extends ResponseEntityExceptionHandler {
+
+ private final Logger logger = LoggerFactory.getLogger(getClass().getName());
+
+ public static final String ACCESS_DENIED = "Access denied!";
+ public static final String INVALID_REQUEST = "Invalid request";
+ public static final String ERROR_MESSAGE_TEMPLATE = "message: %s %n requested uri: %s";
+ public static final String LIST_JOIN_DELIMITER = ",";
+ public static final String FIELD_ERROR_SEPARATOR = ": ";
+ private static final String ERRORS_FOR_PATH = "errors {} for path {}";
+ private static final String PATH = "path";
+ private static final String ERRORS = "error";
+ private static final String STATUS = "status";
+ private static final String MESSAGE = "message";
+ private static final String TIMESTAMP = "timestamp";
+ private static final String TYPE = "type";
+ private static final String BODY = "body";
+
+ /**
+ * A general handler for all uncaught exceptions
+ */
+ @ExceptionHandler({Exception.class})
+ public ResponseEntity