diff --git a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html
index 2a92def1b52263e2b26fed427bb24f5bb5b6a1ee..f0160683835b06a45864d88bd53d9a8bb213eecb 100644
--- a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html
+++ b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.html
@@ -32,6 +32,7 @@
 			<button mat-button class="sidenav-link-btn"><i class="material-icons">print</i>Print</button>
 			<button mat-button class="sidenav-link-btn"><i class="material-icons">email</i> Share Plan</button>
 			<button mat-button class="sidenav-link-btn"><i class="material-icons">add_box</i> Add Degree Plan</button>
+			<button mat-button class="sidenav-link-btn" (click)="addAcademicYear()"><i class="material-icons">add_box</i> Add Academic Year</button>
 		</div>
 	</mat-expansion-panel>
 </div>
\ No newline at end of file
diff --git a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts
index 32afc442de96078b5c80ea8a5bc0e685374a2445..de404e61fdc9bd0b21404f8bee256d26aa9ad340 100644
--- a/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts
+++ b/src/app/degree-planner/sidenav-menu-item/sidenav-menu-item.component.ts
@@ -1,12 +1,21 @@
-import { Component, OnInit } from '@angular/core';
+// Libraries
+import { Component } from '@angular/core';
+import { Store } from '@ngrx/store';
+
+// State management
+import { GlobalState } from '@app/core/state';
+import { AddAcademicYearRequest } from '@app/degree-planner/store/actions/addAcademicYear.actions';
 
 @Component({
   selector: 'cse-sidenav-menu-item',
   templateUrl: './sidenav-menu-item.component.html',
   styleUrls: ['./sidenav-menu-item.component.scss'],
 })
-export class SidenavMenuItemComponent implements OnInit {
-  constructor() {}
 
-  ngOnInit() {}
+export class SidenavMenuItemComponent {
+  constructor(private store: Store<GlobalState>) {}
+
+  public addAcademicYear() {
+    this.store.dispatch(new AddAcademicYearRequest());
+  }
 }
diff --git a/src/app/degree-planner/store/actions/addAcademicYear.actions.ts b/src/app/degree-planner/store/actions/addAcademicYear.actions.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aa3398e5e2bba74c20c61fdee3c9d43f1a4c5349
--- /dev/null
+++ b/src/app/degree-planner/store/actions/addAcademicYear.actions.ts
@@ -0,0 +1,9 @@
+import { Action } from '@ngrx/store';
+
+export enum AddAcademicYearActionTypes {
+    AddAcademicYearRequest = '[AcademicYear] Add Academic Year Request',
+}
+
+export class AddAcademicYearRequest implements Action {
+    public readonly type = AddAcademicYearActionTypes.AddAcademicYearRequest;
+}
diff --git a/src/app/degree-planner/store/reducer.ts b/src/app/degree-planner/store/reducer.ts
index 3f3beb6520261b4c87f429c4c4f87c51f728e581..39f3209813f5f049b3c3810edae6e262762728a5 100644
--- a/src/app/degree-planner/store/reducer.ts
+++ b/src/app/degree-planner/store/reducer.ts
@@ -23,6 +23,10 @@ import {
   WriteNoteSuccess,
   DeleteNoteSuccess,
 } from '@app/degree-planner/store/actions/note.actions';
+import {
+  AddAcademicYearActionTypes,
+  AddAcademicYearRequest,
+ } from '@app/degree-planner/store/actions/addAcademicYear.actions';
 import { SavedForLaterCourse } from '@app/core/models/saved-for-later-course';
 import { DegreePlan } from '@app/core/models/degree-plan';
 
@@ -36,6 +40,7 @@ type SupportedActions =
   | AddCourseSuccess
   | RemoveSaveForLaterSuccess
   | AddSaveForLaterSuccess
+  | AddAcademicYearRequest
   | MakePlanPrimary
   | MakePlanPrimarySuccess
   | MakePlanPrimaryFailure;
@@ -64,6 +69,32 @@ export function degreePlannerReducer(
       return { ...state, ...action.payload };
     }
 
+    /**
+     * The `AddAcademicYearRequest` action is triggered after `addAcademicYear()`
+     * function runs. A new academic year container with three terms will be created.
+    */
+    case AddAcademicYearActionTypes.AddAcademicYearRequest: {
+      const originalTerms = state.visibleTerms.map( term => {
+        return parseInt(term.termCode.substr(0, 3), 10);
+      });
+
+      const newAcademicYearCode = Math.max(...originalTerms) + 1;
+
+      const newVisibleTerms = [
+        ...state.visibleTerms,
+        { termCode: `${newAcademicYearCode}2`,
+          courses: []
+        },
+        { termCode: `${newAcademicYearCode}4`,
+          courses: []
+        },
+        { termCode: `${newAcademicYearCode}6`,
+          courses: []
+        }
+      ];
+      return { ...state, visibleTerms: newVisibleTerms };
+    }
+
     /**
      * The `WriteNoteResponse` action is dispatched by the `Note.write$` effect
      * upon a successful response from the `updateNote` or `createNote` API