diff --git a/erpnext/demo/user/schools.py b/erpnext/demo/user/schools.py
index 6388f9a..422c31a 100644
--- a/erpnext/demo/user/schools.py
+++ b/erpnext/demo/user/schools.py
@@ -8,30 +8,22 @@
 from frappe.utils import cstr
 from frappe.utils.make_random import get_random
 from datetime import timedelta
-from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, get_fee_schedule, collect_fees
+from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, \
+								get_fee_schedule, collect_fees, get_course
+from erpnext.schools.doctype.program_enrollment.program_enrollment import get_program_courses
+from erpnext.schools.doctype.student_group.student_group import get_students
 
 def work():
 	frappe.set_user(frappe.db.get_global('demo_schools_user'))
 	for d in xrange(20):
 		approve_random_student_applicant()
 		enroll_random_student(frappe.flags.current_date)
-	if frappe.flags.current_date.weekday()== 0:
-		make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5))	
+	# if frappe.flags.current_date.weekday()== 0:
+	# 	make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5))	
 	mark_student_attendance(frappe.flags.current_date)
+	# make_assessment_plan()
 	make_fees()
 
-def mark_student_attendance(current_date):
-	status = ["Present", "Absent"]
-	for d in frappe.db.get_list("Course Schedule", filters={"schedule_date": current_date}, fields=("name", "student_group")):
-		students = get_student_group_students(d.student_group)
-		for stud in students:
-			make_attendance_records(stud.student, stud.student_name, d.name, status[weighted_choice([9,4])])
-			
-def make_fees():
-	for d in range(1,10):
-		random_fee = get_random("Fees", {"paid_amount": 0})
-		collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount"))
-	
 def approve_random_student_applicant():
 	random_student = get_random("Student Applicant", {"application_status": "Applied"})
 	if random_student:
@@ -39,31 +31,59 @@
 		frappe.db.set_value("Student Applicant", random_student, "application_status", status[weighted_choice([9,3])])
 
 def enroll_random_student(current_date):
+	batch = ["Section-A", "Section-B"]
 	random_student = get_random("Student Applicant", {"application_status": "Approved"})
 	if random_student:
 		enrollment = enroll_student(random_student)
 		enrollment.academic_year = get_random("Academic Year")
 		enrollment.enrollment_date = current_date
+		enrollment.student_batch_name = batch[weighted_choice([9,3])]
 		fee_schedule = get_fee_schedule(enrollment.program)
 		for fee in fee_schedule:
 			enrollment.append("fees", fee)
+		enrolled_courses = get_course(enrollment.program)
+		for course in enrolled_courses:
+			enrollment.append("courses", course)
 		enrollment.submit()
 		frappe.db.commit()
-		assign_student_group(enrollment.student, enrollment.program)
+		assign_student_group(enrollment.student, enrollment.student_name, enrollment.program,
+			enrolled_courses, enrollment.student_batch_name)
 		
-def assign_student_group(student, program):
-	courses = []
-	for d in frappe.get_list("Program Course", fields=("course"), filters={"parent": program }):
-		courses.append(d.course)
+def assign_student_group(student, student_name, program, courses, batch):
+	course_list = [d["course"] for d in courses]
+	for d in frappe.get_list("Student Group", fields=("name"), filters={"program": program, "course":("in", course_list)}):
+		student_group = frappe.get_doc("Student Group", d.name)
+		student_group.append("students", {"student": student, "student_name": student_name,
+			"group_roll_number":len(student_group.students)+1, "active":1})
+		student_group.save()
+	student_batch = frappe.get_list("Student Group", fields=("name"), filters={"program": program, "group_based_on":"Batch", "batch":batch})[0]
+	student_batch_doc = frappe.get_doc("Student Group", student_batch.name)
+	student_batch_doc.append("students", {"student": student, "student_name": student_name,
+		"group_roll_number":len(student_batch_doc.students)+1, "active":1})
+	student_batch_doc.save()
+	frappe.db.commit()
 
-	for d in xrange(3):
-		course = random.choice(courses)
-		random_sg = get_random("Student Group", {"course": course})
-		if random_sg:
-			student_group = frappe.get_doc("Student Group", random_sg)
-			student_group.append("students", {"student": student})
-			student_group.save()
-		courses.remove(course)
+def mark_student_attendance(current_date):
+	status = ["Present", "Absent"]
+	for d in frappe.db.get_list("Student Group", filters={"group_based_on": "Batch"}):
+		students = get_student_group_students(d.name)
+		for stud in students:
+			make_attendance_records(stud.student, stud.student_name, status[weighted_choice([9,4])], None, d.name, current_date)
+			
+def make_fees():
+	for d in range(1,10):
+		random_fee = get_random("Fees", {"paid_amount": 0})
+		collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount"))	
+
+def make_assessment_plan(date):
+	for d in range(1,4):
+		random_group = get_random("Student Group", {"group_based_on": "Course"}, True)
+		doc = frappe.new_doc("Assessment Plan")
+		doc.student_group = random_group.name
+		doc.course = random_group.course
+		doc.assessment_group = get_random("Assessment Group", {"is_group": 0, "parent": "2017-18 (Semester 2)"})
+		doc.grading_scale = get_random("Grading Scale")
+		doc.maximum_assessment_score = 100
 		
 def make_course_schedule(start_date, end_date):
 	for d in frappe.db.get_list("Student Group"):
