diff --git a/examples/introduction.ipynb b/examples/introduction.ipynb
index 9a7bb12ae8e36cd2b5890af3f5c9e2d5cf89b034..08a7ac02b5f688af0fa7e1d63ca6aa98331df5cd 100644
--- a/examples/introduction.ipynb
+++ b/examples/introduction.ipynb
@@ -9,92 +9,113 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
-    "import dicom_upload"
+    "import dicom_upload\n",
+    "from ipywidgets import Output"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Upload to the examples subdirectory.\n",
+    "upload_url = 'http://localhost:8888/api/contents/examples/'\n",
+    "token = 'c13dac305e39982bb3236b508fda269b2b79daeaafd07d80'\n",
+    "\n",
+    "uploader = dicom_upload.Uploader(upload_url=upload_url,\n",
+    "                          token=token,\n",
+    "                          button_style='primary', \n",
+    "                          layout={'border': 'solid blue 1px'})"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "out = Output()\n",
+    "@out.capture()\n",
+    "def observe_hash(change):\n",
+    "    print(\"Hash of files: {}\".format(change['owner'].hash))\n",
+    "\n",
+    "@out.capture()\n",
+    "def observe_responses(change):\n",
+    "    print(\"Upload progress: {}\".format(change['owner'].responses))\n",
+    "    \n",
+    "@out.capture()\n",
+    "def observe_finish(change):\n",
+    "    print(\"Finished upload: {}\".format(change['owner'].finished))\n",
+    "\n",
+    "uploader.observe(observe_hash, 'hash')\n",
+    "uploader.observe(observe_responses, 'responses')\n",
+    "uploader.observe(observe_finish, 'finished')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
      "data": {
       "application/vnd.jupyter.widget-view+json": {
-       "model_id": "6be94a2d5283483c9683ebafff621ec1",
+       "model_id": "be486335a3fb40d8a1c3af9326da53bd",
        "version_major": 2,
        "version_minor": 0
       },
       "text/plain": [
-       "Uploader(value=None, button_style='primary', description='Upload', layout=Layout(width='200px'), token='cf7d6b…"
+       "Uploader(value=None, button_style='primary', description='Upload', layout=Layout(border='solid blue 1px'), tok…"
       ]
      },
      "metadata": {},
      "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "w = dicom_upload.Uploader(button_style='primary', layout={'width': '200px'}, \n",
-    "                          token='cf7d6b9dbb046d0983585f930a4d1ffadf4f18d8a9a921c3')\n",
-    "w.upload_url = 'http://localhost:8888/api/contents/examples/'\n",
-    "w"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {},
-   "outputs": [
+    },
     {
      "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "20eb44ff6efb40228d316f854b21445c",
+       "version_major": 2,
+       "version_minor": 0
+      },
       "text/plain": [
-       "'51195e955bfc80c23dc7f96907225c90'"
+       "Output()"
       ]
      },
-     "execution_count": 10,
      "metadata": {},
-     "output_type": "execute_result"
+     "output_type": "display_data"
     }
    ],
    "source": [
-    "w.hash"
+    "display(uploader)\n",
+    "display(out)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
-    "w.upload()"
+    "# Select some files to upload, then run\n",
+    "uploader.upload()"
    ]
   },
   {
-   "cell_type": "code",
-   "execution_count": 4,
+   "cell_type": "markdown",
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "['ok']"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
    "source": [
-    "w.responses"
+    "### Check header was anonymized"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -121,7 +142,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.6.6"
+   "version": "3.6.9"
   }
  },
  "nbformat": 4,