diff --git a/CourseCopy.class.php b/CourseCopy.class.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6a69b25440ca5ab21e24b4c60d5744ca66d2e48
--- /dev/null
+++ b/CourseCopy.class.php
@@ -0,0 +1,26 @@
+<?php
+
+class CourseCopy extends StudIPPlugin implements AdminCourseAction
+{
+    public function getAdminActionURL()
+    {
+        return PluginEngine::getURL($this, array(), "copy/info");
+    }
+
+    public function useMultimode() {
+        if (version_compare($GLOBALS['SOFTWARE_VERSION'], "3.4.99", ">=")) {
+            //Damit es im Dialog ge�ffnet wird
+            return \Studip\Button::createAccept(_("Kopieren"), "edit", array('data-dialog' => 1));
+        } else {
+            return _("Kopieren");
+        }
+    }
+
+    public function getAdminCourseActionTemplate($course_id, $values = null, $semester = null) {
+        $factory = new Flexi_TemplateFactory(__DIR__."/views");
+        $template = $factory->open("action/checkbox.php");
+        $template->set_attribute("course_id", $course_id);
+        $template->set_attribute("plugin", $this);
+        return $template;
+    }
+}
\ No newline at end of file
diff --git a/controllers/copy.php b/controllers/copy.php
new file mode 100644
index 0000000000000000000000000000000000000000..a65d7a67549593ab8abdaf0ca3050bbcef293c64
--- /dev/null
+++ b/controllers/copy.php
@@ -0,0 +1,134 @@
+<?php
+
+class CopyController extends PluginController
+{
+    public function info_action()
+    {
+        $this->dozentensearch = new SQLSearch(
+            "SELECT DISTINCT auth_user_md5.user_id, CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname), auth_user_md5.perms, auth_user_md5.username " .
+            "FROM auth_user_md5 LEFT JOIN user_info ON (user_info.user_id = auth_user_md5.user_id) " .
+            "WHERE (CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname) LIKE :input " .
+                "OR CONCAT(auth_user_md5.Nachname, \" \", auth_user_md5.Vorname) LIKE :input " .
+                "OR CONCAT(auth_user_md5.Nachname, \", \", auth_user_md5.Vorname) LIKE :input " .
+                "OR auth_user_md5.username LIKE :input) " .
+                "AND " . get_vis_query() . " " .
+                "AND auth_user_md5.perms = 'dozent' " .
+            "ORDER BY Vorname, Nachname", _("Dozentennamen eingeben"), "user_id");
+    }
+
+    public function process_action()
+    {
+        if (Request::isPost()) {
+            $dozent = null;
+            if (Request::option("dozent_id")) {
+                $dozent = User::find(Request::option("dozent_id"));
+                if (!$dozent['perms'] === "dozent") {
+                    $dozent = null;
+                }
+            }
+            $semester = Semester::find(Request::option("semester_id"));
+            if ($semester) {
+                foreach (Request::getArray("c") as $course_id) {
+                    $oldcourse = Course::find($course_id);
+
+                    if ($oldcourse) {
+                        $newcourse = new Course();
+                        $newcourse->setData($oldcourse->toArray());
+                        $newcourse['chdate'] = time();
+                        $newcourse['mkdate'] = time();
+                        $newcourse->setId($newcourse->getNewId());
+                        $newcourse['start_time'] = $semester['beginn'];
+                        $newcourse->store();
+
+                        //Dozenten
+                        if ($dozent) {
+                            $coursemember = new CourseMember();
+                            $coursemember['user_id'] = $dozent->getId();
+                            $coursemember['seminar_id'] = $newcourse->getId();
+                            $coursemember['status'] = "dozent";
+                            $coursemember->store();
+                        } else {
+                            foreach ($oldcourse->members->filter(function ($member) {
+                                return $member['status'] === "dozent";
+                            }) as $dozentmember) {
+                                $coursemember = new CourseMember();
+                                $coursemember->setData($dozentmember->toArray());
+                                $coursemember['seminar_id'] = $newcourse->getId();
+                                $coursemember['mkdate'] = time();
+                                $coursemember->store();
+                            }
+                        }
+
+                        //Studienbereiche
+                        $statement = DBManager::get()->prepare("
+                            INSERT IGNORE INTO seminar_sem_tree
+                            SET seminar_id = :course_id,
+                                sem_tree_id = :sem_tree_id
+                        ");
+                        foreach ($oldcourse->study_areas as $studyarea) {
+                            $statement->execute(array(
+                                'course_id' => $newcourse->getId(),
+                                'sem_tree_id' => $studyarea->getId()
+                            ));
+                        }
+
+                        //Beteiligte Einrichtungen
+                        $statement = DBManager::get()->prepare("
+                            INSERT IGNORE INTO seminar_inst
+                            SET seminar_id = :course_id,
+                                institut_id = :institut_id
+                        ");
+                        foreach ($oldcourse->institutes as $institute) {
+                            $statement->execute(array(
+                                'course_id' => $newcourse->getId(),
+                                'institut_id' => $institute->getId()
+                            ));
+                        }
+
+                        //Datenfelder
+                        foreach ($oldcourse->datafields as $datafieldentry) {
+                            $newentry = new DatafieldEntryModel();
+                            $newentry->setData($datafieldentry->toArray());
+                            $newentry['range_id'] = $newcourse->getId();
+                            $newentry['mkdate'] = time();
+                            $newentry['chdate'] = time();
+                            $newentry->store();
+                        }
+
+                        //Dateiordner
+                        $insert_folder = DBManager::get()->prepare("
+                            INSERT IGNORE INTO folder
+                            SET folder_id = MD5(CONCAT(:seminar_id, 'allgemeine_dateien')),
+                                range_id = :seminar_id,
+                                user_id = :user_id,
+                                name = :name,
+                                description = :description,
+                                mkdate = UNIX_TIMESTAMP(),
+                                chdate = UNIX_TIMESTAMP()
+                        ");
+                        $insert_folder->execute(array(
+                            'seminar_id' => $newcourse->getId(),
+                            'user_id' => $GLOBALS['user']->id,
+                            'name' => _("Allgemeiner Dateiordner"),
+                            'description' => _("Ablage f�r allgemeine Ordner und Dokumente der Veranstaltung")
+                        ));
+
+                        if (Request::get("cycles")) {
+                            foreach ($oldcourse->cycles as $cycledate) {
+                                $newcycle = new SeminarCycleDate();
+                                $newcycle->setData($cycledate->toArray());
+                                $newcycle->setId($newcycle->getNewId());
+                                $newcycle['seminar_id'] = $newcourse->getId();
+                                $newcycle['mkdate'] = time();
+                                $newcycle['chdate'] = time();
+                                $newcycle->store();
+                            }
+                        }
+                    }
+                }
+                PageLayout::postSuccess(_("Die Veranstaltungen wurden erfolgreich kopiert."));
+            }
+        }
+        $this->redirect(URLHelper::getURL("dispatch.php/admin/courses/index"));
+    }
+}
\ No newline at end of file
diff --git a/plugin.manifest b/plugin.manifest
new file mode 100644
index 0000000000000000000000000000000000000000..ea82e8a8cbcf75cc08dbee61c0dbe69fb2268531
--- /dev/null
+++ b/plugin.manifest
@@ -0,0 +1,6 @@
+pluginname=CourseCopy
+pluginclassname=CourseCopy
+version=1.0
+origin=data-quest
+studipMinVersion=3.4
+studipMaxVersion=3.6
\ No newline at end of file
diff --git a/views/action/checkbox.php b/views/action/checkbox.php
new file mode 100644
index 0000000000000000000000000000000000000000..b04014dc3f88ff59629a2a13be5f2354837927b4
--- /dev/null
+++ b/views/action/checkbox.php
@@ -0,0 +1 @@
+<input type="checkbox" name="c[]" value="<?= htmlReady($course_id) ?>">
\ No newline at end of file
diff --git a/views/copy/info.php b/views/copy/info.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc33d9b49250f29aff269ef504a240cd6d38e805
--- /dev/null
+++ b/views/copy/info.php
@@ -0,0 +1,35 @@
+<form class="default" action="<?= PluginEngine::getLink($plugin, array(), "copy/process") ?>" method="post">
+
+    <? foreach (Request::getArray("c") as $course_id) : ?>
+        <input type="hidden" name="c[]" value="<?= htmlReady($course_id) ?>">
+    <? endforeach ?>
+
+    <fieldset>
+        <legend>
+            <?= _("Kopieroptionen") ?>
+        </legend>
+
+        <label>
+            <?= _("In Semester") ?>
+            <select name="semester_id" required>
+                <option value=""></option>
+                <? foreach (array_reverse(Semester::getAll()) as $semester) : ?>
+                    <option value="<?= htmlReady($semester->getId()) ?>"><?= htmlReady($semester['name']) ?></option>
+                <? endforeach ?>
+            </select>
+        </label>
+
+        <label>
+            <?= _("Dozenten ersetzen durch ...") ?>
+            <?= QuickSearch::get("dozent_id", $dozentensearch)->render() ?>
+        </label>
+
+        <label>
+            <input type="checkbox" name="cycles" value="1" checked>
+            <?= _("Regelm��ige Termine mit kopieren") ?>
+        </label>
+    </fieldset>
+    <div data-dialog-button>
+        <?= \Studip\Button::create(_("Kopieren"), "copy", array('onclick' => "return window.confirm('"._("Wirklich kopieren?")."');")) ?>
+    </div>
+</form>
\ No newline at end of file