diff --git a/.gitignore b/.gitignore
index 043004ca4b70cbf09120b936500595f19d034055..fb7773093c65498cdb1b57bcdb3ff03623b5089a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 target/*
 chromedriver.log
 .checkstyle
+/target
diff --git a/pom.xml b/pom.xml
index 4a86237d0ba8f48a5dd68ec7ba9e3c57f27a4222..b8cac2b708a6ea3bfad99f3c3983811abf16aad3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -385,7 +385,7 @@
 				<configuration>
 					<url>http://localhost:8080/manager/text</url>
 					<server>arsnova</server>
-					<path>/arsnova-war</path>
+					<path>/mobile</path>
 				</configuration>
 			</plugin>
 			<plugin>
diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 547bf649b67363dffe1cb872f5eb5835530fb7b5..9c4692f3111f566a6f27ab4705d8d80c45e8b8f7 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -18,12 +18,15 @@
  */
 package de.thm.arsnova.controller;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 import javax.servlet.http.HttpServletResponse;
 
+import net.sf.json.JSONObject;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -178,11 +181,15 @@ public class SessionController extends AbstractController {
 	}
 
 	@RequestMapping(value = "/{sessionkey}/mylearningprogress", method = RequestMethod.GET)
-	public final int myLearningProgress(
+	public final JSONObject myLearningProgress(
 			@PathVariable final String sessionkey,
 			final HttpServletResponse response
 			) {
-		return sessionService.getMyLearningProgress(sessionkey);
+		SimpleEntry<Integer, Integer> result = sessionService.getMyLearningProgress(sessionkey);
+		JSONObject json = new JSONObject();
+		json.put("myprogress", result.getKey());
+		json.put("courseprogress", result.getValue());
+		return json;
 	}
 
 	/* internal redirections */
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index d33d692bdc5fa73cd88ef60df5c33957b704d9d1..bcb8ea1b31a0cece38f2d631f2419d984d4ebb51 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
+import java.util.AbstractMap;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
@@ -1323,42 +1325,62 @@ public class CouchDBDao implements IDatabaseDao {
 	}
 
 	@Override
-	public int getLearningProgress(final Session session) {
-		final NovaView courseView = new NovaView("learning_progress_course_value/course_value");
-		final NovaView maximumView = new NovaView("learning_progress_maximum_value/maximum_value");
-		courseView.setKey(session.get_id());
-		maximumView.setKey(session.get_id());
+	public int getLearningProgress(Session session) {
+		// Note: we have to use this many views because our CouchDB version does not support
+		// advanced features like summing over lists. Thus, we have to do it all by ourselves...
+		NovaView maximumValueView = new NovaView("learning_progress_maximum_value/max");
+		NovaView answerSumView = new NovaView("learning_progress_user_values/sum");
+		NovaView answerDocumentCountView = new NovaView("learning_progress_course_answers/count");
+		maximumValueView.setKey(session.get_id());
+		answerSumView.setStartKeyArray(session.get_id());
+		answerSumView.setEndKeyArray(session.get_id(), "{}");
+		answerDocumentCountView.setStartKeyArray(session.get_id());
+		answerDocumentCountView.setEndKeyArray(session.get_id(), "{}");
+		answerDocumentCountView.setGroup(true);
 
-		return getProgressPercentage(courseView, maximumView);
+		List<Document> maximumValueResult = this.getDatabase().view(maximumValueView).getResults();
+		List<Document> answerSumResult = this.getDatabase().view(answerSumView).getResults();
+		List<Document> answerDocumentCountResult = this.getDatabase().view(answerDocumentCountView).getResults();
+
+		if (maximumValueResult.isEmpty() || answerSumResult.isEmpty() || answerDocumentCountResult.isEmpty()) {
+			return 0;
+		}
+
+		final double courseMaximumValue = maximumValueResult.get(0).getInt("value");
+		final double userTotalValue = answerSumResult.get(0).getInt("value");
+		final double numUsers = answerDocumentCountResult.size();
+		if (courseMaximumValue == 0 || numUsers == 0) {
+			return 0;
+		}
+		final double courseAverageValue = userTotalValue / numUsers;
+		final double courseProgress = courseAverageValue / courseMaximumValue;
+		return (int)Math.round(courseProgress * 100);
 	}
 
 	@Override
-	public int getMyLearningProgress(final Session session, final User user) {
-		final NovaView userView = new NovaView("learning_progress_user_value/user_value");
-		final NovaView maximumView = new NovaView("learning_progress_maximum_value/maximum_value");
-		userView.setKey(session.get_id(), user.getUsername());
-		maximumView.setKey(session.get_id());
+	public SimpleEntry<Integer,Integer> getMyLearningProgress(Session session, User user) {
+		final int courseProgress = this.getLearningProgress(session);
 
-		return getProgressPercentage(userView, maximumView);
-	}
+		NovaView maximumValueView = new NovaView("learning_progress_maximum_value/max");
+		NovaView answerSumView = new NovaView("learning_progress_user_values/sum");
+		maximumValueView.setKey(session.get_id());
+		answerSumView.setKey(session.get_id(), user.getUsername());
 
-	private int getProgressPercentage(final NovaView progressView, final NovaView maximumView) {
-		final List<Document> progressValue = getDatabase().view(progressView).getResults();
-		final List<Document> maximumValue = getDatabase().view(maximumView).getResults();
-		if (maximumValue.isEmpty()) {
-			return 0;
+		List<Document> maximumValueResult = this.getDatabase().view(maximumValueView).getResults();
+		List<Document> answerSumResult = this.getDatabase().view(answerSumView).getResults();
+
+		if (maximumValueResult.isEmpty() || answerSumResult.isEmpty()) {
+			return new AbstractMap.SimpleEntry<Integer, Integer>(0, courseProgress);
 		}
-		final int maximum = maximumValue.get(0).getInt("value");
-		int progress = 0;
-		if (!progressValue.isEmpty()) {
-			if (progressValue.get(0).optJSONArray("value").isArray()) {
-				final JSONArray courseProgress = progressValue.get(0).getJSONArray("value");
-				progress = courseProgress.getInt(0) / courseProgress.getInt(1);
-			} else {
-				progress = progressValue.get(0).getInt("value");
-			}
+
+		final double courseMaximumValue = maximumValueResult.get(0).getInt("value");
+		final double userTotalValue = answerSumResult.get(0).getInt("value");
+
+		if (courseMaximumValue == 0) {
+			return new AbstractMap.SimpleEntry<Integer, Integer>(0, courseProgress);
 		}
-		final int percentage = (int)(progress * 100.0f / maximum);
-		return percentage < 0 ? 0 : percentage;
+		final double myProgress = userTotalValue / courseMaximumValue;
+
+		return new AbstractMap.SimpleEntry<Integer, Integer>((int)Math.round((myProgress*100)), courseProgress);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 948402374f93dff6c72961635840580a47a06bce..40bb3f97ca33db3970cc8dd5f04f072f5d879471 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -19,6 +19,7 @@
 
 package de.thm.arsnova.dao;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.List;
 
 import de.thm.arsnova.connector.model.Course;
@@ -164,5 +165,5 @@ public interface IDatabaseDao {
 
 	int getLearningProgress(Session session);
 
-	int getMyLearningProgress(Session session, User user);
+	SimpleEntry<Integer, Integer> getMyLearningProgress(Session session, User user);
 }
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index e9b4c543204dc82da2d1f41d1d392237199f3038..20e40d828d1b5958df5b0ed50935b496f5853fd3 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -19,6 +19,7 @@
 
 package de.thm.arsnova.services;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.List;
 import java.util.UUID;
 
@@ -55,5 +56,5 @@ public interface ISessionService {
 
 	int getLearningProgress(String sessionkey);
 
-	int getMyLearningProgress(String sessionkey);
+	SimpleEntry<Integer, Integer> getMyLearningProgress(String sessionkey);
 }
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 81cee4ce86ea7002db21d31c2dd090fa10b7fdee..595c0567a9e7b27320fafc439ab3ffe7b891c309 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -20,6 +20,7 @@
 package de.thm.arsnova.services;
 
 import java.io.Serializable;
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -262,7 +263,7 @@ public class SessionService implements ISessionService {
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
-	public int getMyLearningProgress(final String sessionkey) {
+	public SimpleEntry<Integer,Integer> getMyLearningProgress(final String sessionkey) {
 		final Session session = databaseDao.getSession(sessionkey);
 		final User user = userService.getCurrentUser();
 		return databaseDao.getMyLearningProgress(session, user);
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index 20a6e9f35b3d7363a41a5ed34d3e2bf17f4085d0..c73b88f96c0560c885ed9865c881c3a530cd54eb 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -18,6 +18,7 @@
  */
 package de.thm.arsnova.dao;
 
+import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -506,8 +507,8 @@ public class StubDatabaseDao implements IDatabaseDao {
 	}
 
 	@Override
-	public int getMyLearningProgress(Session session, User user) {
+	public SimpleEntry<Integer, Integer> getMyLearningProgress(Session session, User user) {
 		// TODO Auto-generated method stub
-		return 0;
+		return null;
 	}
 }