diff --git a/migrations/versions/f97aa3c73453_.py b/migrations/versions/b46a2994605b_.py
similarity index 62%
rename from migrations/versions/f97aa3c73453_.py
rename to migrations/versions/b46a2994605b_.py
index f8b83ddae9d7fcdf4a921046c559e38828cb69dc..a098e2e9360b52ae2214c377c47086001104c48f 100644
--- a/migrations/versions/f97aa3c73453_.py
+++ b/migrations/versions/b46a2994605b_.py
@@ -1,7 +1,8 @@
-""" empty message
+"""empty message
 
-Revision ID: f97aa3c73453
+Revision ID: b46a2994605b
 Revises: 4204f4a83863
+Create Date: 2019-05-15 15:41:56.615076
 
 """
 from alembic import op
@@ -9,26 +10,28 @@ import sqlalchemy as sa
 
 
 # revision identifiers, used by Alembic.
-revision = 'f97aa3c73453'
+revision = 'b46a2994605b'
 down_revision = '4204f4a83863'
 branch_labels = None
 depends_on = None
 
 
 def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
     op.create_table('mc_option',
                     sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
-                    sa.Column('x', sa.Integer(), nullable=False),
-                    sa.Column('y', sa.Integer(), nullable=False),
-                    sa.Column('page', sa.Integer(), nullable=False),
                     sa.Column('label', sa.String(), nullable=True),
                     sa.Column('problem_id', sa.Integer(), nullable=False),
                     sa.Column('feedback_id', sa.Integer(), nullable=True),
                     sa.ForeignKeyConstraint(['feedback_id'], ['feedback_option.id'], ),
-                    sa.ForeignKeyConstraint(['problem_id'], ['solution.id'], ),
+                    sa.ForeignKeyConstraint(['id'], ['widget.id'], ),
+                    sa.ForeignKeyConstraint(['problem_id'], ['problem.id'], ),
                     sa.PrimaryKeyConstraint('id')
                     )
+    # ### end Alembic commands ###
 
 
 def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
     op.drop_table('mc_option')
+    # ### end Alembic commands ###
diff --git a/package.json b/package.json
index ee31829f380dca39acc022f51e243514aa6fcc16..2f768e7f895d79e4ebb2935979d55dd03359bd98 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
     "analyze": "webpack --config webpack.prod.js --profile --json > stats.json; webpack-bundle-analyzer stats.json zesje/static",
     "migrate:dev": "ZESJE_SETTINGS=$(pwd)/zesje.dev.cfg FLASK_APP=zesje/__init__.py flask db upgrade",
     "migrate": "FLASK_APP=zesje/__init__.py flask db upgrade",
-    "prepare-migration": "ZESJE_SETTINGS=$(pwd)/zesje.dev.cfg FLASK_APP=zesje/__init__.py flask db migrate"
+    "prepare-migration": "ZESJE_SETTINGS=$(pwd)/zesje.dev.cfg FLASK_APP=zesje/__init__.py flask db migrate",
+    "migrate-down": "FLASK_APP=zesje/__init__.py flask db downgrade"
   },
   "standard": {
     "parser": "babel-eslint",
diff --git a/zesje/api/__init__.py b/zesje/api/__init__.py
index d54febf914cf216947559df54511e4e34591bbaf..17dfe1554eee0c8752ef1e0f5e71b713d8d150f1 100644
--- a/zesje/api/__init__.py
+++ b/zesje/api/__init__.py
@@ -12,7 +12,6 @@ from .solutions import Solutions
 from .widgets import Widgets
 from .emails import EmailTemplate, RenderedEmailTemplate, Email
 from .mult_choice import MultipleChoice
-from .test import Test
 
 from . import signature
 from . import images
@@ -51,8 +50,9 @@ api.add_resource(RenderedEmailTemplate,
 api.add_resource(Email,
                  '/email/<int:exam_id>',
                  '/email/<int:exam_id>/<int:student_id>')
-api.add_resource(MultipleChoice, '/mult-choice/<int:id>')
-api.add_resource(Test, '/test/')
+api.add_resource(MultipleChoice,
+                 '/mult-choice/<int:id>',
+                 '/mult-choice/')
 
 
 # Other resources that don't return JSON
diff --git a/zesje/api/exams.py b/zesje/api/exams.py
index 3e96930cb64fbd8e5bd6559f696d4f5921b879cf..ef889c7be9bb0815f403b73b30953ff89ca9fa9f 100644
--- a/zesje/api/exams.py
+++ b/zesje/api/exams.py
@@ -183,7 +183,20 @@ class Exams(Resource):
                         'width': prob.widget.width,
                         'height': prob.widget.height,
                     },
-                    'graded': any([sol.graded_by is not None for sol in prob.solutions])
+                    'graded': any([sol.graded_by is not None for sol in prob.solutions]),
+                    'mc_options': [
+                        {
+                            'id': mc_option.id,
+                            'label': mc_option.label,
+                            'problem_id': mc_option.problem_id,
+                            'feedback_id': mc_option.feedback_id,
+                            'widget': {
+                                'name': mc_option.name,
+                                'x': mc_option.x,
+                                'y': mc_option.y
+                            }
+                        } for mc_option in prob.mc_options
+                    ]
                 } for prob in exam.problems  # Sorted by prob.id
             ],
             'widgets': [
diff --git a/zesje/api/mult_choice.py b/zesje/api/mult_choice.py
index 42c6c2cf85f63bae3a144a577d706a96cd470886..330cbbff2df9001924d7c63c53b1d3ceafd3f354 100644
--- a/zesje/api/mult_choice.py
+++ b/zesje/api/mult_choice.py
@@ -3,22 +3,44 @@ from flask_restful import Resource, reqparse
 from ..database import db, MultipleChoiceOption
 
 
+def set_mc_data(mc_entry, name, x, y, mc_type, problem_id, feedback_id, label):
+    """Sets the data of a MultipleChoiceOption ORM object.
+
+    Parameters:
+    -----------
+    mc_entry: The MultipleChoiceOption object
+    x: the x-position of the MultipleChoiceOption object.
+    y: the y-position of the MultipleChoiceOption object.
+    problem_id: the problem the MultipleChoiceOption refers to
+    feedback_id: the feedback the MultipleChoiceOption refers to
+    label: label for the checkbox that this MultipleChoiceOption represents
+    """
+    mc_entry.name = name
+    mc_entry.x = x
+    mc_entry.y = y
+    mc_entry.type = mc_type
+    mc_entry.problem_id = problem_id
+    mc_entry.feedback_id = feedback_id
+    mc_entry.label = label
+
+
 class MultipleChoice(Resource):
 
     put_parser = reqparse.RequestParser()
 
     # Arguments that have to be supplied in the request body
+    put_parser.add_argument('name', type=str, required=True)
     put_parser.add_argument('x', type=int, required=True)
     put_parser.add_argument('y', type=int, required=True)
-    put_parser.add_argument('page', type=int, required=True)
     put_parser.add_argument('label', type=str, required=False)
     put_parser.add_argument('problem_id', type=int, required=True)
     put_parser.add_argument('feedback_id', type=int, required=True)
 
-    def put(self, id):
-        """Puts a multiple choice option to the database
+    def put(self, id=None):
+        """Adds or updates a multiple choice option to the database
 
-        If the specified ID is already present, the current option will be updated.
+        If the parameter id is not present, a new multiple choice question
+        will be inserted with the data provided in the request body.
 
         Parameters
         ----------
@@ -27,43 +49,37 @@ class MultipleChoice(Resource):
 
         args = self.put_parser.parse_args()
 
+        # Get request arguments
+        name = args['name']
         x = args['x']
         y = args['y']
         label = args['label']
         problem_id = args['problem_id']
         feedback_id = args['feedback_id']
-        page = args['page']
 
-        mc_entry = MultipleChoiceOption.query.get(id)
+        # TODO: Set type here or add to request?
+        mc_type = 'mcq_widget'
 
-        # If entry is not present insert
-        if not mc_entry:
-            mc_entry = MultipleChoiceOption(
-                id=id,
-                x=x,
-                y=y,
-                page=page,
-                label=label,
-                problem_id=problem_id,
-                feedback_id=feedback_id
-            )
+        if not id:
+            # Insert new entry into the database
+            mc_entry = MultipleChoiceOption()
+            set_mc_data(mc_entry, name, x, y, mc_type, problem_id, feedback_id, label)
 
             db.session.add(mc_entry)
             db.session.commit()
 
-            return dict(status=200, message='Multiple choice question inserted'), 200
+            return dict(status=200, message=f'New multiple choice question with id {mc_entry.id} inserted'), 200
 
-        # Otherwise, update current entry
-        mc_entry.x = x
-        mc_entry.y = y
-        mc_entry.label = label
-        mc_entry.problem_id = problem_id
-        mc_entry.feedback_id = feedback_id
-        mc_entry.page = page
+        # Update existing entry otherwise
+        mc_entry = MultipleChoiceOption.query.get(id)
+
+        if not mc_entry:
+            return dict(status=404, message=f"Multiple choice question with id {id} does not exist"), 404
 
+        set_mc_data(mc_entry, name, x, y, mc_type, problem_id, feedback_id, label)
         db.session.commit()
 
-        return dict(status=200, message='Multiple choice question updated'), 200
+        return dict(status=200, message=f'Multiple choice question with id {id} updated'), 200
 
     def get(self, id):
         """Fetches multiple choice option from the database
@@ -79,17 +95,22 @@ class MultipleChoice(Resource):
         mult_choice = MultipleChoiceOption.query.get(id)
 
         if not mult_choice:
-            return dict(status=404, message='Multiple choice question does not exist.'), 404
+            return dict(status=404, message=f'Multiple choice question with id {id} does not exist.'), 404
 
         json = {
-            "id": mult_choice.id,
-            "x": mult_choice.x,
-            "y": mult_choice.y,
-            "problem_id": mult_choice.problem_id,
-            "feedback_id": mult_choice.feedback_id
+            'id': mult_choice.id,
+            'name': mult_choice.name,
+            'x': mult_choice.x,
+            'y': mult_choice.y,
+            'type': mult_choice.type,
+            'problem_id': mult_choice.problem_id
         }
 
+        # Nullable database fields
         if mult_choice.label:
             json['label'] = mult_choice.label
 
+        if mult_choice.feedback_id:
+            json['feedback_id'] = mult_choice.feedback_id
+
         return json
diff --git a/zesje/database.py b/zesje/database.py
index 7f3d02fd4f8e30cc38fc550e653025cfd0b85ee2..658a1082a731dc85f16622eae12269a6f1fa0c64 100644
--- a/zesje/database.py
+++ b/zesje/database.py
@@ -98,6 +98,7 @@ class Problem(db.Model):
     exam_id = Column(Integer, ForeignKey('exam.id'), nullable=False)
     feedback_options = db.relationship('FeedbackOption', backref='problem', order_by='FeedbackOption.id', lazy=True)
     solutions = db.relationship('Solution', backref='problem', lazy=True)
+    mc_options = db.relationship('MultipleChoiceOption', backref='problem', lazy=True)
     widget = db.relationship('ProblemWidget', backref='problem', uselist=False, lazy=True)
 
 
@@ -160,19 +161,18 @@ class Widget(db.Model):
     }
 
 
-class MultipleChoiceOption(db.Model):
+class MultipleChoiceOption(Widget):
     __tablename__ = 'mc_option'
-    id = Column(Integer, primary_key=True, autoincrement=True)
-
-    x = Column(Integer, nullable=False)
-    y = Column(Integer, nullable=False)
-    page = Column(Integer, nullable=False)
+    id = Column(Integer, ForeignKey('widget.id'), primary_key=True, autoincrement=True)
 
     label = Column(String, nullable=True)
-
-    problem_id = Column(Integer, ForeignKey('solution.id'), nullable=False)
+    problem_id = Column(Integer, ForeignKey('problem.id'), nullable=False)
     feedback_id = Column(Integer, ForeignKey('feedback_option.id'), nullable=True)
 
+    __mapper_args__ = {
+        'polymorphic_identity': 'mcq_widget'
+    }
+
 
 class ExamWidget(Widget):
     __tablename__ = 'exam_widget'