diff --git a/src/main/java/de/thm/arsnova/controller/StatisticsController.java b/src/main/java/de/thm/arsnova/controller/StatisticsController.java
new file mode 100644
index 0000000000000000000000000000000000000000..89346a5e36884a544bc47e9637b3029ad93e62a7
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/controller/StatisticsController.java
@@ -0,0 +1,22 @@
+package de.thm.arsnova.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import de.thm.arsnova.services.IStatisticsService;
+
+@Controller
+public class StatisticsController {
+
+	@Autowired
+	private IStatisticsService statisticsService;
+
+	@RequestMapping(method = RequestMethod.GET, value = "/statistics/activeusercount")
+	@ResponseBody
+	public final int countActiveUsers() {
+		return statisticsService.countActiveUsers();
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 21a51dd306ba975345a5afe1bfed62277f443854..ec42f28d0f5bdf887f80295b27c9c6f1c601c90c 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -134,7 +134,10 @@ public class CouchDBDao implements IDatabaseDao {
 			} catch (IOException e) {
 				LOGGER.error("Could not delete Feedback document " + d.getId());
 			} catch (JSONException e) {
-				LOGGER.error("Could not delete Feedback document {}, error is: {} ", new Object[] {d.getId(), e});
+				LOGGER.error(
+						"Could not delete Feedback document {}, error is: {} ",
+						new Object[] {d.getId(), e}
+				);
 			}
 		}
 		if (!results.isEmpty()) {
@@ -174,7 +177,10 @@ public class CouchDBDao implements IDatabaseDao {
 
 			List<Session> result = new ArrayList<Session>();
 			for (Document d : sessions.getResults()) {
-				Session session = (Session) JSONObject.toBean(d.getJSONObject().getJSONObject("value"), Session.class);
+				Session session = (Session) JSONObject.toBean(
+						d.getJSONObject().getJSONObject("value"),
+						Session.class
+				);
 				session.set_id(d.getId());
 				result.add(session);
 			}
@@ -204,12 +210,18 @@ public class CouchDBDao implements IDatabaseDao {
 			MorpherRegistry morpherRegistry = JSONUtils.getMorpherRegistry();
 			Morpher dynaMorpher = new BeanMorpher(PossibleAnswer.class, morpherRegistry);
 			morpherRegistry.registerMorpher(dynaMorpher);
-			for (Document d : questions.getResults()) {
-				Question q = (Question) JSONObject.toBean(d.getJSONObject().getJSONObject("value"), Question.class);
-				Collection<PossibleAnswer> answers = JSONArray.toCollection(d.getJSONObject().getJSONObject("value")
-						.getJSONArray("possibleAnswers"), PossibleAnswer.class);
-				q.setPossibleAnswers(new ArrayList<PossibleAnswer>(answers));
-				result.add(q);
+			for (Document document : questions.getResults()) {
+				Question question = (Question) JSONObject.toBean(
+						document.getJSONObject().getJSONObject("value"),
+						Question.class
+				);
+				Collection<PossibleAnswer> answers = JSONArray.toCollection(
+						document.getJSONObject().getJSONObject("value")
+							.getJSONArray("possibleAnswers"),
+						PossibleAnswer.class
+				);
+				question.setPossibleAnswers(new ArrayList<PossibleAnswer>(answers));
+				result.add(question);
 			}
 
 			return result;
@@ -246,8 +258,10 @@ public class CouchDBDao implements IDatabaseDao {
 			if (results.getJSONArray("rows").optJSONObject(0) == null) {
 				return null;
 			}
-			return (Session) JSONObject.toBean(results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
-					Session.class);
+			return (Session) JSONObject.toBean(
+					results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+					Session.class
+			);
 		} catch (UnsupportedEncodingException e) {
 			return null;
 		}
@@ -290,7 +304,7 @@ public class CouchDBDao implements IDatabaseDao {
 	}
 
 	private Feedback createFeedbackObject(final ViewResults results) {
-		int values[] = {0, 0, 0, 0};
+		int[] values = {0, 0, 0, 0};
 		JSONArray rows = results.getJSONArray("rows");
 
 		try {
@@ -328,7 +342,11 @@ public class CouchDBDao implements IDatabaseDao {
 	}
 
 	@Override
-	public final boolean saveFeedback(final String keyword, final int value, final de.thm.arsnova.entities.User user) {
+	public final boolean saveFeedback(
+			final String keyword,
+			final int value,
+			final de.thm.arsnova.entities.User user
+	) {
 		String sessionId = this.getSessionId(keyword);
 		if (sessionId == null) {
 			return false;
@@ -374,7 +392,12 @@ public class CouchDBDao implements IDatabaseDao {
 	private List<Document> findPreviousFeedback(final String sessionId, final de.thm.arsnova.entities.User user) {
 		View view = new View("understanding/by_user");
 		try {
-			view.setKey(URLEncoder.encode("[\"" + sessionId + "\", \"" + user.getUsername() + "\"]", "UTF-8"));
+			view.setKey(
+					URLEncoder.encode(
+							"[\"" + sessionId + "\",\"" + user.getUsername() + "\"]",
+							"UTF-8"
+					)
+			);
 		} catch (UnsupportedEncodingException e) {
 			return Collections.<Document> emptyList();
 		}
@@ -460,11 +483,17 @@ public class CouchDBDao implements IDatabaseDao {
 	private Database getDatabase() {
 		if (database == null) {
 			try {
-				com.fourspaces.couchdb.Session session = new com.fourspaces.couchdb.Session(databaseHost, databasePort);
+				com.fourspaces.couchdb.Session session = new com.fourspaces.couchdb.Session(
+						databaseHost,
+						databasePort
+				);
 				database = session.getDatabase(databaseName);
 			} catch (Exception e) {
-				LOGGER.error("Cannot connect to CouchDB database '" + databaseName + "' on host '" + databaseHost
-						+ "' using port " + databasePort);
+				LOGGER.error(
+						"Cannot connect to CouchDB database '" + databaseName
+						+ "' on host '" + databaseHost
+						+ "' using port " + databasePort
+				);
 			}
 		}
 
@@ -480,7 +509,7 @@ public class CouchDBDao implements IDatabaseDao {
 		q.put("subject", question.getSubject());
 		q.put("text", question.getText());
 		q.put("active", question.isActive());
-		q.put("number", 0); // TODO: This number has to get incremented
+		q.put("number", 0); // TODO This number has to get incremented
 							// automatically
 		q.put("releasedFor", question.getReleasedFor());
 		q.put("possibleAnswers", question.getPossibleAnswers());
@@ -509,10 +538,15 @@ public class CouchDBDao implements IDatabaseDao {
 			}
 
 			Question q = (Question) JSONObject.toBean(
-					results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"), Question.class);
+					results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+					Question.class
+			);
 			JSONArray possibleAnswers = results.getJSONArray("rows").optJSONObject(0).optJSONObject("value")
 					.getJSONArray("possibleAnswers");
-			Collection<PossibleAnswer> answers = JSONArray.toCollection(possibleAnswers, PossibleAnswer.class);
+			Collection<PossibleAnswer> answers = JSONArray.toCollection(
+					possibleAnswers,
+					PossibleAnswer.class
+			);
 			q.setPossibleAnswers(new ArrayList<PossibleAnswer>(answers));
 
 			if (s.get_id().equals(q.getSessionId())) {
@@ -593,7 +627,12 @@ public class CouchDBDao implements IDatabaseDao {
 			}
 
 			View view = new View("understanding/by_user");
-			view.setKey(URLEncoder.encode("[\"" + sessionId + "\", \"" + user.getUsername() + "\"]", "UTF-8"));
+			view.setKey(
+					URLEncoder.encode(
+							"[\"" + sessionId + "\", \"" + user.getUsername() + "\"]",
+							"UTF-8"
+					)
+			);
 			ViewResults results = this.getDatabase().view(view);
 			JSONArray rows = results.getJSONArray("rows");
 
@@ -668,8 +707,10 @@ public class CouchDBDao implements IDatabaseDao {
 
 		} catch (IOException e) {
 			LOGGER.error(
-					"IOException: Could not delete question and its answers with id {}. Connection to CouchDB available?",
-					questionId);
+				"IOException: Could not delete question and its answers with id {}."
+				+ " Connection to CouchDB available?",
+				questionId
+			);
 		}
 	}
 
@@ -687,7 +728,13 @@ public class CouchDBDao implements IDatabaseDao {
 
 		try {
 			View view = new View("answer/by_user");
-			view.setKey("[" + URLEncoder.encode("\"" + user.getUsername() + "\",\"" + s.get_id() + "\"", "UTF-8") + "]");
+			view.setKey(
+					"[" + URLEncoder.encode(
+							"\"" + user.getUsername() + "\",\"" + s.get_id() + "\"",
+							"UTF-8"
+					)
+					+ "]"
+			);
 			ViewResults anseweredQuestions = this.getDatabase().view(view);
 
 			List<String> answered = new ArrayList<String>();
@@ -724,13 +771,21 @@ public class CouchDBDao implements IDatabaseDao {
 
 		try {
 			View view = new View("answer/by_question_and_user");
-			view.setKey("[" + URLEncoder.encode("\"" + questionId + "\",\"" + user.getUsername() + "\"", "UTF-8") + "]");
+			view.setKey(
+					"[" + URLEncoder.encode(
+							"\"" + questionId + "\",\"" + user.getUsername() + "\"",
+							"UTF-8"
+					)
+					+ "]"
+			);
 			ViewResults results = this.getDatabase().view(view);
 			if (results.getResults().isEmpty()) {
 				throw new NotFoundException();
 			}
-			return (Answer) JSONObject.toBean(results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
-					Answer.class);
+			return (Answer) JSONObject.toBean(
+					results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+					Answer.class
+			);
 		} catch (UnsupportedEncodingException e) {
 			LOGGER.error(
 					"Error while retrieving answer for user {} and question {}, {}",
@@ -792,4 +847,25 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 		return 0;
 	}
+
+	@Override
+	public final int getActiveUsers(final long since) {
+		try {
+			View view = new View("statistic/count_active_users");
+			view.setStartKey(String.valueOf(since));
+			ViewResults results = this.getDatabase().view(view);
+			LOGGER.info("getActiveUsers() {}", results);
+			if (
+					results == null
+					|| results.getResults().isEmpty()
+					|| results.getJSONArray("rows").size() == 0
+			) {
+				return 0;
+			}
+			return results.getJSONArray("rows").optJSONObject(0).getInt("value");
+		} catch (Exception e) {
+			LOGGER.error("Error while retrieving active users count", e);
+		}
+		return 0;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 524a8d98ac560bbb8b26e2e4636cd3b53886a1ec..198645c2eb5ae8e1dfe899bed15a21a4473b6c49 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -23,8 +23,8 @@ import java.util.List;
 
 import de.thm.arsnova.entities.Answer;
 import de.thm.arsnova.entities.Feedback;
-import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.entities.LoggedIn;
+import de.thm.arsnova.entities.Question;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 
@@ -70,4 +70,6 @@ public interface IDatabaseDao {
 	List<Answer> getAnswers(String sessionKey, String questionId);
 
 	int getAnswerCount(String sessionKey, String questionId);
+
+	int getActiveUsers(long since);
 }
diff --git a/src/main/java/de/thm/arsnova/exceptions/package-info.java b/src/main/java/de/thm/arsnova/exceptions/package-info.java
index 609e116927c642cf07c14b696d6d15ba5a924610..8eb89c8019f1eb2130d93eca2c90b6215046937a 100644
--- a/src/main/java/de/thm/arsnova/exceptions/package-info.java
+++ b/src/main/java/de/thm/arsnova/exceptions/package-info.java
@@ -1 +1 @@
-package de.thm.arsnova.exceptions;
\ No newline at end of file
+package de.thm.arsnova.exceptions;
diff --git a/src/main/java/de/thm/arsnova/services/IStatisticsService.java b/src/main/java/de/thm/arsnova/services/IStatisticsService.java
new file mode 100644
index 0000000000000000000000000000000000000000..65a1b74ae3de1bba67146d5490770c84013f10aa
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/services/IStatisticsService.java
@@ -0,0 +1,6 @@
+package de.thm.arsnova.services;
+
+public interface IStatisticsService {
+
+	int countActiveUsers();
+}
diff --git a/src/main/java/de/thm/arsnova/services/StatisticsService.java b/src/main/java/de/thm/arsnova/services/StatisticsService.java
new file mode 100644
index 0000000000000000000000000000000000000000..87c2e942eccbf9d384dafca9f4133776a53dd055
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/services/StatisticsService.java
@@ -0,0 +1,21 @@
+package de.thm.arsnova.services;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import de.thm.arsnova.dao.IDatabaseDao;
+
+@Service
+public class StatisticsService implements IStatisticsService {
+
+	private static final int SINCEDURATION = 3 * 60 * 1000;
+
+	@Autowired
+	private IDatabaseDao databaseDao;
+
+	@Override
+	public final int countActiveUsers() {
+		long since = System.currentTimeMillis() - SINCEDURATION;
+		return databaseDao.getActiveUsers(since);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/services/package-info.java b/src/main/java/de/thm/arsnova/services/package-info.java
index 12742b6cbbe5149e7ac1dd84c4ca49e7f6a6efc6..ff6c1eba938b0bfbed079b7c9d7ceeb621115f6d 100644
--- a/src/main/java/de/thm/arsnova/services/package-info.java
+++ b/src/main/java/de/thm/arsnova/services/package-info.java
@@ -1 +1 @@
-package de.thm.arsnova.services;
\ No newline at end of file
+package de.thm.arsnova.services;
diff --git a/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java b/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e79f54f4877d73f5c42d524d3eef57568990812
--- /dev/null
+++ b/src/test/java/de/thm/arsnova/controller/StatisticsControllerTest.java
@@ -0,0 +1,58 @@
+package de.thm.arsnova.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.inject.Inject;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.servlet.HandlerAdapter;
+import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;
+
+import de.thm.arsnova.services.StubUserService;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+		"file:src/main/webapp/WEB-INF/arsnova-servlet.xml",
+		"file:src/main/webapp/WEB-INF/spring/spring-main.xml",
+		"file:src/test/resources/test-config.xml"
+})
+public class StatisticsControllerTest {
+
+	@Inject
+	private ApplicationContext applicationContext;
+	private MockHttpServletRequest request;
+	private MockHttpServletResponse response;
+	private HandlerAdapter handlerAdapter;
+
+	@Autowired
+	private StatisticsController statisticsController;
+
+	@Autowired
+	private StubUserService userService;
+
+	@Before
+	public final void setUp() {
+		this.request = new MockHttpServletRequest();
+		this.response = new MockHttpServletResponse();
+		handlerAdapter = applicationContext.getBean(AnnotationMethodHandlerAdapter.class);
+	}
+
+	@Test
+	public final void testShouldNotGetUnknownSession() throws Exception {
+		userService.setUserAuthenticated(true);
+
+		request.setMethod("GET");
+		request.setRequestURI("/statistics/activeusercount");
+		handlerAdapter.handle(request, response, statisticsController);
+
+		assertEquals("0", response.getContentAsString());
+	}
+}
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index c2e8a13d18d1bf631516789bb254cc0cd83f23c7..8daea5d4eca2718d96baa7a0682a653b86e76990 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -1,6 +1,7 @@
 package de.thm.arsnova.dao;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -218,4 +219,9 @@ public class StubDatabaseDao implements IDatabaseDao {
 		return 0;
 	}
 
+	@Override
+	public int getActiveUsers(long since) {
+		// TODO Auto-generated method stub
+		return 0;
+	}
 }
diff --git a/src/test/java/de/thm/arsnova/services/SessionServiceTest.java b/src/test/java/de/thm/arsnova/services/SessionServiceTest.java
index f324547473909aeacc2e83c5bdea1811ea618f5b..6159c06017cef4f15df1b236cfb38850f22276bb 100644
--- a/src/test/java/de/thm/arsnova/services/SessionServiceTest.java
+++ b/src/test/java/de/thm/arsnova/services/SessionServiceTest.java
@@ -40,10 +40,10 @@ import de.thm.arsnova.exceptions.UnauthorizedException;
 public class SessionServiceTest {
 
 	@Autowired
-	ISessionService sessionService;
+	private ISessionService sessionService;
 
 	@Autowired
-	StubUserService userService;
+	private StubUserService userService;
 
 	@Test
 	public void testShouldGenerateSessionKeyword() {
diff --git a/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java b/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5638188f902093736a594ec1470867979540c409
--- /dev/null
+++ b/src/test/java/de/thm/arsnova/services/StatisticsServiceTest.java
@@ -0,0 +1,29 @@
+package de.thm.arsnova.services;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+		"file:src/main/webapp/WEB-INF/arsnova-servlet.xml",
+		"file:src/main/webapp/WEB-INF/spring/spring-main.xml",
+		"file:src/test/resources/test-config.xml"
+})
+public class StatisticsServiceTest {
+
+	@Autowired
+	private IStatisticsService statisticsService;
+
+	@Test
+	public final void testShouldReturnCurrentActiveUsers() {
+		int actual = statisticsService.countActiveUsers();
+		//assertEquals(0, actual);
+	}
+
+}