diff --git a/erpnext/www/lms.py b/erpnext/www/lms.py
index 625c66c..c343086 100644
--- a/erpnext/www/lms.py
+++ b/erpnext/www/lms.py
@@ -1,29 +1,23 @@
 from __future__ import unicode_literals
+import erpnext.education.utils as utils
 import frappe
 
 # Academy Utils
 @frappe.whitelist(allow_guest=True)
 def get_portal_details():
+	"""
+	Returns portal details from Education Settings Doctype. This contains the Title and Description for LMS amoung other things.
+	"""
 	settings = frappe.get_doc("Education Settings")
 	title = settings.portal_title
 	description = settings.description
 	return dict(title=title, description=description)
 
-def check_program_enrollment(program_name):
-	if frappe.session.user in ("Guest", "Administrator"):
-		return False
-	student = get_student_id(frappe.session.user)
-	enrollment = frappe.get_list("Program Enrollment", filters={'student':student, 'program': program_name})
-	if enrollment:
-		return True
-	else:
-		return False
-
 @frappe.whitelist(allow_guest=True)
 def get_featured_programs():
 	featured_program_names = frappe.get_all("Program", filters={"is_published": True, "is_featured": True})
 	if featured_program_names:
-		featured_list = [get_program(program['name']) for program in featured_program_names]
+		featured_list = [utils.get_program(program['name']) for program in featured_program_names]
 		return featured_list
 	else:
 		return None
@@ -32,16 +26,11 @@
 def get_all_programs():
 	program_names = frappe.get_all("Program", filters={"is_published": True})
 	if program_names:
-		featured_list = [get_program(program['name']) for program in program_names]
+		featured_list = [utils.get_program(program['name']) for program in program_names]
 		return featured_list
 	else:
 		return None
 
-def get_program(program_name):
-	program = frappe.get_doc('Program', program_name)
-	is_enrolled = check_program_enrollment(program_name)
-	return {'program': program, 'is_enrolled': is_enrolled}
-
 @frappe.whitelist(allow_guest=True)
 def get_program_details(program_name):
 	try:
@@ -50,40 +39,6 @@
 	except:
 		return None
 
-
-def get_enrollment(course_name):
-	student = get_student_id(frappe.session.user)
-	enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student, 'course':course_name})
-	try:
-		name = enrollment_name[0].name
-		enrollment = frappe.get_doc("Course Enrollment", name)
-		return enrollment
-	except:
-		return None
-
-@frappe.whitelist()
-def get_student_id(email=None):
-	"""Returns student user name, example EDU-STU-2018-00001 (Based on the naming series).
-
-	:param user: a user email address
-	"""
-	try:
-		student_id = frappe.db.get_all("Student", {"student_email_id": email}, ["name"])[0].name
-		return student_id
-	except IndexError:
-		return None
-
-def create_student():
-	student_name=frappe.session.user
-	student = frappe.get_doc({
-		"doctype": "Student",
-		"first_name": student_name,
-		"student_email_id": student_name,
-		})
-	student.save(ignore_permissions=True)
-	frappe.db.commit()
-	return student_name
-
 # Functions to get program & course details
 @frappe.whitelist(allow_guest=True)
 def get_courses(program_name):
@@ -92,11 +47,10 @@
 	course_data = [{'meta':get_continue_content(item.name), 'course':item} for item in courses]
 	return course_data
 
-@frappe.whitelist()
 def get_continue_content(course_name):
 	if frappe.session.user == "Guest":
 		return dict(content=None, content_type=None, flag=None)
-	enrollment = get_enrollment(course_name)
+	enrollment = utils.get_course_enrollment(course_name)
 	print(enrollment)
 	course = frappe.get_doc("Course", enrollment.course)
 	last_activity = enrollment.get_last_activity()
@@ -117,8 +71,6 @@
 		next_content['flag'] = "Continue"
 		return next_content
 
-
-@frappe.whitelist()
 def get_starting_content(course_name):
 	course = frappe.get_doc('Course', course_name)
 	content = course.course_content[0].content
@@ -173,6 +125,7 @@
 
 	:param quiz_response: contains user selected choices for a quiz in the form of a string formatted as a dictionary. The function uses `json.loads()` to convert it to a python dictionary.
 	"""
+	
 	import json
 	quiz_response = json.loads(quiz_response)
 	quiz = frappe.get_doc("Quiz", quiz_name)
@@ -194,16 +147,18 @@
 	add_quiz_activity(enrollment, quiz_name, result_data, score, status)
 	return(score)
 
-@frappe.whitelist()
-def get_completed_courses():
-	student = get_student_id(frappe.session.user)
-	if student == None:
-		return None
-	try:
-		student = frappe.get_doc("Student", student)
-		return student.get_completed_courses()
-	except:
-		return None
+def add_quiz_activity(enrollment, quiz_name, result_data, score, status):
+	quiz_activity = frappe.get_doc({
+		"doctype": "Quiz Activity",
+		"enrollment": enrollment,
+		"quiz": quiz_name,
+		"activity_date": frappe.utils.datetime.datetime.now(),
+		"result": result_data,
+		"score": score,
+		"status": status
+		})
+	quiz_activity.save()
+	frappe.db.commit()
 
 @frappe.whitelist()
 def get_continue_data(program_name):
@@ -217,47 +172,39 @@
 		return None
 
 @frappe.whitelist()
-def enroll_all_courses_in_program(program_enrollment, student):
-	program = frappe.get_doc("Program", program_enrollment.program)
-	course_list = [course.course for course in program.get_all_children()]
-	for course_name in course_list:
-		student.enroll_in_course(course_name=course_name, program_enrollment=program_enrollment.name)
-
-@frappe.whitelist()
 def enroll_in_program(program_name):
-	if(not get_student_id(frappe.session.user)):
-		create_student(frappe.session.user)
-	student = frappe.get_doc("Student", get_student_id(frappe.session.user))
+	if(not utils.get_current_student()):
+		utils.create_student(frappe.session.user)
+	student = frappe.get_doc("Student", utils.get_current_student())
 	program_enrollment = student.enroll_in_program(program_name)
-	enroll_all_courses_in_program(program_enrollment, student)
+	utils.enroll_all_courses_in_program(program_enrollment, student)
 	return program_name
 
 @frappe.whitelist()
-def get_program_enrollments(email=frappe.session.user):
-	if get_student_id(email) == None:
+def get_program_enrollments():
+	if utils.get_current_student() == None:
 		return None
 	try:
-		student = frappe.get_doc("Student", get_student_id(email))
+		student = frappe.get_doc("Student", utils.get_current_student())
 		return student.get_program_enrollments()
 	except:
 		return None
 
 @frappe.whitelist()
-def get_course_enrollments():
-	student = get_student_id(frappe.session.user)
+def get_all_course_enrollments():
+	student = utils.get_current_student()
 	if student == None:
 		return None
 	try:
 		student = frappe.get_doc("Student", student)
-		return student.get_course_enrollments()
+		return student.get_all_course_enrollments()
 	except:
 		return None
 
-
 # Academty Activity 
 @frappe.whitelist()
 def add_activity(enrollment, content_type, content):
-	if(check_activity_exists(enrollment, content_type, content)):
+	if(utils.check_activity_exists(enrollment, content_type, content)):
 		pass
 	else:
 		activity = frappe.get_doc({
@@ -270,25 +217,54 @@
 		activity.save()
 		frappe.db.commit()
 
-def check_activity_exists(enrollment, content_type, content):
-	activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment, 'content_type': content_type, 'content': content})
-	return bool(activity)
+def get_course_progress(course_enrollment):
+	course = frappe.get_doc('Course', course_enrollment.course)
 
-def add_quiz_activity(enrollment, quiz_name, result_data, score, status):
-	quiz_activity = frappe.get_doc({
-		"doctype": "Quiz Activity",
-		"enrollment": enrollment,
-		"quiz": quiz_name,
-		"result": result_data,
-		"score": score,
-		"status": status
-		})
-	quiz_activity.save()
-	frappe.db.commit()
+	content_activity, quiz_activity = course_enrollment.get_linked_activity()
+	content_list, quiz_list = course.get_contents_based_on_type()
+	
+	quiz_scores, is_quiz_complete, last_quiz_attempted = get_quiz_progress(quiz_list, quiz_activity)
+	is_content_complete, last_content_viewed = get_content_progress(content_list, content_activity)
 
-@frappe.whitelist()
-def mark_course_complete(enrollment):
-	course_enrollment = frappe.get_doc("Course Enrollment", enrollment)
-	course_enrollment.completed = True
-	course_enrollment.save()
-	frappe.db.commit()
+	quiz_data = {
+		'gradable_quiz_attempts': quiz_scores,
+		'complete': is_quiz_complete,
+		'last': last_quiz_attempted
+	}
+
+	content_data = {
+		'complete': is_content_complete,
+		'last': last_content_viewed
+	}
+	
+	return quiz_data, content_data
+
+def get_quiz_progress(quiz_list, quiz_activity):
+	scores = []
+	is_complete = True
+	last_attempted = None
+	for quiz in quiz_list:
+		attempts = [attempt for attempt in quiz_activity if attempt.quiz==quiz.name]
+		if attempts and quiz.grading_basis == 'Last Attempt':
+			scores.append(attempts[0])
+			last_attempted = quiz
+		elif attempts and quiz.grading_basis == 'Last Highest Score':
+			sorted_by_score = sorted(attempts, key = lambda i: int(i.score), reverse=True)
+			print([q.score for q in sorted_by_score])
+			scores.append(sorted_by_score[0])
+			last_attempted = quiz
+		elif not attempts:
+			is_complete = False
+	return scores, is_complete, last_attempted
+
+def get_content_progress(content_list, content_activity):
+	is_complete = True
+	last_viewed = None
+	activity_list = [[activity.content, activity.content_type] for activity in content_activity]
+	for item in content_list:
+		current_content = [item.name, item.doctype]
+		if current_content in activity_list:
+			last_viewed = item
+		else:
+			is_complete = False
+	return is_complete, last_viewed
\ No newline at end of file
