diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..df829d9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+static/assets/diagrams/
diff --git a/utility/uml/generate_diagrams.ksh b/utility/uml/generate_diagrams.ksh
new file mode 100755
index 0000000..631fe1c
--- /dev/null
+++ b/utility/uml/generate_diagrams.ksh
@@ -0,0 +1,13 @@
+#!/bin/ksh
+
+targetdir="$(pwd)/static/assets/diagrams"
+
+rm -rf "$targetdir/*"
+cp $(pwd)/writeup/diagrams/*.png $targetdir
+
+for diag in $(find . -path "node_modules" -prune -o -name "*.puml" -print); do
+ ofilename="$(basename $diag .puml).png"
+
+ java -jar "utility/uml/plantuml-1.2021.13.jar" $diag -o $targetdir
+ echo "Compiled $diag to $targetdir/$ofilename"
+done
diff --git a/utility/uml/plantuml-1.2021.13.jar b/utility/uml/plantuml-1.2021.13.jar
new file mode 100644
index 0000000..ae64c92
Binary files /dev/null and b/utility/uml/plantuml-1.2021.13.jar differ
diff --git a/writeup/diagrams/.gitignore b/writeup/diagrams/.gitignore
new file mode 100644
index 0000000..705ba85
--- /dev/null
+++ b/writeup/diagrams/.gitignore
@@ -0,0 +1,2 @@
+*.png
+!stratosSchema.png
diff --git a/writeup/diagrams/classDiagram.puml b/writeup/diagrams/classDiagram.puml
new file mode 100644
index 0000000..2e80a4b
--- /dev/null
+++ b/writeup/diagrams/classDiagram.puml
@@ -0,0 +1,132 @@
+@startuml
+skinparam classAttributeIconSize 0
+
+User <|-- Account
+User <|-- Student
+User <|-- Parent
+
+User -- PasswordReset
+
+Student -- Parent
+Student -- Test
+Student -- Class
+
+Account -- Class
+Account -- TestTemplate
+
+Class -- Subject
+Class -- Test
+
+TestTemplate -- Test
+TestTemplate -- Class
+
+Test -- TestResult
+
+TestResult -- Student
+
+class User {
+ id: string
+ firstName: string
+ otherNames: string
+ lastName: string
+ email: string
+ password: string
+ type: string
+ getfullName(): string
+ verifyPassword(hash): boolean
+ changePassword(password): void
+ getPasswordReset(): PasswordReset
+ generatePasswordReset(): PasswordReset
+ {static} hashPassword(password): string
+ {static} createUser(...): Account|Student|Parent
+ {static} getUserByEmail(...): Account|Student|Parent
+}
+
+class Account {
+ getClasses(): Class[]
+ getTests(): TestTemplate[]
+ createTestTemplate(...): TestTemplate
+ createClass(...): Class
+}
+
+class Student {
+ getClasses(): Class[]
+ getTests(): Test[]
+ getParents(): Parent[]
+}
+
+class Parent {
+ getChildren(): Student[]
+}
+
+class PasswordReset {
+ userId: string
+ token: string
+ nonce: string
+ expires: Date
+ getUser(): User
+ {static} hashToken(): {string, string}
+ {static} generatePasswordReset(): PasswordReset
+}
+
+class Subject {
+ subjectId: int
+ name: string
+}
+
+class Class {
+ classId: string
+ subjectId: int
+ name: string
+ getSubject(): Subject
+ getTests(): Test[]
+ getTeachers(): Account[]
+ getTeacher(): Teacher
+ getStudents(): Student[]
+ getStudent(): Student
+ addTeacher(): void
+ removeTeacher(): void
+ addStudent(): void
+ removeStudent(): void
+ isAuthorised(User): boolean
+ calculateAverageMovement(): int
+ {static} createClass(): Class
+}
+
+class TestTemplate {
+ testTemplateId: string
+ accountId: string
+ name: string
+ maxMark: int
+ assignClass(): Test
+ getClasses(): Class[]
+ isAuthorised(User): boolean
+ {static} createTestTemplate(): TestTemplate
+}
+
+class Test {
+ testId: string
+ testTemplateId: string
+ classId: string
+ testDate: Date
+ getClass(): Class
+ getStudent(): TestResult
+ getStudents(): TestResult[]
+ getTestTemplate(): TestTemplate
+ calculateAverageScore(): int
+ calculateGradeBoundaries(): Object
+}
+
+class TestResult {
+ studentId: string
+ accountId: string
+ testId: string
+ setMark(): void
+ getMark(): int
+ getPercentage(): int
+ getGrade(): string
+ getStudent(): Student
+ getTest(): Test
+}
+
+@enduml
diff --git a/writeup/diagrams/stratos.dbs b/writeup/diagrams/stratos.dbs
new file mode 100755
index 0000000..94d5a1c
--- /dev/null
+++ b/writeup/diagrams/stratos.dbs
@@ -0,0 +1,314 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/writeup/diagrams/stratosSchema.png b/writeup/diagrams/stratosSchema.png
new file mode 100755
index 0000000..438015d
Binary files /dev/null and b/writeup/diagrams/stratosSchema.png differ
diff --git a/writeup/diagrams/systemsDiagram.puml b/writeup/diagrams/systemsDiagram.puml
new file mode 100644
index 0000000..2d33653
--- /dev/null
+++ b/writeup/diagrams/systemsDiagram.puml
@@ -0,0 +1,49 @@
+@startwbs
+
++ Stratos Online Markbook
+ + User accounts
+ + Creating accounts
+ + Logging in
+ + Resetting passwords
+ + Management
+ + Teacher based
+ + Accounts assigning teachers
+ + Accounts adding classes
+ + Assigning students to classes
+ + Assigning tests to classes
+ + Test based
+ + Assigning scores to students
+ + Calculating grade boundaries
+ + Generating graphs
+ + Setting global test values with reports generation
+ + Student/Parent based
+ + Contact teachers
+ + Generate graphs per student
+ + Generate local test values with reports generation
+ + Display dashboard
+ + Send emails
+ + Handling data
+ + Reports
+ + Test reports
+ + Average score
+ + Grade boundary chart
+ + Class reports
+ + Score movement over time
+ + Markbook
+ + Teacher reports
+ + Mass generate all classes/students
+ + Student reports
+ + Average score over time
+ + Score movement
+ + Average grade
+@endwbs
diff --git a/writeup/diagrams/test/testAggregated.puml b/writeup/diagrams/test/testAggregated.puml
new file mode 100644
index 0000000..dcacf86
--- /dev/null
+++ b/writeup/diagrams/test/testAggregated.puml
@@ -0,0 +1,69 @@
+
+@startuml
+skinparam actorStyle awesome
+
+package Parents {
+ actor parent1 as p1
+ actor parent2 as p2
+ actor parent3 as p3
+ actor parent4 as p4
+ actor parent5 as p5
+}
+
+package Students {
+ actor student1 as s1
+ actor student2 as s2
+ actor student3 as s3
+ actor student4 as s4
+ actor student5 as s5
+}
+
+p1 --> s1
+p2 --> s2
+p3 --> s2
+p4 --> s3
+p4 --> s4
+p5 --> s4
+p5 --> s5
+
+package Classes {
+ usecase "Class 1" as c1
+ usecase "Class 2" as c2
+ usecase "Class 3" as c3
+ usecase "Class 4" as c4
+}
+
+s1 --> c1
+s2 --> c1
+s3 --> c1
+s4 --> c1
+s5 --> c1
+
+s1 --> c2
+s2 --> c2
+
+s1 --> c3
+s2 --> c3
+s3 --> c3
+
+s4 --> c4
+s5 --> c4
+
+package Accounts {
+ actor account1 as a1
+ actor account2 as a2
+ actor account3 as a3
+}
+
+c1 --> a1
+
+c2 --> a1
+c2 --> a2
+
+c3 --> a3
+
+c4 --> a1
+c4 --> a2
+c4 --> a3
+
+@enduml
diff --git a/writeup/diagrams/test/testClassesAccounts.puml b/writeup/diagrams/test/testClassesAccounts.puml
new file mode 100644
index 0000000..2689d1e
--- /dev/null
+++ b/writeup/diagrams/test/testClassesAccounts.puml
@@ -0,0 +1,28 @@
+@startuml
+skinparam actorStyle awesome
+
+package Classes {
+ usecase "Class 1" as c1
+ usecase "Class 2" as c2
+ usecase "Class 3" as c3
+ usecase "Class 4" as c4
+}
+
+package Accounts {
+ actor account1 as a1
+ actor account2 as a2
+ actor account3 as a3
+}
+
+c1 --> a1
+
+c2 --> a1
+c2 --> a2
+
+c3 --> a3
+
+c4 --> a1
+c4 --> a2
+c4 --> a3
+
+@enduml
diff --git a/writeup/diagrams/test/testParentsStudents.puml b/writeup/diagrams/test/testParentsStudents.puml
new file mode 100644
index 0000000..2b22bf1
--- /dev/null
+++ b/writeup/diagrams/test/testParentsStudents.puml
@@ -0,0 +1,29 @@
+@startuml
+skinparam actorStyle awesome
+
+package Parents {
+ actor parent1 as p1
+ actor parent2 as p2
+ actor parent3 as p3
+ actor parent4 as p4
+ actor parent5 as p5
+}
+
+package Students {
+ actor student1 as s1
+ actor student2 as s2
+ actor student3 as s3
+ actor student4 as s4
+ actor student5 as s5
+}
+
+p1 --> s1
+p2 --> s2
+p3 --> s2
+p4 --> s3
+p4 --> s4
+p5 --> s4
+p5 --> s5
+
+
+@enduml
diff --git a/writeup/diagrams/test/testStudentsClasses.puml b/writeup/diagrams/test/testStudentsClasses.puml
new file mode 100644
index 0000000..b3dfc0c
--- /dev/null
+++ b/writeup/diagrams/test/testStudentsClasses.puml
@@ -0,0 +1,35 @@
+@startuml
+skinparam actorStyle awesome
+
+package Students {
+ actor student1 as s1
+ actor student2 as s2
+ actor student3 as s3
+ actor student4 as s4
+ actor student5 as s5
+}
+
+package Classes {
+ usecase "Class 1" as c1
+ usecase "Class 2" as c2
+ usecase "Class 3" as c3
+ usecase "Class 4" as c4
+}
+
+s1 --> c1
+s2 --> c1
+s3 --> c1
+s4 --> c1
+s5 --> c1
+
+s1 --> c2
+s2 --> c2
+
+s1 --> c3
+s2 --> c3
+s3 --> c3
+
+s4 --> c4
+s5 --> c4
+
+@enduml