diff --git a/TandemPlugin.class.php b/TandemPlugin.class.php
index 2cd714f2267d45be8f6746f7449fc8b12a03e453..624b68262a40a2bcfd690ba52c43285068472563 100644
--- a/TandemPlugin.class.php
+++ b/TandemPlugin.class.php
@@ -158,6 +158,12 @@ class TandemPlugin extends StudIPPlugin implements SystemPlugin, PortalPlugin
             );
             $navigation->addSubNavigation('config', $sub_navigation);
 
+            $sub_navigation = new Navigation(
+                dgettext('TandemPlugin', 'Sprachen'),
+                PluginEngine::getURL('tandemplugin/admin/languages')
+            );
+            $navigation->addSubNavigation('languages', $sub_navigation);
+
             if ($top_navigation) {
                 $top_navigation->addSubNavigation(
                     $navigation_name,
diff --git a/controllers/admin.php b/controllers/admin.php
index 4e2872a9a6ebc887973f6a526daf11906b19ba19..42e994af92e6e8b9d912fc4929fa940defb3d3c1 100644
--- a/controllers/admin.php
+++ b/controllers/admin.php
@@ -583,4 +583,168 @@ class AdminController extends PluginController
                 ?: '';
         }
     }
+
+
+    public function languages_action()
+    {
+        if(Navigation::hasItem($this->admin_nav_path . '/languages')) {
+            Navigation::activateItem($this->admin_nav_path . '/languages');
+        }
+
+        if(Navigation::hasItem('/profile/tandem_administration/languages')) {
+            Navigation::activateItem('/profile/tandem_administration/languages');
+        }
+
+        $sidebar = Sidebar::Get();
+        $actions = new ActionsWidget();
+        $actions->addLink(
+            dgettext('TandemPlugin', 'Sprache hinzufügen'),
+            $this->url_for('admin/add_language'),
+            Icon::create('add'),
+            ['data-dialog' => 'reload-on-close']
+        );
+        $sidebar->addWidget($actions);
+
+        $this->languages = TandemLanguage::findAll();
+    }
+
+
+    protected function validateFormFields()
+    {
+        $name = Request::get('name');
+        $name_ger = Request::get('name_ger');
+        $name_eng = Request::get('name_eng');
+
+        if (!$name) {
+            PageLayout::postError(
+                dgettext('TandemPlugin', 'Es wurde kein Name angegeben.')
+            );
+            return false;
+        }
+        if (!$name_ger) {
+            PageLayout::postError(
+                dgettext('TandemPlugin', 'Es wurde kein deutscher Name angegeben.')
+            );
+            return false;
+        }
+        if (!$name_eng) {
+            PageLayout::postError(
+                dgettext('TandemPlugin', 'Es wurde kein englischer Name angegeben.')
+            );
+            return false;
+        }
+        return true;
+    }
+
+
+    public function add_language_action()
+    {
+        $this->lang_id = '';
+        $this->name = '';
+        $this->name_ger = '';
+        $this->name_eng = '';
+
+        if (Request::submitted('save')) {
+            CSRFProtection::verifyUnsafeRequest();
+            $this->lang_id = Request::get('lang_id');
+            $this->name = Request::get('name');
+            $this->name_ger = Request::get('name_ger');
+            $this->name_eng = Request::get('name_eng');
+
+            $language = new TandemLanguage($this->lang_id);
+            if (!$language->isNew()) {
+                PageLayout::postError(
+                    dgettext('TandemPlugin', 'Eine Sprache mit diesem ISO-Code existiert bereits!')
+                );
+                return;
+            }
+
+            if (!$this->validateFormFields()) {
+                return;
+            }
+
+            $language->name = $this->name;
+            $language->name_ger = $this->name_ger;
+            $language->name_eng = $this->name_eng;
+            if ($language->store()) {
+                PageLayout::postSuccess(
+                    dgettext('TandemPlugin', 'Die Sprache wurde hinzugefügt.')
+                );
+                $this->response->add_header('X-Dialog-Close', '1');
+            } else {
+                PageLayout::postError(
+                    dgettext('TandemPlugin', 'Die Sprache konnte nicht hinzugefügt werden.')
+                );
+            }
+        }
+    }
+
+
+    public function edit_language_action($lang_id)
+    {
+        $this->language = TandemLanguage::find($lang_id);
+        if (!$this->language) {
+            PageLayout::postError(
+                sprintf(
+                    dgettext('TandemPlugin', 'Die Sprache mit dem Sprachcode %s existiert nicht.'),
+                    $lang_id
+                )
+            );
+            return;
+        }
+
+        if (Request::submitted('save')) {
+            CSRFProtection::verifyUnsafeRequest();
+
+            $this->language->name = Request::get('name');
+            $this->language->name_ger = Request::get('name_ger');
+            $this->language->name_eng = Request::get('name_eng');
+
+            if (!$this->validateFormFields()) {
+                return;
+            }
+
+            $success = false;
+            if ($this->language->isDirty()) {
+                $success = $this->language->store();
+            } else {
+                $success = true;
+            }
+            if ($success) {
+                PageLayout::postSuccess(dgettext('TandemPlugin', 'Die Sprache wurde gespeichert.'));
+                $this->response->add_header('X-Dialog-Close', '1');
+            } else {
+                PageLayout::postError(dgettext('TandemPlugin', 'Die Sprache konnte nicht gespeichert werden.'));
+            }
+        }
+    }
+
+
+    public function delete_language_action($lang_id)
+    {
+        $this->language = TandemLanguage::find($lang_id);
+        if (!$this->language) {
+            PageLayout::postError(
+                sprintf(
+                    dgettext('TandemPlugin', 'Die Sprache mit dem Sprachcode %s existiert nicht.'),
+                    $lang_id
+                )
+            );
+            return;
+        }
+
+        if (Request::submitted('delete')) {
+            CSRFProtection::verifyUnsafeRequest();
+            if ($this->language->delete()) {
+                PageLayout::postSuccess(
+                    dgettext('TandemPlugin', 'Die Sprache wurde gelöscht.')
+                );
+                $this->response->add_header('X-Dialog-Close', '1');
+            } else {
+                PageLayout::postError(
+                    dgettext('TandemPlugin', 'Die Sprache konnte nicht gelöscht werden.')
+                );
+            }
+        }
+    }
 }
diff --git a/plugin.manifest b/plugin.manifest
index ebf201eec760582e15b1a0d32c49bb268b8bfc62..5c836bd5c62dac4f41bb1a2ac70649d28993a7b1 100644
--- a/plugin.manifest
+++ b/plugin.manifest
@@ -1,7 +1,7 @@
 pluginname=TandemPlugin
 pluginclassname=TandemPlugin
 origin=data-quest
-version=1.1.1
+version=1.2.0
 description=Dieses Plugin ermöglicht es, Sprachtandems innerhalb der Stud.IP Platform zu bilden.
 studipMinVersion=4.0
 studipMaxVersion=5.9.99
diff --git a/views/admin/_common_language_form.php b/views/admin/_common_language_form.php
new file mode 100644
index 0000000000000000000000000000000000000000..9782bcc2b2301b16c3a161ae2649f12bddee9176
--- /dev/null
+++ b/views/admin/_common_language_form.php
@@ -0,0 +1,18 @@
+<label>
+    <?= dgettext('TandemPlugin', 'Name') ?>
+    <input type="text" name="name" value="<?= htmlReady($name) ?>">
+</label>
+<label>
+    <?= dgettext('TandemPlugin', 'Deutscher Name') ?>
+    <input type="text" name="name_ger" value="<?= htmlReady($name_ger) ?>">
+</label>
+<label>
+    <?= dgettext('TandemPlugin', 'Englischer Name') ?>
+    <input type="text" name="name_eng" value="<?= htmlReady($name_eng) ?>">
+</label>
+<div data-dialog-button>
+    <?= \Studip\Button::create(
+        dgettext('TandemPlugin', 'Speichern'),
+        'save'
+    ) ?>
+</div>
diff --git a/views/admin/add_language.php b/views/admin/add_language.php
new file mode 100644
index 0000000000000000000000000000000000000000..fa29d79761734af4ac419bd0e4e7e3c56100915e
--- /dev/null
+++ b/views/admin/add_language.php
@@ -0,0 +1,16 @@
+<form class="default" method="post" data-dialog="reload-on-close"
+      action="<?= $controller->link_for('admin/add_language') ?>">
+    <?= CSRFProtection::tokenTag() ?>
+    <label>
+        <?= dgettext('TandemPlugin', 'ISO 639-2 Code') ?>
+        <input type="text" name="lang_id" value="<?= htmlReady($lang_id) ?>">
+    </label>
+    <?= $this->render_partial(
+        'admin/_common_language_form',
+        [
+            'name' => $name,
+            'name_ger' => $name_ger,
+            'name_eng' => $name_eng
+        ]
+    ) ?>
+</form>
diff --git a/views/admin/delete_language.php b/views/admin/delete_language.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d64e5415b0351c167ff5b2122f2e7018323f7be
--- /dev/null
+++ b/views/admin/delete_language.php
@@ -0,0 +1,25 @@
+<? if ($language) : ?>
+    <?= MessageBox::warning(
+        dgettext('TandemPlugin', 'Soll die folgende Sprache wirklich gelöscht werden?')
+    ) ?>
+    <dl>
+        <dt><?= dgettext('TandemPlugin', 'ISO 639-2 Code') ?></dt>
+        <dd><?= htmlReady($language->id) ?></dd>
+        <dt><?= dgettext('TandemPlugin', 'Name') ?></dt>
+        <dd><?= htmlReady($language->name) ?></dd>
+        <dt><?= dgettext('TandemPlugin', 'Deutscher Name') ?></dt>
+        <dd><?= htmlReady($language->name_ger) ?></dd>
+        <dt><?= dgettext('TandemPlugin', 'Englischer Name') ?></dt>
+        <dd><?= htmlReady($language->name_eng) ?></dd>
+    </dl>
+    <form class="default" method="post" data-dialog="reload-on-close"
+    action="<?= $controller->link_for('admin/delete_language/' . $language->id) ?>">
+        <?= CSRFProtection::tokenTag() ?>
+        <div data-dialog-button>
+            <?= \Studip\Button::create(
+                dgettext('TandemPlugin', 'Löschen'),
+                'delete'
+            ) ?>
+        </div>
+    </form>
+<? endif ?>
diff --git a/views/admin/edit_language.php b/views/admin/edit_language.php
new file mode 100644
index 0000000000000000000000000000000000000000..0de8d44f8f28e3cc7416e395b268869a8f20eba2
--- /dev/null
+++ b/views/admin/edit_language.php
@@ -0,0 +1,12 @@
+<form class="default" method="post" data-dialog="reload-on-close"
+      action="<?= $controller->link_for('admin/edit_language/' . $language->id) ?>">
+    <?= CSRFProtection::tokenTag() ?>
+    <?= $this->render_partial(
+        'admin/_common_language_form',
+        [
+            'name' => $language->name,
+            'name_ger' => $language->name_ger,
+            'name_eng' => $language->name_eng
+        ]
+    ) ?>
+</form>
diff --git a/views/admin/languages.php b/views/admin/languages.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca3e87cb5e522c158897149fcaeeaf6f65820d19
--- /dev/null
+++ b/views/admin/languages.php
@@ -0,0 +1,43 @@
+<? if ($languages) : ?>
+    <table class="default">
+        <thead>
+            <tr>
+                <th><?= dgettext('TandemPlugin', 'ISO 639-2 Code') ?></th>
+                <th><?= dgettext('TandemPlugin', 'Name') ?></th>
+                <th><?= dgettext('TandemPlugin', 'Deutscher Name') ?></th>
+                <th><?= dgettext('TandemPlugin', 'Englischer Name') ?></th>
+                <th class="actions"><?= dgettext('TandemPlugin', 'Aktionen') ?></th>
+            </tr>
+        </thead>
+        <tbody>
+            <? foreach ($languages as $language) : ?>
+                <tr>
+                    <td><?= htmlReady($language->id) ?></td>
+                    <td><?= htmlReady($language->name) ?></td>
+                    <td><?= htmlReady($language->name_ger) ?></td>
+                    <td><?= htmlReady($language->name_eng) ?></td>
+                    <td class="actions">
+                        <?
+                        $action_menu = ActionMenu::get();
+                        $action_menu->addLink(
+                            $controller->url_for('admin/edit_language/' . $language->id),
+                            dgettext('TandemPlugin', 'Bearbeiten'),
+                            Icon::create('edit'),
+                            ['data-dialog' => 'reload-on-close']
+                        );
+                        $action_menu->addLink(
+                            $controller->url_for('admin/delete_language/' . $language->id),
+                            dgettext('TandemPlugin', 'Löschen'),
+                            Icon::create('trash'),
+                            ['data-dialog' => 'reload-on-close']
+                        );
+                        ?>
+                        <?= $action_menu->render() ?>
+                    </td>
+                </tr>
+            <? endforeach ?>
+        </tbody>
+    </table>
+<? else : ?>
+    <?= MessageBox::info(dgettext('TandemPlugin', 'Es sind keine Sprachen verfügbar.')) ?>
+<? endif ?>