diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index 01abdd4..acfa388 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -55,6 +55,7 @@
 
 		return None
 
+# LMS Utils
 def get_current_student():
 	"""
 	Returns student user name, example EDU-STU-2018-00001 (Based on the naming series).
@@ -89,7 +90,7 @@
 	return {'program': program, 'is_enrolled': is_enrolled}
 
 def get_course_enrollment(course_name):
-	student = utils.get_current_student()
+	student = get_current_student()
 	enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student, 'course':course_name})
 	try:
 		name = enrollment_name[0].name
diff --git a/erpnext/www/lms.py b/erpnext/www/lms.py
index 7b972fb..4bb9901 100644
--- a/erpnext/www/lms.py
+++ b/erpnext/www/lms.py
@@ -2,7 +2,27 @@
 import erpnext.education.utils as utils
 import frappe
 
-# Academy Utils
+# LMS Utils to Update State for Vue Store
+@frappe.whitelist()
+def get_program_enrollments():
+	try:
+		student = frappe.get_doc("Student", utils.get_current_student())
+		return student.get_program_enrollments()
+	except:
+		return None
+
+@frappe.whitelist()
+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_all_course_enrollments()
+	except:
+		return None
+
+# Vue Client Functions
 @frappe.whitelist(allow_guest=True)
 def get_portal_details():
 	"""
@@ -76,16 +96,6 @@
 	content_type = course.course_content[0].content_type
 	return dict(content=content, content_type=content_type)
 
-# Functions to get content details
-@frappe.whitelist()
-def get_content(content_name, content_type):
-	try:
-		content = frappe.get_doc(content_type, content_name)
-		return content
-	except:
-		frappe.throw("{0} with name {1} does not exist".format(content_type, content_name))
-		return None
-
 @frappe.whitelist()
 def get_next_content(content, content_type, course):
 	if frappe.session.user == "Guest":
@@ -94,6 +104,7 @@
 	content_list = [{'content_type':item.content_type, 'content':item.content} for item in course_doc.get_all_children()]
 	current_index = content_list.index({'content': content, 'content_type': content_type})
 	try:
+		# print(content_list[current_index + 1])
 		return content_list[current_index + 1]
 	except IndexError:
 		return None
@@ -179,27 +190,6 @@
 	utils.enroll_all_courses_in_program(program_enrollment, student)
 	return program_name
 
-@frappe.whitelist()
-def get_program_enrollments():
-	if utils.get_current_student() == None:
-		return None
-	try:
-		student = frappe.get_doc("Student", utils.get_current_student())
-		return student.get_program_enrollments()
-	except:
-		return None
-
-@frappe.whitelist()
-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_all_course_enrollments()
-	except:
-		return None
-
 # Academty Activity 
 @frappe.whitelist()
 def add_activity(enrollment, content_type, content):
@@ -218,51 +208,38 @@
 
 def get_course_progress(course_enrollment):
 	course = frappe.get_doc('Course', course_enrollment.course)
+	contents = course.get_contents()
+	progress = []
+	for index, content in enumerate(contents):
+		if content.doctype in ('Article', 'Video'):
+			status = check_content_completion(content.name, content.doctype, course_enrollment.name)
+			progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status})
+		elif content.doctype == 'Quiz':
+			status, score = check_quiz_completion(content, course_enrollment.name)
+			progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status, 'score': score})
+	return progress
 
-	content_activity, quiz_activity = course_enrollment.get_linked_activity()
-	content_list, quiz_list = course.get_contents_based_on_type()
+def check_content_completion(content_name, content_type, enrollment_name):
+	activity = frappe.get_list("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
+	if activity:
+		return True
+	else:
+		return False
+
+def check_quiz_completion(quiz, enrollment_name):
+	attempts = frappe.get_list("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
+	if attempts and quiz.grading_basis == 'Last Attempt':
+		score = attempts[0]['score']
+		status = attempts[0]['status']
+		return status, score
 	
-	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)
-
-	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
-	}
+	elif attempts and quiz.grading_basis == 'Last Highest Score':
+		sorted_by_score = sorted(attempts, key = lambda i: int(i.score), reverse=True)
+		score = sorted_by_score[0]['score']
+		status = sorted_by_score[0]['status']
+		return status, score
 	
-	return quiz_data, content_data
+	return False, None
 
-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)
-			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
+def get_course_meta():
+	pass
\ No newline at end of file
