diff --git a/app/controllers/contents/courseware.php b/app/controllers/contents/courseware.php
index d4291df6abba08be15faa8b7a0e4abf9150abd1f..2a99c0880fe39b9fb71383cdf85614e7bbb7ec34 100644
--- a/app/controllers/contents/courseware.php
+++ b/app/controllers/contents/courseware.php
@@ -171,6 +171,46 @@ class Contents_CoursewareController extends CoursewareController
         $this->sem_courses  = $this->getCoursewareCourses($sem_key);
     }
 
+    public function pdf_export_action($element_id, $with_children): void
+    {
+        $element = \Courseware\StructuralElement::findOneById($element_id);
+
+        $this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf');
+    }
+
+    /**
+     * To display the shared courseware
+     *
+     * @param string $entry_element_id the shared struct element id
+     */
+    public function shared_content_courseware_action($entry_element_id): void
+    {
+        global $user;
+
+        $navigation = new Navigation(_('Geteiltes Lernmaterial'), 'dispatch.php/contents/courseware/shared_content_courseware/' . $entry_element_id);
+        Navigation::addItem('/contents/courseware/shared_content_courseware', $navigation);
+        Navigation::activateItem('/contents/courseware/shared_content_courseware');
+
+        $this->entry_element_id = $entry_element_id;
+
+        $struct = \Courseware\StructuralElement::findOneBySQL(
+            "id = ? AND range_type = 'user'",
+            [$this->entry_element_id]
+        );
+
+        if (!$struct) {
+            throw new Trails\Exception(404, _('Der geteilte Inhalt kann nicht gefunden werden.'));
+        }
+
+        if (!$struct->canRead($user) && !$struct->canEdit($user)) {
+            throw new AccessDeniedException();
+        }
+
+        $this->user_id = $struct->owner_id;
+
+        $this->setCoursewareSidebar();
+    }
+
     /**
      * Return list of coursewares grouped by semester_id
      *
@@ -199,12 +239,17 @@ class Contents_CoursewareController extends CoursewareController
         $courses = new SimpleCollection($courses);
 
         if (!Config::get()->MY_COURSES_ENABLE_STUDYGROUPS) {
-            $courses = $courses->filter(function ($a) {
-                return !$a->isStudygroup();
+            $courses = $courses->filter(function (Course $course) {
+                return !$course->isStudygroup();
             });
         }
 
-        if ($sem_key != 'all') {
+        // Filter courses with enabled and visible courseware
+        $courses = $courses->filter(function (Course $course) {
+            return $this->isCoursewareEnabledAndVisible($course);
+        });
+
+        if ($sem_key !== 'all') {
             $semester = Semester::find($sem_key);
 
             $courses = $courses->filter(function ($a) use ($semester) {
@@ -218,13 +263,15 @@ class Contents_CoursewareController extends CoursewareController
 
             foreach ($courses as $course) {
                 $element = StructuralElement::getCoursewareCourse($course->id);
-                if (!empty($element) && $this->isCoursewareEnabled($course->id)) {
-                    $element['payload'] = json_decode($element['payload'], true);
-                    $coursewares[] = $element;
+                if (!$element || !$element->canRead(User::findCurrent())) {
+                    continue;
                 }
+
+                $element['payload'] = json_decode($element['payload'], true);
+                $coursewares[] = $element;
             }
 
-            if (empty($coursewares)) {
+            if (!$coursewares) {
                 return [];
             }
 
@@ -233,20 +280,20 @@ class Contents_CoursewareController extends CoursewareController
                 'coursewares'   => $coursewares
             ]];
         } else {
-            $all_semesters    = Semester::getAll();
-            $sem_courses      = [];
-
+            $sem_courses = [];
             foreach ($courses as $course) {
                 $element = StructuralElement::getCoursewareCourse($course->id);
-                if (!empty($element) && $this->isCoursewareEnabled($course->id)) {
-                    $element['payload'] = json_decode($element['payload'], true);
-
-                    if ($course->duration_time == -1) {
-                        $sem_courses[$this->current_semester->id]['coursewares'][] = $element;
-                    } else {
-                        $end_semester = $course->getEndSemester();
-                        $sem_courses[$end_semester->id]['coursewares'][] = $element;
-                    }
+                if (!$element || !$element->canRead(User::findCurrent())) {
+                    continue;
+                }
+
+                $element['payload'] = json_decode($element['payload'], true);
+
+                if ($course->isOpenEnded()) {
+                    $sem_courses[$this->current_semester->id]['coursewares'][] = $element;
+                } else {
+                    $end_semester = $course->getEndSemester();
+                    $sem_courses[$end_semester->id]['coursewares'][] = $element;
                 }
             }
 
@@ -255,71 +302,36 @@ class Contents_CoursewareController extends CoursewareController
     }
 
     /**
-     * Returns true if the courseware module is enabled for the passed course
+     * Returns true if the courseware module is enabled and visible for the
+     *  passed course and current user
      *
-     * @param  string  $course_id  the course to check
-     * @return boolean             true if courseware is enabled, false otherwise
+     * @param  Course  $course  the course to check
+     * @return boolean true if courseware is enabled and visible,
+     *                 false otherwise
      */
-    private function isCoursewareEnabled($course_id): bool
+    private function isCoursewareEnabledAndVisible(Course $course): bool
     {
+        // Check if courseware is globally enabled
         $studip_module = PluginManager::getInstance()->getPlugin(CoursewareModule::class);
-
-        if (!$studip_module || !$studip_module->isActivated($course_id)) {
+        if (!$studip_module) {
             return false;
         }
 
-        return true;
-    }
-
-
-    private function getProjects($purpose): array
-    {
-        $elements = StructuralElement::findProjects($this->user->id, $purpose);
-        foreach($elements as &$element) {
-            $element['payload'] = json_decode($element['payload'], true);
+        // Check if courseware is enabled in course
+        $active_tool = ToolActivation::find([
+            $course->id,
+            $studip_module->getPluginId(),
+        ]);
+        if (!$active_tool) {
+            return false;
         }
 
-        return $elements;
-    }
-
-
-    public function pdf_export_action($element_id, $with_children): void
-    {
-        $element = \Courseware\StructuralElement::findOneById($element_id);
-
-        $this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf');
-    }
-
-    /**
-     * To display the shared courseware
-     *
-     * @param string $entry_element_id the shared struct element id
-     */
-    public function shared_content_courseware_action($entry_element_id): void
-    {
-        global $user;
-
-        $navigation = new Navigation(_('Geteiltes Lernmaterial'), 'dispatch.php/contents/courseware/shared_content_courseware/' . $entry_element_id);
-        Navigation::addItem('/contents/courseware/shared_content_courseware', $navigation);
-        Navigation::activateItem('/contents/courseware/shared_content_courseware');
-
-        $this->entry_element_id = $entry_element_id;
-
-        $struct = \Courseware\StructuralElement::findOneBySQL(
-            "id = ? AND range_type = 'user'",
-            [$this->entry_element_id]
+        // Check visibility
+        return $GLOBALS['perm']->have_studip_perm(
+            $active_tool->getVisibilityPermission(),
+            $course->id,
+            User::findCurrent()->id
         );
-
-        if (!$struct) {
-            throw new Trails\Exception(404, _('Der geteilte Inhalt kann nicht gefunden werden.'));
-        }
-
-        if (!$struct->canRead($user) && !$struct->canEdit($user)) {
-            throw new AccessDeniedException();
-        }
-
-        $this->user_id = $struct->owner_id;
-
-        $this->setCoursewareSidebar();
     }
+
 }