diff --git a/src/gui-course.c b/src/gui-course.c
index 2613fc5e313ad03d3b8cb5ad014a1257e280b1ff..16169a696f432febb8625666f0fa5f02bba90db0 100644
--- a/src/gui-course.c
+++ b/src/gui-course.c
@@ -84,6 +84,15 @@ update_course_content (GtkWidget *self_widget, gpointer unused)
   }
 }
 
+void
+download_course_content (GtkWidget *self_widget, gpointer bool_download_selected_elements)
+{
+  GuiCourse *self = HDY_GUI_COURSE (self_widget);
+  gtk_container_foreach (GTK_CONTAINER (self->box_week),
+                         &download_week_content,
+                         bool_download_selected_elements);
+}
+
 static void
 course_content_obtained_cb (gpointer ptr, gpointer data)
 {
diff --git a/src/gui-course.h b/src/gui-course.h
index b825e7a7dacc9f292d72c674186d17b2df895b7d..ab0632460b9e2ad37725fd7bfce74dc74c7dffad 100644
--- a/src/gui-course.h
+++ b/src/gui-course.h
@@ -34,5 +34,8 @@ GuiCourse* gui_course_new (struct Course course_info);
 
 void update_course_content (GtkWidget *self_widget, gpointer unused);
 
+void
+download_course_content (GtkWidget *self_widget,
+                         gpointer bool_download_selected_elements);
 
 G_END_DECLS
diff --git a/src/gui-resource.c b/src/gui-resource.c
index fb2cf7513de7792aa7f36f0533a5dbbe9d3e2a48..1917ffa0081511088ee8a9ae63f4087c7e09506d 100644
--- a/src/gui-resource.c
+++ b/src/gui-resource.c
@@ -150,6 +150,36 @@ activated_cb (GtkListBox* unused, GuiResource *self)
   gtk_list_box_row_set_activatable (GTK_LIST_BOX_ROW (self), TRUE);
 }
 
+static void
+download_folder_content (gpointer self_ptr, gpointer folder_content_ptr)
+{
+  open_folder_cb (self_ptr, folder_content_ptr); // the info would be too good to lose
+  struct FolderContent *content = folder_content_ptr;
+  // TODO
+}
+
+void
+resource_download_content (GtkWidget *self_widget, gpointer unused)
+{
+  GuiResource *self = HDY_GUI_RESOURCE (self_widget);
+  switch (self->type) {
+  case RESOURCE_FILE:
+    moodle_provider_download_file_async (self->id, NULL, self);
+    break;
+  case RESOURCE_FOLDERFILE:
+    if (self->filename && self->id)
+      moodle_provider_download_file_by_filename_async (self->id, self->filename, NULL, self);
+    else
+      g_warning ("That's odd: missing filename and/or id :-/\n");
+    break;
+  case RESOURCE_FOLDER:
+    moodle_provider_get_folder_content_async (download_folder_content, self->id, self);
+    break;
+  default:
+    break;
+  }
+}
+
 static void
 gui_resource_set_property (GObject      *object,
                            guint         property_id,
diff --git a/src/gui-resource.h b/src/gui-resource.h
index b20937d21b62aba78946712e9e6bb9d2f6461e7a..3827f62b115e3da59b0ac3a9e4517adf2337cf7f 100644
--- a/src/gui-resource.h
+++ b/src/gui-resource.h
@@ -34,4 +34,6 @@ GuiResource *gui_resource_new (struct Resource file_info);
 
 void activated_cb (GtkListBox* unused, GuiResource *self);
 
+void resource_download_content (GtkWidget *self_widget, gpointer unused);
+
 G_END_DECLS
diff --git a/src/gui-week.c b/src/gui-week.c
index 1eda77224e91c0a7bb2f4dd3561d0a638f4014cf..7117293b3b1562b2e19528de69ad1103a18974d4 100644
--- a/src/gui-week.c
+++ b/src/gui-week.c
@@ -63,6 +63,22 @@ update_files (GuiWeek* self)
   }
 }
 
+void
+download_week_content (GtkWidget *self_widget, gpointer bool_download_selected_elements)
+{
+  GuiWeek *self = HDY_GUI_WEEK (self_widget);
+  if (GPOINTER_TO_INT (bool_download_selected_elements)) {
+    GList *resources = gtk_list_box_get_selected_rows (self->week_content);
+    g_list_foreach (resources,
+                    (GFunc)&resource_download_content,
+                    NULL);
+  } else {
+    gtk_container_foreach (GTK_CONTAINER (self->week_content),
+                           &resource_download_content,
+                           NULL);
+  }
+}
+
 static void
 gui_week_set_property (GObject      *object,
                        guint         property_id,
diff --git a/src/gui-week.h b/src/gui-week.h
index 90359725bb64345bf7d623d5a4a9238bbe11efb0..a0a76b4e1235e744b5b5b3fa8bd71753f132d022 100644
--- a/src/gui-week.h
+++ b/src/gui-week.h
@@ -31,4 +31,8 @@ G_DECLARE_FINAL_TYPE (GuiWeek, gui_week, HDY, GUI_WEEK, GtkBox)
 
 GuiWeek* gui_week_new (struct Week week_info);
 
+void
+download_week_content (GtkWidget *self_widget,
+                       gpointer bool_download_selected_elements);
+
 G_END_DECLS
diff --git a/src/gui-window.c b/src/gui-window.c
index fd109e56b4ba269a1d215830ede861367c07156e..b3fe2e294e719f94375e61f62fc4c9c48f104bc2 100644
--- a/src/gui-window.c
+++ b/src/gui-window.c
@@ -84,6 +84,17 @@ activate_ask_pass (GSimpleAction *simple,
   gtk_widget_show (GTK_WIDGET (self->dialog));
 }
 
+static void
+activate_download_current_course (GSimpleAction *simple,
+                                  GVariant      *parameter,
+                                  gpointer       ptr)
+{
+  // get current course
+  GuiWindow *self = ptr;
+  download_course_content (gtk_stack_get_visible_child (self->stack),
+                           GINT_TO_POINTER (FALSE));
+}
+
 /*
 static void
 activate_print_string (GSimpleAction *simple,
@@ -356,7 +367,8 @@ gui_window_init (GuiWindow *self)
                             G_CALLBACK (pass_changed_cb), self);
 
   const GActionEntry entries[] = {
-    { "ask-pass",     activate_ask_pass          },
+    { "ask-pass",                activate_ask_pass                },
+    { "download-current-course", activate_download_current_course },
     //{ "print-string", activate_print_string, "s" }
   };
   g_action_map_add_action_entries (G_ACTION_MAP (self),
diff --git a/ui/gui-window.ui b/ui/gui-window.ui
index b7b270b2375299b130a50c66a78b21da21f391bd..edf133c258fb6842932049717d1e85a1851892db 100644
--- a/ui/gui-window.ui
+++ b/ui/gui-window.ui
@@ -44,6 +44,29 @@
       </object>
     </child>
   </object>
+
+  <object class="GtkPopoverMenu" id="secondary_menu_popover">
+    <child>
+      <object class="GtkBox">
+        <property name="visible">True</property>
+        <property name="margin">10</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkModelButton" id="download">
+            <property name="text" translatable="yes">Download course files</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <property name="action-name">win.download-current-course</property>
+          </object>
+          <packing>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+
   <template class="GuiWindow" parent="GtkApplicationWindow">
     <property name="can_focus">False</property>
     <property name="title">Moody</property>
@@ -135,7 +158,7 @@
                     <property name="visible">False</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
-                    <!--<property name="popover">secondary_menu_popover</property>-->
+                    <property name="popover">secondary_menu_popover</property>
                     <child>
                       <object class="GtkImage" id="open_secondary_menu">
                         <property name="visible">True</property>