diff --git a/4-GPU/HandsOn/.master/CMakeLists.txt b/4-GPU/HandsOn/.master/CMakeLists.txt
index 9d0cfd4d234a2d8ee90bea8aa8d40013b111094f..50d0946e5c418589c0ba3325d2104271465ddf7e 100644
--- a/4-GPU/HandsOn/.master/CMakeLists.txt
+++ b/4-GPU/HandsOn/.master/CMakeLists.txt
@@ -13,20 +13,51 @@ add_custom_command(OUTPUT HandsOnGPUProgramming.ipynb
         COMMAND jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace HandsOnGPUProgramming.ipynb
         DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/HandsOnGPUProgramming_master.ipynb) 
 
+add_custom_command(OUTPUT HandsOnGPUProgramming.html
+        COMMAND jupyter nbconvert --to html --output HandsOnGPUProgramming.html HandsOnGPUProgramming.ipynb
+        DEPENDS HandsOnGPUProgramming.ipynb 
+        )
+
+add_custom_command(OUTPUT HandsOnGPUProgramming.pdf
+        COMMAND jupyter nbconvert --to pdf --output HandsOnGPUProgramming.pdf HandsOnGPUProgramming.ipynb
+        DEPENDS HandsOnGPUProgramming.ipynb 
+        )
+
 add_custom_command(OUTPUT HandsOnGPUProgramming_Solution.ipynb 
         COMMAND notebook-splitter --remove "task" ${CMAKE_CURRENT_SOURCE_DIR}/HandsOnGPUProgramming_master.ipynb --output HandsOnGPUProgramming_Solution.ipynb 
         DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/HandsOnGPUProgramming_master.ipynb) 
 
+add_custom_command(OUTPUT HandsOnGPUProgramming_Solution.html
+        COMMAND jupyter nbconvert --to html --output HandsOnGPUProgramming_Solution.html HandsOnGPUProgramming_Solution.ipynb
+        DEPENDS HandsOnGPUProgramming_Solution.ipynb 
+        )
+
+add_custom_command(OUTPUT HandsOnGPUProgramming_Solution.pdf
+        COMMAND jupyter nbconvert --to pdf --output HandsOnGPUProgramming_Solution.pdf HandsOnGPUProgramming_Solution.ipynb
+        DEPENDS HandsOnGPUProgramming_Solution.ipynb 
+        )
+
 add_custom_target(notebook_task DEPENDS HandsOnGPUProgramming.ipynb)
+add_custom_target(notebook_task_html DEPENDS HandsOnGPUProgramming.html)
+add_custom_target(notebook_task_pdf DEPENDS HandsOnGPUProgramming.pdf)
 add_custom_target(notebook_solution DEPENDS HandsOnGPUProgramming_Solution.ipynb)
-add_custom_target(notebook ALL DEPENDS notebook_solution notebook_task)
+add_custom_target(notebook_solution_html DEPENDS HandsOnGPUProgramming_Solution.html)
+add_custom_target(notebook_solution_pdf DEPENDS HandsOnGPUProgramming_Solution.pdf)
+
+add_custom_target(notebook ALL DEPENDS notebook_solution notebook_solution_html notebook_task notebook_task_html)
 
 file(RELATIVE_PATH RELPATH ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
 set(SOLUTION_DIR ${CMAKE_SOURCE_DIR}/../Solution/${RELPATH})
 set(TASK_DIR ${CMAKE_SOURCE_DIR}/../${RELPATH})
 
-set(TASK_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.ipynb)
-set(SOLUTION_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.ipynb)
+set(TASK_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.ipynb 
+               ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.html
+ #              ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming.pdf
+)
+set(SOLUTION_FILES ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.ipynb
+                   ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.html
+#                   ${CMAKE_CURRENT_BINARY_DIR}/HandsOnGPUProgramming_Solution.pdf
+ )
 
 message(VERBOSE "TASK FILES ${TASK_FILES} GO TO ${TASK_DIR}")
 message(VERBOSE "SOLUTION FILES ${SOLUTION_FILES} GO TO ${SOLUTION_DIR}")
diff --git a/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb b/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb
index 4e5bfe934c7e1432c600af13a8a34183800e76c0..51108da07feb22696deea617339beb2bc0d6f6b0 100644
--- a/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb
+++ b/4-GPU/HandsOn/.master/HandsOnGPUProgramming_master.ipynb
@@ -192,6 +192,8 @@
     "\n",
     "* [Task 5](#task5) Put NVSHMEM calls on stream to hide API calls and GPU/CPU synchronization  \n",
     "\n",
+    "* [Task 6](#task6) Use NVSHMEM to fine-grained also update the halo region of your neighbors  \n",
+    "\n",
     "\n",
     "### Survey\n",
     " \n",
@@ -1632,7 +1634,11 @@
     "---\n",
     "# Tasks using NVSHMEM \n",
     "\n",
-    "**The following tasks are using NVSHMEM instead of MPI. NVSHMEM is currently available as early access software. Please read the following carefully before starting these tasks.**\n",
+    "\n",
+    "**The following tasks are using NVSHMEM instead of MPI**. \n",
+    "**NVSHMEM is currently available as early access software.** \n",
+    "**Please read the following carefully before starting these tasks.**\n",
+    "\n",
     "\n",
     "* *NVSHMEM early access 0.3.2* is installed on Ascent. It is provided under the license in [LICENSE_NVSHMEM.md](./LICENSE_NVSHMEM.md).\n",
     "* If you want to continue using the NVHSMEM early access version beyond this tutorial you need to apply for early access at https://developer.nvidia.com/nvshmem\n",
@@ -2402,7 +2408,7 @@
     "exercise": "task"
    },
    "source": [
-    "## Task 6: <a name=\"task5\"></a>Use direct load/store to remote memory\n",
+    "## Task 6: <a name=\"task6\"></a>Use direct load/store to remote memory\n",
     "\n",
     "NVSHMEM allows you to put communications in the GPU kernels. However, the `nvhsmem_put / nvshmem_get` calls are not easily available in OpenACC kernels. However, for *intranode* communication when all GPUs can use P2P (as in the nodes in Ascent and Summit) you can get a pointer to a remote GPUs memory using `nvshmem_ptr`.\n",
     "\n",