diff --git a/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java b/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java
index 7876d0163b31b0553412c752e4486555f40254af..eaa23efd42d979f9d25aacc490e5eb2e745b0a0f 100644
--- a/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java
+++ b/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java
@@ -19,6 +19,7 @@ package de.thm.arsnova.controller;
 
 import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.FindQuery;
+import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.EntityService;
 import de.thm.arsnova.services.FindQueryService;
 import org.slf4j.Logger;
@@ -26,18 +27,12 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PatchMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.util.UriComponentsBuilder;
 
 import javax.naming.OperationNotSupportedException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Collection;
@@ -55,7 +50,8 @@ public abstract class AbstractEntityController<E extends Entity> {
 	protected static final String ENTITY_ID_HEADER = "Arsnova-Entity-Id";
 	protected static final String ENTITY_REVISION_HEADER = "Arsnova-Entity-Revision";
 	protected static final String DEFAULT_ROOT_MAPPING = "/";
-	protected static final String DEFAULT_ID_MAPPING = "/{id}";
+	protected static final String DEFAULT_ID_MAPPING = "/{id:[^~].*}";
+	protected static final String DEFAULT_ALIAS_MAPPING = "/~{alias}";
 	protected static final String DEFAULT_FIND_MAPPING = "/find";
 	protected static final String GET_MAPPING = DEFAULT_ID_MAPPING;
 	protected static final String GET_MULTIPLE_MAPPING = DEFAULT_ROOT_MAPPING;
@@ -130,6 +126,17 @@ public abstract class AbstractEntityController<E extends Entity> {
 		}
 	}
 
+	@RequestMapping(value = DEFAULT_ALIAS_MAPPING, method = {RequestMethod.GET, RequestMethod.PUT, RequestMethod.POST})
+	public void forwardAlias(@PathVariable final String alias, HttpServletRequest httpServletRequest,
+			HttpServletResponse httpServletResponse) throws ServletException, IOException {
+		httpServletRequest.getRequestDispatcher(getMapping() + "/" + resolveAlias(alias))
+				.forward(httpServletRequest, httpServletResponse);
+	}
+
+	protected String resolveAlias(final String alias) {
+		throw new NotFoundException("Aliases not supported for " + getMapping() + ".");
+	}
+
 	@Autowired(required = false)
 	public void setFindQueryService(final FindQueryService<E> findQueryService) {
 		this.findQueryService = findQueryService;
diff --git a/src/main/java/de/thm/arsnova/controller/RoomController.java b/src/main/java/de/thm/arsnova/controller/RoomController.java
index 21fe4a85195b0f83bf97a61e870a2c1675a6eca9..dc1b2fbdf9064b5ac8a468ea396b5e3f8260407e 100644
--- a/src/main/java/de/thm/arsnova/controller/RoomController.java
+++ b/src/main/java/de/thm/arsnova/controller/RoomController.java
@@ -38,4 +38,9 @@ public class RoomController extends AbstractEntityController<Room> {
 	protected String getMapping() {
 		return REQUEST_MAPPING;
 	}
+
+	@Override
+	protected String resolveAlias(final String shortId) {
+		return roomService.getIdByShortId(shortId);
+	}
 }