diff --git a/src/API/CourseProviderInterface.php b/src/API/CourseProviderInterface.php
index 00c985643fd3e7f42f52703365d939d99cbd2448..bb27f20620dac41af76ba08530a50f19dca67c5a 100644
--- a/src/API/CourseProviderInterface.php
+++ b/src/API/CourseProviderInterface.php
@@ -21,6 +21,11 @@ interface CourseProviderInterface
      */
     public function getCoursesByOrganization(string $orgUnitId, array $options = []): array;
 
+    /**
+     * @return Course[]
+     */
+    public function getCoursesByPerson(string $personId, array $options = []): array;
+
     /**
      * @return CourseAttendee[]
      */
diff --git a/src/Controller/GetAttendeesByCourse.php b/src/Controller/GetAttendeesByCourse.php
index 66a382e99bd0cc414930e7fdc4f055476adcf6ef..31f5a4a5f74be54eb3f5a29ea9499a5279a40979 100644
--- a/src/Controller/GetAttendeesByCourse.php
+++ b/src/Controller/GetAttendeesByCourse.php
@@ -9,7 +9,7 @@ use Dbp\Relay\CourseBundle\API\CourseProviderInterface;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 use Symfony\Component\HttpFoundation\Request;
 
-class GetStudentsByCourse extends AbstractController
+class GetAttendeesByCourse extends AbstractController
 {
     public const ITEMS_PER_PAGE = 250;
 
@@ -28,9 +28,8 @@ class GetStudentsByCourse extends AbstractController
         $perPage = (int) $request->query->get('perPage', self::ITEMS_PER_PAGE);
 
         $options = [];
-        if ($request->query->has('lang')) {
-            $options['lang'] = (string) $request->query->get('lang');
-        }
+        $lang = $request->query->get('lang', 'de');
+        $options['lang'] = $lang;
 
         $courses = $this->coursesProvider->getAttendeesByCourse($identifier, $options);
 
diff --git a/src/Controller/GetCoursesByOrganization.php b/src/Controller/GetCoursesByOrganization.php
index ef9e2ab9a80a4a1772207abf4e69da59d11462c7..c093f4944d091770a498e6c60f4582bebf5c0ab5 100644
--- a/src/Controller/GetCoursesByOrganization.php
+++ b/src/Controller/GetCoursesByOrganization.php
@@ -21,15 +21,23 @@ class GetCoursesByOrganization extends AbstractController
         $this->coursesProvider = $coursesProvider;
     }
 
-    public function __invoke(string $id, Request $request): PaginatorInterface
+    public function __invoke(string $identifier, Request $request): PaginatorInterface
     {
         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
 
         $page = (int) $request->query->get('page', 1);
         $perPage = (int) $request->query->get('perPage', self::ITEMS_PER_PAGE);
-        $options = ['lang' => $request->query->get('lang', 'de')];
 
-        $courses = $this->coursesProvider->getCoursesByOrganization($id, $options);
+        $options = [];
+        $lang = $request->query->get('lang', 'de');
+        $options['lang'] = $lang;
+
+        $term = $request->query->get('term');
+        if ($term !== null) {
+            $options['term'] = $term;
+        }
+
+        $courses = $this->coursesProvider->getCoursesByOrganization($identifier, $options);
 
         return new ArrayFullPaginator($courses, $page, $perPage);
     }
diff --git a/src/Controller/GetCoursesByPerson.php b/src/Controller/GetCoursesByPerson.php
new file mode 100644
index 0000000000000000000000000000000000000000..6fa8ca70ef7b98312ca5cb1622bfb3993dee15b1
--- /dev/null
+++ b/src/Controller/GetCoursesByPerson.php
@@ -0,0 +1,44 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Dbp\Relay\CourseBundle\Controller;
+
+use ApiPlatform\Core\DataProvider\PaginatorInterface;
+use Dbp\Relay\CoreBundle\Helpers\ArrayFullPaginator;
+use Dbp\Relay\CourseBundle\API\CourseProviderInterface;
+use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
+use Symfony\Component\HttpFoundation\Request;
+
+class GetCoursesByPerson extends AbstractController
+{
+    public const ITEMS_PER_PAGE = 250;
+
+    protected $coursesProvider;
+
+    public function __construct(CourseProviderInterface $coursesProvider)
+    {
+        $this->coursesProvider = $coursesProvider;
+    }
+
+    public function __invoke(string $identifier, Request $request): PaginatorInterface
+    {
+        $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
+
+        $page = (int) $request->query->get('page', 1);
+        $perPage = (int) $request->query->get('perPage', self::ITEMS_PER_PAGE);
+
+        $options = [];
+        $lang = $request->query->get('lang', 'de');
+        $options['lang'] = $lang;
+
+        $term = $request->query->get('term');
+        if ($term !== null) {
+            $options['term'] = $term;
+        }
+
+        $courses = $this->coursesProvider->getCoursesByPerson($identifier, $options);
+
+        return new ArrayFullPaginator($courses, $page, $perPage);
+    }
+}
diff --git a/src/DataProvider/CourseCollectionDataProvider.php b/src/DataProvider/CourseCollectionDataProvider.php
index d4a01d0b6d8f97f954ea6aab8d53c347e499551b..9d386f8664d441f84b2cbadd8d0cef0d1d312fc4 100644
--- a/src/DataProvider/CourseCollectionDataProvider.php
+++ b/src/DataProvider/CourseCollectionDataProvider.php
@@ -32,6 +32,11 @@ final class CourseCollectionDataProvider extends AbstractController implements C
         $filters = $context['filters'] ?? [];
         $options = ['lang' => $filters['lang'] ?? 'de'];
 
+        $term = $filters['term'] ?? null;
+        if ($term !== null) {
+            $options['term'] = $term;
+        }
+
         $page = 1;
         if (isset($filters['page'])) {
             $page = (int) $filters['page'];
diff --git a/src/Entity/Course.php b/src/Entity/Course.php
index 3daaa07071420b376ec28335b01f0a0ccfd70b2c..ca4b8020b7db8d6b78220933db096f2e20cf2cb2 100644
--- a/src/Entity/Course.php
+++ b/src/Entity/Course.php
@@ -6,6 +6,7 @@ namespace Dbp\Relay\CourseBundle\Entity;
 
 use ApiPlatform\Core\Annotation\ApiResource;
 use Dbp\Relay\CourseBundle\Controller\GetCoursesByOrganization;
+use Dbp\Relay\CourseBundle\Controller\GetCoursesByPerson;
 use Symfony\Component\Serializer\Annotation\Groups;
 
 /**
@@ -15,13 +16,14 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *             "openapi_context" = {
  *                 "tags" = {"Courses"},
  *                 "parameters" = {
- *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"}
+ *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
+ *                     {"name" = "term", "in" = "query", "description" = "Teaching term", "type" = "string", "enum" = {"W", "S"}, "example" = "W"},
  *                 }
  *             }
  *         },
- *         "get_byorganization" = {
+ *         "get_by_organization" = {
  *             "method" = "GET",
- *             "path" = "/base/organizations/{id}/courses",
+ *             "path" = "/base/organizations/{identifier}/courses",
  *             "controller" = GetCoursesByOrganization::class,
  *             "read" = false,
  *             "openapi_context" = {
@@ -29,7 +31,23 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *                 "summary" = "Get the Courses related to an organization.",
  *                 "parameters" = {
  *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
- *                     {"name" = "id", "in" = "path", "description" = "Id of Organization", "required" = true, "type" = "string", "example" = "123456"}
+ *                     {"name" = "identifier", "in" = "path", "description" = "Id of Organization", "required" = true, "type" = "string", "example" = "123456"},
+ *                     {"name" = "term", "in" = "query", "description" = "Teaching term", "type" = "string", "enum" = {"W", "S"}, "example" = "W"},
+ *                 }
+ *             },
+ *         },
+ *         "get_by_person" = {
+ *             "method" = "GET",
+ *             "path" = "/base/people/{identifier}/courses",
+ *             "controller" = GetCoursesByPerson::class,
+ *             "read" = false,
+ *             "openapi_context" = {
+ *                 "tags" = {"Courses"},
+ *                 "summary" = "Get the Courses related to a person.",
+ *                 "parameters" = {
+ *                     {"name" = "lang", "in" = "query", "description" = "Language of result", "type" = "string", "enum" = {"de", "en"}, "example" = "de"},
+ *                     {"name" = "identifier", "in" = "path", "description" = "Id of person", "required" = true, "type" = "string", "example" = "woody007"},
+ *                     {"name" = "term", "in" = "query", "description" = "Teaching term", "type" = "string", "enum" = {"W", "S"}, "example" = "W"},
  *                 }
  *             },
  *         },
diff --git a/src/Entity/CourseAttendee.php b/src/Entity/CourseAttendee.php
index ab234184424c661e5170625e74842cc695d2df9f..f995bfeda301a69fe3c5d37a19447b8aa4e67d00 100644
--- a/src/Entity/CourseAttendee.php
+++ b/src/Entity/CourseAttendee.php
@@ -5,15 +5,16 @@ declare(strict_types=1);
 namespace Dbp\Relay\CourseBundle\Entity;
 
 use ApiPlatform\Core\Annotation\ApiResource;
-use Dbp\Relay\BasePersonBundle\Controller\GetAtteendeesByCourse;
 use Dbp\Relay\BasePersonBundle\Entity\PersonInterface;
 use Dbp\Relay\BasePersonBundle\Entity\PersonTrait;
+use Dbp\Relay\CourseBundle\Controller\GetAttendeesByCourse;
 use Symfony\Component\Serializer\Annotation\Groups;
 
 /**
  * @ApiResource(
  *     collectionOperations={
  *         "get" = {
+ *             "path" = "/course_attendees",
  *             "openapi_context" = {
  *                 "tags" = {"Courses"}
  *             }
@@ -21,7 +22,7 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *         "get_bycourse" = {
  *             "method" = "GET",
  *             "path" = "/courses/{identifier}/attendees",
- *             "controller" = GetAtteendeesByCourse::class,
+ *             "controller" = GetAttendeesByCourse::class,
  *             "read" = false,
  *             "normalization_context" = {
  *                 "jsonld_embed_context" = true,
@@ -39,14 +40,15 @@ use Symfony\Component\Serializer\Annotation\Groups;
  *     },
  *     itemOperations={
  *         "get" = {
+ *             "path" = "/course_attendees/{identifier}",
  *             "openapi_context" = {
  *                 "tags" = {"Courses"}
  *             }
  *         }
  *     },
  *     iri="http://schema.org/Person",
- *     shortName="BasePerson",
- *     description="A person of the LDAP system",
+ *     shortName="CourseAttendee",
+ *     description="A person attending a course",
  *     normalizationContext={
  *         "groups" = {"BasePerson:output"},
  *         "jsonld_embed_context" = true,
diff --git a/src/Service/DummyCourseProvider.php b/src/Service/DummyCourseProvider.php
index c35056cbd03fb2eb9bb79119d716ad34238e3360..3004bddb402706af37869240423d77ed4ec66855 100644
--- a/src/Service/DummyCourseProvider.php
+++ b/src/Service/DummyCourseProvider.php
@@ -43,4 +43,9 @@ class DummyCourseProvider implements CourseProviderInterface
 
         return [$attendee];
     }
+
+    public function getCoursesByPerson(string $personId, array $options = []): array
+    {
+        return $this->getCourses($options);
+    }
 }