diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
index 0be4a5b80578a4ad192ed8f55715f6ecf9b3e511..1a476d2dc58d64757b33fde0a6bb52350bcd6bc9 100644
--- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
@@ -445,9 +445,9 @@ public class LecturerQuestionController extends AbstractController {
 	@RequestMapping(value = "/getsubjectsort", method = RequestMethod.GET)
 	public String getSubjectSortType(
 			@RequestParam(required = true) final String sessionkey,
-            @RequestParam(required = true) final String isPreparation
+            @RequestParam(required = true) final String ispreparation
 			) {
-		return questionService.getSubjectSortType(sessionkey, isPreparation);
+		return questionService.getSubjectSortType(sessionkey, ispreparation);
 	}
 
 	@RequestMapping(value = "/setquestionsort", method = RequestMethod.POST)
@@ -469,8 +469,8 @@ public class LecturerQuestionController extends AbstractController {
 	public String getQuestionSortType(
 			@RequestParam(required = true) final String sessionkey,
 			@RequestParam(required = true) final String subject,
-            @RequestParam(required = true) final String isPreparation
+            @RequestParam(required = true) final String ispreparation
 			) {
-		return questionService.getQuestionSortType(sessionkey, isPreparation, subject);
+		return questionService.getQuestionSortType(sessionkey, ispreparation, subject);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 7ad3e3bf98cede52120800df91761f5ddd8ff81f..46d51d4dc12a447c53e841db7431c50665bb0543 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -1393,27 +1393,15 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 	@Cacheable("lecturequestions")
 	@Override
-	public List<Question> getLectureQuestionsForUsers(final Session session) {
-        SortOrder subjectSortOrder = getSortOrder(session.get_id(), "lecture", "");
-        if (subjectSortOrder != null) {
-            return getQuestionsBySortOrder(subjectSortOrder, true);
-        }
-        else {
-            String viewName = "skill_question/lecture_question_by_session_for_all";
-            return getQuestions(new NovaView(viewName), session);
-        }
+	public List<Question> getLectureQuestionsForUsers(final Session session) {	
+    	String viewName = "skill_question/lecture_question_by_session_for_all";
+        return getQuestions(new NovaView(viewName), session);
 	}
 
 	@Override
 	public List<Question> getLectureQuestionsForTeachers(final Session session) {
-        SortOrder subjectSortOrder = getSortOrder(session.get_id(), "lecture", "");
-        if (subjectSortOrder != null) {
-            return getQuestionsBySortOrder(subjectSortOrder, true);
-        }
-		else {
-            String viewName = "skill_question/lecture_question_by_session";
-            return getQuestions(new NovaView(viewName), session);
-        }
+        String viewName = "skill_question/lecture_question_by_session";
+        return getQuestions(new NovaView(viewName), session);
 	}
 
 	@Cacheable("flashcardquestions")
@@ -1432,26 +1420,14 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 	@Cacheable("preparationquestions")
 	@Override
 	public List<Question> getPreparationQuestionsForUsers(final Session session) {
-        SortOrder subjectSortOrder = getSortOrder(session.get_id(), "preparation", "");
-        if (subjectSortOrder != null) {
-            return getQuestionsBySortOrder(subjectSortOrder, true);
-        }
-		else {
-            String viewName = "skill_question/preparation_question_by_session_for_all";
-            return getQuestions(new NovaView(viewName), session);
-        }
+        String viewName = "skill_question/preparation_question_by_session_for_all";
+    	return getQuestions(new NovaView(viewName), session);
 	}
 
 	@Override
 	public List<Question> getPreparationQuestionsForTeachers(final Session session) {
-        SortOrder subjectSortOrder = getSortOrder(session.get_id(), "preparation", "");
-        if (subjectSortOrder != null) {
-            return getQuestionsBySortOrder(subjectSortOrder, true);
-        }
-		else {
-            String viewName = "skill_question/preparation_question_by_session";
-            return getQuestions(new NovaView(viewName), session);
-        }
+        String viewName = "skill_question/preparation_question_by_session";
+        return getQuestions(new NovaView(viewName), session);
 	}
 
 	private List<Question> getQuestions(final NovaView view, final Session session) {
@@ -1946,6 +1922,69 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		info.setNumUnredInterposed(unreadInterposed);
 		return info;
 	}
+	
+	@Override
+	public List<String> getSubjects(Session session, String questionVariant) {
+		String viewString = "";
+		if ("lecture".equals(questionVariant)) {
+			viewString = "skill_question/lecture_question_subjects_by_session";
+		}
+		else {
+			viewString = "skill_question/preparation_question_subjects_by_session";
+		}
+		NovaView view = new NovaView(viewString);
+		view.setKey(session.get_id());
+		ViewResults results = this.getDatabase().view(view);
+
+		if (results.getJSONArray("rows").optJSONObject(0) == null) {
+			return null;
+		}
+		
+		Set<String> uniqueSubjects = new HashSet();
+		
+		for (final Document d : results.getResults()) {
+			uniqueSubjects.add(d.getJSONObject().getJSONArray("value").getString(0));
+		}
+		
+		List<String> uniqueSubjectsList = new ArrayList(uniqueSubjects);
+		
+		return uniqueSubjectsList;
+	}
+	
+	@Override
+	public List<String> getQuestionIdsBySubject(Session session, String questionVariant, String subject) {
+		String viewString = "";
+		if ("lecture".equals(questionVariant)) {
+			viewString = "skill_question/lecture_question_ids_by_session_and_subject";
+		}
+		else {
+			viewString = "skill_question/preparation_question_ids_by_session_and_subject";
+		}
+		NovaView view = new NovaView(viewString);
+		view.setKey(session.get_id());
+		ViewResults results = this.getDatabase().view(view);
+
+		if (results.getResults().isEmpty()) {
+			return null;
+		}
+		
+		List<String> qids = new ArrayList();
+		
+		for (final Document d : results.getResults()) {
+			final String s = d.getJSONObject().getJSONArray("value").getString(0);
+			qids.add(s);
+			/*final Answer a = new Answer();
+			a.setAnswerCount(d.getInt("value"));
+			a.setAbstentionCount(abstentionCount);
+			a.setQuestionId(d.getJSONObject().getJSONArray("key").getString(0));
+			a.setPiRound(piRound);
+			final String answerText = d.getJSONObject().getJSONArray("key").getString(2);
+			a.setAnswerText("null".equals(answerText) ? null : answerText);
+			answers.add(a);*/
+		}
+		
+		return qids;
+	}
     
     @Override
     public SortOrder getSortOrder(String sessionId, String questionVariant, String subject) {
@@ -1958,16 +1997,18 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
         }
         
 		NovaView view = new NovaView(viewString);
-		view.setKey(sessionId);
-        view.setKey(subject);
+		view.setKey(sessionId, subject);
         
 		ViewResults results = this.getDatabase().view(view);
 
-		if (results.getJSONArray("rows").optJSONObject(0) == null) {
+		if (results.getResults().isEmpty()) {
 			return null;
 		}
 
-        return (SortOrder) JSONObject.toBean(results.getJSONObject(), SortOrder.class);
+		return (SortOrder) JSONObject.toBean(
+			results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+			SortOrder.class
+		);
     }
     
     @Override
@@ -1994,25 +2035,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 			return sortOrder;
 		} catch (IOException e) {
-			LOGGER.error("Could not save user {}", sortOrder);
+			LOGGER.error("Could not save sort {}", sortOrder);
 		}
         return null;
     }
-    
-    public List<Question> getQuestionsBySortOrder(SortOrder sortOrder, boolean onlyActive) {
-        List<Question> questions = new ArrayList<Question>();
-        List<String> questionIds = sortOrder.getSortOrder();
-        for (String t : questionIds) {
-            Question tempQuestion = getQuestion(t);
-            if (onlyActive) {
-                if (tempQuestion.isActive()) {
-                    questions.add(tempQuestion);
-                }
-            }
-            else {
-                questions.add(tempQuestion);
-            }
-        }
-        return questions;
-    }
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 693bcaba03bc8abe0e55c45c36528765324cad4f..8862e79574dce5c3c1302e5851f5ac773ed60072 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -197,6 +197,10 @@ public interface IDatabaseDao {
 	SessionInfo importSession(User user, ImportExportSession importSession);
 
 	Statistics getStatistics();
+	
+	List<String> getSubjects(Session session, String questionVariant);
+	
+	List<String> getQuestionIdsBySubject(Session session, String questionVariant, String subject);
     
     SortOrder createOrUpdateSortOrder(SortOrder sortOrder);
     
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index d286538705a3fc25ac69e75d04fb9bda5623823c..6fdd0d0fe1d3a22f9eeb3665070b48d9d6c5ef19 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.Dictionary;
+import java.util.Collections;
 
 import de.thm.arsnova.exceptions.ForbiddenException;
 
@@ -583,11 +584,15 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 	@PreAuthorize("isAuthenticated()")
 	public List<Question> getLectureQuestions(final String sessionkey) {
 		final Session session = getSession(sessionkey);
+		SortOrder subjectSortOrder = databaseDao.getSortOrder(session.get_id(), "lecture", "");
+		if (subjectSortOrder == null) {
+			subjectSortOrder = createSortOrder(session, "lecture", "");
+		}
 		final User user = userService.getCurrentUser();
 		if (session.isCreator(user)) {
-			return databaseDao.getLectureQuestionsForTeachers(session);
+			return getQuestionsBySortOrder(subjectSortOrder, false);
 		} else {
-			return databaseDao.getLectureQuestionsForUsers(session);
+			return getQuestionsBySortOrder(subjectSortOrder, true);
 		}
 	}
 
@@ -607,11 +612,15 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
 	@PreAuthorize("isAuthenticated()")
 	public List<Question> getPreparationQuestions(final String sessionkey) {
 		final Session session = getSession(sessionkey);
+		SortOrder subjectSortOrder = databaseDao.getSortOrder(session.get_id(), "preparation", "");
+		if (subjectSortOrder == null) {
+			subjectSortOrder = createSortOrder(session, "preparation", "");
+		}
 		final User user = userService.getCurrentUser();
 		if (session.isCreator(user)) {
-			return databaseDao.getPreparationQuestionsForTeachers(session);
+			return getQuestionsBySortOrder(subjectSortOrder, false);
 		} else {
-			return databaseDao.getPreparationQuestionsForUsers(session);
+			return getQuestionsBySortOrder(subjectSortOrder, true);
 		}
 	}
 
@@ -829,9 +838,59 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
         }
         return sortOrder;
     }
+    
+    public List<Question> getQuestionsBySortOrder(SortOrder sortOrder, boolean onlyActive) {
+        List<Question> questions = new ArrayList<Question>();
+        List<String> questionIds = sortOrder.getSortOrder();
+        for (String t : questionIds) {
+            Question tempQuestion = getQuestion(t);
+            if (onlyActive) {
+                if (tempQuestion.isActive()) {
+                    questions.add(tempQuestion);
+                }
+            }
+            else {
+                questions.add(tempQuestion);
+            }
+        }
+        return questions;
+    }
+	
+	public SortOrder createSortOrder(Session session, String questionVariant, String subject) {
+		if ("".equals(subject)) {
+			SortOrder subjectSortOrder = new SortOrder();
+			subjectSortOrder.setSortOrder(databaseDao.getSubjects(session, questionVariant));
+			subjectSortOrder.setSubject("");
+			subjectSortOrder.setSortType("alphabetical");
+			subjectSortOrder.setQuestionVariant(questionVariant);
+			subjectSortOrder.setSessionId(session.get_id());
+			alphabeticalSort(subjectSortOrder);
+			List<String> subjects = subjectSortOrder.getSortOrder();
+			for (String sub : subjects) {
+				createSortOrder(session, questionVariant, sub);
+			}
+			return databaseDao.createOrUpdateSortOrder(subjectSortOrder);
+		}
+		else {
+			SortOrder sortOrder = new SortOrder();
+			sortOrder.setSessionId(session.get_id());
+			sortOrder.setSubject(subject);
+			sortOrder.setQuestionVariant(questionVariant);
+			sortOrder.setSortType("alphabetical");
+			sortOrder.setSortOrder(databaseDao.getQuestionIdsBySubject(session, questionVariant, subject));
+			alphabeticalSort(sortOrder);
+			return databaseDao.createOrUpdateSortOrder(sortOrder);
+		}
+	}
                                    
     public SortOrder alphabeticalSort(SortOrder sortOrder){
 		if ("".equals(sortOrder.getSubject())) {
+			List<String> subjects = sortOrder.getSortOrder();
+			Collections.sort(subjects);
+			sortOrder.setSortOrder(subjects);
+			return sortOrder;
+		}
+		else {
         	Hashtable<String, String> hash = new Hashtable();
         	for (String qid : sortOrder.getSortOrder()) {
             	Question question = getQuestion(qid);
@@ -839,6 +898,7 @@ public class QuestionService implements IQuestionService, ApplicationEventPublis
         	}
         	List<String> sortList = new ArrayList();
         	List<String> keys = new ArrayList(hash.keySet());
+			Collections.sort(keys);
         	for (String textKey : keys) {
             	sortList.add(hash.get(textKey));
         	}