diff --git a/cmsc388a/code_examples/data_requests/fetch.html b/cmsc388a/code_examples/data_requests/fetch.html
new file mode 100644
index 0000000000000000000000000000000000000000..f5b41a9d9daf589b6711048a8992f4924418bfdd
--- /dev/null
+++ b/cmsc388a/code_examples/data_requests/fetch.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+ 
+<head>
+  <meta charset="utf-8">
+  <title>Fetch Example</title>
+  <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
+  <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
+  <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
+</head>
+ 
+<body>
+  <div id="container"></div>
+ 
+  <script type="text/babel">
+    const API = 'https://hn.algolia.com/api/v1/search?query=';
+    const DEFAULT_QUERY = 'react';
+
+    class App extends React.Component {
+      constructor(props) {
+        super(props);
+
+        this.state = {
+          hits: [],
+        };
+      }
+
+      componentDidMount() {
+        console.log(API+DEFAULT_QUERY);
+        fetch(API + DEFAULT_QUERY)
+          .then(response => response.json())
+          .then(data => this.setState({ hits: data.hits }));
+      }
+      render() {
+        const { hits } = this.state;
+
+        return (
+          <ul>
+            {hits.map(hit =>
+              <li key={hit.objectID}>
+                <a href={hit.url}>{hit.title}</a>
+              </li>
+            )}
+          </ul>
+        );
+      }
+    }
+
+    ReactDOM.render(
+      <App/>,
+      document.querySelector("#container")
+    );
+  </script>
+</body>
+ 
+</html>
diff --git a/cmsc388a/code_examples/life_cycle_methods/lifecycle.html b/cmsc388a/code_examples/life_cycle_methods/lifecycle.html
new file mode 100644
index 0000000000000000000000000000000000000000..ad5354911754bb794c5c73e2cf72656dcf63083e
--- /dev/null
+++ b/cmsc388a/code_examples/life_cycle_methods/lifecycle.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8" />
+<title>Lifecycle Methods</title>
+<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
+<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
+<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
+
+<style>
+    #container {
+      padding: 50px;
+      background-color: #FFF;
+    }
+  </style>
+</head>
+<body>
+  <div id="container"></div>
+  
+  <script type="text/babel">
+    var destination = document.querySelector("#container");
+
+    class Counter extends React.Component {
+      render() {
+        var textStyle = {
+          fontSize: 72,
+          fontFamily: "sans-serif",
+          color: "#333",
+          fontWeight: "bold"
+        };
+
+        console.log("render: Counter component");
+      
+        return (
+          <div style={textStyle}>
+            {this.props.display}
+          </div>
+        );
+      }
+    }
+
+    class CounterParent extends React.Component {
+      constructor(props) {
+        super(props);
+        console.log("constructor: It's default time!");
+
+        this.state = {
+          count: 0
+        };
+        this.increase = this.increase.bind(this);
+      }
+
+      increase() {
+        this.setState({
+          count: this.state.count + 1
+        });
+      }
+
+      static getDerivedStateFromProps(props, state) {
+        console.log("getDerivedStateFromProps: You probably don't need this!")
+
+        return null;
+      }
+
+      componentDidUpdate(currentProps, currentState) {
+        console.log("componentDidUpdate: Component just updated!");
+      }
+
+      getSnapshotBeforeUpdate(prevProps, prevState) {
+        console.log("getSnapshotBeforeUpdate: Component is about to commit its changes!")
+
+        return null;
+      }
+
+      componentDidMount() {
+        console.log("componentDidMount: Component is inserted into the tree!");
+      }
+
+      componentWillUnmount() {
+        console.log("componentWillUnmount: Component is about to be removed from the DOM!");
+      }
+
+      shouldComponentUpdate(newProps, newState) {
+        console.log("shouldComponentUpdate: Should component update?");
+        if (newState.count < 5) {
+          console.log("shouldComponentUpdate: Component should update!");
+          return true;
+        } else {
+          ReactDOM.unmountComponentAtNode(destination);
+          console.log("shouldComponentUpdate: Component should not update!");
+          return false;
+        }
+      }
+
+      render() {
+        var backgroundStyle = {
+          padding: 50,
+          border: "#333 2px dotted",
+          width: 250,
+          height: 100,
+          borderRadius: 10,
+          textAlign: "center"
+        };
+        console.log("render: CounterParent component");
+        return (
+          <div style={backgroundStyle}>
+            <Counter display={this.state.count} />
+            <button onClick={this.increase}>
+              +
+            </button>
+          </div>
+        );
+      }
+    };
+
+    ReactDOM.render(
+      <div>
+        <CounterParent />
+      </div>,
+      destination
+    );
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/cmsc388a/lectures/life_cycle_methods/InitialRenderLifecycleMethods.jpg b/cmsc388a/lectures/life_cycle_methods/InitialRenderLifecycleMethods.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4ccae038c6d7007f6235ae2c87967b38dc5b2f4f
Binary files /dev/null and b/cmsc388a/lectures/life_cycle_methods/InitialRenderLifecycleMethods.jpg differ
diff --git a/cmsc388a/lectures/life_cycle_methods/PropsChangeLifecycleMethods.jpg b/cmsc388a/lectures/life_cycle_methods/PropsChangeLifecycleMethods.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6c274edf867f369828226b1bb125cb44973c2d88
Binary files /dev/null and b/cmsc388a/lectures/life_cycle_methods/PropsChangeLifecycleMethods.jpg differ
diff --git a/cmsc388a/lectures/life_cycle_methods/StateChangeLifecycleMethods.jpg b/cmsc388a/lectures/life_cycle_methods/StateChangeLifecycleMethods.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..e238ac57881aec48596bdfb5a10d941c807af2b6
Binary files /dev/null and b/cmsc388a/lectures/life_cycle_methods/StateChangeLifecycleMethods.jpg differ
diff --git a/cmsc388a/lectures/life_cycle_methods/UnmountLifecycleMethods.jpg b/cmsc388a/lectures/life_cycle_methods/UnmountLifecycleMethods.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..71b8f842e81a75e8b6a20119bbf47c72a9268732
Binary files /dev/null and b/cmsc388a/lectures/life_cycle_methods/UnmountLifecycleMethods.jpg differ
diff --git a/cmsc388a/lectures/life_cycle_methods/life_cycle_methods.md b/cmsc388a/lectures/life_cycle_methods/life_cycle_methods.md
new file mode 100644
index 0000000000000000000000000000000000000000..524c8b997cad8c8dc64e70fce75bdf5f9f3e7398
--- /dev/null
+++ b/cmsc388a/lectures/life_cycle_methods/life_cycle_methods.md
@@ -0,0 +1,27 @@
+# React Lifecycle Methods
+* componentWillMount
+* componentDidMount
+* componentWillUnmount
+* componentWillUpdate
+* componentDidUpdate
+* shouldComponentUpdate
+* componentWillReceiveProps
+* componentDidCatch
+
+## There are 4 types of actions that trigger their own subset of the complete set of React component lifecycle methods.
+
+1. Initial Rendering of Component
+
+![Rendering Phase Callbacks](InitialRenderLifecycleMethods.jpg)
+
+2. Props Change
+
+![Props Change Callbacks](PropsChangeLifecycleMethods.jpg)
+
+3. State Change
+
+![State Change Callbacks](StateChangeLifecycleMethods.jpg)
+
+4. Unmount Component
+![Unmount Callback](UnmountLifecycleMethods.jpg)
+