diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 6491ae1c532341080897682448dc11e51803a348..9acc8e70cb8f3c2432a833234a9c0a120ee05585 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -64,6 +64,8 @@
   - Anstelle von `CalendarView` sollte `\Studip\Fullcalendar` verwendet werden.
 - Das Datenbankschema des Stundenplans wurde geändert. ([Issue #4421](https://gitlab.studip.de/studip/studip/-/issues/4421))
 - Die Evaluationen wurden ausgebaut. Stattdessen sollte man nun die neuen Fragebögen verwenden ([Issue #3787]https://gitlab.studip.de/studip/studip/-/issues/3787)
+- Die Klassen `DbView`, `DbSnapshot` und die zugehörigen Dateien in `lib/dbviews` wurden ausgebaut. ([Issue #4390](https://gitlab.studip.de/studip/studip/-/issues/4390))
+  - Als Ersatz dienen Datenbankabfragen mittels der `DBManager`-Klasse oder mittels `SimpleORMap`-Modellen.
 
 ## Security related issues
 
diff --git a/lib/classes/DbSnapshot.php b/lib/classes/DbSnapshot.php
deleted file mode 100644
index 33ea6600a388b95ec94cf5575e0cf7a2dde2f54f..0000000000000000000000000000000000000000
--- a/lib/classes/DbSnapshot.php
+++ /dev/null
@@ -1,370 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-// +---------------------------------------------------------------------------+
-// This file is part of Stud.IP
-// DbSnapshot.php
-// Class to provide snapshots of mysql result sets
-// Uses PHPLib DB Abstraction
-// Copyright (c) 2002 André Noack <andre.noack@gmx.net>
-// +---------------------------------------------------------------------------+
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or any later version.
-// +---------------------------------------------------------------------------+
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// +---------------------------------------------------------------------------+
-
-
-/**
- * Class to provide snapshots of mysql result sets
- *
- * Uses DB abstraction layer of PHPLib
- *
- * @access   public
- * @author   André Noack <andre.noack@gmx.net>
- * @package  DBTools
- **/
-class DbSnapshot
-{
-
-    /**
-     * the used db abstraction class
-     *
-     *
-     * @access   private
-     * @var      string $DbClass
-     */
-    var $DbClass = "DB_Sql";
-    /**
-     * the used db result set
-     *
-     *
-     * @access   private
-     * @var      object DB_Sql   $dbResult
-     */
-    var $dbResult = null;
-    /**
-     * array to store the result set
-     *
-     *
-     * @access   private
-     * @var      array $result
-     */
-    var $result = [];
-    /**
-     * array to store metadata oh the result set
-     *
-     *
-     * @access   private
-     * @var      array $metaData
-     */
-    var $metaData = [];
-    /**
-     * the number of fields in the result set
-     *
-     *
-     * @access   public
-     * @var      integer $numFields
-     */
-    var $numFields = 0;
-    /**
-     * the number of rows in the result set
-     *
-     *
-     * @access   public
-     * @var      integer $numRows
-     */
-    var $numRows = 0;
-    /**
-     * the internal row pointer
-     *
-     *
-     * @access   private
-     * @var      mixed $pos
-     */
-    var $pos = false;
-    /**
-     * turn on/off debugging
-     *
-     *
-     * @access   public
-     * @var      boolean $debug
-     */
-    var $debug = false;
-
-    /**
-     * Constructor
-     *
-     * Pass instance of DbClass or nothing to specify result set later
-     *
-     * @access   public
-     *
-     * @param    object DB_Sql   $dbresult
-     */
-    public function __construct($dbresult = null)
-    {
-        if (is_object($dbresult)) {
-            $this->dbResult = $dbresult;
-            $this->getSnapshot();
-        }
-
-    }
-
-    function isDbResult()
-    {
-        if (!is_subclass_of($this->dbResult, $this->DbClass))
-            $this->halt("Result set has wrong type!");
-        if (!$this->dbResult->query_id())
-            $this->halt("No result set (missing query?)");
-
-        return true;
-    }
-
-    public function getSnapshot()
-    {
-        if ($this->isDbResult()) {
-            $this->numFields = $this->dbResult->num_fields();
-            $this->numRows   = $this->dbResult->num_rows();
-            $this->metaData  = $this->dbResult->metadata();
-            $this->result    = [];
-            while ($this->dbResult->next_record()) {
-                $this->result[] = $this->dbResult->Record;
-            }
-            unset($this->dbResult);
-            $this->pos = false;
-
-            return true;
-        }
-
-        return false;
-    }
-
-    public function nextRow()
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-        if ($this->pos === false) {
-            $this->pos = 0;
-
-            return true;
-        }
-        if (++$this->pos < $this->numRows)
-            return true;
-        else
-            return false;
-    }
-
-    public function resetPos()
-    {
-        $this->pos = false;
-    }
-
-    public function isField($name)
-    {
-        for ($i = 0; $i < $this->numFields; ++$i) {
-            if ($name == $this->metaData[$i]['name']) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public function getRow($row = false)
-    {
-        if (!$row === false AND !$this->result[$row])
-            $this->halt("Snapshot has only " . ($this->numRows - 1) . " rows!");
-
-        return ($row === false) ? $this->result[$this->pos] : $this->result[$row];
-    }
-
-    public function getFieldList()
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-        $ret = [];
-        for ($i = 0; $i < $this->numFields; ++$i) {
-            $ret[] = $this->metaData[$i]['name'];
-        }
-
-        return $ret;
-    }
-
-    public function getField($field = 0)
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-
-        return ($this->pos === false) ? false : $this->result[$this->pos][$field];
-    }
-
-    public function getRows($fieldname = 0)
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-        $ret = [];
-        for ($i = 0; $i < $this->numRows; ++$i) {
-            $ret[] = $this->result[$i][$fieldname];
-        }
-
-        return $ret;
-    }
-
-    public function getDistinctRows($fieldname)
-    {
-        if (!$this->isField($fieldname))
-            $this->halt("Field: $fieldname not found in result set!");
-        $ret = [];
-        for ($i = 0; $i < $this->numRows; ++$i) {
-            $ret[$this->result[$i][$fieldname]]        = $this->result[$i];
-            $ret[$this->result[$i][$fieldname]]['row'] = $i;
-        }
-
-        return $ret;
-    }
-
-    public function sortRows($fieldname = 0, $order = "ASC", $stype = false)
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-        $sortfields = $this->getRows($fieldname);
-        if ($stype !== false) {
-            $sortfunc = ($order == "ASC") ? "asort" : "arsort";
-            $sortfunc($sortfields, $stype);
-        } else {
-            uasort($sortfields, function ($a,$b) {
-                $a = mb_strtolower($a);
-                $a = str_replace('ä', 'ae', $a);
-                $a = str_replace('ö', 'oe', $a);
-                $a = str_replace('ü', 'ue', $a);
-
-                $b = mb_strtolower($b);
-                $b = str_replace('ä', 'ae', $b);
-                $b = str_replace('ö', 'oe', $b);
-                $b = str_replace('ü', 'ue', $b);
-
-                return strnatcasecmp($a, $b);
-            });
-            if ($order == "DESC") {
-                $sortfields = array_reverse($sortfields, true);
-            }
-        }
-        $sortresult = [];
-        foreach ($sortfields as $key => $value) {
-            $sortresult[] = $this->result[$key];
-        }
-        $this->result = $sortresult;
-        $this->resetPos();
-
-        return true;
-    }
-
-    public function searchFields($fieldname, $searchstr)
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-        $ret        = false;
-        $sortfields = $this->getRows($fieldname);
-        foreach ($sortfields as $key => $value) {
-            if (preg_match($searchstr, $value)) {
-                $ret       = true;
-                $this->pos = $key;
-                break;
-            }
-        }
-
-        return $ret;
-    }
-
-    public function getGroupedResult($group_by_field, $fields_to_group = null)
-    {
-        if (!$this->numRows)
-            $this->halt("No snapshot available or empty result!");
-        $fieldlist = $this->getFieldList();
-        if (!in_array($group_by_field, $fieldlist))
-            $this->halt("group_by_field not found in result set!");
-        if (is_array($fields_to_group))
-            $fieldlist = $fields_to_group;
-        $num_fields = count($fieldlist);
-        $ret        = [];
-        for ($i = 0; $i < $this->numRows; ++$i) {
-            for ($j = 0; $j < $num_fields; ++$j) {
-                if ($fieldlist[$j] != $group_by_field) {
-                    if (empty($ret[$this->result[$i][$group_by_field]][$fieldlist[$j]][$this->result[$i][$fieldlist[$j]]])) {
-                        $ret[$this->result[$i][$group_by_field]][$fieldlist[$j]][$this->result[$i][$fieldlist[$j]]] = 0;
-                    }
-                    ++$ret[$this->result[$i][$group_by_field]][$fieldlist[$j]][$this->result[$i][$fieldlist[$j]]];
-                }
-            }
-        }
-
-        return $ret;
-    }
-
-    public function mergeSnapshot($m_snap, $key_field = false, $mode = "ADD")
-    {
-        if ($mode == "ADD") {
-            for ($i = 0; $i < $m_snap->numRows; ++$i) {
-                $this->result[] = $m_snap->result[$i];
-            }
-        } elseif ($mode == "AND") {
-            if (!$this->numRows || !$m_snap->numRows) {
-                $this->result = [];
-            } elseif ($m_snap->numRows) {
-                $m_result = $m_snap->getDistinctRows($key_field);
-                for ($i = 0; $i < $this->numRows; ++$i) {
-                    if (!($m_result[$this->result[$i][$key_field]] && $this->result[$i][$key_field])) {
-                        unset($this->result[$i]);
-                    }
-                }
-            }
-        } elseif ($mode == "OR") {
-            if (!$this->numRows) {
-                $this->result = $m_snap->result;
-            } elseif ($m_snap->numRows) {
-                $result = $this->getDistinctRows($key_field);
-                for ($i = 0; $i < $m_snap->numRows; ++$i) {
-                    if (empty($result[$m_snap->result[$i][$key_field]])) {
-                        $this->result[] = $m_snap->result[$i];
-                    }
-                }
-            }
-        }
-        $this->result  = array_merge([], (array)$this->result);
-        $this->numRows = count($this->result);
-        $this->resetPos();
-
-        return $this->numRows;
-    }
-
-    /**
-     * print error message and exit script
-     *
-     * @access   private
-     *
-     * @param    string $msg the message to print
-     */
-    public function halt($msg)
-    {
-        echo "<hr>$msg<hr>";
-        if ($this->debug) {
-            echo "<pre>";
-            print_r($this);
-            echo "</pre>";
-            die;
-        }
-
-    }
-}
-
-?>
diff --git a/lib/classes/DbView.php b/lib/classes/DbView.php
deleted file mode 100644
index 0215f8ed7296f3b270e19a8dbc6aa0c40d4b1ed8..0000000000000000000000000000000000000000
--- a/lib/classes/DbView.php
+++ /dev/null
@@ -1,378 +0,0 @@
-<?php
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-// +---------------------------------------------------------------------------+
-// This file is part of Stud.IP
-// DbView.php
-// Class to provide simple Views and Prepared Statements
-// Mainly for MySql, may work with other DBs (not tested)
-// Copyright (c) 2002 André Noack <andre.noack@gmx.net>
-// +---------------------------------------------------------------------------+
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or any later version.
-// +---------------------------------------------------------------------------+
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// +---------------------------------------------------------------------------+
-
-
-/**
- * Class to provide simple Views and Prepared Statements
- *
- * Only tested with MySql, needs MySql >= 3.23
- * Uses DB abstraction layer of PHPLib
- *
- * @access   public
- * @author   André Noack <andre.noack@gmx.net>
- * @package  DBTools
- */
-class DbView
-{
-    /**
-     * the processed list of queries
-     *
-     *
-     * @access   private
-     * @var      array $query_list
-     */
-    private $query_list = [];
-    /**
-     * list of parameters
-     *
-     *
-     * @access   public
-     * @var      array $params
-     */
-    public $params = [];
-
-    /**
-     * Database Object
-     *
-     *
-     * @access   private
-     * @var      object $db
-     */
-    private $db;
-    /**
-     * Database Object Type
-     *
-     * Use your subclass of db_mysql here, or pass existing object to constuctor
-     *
-     * @access   private
-     * @var      string $db_class_name
-     * @see      DbView()
-     */
-    private $db_class_name = "DB_Seminar";
-    /**
-     * Temp Table Type
-     *
-     * MyISAM is always safe, HEAP may provide better performance
-     *
-     * @access   private
-     * @var      string $temp_table_type
-     */
-    private $temp_table_type = "MyISAM";
-    /**
-     * Primary Key used in Temp Table
-     *
-     * If none is set in your view, an auto_increment row is used
-     *
-     * @access   private
-     * @var      string $pk
-     * @see      get_temp_table()
-     */
-    private $pk = "";
-    /**
-     * delete the params array after each query execution
-     *
-     *
-     * @access   public
-     * @var      boolean $auto_free_params
-     */
-    public $auto_free_params = true;
-    /**
-     * turn on/off debugging
-     *
-     *
-     * @access   public
-     * @var      boolean $debug
-     */
-    public $debug = false;
-
-    static protected $dbviewfiles = [];
-
-    static protected $dbviews = [];
-
-    public static function addView($view)
-    {
-        $view = mb_strtolower($view);
-        if (!isset(self::$dbviewfiles[$view])) {
-            self::$dbviewfiles[$view] = 0;
-        }
-    }
-
-    /**
-     * Convenience method that combines addView() and returns an instance.
-     *
-     * @param String $view Required view (at least this will be present in the
-     *                     returned instance)
-     * @param mixed  $db classname of db abstraction or existing db object
-     *
-     * @return DbView Instance of self with at least the required view loaded
-     */
-    public static function getView($view, $db = '')
-    {
-        self::addView($view);
-
-        return new self($db);
-    }
-
-    /**
-     * Constructor
-     *
-     * Pass nothing to use a new instance of db_class_name, the classname for a new instance, or existing instance
-     *
-     * @access   public
-     *
-     * @param    mixed $db classname of used db abstraction or existing db object
-     */
-    public function __construct($db = "")
-    {
-        if (is_object($db)) {
-            $this->db = $db;
-        } else if ($db != "") {
-            $this->db            = new $db;
-            $this->db_class_name = $db;
-        } else {
-            $this->db = new $this->db_class_name;
-        }
-        $this->init_views();
-    }
-
-    public function init_views()
-    {
-        foreach (self::$dbviewfiles as $view => $status) {
-            if ($status === 0) {
-                $views = include 'lib/dbviews/' . $view . '.view.php';
-                self::$dbviews += $views;
-
-                self::$dbviewfiles[$view] = 1;
-            }
-        }
-    }
-
-    public function __get($view)
-    {
-        if (isset(self::$dbviews[$view])) {
-            return self::$dbviews[$view];
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * print error message and exit script
-     *
-     * @access   private
-     *
-     * @param    string $msg the message to print
-     */
-    public function halt($msg)
-    {
-        echo "<hr>$msg<hr>";
-        if ($this->debug) {
-            echo "<pre>";
-            print_r($this);
-            echo "</pre>";
-        }
-        die;
-    }
-
-    public function get_query()
-    {
-        $parsed_query = $this->get_parsed_query(func_get_args());
-        $this->db->query($parsed_query);
-        return $this->db;
-    }
-
-    public function get_parsed_query($query_list)
-    {
-        $parsed_query     = "";
-        $this->query_list = [];
-        (is_array($query_list)) ? $this->query_list = $query_list : $this->query_list[] = $query_list;
-        if (count($this->query_list) == 1) {
-            $spl = explode(":", $this->query_list[0]);
-            if ($spl[0] == "view") {
-                $this->query_list = $this->get_view(trim($spl[1]));
-            }
-        }
-        $this->parse_query($this->query_list);
-        if (is_array($this->query_list)) {
-            $parsed_query = $this->query_list[0];
-        } else {
-            $parsed_query = $this->query_list;
-        }
-
-        return $parsed_query;
-    }
-
-
-    public function parse_query(&$query)
-    {
-        if (is_array($query)) {
-            for ($i = (count($query) - 1); $i > 0; --$i) {
-                $spl = explode(":", $query[$i]);
-                if ($spl[0] == "view") {
-                    $query[$i] = $this->get_view(trim($spl[1]), $spl[2]);
-                }
-                $query[$i]  = $this->parse_query($query[$i]);
-                $repl_query = (is_array($query[$i])) ? $query[$i][0] : $query[$i];
-                for ($j = 0; $j < $i; ++$j) {
-                    $spl = mb_stristr($query[$j], "where");
-                    if (!$spl)
-                        $spl = mb_stristr($query[$j], "having");
-                    if ($spl) {
-                        $pos = mb_strpos($spl, "{" . $i . "}");
-                        if (!$pos === false)
-                            $repl_query = $this->get_temp_values($repl_query);
-                    }
-                    if (!$spl OR $pos === false) {
-                        $pos = mb_strpos($query[$j], "{" . $i . "}");
-                        if (!$pos === false)
-                            $repl_query = $this->get_temp_table($repl_query);
-                    }
-                    $query[$j] = str_replace("{" . $i . "}", $repl_query, $query[$j]);
-                }
-            }
-        }
-
-        return $query;
-    }
-
-
-    public function get_temp_table($sub_query)
-    {
-        $id    = self::get_uniqid();
-        $pk    = $this->pk ? "PRIMARY KEY($this->pk)" : "auto_" . $id . " INT NOT NULL AUTO_INCREMENT PRIMARY KEY";
-        $query = "CREATE TEMPORARY TABLE temp_$id ($pk) ENGINE=$this->temp_table_type $sub_query";
-        $this->db->query($query);
-
-        return " temp_" . $id . " ";
-    }
-
-
-    public function get_temp_values($sub_query)
-    {
-        $this->db->query($sub_query);
-        if (!$this->db->num_rows())
-            $this->halt("Sub Query: <b>$sub_query</b> returns nothing!");
-        else {
-            while ($this->db->next_record()) {
-                $result[] = $this->db->Record[0];
-            }
-            $value_list = $this->get_value_list($result);
-        }
-
-        return $value_list;
-    }
-
-    public static function get_uniqid()
-    {
-        mt_srand((double)microtime() * 1000000);
-
-        return md5(uniqid(mt_rand(), 1));
-    }
-
-    public function get_value_list($list)
-    {
-        $value_list = false;
-        if (count($list) == 1)
-            $value_list = "'$list[0]'";
-        else
-            $value_list = "'" . join("','", $list) . "'";
-
-        return $value_list;
-    }
-
-    public function get_view($name)
-    {
-        if (!empty(self::$dbviews[$name]["pk"])) {
-            $this->pk = self::$dbviews[$name]["pk"];
-        }
-        if (!empty(self::$dbviews[$name]["temp_table_type"])) {
-            $this->temp_table_type = self::$dbviews[$name]["temp_table_type"];
-        }
-        if (!$query_list = self::$dbviews[$name]["query"])
-            $this->halt("View not found: $name");
-        (is_array($query_list)) ? $query = $query_list[0] : $query = $query_list;
-        $tokens = preg_split("/[\?§\&]/u", $query);
-        if (count($tokens) > 1) {
-            $types = [];
-            $token = 0;
-            foreach (preg_split('//u', $query, null, PREG_SPLIT_NO_EMPTY) as $i => $c) {
-                switch ($c) {
-                    case '?':
-                        $types[$token++] = 1;
-                        break;
-                    case '§':
-                        $types[$token++] = 2;
-                        break;
-                    case '&':
-                        $types[$token++] = 3;
-                        break;
-                }
-            }
-            if (count($this->params) != count($types))
-                $this->halt("Wrong parameter count in view: $name");
-            $query = "";
-            for ($i = 0; $i < count($this->params); ++$i) {
-                $query .= $tokens[$i];
-                if (is_null($this->params[$i])) {
-                    $query .= 'NULL';
-                } else {
-                    switch ($types[$i]) {
-                        case 1:
-                            $query .= "'" . $this->params[$i] . "'";
-                            break;
-                        case 2:
-                            $query .= $this->params[$i];
-                            break;
-                        case 3:
-                            $query .= (is_array($this->params[$i])) ? "'" . join("','", $this->params[$i]) . "'" : "'" . $this->params[$i] . "'";
-                            break;
-                    }
-                }
-            }
-            $query .= $tokens[$i];
-            if ($this->auto_free_params)
-                $this->params = [];
-        }
-        (is_array($query_list)) ? $query_list[0] = $query : $query_list = $query;
-        return $query_list;
-    }
-
-    public function Get_union()
-    {
-        $queries     = func_get_args();
-        $view        = new DbView();
-        $union_table = $view->get_temp_table($view->get_parsed_query($queries[0]));
-        if ($queries[1]) {
-            for ($i = 1; $i < count($queries); ++$i) {
-                $view->db->query("REPLACE INTO $union_table " . $view->get_parsed_query($queries[$i]));
-            }
-        }
-
-        return $union_table;
-    }
-}
-
-?>
diff --git a/lib/classes/JsonApi/Routes/Courses/CoursesIndex.php b/lib/classes/JsonApi/Routes/Courses/CoursesIndex.php
index fcbad91ca91e1e36e3414ca0daf476a81c697f75..77870f9848cbe02ba73f980b3f9823e037a0b35f 100644
--- a/lib/classes/JsonApi/Routes/Courses/CoursesIndex.php
+++ b/lib/classes/JsonApi/Routes/Courses/CoursesIndex.php
@@ -127,8 +127,6 @@ class CoursesIndex extends JsonApiController
             ],
             $visibleOnly
         );
-        $searchHelper->doSearch();
-
-        return $searchHelper->getSearchResultAsArray();
+        return $searchHelper->doSearch();
     }
 }
diff --git a/lib/classes/StudipSemSearchHelper.php b/lib/classes/StudipSemSearchHelper.php
index 821a03929f4e1f883a1972356c8f9a2a4fda77dc..57b699b02b7eaa513b18951964c0db2a688121ae 100644
--- a/lib/classes/StudipSemSearchHelper.php
+++ b/lib/classes/StudipSemSearchHelper.php
@@ -37,7 +37,6 @@ class StudipSemSearchHelper {
                         'scope' => _("Bereich")];
     }
 
-    private $search_result;
     private $found_rows = false;
     private $params = [];
     private $visible_only;
@@ -80,16 +79,24 @@ class StudipSemSearchHelper {
             return false;
         }
         $this->params = array_map('addslashes', $this->params);
-        $clause = "";
-        $and_clause = "";
-        $this->search_result = new DbSnapshot();
-        $combination = $this->params['combination'];
 
-        $view = DbView::getView('sem_tree');
-
-        if (isset($this->params['sem']) && $this->params['sem'] !== 'all'){
-            $sem_number = (int)$this->params['sem'];
-            $clause = " HAVING (sem_number <= $sem_number AND (sem_number_end >= $sem_number OR sem_number_end = -1)) ";
+        $db = DBManager::get();
+        $join_sql   = [];
+        $where_sql  = [];
+        $sql_params = [];
+
+        if (isset($this->params['sem']) && $this->params['sem'] !== 'all') {
+            $all_semesters = Semester::getAll();
+            if (array_key_exists($this->params['sem'], $all_semesters)) {
+                $semester = $all_semesters[$this->params['sem']];
+                //Use that semester for filtering courses:
+                $join_sql[]  = "LEFT JOIN `semester_courses` ON `seminare`.`seminar_id` = `semester_courses`.`course_id`";
+                $where_sql[] = "(`semester_courses`.`semester_id` IS NULL OR `semester_courses`.`semester_id` = :semester_id)";
+                $sql_params['semester_id'] = $semester->id;
+            } else {
+                //Nothing can be found when the semester is unknown:
+                return [];
+            }
         }
 
         $sem_types = [];
@@ -101,149 +108,84 @@ class StudipSemSearchHelper {
             }
         }
 
-        if (isset($this->params['type']) && $this->params['type'] != 'all'){
+        if (isset($this->params['type']) && $this->params['type'] !== 'all') {
             $sem_types = [$this->params['type']];
         }
         if ($sem_types) {
-            $clause = " AND c.status IN('" . join("','",$sem_types) . "') " . $clause;
+            $where_sql[] = "`seminare`.`status` IN ( :course_types )";
+            $sql_params['course_types'] = $sem_types;
         }
 
-        $view->params = [];
-
-        if ($this->params['scope_choose'] && $this->params['scope_choose'] != 'root'){
-            $tree_node = StudipStudyArea::find($this->params['scope_choose']);
-            $sem_tree_ids = [];
-            if ($tree_node) {
-                $all_children = $tree_node->getAllChildNodes();
-                foreach ($all_children as $child) {
-                    $sem_tree_ids[] = $child->id;
-                }
-                $sem_tree_ids[] = $tree_node->id;
-            }
-
-            $all_sem_type_ids = [];
-            foreach (SemType::getTypes() as $sem_type) {
-                $all_sem_type_ids[] = $sem_type->id;
-            }
-            $view->params[0] = $sem_types ?: $all_sem_type_ids;
-            $view->params[1] = $this->visible_only ? "c.visible=1" : "1";
-            $view->params[2] = $sem_tree_ids;
-            $view->params[3] = $clause;
-            $snap = new DbSnapshot($view->get_query("view:SEM_TREE_GET_SEMIDS"));
-            if ($snap->numRows){
-                $clause = " AND c.seminar_id IN('" . join("','",$snap->getRows("seminar_id")) ."')" . $clause;
-            } else {
-                return 0;
-            }
-            unset($snap);
+        if ($this->visible_only) {
+            //Visible courses only:
+            $where_sql[] = "`seminare`.`visible` = 1";
         }
 
-        if ($this->params['range_choose'] && $this->params['range_choose'] != 'root'){
-            $range_node = RangeTreeNode::find($this->params['range_choose']);
-            $range_ids = [];
-            if ($range_node) {
-                $children = $range_node->getChildNodes();
+        if (!empty($this->params['scope_choose']) && $this->params['scope_choose'] !== 'root') {
+            //Filter by study areas:
+            $study_area_ids = [];
+            $study_area = StudipStudyArea::find($this->params['scope_choose']);
+            if ($study_area) {
+                $children = $study_area->getChildren();
                 foreach ($children as $child) {
-                    $range_ids[] = $child->studip_object_id;
+                    $study_area_ids[] = $child->id;
+                    $grand_children = $child->getChildren();
+                    foreach ($grand_children as $grand_child) {
+                        $study_area_ids[] = $grand_child->id;
+                    }
                 }
-                $range_ids[] = $range_node->studip_object_id;
             }
 
-            $view->params[0] = $range_ids;
-            $view->params[1] = ($this->visible_only ? " AND c.visible=1 " : "");
-            $view->params[2] = $clause;
-            $snap = new DbSnapshot($view->get_query("view:SEM_INST_GET_SEM"));
-            if ($snap->numRows){
-                $clause = " AND c.seminar_id IN('" . join("','",$snap->getRows("Seminar_id")) ."')" . $clause;
-            } else {
-                return 0;
+            if (!empty($study_area_ids)) {
+                $join_sql[]  = "JOIN `seminar_sem_tree` USING (`seminar_id`)";
+                $where_sql[] = "`seminar_sem_tree`.`sem_tree_id` IN ( :study_area_ids )";
+                $sql_params['study_area_ids'] = $study_area_ids;
             }
-            unset($snap);
         }
 
-
-        if (isset($this->params['lecturer']) && mb_strlen($this->params['lecturer']) > 2){
-            $view->params[0] = "%" . $this->trim($this->params['lecturer']) . "%";
-            $view->params[1] = "%" . $this->trim($this->params['lecturer']) . "%";
-            $view->params[2] = "%" . $this->trim($this->params['lecturer']) . "%";
-            $view->params[3] = "%" . $this->trim($this->params['lecturer']) . "%";
-            $view->params[4] = "%" . $this->trim($this->params['lecturer']) . "%";
-            $result = $view->get_query("view:SEM_SEARCH_LECTURER");
-
-            $lecturers = [];
-            while ($result->next_record()) {
-                $lecturers[] = $result->f('user_id');
-            }
-
-            if (count($lecturers)) {
-                $view->params[0] = $this->visible_only ? "c.visible=1" : "1";
-                $view->params[1] = $lecturers;
-                $view->params[2] = $clause;
-                $snap = new DbSnapshot($view->get_query("view:SEM_SEARCH_LECTURER_ID"));
-                $this->search_result = $snap;
-                $this->found_rows = $this->search_result->numRows;
-            }
-        }
-
-
-        if ($combination == "AND" && $this->search_result->numRows){
-            $and_clause = " AND c.seminar_id IN('" . join("','",$this->search_result->getRows("seminar_id")) ."')";
-        }
-
-        if ((isset($this->params['title']) && mb_strlen($this->params['title']) > 2) ||
-            (isset($this->params['sub_title']) && mb_strlen($this->params['sub_title']) > 2) ||
-            (isset($this->params['number']) && mb_strlen($this->params['number']) > 2) ||
-            (isset($this->params['comment']) && mb_strlen($this->params['comment']) > 2)){
-
-            $toFilter = explode(" ", $this->params['title']);
-            $search_for = "(Name LIKE '%" . implode("%' AND Name LIKE '%", $toFilter) . "%')";
-            if (!array_key_exists(0, $view->params)) {
-                $view->params[0] = '';
+        if (!empty($this->params['range_choose']) && $this->params['range_choose'] !== 'root') {
+            //Filter by institutes:
+            $institute = Institute::find($this->params['range_choose']);
+            $institute_ids = [];
+            if ($institute) {
+                $institute_ids[] = $institute->id;
+                if ($institute->isFaculty()) {
+                    $institute_ids[] = array_merge(
+                        $institute_ids,
+                        $institute->sub_institutes->pluck('id')
+                    );
+                }
             }
-            $view->params[0] .= ($this->params['title']) ? $search_for . " " : " ";
-            $view->params[0] .= ($this->params['title'] && !empty($this->params['sub_title'])) ? $combination : " ";
-            $view->params[0] .= (!empty($this->params['sub_title'])) ? " Untertitel LIKE '%" . $this->trim($this->params['sub_title']) . "%' " : " ";
-            $view->params[0] .= (($this->params['title'] || !empty($this->params['sub_title'])) && !empty($this->params['comment'])) ? $combination : " ";
-            $view->params[0] .= (!empty($this->params['comment'])) ? " Beschreibung LIKE '%" . $this->trim($this->params['comment']) . "%' " : " ";
-            $view->params[0] .= (($this->params['title'] || !empty($this->params['sub_title']) || empty($this->params['comment'])) && $this->params['number']) ? $combination : " ";
-            $view->params[0] .= ($this->params['number']) ? " VeranstaltungsNummer LIKE '%" . $this->trim($this->params['number']) . "%' " : " ";
-            $view->params[0] = ($this->visible_only ? " c.visible=1 AND " : "") . "(" . $view->params[0] .")";
-            $view->params[1] =  $and_clause . $clause;
-            $snap = new DbSnapshot($view->get_query("view:SEM_SEARCH_SEM"));
-            if ($this->found_rows === false){
-                $this->search_result = $snap;
-            } else {
-                $this->search_result->mergeSnapshot($snap,"seminar_id",$combination);
+            if (empty($institute_ids)) {
+                //We cannot search for courses if the institutes they shall belong to cannot be found:
+                return [];
             }
-            $this->found_rows = $this->search_result->numRows;
+            $where_sql[] = "(`seminare`.`Institut_id` IN (:institute_ids) OR `seminar_inst`.`institut_id` IN (:institute_ids))";
+            $sql_params['institute_ids'] = $institute_ids;
         }
 
-        if ($combination == "AND" && $this->search_result->numRows){
-            $and_clause = " AND c.seminar_id IN('" . join("','",$this->search_result->getRows("seminar_id")) ."')";
+        if (isset($this->params['lecturer']) && mb_strlen($this->params['lecturer']) > 2) {
+            //Search for lecturers:
+            $join_sql[] = "JOIN `seminar_user` USING (`seminar_id`)";
+            $join_sql[] = "JOIN `auth_user_md5` USING (`user_id`)";
+            $where_sql[] = "(
+                CONCAT(`auth_user_md5`.`Nachname`, ', ', `auth_user_md5`.`Vorname`, ' ', `auth_user_md5`.`Nachname`) LIKE CONCAT('%', :lecturer_name, '%')
+                OR `auth_user_md5`.`username` LIKE CONCAT('%', :lecturer_name, '%')
+                )";
+            $sql_params['lecturer_name'] = $this->params['lecturer'];
         }
 
-        if (isset($this->params['scope']) && mb_strlen($this->params['scope']) > 2){
-            $view->params[0] = $this->visible_only ? "c.visible=1" : "1";
-            $view->params[1] = "%" . $this->trim($this->params['scope']) . "%";
-            $view->params[2] = $and_clause . $clause;
-            $snap = new DbSnapshot($view->get_query("view:SEM_TREE_SEARCH_SEM"));
-            if ($this->found_rows === false){
-                $this->search_result = $snap;
-            } else {
-                $this->search_result->mergeSnapshot($snap,"seminar_id",$combination);
-            }
-            $this->found_rows = $this->search_result->numRows;
-        }
-        return $this->found_rows;
+        $stmt = $db->prepare(
+            sprintf(
+                'SELECT `seminar_id` FROM `seminare` %s WHERE %s',
+                implode(' ', $join_sql),
+                implode(' AND ', $where_sql)
+            )
+        );
+        $stmt->execute($sql_params);
+        return $stmt->fetchAll();
     }
 
-    public function getSearchResultAsArray(){
-        if($this->search_result instanceof DBSnapshot && $this->search_result->numRows){
-            return array_unique($this->search_result->getRows('seminar_id'));
-        } else {
-            return [];
-        }
-    }
 
     private function trim($what)
     {
diff --git a/lib/classes/searchtypes/SeminarSearch.php b/lib/classes/searchtypes/SeminarSearch.php
index fd7bf8a090e4a99463978129bc122a60e949f535..0cefedf0f477c869dc1d736c0f7d8343c5c4a9c6 100644
--- a/lib/classes/searchtypes/SeminarSearch.php
+++ b/lib/classes/searchtypes/SeminarSearch.php
@@ -57,8 +57,7 @@ class SeminarSearch extends SearchType
              !(is_object($GLOBALS['perm'])
                  && $GLOBALS['perm']->have_perm(
                      Config::Get()->SEM_VISIBILITY_PERM)));
-         $search_helper->doSearch();
-         $result = $search_helper->getSearchResultAsArray();
+         $result = $search_helper->doSearch();
 
          if (empty($result)) {
              return [];
diff --git a/lib/dbviews/range_tree.view.php b/lib/dbviews/range_tree.view.php
deleted file mode 100644
index 913330dcf7690ff5c8bdc93ea07874f6303c696a..0000000000000000000000000000000000000000
--- a/lib/dbviews/range_tree.view.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-// +---------------------------------------------------------------------------+
-// This file is part of Stud.IP
-// range_tree.view.php
-// Database views used with "range_tree"
-//
-// Copyright (c) 2002 André Noack <noack@data-quest.de>
-// Suchi & Berg GmbH <info@data-quest.de>
-// +---------------------------------------------------------------------------+
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or any later version.
-// +---------------------------------------------------------------------------+
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// +---------------------------------------------------------------------------+
-
-$sem_start_times = [];
-foreach (Semester::findAllVisible() as $key => $value){
-    if (isset($value['beginn']) && $value['beginn'])
-      $sem_start_times[] = $value['beginn'];
-}
-
-$_views = [];
-
-$_views['sem_number_sql'] = "INTERVAL(start_time," . join(",",$sem_start_times) .")";
-$_views['sem_number_end_sql'] = "IF(duration_time=-1,-1,INTERVAL(start_time+duration_time," . join(",",$sem_start_times) ."))";
-
-$_views["TREE_KIDS"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT item_id FROM range_tree WHERE parent_id=? ORDER BY priority"];
-$_views["TREE_GET_DATA"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT a.*, b.Name AS studip_object_name, b.fakultaets_id FROM range_tree a
-                                    LEFT JOIN Institute b ON (a.studip_object_id = b.Institut_id) ORDER BY priority"];
-$_views["TREE_GET_SEM_ENTRIES"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT item_id,count(d.Seminar_id) AS entries FROM range_tree a
-                                    INNER JOIN seminar_inst c ON (a.studip_object_id = c.institut_id)
-                                     INNER JOIN seminare d ON(c.seminar_id=d.Seminar_id  §) § GROUP BY a.item_id"];
-
-$_views["TREE_OBJECT_NAME"] = ["pk"=>"","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT Name FROM § WHERE § LIKE ? "];
-$_views["TREE_OBJECT_DETAIL"] = ["pk"=>"","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT * FROM § WHERE § LIKE ? "];
-$_views["TREE_OBJECT_CAT"] = ["pk"=>"kategorie_id","temp_table_type"=>"MyISAM",
-                            "query"=>"SELECT * FROM kategorien WHERE range_id LIKE ? ORDER BY priority"];
-$_views["TREE_INST_STATUS"] = ["pk"=>"","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT Institut_id FROM user_inst WHERE Institut_id IN(&) AND user_id=? AND inst_perms='admin'"];
-$_views["TREE_FAK_STATUS"] = ["pk"=>"","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT b.fakultaets_id,a.Institut_id FROM user_inst a LEFT JOIN Institute b ON(a.Institut_id = b.Institut_id AND b.Institut_id=b.fakultaets_id) WHERE a.Institut_id IN(&) AND NOT ISNULL(b.Institut_id) AND user_id=? AND inst_perms='admin'"];
-$_views["TREE_ITEMS_OBJECT"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT item_id FROM range_tree WHERE studip_object_id LIKE ?"];
-
-$_views["TREE_UPD_PRIO"] = ["query" => "UPDATE range_tree SET priority=§ WHERE item_id=?"];
-$_views["TREE_INS_ITEM"] = ["query" => "INSERT INTO range_tree (item_id,parent_id,name,priority,studip_object,studip_object_id) VALUES (?,?,?,§,?,?)"];
-$_views["TREE_UPD_ITEM"] = ["query" => "UPDATE range_tree SET name=?, studip_object=?, studip_object_id=? WHERE item_id=?"];
-$_views["TREE_MOVE_ITEM"] = ["query" => "UPDATE range_tree SET parent_id=?, priority=§ WHERE item_id=?"];
-$_views["TREE_DEL_ITEM"] = ["query" => "DELETE FROM range_tree WHERE item_id IN (&)"];
-
-$_views["TREE_SEARCH_INST"] = ["query" => "SELECT Name,Institut_id FROM Institute WHERE fakultaets_id!=Institut_id AND Name LIKE '%§%'"];
-$_views["TREE_SEARCH_FAK"] = ["query" => "SELECT Name,Institut_id AS Fakultaets_id FROM Institute WHERE fakultaets_id=Institut_id AND Name LIKE '%§%'"];
-$_views["TREE_SEARCH_ITEM"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT a.item_id FROM range_tree a LEFT JOIN Institute b ON (a.studip_object_id = b.Institut_id) WHERE a.name LIKE ? OR b.Name LIKE ? "];
-$_views["TREE_SEARCH_USER"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT rt.item_id FROM auth_user_md5 a LEFT JOIN user_inst b ON (a.user_id=b.user_id AND b.inst_perms!='user')
-LEFT JOIN range_tree rt ON (rt.studip_object_id=b.Institut_id ) WHERE NOT ISNULL(rt.item_id) AND (CONCAT(a.username,' ',a.Vorname,' ',a.Nachname) LIKE ? OR CONCAT(a.Nachname, ', ', a.Vorname) LIKE ?)"];
-$_views["TREE_SEARCH_SEM"] = ["pk"=>"item_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT rt.item_id FROM seminare a LEFT JOIN seminar_inst b USING (Seminar_id)LEFT JOIN range_tree rt ON (rt.studip_object_id=b.institut_id)
-                            WHERE NOT ISNULL(rt.item_id) AND a.Name LIKE ?"];
-
-
-$_views["CAT_UPD_PRIO"] = ["query" => "UPDATE kategorien SET priority=§,chdate=UNIX_TIMESTAMP() WHERE kategorie_id=?"];
-$_views["CAT_UPD_CONTENT"] = ["query" => "UPDATE kategorien SET name=?, content=?, chdate=UNIX_TIMESTAMP() WHERE kategorie_id=?"];
-$_views["CAT_INS_ALL"] = ["query" => "INSERT INTO kategorien (kategorie_id,range_id,name,content,priority,mkdate,chdate)VALUES (?,?,?,?,§,UNIX_TIMESTAMP(),UNIX_TIMESTAMP())"];
-$_views["CAT_DEL"] = ["query" => "DELETE FROM kategorien WHERE kategorie_id IN (&)"];
-$_views["CAT_DEL_RANGE"] = ["query" => "DELETE FROM kategorien WHERE range_id IN (&)"];
-
-$_views["STATUS_COUNT"] = ["query"=>"SELECT count(DISTINCT user_id) AS anzahl FROM statusgruppen LEFT JOIN statusgruppe_user USING(statusgruppe_id) WHERE range_id=?"];
-
-return $_views;
diff --git a/lib/dbviews/sem_tree.view.php b/lib/dbviews/sem_tree.view.php
deleted file mode 100644
index 8980e718c116a94b08ffe358cae1d4fa36e288ad..0000000000000000000000000000000000000000
--- a/lib/dbviews/sem_tree.view.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?
-# Lifter002: TODO
-# Lifter007: TODO
-# Lifter003: TODO
-# Lifter010: TODO
-// +---------------------------------------------------------------------------+
-// This file is part of Stud.IP
-// sem_tree.view.php
-// Database views used with "sem_tree"
-//
-// Copyright (c) 2003 André Noack <noack@data-quest.de>
-// Suchi & Berg GmbH <info@data-quest.de>
-// +---------------------------------------------------------------------------+
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or any later version.
-// +---------------------------------------------------------------------------+
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-// +---------------------------------------------------------------------------+
-
-$sem_start_times = [];
-foreach (Semester::findAllVisible() as $key => $value){
-    if (isset($value['beginn']) && $value['beginn'])
-      $sem_start_times[] = $value['beginn'];
-}
-
-$_views = [];
-$_views['sem_number_sql'] = "INTERVAL(start_time," . join(",",$sem_start_times) .")";
-$_views['sem_number_end_sql'] = "IF(duration_time=-1,-1,INTERVAL(start_time+duration_time," . join(",",$sem_start_times) ."))";
-
-$_views["SEM_TREE_GET_DATA_NO_ENTRIES"] = ["pk"=>"sem_tree_id","temp_table_type"=>"HEAP",
-                            "query"=>"SELECT a.*
-                             FROM sem_tree a
-                            ORDER BY priority"];
-$_views["SEM_TREE_GET_ENTRIES"] = ["pk"=>"sem_tree_id","temp_table_type"=>"HEAP",
-                            "query" => "SELECT st.sem_tree_id, count(b.Seminar_id) AS entries
-                                FROM seminare b INNER JOIN seminar_sem_tree st ON(st.seminar_id = b.Seminar_id)
-                                    WHERE b.status IN(&) AND §
-                                    GROUP BY st.sem_tree_id ORDER BY NULL"];
-$_views["SEM_TREE_GET_SEMIDS"] = ["pk"=>"seminar_id","temp_table_type"=>"HEAP",
-                            "query" => "SELECT  b.seminar_id, " . $_views['sem_number_sql'] . " AS sem_number, " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminar_sem_tree b INNER JOIN seminare c ON(b.seminar_id=c.Seminar_id AND c.status IN(&) AND §) WHERE sem_tree_id IN(&) §"];
-$_views["SEM_TREE_GET_SEMIDS_ROOT"] = ["pk"=>"seminar_id","temp_table_type"=>"HEAP",
-                            "query" => "SELECT  b.seminar_id, " . $_views['sem_number_sql'] . " AS sem_number, " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminar_sem_tree b INNER JOIN seminare c ON(b.seminar_id=c.Seminar_id AND c.status IN(&) AND §) WHERE 1 §"];
-
-$_views["SEM_TREE_GET_SEMDATA"] = ["query" => "SELECT a.seminar_id,IF(b.visible=0,CONCAT(Name, ' "._("(versteckt)")."'), Name) AS Name,username AS doz_uname, Nachname AS doz_name, " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end
-                                        FROM seminar_sem_tree a INNER JOIN seminare b ON(a.seminar_id=b.Seminar_id AND b.status IN(&) AND §) LEFT JOIN seminar_user c ON (b.seminar_id=c.seminar_id AND c.status='dozent' )
-                                        LEFT JOIN auth_user_md5 USING(user_id) WHERE sem_tree_id IN(&)  § ORDER BY sem_number DESC,Name ASC"];
-$_views["SEM_TREE_GET_SEMDATA_ROOT"] = ["query" => "SELECT a.seminar_id,IF(b.visible=0,CONCAT(Name, ' "._("(versteckt)")."'), Name) AS Name,username AS doz_uname, Nachname AS doz_name, " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end
-                                        FROM seminar_sem_tree a INNER JOIN seminare b ON(a.seminar_id=b.Seminar_id AND b.status IN(&) AND §) LEFT JOIN seminar_user c ON (b.seminar_id=c.seminar_id AND c.status='dozent' )
-                                        LEFT JOIN auth_user_md5 USING(user_id) WHERE 1 § ORDER BY sem_number DESC,Name ASC"];
-
-$_views["SEM_TREE_GET_NUM_SEM"] = ["query" => "SELECT count(DISTINCT(seminar_id)) , " . $_views['sem_number_sql'] . " AS sem_number, " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminar_sem_tree
-                                                    LEFT JOIN seminare USING (seminar_id) WHERE sem_tree_id IN(&) §"];
-
-$_views["SEM_TREE_GET_LONELY_SEM_DATA"] = ["query" => "SELECT d.Seminar_id AS seminar_id,IF(d.visible=0,CONCAT(d.Name, ' "._("(versteckt)")."'), d.Name) AS Name, " . $_views['sem_number_sql'] . " AS sem_number, " . $_views['sem_number_end_sql'] . " AS sem_number_end ,username AS doz_uname, Nachname AS doz_name
-                                        FROM Institute a LEFT JOIN seminar_inst b USING(Institut_id)  INNER JOIN seminare d ON(b.seminar_id=d.Seminar_id AND d.status IN(&) AND §) LEFT JOIN seminar_user e ON (d.Seminar_id = e.seminar_id AND e.status='dozent')
-                                        LEFT JOIN auth_user_md5 USING(user_id) LEFT JOIN seminar_sem_tree c ON (c.seminar_id=b.seminar_id)
-                                        WHERE ISNULL(c.sem_tree_id)
-                                        AND a.fakultaets_id LIKE ? AND NOT ISNULL(b.seminar_id)  GROUP BY d.Seminar_id § ORDER BY sem_number DESC,d.Name ASC"];
-$_views["SEM_TREE_GET_NUM_LONELY_SEM"] = ["query" => "SELECT COUNT(DISTINCT(b.seminar_id)) AS num_sem , " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM Institute a LEFT JOIN seminar_inst b USING(Institut_id)
-                                        INNER JOIN seminare d ON(b.seminar_id=d.Seminar_id AND d.status IN(&) AND §)  LEFT JOIN seminar_sem_tree c ON(c.seminar_id=d.Seminar_id)
-                                        WHERE ISNULL(c.sem_tree_id)
-                                        AND a.fakultaets_id LIKE ? AND NOT ISNULL(b.seminar_id) GROUP BY sem_number,sem_number_end § "];
-$_views["SEM_TREE_GET_LONELY_FAK"] = ["query" => "SELECT Institut_id,a.Name FROM Institute a LEFT JOIN sem_tree b ON(studip_object_id=Institut_id) WHERE Institut_id = fakultaets_id AND ISNULL(studip_object_id) ORDER BY a.Name"];
-$_views["SEM_TREE_UPD_PRIO"] = ["query" => "UPDATE sem_tree SET priority=§ WHERE sem_tree_id=?"];
-$_views["SEM_TREE_INS_ITEM"] = ["query" => "INSERT INTO sem_tree (sem_tree_id,parent_id,name,priority,info,studip_object_id,type) VALUES (?,?,?,?,?,?,?)"];
-$_views["SEM_TREE_UPD_ITEM"] = ["query" => "UPDATE sem_tree SET name=?, info=?, type=? WHERE sem_tree_id=?"];
-$_views["SEM_TREE_DEL_ITEM"] = ["query" => "DELETE FROM sem_tree WHERE sem_tree_id IN (&)"];
-$_views["SEM_TREE_MOVE_ITEM"] = ["query" => "UPDATE sem_tree SET parent_id=?, priority=§ WHERE sem_tree_id=?"];
-$_views["SEM_TREE_SEARCH_SEM"] = ["query" => "SELECT b.seminar_id, " . $_views['sem_number_sql'] . " AS sem_number, " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM sem_tree a LEFT JOIN seminar_sem_tree b USING(sem_tree_id)
-                                                    LEFT JOIN seminare c USING(seminar_id)
-                                                    WHERE § AND NOT ISNULL(b.seminar_id) AND a.name LIKE ? §"];
-$_views["SEM_TREE_CHECK_PERM"] = ["query" => "SELECT inst_perms FROM user_inst WHERE inst_perms='admin' AND user_id=? AND Institut_id=?"];
-$_views["SEM_TREE_SEARCH_ITEM"] = ["query" => "SELECT a.sem_tree_id,a.parent_id FROM sem_tree a LEFT JOIN sem_tree b ON(a.sem_tree_id=b.parent_id) WHERE a.name LIKE ? AND ISNULL(b.sem_tree_id) AND a.sem_tree_id NOT IN(&)"];
-
-$_views["SEMINAR_SEM_TREE_DEL_RANGE"] = ["query" => "DELETE FROM seminar_sem_tree WHERE sem_tree_id IN (&)"];
-$_views["SEMINAR_SEM_TREE_DEL_SEM_RANGE"] = ["query" => "DELETE FROM seminar_sem_tree WHERE sem_tree_id IN (&) AND seminar_id IN (&)"];
-$_views["SEMINAR_SEM_TREE_DEL_SEMID_RANGE"] = ["query" => "DELETE FROM seminar_sem_tree WHERE seminar_id IN (&)"];
-$_views["SEMINAR_SEM_TREE_INS_ITEM"] = ["query" => "INSERT IGNORE INTO seminar_sem_tree (seminar_id,sem_tree_id) VALUES (?,?)"];
-$_views["SEMINAR_SEM_TREE_GET_IDS"] = ["query" => "SELECT DISTINCT a.sem_tree_id,b.parent_id FROM seminar_sem_tree a INNER JOIN sem_tree b USING(sem_tree_id) WHERE seminar_id=? ORDER BY parent_id,priority"];
-$_views["SEMINAR_SEM_TREE_GET_EXP_IDS"] = ["query" => "SELECT DISTINCT b.sem_tree_id,c.parent_id FROM seminare a LEFT JOIN seminar_sem_tree b USING(seminar_id) LEFT JOIN sem_tree c USING(sem_tree_id) WHERE a.Institut_id=? AND b.sem_tree_id NOT IN(&)"];
-
-
-$_views["SEMINAR_GET_SEMDATA"] = ["query" => "SELECT a.seminar_id,IF(a.visible=0,CONCAT(Name, ' "._("(versteckt)")."'), Name) AS Name,username AS doz_uname, Nachname AS doz_name, " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end
-                                        FROM seminare a LEFT JOIN seminar_user b ON (a.seminar_id=b.seminar_id AND b.status='dozent' )
-                                        LEFT JOIN auth_user_md5 USING(user_id) WHERE a.seminar_id IN (&) ORDER BY sem_number DESC,Name ASC"];
-$_views["SEM_SEARCH_LECTURER"] = ["query" => "SELECT user_id FROM auth_user_md5 WHERE perms = 'dozent' AND (username LIKE ? OR Vorname LIKE ? OR Nachname LIKE ? OR CONCAT(Vorname, ' ', Nachname) LIKE ? OR CONCAT(Nachname, ', ', Vorname) LIKE ?)"];
-$_views["SEM_SEARCH_LECTURER_ID"] = ["query" => "SELECT b.seminar_id, " . $_views['sem_number_sql'] . " AS sem_number, " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminar_user b
-                                                    INNER JOIN seminare c USING (seminar_id) WHERE § AND b.status='dozent' AND b.user_id IN (&) §"];
-$_views["SEM_SEARCH_SEM"] = ["query" =>"SELECT c.seminar_id, " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminare c WHERE § §"];
-$_views["SEM_GET_FAKS"] = ["query" => "SELECT DISTINCT b.fakultaets_id,d.sem_tree_id FROM seminar_inst a LEFT JOIN  Institute b USING(Institut_id) LEFT JOIN sem_tree d ON (b.fakultaets_id=d.studip_object_id) WHERE a.seminar_id=?"];
-$_views["SEM_GET_INST"] = ["query" => "SELECT institut_id FROM seminar_inst WHERE seminar_id=?"];
-$_views["SEM_TREE_GET_FAK"] = ["query" => "SELECT DISTINCT sem_tree_id FROM Institute LEFT JOIN sem_tree ON (fakultaets_id=studip_object_id) WHERE Institut_id IN (&) AND NOT ISNULL(sem_tree_id)"];
-
-
-$_views["SEM_INST_GET_SEM"] = ["query" => "SELECT c.Seminar_id, " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminar_inst a LEFT JOIN seminare c USING (seminar_id) WHERE a.Institut_id IN (&) AND c.Seminar_id IS NOT NULL
-                                                § § "];
-
-$_views["SEM_USER_GET_SEM"] = ["query" =>"SELECT b.Seminar_id,b.Name, " . $_views['sem_number_sql'] . " AS sem_number , " . $_views['sem_number_end_sql'] . " AS sem_number_end FROM seminar_user a LEFT JOIN seminare b USING(Seminar_id)
-                                            WHERE b.visible=1 AND a.user_id=? AND a.status=?  §"];
-
-return $_views;
diff --git a/tests/unit/lib/classes/MarkupClassTest.php b/tests/unit/lib/classes/MarkupClassTest.php
index cba00099d61e19ce88344503c5f250c18df7a289..8dad6e9954746c220a207cf96d34ba9f3c154c6c 100644
--- a/tests/unit/lib/classes/MarkupClassTest.php
+++ b/tests/unit/lib/classes/MarkupClassTest.php
@@ -20,9 +20,6 @@
  */
 require_once 'tests/unit/fakeserver.php';
 
-# needed by visual.inc.php
-require_once 'lib/classes/DbView.php';
-
 # needed by Markup.php
 require_once 'lib/visual.inc.php';
 require_once 'lib/classes/Config.php';