diff --git a/app/admin/views.py b/app/admin/views.py
index af261a9296e05db212630f13817b8be742892b68..fe04ad19a63385adc7e77f4c48c76d2a408b5bfe 100644
--- a/app/admin/views.py
+++ b/app/admin/views.py
@@ -2,9 +2,9 @@ from flask import abort, flash, redirect, render_template, url_for
 from flask_login import current_user, login_required
 
 from . import admin
-from forms import DepartmentForm
+from forms import DepartmentForm, RoleForm
 from .. import db
-from ..models import Department
+from ..models import Department, Role
 
 def check_admin():
     """
@@ -103,3 +103,91 @@ def delete_department(id):
 
     print("render template delete_department")
     return render_template(title="Delete Department")
+
+# Role views
+@admin.route('/roles')
+@login_required
+def list_roles():
+    check_admin()
+    """
+    List all roles
+    """
+    roles = Role.query.all()
+    return render_template('admin/roles/roles.html',
+                           roles=roles, title='Roles')
+
+@admin.route('/roles/add', methods=['GET', 'POST'])
+@login_required
+def add_role():
+    """
+    Add a role to the database
+    """
+    check_admin()
+
+    add_role = True
+
+    form = RoleForm()
+    if form.validate_on_submit():
+        role = Role(name=form.name.data,
+                    description=form.description.data)
+
+        try:
+            # add role to the database
+            db.session.add(role)
+            db.session.commit()
+            flash('You have successfully added a new role.')
+        except:
+            # in case role name already exists
+            flash('Error: role name already exists.')
+
+        # redirect to the roles page
+        return redirect(url_for('admin.list_roles'))
+
+    # load role template
+    return render_template('admin/roles/role.html', add_role=add_role,
+                           form=form, title='Add Role')
+
+@admin.route('/roles/edit/<int:id>', methods=['GET', 'POST'])
+@login_required
+def edit_role(id):
+    """
+    Edit a role
+    """
+    check_admin()
+
+    add_role = False
+
+    role = Role.query.get_or_404(id)
+    form = RoleForm(obj=role)
+    if form.validate_on_submit():
+        role.name = form.name.data
+        role.description = form.description.data
+        db.session.add(role)
+        db.session.commit()
+        flash('You have successfully edited the role.')
+
+        # redirect to the roles page
+        return redirect(url_for('admin.list_roles'))
+
+    form.description.data = role.description
+    form.name.data = role.name
+    return render_template('admin/roles/role.html', add_role=add_role,
+                           form=form, title="Edit Role")
+
+@admin.route('/roles/delete/<int:id>', methods=['GET', 'POST'])
+@login_required
+def delete_role(id):
+    """
+    Delete a role from the database
+    """
+    check_admin()
+
+    role = Role.query.get_or_404(id)
+    db.session.delete(role)
+    db.session.commit()
+    flash('You have successfully deleted the role.')
+
+    # redirect to the roles page
+    return redirect(url_for('admin.list_roles'))
+
+    return render_template(title="Delete Role")