diff --git a/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java
index a393dc2483fac635661f05abb036c610b4fd1edf..58e3f907e967d2f1eadc31592c4a87be04891237 100644
--- a/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java
+++ b/src/main/java/de/thm/arsnova/controller/AbstractControllerExceptionHandler.java
@@ -1,15 +1,23 @@
 package de.thm.arsnova.controller;
 
+import org.checkerframework.checker.nullness.qual.NonNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.event.Level;
 import org.springframework.beans.factory.annotation.Value;
 
 import java.util.HashMap;
 import java.util.Map;
 
 public class AbstractControllerExceptionHandler {
+	private static final Logger logger = LoggerFactory.getLogger(AbstractControllerExceptionHandler.class);
+
 	/* Since exception messages might contain sensitive data, they are not exposed by default. */
 	@Value("${api.expose-error-messages:false}") private boolean exposeMessages;
 
-	protected Map<String, Object> handleException(Throwable e) {
+	protected Map<String, Object> handleException(@NonNull Throwable e, @NonNull Level level) {
+		final String message = e.getMessage() != null ? e.getMessage() : "";
+		log(level, message, e);
 		final Map<String, Object> result = new HashMap<>();
 		result.put("errorType", e.getClass().getSimpleName());
 		if (exposeMessages) {
@@ -18,4 +26,24 @@ public class AbstractControllerExceptionHandler {
 
 		return result;
 	}
+
+	private void log(Level level, String message, Throwable e) {
+		switch (level) {
+			case ERROR:
+				logger.error(message, e);
+				break;
+			case WARN:
+				logger.warn(message, e);
+				break;
+			case INFO:
+				logger.info(message, e);
+				break;
+			case DEBUG:
+				logger.debug(message, e);
+				break;
+			case TRACE:
+				logger.trace(message, e);
+				break;
+		}
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java
index 433f259aadef3df37d60a0276e6da733d99d272d..9e91b10a19e4efa4be548001422831f4a09e58f9 100644
--- a/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java
+++ b/src/main/java/de/thm/arsnova/controller/ControllerExceptionHandler.java
@@ -25,6 +25,7 @@ import de.thm.arsnova.exceptions.NotImplementedException;
 import de.thm.arsnova.exceptions.PayloadTooLargeException;
 import de.thm.arsnova.exceptions.PreconditionFailedException;
 import de.thm.arsnova.exceptions.UnauthorizedException;
+import org.slf4j.event.Level;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.security.access.AccessDeniedException;
@@ -46,25 +47,32 @@ import java.util.Map;
  */
 @ControllerAdvice
 public class ControllerExceptionHandler extends AbstractControllerExceptionHandler {
+	@ExceptionHandler(NoContentException.class)
+	@ResponseBody
+	@ResponseStatus(HttpStatus.NO_CONTENT)
+	public Map<String, Object> handleNoContentException(final Exception e, final HttpServletRequest request) {
+		return handleException(e, Level.TRACE);
+	}
+
 	@ExceptionHandler(NotFoundException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.NOT_FOUND)
 	public Map<String, Object> handleNotFoundException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.TRACE);
 	}
 
 	@ExceptionHandler(UnauthorizedException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.UNAUTHORIZED)
 	public Map<String, Object> handleUnauthorizedException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.TRACE);
 	}
 
 	@ExceptionHandler(AuthenticationCredentialsNotFoundException.class)
 	@ResponseStatus(HttpStatus.UNAUTHORIZED)
 	@ResponseBody
 	public Map<String, Object> handleAuthenticationCredentialsNotFoundException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(AccessDeniedException.class)
@@ -83,55 +91,48 @@ public class ControllerExceptionHandler extends AbstractControllerExceptionHandl
 			response.setStatus(HttpStatus.FORBIDDEN.value());
 		}
 
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(ForbiddenException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.FORBIDDEN)
 	public Map<String, Object> handleForbiddenException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
-	}
-
-	@ExceptionHandler(NoContentException.class)
-	@ResponseBody
-	@ResponseStatus(HttpStatus.NO_CONTENT)
-	public Map<String, Object> handleNoContentException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(BadRequestException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.BAD_REQUEST)
 	public Map<String, Object> handleBadRequestException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(PreconditionFailedException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.PRECONDITION_FAILED)
 	public Map<String, Object> handlePreconditionFailedException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(NotImplementedException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.NOT_IMPLEMENTED)
 	public Map<String, Object> handleNotImplementedException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(PayloadTooLargeException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE)
 	public Map<String, Object> handlePayloadTooLargeException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 
 	@ExceptionHandler(HttpMessageNotReadableException.class)
 	@ResponseBody
 	@ResponseStatus(HttpStatus.BAD_REQUEST)
 	public Map<String, Object> handleHttpMessageNotReadableException(final Exception e, final HttpServletRequest request) {
-		return handleException(e);
+		return handleException(e, Level.DEBUG);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/CourseController.java b/src/main/java/de/thm/arsnova/controller/CourseController.java
index 48e4ece77443ef4d12ec17c9f9eb5083f18d8b47..e8919bc4328b9b8f96daba68863b5770b5eac614 100644
--- a/src/main/java/de/thm/arsnova/controller/CourseController.java
+++ b/src/main/java/de/thm/arsnova/controller/CourseController.java
@@ -25,8 +25,6 @@ import de.thm.arsnova.exceptions.NotImplementedException;
 import de.thm.arsnova.exceptions.UnauthorizedException;
 import de.thm.arsnova.services.IUserService;
 import io.swagger.annotations.ApiParam;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -44,9 +42,6 @@ import java.util.List;
  */
 @RestController
 public class CourseController extends AbstractController {
-
-	private static final Logger logger = LoggerFactory.getLogger(CourseController.class);
-
 	@Autowired(required = false)
 	private ConnectorClient connectorClient;
 
diff --git a/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java b/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java
index fe8546c826bfe65e6c36cfc1a2b80d3f8d1eb25e..3d124928001158db3c07765f8f4ad014bf677ef6 100644
--- a/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java
+++ b/src/main/java/de/thm/arsnova/controller/DefaultControllerExceptionHandler.java
@@ -1,5 +1,6 @@
 package de.thm.arsnova.controller;
 
+import org.slf4j.event.Level;
 import org.springframework.core.annotation.AnnotationUtils;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ControllerAdvice;
@@ -26,6 +27,6 @@ public class DefaultControllerExceptionHandler extends AbstractControllerExcepti
 			throw e;
 		}
 
-		return handleException(e);
+		return handleException(e, Level.ERROR);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/FeedbackController.java b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
index d0e77fdda10508be1d3fe1ff951296a3392396b4..2f3e3b16c7b509ee4336f6dda7805ef240245436 100644
--- a/src/main/java/de/thm/arsnova/controller/FeedbackController.java
+++ b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
@@ -23,8 +23,6 @@ import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.IFeedbackService;
 import de.thm.arsnova.services.IUserService;
 import de.thm.arsnova.web.DeprecatedApi;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -42,9 +40,6 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 public class FeedbackController extends AbstractController {
-
-	private static final Logger logger = LoggerFactory.getLogger(FeedbackController.class);
-
 	@Autowired
 	private IFeedbackService feedbackService;
 
@@ -99,14 +94,9 @@ public class FeedbackController extends AbstractController {
 			@RequestBody final int value
 			) {
 		User user = userService.getCurrentUser();
-		if (feedbackService.saveFeedback(sessionkey, value, user)) {
-			Feedback feedback = feedbackService.getFeedback(sessionkey);
-			if (feedback != null) {
-				return feedback;
-			}
-			throw new RuntimeException();
-		}
+		feedbackService.saveFeedback(sessionkey, value, user);
+		Feedback feedback = feedbackService.getFeedback(sessionkey);
 
-		throw new NotFoundException();
+		return feedback;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
index 40674a0e88e135e8e2650e3f67c25f85b972035e..85ee7c9c57380a1bd5dd757c4d97c5c440c527fd 100644
--- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
@@ -31,8 +31,6 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -55,9 +53,6 @@ import java.util.List;
 @RequestMapping("/lecturerquestion")
 @Api(value = "/lecturerquestion", description = "Operations for Lecture Questions")
 public class LecturerQuestionController extends PaginationController {
-
-	private static final Logger logger = LoggerFactory.getLogger(LecturerQuestionController.class);
-
 	@Autowired
 	private IQuestionService questionService;
 
diff --git a/src/main/java/de/thm/arsnova/controller/LoginController.java b/src/main/java/de/thm/arsnova/controller/LoginController.java
index 0420a72400fa12dc7954ba8a93c052b927755a90..090ac606741cb563d060e8d92f60b6f4da1bb490 100644
--- a/src/main/java/de/thm/arsnova/controller/LoginController.java
+++ b/src/main/java/de/thm/arsnova/controller/LoginController.java
@@ -174,7 +174,7 @@ public class LoginController extends AbstractController {
 					return;
 				}
 			} catch (AuthenticationException e) {
-				logger.info("Authentication failed: {}", e.getMessage());
+				logger.info("Database authentication failed.", e);
 			}
 
 			userService.increaseFailedLoginCount(addr);
@@ -197,9 +197,9 @@ public class LoginController extends AbstractController {
 
 						return;
 					}
-					logger.info("LDAPLOGIN: {}", auth.isAuthenticated());
+					logger.info("LDAP authentication failed.");
 				} catch (AuthenticationException e) {
-					logger.info("No LDAP login: {}", e);
+					logger.info("LDAP authentication failed.", e);
 				}
 
 				userService.increaseFailedLoginCount(addr);
diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index fb5ad95f66c81cb3d7ba9104da0fe541974957ff..1c1c6599bd3873f1a4519561d905a69faac235f3 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -37,8 +37,6 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.AccessDeniedException;
@@ -62,9 +60,6 @@ import java.util.List;
 @RequestMapping("/session")
 @Api(value = "/session", description = "the Session Controller API")
 public class SessionController extends PaginationController {
-
-	private static final Logger logger = LoggerFactory.getLogger(SessionController.class);
-
 	@Autowired
 	private ISessionService sessionService;
 
diff --git a/src/main/java/de/thm/arsnova/controller/SocketController.java b/src/main/java/de/thm/arsnova/controller/SocketController.java
index 63c9fb35a683f991710b8d57b3af9b811fcafb86..685d1ff7dccd6432aff1348e63c924ee76ef5576 100644
--- a/src/main/java/de/thm/arsnova/controller/SocketController.java
+++ b/src/main/java/de/thm/arsnova/controller/SocketController.java
@@ -70,13 +70,13 @@ public class SocketController extends AbstractController {
 	public void authorize(@ApiParam(value = "sessionMap", required = true) @RequestBody final Map <String, String> sessionMap, @ApiParam(value = "response", required = true) final HttpServletResponse response) {
 		String socketid = sessionMap.get("session");
 		if (null == socketid) {
-			logger.debug("Expected property 'session' missing");
+			logger.debug("Expected property 'session' missing.");
 			response.setStatus(HttpStatus.BAD_REQUEST.value());
 			return;
 		}
 		User u = userService.getCurrentUser();
 		if (null == u) {
-			logger.debug("Client {} requested to assign Websocket session but has not authenticated", socketid);
+			logger.debug("Client {} requested to assign Websocket session but has not authenticated.", socketid);
 			response.setStatus(HttpStatus.FORBIDDEN.value());
 			return;
 		}
diff --git a/src/main/java/de/thm/arsnova/controller/UserController.java b/src/main/java/de/thm/arsnova/controller/UserController.java
index 6f955b5a8e10c17c637ac95cc90ae95301fe643b..df9237599b782733210c06f11fb39edb4c9ec10c 100644
--- a/src/main/java/de/thm/arsnova/controller/UserController.java
+++ b/src/main/java/de/thm/arsnova/controller/UserController.java
@@ -20,8 +20,6 @@ package de.thm.arsnova.controller;
 import de.thm.arsnova.entities.DbUser;
 import de.thm.arsnova.services.IUserService;
 import de.thm.arsnova.services.UserSessionService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 import org.springframework.stereotype.Controller;
@@ -48,9 +46,6 @@ public class UserController extends AbstractController {
 	@Autowired
 	private UserSessionService userSessionService;
 
-	private static final Logger logger = LoggerFactory
-			.getLogger(UserController.class);
-
 	@RequestMapping(value = "/register", method = RequestMethod.POST)
 	public void register(@RequestParam final String username,
 			@RequestParam final String password,
diff --git a/src/main/java/de/thm/arsnova/controller/WelcomeController.java b/src/main/java/de/thm/arsnova/controller/WelcomeController.java
index 9313f5ef9d652c934da711ed3ded1328463a0af2..c036abda8e3be9e8068340da46af383a9baf5969 100644
--- a/src/main/java/de/thm/arsnova/controller/WelcomeController.java
+++ b/src/main/java/de/thm/arsnova/controller/WelcomeController.java
@@ -86,13 +86,13 @@ public class WelcomeController extends AbstractController {
 		) {
 		/* Block requests from the server itself to prevent DoS attacks caused by request loops */
 		if ("127.0.0.1".equals(request.getRemoteAddr())) {
-			throw new BadRequestException();
+			throw new BadRequestException("Access to localhost not allowed.");
 		}
 		/* Block requests to servers in private networks */
 		try {
 			final InetAddress addr = InetAddress.getByName(new URL(url).getHost());
 			if (addr.isSiteLocalAddress()) {
-				throw new BadRequestException();
+				throw new BadRequestException("Access to site-local addresses not allowed.");
 			}
 		} catch (UnknownHostException | MalformedURLException e) {
 			throw new BadRequestException();
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 6c6982aa64ecac222ff8dcfb42534b71e02fa0f7..ba8775802711219853d001b7c427892e7414d892 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -145,7 +145,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		try {
 			database.saveDocument(d);
 		} catch (final IOException e) {
-			logger.error("Logging of '{}' event to database failed.", event);
+			logger.error("Logging of '{}' event to database failed.", event, e);
 		}
 	}
 
@@ -546,7 +546,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		if (document.has("keyword")) {
 			return (String) document.get("keyword");
 		}
-		logger.error("No session found for internal id: {}", internalSessionId);
+		logger.error("No session found for internal id {}.", internalSessionId);
 		return null;
 	}
 
@@ -559,11 +559,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 						);
 				database = session.getDatabase(databaseName);
 			} catch (final Exception e) {
-				logger.error(
-						"Cannot connect to CouchDB database '" + databaseName
-						+ "' on host '" + databaseHost
-						+ "' using port " + databasePort
-						);
+				logger.error("Cannot connect to CouchDB database '{}' on host '{}' using port {}.",
+						databaseName, databaseHost, databasePort, e);
 			}
 		}
 
@@ -584,7 +581,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			question.set_rev(q.getRev());
 			return question;
 		} catch (final IOException e) {
-			logger.error("Could not save question {}", question);
+			logger.error("Could not save question {}.", question, e);
 		}
 		return null;
 	}
@@ -715,7 +712,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return question;
 		} catch (final IOException e) {
-			logger.error("Could not update question {}", question);
+			logger.error("Could not update question {}.", question, e);
 		}
 
 		return null;
@@ -742,7 +739,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return question;
 		} catch (final IOException e) {
-			logger.error("Could not save interposed question {}", question);
+			logger.error("Could not save interposed question {}.", question, e);
 		}
 
 		return null;
@@ -766,7 +763,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			question.setSessionKeyword(getSessionKeyword(question.getSessionId()));
 			return question;
 		} catch (final IOException e) {
-			logger.error("Could not get question with id {}", id);
+			logger.error("Could not get question {}.", id, e);
 		}
 		return null;
 	}
@@ -840,7 +837,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			getDatabase().saveDocument(new Document(json));
 			return session;
 		} catch (final IOException e) {
-			logger.error("Failed to update lastOwnerActivity for Session {}", session);
+			logger.error("Failed to update lastOwnerActivity for session {}.", session, e);
 			return session;
 		}
 	}
@@ -867,7 +864,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return count;
 		} catch (final IOException e) {
-			logger.error("IOException: Could not delete question {}", question.get_id());
+			logger.error("Could not delete question {}.", question.get_id(), e);
 		}
 
 		return 0;
@@ -931,14 +928,14 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 				if (database.bulkSaveDocuments(answersToDelete.toArray(new Document[answersToDelete.size()]))) {
 					count += partition.size();
 				} else {
-					logger.error("Could not bulk delete answers");
+					logger.error("Could not bulk delete answers.");
 				}
 			}
 			log("delete", "type", "answer", "answerCount", count);
 
 			return count;
 		} catch (final IOException e) {
-			logger.error("IOException: Could not delete answers for question {}", question.get_id());
+			logger.error("Could not delete answers for question {}.", question.get_id(), e);
 		}
 
 		return 0;
@@ -1363,7 +1360,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			}
 			return stats;
 		} catch (final Exception e) {
-			logger.error("Error while retrieving session count", e);
+			logger.error("Could not retrieve session count.", e);
 		}
 		return stats;
 	}
@@ -1377,7 +1374,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			question.setSessionId(getSessionKeyword(question.getSessionId()));
 			return question;
 		} catch (final IOException e) {
-			logger.error("Could not load interposed question {}", questionId);
+			logger.error("Could not load interposed question {}.", questionId, e);
 		}
 		return null;
 	}
@@ -1390,7 +1387,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			document.put("read", question.isRead());
 			getDatabase().saveDocument(document);
 		} catch (final IOException e) {
-			logger.error("Could not mark interposed question as read {}", question.get_id());
+			logger.error("Could not mark interposed question as read {}.", question.get_id(), e);
 		}
 	}
 
@@ -1455,7 +1452,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			final Document doc = new Document(json);
 			getDatabase().saveDocument(doc);
 		} catch (IOException e) {
-			logger.error("Could not clean up logged_in document of {}", user.getUsername());
+			logger.error("Could not clean up logged_in document of {}.", user.getUsername(), e);
 		}
 		return result;
 	}
@@ -1521,7 +1518,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			final Document doc = new Document(json);
 			getDatabase().saveDocument(doc);
 		} catch (IOException e) {
-			logger.error("Could not clean up logged_in document of {}", username);
+			logger.error("Could not clean up logged_in document of {}.", username, e);
 		}
 		return result;
 	}
@@ -1588,7 +1585,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 				this.publisher.publishEvent(new NewAnswerEvent(this, e.getSession(), e.getAnswer(), e.getUser(), e.getQuestion()));
 			}
 		} catch (IOException e) {
-			logger.error("Could not bulk save answers from queue");
+			logger.error("Could not bulk save answers from queue.", e);
 		}
 	}
 
@@ -1612,7 +1609,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			answer.set_rev(a.getRev());
 			return answer;
 		} catch (final IOException e) {
-			logger.error("Could not save answer {}", answer);
+			logger.error("Could not update answer {}.", answer, e);
 		}
 		return null;
 	}
@@ -1625,7 +1622,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			database.deleteDocument(database.getDocument(answerId));
 			log("delete", "type", "answer");
 		} catch (final IOException e) {
-			logger.error("Could not delete answer {} because of {}", answerId, e.getMessage());
+			logger.error("Could not delete answer {}.", answerId, e);
 		}
 	}
 
@@ -1635,7 +1632,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			deleteDocument(question.get_id());
 			log("delete", "type", "comment");
 		} catch (final IOException e) {
-			logger.error("Could not delete interposed question {} because of {}", question.get_id(), e.getMessage());
+			logger.error("Could not delete interposed question {}.", question.get_id(), e);
 		}
 	}
 
@@ -1709,7 +1706,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return session;
 		} catch (final IOException e) {
-			logger.error("Could not lock session {}", session);
+			logger.error("Could not update session {}.", session, e);
 		}
 
 		return null;
@@ -1724,7 +1721,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			database.saveDocument(s);
 			session.set_rev(s.getRev());
 		} catch (final IOException e) {
-			logger.error("Could not lock session {}", session);
+			logger.error("Could not update creator for session {}.", session, e);
 		}
 
 		return session;
@@ -1740,7 +1737,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			logger.debug("Deleted session document {} and related data.", session.get_id());
 			log("delete", "type", "session", "id", session.get_id());
 		} catch (final IOException e) {
-			logger.error("Could not delete session {}", session);
+			logger.error("Could not delete session {}.", session, e);
 		}
 
 		return count;
@@ -1797,7 +1794,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 					if (getDatabase().bulkSaveDocuments(newDocs.toArray(new Document[newDocs.size()]))) {
 						count += newDocs.size();
 					} else {
-						logger.error("Could not bulk delete visited session lists");
+						logger.error("Could not bulk delete visited session lists.");
 					}
 				}
 			}
@@ -1809,7 +1806,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return count;
 		} catch (IOException e) {
-			logger.error("Could not delete visited session lists of inactive users.");
+			logger.error("Could not delete visited session lists of inactive users.", e);
 		}
 
 		return 0;
@@ -2101,7 +2098,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			try {
 				deleteDocument(document.getId());
 			} catch (final IOException e) {
-				logger.error("Could not delete all interposed questions {}", session);
+				logger.error("Could not delete all interposed questions {}.", session, e);
 			}
 		}
 
@@ -2142,7 +2139,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		try {
 			database.bulkSaveDocuments(documents.toArray(new Document[documents.size()]));
 		} catch (final IOException e) {
-			logger.error("Could not bulk publish all questions: {}", e.getMessage());
+			logger.error("Could not bulk publish all questions.", e);
 		}
 	}
 
@@ -2180,7 +2177,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		try {
 			database.bulkSaveDocuments(documents.toArray(new Document[documents.size()]));
 		} catch (final IOException e) {
-			logger.error("Could not bulk set voting admission for all questions: {}", e.getMessage());
+			logger.error("Could not bulk set voting admission for all questions.", e);
 		}
 	}
 
@@ -2243,7 +2240,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		try {
 			database.bulkSaveDocuments(documents.toArray(new Document[documents.size()]));
 		} catch (final IOException e) {
-			logger.error("Could not bulk reset all questions round state: {}", e.getMessage());
+			logger.error("Could not bulk reset all questions round state.", e);
 		}
 	}
 
@@ -2267,7 +2264,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return allAnswers.size();
 		} catch (IOException e) {
-			logger.error("Could not bulk delete answers: {}", e.getMessage());
+			logger.error("Could not bulk delete answers.", e);
 		}
 
 		return 0;
@@ -2303,7 +2300,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return new int[] {deleteList.size(), result.size()};
 		} catch (IOException e) {
-			logger.error("Could not bulk delete questions and answers: {}", e.getMessage());
+			logger.error("Could not bulk delete questions and answers.", e);
 		}
 
 		return new int[] {0, 0};
@@ -2376,7 +2373,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return user;
 		} catch (IOException e) {
-			logger.error("Could not save user {}", user);
+			logger.error("Could not save user {}.", user, e);
 		}
 
 		return null;
@@ -2406,7 +2403,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return true;
 		} catch (IOException e) {
-			logger.error("Could not delete user {}", dbUser.getId());
+			logger.error("Could not delete user {}.", dbUser.getId(), e);
 		}
 
 		return false;
@@ -2446,7 +2443,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return count;
 		} catch (IOException e) {
-			logger.error("Could not delete inactive users.");
+			logger.error("Could not delete inactive users.", e);
 		}
 
 		return 0;
@@ -2531,7 +2528,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			database.bulkSaveDocuments(motds.toArray(new Document[motds.size()]));
 			database.bulkSaveDocuments(documents.toArray(new Document[documents.size()]));
 		} catch (IOException e) {
-			logger.error("Could not import this session: {}", e.getMessage());
+			logger.error("Could not import session.", e);
 			// Something went wrong, delete this session since we do not want a partial import
 			this.deleteSession(session);
 			return null;
@@ -2824,7 +2821,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return motd;
 		} catch (IOException e) {
-			logger.error("Could not save motd {}", motd);
+			logger.error("Could not save MotD {}.", motd, e);
 		}
 
 		return null;
@@ -2836,7 +2833,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		try {
 			this.deleteDocument(motd.get_id());
 		} catch (IOException e) {
-			logger.error("Could not delete Motd {}", motd.get_id());
+			logger.error("Could not delete MotD {}.", motd.get_id(), e);
 		}
 	}
 
@@ -2879,7 +2876,7 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return motdlist;
 		} catch (IOException e) {
-			logger.error("Could not save motdlist {}", motdlist);
+			logger.error("Could not save MotD list {}.", motdlist, e);
 		}
 
 		return null;
diff --git a/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java b/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java
index c9b728742518288d38a567ed398dab1677c6de6a..b7e80b833cb0f6053e9d0c1f77fe63813272cdd9 100644
--- a/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/BadRequestException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class BadRequestException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public BadRequestException() {
+		super();
+	}
+
+	public BadRequestException(String message) {
+		super(message);
+	}
+
+	public BadRequestException(Throwable e) {
+		super(e);
+	}
+
+	public BadRequestException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java b/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java
index 05ed5bf3bb633258cdecade7a5ec1621bfe76752..05b21dab60ba76f181a0343c4420d7129814e966 100644
--- a/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/ForbiddenException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class ForbiddenException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public ForbiddenException() {
+		super();
+	}
+
+	public ForbiddenException(String message) {
+		super(message);
+	}
+
+	public ForbiddenException(Throwable e) {
+		super(e);
+	}
+
+	public ForbiddenException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/NoContentException.java b/src/main/java/de/thm/arsnova/exceptions/NoContentException.java
index f0de3c46c0f629be82b65e8b425d44c410c6e1c6..f3f7e81649b77d04bf4431b45aeebd857b71eff8 100644
--- a/src/main/java/de/thm/arsnova/exceptions/NoContentException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/NoContentException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class NoContentException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public NoContentException() {
+		super();
+	}
+
+	public NoContentException(String message) {
+		super(message);
+	}
+
+	public NoContentException(Throwable e) {
+		super(e);
+	}
+
+	public NoContentException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java b/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java
index 0937ebde41a488665a864a5aac53cbc295fd3af5..a0a12b25add162e74557c33502cea8dcc3697b90 100644
--- a/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/NotFoundException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class NotFoundException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public NotFoundException() {
+		super();
+	}
+
+	public NotFoundException(String message) {
+		super(message);
+	}
+
+	public NotFoundException(Throwable e) {
+		super(e);
+	}
+
+	public NotFoundException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java b/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java
index ed5e30f6516458b30faa96adc3010389e6baf57e..93f7ed795537fbd2a263059c7add9bc3c3b1f3b7 100644
--- a/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/NotImplementedException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class NotImplementedException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public NotImplementedException() {
+		super();
+	}
+
+	public NotImplementedException(String message) {
+		super(message);
+	}
+
+	public NotImplementedException(Throwable e) {
+		super(e);
+	}
+
+	public NotImplementedException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java b/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java
index 6562a149b6ddf8e5dc7521ae70ec54165b1be75a..9233b58f25fd465979943a782c9a9d4fced27e25 100644
--- a/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/PayloadTooLargeException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class PayloadTooLargeException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public PayloadTooLargeException() {
+		super();
+	}
+
+	public PayloadTooLargeException(String message) {
+		super(message);
+	}
+
+	public PayloadTooLargeException(Throwable e) {
+		super(e);
+	}
+
+	public PayloadTooLargeException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java b/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java
index 423b3a4f88440f23c6413f02520d17a11b4f5d5b..e14d30c7edd66c8bc7dbd669144eda48a4a64d32 100644
--- a/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/PreconditionFailedException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class PreconditionFailedException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public PreconditionFailedException() {
+		super();
+	}
+
+	public PreconditionFailedException(String message) {
+		super(message);
+	}
+
+	public PreconditionFailedException(Throwable e) {
+		super(e);
+	}
+
+	public PreconditionFailedException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java b/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java
index 7a4c3dc8a2ef623705b780e29c7d03c167f8fdd9..f6a91249b2681fea1bd816b0b9dadde1ab86748a 100644
--- a/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java
+++ b/src/main/java/de/thm/arsnova/exceptions/UnauthorizedException.java
@@ -5,4 +5,20 @@ package de.thm.arsnova.exceptions;
  */
 public class UnauthorizedException extends RuntimeException {
 	private static final long serialVersionUID = 1L;
+
+	public UnauthorizedException() {
+		super();
+	}
+
+	public UnauthorizedException(String message) {
+		super(message);
+	}
+
+	public UnauthorizedException(Throwable e) {
+		super(e);
+	}
+
+	public UnauthorizedException(String message, Throwable e) {
+		super(message, e);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index 275adfedb352fec8660d4101285c27f0abfad2f8..aa1e999c4db651d3d0345bb4aaad80e61c5e208d 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -112,7 +112,7 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 			// base64 adds offset to filesize, formula taken from: http://en.wikipedia.org/wiki/Base64#MIME
 			final int fileSize = (int) ((question.getImage().length() - 814) / 1.37);
 			if (fileSize > uploadFileSizeByte) {
-				logger.error("Could not save file. File is too large with " + fileSize + " Byte.");
+				logger.error("Could not save file. File is too large with {} Byte.", fileSize);
 				throw new BadRequestException();
 			}
 		}
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 7ea54a72eabbf8781455a06639e139927835c10a..77a22e5b3999fb7d0d945a06e1b53c07fc0097a3 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -174,7 +174,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		if (connectorClient != null && session.isCourseSession()) {
 			final String courseid = session.getCourseId();
 			if (!connectorClient.getMembership(user.getUsername(), courseid).isMember()) {
-				throw new ForbiddenException();
+				throw new ForbiddenException("User is no course member.");
 			}
 		}
 
@@ -205,15 +205,15 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		}
 		if (!session.isActive()) {
 			if (user.hasRole(UserSessionService.Role.STUDENT)) {
-				throw new ForbiddenException();
+				throw new ForbiddenException("User is not session creator.");
 			} else if (user.hasRole(UserSessionService.Role.SPEAKER) && !session.isCreator(user)) {
-				throw new ForbiddenException();
+				throw new ForbiddenException("User is not session creator.");
 			}
 		}
 		if (connectorClient != null && session.isCourseSession()) {
 			final String courseid = session.getCourseId();
 			if (!connectorClient.getMembership(user.getUsername(), courseid).isMember()) {
-				throw new ForbiddenException();
+				throw new ForbiddenException("User is no course member.");
 			}
 		}
 		return session;
@@ -336,7 +336,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		final Session session = databaseDao.getSessionFromKeyword(sessionkey);
 		final User user = userService.getCurrentUser();
 		if (!session.isCreator(user)) {
-			throw new ForbiddenException();
+			throw new ForbiddenException("User is not session creator.");
 		}
 		session.setActive(lock);
 		this.publisher.publishEvent(new StatusSessionEvent(this, session));
@@ -374,7 +374,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 	public Session changeSessionCreator(String sessionkey, String newCreator) {
 		final Session existingSession = databaseDao.getSessionFromKeyword(sessionkey);
 		if (existingSession == null) {
-			throw new RuntimeException("Error while trying to get the session with sessionkey: " + sessionkey);
+			throw new NullPointerException("Could not load session " + sessionkey + ".");
 		}
 		return databaseDao.changeSessionCreator(existingSession, newCreator);
 	}
@@ -424,7 +424,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		final User user = userService.getCurrentUser();
 		final SessionInfo info = databaseDao.importSession(user, importSession);
 		if (info == null) {
-			throw new RuntimeException("Error while importing the session.");
+			throw new NullPointerException("Could not import session.");
 		}
 		return info;
 	}
@@ -460,7 +460,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		final Session session = databaseDao.getSessionFromKeyword(sessionkey);
 		final User user = userService.getCurrentUser();
 		if (!session.isCreator(user)) {
-			throw new UnauthorizedException();
+			throw new UnauthorizedException("User is not session creator.");
 		}
 		session.setFeatures(features);
 		this.publisher.publishEvent(new FeatureChangeEvent(this, session));
@@ -472,7 +472,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		final Session session = databaseDao.getSessionFromKeyword(sessionkey);
 		final User user = userService.getCurrentUser();
 		if (!session.isCreator(user)) {
-			throw new UnauthorizedException();
+			throw new UnauthorizedException("User is not session creator.");
 		}
 		if (!lock) {
 			feedbackService.cleanFeedbackVotesInSession(sessionkey, 0);
@@ -488,7 +488,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		final Session session = databaseDao.getSessionFromKeyword(sessionkey);
 		final User user = userService.getCurrentUser();
 		if (!session.isCreator(user)) {
-			throw new UnauthorizedException();
+			throw new UnauthorizedException("User is not session creator.");
 		}
 		session.setFlipFlashcards(flip);
 		this.publisher.publishEvent(new FlipFlashcardsEvent(this, session));
@@ -500,7 +500,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 			if (session.getPpLogo().startsWith("http")) {
 				final String base64ImageString = imageUtils.encodeImageToString(session.getPpLogo());
 				if (base64ImageString == null) {
-					throw new BadRequestException();
+					throw new BadRequestException("Could not encode image.");
 				}
 				session.setPpLogo(base64ImageString);
 			}
@@ -508,8 +508,7 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 			// base64 adds offset to filesize, formula taken from: http://en.wikipedia.org/wiki/Base64#MIME
 			final int fileSize = (int) ((session.getPpLogo().length() - 814) / 1.37);
 			if (fileSize > uploadFileSizeByte) {
-				logger.error("Could not save file. File is too large with " + fileSize + " Byte.");
-				throw new PayloadTooLargeException();
+				throw new PayloadTooLargeException("Could not save file. File is too large with " + fileSize + " Byte.");
 			}
 		}
 	}
diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java
index 9df1adffdeec7400e11a17dd9f10133f005a53f1..804ab96cc878e40b0200bf13b78e9587f060b623 100644
--- a/src/main/java/de/thm/arsnova/services/UserService.java
+++ b/src/main/java/de/thm/arsnova/services/UserService.java
@@ -241,7 +241,7 @@ public class UserService implements IUserService {
 		if (tries < loginTryLimit) {
 			loginTries.put(addr, ++tries);
 			if (loginTryLimit == tries) {
-				logger.info("Temporarily banned {} from login.", new Object[] {addr});
+				logger.info("Temporarily banned {} from login.", addr);
 				loginBans.add(addr);
 			}
 		}
@@ -301,7 +301,7 @@ public class UserService implements IUserService {
 	public void removeUserFromSessionBySocketId(final UUID socketId) {
 		final User user = socketid2user.get(socketId);
 		if (null == user) {
-			logger.warn("null == user for socket {}", socketId);
+			logger.warn("No user exists for socket {}.", socketId);
 
 			return;
 		}
@@ -401,8 +401,8 @@ public class UserService implements IUserService {
 				UriUtils.encodeQueryParam(dbUser.getUsername(), "UTF-8"),
 				dbUser.getActivationKey()
 			);
-		} catch (UnsupportedEncodingException e1) {
-			logger.error(e1.getMessage());
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Sending of activation mail failed.", e);
 
 			return;
 		}
@@ -429,7 +429,7 @@ public class UserService implements IUserService {
 			}
 
 			mailPattern = Pattern.compile("[a-z0-9._-]+?@(" + StringUtils.join(patterns, "|") + ")", Pattern.CASE_INSENSITIVE);
-			logger.info("Allowed e-mail addresses (pattern) for registration: " + mailPattern.pattern());
+			logger.info("Allowed e-mail addresses (pattern) for registration: '{}'.", mailPattern.pattern());
 		}
 	}
 
@@ -492,8 +492,8 @@ public class UserService implements IUserService {
 				UriUtils.encodeQueryParam(dbUser.getUsername(), "UTF-8"),
 				dbUser.getPasswordResetKey()
 			);
-		} catch (UnsupportedEncodingException e1) {
-			logger.error(e1.getMessage());
+		} catch (UnsupportedEncodingException e) {
+			logger.error("Sending of password reset mail failed.", e);
 
 			return;
 		}
@@ -539,7 +539,7 @@ public class UserService implements IUserService {
 			logger.info("Sending mail \"{}\" from \"{}\" to \"{}\"", subject, msg.getFrom(), dbUser.getUsername());
 			mailSender.send(msg);
 		} catch (MailException | MessagingException e) {
-			logger.warn("Mail \"{}\" could not be sent: {}", subject, e);
+			logger.warn("Mail \"{}\" could not be sent.", subject, e);
 		}
 	}
 }
diff --git a/src/main/resources/log4j-dev.properties b/src/main/resources/log4j-dev.properties
index bae1f9dffd40cb8899c04e8280615aaf9ddf4a71..021ba3029e4bd21f3445b50f1e8f1752d0d29dd6 100644
--- a/src/main/resources/log4j-dev.properties
+++ b/src/main/resources/log4j-dev.properties
@@ -1,8 +1,8 @@
 log4j.rootCategory=INFO, stdout
 
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
+log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n%throwable
 
 log4j.category.de.thm.arsnova=DEBUG
 log4j.category.com.corundumstudio.socketio=INFO
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index fb38b279b85636f344f4d0d6ba88c7a48665e6d0..b0ce03ef63b955e000ce00d8b17bf33c639a66dd 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -1,8 +1,8 @@
 log4j.rootCategory=INFO, stdout
 
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
+log4j.appender.stdout.layout=org.apache.log4j.EnhancedPatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n%throwable{2}
 
 log4j.category.de.thm.arsnova=INFO
 log4j.category.com.corundumstudio.socketio=INFO