diff --git a/.eslintrc b/.eslintrc
index ec0d68b9b851aecd5fed5b8c2c7b6c87f52f46f9..15eefba00ead3e95099b0064fe507a5cdc2e93e8 100755
--- a/.eslintrc
+++ b/.eslintrc
@@ -4,6 +4,9 @@
     "browser": true,
     "jquery": true,
   },
+  "parserOptions": {
+    "sourceType": "module",
+  },
   "rules": {
     "no-await-in-loop": "warn",
     "no-compare-neg-zero": "warn",
diff --git a/index.html b/index.html
index 6f15215efa356f7bd42af41d708f9259bb322b95..6b3d9647411c2fd45fe998dc94ff0cafc057b9c0 100644
--- a/index.html
+++ b/index.html
@@ -5,18 +5,12 @@
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>Basic Graph Search</title>
+  <script defer="true" src="libraries/jquery/jquery.min.js"></script>
+  <script defer="true" type="module" src="js/index.js"></script>
 </head>
 
 <body>
   <div id="output"></div>
-  <script src="libraries/jquery/jquery.min.js"></script>
-  <script src="js/utility.js"></script>
-  <script src="js/stack.js"></script>
-  <script src="js/queue.js"></script>
-  <script src="js/priority_queue.js"></script>
-  <script src="js/graphs.js"></script>
-  <script src="js/inputs.js"></script>
-  <script src="js/index.js"></script>
 </body>
 
 </html>
diff --git a/js/graphs.js b/js/graphs.js
index b83accb641176035cb2dc1ddc51e6c98b3bb4bb0..75d41b676ae463df36d34b0957e7a00b1e59acd6 100644
--- a/js/graphs.js
+++ b/js/graphs.js
@@ -1,5 +1,3 @@
-/* exported DirectedGraph PuzzleGraph */
-
 class WeightedEdge {
   constructor(weight, destination) {
     this.weight = weight;
@@ -7,7 +5,7 @@ class WeightedEdge {
   }
 }
 
-class DirectedGraph {
+export class DirectedGraph {
   constructor() {
     this.incidences = new Map();
   }
@@ -24,7 +22,7 @@ class DirectedGraph {
   }
 }
 
-class PuzzleGraph {
+export class PuzzleGraph {
   getIncidences(source) { // eslint-disable-line class-methods-use-this
     const result = [];
     for (let i = source.length; i--;) {
diff --git a/js/index.js b/js/index.js
index fa00a8836392e16560ae9b38bf6f201d340caf80..d45806e308694a2da783ce5d9cafa021e984c3df 100644
--- a/js/index.js
+++ b/js/index.js
@@ -1,19 +1,22 @@
-/* exported dfs bfs dijkstras */
-/* globals BasicStack BasicQueue BasicPriorityQueue firstExample secondExample */
+import './utility.js';
+import {BasicStack} from './stack.js';
+import {BasicQueue} from './queue.js';
+import {BasicPriorityQueue} from './priority_queue.js';
+import {firstExample, secondExample} from './inputs.js';
 
 function print(value) {
   $('#output').append($('<span></span>').text(value)).append('<br>');
 }
 
-function dfs(graph, source, destination) {
+export function dfs(graph, source, destination) {
   return []; // stub
 }
 
-function bfs(graph, source, destination) {
+export function bfs(graph, source, destination) {
   return []; // stub
 }
 
-function dijkstras(graph, source, destination) {
+export function dijkstras(graph, source, destination) {
   return []; // stub
 }
 
diff --git a/js/inputs.js b/js/inputs.js
index e72a20b1f46d605743660cad504cfc2c61fe6363..bafae9e2b0961002e70eac716843555a0121a192 100644
--- a/js/inputs.js
+++ b/js/inputs.js
@@ -1,8 +1,8 @@
-/* exported firstExample secondExample */
-/* globals DirectedGraph PuzzleGraph */
+import {DirectedGraph, PuzzleGraph} from './graphs.js';
+
 /* eslint-disable no-magic-numbers */
 
-const firstExample = new DirectedGraph();
+export const firstExample = new DirectedGraph();
 firstExample.addIncidence('b', 9, 'e');
 firstExample.addIncidence('f', 8, 'c');
 firstExample.addIncidence('a', 7, 'c');
@@ -14,4 +14,4 @@ firstExample.addIncidence('e', 2, 'f');
 firstExample.addIncidence('c', 1, 'b');
 firstExample.addIncidence('f', 0, 'd');
 
-const secondExample = new PuzzleGraph();
+export const secondExample = new PuzzleGraph();
diff --git a/js/priority_queue.js b/js/priority_queue.js
index 4122e5d2dada4719f3465143120b5819edbb935b..c13c0e8caff45e28c1d75d67d9a9198fda983f91 100644
--- a/js/priority_queue.js
+++ b/js/priority_queue.js
@@ -1,6 +1,6 @@
-/* exported BasicPriorityQueue */
+import './utility.js';
 
-class BasicPriorityQueue {
+export class BasicPriorityQueue {
   constructor() {
     this.elements = [];
   }
diff --git a/js/queue.js b/js/queue.js
index 8b05cced74a2ef671d0e871915b968a5be0c8ecc..9f45117ef2c499c64e728e90e0aea577d12718ba 100644
--- a/js/queue.js
+++ b/js/queue.js
@@ -1,6 +1,4 @@
-/* exported BasicQueue */
-
-class BasicQueue {
+export class BasicQueue {
   constructor() {
     this.elements = [];
     this.head = 0;
diff --git a/js/stack.js b/js/stack.js
index e5612f27318a331677fec2d8adddc764f20af2bb..f87a910e1b2e60ec9c4b9105bc0d3d3e52223135 100644
--- a/js/stack.js
+++ b/js/stack.js
@@ -1,6 +1,4 @@
-/* exported BasicStack */
-
-class BasicStack {
+export class BasicStack {
   constructor() {
     this.elements = [];
   }