diff --git a/KvizServer/app/build.gradle b/KvizServer/app/build.gradle
index f51e8f88a08cc9b200b09794c5904b3b7915c071..32792f3d94f48b35a270f696b1e186073298d85b 100644
--- a/KvizServer/app/build.gradle
+++ b/KvizServer/app/build.gradle
@@ -30,4 +30,5 @@ dependencies {
     implementation 'com.github.rustamg:file-dialogs:1.0'
     implementation 'com.google.code.gson:gson:2.8.2'
     implementation 'com.github.satyan:sugar:1.4'
+    implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
 }
diff --git a/KvizServer/app/src/main/AndroidManifest.xml b/KvizServer/app/src/main/AndroidManifest.xml
index 6dc842252faef28e5863e6c8642cbe7424a23b1f..d7c6659a43141c4d93c4065cede5b778dc5b7f11 100644
--- a/KvizServer/app/src/main/AndroidManifest.xml
+++ b/KvizServer/app/src/main/AndroidManifest.xml
@@ -11,7 +11,12 @@
     <uses-permission
         android:name="android.permission.INTERNET"
         android:required="true" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+        android:required="true" />
+    <uses-permission
+        android:name="android.permission.READ_EXTERNAL_STORAGE"
+        android:required="true" />
 
     <application
         android:allowBackup="true"
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java
index 031c38edad2b7bda065f700dedd298e37814e30e..9ef05ee52620316490b57fa06f060e5a1852dc46 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/GameActivity.java
@@ -1,5 +1,6 @@
 package onlab.kvizserver;
 
+import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.support.v4.view.ViewPager;
 import android.support.v7.app.AppCompatActivity;
@@ -10,6 +11,7 @@ import android.widget.Toast;
 
 import com.google.gson.Gson;
 import com.rustamg.filedialogs.FileDialog;
+import com.rustamg.filedialogs.SaveFileDialog;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -22,13 +24,18 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import onlab.kvizserver.model.PlayerAnswer;
 import onlab.kvizserver.model.Question;
 
 public class GameActivity extends AppCompatActivity implements GameControlFragment.OnFragmentInteractionListener,
-        QuestionListFragment.OnFragmentInteractionListener, FileDialog.OnFileSelectedListener {
+        QuestionListFragment.OnFragmentInteractionListener, FileDialog.OnFileSelectedListener,
+        QuestionListGeneratorDialogFragment.OnFragmentInteractionListener {
 
     private Question question = null;
     private int numberOfPlayers;
@@ -68,9 +75,7 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
                 inputs.add(new BufferedReader(new InputStreamReader(ClientHolder.get(i).getClientsocket().getInputStream())));
                 PrintWriter output = new PrintWriter(new BufferedWriter(
                         new OutputStreamWriter(ClientHolder.get(i).getClientsocket().getOutputStream())), true);
-                output.println("$$$$");
                 outputs.add(output);
-                output.println("GameStarted##normal");
             }
         } catch (IOException e) {
             e.printStackTrace();
@@ -103,6 +108,8 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
         }
 
         public void run() {
+            output.println("$$$$");
+            output.println("GameStarted##normal");
             while (!Thread.currentThread().isInterrupted()) {
                 try {
                     String read = input.readLine();
@@ -162,7 +169,7 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
     @Override
     public void nextQuestionButtonClicked(int timeLimit) {
         gameControlFragment.setCorrectAnswerButtonEnabled(true);
-        questionListFragment.selecetedQuestionDisplayed();
+        questionListFragment.selectedQuestionDisplayed();
         gameControlFragment.setNextQuestionButtonEnabled(false);
 
         questionString = question.getQuestionText();
@@ -258,4 +265,77 @@ public class GameActivity extends AppCompatActivity implements GameControlFragme
         }
     }
 
+    @Override
+    public void generateQuestionList(List<String> topics, int numberOfMultipleChoice, int numberOfGuess, boolean onlyEnabled) {
+        Log.d("questionList", "Megvan a kérdéslista");
+        List<Question> questions = Question.listAll(Question.class);
+
+        // disabled kérdések eltávolítása, ha csak enabled kérdésekből kell válogatni
+        if (onlyEnabled) {
+            Iterator<Question> it = questions.iterator();
+            while( it.hasNext() ) {
+                Question q = it.next();
+                if(!q.isEnabled())
+                    it.remove();
+            }
+        }
+
+        // megfelelő számú kérdés kiválogatása
+        Collections.shuffle(questions);
+        Map<String, Integer> selectedMultiple = new HashMap<>();
+        Map<String, Integer> selectedGuess = new HashMap<>();
+        for (String topic : topics) {
+            selectedMultiple.put(topic, 0);
+            selectedGuess.put(topic, 0);
+        }
+        Iterator<Question> it = questions.iterator();
+        while( it.hasNext() ) {
+            Question q = it.next();
+            boolean selected = false;
+            String topic = q.getTopic();
+            if(q.getType() == Question.MULTIPLE_CHOICE &&
+                    selectedMultiple.get(topic) != null && selectedMultiple.get(topic) < numberOfMultipleChoice) {
+                selected = true;
+                selectedMultiple.put(topic, selectedMultiple.get(topic) + 1);
+            } else if (q.getType() == Question.GUESS &&
+                    selectedGuess.get(topic) != null && selectedGuess.get(topic) < numberOfGuess) {
+                selected = true;
+                selectedGuess.put(topic, selectedGuess.get(topic) + 1);
+            } else {
+                q.setCurrentIndex(0);
+                q.save();
+                it.remove();
+            }
+        }
+
+        // kérdések véletleszerű sorrendbe rakása és indexek hozzárendelése
+        Collections.shuffle(questions);
+        for (int i=0;i<questions.size();i++) {
+            Question question = questions.get(i);
+            question.setCurrentIndex(i + 1);
+            question.save();
+        }
+
+        // QuestionListFragment frissítése
+        questionListFragment.refreshQuestionList();
+     }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+        switch (requestCode) {
+            case 1: {
+                // If request is cancelled, the result arrays are empty.
+                if (grantResults.length > 0
+                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    // permission was granted
+                    SaveFileDialog dialog = new SaveFileDialog();
+                    dialog.show(getSupportFragmentManager(), SaveFileDialog.class.getName());
+                } else {
+                    // permission denied
+                }
+                return;
+            }
+        }
+    }
+
 }
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/GameControlFragment.java b/KvizServer/app/src/main/java/onlab/kvizserver/GameControlFragment.java
index e99026a6abc640e9d75f1a852c461d83b1465da0..ad3b874f165ad682bab59c96a3ba3a1a3988f65d 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/GameControlFragment.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/GameControlFragment.java
@@ -121,7 +121,7 @@ public class GameControlFragment extends Fragment {
 
     public void displayMultipleChoiceQuestion(String questionTextString, List<String> answers, String correctAnswerString) {
         questionText.setText(questionTextString);
-        correctAnswerTextView.setText(correctAnswerString);
+        correctAnswerTextView.setText("Correct answer: " + correctAnswerString);
         for (int i=0;i<4;i++) {
             answerTextViews.get(i).setVisibility(View.VISIBLE);
             answerTextViews.get(i).setText(answers.get(i));
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java
index 7044b1c2b0c720950cb5a596a962b696dccf169c..81f8b5bb3968884514f058ee5c3657e5369dd7c9 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/LobbyActivity.java
@@ -1,38 +1,29 @@
 package onlab.kvizserver;
 
-import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
 import android.net.nsd.NsdManager;
 import android.net.nsd.NsdServiceInfo;
 import android.os.Bundle;
 import android.os.Handler;
-import android.support.design.widget.FloatingActionButton;
-import android.support.design.widget.Snackbar;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.DividerItemDecoration;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.Toolbar;
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
-import android.widget.TextView;
 import android.widget.Toast;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.net.ServerSocket;
 import java.net.Socket;
-import java.net.SocketException;
 import java.util.ArrayList;
-import java.util.List;
 
 import onlab.kvizserver.model.ClientModel;
 
@@ -106,6 +97,8 @@ public class LobbyActivity extends AppCompatActivity {
             public void onClick(View view) {
                 if (gameMode.equals("quizup") && (clients.size() != 2)) {
                     Toast.makeText(getApplicationContext(), "QuizUp mode requires exactly 2 players!", Toast.LENGTH_LONG).show();
+                } else if (gameMode.equals("normal") && (clients.size() == 0)) {
+                    Toast.makeText(getApplicationContext(), "Game requires at least one player!", Toast.LENGTH_LONG).show();
                 } else {
                     exit = false;
                     serverThread.interrupt();
@@ -403,10 +396,6 @@ public class LobbyActivity extends AppCompatActivity {
 
 }
 
-enum Operation {
-    ADD_CLIENT, REMOVE_CLIENT;
-}
-
 
 
 
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java b/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java
index ce3fc88656376934533385b360d000f40c1eb454..22e350ddbc5a8d026ef3cdee5906a9cc4b41890f 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/MainActivity.java
@@ -1,12 +1,17 @@
 package onlab.kvizserver;
 
+import android.Manifest;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AppCompatActivity;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
+import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.RadioButton;
@@ -35,6 +40,8 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
+        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
+
         Button StartLobbyBtn = (Button) findViewById(R.id.StartLobby);
         final EditText txtName = (EditText) findViewById(R.id.txtName);
         Button ChooseQuestionFileBtn = (Button) findViewById(R.id.ChooseQuestionFile);
@@ -53,8 +60,18 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
         ChooseQuestionFileBtn.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                FileDialog dialog = new OpenFileDialog();
-                dialog.show(getSupportFragmentManager(), OpenFileDialog.class.getName());
+                if (ContextCompat.checkSelfPermission(MainActivity.this,
+                        Manifest.permission.READ_EXTERNAL_STORAGE)
+                        != PackageManager.PERMISSION_GRANTED) {
+
+                    // Permission is not granted; request the permission
+                    ActivityCompat.requestPermissions(MainActivity.this,
+                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
+                } else {
+                    // Permission has already been granted
+                    FileDialog dialog = new OpenFileDialog();
+                    dialog.show(getSupportFragmentManager(), OpenFileDialog.class.getName());
+                }
             }
         });
 
@@ -130,4 +147,22 @@ public class MainActivity extends AppCompatActivity implements FileDialog.OnFile
         }
     }
 
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+        switch (requestCode) {
+            case 1: {
+                // If request is cancelled, the result arrays are empty.
+                if (grantResults.length > 0
+                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    // permission was granted
+                    FileDialog dialog = new OpenFileDialog();
+                    dialog.show(getSupportFragmentManager(), OpenFileDialog.class.getName());
+                } else {
+                    // permission denied
+                }
+                return;
+            }
+        }
+    }
+
 }
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/Operation.java b/KvizServer/app/src/main/java/onlab/kvizserver/Operation.java
new file mode 100644
index 0000000000000000000000000000000000000000..8165c2ad6f8c21b93920e6bafb819be5c9d3ef50
--- /dev/null
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/Operation.java
@@ -0,0 +1,5 @@
+package onlab.kvizserver;
+
+public enum Operation {
+    ADD_CLIENT, REMOVE_CLIENT;
+}
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListAdapter.java b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListAdapter.java
index 2e86e76a33cc96c2f7837cc80f0083af7e685d3c..dff741ecfb8bc1057099239a3e3dd805ff30c665 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListAdapter.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListAdapter.java
@@ -42,7 +42,7 @@ public class QuestionListAdapter extends RecyclerView.Adapter<QuestionListAdapte
     public void onBindViewHolder(final QuestionViewHolder holder, final int position) {
         final Question item = items.get(position);
         holder.indexOfQuestionTextView.setText(Integer.toString(position + 1));
-        holder.questionTextTextView.setText(item.getQuestionText());
+        holder.questionTextTextView.setText("[" + item.getTopic() + "]\n" + item.getQuestionText());
         String answersString = item.getCorrectAnswer();
         if (item.getType() == Question.MULTIPLE_CHOICE) {
             List<String> otherAnswers = item.getOtherAnswers();
@@ -124,8 +124,15 @@ public class QuestionListAdapter extends RecyclerView.Adapter<QuestionListAdapte
         int index = selected;
         if (index != -1) {
             selected = -1;
-            items.get(index).setEnabled(false);
+            Question question = items.get(index);
+            question.setEnabled(false);
+            question.save();
             notifyItemChanged(index);
         }
     }
+
+    public void refreshCompleteList(List<Question> questions) {
+        items = questions;
+        notifyDataSetChanged();
+    }
 }
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java
index 0aca790fdd5e01c07a6b53fcf3cdcfb747e35262..b2d5934a535b0239707a3387b86e72964493733d 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListFragment.java
@@ -1,9 +1,15 @@
 package onlab.kvizserver;
 
+import android.Manifest;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.DialogFragment;
 import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.widget.DividerItemDecoration;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -61,12 +67,30 @@ public class QuestionListFragment extends Fragment {
         exportButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                SaveFileDialog dialog = new SaveFileDialog();
-                dialog.show(getActivity().getSupportFragmentManager(), SaveFileDialog.class.getName());
+                if (ContextCompat.checkSelfPermission(getActivity(),
+                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
+                        != PackageManager.PERMISSION_GRANTED) {
+                    // Permission is not granted; request the permission
+                    ActivityCompat.requestPermissions(getActivity(),
+                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
+                } else {
+                    // Permission has already been granted
+                    SaveFileDialog dialog = new SaveFileDialog();
+                    dialog.show(getActivity().getSupportFragmentManager(), SaveFileDialog.class.getName());
+                }
             }
         });
 
         Button generateButton = (Button) getView().findViewById(R.id.GenerateButton);
+        generateButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                FragmentTransaction ft = getFragmentManager().beginTransaction();
+                ft.addToBackStack(null);
+                DialogFragment newFragment = QuestionListGeneratorDialogFragment.newInstance();
+                newFragment.show(ft, "QuestionListGeneratorDialogFragment");
+            }
+        });
     }
 
     @Override
@@ -98,7 +122,7 @@ public class QuestionListFragment extends Fragment {
         recyclerView.setAdapter(adapter);
     }
 
-    public void selecetedQuestionDisplayed() {
+    public void selectedQuestionDisplayed() {
         adapter.deselectActualQuestion();
     }
 
@@ -118,4 +142,9 @@ public class QuestionListFragment extends Fragment {
         Collections.sort(questions);
     }
 
+    public void refreshQuestionList() {
+        initQuestionList();
+        adapter.refreshCompleteList(questions);
+    }
+
 }
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListGeneratorDialogFragment.java b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListGeneratorDialogFragment.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba4540e106c05329b837153ab7dd00eff41a0afd
--- /dev/null
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/QuestionListGeneratorDialogFragment.java
@@ -0,0 +1,130 @@
+package onlab.kvizserver;
+
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import onlab.kvizserver.model.Question;
+
+public class QuestionListGeneratorDialogFragment extends DialogFragment {
+
+    private OnFragmentInteractionListener mListener;
+
+    List<String> topicList;
+
+    List<CheckBox> checkBoxes = new ArrayList<>();
+
+    public QuestionListGeneratorDialogFragment() {
+        // Required empty public constructor
+    }
+
+    public static QuestionListGeneratorDialogFragment newInstance() {
+        QuestionListGeneratorDialogFragment fragment = new QuestionListGeneratorDialogFragment();
+        Bundle args = new Bundle();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (getArguments() != null) {
+        }
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        // Inflate the layout for this fragment
+        return inflater.inflate(R.layout.fragment_question_list_generator_dialog, container, false);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        LinearLayout topicsLinearLayout = (LinearLayout) getView().findViewById(R.id.TopicsLinearLayout);
+        final EditText numberOfMultipleChoiceEditText = (EditText) getView().findViewById(R.id.NumberOfMultipleChoiceEditText);
+        final EditText numberOfGuessEditText = (EditText) getView().findViewById(R.id.NumberOfGuessEditText);
+        final CheckBox onlyEnabledQuestionsCheckBox = (CheckBox) getView().findViewById(R.id.OnlyEnabledQuestionsCheckBox);
+        Button generateButtonOnDialog = (Button) getView().findViewById(R.id.GenerateButtonOnDialog);
+
+        List<Question> allQuestions = Question.listAll(Question.class);
+        topicList = Question.getTopicList(allQuestions);
+        for (String topic : topicList) {
+            LinearLayout topicLinearLayout = new LinearLayout(getContext());
+            topicLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
+            CheckBox topicCheckBox = new CheckBox(getContext());
+            checkBoxes.add(topicCheckBox);
+            TextView topicNameTextView = new TextView(getContext());
+            topicNameTextView.setText(topic);
+            topicLinearLayout.addView(topicCheckBox);
+            topicLinearLayout.addView(topicNameTextView);
+            topicsLinearLayout.addView(topicLinearLayout);
+        }
+
+        generateButtonOnDialog.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                restrictTopicList();
+                int numberOfMultipleChoice;
+                try {
+                    numberOfMultipleChoice = Integer.parseInt(numberOfMultipleChoiceEditText.getText().toString());
+                } catch (NumberFormatException e) {
+                    numberOfMultipleChoice = 0;
+                }
+                int numberOfGuess;
+                try {
+                    numberOfGuess = Integer.parseInt(numberOfGuessEditText.getText().toString());
+                } catch (NumberFormatException e) {
+                    numberOfGuess = 0;
+                }
+                mListener.generateQuestionList(topicList, numberOfMultipleChoice, numberOfGuess,
+                        onlyEnabledQuestionsCheckBox.isChecked());
+                dismiss();
+            }
+        });
+    }
+
+    //a ki nem jelölt topicok kidobása
+    private void restrictTopicList() {
+        for (int i=checkBoxes.size()-1;i>=0;i--) {
+            if (!checkBoxes.get(i).isChecked()) {
+                topicList.remove(i);
+            }
+        }
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        if (context instanceof OnFragmentInteractionListener) {
+            mListener = (OnFragmentInteractionListener) context;
+        } else {
+            throw new RuntimeException(context.toString()
+                    + " must implement OnFragmentInteractionListener");
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mListener = null;
+    }
+
+    public interface OnFragmentInteractionListener {
+        void generateQuestionList(List<String> topics, int numberOfMultipleChoice, int numberOfGuess, boolean onlyEnabled);
+    }
+}
diff --git a/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java b/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java
index 9c041b8a49f57d4e62f334fdc78b0a80eea18ad8..e679b0952d643fe18517017914daa655d18c1ec0 100644
--- a/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java
+++ b/KvizServer/app/src/main/java/onlab/kvizserver/model/Question.java
@@ -6,7 +6,9 @@ import com.orm.SugarRecord;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 public class Question extends SugarRecord implements Comparable<Question> {
     private String topic;
@@ -97,6 +99,10 @@ public class Question extends SugarRecord implements Comparable<Question> {
         return currentIndex;
     }
 
+    public void setCurrentIndex(int currentIndex) {
+        this.currentIndex = currentIndex;
+    }
+
     @Override
     public int compareTo(@NonNull Question question) {
         return this.currentIndex - question.currentIndex;
@@ -116,4 +122,14 @@ public class Question extends SugarRecord implements Comparable<Question> {
         line += "\t" + (enabled ? "enabled" : "disabled") + "\t" + currentIndex;
         return line;
     }
+
+    public static List<String> getTopicList(List<Question> questions) {
+        Set<String> topicSet = new HashSet<>();
+        for (Question question : questions) {
+            topicSet.add(question.getTopic());
+        }
+        List<String> topicList = new ArrayList<>(topicSet);
+        Collections.sort(topicList);
+        return topicList;
+    }
 }
diff --git a/KvizServer/app/src/main/res/layout/fragment_question_list.xml b/KvizServer/app/src/main/res/layout/fragment_question_list.xml
index 4551460363c1cccf5d0deaea382549c615af1709..780876cbba008a477c8bd5fa90d0f7bde994138e 100644
--- a/KvizServer/app/src/main/res/layout/fragment_question_list.xml
+++ b/KvizServer/app/src/main/res/layout/fragment_question_list.xml
@@ -15,7 +15,6 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:id="@+id/GenerateButton"
-            android:enabled="false"
             android:text="Generate new list"/>
 
         <Button
diff --git a/KvizServer/app/src/main/res/layout/fragment_question_list_generator_dialog.xml b/KvizServer/app/src/main/res/layout/fragment_question_list_generator_dialog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..31a319eab5737cdfdd5e1bc3a0b444cb160f1a2f
--- /dev/null
+++ b/KvizServer/app/src/main/res/layout/fragment_question_list_generator_dialog.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".QuestionListGeneratorDialogFragment">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Topics"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:id="@+id/TopicsLinearLayout">
+
+        </LinearLayout>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Multiple choice questions per topic"
+            android:layout_marginTop="20dp"/>
+
+        <EditText
+            android:layout_width="30dp"
+            android:layout_height="wrap_content"
+            android:id="@+id/NumberOfMultipleChoiceEditText"
+            android:inputType="number"/>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Guess questions per topic"
+            android:layout_marginTop="20dp"/>
+
+        <EditText
+            android:layout_width="30dp"
+            android:layout_height="wrap_content"
+            android:id="@+id/NumberOfGuessEditText"
+            android:inputType="number"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp">
+
+            <CheckBox
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/OnlyEnabledQuestionsCheckBox"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Only enabled questions"/>
+
+        </LinearLayout>
+
+        <Button
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Generate"
+            android:id="@+id/GenerateButtonOnDialog"/>
+
+    </LinearLayout>
+
+</ScrollView>
\ No newline at end of file