Aktualisierung des Frameworks
authorMarkus Bröker <broeker.markus@googlemail.com>
Thu, 12 Nov 2015 21:59:18 +0100
changeset 1 56e0dbd5c243
parent 0 4869aea77e21
child 2 40769b11e94f
Aktualisierung des Frameworks * find, store und delete beziehen sich auf den aktuellen Datensatz * namespaces werden effizienter genutzt
classes/bfw/DBInterface.php
classes/bfw/Database.php
classes/bfw/Dispatcher.php
classes/bfw/Request.php
classes/bfw/Response.php
classes/bfw/database/DBInterface.php
classes/bfw/database/Database.php
classes/bfw/mvc/common/Controller.php
classes/bfw/mvc/common/Model.php
classes/bfw/mvc/common/View.php
classes/bfw/mvc/controller/BenutzerverwaltungController.php
classes/bfw/mvc/controller/BenutzerverwaltungsController.php
classes/bfw/mvc/controller/Controller.php
classes/bfw/mvc/controller/ErrorController.php
classes/bfw/mvc/controller/HistoryController.php
classes/bfw/mvc/controller/HomeController.php
classes/bfw/mvc/controller/TicketsController.php
classes/bfw/mvc/model/Model.php
classes/bfw/mvc/model/TAction.php
classes/bfw/mvc/model/TGroup.php
classes/bfw/mvc/model/THistory.php
classes/bfw/mvc/model/TStatus.php
classes/bfw/mvc/model/TText.php
classes/bfw/mvc/model/TTicket.php
classes/bfw/mvc/model/TUser.php
classes/bfw/mvc/model/TView.php
classes/bfw/mvc/view/View.php
--- a/classes/bfw/Dispatcher.php
+++ b/classes/bfw/Dispatcher.php
@@ -1,81 +1,86 @@
 <?php
 
-namespace bfw {
+namespace bfw;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+
+use bfw\mvc\common\Controller;
+use bfw\mvc\common\View;
+use ReflectionClass;
+
+class Dispatcher {
+    private $request;
+
+    public function __construct() {
+        $this->request = new Request();
+    }
 
     /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+     * @param $url
+     */
+    public static function route($url) {
+        header(sprintf("Location: %s", $url));
+        exit(0);
+    }
+
+    /**
+     * <b>Standard Request Handler für das Projekt</b>
+     *
+     * Diese Instanz kümmert sich selbständig um die GET- und POST Werte und
+     * speichert diese in der Session.
+     *
+     * Einfach zu nutzende Methoden(Schnittstelle zur Session) komplettieren diesen Handler
+     *
+     * @return Request
+     */
+    public function getRequest() {
+        return $this->request;
+    }
+
+    /**
+     * <b>Führt den jeweiligen Controller aus und liefert ein View zurück</b>
      *
      */
-
-    use bfw\mvc\controller\Controller as Controller;
-    use bfw\mvc\view\View as View;
-
-    class Dispatcher {
-        private $request;
-
-        public function __construct() {
-            $this->request = new Request();
-        }
+    public function getView() {
+        $controllerName = $this->request->get('controller');
+        $action = $this->request->get('action');
 
-        /**
-         * <b>Standard Request Handler für das Projekt</b>
-         *
-         * Diese Instanz kümmert sich selbständig um die GET- und POST Werte und
-         * speichert diese in der Session.
-         *
-         * Einfach zu nutzende Methoden(Schnittstelle zur Session) komplettieren diesen Handler
-         *
-         * @return Request
-         */
-        public function getRequest() {
-            return $this->request;
+        $this->request->keepRequestData();
+
+        if ($controllerName == '') {
+            $controllerName = 'home';
         }
 
-        /**
-         * <b>Führt den jeweiligen Controller aus und liefert ein View zurück</b>
-         *
-         */
-        public function getView() {
-            $page = $this->request->get('page');
-            $this->request->keepRequestData();
-
-            if ($page == '') {
-                $page = 'home';
-            }
-
-            try {
-                $class = Controller::mapControllerName($page);
-                $args = Controller::getArgsForController($class);
-
-                $reflection = new \ReflectionClass($class);
-                $controller = $reflection->newInstanceArgs($args);
-
-                $prefix = str_replace('bfw\mvc\controller\\', '', strtolower($class));
-                $controller->setPrefix(str_replace('controller', '', $prefix));
-
-                // Mapping vom GET-Parameter 'page' auf Controller::$page()
-                if ($reflection->hasMethod($page)) {
-                    $controller->$page();
-                } else {
-                    $controller->index();
-                }
-            } catch (Exception $e) {
-                $controller = new ErrorController(new TView('NON_EXISTENT'), $this->request);
-            }
-
-            $view = new View($controller, $controller->getModel());
-            $view->assign('page', sprintf('%s/%s', $controller->getPrefix(), $page));
-
-            return $view;
+        if ($action == '') {
+            $action = 'index';
         }
 
-        /**
-         * @param $url
-         */
-        public static function route($url) {
-            header(sprintf("Location: %s", $url));
-            exit(0);
+        try {
+            $class = Controller::mapControllerName($controllerName);
+
+            $reflection = new ReflectionClass($class);
+            $controller = $reflection->newInstance();
+
+            $prefix = str_replace('bfw\mvc\controller\\', '', strtolower($class));
+            $controller->setPrefix(str_replace('controller', '', $prefix));
+
+            // Mapping vom GET-Parameter 'action' auf Controller::$action()
+            if ($reflection->hasMethod($action)) {
+                $controller->$action();
+            } else {
+                $controller->index();
+            }
+        } catch (Exception $e) {
+            $controller = new ErrorController(new TView('NON_EXISTENT'), $this->request);
         }
 
+        $view = new View($controller, $controller->getModel());
+        $view->assign('action', sprintf('%s/%s', $controller->getPrefix(), $action));
+
+        return $view;
     }
+
 }
\ No newline at end of file
--- a/classes/bfw/Request.php
+++ b/classes/bfw/Request.php
@@ -1,249 +1,249 @@
 <?php
 
-namespace bfw {
+namespace bfw;
+
+use bfw\mvc\model\TGroup;
+use bfw\mvc\model\TUser;
+use Logger;
 
-    use bfw\mvc\model\TGroup as TGroup;
-    use bfw\mvc\model\TUser as TUser;
+/**
+ * Class Request
+ */
+class Request {
+    private static $logger = null;
+
+    public function __construct() {
+        self::$logger = Logger::getLogger('__CLASS__');
+
+        $this->initSession();
+    }
 
     /**
-     * Class Request
+     * <b>Initialisiert die Session für das jeweilige Projekt</b>
+     *
+     *
      */
-    class Request {
-        private static $logger = null;
-
-        public function __construct() {
-            self::$logger = \Logger::getLogger('__CLASS__');
-
-            $this->initSession();
-        }
-
-        /**
-         * Liefert die Basis-URL des jeweiligen Projekts
-         *
-         * @return string
-         */
-        public static function getBaseUrl() {
-            return sprintf("%s://%s",
-                isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
-                $_SERVER['SERVER_NAME']
+    public function initSession() {
+        if (!isset($_SESSION['prefix'])) {
+            $_SESSION['prefix'] = array(
+                'get' => array(),
+                'session' => array(),
+                'isLoggedIn' => false,
+                'user_id' => TUser::SYSTEM,
+                'group_id' => TGroup::GUEST,
+                'fehler' => 'Tickets for Free!',
+                'msg' => 'Tickets for Free!',
+                'lastpage' => 'home',
             );
         }
+    }
 
-        /**
-         * Liefert die komplette URL des jeweiligen Requests
-         *
-         * @return string
-         */
-        public static function getUrl() {
-            return sprintf("%s%s", self::getBaseUrl(), $_SERVER['REQUEST_URI']);
-        }
+    /**
+     * Liefert die komplette URL des jeweiligen Requests
+     *
+     * @return string
+     */
+    public static function getUrl() {
+        return sprintf("%s%s", self::getBaseUrl(), $_SERVER['REQUEST_URI']);
+    }
 
-        /**
-         * Keine Warnung, keine Gnade
-         */
-        public function destroySession() {
-            unset($_SESSION['prefix']);
-            @session_destroy();
+    /**
+     * Liefert die Basis-URL des jeweiligen Projekts
+     *
+     * @return string
+     */
+    public static function getBaseUrl() {
+        return sprintf("%s://%s",
+            isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
+            $_SERVER['SERVER_NAME']
+        );
+    }
 
-            $this->initSession();
+    /**
+     * <b>Liefert einen gefilterten 'session' Wert
+     *
+     * Hierbei handelt es sich um einen zuvor gespeicherten POST-Wert,
+     * der in ['prefix']['session'] geladet ist...
+     *
+     * @param $param
+     * @param string $default
+     * @return string
+     */
+    public static function session($param, $default = '') {
+        if (isset($_SESSION['prefix']['session'][$param])) {
+            return $_SESSION['prefix']['session'][$param];
         }
 
-        /**
-         * <b>Initialisiert die Session für das jeweilige Projekt</b>
-         *
-         *
-         */
-        public function initSession() {
-            if (!isset($_SESSION['prefix'])) {
-                $_SESSION['prefix'] = array(
-                    'get' => array(),
-                    'session' => array(),
-                    'isLoggedIn' => false,
-                    'user_id' => TUser::SYSTEM,
-                    'group_id' => TGroup::GUEST,
-                    'fehler' => 'Tickets for Free!',
-                    'msg' => 'Tickets for Free!',
-                    'lastpage' => 'home',
-                );
-            }
+        return $default;
+    }
+
+    /**
+     * <b>Liefert einen gefilterten 'get' Wert
+     *
+     * Hierbei handelt es sich um einen zuvor gespeicherten POST-Wert,
+     * der in ['prefix']['session'] geladet ist...
+     *
+     * @param $param
+     * @param string $default
+     * @return string
+     */
+    public static function getParameter($param, $default = '') {
+        if (isset($_SESSION['prefix']['get'][$param])) {
+            return $_SESSION['prefix']['get'][$param];
         }
 
-        /**
-         * <b>Bei jedem Seitenaufruf werden die GET/Post Anfragen in der Session separiert gespeichert</b>
-         *
-         * Struktur:
-         *    GET Sachen ins 'get' array
-         *   POST Sachen ins 'session' array
-         */
-        public function keepRequestData() {
-            foreach ($_GET as $key => $value) {
-                $filteredKey = $this->filter($key);
-                $filteredValue = $this->filter($value);
+        return $default;
+    }
 
-                $_SESSION['prefix']['get'][$filteredKey] = $filteredValue;
-            }
-
-            foreach ($_POST as $key => $value) {
-                $filteredKey = $this->filter($key);
-                $filteredValue = $this->filter($value);
-
-                $_SESSION['prefix']['session'][$filteredKey] = $filteredValue;
-            }
+    /**
+     * <b>Holt einen Session Wert aus dem jeweiligen Prefix</b>
+     *
+     * @param $key
+     * @param string $default
+     * @param null $storage
+     * @return string
+     */
+    public static function getKey($key, $default = '', $storage = null) {
+        if ($storage != null) {
+            return $_SESSION['prefix'][$storage][$key];
         }
 
-        /**
-         * <b>Statische Filtermethode für beliebige Strings/Array of Strings</b>
-         *
-         * filter_input kann nur mit GET/POST umgehen, diese Methode mit Allem.
-         *
-         * @param string $param
-         * @return string|array
-         */
-        public static function filter($param) {
-            if (is_array($param)) {
-                $filtered = array();
-                foreach ($param as $key => $value) {
-                    $filtered[self::filter($key)] = self::filter($value);
-                }
-
-                return $filtered;
-            }
-
-            return htmlspecialchars($param, ENT_QUOTES, 'utf-8');
-        }
-
-        /**
-         * <b>Liefert einen gefilterten GET-Wert</b>
-         *
-         * @param $param
-         * @return string
-         */
-        public function get($param) {
-            return filter_input(INPUT_GET, $param);
+        if (isset($_SESSION['prefix'][$key])) {
+            return $_SESSION['prefix'][$key];
         }
 
-        /**
-         * <b>Liefert einen gefilterten POST-Wert</b>
-         *
-         * @param $param
-         * @return mixed|string
-         */
-        public function post($param) {
-            return filter_input(INPUT_POST, $param);
-        }
+        return $default;
+    }
 
-        /**
-         * <b>Liefert einen gefilterten 'session' Wert
-         *
-         * Hierbei handelt es sich um einen zuvor gespeicherten POST-Wert,
-         * der in ['prefix']['session'] geladet ist...
-         *
-         * @param $param
-         * @param string $default
-         * @return string
-         */
-        public static function session($param, $default = '') {
-            if (isset($_SESSION['prefix']['session'][$param])) {
-                return $_SESSION['prefix']['session'][$param];
-            }
+    /**
+     * <b>Löscht einen Get-Wert aus dem jeweiligen Prefix</b>
+     *
+     * @param $key
+     */
+    public static function deleteParameterKey($key) {
+        unset($_SESSION['prefix']['get'][$key]);
+    }
 
-            return $default;
-        }
+    /**
+     * <b>Löscht einen Session Wert aus dem jeweiligen Prefix</b>
+     *
+     * @param $key
+     */
+    public static function deleteKey($key) {
+        unset($_SESSION['prefix'][$key]);
+    }
 
-        /**
-         * <b>Liefert einen gefilterten 'get' Wert
-         *
-         * Hierbei handelt es sich um einen zuvor gespeicherten POST-Wert,
-         * der in ['prefix']['session'] geladet ist...
-         *
-         * @param $param
-         * @param string $default
-         * @return string
-         */
-        public static function getParameter($param, $default = '') {
-            if (isset($_SESSION['prefix']['get'][$param])) {
-                return $_SESSION['prefix']['get'][$param];
-            }
+    /**
+     * <b>Prüft, ob der aktuelle Request einen POST enthält</b>
+     *
+     * @return bool
+     */
+    public static function hasPost() {
+        return (isset($_POST));
+    }
+
+    /**
+     * Keine Warnung, keine Gnade
+     */
+    public function destroySession() {
+        unset($_SESSION['prefix']);
+        @session_destroy();
 
-            return $default;
-        }
+        $this->initSession();
+    }
 
-        /**
-         * <b>Setzt einen neuen Session Wert ins jeweilige Prefix</b>
-         *
-         * @param $key
-         * @param $value
-         */
-        public function setKey($key, $value, $storage = null) {
-            if ($storage != null) {
-                $_SESSION['prefix'][$storage][self::filter($key)] = self::filter($value);
-            } else {
-                $_SESSION['prefix'][self::filter($key)] = self::filter($value);
-            }
+    /**
+     * <b>Bei jedem Seitenaufruf werden die GET/Post Anfragen in der Session separiert gespeichert</b>
+     *
+     * Struktur:
+     *    GET Sachen ins 'get' array
+     *   POST Sachen ins 'session' array
+     */
+    public function keepRequestData() {
+        foreach ($_GET as $key => $value) {
+            $filteredKey = $this->filter($key);
+            $filteredValue = $this->filter($value);
+
+            $_SESSION['prefix']['get'][$filteredKey] = $filteredValue;
         }
 
-        /**
-         * <b>Holt einen Session Wert aus dem jeweiligen Prefix</b>
-         *
-         * @param $key
-         * @param string $default
-         * @param null $storage
-         * @return string
-         */
-        public static function getKey($key, $default = '', $storage = null) {
-            if ($storage != null) {
-                return $_SESSION['prefix'][$storage][$key];
+        foreach ($_POST as $key => $value) {
+            $filteredKey = $this->filter($key);
+            $filteredValue = $this->filter($value);
+
+            $_SESSION['prefix']['session'][$filteredKey] = $filteredValue;
+        }
+    }
+
+    /**
+     * <b>Statische Filtermethode für beliebige Strings/Array of Strings</b>
+     *
+     * filter_input kann nur mit GET/POST umgehen, diese Methode mit Allem.
+     *
+     * @param string $param
+     * @return string|array
+     */
+    public static function filter($param) {
+        if (is_array($param)) {
+            $filtered = array();
+            foreach ($param as $key => $value) {
+                $filtered[self::filter($key)] = self::filter($value);
             }
 
-            if (isset($_SESSION['prefix'][$key])) {
-                return $_SESSION['prefix'][$key];
-            }
-
-            return $default;
-        }
-
-        /**
-         * <b>Löscht einen Get-Wert aus dem jeweiligen Prefix</b>
-         *
-         * @param $key
-         */
-        public static function deleteParameterKey($key) {
-            unset($_SESSION['prefix']['get'][$key]);
+            return $filtered;
         }
 
-        /**
-         * <b>Löscht einen Session Wert aus dem jeweiligen Prefix</b>
-         *
-         * @param $key
-         */
-        public static function deleteKey($key) {
-            unset($_SESSION['prefix'][$key]);
+        return htmlspecialchars($param, ENT_QUOTES, 'utf-8');
+    }
+
+    /**
+     * <b>Liefert einen gefilterten POST-Wert</b>
+     *
+     * @param $param
+     * @return mixed|string
+     */
+    public function post($param) {
+        return filter_input(INPUT_POST, $param);
+    }
+
+    /**
+     * <b>Setzt einen neuen Session Wert ins jeweilige Prefix</b>
+     *
+     * @param $key
+     * @param $value
+     */
+    public function setKey($key, $value, $storage = null) {
+        if ($storage != null) {
+            $_SESSION['prefix'][$storage][self::filter($key)] = self::filter($value);
+        } else {
+            $_SESSION['prefix'][self::filter($key)] = self::filter($value);
         }
+    }
 
-        /**
-         * <b>Prüft, ob der aktuelle Request einen POST enthält</b>
-         *
-         * @return bool
-         */
-        public static function hasPost() {
-            return (isset($_POST));
+    /**
+     * <b>Interne Debug-Funktion zum Anzeigen der Session Struktur</b>
+     *
+     * Beliebige URL mit ?debug=1 aufrufen und der Debug Mechanismus ist aktiviert.
+     *
+     * @return string
+     */
+    public function printSession() {
+        self::$logger->info(sprintf('SESSION: %s', print_r($_SESSION['prefix'], true)));
+
+        if ($this->get('debug') == '') {
+            return '';
         }
 
-        /**
-         * <b>Interne Debug-Funktion zum Anzeigen der Session Struktur</b>
-         *
-         * Beliebige URL mit ?debug=1 aufrufen und der Debug Mechanismus ist aktiviert.
-         *
-         * @return string
-         */
-        public function printSession() {
-            self::$logger->info(sprintf('SESSION: %s', print_r($_SESSION['prefix'], true)));
+        return "<br /><pre>" . print_r($_SESSION['prefix'], true) . "</pre>";
+    }
 
-            if ($this->get('debug') == '') {
-                return '';
-            }
-
-            return "<br /><pre>" . print_r($_SESSION['prefix'], true) . "</pre>";
-        }
+    /**
+     * <b>Liefert einen gefilterten GET-Wert</b>
+     *
+     * @param $param
+     * @return string
+     */
+    public function get($param) {
+        return filter_input(INPUT_GET, $param);
     }
 }
\ No newline at end of file
--- a/classes/bfw/Response.php
+++ b/classes/bfw/Response.php
@@ -1,43 +1,42 @@
 <?php
 
-namespace bfw {
+namespace bfw;
+/**
+ * Response Headers sind kompliziert
+ *
+ */
+class Response {
+    private $headers;
+    private $statusCode;
+
+    public function __construct() {
+        $this->headers = headers_list();
+        $this->statusCode = http_response_code();
+    }
+
+    public function getHeaders() {
+        return $this->headers;
+    }
+
+    public function getStatusCode() {
+        return $this->statusCode;
+    }
+
+    public function setStatusCode($statusCode) {
+        $this->statusCode = $statusCode;
+
+        return $this;
+    }
+
     /**
-     * Response Headers sind kompliziert
-     *
+     * @return string
      */
-    class Response {
-        private $headers;
-        private $statusCode;
-
-        public function __construct() {
-            $this->headers = headers_list();
-            $this->statusCode = http_response_code();
-        }
-
-        public function getHeaders() {
-            return $this->headers;
+    public function get($key) {
+        if (array_key_exists($key, $this->headers)) {
+            return $this->headers[$key];
         }
 
-        public function setStatusCode($statusCode) {
-            $this->statusCode = $statusCode;
-
-            return $this;
-        }
-
-        public function getStatusCode() {
-            return $this->statusCode;
-        }
+        return '';
+    }
 
-        /**
-         * @return string
-         */
-        public function get($key) {
-            if (array_key_exists($key, $this->headers)) {
-                return $this->headers[$key];
-            }
-
-            return '';
-        }
-
-    }
 }
\ No newline at end of file
rename from classes/bfw/DBInterface.php
rename to classes/bfw/database/DBInterface.php
--- a/classes/bfw/DBInterface.php
+++ b/classes/bfw/database/DBInterface.php
@@ -1,33 +1,33 @@
 <?php
 
-namespace bfw {
-    interface DBInterface {
+namespace bfw\database;
 
-        /* fetch methods */
-        public function fetch($table, $cond);
+interface DBInterface {
+
+    /* fetch methods */
+    public function fetch($table, $cond);
 
-        public function fetchAll($table, $cond);
+    public function fetchAll($table, $cond);
 
-        /* find methoden */
-        public function find($table, $id);
+    /* find methoden */
+    public function find($table, $id);
 
-        public function findAll($table, $sys);
+    public function findAll($table, $sys);
 
-        public function findByField($table, $field, $value);
+    public function findByField($table, $field, $value);
 
-        function findAllByField($table, $field, $value);
+    function findAllByField($table, $field, $value);
 
-        /* Abfrage Methoden */
-        public function query($sql);
+    /* Abfrage Methoden */
+    public function query($sql);
 
-        /* Persistence Methods */
-        public function persist($table, $array);
+    /* Persistence Methods */
+    public function persist($table, $array);
 
-        public function store($table, $id, $array);
+    public function store($table, $id, $array);
 
-        public function delete($table, $id);
+    public function delete($table, $id);
 
-        /* PK Management */
-        public function getLastInsertedId();
-    }
+    /* PK Management */
+    public function getLastInsertedId();
 }
\ No newline at end of file
rename from classes/bfw/Database.php
rename to classes/bfw/database/Database.php
--- a/classes/bfw/Database.php
+++ b/classes/bfw/database/Database.php
@@ -1,438 +1,320 @@
 <?php
 
-namespace bfw {
+namespace bfw\database;
+
+use Logger;
+use PDO;
+use PDOException;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+class Database implements DBInterface {
+    private static $logger = null;
+    private static $handle = null;
 
     /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
-     *
+     * @var PDO
      */
-    class Database implements DBInterface {
-        private static $logger = null;
+    private $pdo;
 
-        private $link;
-        private static $handle = null;
+    private function __construct() {
+        self::$logger = Logger::getLogger('__CLASS__');
 
-        private function __construct() {
-            self::$logger = \Logger::getLogger('__CLASS__');
-
-            $this->link = mysqli_connect($host = 'localhost', $user = 'ticketsystem', $password = 'ticketsystem', $database = 'ticketsystem');
-            mysqli_set_charset($this->link, 'utf8');
-        }
+        $dsn = 'mysql:host=localhost;dbname=ticketsystem';
+        $config = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
+        $this->pdo = new PDO($dsn, 'ticketsystem', 'ticketsystem', $config);
+    }
 
-        /**
-         * <b>Liefert das Singleton-Pattern der Datenbank-Schicht</b>
-         *
-         * Es existiert in einem Lauf, einem Scope, immer nur ein DB-Handle zur gleichen Zeit.
-         *
-         * Damit das ganze vernünftig flutscht, muss man natürlich berücksichtigen, dass ein SP state-lastig ist!
-         *
-         * Definition des States: Ein Abfrageergebnis stellt solange den State des SP da, bis eine neue Abfrage
-         * einen neuen State erzeugt.
-         *
-         * @return Database|null
-         */
-        public static function getInstance() {
-            if (self::$handle == null) {
-                self::$handle = new Database();
-            }
-
-            return self::$handle;
+    /**
+     * <b>Liefert das Singleton-Pattern der Datenbank-Schicht</b>
+     *
+     * Es existiert in einem Lauf, einem Scope, immer nur ein DB-Handle zur gleichen Zeit.
+     *
+     * Damit das ganze vernünftig flutscht, muss man natürlich berücksichtigen, dass ein SP state-lastig ist!
+     *
+     * Definition des States: Ein Abfrageergebnis stellt solange den State des SP da, bis eine neue Abfrage
+     * einen neuen State erzeugt.
+     *
+     * @return Database
+     */
+    public static function getInstance() {
+        if (self::$handle == null) {
+            self::$handle = new Database();
         }
 
-        /**
-         * <b>Std-Abfrage Methode der DB-Klasse</b>
-         *
-         * Das übergebene SQL-Statement wird als assoziatives, ein-oder mehrdimensionales Array zurück geliefert.
-         *
-         * array = (
-         *     'id' => 1,
-         *     'name' => 'Ticket',
-         * );
-         *
-         * @param $sql
-         * @return array|null
-         */
-        public function query($sql) {
-            self::$logger->info(sprintf('%s(%s) ', __METHOD__, $sql));
+        return self::$handle;
+    }
 
-            $result = mysqli_query($this->link, $sql);
-
-            if ($result == false) {
-                return null;
-            }
-
-            if ($result->num_rows == 0) {
-                return null;
-            }
-
-            $rows = array();
-            while (($row = $result->fetch_assoc())) {
-                $rows[] = $row;
-            }
-
-
-            return $rows;
+    /**
+     * <b>Diese Methode löscht alle Tickets, History und Benutzer weg</b>
+     *
+     * Diese Methode sollte dann aufgerufen werden, wenn die Anwendung deployed wird
+     *
+     * Auf Deutsch: "Vor der Präsi alles weglöschen."
+     *
+     * @return bool
+     */
+    public function cleanup() {
+        try {
+            $status = $this->pdo->exec("DELETE FROM `t_ticket` WHERE `id` > 1;");
+            $status = $this->pdo->exec("DELETE FROM `t_history` WHERE `id` > 1;");
+            $status = $this->pdo->exec("DELETE FROM `t_user` WHERE `id` > 2;");
+            $status = $this->pdo->exec("ALTER TABLE `t_history` AUTO_INCREMENT = 1;");
+            $status = $this->pdo->exec("ALTER TABLE `t_ticket` AUTO_INCREMENT = 1;");
+            $status = $this->pdo->exec("ALTER TABLE `t_user` AUTO_INCREMENT = 2;");
+        } catch (PDOException $pdoe) {
+            return false;
         }
 
-        /**
-         * <b>Abfragen, die kein ResultSet zurück liefern</b>
-         *
-         * SQL-Statements, die nur TRUE oder FALSE zurück liefern,
-         * müssen per EXECUTE ausgeführt werden.
-         *
-         * @param $sql
-         * @return bool|mysqli_result
-         */
-        public function execute($sql) {
-            self::$logger->info(sprintf('%s(%s) ', __METHOD__, $sql));
+        return true;
+    }
 
-            $result = mysqli_query($this->link, $sql);
+    /**
+     *
+     * @param string $table
+     * @param array $fields
+     * @param string $filename
+     * @param string $seperator
+     *
+     * @throws InvalidArgumentException
+     */
+    public function csvExport($table, $fields, $filename, $seperator = ';') {
+        $handle = fopen($filename, "w+");
 
-            return $result;
+        if ($handle == FALSE) {
+            throw new InvalidArgumentException("Datei nicht gefunden: " . $filename);
         }
 
-        /**
-         * <b>Die einfache Fetch-Methode für das Table-Row-Pattern</b>
-         *
-         * Es wird ein SQL Statement bezogen auf die aktuelle Tabelle zusammen
-         * gebaut. Dieses kann optional eine WHERE clause beinhalten.
-         *
-         * @param $table
-         * @param string $cond
-         * @return array|null
-         */
-        public function fetch($table, $cond = 'id > 1') {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, $cond));
+        $rows = $this->fetchAll(sprintf("SELECT %s FROM `%s` ORDER BY `id`", implode(", ", $fields), $table));
+
+        fwrite($handle, sprintf("%s\n", implode($seperator, $fields)));
+        foreach ($rows as $row) {
+            fwrite($handle, sprintf("%s\n", implode($seperator, $row)));
+        }
+
+        fclose($handle);
+    }
 
-            $sql = "
+    public function fetchAll($table, $cond) {
+        return $this->fetch($table, $cond);
+    }
+
+    /**
+     * @param $table
+     * @param $cond
+     * @return array|null
+     */
+    public function fetch($table, $cond) {
+        $stmt = $this->pdo->prepare(sprintf('
             SELECT
                 *
             FROM
-              $table
-            WHERE
-              $cond
-        ";
-
-            $result = mysqli_query($this->link, $sql);
-
-            if ($result == false) {
-                return null;
-            }
-
-            return $result->fetch_assoc();
-        }
-
-        /**
-         * <b>Die multiple Fetch-Methode für das Table-Row-Pattern</b>
-         *
-         * Der Rückgabewert ist ein Array mit allen Zeilen als assoziatives Array
-         *
-         * @param $table
-         * @param string $cond
-         * @return array|null
-         */
-        public function fetchAll($table, $cond = 'id > 0') {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, $cond));
-
-            $sql = sprintf("
-            SELECT
-              *
-            FROM
               `%s`
             WHERE
               %s
-        ", $table, $cond);
+            ', $table, $cond
+        ));
+
+        if ($stmt->execute()) {
+            return $stmt->fetch();
+        }
+
+        return null;
+    }
 
-            return $this->query($sql);
+    /**
+     *
+     * @param string $table
+     * @param string $filename
+     * @param string $seperator
+     *
+     * @throws InvalidArgumentException
+     */
+    public function csvImport($table, $filename, $seperator = ';') {
+        $handle = fopen($filename, "r");
+
+        if ($handle == FALSE) {
+            throw new InvalidArgumentException("Datei nicht gefunden: " . $filename);
         }
 
-        /**
-         * <b>Die einfache Find-Methode für das Table-Row-Pattern</b>
-         *
-         * Der Rückgabewert ist entweder die Tabellenzeile 'id' oder null
-         * im assoziativen Array.
-         *
-         * @param $table
-         * @param $id
-         * @return array|null
-         */
-        public function find($table, $id) {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, $id));
+        $firstLine = trim(fgets($handle, 1024));
+        $firstExplodedLine = explode($seperator, $firstLine);
+        $firstImplodedLine = implode(", ", $firstExplodedLine);
 
-            $sql = sprintf("
-            SELECT
-              *
-            FROM
-              `%s`
-            WHERE
-              `id` = %d
-        ", $table, $id);
-
-            $result = mysqli_query($this->link, $sql);
-
-            if ($result == false) {
-                return null;
+        while (($line = fgets($handle, 1024)) != NULL) {
+            $explodedLine = explode($seperator, trim($line));
+            $row = array();
+            foreach ($explodedLine as $explodedField) {
+                $row[] = "'$explodedField'";
             }
 
-            return $result->fetch_assoc();
+            $implodedLine = implode(", ", $row);
+            $this->pdo->exec(sprintf("INSERT INTO %s(id, %s) VALUES(NULL, %s);\n", $table, $firstImplodedLine, $implodedLine));
         }
 
-        /**
-         * <b>Die multiple Find-Methode für das Table-Row-Pattern</b>
-         *
-         * Es liefert alle Reihen als assoziatives Array zurück.
-         *
-         * @param $table
-         * @return array|null
-         */
-        public function findAll($table, $sys_id = 1) {
-            self::$logger->info(sprintf('%s(%s) ', __METHOD__, $table));
+        fclose($handle);
+    }
 
-            $sql = sprintf("
-            SELECT
-              *
-            FROM
-              `%s`
-            WHERE
-              `id` > %d
-        ", $table, $sys_id);
+    public function find($table, $id) {
+        $stmt = $this->pdo->prepare(
+            sprintf('
+              SELECT
+                *
+              FROM
+                `%s`
+              WHERE
+                `id` = :id
+            ', $table
+            ));
 
-            return $this->query($sql);
+        $stmt->bindParam(':id', $id);
+
+        $status = $stmt->execute();
+        if ($status) {
+            return $stmt->fetch(PDO::FETCH_ASSOC);
         }
 
-        /**
-         * <b>Liefert ein Resultset bezogen auf ein bestimmtes Feld zurück</b>
-         *
-         * @param $table
-         * @param $field
-         * @param $value
-         * @return array|null
-         */
-        public function findByField($table, $field, $value) {
-            self::$logger->info(sprintf('%s(%s, %s, %s) ', __METHOD__, $table, $field, $value));
+        return null;
+    }
+
+    public function findAll($table, $sys) {
+        $stmt = $this->pdo->prepare(
+            sprintf('
+              SELECT
+                *
+              FROM
+                `%s`
+              WHERE
+                `id` > :id
+            ', $table
+            ));
+
+        $id = ($sys ? 0 : 1);
+        $stmt->bindParam(':id', $id);
 
-            $sql = sprintf("
-            SELECT
-              *
-            FROM
-              `%s`
-            WHERE
-              `%s` = '%s'
-        ", $table, $field, $value);
+        if ($stmt->execute()) {
+            return $stmt->fetchAll(PDO::FETCH_ASSOC);
+        }
+
+        return null;
+    }
 
-            $result = mysqli_query($this->link, $sql);
+    public function findByField($table, $field, $value) {
+        $stmt = $this->pdo->prepare(
+            sprintf('
+              SELECT
+                *
+              FROM
+                `%s`
+              WHERE
+                `%s` = :value
+            ', $table, $field
+            ));
 
-            if ($result == false) {
-                return null;
-            }
+        $stmt->bindParam(':value', $value);
 
-            return $result->fetch_assoc();
+        if ($stmt->execute()) {
+            return $stmt->fetch(PDO::FETCH_ASSOC);
         }
 
-        /**
-         * <b>Liefert mehrere Resultsets bezogen auf ein bestimmtes Feld zurück</b>
-         *
-         * @param $table
-         * @param $field
-         * @param $value
-         * @return array|null
-         */
-        public function findAllByField($table, $field, $value) {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, $field));
+        return null;
+    }
 
-            $sql = sprintf("
-            SELECT
-              *
-            FROM
-              `%s`
-            WHERE
-              `%s` = '%s'
-        ", $table, $field, $value);
+    function findAllByField($table, $field, $value) {
+        $stmt = $this->pdo->prepare(
+            sprintf('
+              SELECT
+                *
+              FROM
+                `%s`
+              WHERE
+                `%s` = :value
+            ', $table, $field
+            ));
 
-            return $this->query($sql);
+        $stmt->bindParam(':value', $value);
+
+        if ($stmt->execute()) {
+            return $stmt->fetchAll(PDO::FETCH_ASSOC);
         }
 
-        /**
-         * <b>Die Standard Persist Methode erstellt einen neuen DB-Eintrag in der angegebenen Tabelle</b>
-         *
-         * @param $table
-         * @param $array
-         * @return bool|mysqli_result
-         */
-        public function persist($table, $array) {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, print_r($array, true)));
+        return null;
+    }
+
+    public function query($sql) {
+        $stmt = $this->pdo->query($sql);
+
+        if ($stmt) {
+            return $stmt->fetchAll(PDO::FETCH_ASSOC);
+        }
+
+        return null;
+    }
+
+    public function persist($table, $array) {
+        self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, print_r($array, true)));
 
-            $keys = array();
-            foreach (array_keys($array) as $key) {
-                if ($key != 'id') {
-                    $keys[] = sprintf("`%s`", $key);
-                }
+        $keys = array();
+        foreach (array_keys($array) as $key) {
+            if ($key != 'id') {
+                $keys[] = sprintf("`%s`", $key);
             }
+        }
 
-            $fieldList = implode(", ", $keys);
+        $fieldList = implode(", ", $keys);
 
-            $values = array();
-            foreach ($array as $key => $value) {
-                if ($key != 'id') {
-                    $values[] = sprintf("'%s'", $value);
-                }
+        $values = array();
+        foreach ($array as $key => $value) {
+            if ($key != 'id') {
+                $values[] = sprintf("'%s'", $value);
             }
+        }
 
-            $fields = implode(",", $values);
+        $fields = implode(",", $values);
 
-            $sql = sprintf("
+        $sql = sprintf("
             INSERT INTO `%s`
             (`id`, %s) VALUES (NULL, %s)
         ", $table, $fieldList, $fields);
 
-            return $this->execute($sql);
+        return $this->pdo->exec($sql);
+    }
+
+    public function store($table, $id, $array) {
+        self::$logger->info(sprintf('%s(%s, %d, %s) ', __METHOD__, $table, $id, print_r($array, true)));
+
+        $list = array();
+        foreach ($array as $key => $value) {
+            if ($key != 'id') {
+                $list[] = sprintf("`%s` = '%s'", $key, $value);
+            }
         }
 
-        /**
-         * <b>Die Standard store Methode aktualisiert einen DB-Eintrag in der angegebenen Tabelle</b>
-         *
-         * @param $table
-         * @param $id
-         * @param $array
-         * @return bool
-         */
-        public function store($table, $id, $array) {
-            self::$logger->info(sprintf('%s(%s, %d, %s) ', __METHOD__, $table, $id, print_r($array, true)));
+        $listItems = implode(", ", $list);
 
-            $list = array();
-            foreach ($array as $key => $value) {
-                if ($key != 'id') {
-                    $list[] = sprintf("`%s` = '%s'", $key, $value);
-                }
-            }
-
-            $listItems = implode(", ", $list);
-
-            $sql = sprintf("
+        $sql = sprintf("
             UPDATE `%s`
             SET %s
             WHERE `id` = %d
         ", $table, $listItems, $id);
 
-
-            return $this->execute($sql);
-        }
+        return $this->pdo->exec($sql);
+    }
 
-        /**
-         * <b>Die Standard Delete Methode löscht einen bestehenden DB-Eintrag aus der angegebenen Tabelle</b>
-         *
-         * @param $table
-         * @param $id
-         * @return bool
-         */
-        public function delete($table, $id) {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, $id));
+    public function delete($table, $id) {
+        self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $table, $id));
 
-            $sql = sprintf("
+        $sql = sprintf("
             DELETE FROM `%s`
             WHERE `id` = %d;
         ", $table, $id);
 
-            return $this->execute($sql);
-        }
-
-        /**
-         * <b>Liefert die letzte, verwendete ID, die eingefügt wurde.</b>
-         *
-         * Es gilt zu beachten, dass es sich hierbei um eine state-behaftete Methode handelt.
-         *
-         * <b>Nach 3 Inserts liefert diese Methode definitiv nur den PK des letzten INSERTS.</b>
-         *
-         * @return int|string
-         */
-        public function getLastInsertedId() {
-            $lastInsertedId = mysqli_insert_id($this->link);
-
-            self::$logger->info(sprintf('%s(): %d', __METHOD__, $lastInsertedId));
-
-            return $lastInsertedId;
-        }
-
-        /**
-         * <b>Diese Methode löscht alle Tickets, History und Benutzer weg</b>
-         *
-         * Diese Methode sollte dann aufgerufen werden, wenn die Anwendung deployed wird
-         *
-         * Auf Deutsch: "Vor der Präsi alles weglöschen."
-         *
-         * @return bool
-         */
-        public function cleanup() {
-            $status = $this->execute("DELETE FROM `t_ticket` WHERE `id` > 1;");
-            $status &= $this->execute("DELETE FROM `t_history` WHERE `id` > 1;");
-            $status &= $this->execute("DELETE FROM `t_user` WHERE `id` > 2;");
-
-            $status &= $this->execute("ALTER TABLE `t_history` AUTO_INCREMENT = 1;");
-            $status &= $this->execute("ALTER TABLE `t_ticket` AUTO_INCREMENT = 1;");
-            $status &= $this->execute("ALTER TABLE `t_user` AUTO_INCREMENT = 2;");
-
-            return $status;
-        }
+        return $this->pdo->exec($sql);
+    }
 
-        /**
-         * <b>Import von Datensätzen im CSV-Format(besser gesagt SSV-Format)</b>
-         *
-         * Die Tabelle 'table' wird automatisiert mit den Werten aus der SSV-Datei befüllt.
-         *
-         * @param $table
-         * @param $filename
-         * @return bool
-         */
-        public function csvImport($table, $filename) {
-            $db = Database::getInstance();
-
-            $handle = fopen($filename, 'r');
-
-            $lines = array();
-            while (!feof($handle)) {
-                $lines[] = trim(fgets($handle), "[\r\n\t]");
-            }
-
-            fclose($handle);
-
-            if (count($lines) < 2) {
-                return false;
-            }
-
-            $spaltenKoepfeArray = explode(';', $lines[0]);
-            for ($i = 0; $i < count($spaltenKoepfeArray); $i++) {
-                $spaltenKoepfeArray[$i] = sprintf("`%s`", $spaltenKoepfeArray[$i]);
-            }
-
-            $spaltenInhaltArray = array();
-            for ($i = 1; $i < count($lines); $i++) {
-                $spaltenInhaltArray[] = explode(';', $lines[$i]);
-            }
-
-            $spaltenKoepfe = implode(', ', $spaltenKoepfeArray);
-
-            foreach ($spaltenInhaltArray as $sia) {
-                for ($i = 0; $i < count($sia); $i++) {
-
-                    if ($spaltenKoepfeArray[$i] == '`last_access`') {
-                        $sia[$i] = sprintf("'%s'", date("Y-m-d H:i:s"));
-                    } else {
-                        $sia[$i] = sprintf("'%s'", $sia[$i]);
-                    }
-                }
-
-                $spaltenInhalt = implode(', ', $sia);
-                if (count($spaltenKoepfeArray) == count($sia)) {
-                    $sql = sprintf("INSERT INTO %s(id, %s) VALUES(NULL, %s);", $table, $spaltenKoepfe, $spaltenInhalt);
-                    if (!$db->execute($sql)) {
-
-                        return false;
-                    }
-                }
-            }
-
-            return true;
-        }
-
+    public function getLastInsertedId() {
+        return $this->pdo->lastInsertId();
     }
 }
\ No newline at end of file
rename from classes/bfw/mvc/controller/Controller.php
rename to classes/bfw/mvc/common/Controller.php
--- a/classes/bfw/mvc/controller/Controller.php
+++ b/classes/bfw/mvc/common/Controller.php
@@ -1,186 +1,135 @@
 <?php
 
-namespace bfw\mvc\controller {
+namespace bfw\mvc\common;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+
+use bfw\Request;
+use bfw\Response;
+
+/**
+ *
+ */
+abstract class Controller {
+    /**
+     * @var Model
+     */
+    private $model;
+
+    /**
+     * @var Request
+     */
+    private $request;
+
+    /**
+     * @var Response
+     */
+    private $response;
+
+    /**
+     * @var View
+     */
+    private $view;
+
+    /**
+     * @var
+     */
+    private $prefix;
+
+    /**
+     * Controller constructor.
+     *
+     * @param Model $model
+     * @param Request $request
+     */
+    public function __construct(Model $model) {
+        $this->request = new Request();
+        $this->response = new Response();
+
+        $this->model = $model;
+        $this->view = new View($this, $model);
+
+        $this->prefix = '';
+    }
 
     /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
-     *
+     * @param $controller
+     * @return string
      */
+    public static function mapControllerName($controller) {
+        return sprintf('bfw\mvc\controller\%sController', ucfirst($controller));
+    }
+
+    public function getView() {
+        return $this->view;
+    }
+
+    public function setView($view) {
+        $this->view = $view;
+
+        return $this;
+    }
+
+    public function getResponse() {
+        return $this->response;
+    }
+
+    public function setResponse($response) {
+        $this->response = $response;
+
+        return $this;
+    }
+
+    /**
+     * @return Model
+     */
+    public function getModel() {
+        return $this->model;
+    }
 
-    use bfw\mvc\model\Model;
-    use bfw\mvc\model\THistory;
-    use bfw\mvc\model\TTicket;
-    use bfw\mvc\model\TUser;
-    use bfw\mvc\view\View;
-    use bfw\Request;
-    use bfw\Response;
+    /**
+     * @param $model
+     * @return $this
+     */
+    public function setModel($model) {
+        $this->model = $model;
+
+        return $this;
+    }
+
+    /**
+     * @return Request
+     */
+    public function getRequest() {
+        return $this->request;
+    }
 
-    interface ActionInterface {
-        public function index();
+    /**
+     * @return string
+     */
+    public function getPage() {
+        if ($this->getPrefix() != '') {
+            return sprintf('%s/%s', $this->prefix, $this->request->get('action'));
+        }
+
+        return $this->request->get('action');
+    }
+
+    public function getPrefix() {
+        return $this->prefix;
+    }
+
+    public function setPrefix($prefix) {
+        $this->prefix = $prefix;
+
+        return $this;
     }
 
     /**
      *
      */
-    abstract class Controller implements ActionInterface {
-        /**
-         * @var Model
-         */
-        private $model;
-
-        /**
-         * @var Request
-         */
-        private $request;
-
-        /**
-         * @var Response
-         */
-        private $response;
-
-        /**
-         * @var View
-         */
-        private $view;
-
-        /**
-         * @var
-         */
-        private $prefix;
-
-        /**
-         * Controller constructor.
-         *
-         * @param Model $model
-         * @param Request $request
-         */
-        public function __construct(Model $model, Request $request) {
-            $this->request = $request;
-            $this->response = new Response();
-
-            $this->model = $model;
-            $this->view = new View($this, $model);
-
-            $this->prefix = '';
-        }
-
-        public function getPrefix() {
-            return $this->prefix;
-        }
-
-        public function setPrefix($prefix) {
-            $this->prefix = $prefix;
-
-            return $this;
-        }
-
-        public function getView() {
-            return $this->view;
-        }
-
-        public function setView($view) {
-            $this->view = $view;
-
-            return $this;
-        }
-
-        public function getResponse() {
-            return $this->response;
-        }
-
-        public function setResponse($response) {
-            $this->response = $response;
-
-            return $this;
-        }
-
-        /**
-         * @return Model
-         */
-        public function getModel() {
-            return $this->model;
-        }
-
-        /**
-         * @param $model
-         * @return $this
-         */
-        public function setModel($model) {
-            $this->model = $model;
-
-            return $this;
-        }
-
-        /**
-         * @return Request
-         */
-        public function getRequest() {
-            return $this->request;
-        }
-
-        /**
-         * @return string
-         */
-        public function getPage() {
-            if ($this->getPrefix() != '') {
-                return sprintf('%s/%s', $this->prefix, $this->request->get('page'));
-            }
-
-            return $this->request->get('page');
-        }
-
-        /**
-         * @param $page
-         * @return string
-         */
-        public static function mapControllerName($page) {
-            switch ($page) {
-                case 'benutzerverwaltung':
-                case 'meinprofil':
-                case 'resetpasswort':
-                case 'registrieren':
-                case 'anmelden':
-                case 'abmelden':
-                    return 'bfw\mvc\controller\BenutzerverwaltungsController';
-                case 'home':
-                    return 'bfw\mvc\controller\HomeController';
-                case 'tickets':
-                case 'ticketanlegen':
-                    return 'bfw\mvc\controller\TicketsController';
-                case 'historie':
-                    return 'bfw\mvc\controller\HistoryController';
-
-                default:
-                    return 'bfw\mvc\controller\ErrorController';
-            }
-        }
-
-        public static function getArgsForController($controllerName) {
-            switch ($controllerName) {
-                case 'bfw\mvc\controller\BenutzerverwaltungsController':
-                    $model = new TUser();
-
-                    return array($model, new Request());
-                case 'bfw\mvc\controller\HistoryController':
-                    $model = new THistory();
-
-                    return array($model, new Request());
-                case 'bfw\mvc\controller\HomeController':
-                    $model = new TUser();
-
-                    return array($model, new Request());
-                case 'bfw\mvc\controller\TicketsController':
-                    $model = new TTicket();
-
-                    return array($model, new Request());
-                default:
-                    $model = new TUser();
-
-                    return array($model, new Request());
-            }
-
-            throw new InvalidArgumentException(sprintf('Unbekannter Controller für %s', $controllerName));
-        }
-
-    }
+    abstract public function index();
 }
\ No newline at end of file
rename from classes/bfw/mvc/model/Model.php
rename to classes/bfw/mvc/common/Model.php
--- a/classes/bfw/mvc/model/Model.php
+++ b/classes/bfw/mvc/common/Model.php
@@ -1,217 +1,226 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\common;
+
+use bfw\database\Database;
+use Logger;
 
-    use bfw\Database;
+/**
+ * Class Model
+ *
+ * Model besitzt einen State in $data
+ *
+ *
+ * @method string getId()
+ * @method setId($param)
+ */
+class Model {
+    private static $logger = null;
+
+    protected $table;
+    protected $db;
+
+    protected $data;
 
     /**
-     * Class Model
-     *
-     * Model besitzt einen State in $data
-     *
-     *
-     * @method string getId()
-     * @method setId($param)
+     * @param $table
      */
-    class Model {
-        private static $logger = null;
-
-        protected $table;
-        protected $db;
+    public function __construct($table) {
+        self::$logger = Logger::getLogger('__CLASS__');
 
-        protected $data;
+        $this->db = Database::getInstance();
 
-        public function getData() {
-            return $this->data;
-        }
+        $this->table = $table;
+        $this->data = array();
+    }
 
-        /**
-         * <b>Herzstück des Persistence-Frameworks</b>
-         *
-         * Dynamische Erzeugung von Getttern- und Settern
-         *
-         * Anstatt diese explizit zu pflegen und zu warten,
-         * werden Diese dynamisch, on, the fly, erzeugt.
-         *
-         * <b>Der Vorteil: Nicht Konfigurieren, nicht Erzeugen. Einfach Nutzen...</b>
-         *
-         * @param $methodName
-         * @param null $params
-         * @return $this
-         */
-        public function __call($methodName, $params = null) {
-            $prefix = substr($methodName, 0, 3);
-            $key = strtolower(substr($methodName, 3));
+    /**
+     * <b>Herzstück des Persistence-Frameworks</b>
+     *
+     * Dynamische Erzeugung von Getttern- und Settern
+     *
+     * Anstatt diese explizit zu pflegen und zu warten,
+     * werden Diese dynamisch, on, the fly, erzeugt.
+     *
+     * <b>Der Vorteil: Nicht Konfigurieren, nicht Erzeugen. Einfach Nutzen...</b>
+     *
+     * @param $methodName
+     * @param null $params
+     * @return $this
+     */
+    public function __call($methodName, $params = null) {
+        $prefix = substr($methodName, 0, 3);
+        $key = strtolower(substr($methodName, 3));
 
-            if ($prefix == 'set') {
-                $value = $params[0];
-
-                $this->data[$key] = $value;
+        if ($prefix == 'set') {
+            $value = $params[0];
 
-                // fluent please!
-                return $this;
-
-            } else if ($prefix == 'get') {
-                if (array_key_exists($key, $this->data)) {
-                    return $this->data[$key];
-                }
+            // no data, no state, null
+            if (!is_array($this->data)) {
+                return null;
             }
 
-            exit(sprintf('Unbekannte Methode %s::%s(%s, %s) wurde aufgerufen.', get_class($this), $methodName, $key, $prefix));
-        }
+            $this->data[$key] = $value;
 
-        /**
-         * @param $table
-         */
-        public function __construct($table) {
-            self::$logger = \Logger::getLogger('__CLASS__');
+            // fluent please!
+            return $this;
 
-            $this->db = Database::getInstance();
-            $this->table = $table;
-            $this->data = array();
-        }
+        } else if ($prefix == 'get') {
 
-        /**
-         * <b>Vereinfachte Find Methode bezogen auf die jeweilige Instanz</b>
-         *
-         * @param $id
-         * @return Model
-         */
-        public function find($id) {
-            self::$logger->info(sprintf('%s(%d) ', __METHOD__, $id));
-
-            if (($this->data = $this->db->find($this->table, $id)) == null) {
+            // no data, no state, null
+            if (!is_array($this->data)) {
                 return null;
             }
 
-            return $this;
+            if (array_key_exists($key, $this->data)) {
+                return $this->data[$key];
+            }
+        }
+
+        exit(sprintf('Unbekannte Methode %s::%s(%s, %s) wurde aufgerufen.', get_class($this), $methodName, $key, $prefix));
+    }
+
+    /**
+     * <b>Vereinfachte Find Methode bezogen auf die jeweilige Instanz</b>
+     *
+     * @param $id
+     * @return Model
+     */
+    public function find($id) {
+        self::$logger->info(sprintf('%s(%d) ', __METHOD__, $id));
+
+        if (($this->data = $this->db->find($this->table, $id)) == null) {
+            return null;
         }
 
-        /**
-         * <b>Die Findall Methode erzeugt typsicher den Supertyp</b>
-         *
-         * @param bool|false $sys
-         * @return Model[]
-         */
-        public function findAll($sys = false) {
-            self::$logger->info(sprintf('%s() ', __METHOD__));
-
-            $initial_id = ($sys) ? 0 : 1;
-            $rows = $this->db->findAll($this->table, $initial_id);
+        return $this;
+    }
 
-            if (count($rows) == 0) {
-                return array();
-            }
+    /**
+     * <b>Die Findall Methode erzeugt typsicher den Supertyp</b>
+     *
+     * @param bool|false $sys
+     * @return Model[]
+     */
+    public function findAll($sys = false) {
+        self::$logger->info(sprintf('%s() ', __METHOD__));
 
-            $list = array();
-            foreach ($rows as $row) {
-                $item = new static();
-                $item->data = $row;
+        $initial_id = ($sys) ? 0 : 1;
+        $rows = $this->db->findAll($this->table, $initial_id);
 
-                $list[] = $item;
-            }
-
-            self::$logger->info(sprintf('%s(): %d', __METHOD__, count($list)));
-
-            return $list;
+        if (count($rows) == 0) {
+            return array();
         }
 
-        /**
-         * <b>Vereinfachte FindByField Methode</b>
-         *
-         * @param $field
-         * @param $value
-         * @return Model
-         */
-        public function findByField($field, $value) {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $field, $value));
+        $list = array();
+        foreach ($rows as $row) {
+            $item = new static();
+            $item->data = $row;
+
+            $list[] = $item;
+        }
+
+        self::$logger->info(sprintf('%s(): %d', __METHOD__, count($list)));
+
+        return $list;
+    }
 
-            $this->data = $this->db->findByField($this->table, $field, $value);
+    /**
+     * <b>Vereinfachte FindByField Methode</b>
+     *
+     * @param $field
+     * @param $value
+     * @return Model
+     */
+    public function findByField($field, $value) {
+        self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $field, $value));
 
-            // Keine Daten, keine Instanz
-            if ($this->data == null) {
-                return null;
-            }
+        $this->data = $this->db->findByField($this->table, $field, $value);
 
-            return $this;
+        // Keine Daten, keine Instanz
+        if ($this->data == null) {
+            return null;
         }
 
-        /**
-         * <b>Vereinfachte FindAllByField Methode</b>
-         *
-         * Erzeugt on the fly ein array mit dem Supertyp der Klasseninstanz
-         * @param $field
-         * @param $value
-         * @return Model[]
-         */
-        public function findAllByField($field, $value) {
-            self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $field, $value));
-
-            $rows = $this->db->findAllByField($this->table, $field, $value);
+        return $this;
+    }
 
-            if ($rows == null) {
-                return null;
-            }
+    /**
+     * <b>Vereinfachte FindAllByField Methode</b>
+     *
+     * Erzeugt on the fly ein array mit dem Supertyp der Klasseninstanz
+     * @param $field
+     * @param $value
+     * @return Model[]
+     */
+    public function findAllByField($field, $value) {
+        self::$logger->info(sprintf('%s(%s, %s) ', __METHOD__, $field, $value));
 
-            $list = array();
-            foreach ($rows as $row) {
-                $item = new static();
-                $item->data = $row;
+        $rows = $this->db->findAllByField($this->table, $field, $value);
+
+        if ($rows == null) {
+            return null;
+        }
 
-                $list[] = $item;
-            }
+        $list = array();
+        foreach ($rows as $row) {
+            $item = new static();
+            $item->data = $row;
 
-            return $list;
+            $list[] = $item;
         }
 
-        /**
-         * <b>Vereinfachte persist Methode</b>
-         *
-         * Der Logger loggt nur die Nutzdaten, deswegen sieht das im Log identisch aus.
-         *
-         * Es handelt sich allerdings einmal um ein Objekt und einmal nur um ein Array.
-         *
-         * @param $object
-         * @return bool
-         */
-        public function persist($object) {
-            self::$logger->info(sprintf('%s(%s)', __METHOD__, print_r($object->getData(), true)));
+        return $list;
+    }
+
+    /**
+     * <b>Vereinfachte persist Methode</b>
+     *
+     * Der Logger loggt nur die Nutzdaten, deswegen sieht das im Log identisch aus.
+     *
+     * Es handelt sich allerdings einmal um ein Objekt und einmal nur um ein Array.
+     *
+     * @return bool
+     */
+    public function persist() {
+        self::$logger->info(sprintf('%s(%s)', __METHOD__, print_r($this->getData(), true)));
 
-            return $this->db->persist($this->table, $object->getData());
+        return $this->db->persist($this->table, $this->getData());
+    }
+
+    public function getData() {
+        return $this->data;
+    }
+
+    /**
+     * <b>Vereinfachte store Methode</b>
+     *
+     * @return bool
+     */
+    public function store() {
+        self::$logger->info(sprintf('%s(%d, %s)', __METHOD__, $this->getId(), print_r($this->getData(), true)));
+
+        if ($this->getId() > 1) {
+            return $this->db->store($this->table, $this->getId(), $this->getData());
         }
 
-        /**
-         * <b>Vereinfachte store Methode</b>
-         *
-         * @param $id
-         * @param $object
-         * @return bool
-         */
-        public function store($id, $object) {
-            self::$logger->info(sprintf('%s(%d, %s)', __METHOD__, $id, print_r($object->getData(), true)));
+        return false;
+    }
 
-            if ($id > 1) {
-                return $this->db->store($this->table, $id, $object->getData());
-            }
+    /**
+     * <b>Vereinfachte delete Methode</b>
+     *
+     * @param $id
+     * @return bool
+     */
+    public function delete() {
+        self::$logger->info(sprintf('%s(%d) ', __METHOD__, $this->getId()));
 
-            return false;
+        if ($this->getId() > 1) {
+            return $this->db->delete($this->table, $this->getId());
         }
 
-        /**
-         * <b>Vereinfachte delete Methode</b>
-         *
-         * @param $id
-         * @return bool
-         */
-        public function delete($id) {
-            self::$logger->info(sprintf('%s(%d) ', __METHOD__, $id));
+        return false;
+    }
 
-            if ($id > 1) {
-                return $this->db->delete($this->table, $id);
-            }
-
-            return false;
-        }
-
-    }
 }
\ No newline at end of file
rename from classes/bfw/mvc/view/View.php
rename to classes/bfw/mvc/common/View.php
--- a/classes/bfw/mvc/view/View.php
+++ b/classes/bfw/mvc/common/View.php
@@ -1,115 +1,111 @@
 <?php
 
-namespace bfw\mvc\view {
+namespace bfw\mvc\common;
 
-    use bfw\mvc\controller\Controller;
-    use bfw\mvc\model\Model;
-    use bfw\mvc\model\TGroup;
-    use bfw\mvc\model\TStatus;
-    use bfw\mvc\model\TUser;
+use bfw\mvc\model\TGroup;
+use bfw\mvc\model\TStatus;
+use bfw\mvc\model\TUser;
+use Smarty;
+
+require_once 'library/smarty/libs/Smarty.class.php';
 
-    require_once 'library/smarty/libs/Smarty.class.php';
-
-    class View extends \Smarty {
-        /**
-         * @var Model
-         */
-        private $model;
+class View extends Smarty {
+    /**
+     * Statische Referenz auf die reale Template Engine, hier Smarty
+     *
+     * @var Smarty
+     */
+    private static $tpl = null;
+    /**
+     * @var Model
+     */
+    private $model;
+    /**
+     * @var Controller
+     */
+    private $controller;
 
-        /**
-         * @var Controller
-         */
-        private $controller;
+    /**
+     * View constructor.
+     *
+     * @param Controller $controller
+     * @param Model $model
+     */
+    public function __construct(Controller $controller, Model $model) {
+        $this->controller = $controller;
+        $this->model = $model;
 
-        /**
-         * Statische Referenz auf die reale Template Engine, hier Smarty
-         *
-         * @var Smarty
-         */
-        private static $tpl = null;
+        self::$tpl = self::getTemplateEngine();
+    }
 
-        /**
-         * View constructor.
-         *
-         * @param Controller $controller
-         * @param Model $model
-         */
-        public function __construct(Controller $controller, Model $model) {
-            $this->controller = $controller;
-            $this->model = $model;
+    /**
+     * <b>Liefert ein statisches Handle auf die aktuelle Template Engine zurück</b>
+     *
+     * Das Singleton Pattern garantiert genau eine Instanz der Template Engine im Speicher.
+     *
+     *  <b>Verschiedene Skripte können so nacheinander Variablen zuweisen und diese bei Bedarf auslesen</b>
+     *
+     * @return Smarty
+     */
+    private static function getTemplateEngine() {
+        if (self::$tpl == null) {
+            self::$tpl = new Smarty();
 
-            self::$tpl = self::getTemplateEngine();
+            $tpl = self::$tpl;
+
+            $tpl->setCompileDir('./data/templates_c/');
+            $tpl->setTemplateDir('./templates/');
         }
 
-        /**
-         * <b>Liefert ein statisches Handle auf die aktuelle Template Engine zurück</b>
-         *
-         * Das Singleton Pattern garantiert genau eine Instanz der Template Engine im Speicher.
-         *
-         *  <b>Verschiedene Skripte können so nacheinander Variablen zuweisen und diese bei Bedarf auslesen</b>
-         *
-         * @return Smarty
-         */
-        private static function getTemplateEngine() {
-            if (self::$tpl == null) {
-                self::$tpl = new \Smarty();
+        return self::$tpl;
+    }
 
-                $tpl = self::$tpl;
-
-                $tpl->setCompileDir('./data/templates_c/');
-                $tpl->setTemplateDir('./templates/');
-            }
+    /**
+     * weisst automatisch eine user-instanz zu: Seiten-Effekte beachten
+     *
+     * TODO: Namensschema festlegen, damit dieser Effekt nicht auftritt
+     */
+    public function display() {
+        $tUser = new TUser();
+        $tGroup = new TGroup();
+        $tStatus = new TStatus();
 
-            return self::$tpl;
-        }
+        $request = $this->controller->getRequest();
 
-        public function assign($key, $value) {
-            self::$tpl->assign($key, $value);
+        if ($request->getKey('isLoggedIn')) {
+            $tUser->find($request->getKey('user_id'));
         }
 
-        /**
-         * weisst automatisch eine user-instanz zu: Seiten-Effekte beachten
-         *
-         * TODO: Namensschema festlegen, damit dieser Effekt nicht auftritt
-         */
-        public function display() {
-            $tUser = new TUser();
-            $tGroup = new TGroup();
-            $tStatus = new TStatus();
+        $controller = $this->controller;
+
+        $response = $controller->getResponse();
+        $this->assign('response', $response);
 
-            $request = $this->controller->getRequest();
-
-            if ($request->getKey('isLoggedIn')) {
-                $tUser->find($request->getKey('user_id'));
-            }
-
-            $controller = $this->controller;
-
-            $response = $controller->getResponse();
-            $this->assign('response', $response);
+        $this->assign('tUser', $tUser);
+        $this->assign('tGroup', $tGroup);
+        $this->assign('tStatus', $tStatus);
+        $this->assign('request', $request);
 
-            $this->assign('tUser', $tUser);
-            $this->assign('tGroup', $tGroup);
-            $this->assign('tStatus', $tStatus);
-            $this->assign('request', $request);
-
-            try {
-                self::$tpl->display('layout.tpl');
-            } catch (SmartyException $se) {
-                $response->setStatusCode(404);
+        try {
+            self::$tpl->display('layout.tpl');
+        } catch (SmartyException $se) {
+            $response->setStatusCode(404);
 
-                $page = 'error/error';
-                self::$tpl->assign('page', $page);
-
-                self::$tpl->display('layout.tpl');
-            }
+            $page = 'error/error';
+            self::$tpl->assign('page', $page);
 
-            // Msg wieder auf Null setzen...
-            $request->setKey('msg', '');
-
-            // Fehler wieder auf Null setzen...
-            $request->setKey('fehler', '');
+            self::$tpl->display('layout.tpl');
         }
 
+        // Msg wieder auf Null setzen...
+        $request->setKey('msg', '');
+
+        // Fehler wieder auf Null setzen...
+        $request->setKey('fehler', '');
     }
+
+    public function assign($key, $value) {
+        self::$tpl->assign($key, $value);
+    }
+
 }
rename from classes/bfw/mvc/controller/BenutzerverwaltungsController.php
rename to classes/bfw/mvc/controller/BenutzerverwaltungController.php
--- a/classes/bfw/mvc/controller/BenutzerverwaltungsController.php
+++ b/classes/bfw/mvc/controller/BenutzerverwaltungController.php
@@ -1,314 +1,312 @@
 <?php
 
-namespace bfw\mvc\controller {
+namespace bfw\mvc\controller;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+
+use bfw\Dispatcher;
+use bfw\mvc\common\Controller;
+use bfw\mvc\model\TGroup;
+use bfw\mvc\model\TUser;
+
+class BenutzerverwaltungController extends Controller {
+    private static $logger = null;
 
     /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+     * BenutzerverwaltungsController constructor.
      *
      */
-
-    use bfw\Dispatcher;
-    use bfw\mvc\model\Model;
-    use bfw\mvc\model\TGroup;
-    use bfw\mvc\model\TUser;
-
-    class BenutzerverwaltungsController extends Controller {
-        private static $logger = null;
-
-        /**
-         * BenutzerverwaltungsController constructor.
-         *
-         * @param Model $model
-         * @param Request $request
-         */
-        public function __construct($model, $request) {
-
-            parent::__construct($model, $request);
-        }
+    public function __construct() {
 
-        /**
-         *
-         */
-        public function loeschenFunc() {
-            $tUser = $this->getModel();
-            $request = $this->getRequest();
-
-            $uid = $request->session('uid');
-
-            if (!$tUser->delete($uid)) {
-                $request->setKey('fehler', 'Der Benutzer konnte nicht gelöscht werden.');
-                Dispatcher::route('/home/');
-            } else {
-                $request->setKey('msg', 'Der Benutzer wurde gelöscht.');
-            }
-        }
-
-        /**
-         *
-         */
-        public function aendernFunc() {
-            $request = $this->getRequest();
+        $model = new TUser();
+        parent::__construct($model);
+    }
 
-            $uid = $request->session('uid');
-            $username = $request->session('username');
-            $password = $request->session('password');
-            $group_id = $request->session('groupbox');
-
-            $tUser = $this->getModel();
-            $user = $tUser->find($uid);
-
-            $user->setUsername($username);
-            if ($password != '') {
-                $user->setPassword(md5($password));
-            }
-
-            if ($group_id != '') {
-                $user->setGroup_id($group_id);
-            }
+    /**
+     *
+     */
+    public function meinProfil() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
 
-            if ($tUser->store($user->getId(), $user)) {
-                $request->setKey('msg', 'Der Benutzer wurde erfolgreich aktualisiert.');
-            } else {
-                $request->setKey('fehler', 'Der Benutzer konnte nicht aktualisiert werden.');
-            }
-        }
-
-        /**
-         *
-         * @param $currentUser
-         * @return mixed
-         */
-        public function registrierenFunc($currentUser) {
-            $request = $this->getRequest();
+        $username = $request->session('username');
 
-            $password1 = $request->session('password1');
-            $password2 = $request->session('password2');
-
-            if (strlen($password1) == 0) {
-                return $currentUser;
-            }
+        $tUser = $this->getModel();
+        $user = $tUser->find($request->getKey('user_id'));
 
-            // Validierung
-            if ($password1 != $password2) {
-                $request->setKey('fehler', 'Die Passwörter sind verschieden.');
-                return $currentUser;
-            }
-
-            $username = $request->session('username');
+        if ($request->post('aendern') != '') {
             $firstname = $request->session('firstname');
             $lastname = $request->session('lastname');
 
-            $currentUser->setUsername($username);
-            $currentUser->setPassword(md5($password1));
-            $currentUser->setFirstname($firstname);
-            $currentUser->setLastname($lastname);
-            $currentUser->setGroup_Id(TGroup::SUPPORTER);
+            $tUser->setUsername($username);
+            $tUser->setFirstname($firstname);
+            $tUser->setLastname($lastname);
+
+            $password = $request->session('password');
+            if ($password != '') {
+                $tUser->setPassword(md5($password));
+            }
+
+            if ($tUser->store()) {
+                $request->setKey('msg', 'Der Nutzer wurde aktualisiert.');
+                $tUser->findByField('username', $tUser->getUsername());
+            } else {
+                $request->setKey('fehler', 'Der Nutzer konnte nicht aktualisiert werden.');
+            }
+        }
+    }
+
+    /**
+     *
+     */
+    public function abmelden() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $request->deleteKey('username');
+        $request->deleteKey('group_id');
+        $request->destroySession();
 
-            if ($username == '' || $firstname == '' || $lastname == '') {
-                $request->setKey('fehler', 'Sie müssen die Pflichtfelder ausfüllen.');
-                return $currentUser;
+        Dispatcher::route('/');
+    }
+
+    /**
+     *
+     */
+    public function anmelden() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $username = $request->session('username');
+        $password = md5($request->session('password'));
+
+        $tUser = $this->getModel();
+        $user = $tUser->findByUsername($username);
+
+        if ($user == null) {
+            return;
+        }
+
+        if (($username == $user->getUsername()) && ($password == $user->getPassword())) {
+            $request->setKey('isLoggedIn', true);
+            $request->setKey('user_id', $user->getId());
+            $request->setKey('group_id', $user->getGroup_id());
+
+            $tGroup = new TGroup();
+            if (($group = $tGroup->find($user->getGroup_Id())) == null) {
+                $request->setKey('fehler', "DB-Inkonsistenz: Prüfen Sie die exisitierenden Gruppen.");
             }
 
-            if ($currentUser->persist($currentUser)) {
-                $request->setKey('msg', 'Der Nutzer wurde angelegt.');
+            $msg = sprintf('Sie gehören der Gruppe %s an.', $group->getName());
+            $request->setKey('msg', $msg);
 
-                if ($currentUser->findByUsername($currentUser->getUsername())) {
-                    $request->setKey('isLoggedIn', true);
-                    $request->setKey('user_id', $currentUser->getId());
-                    $request->setKey('group_id', $currentUser->getGroup_id());
-
-                    Dispatcher::route('/meinprofil/');
-                }
-            } else {
-                $request->setKey('fehler', 'Der Nutzer konnte nicht angelegt werden.');
+            $lastpage = $request->getKey('lastpage');
+            if ($lastpage == 'benutzerverwaltung/anmelden') {
+                $lastpage = 'tickets/index';
             }
 
+            $request->setKey('lastpage', $lastpage);
+
+            // Routing ist final
+            Dispatcher::route(sprintf('/%s/', $lastpage));
+        }
+
+    }
+
+    /**
+     *
+     */
+    public function registrieren() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $currentUser = new TUser();
+        if ($request->post('registrieren') != '') {
+            $currentUser = $this->registrierenFunc($currentUser);
+        }
+
+        $engine->assign('currentUser', $currentUser);
+    }
+
+    /**
+     *
+     * @param $currentUser
+     * @return mixed
+     */
+    public function registrierenFunc($currentUser) {
+        $request = $this->getRequest();
+
+        $password1 = $request->session('password1');
+        $password2 = $request->session('password2');
+
+        if (strlen($password1) == 0) {
+            return $currentUser;
+        }
+
+        // Validierung
+        if ($password1 != $password2) {
+            $request->setKey('fehler', 'Die Passwörter sind verschieden.');
+            return $currentUser;
+        }
+
+        $username = $request->session('username');
+        $firstname = $request->session('firstname');
+        $lastname = $request->session('lastname');
+
+        $currentUser->setUsername($username);
+        $currentUser->setPassword(md5($password1));
+        $currentUser->setFirstname($firstname);
+        $currentUser->setLastname($lastname);
+        $currentUser->setGroup_Id(TGroup::SUPPORTER);
+
+        if ($username == '' || $firstname == '' || $lastname == '') {
+            $request->setKey('fehler', 'Sie müssen die Pflichtfelder ausfüllen.');
             return $currentUser;
         }
 
-        /**
-         *
-         * @return bool
-         */
-        public function resetPasswordFunc() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
+        if ($currentUser->persist()) {
+            $request->setKey('msg', 'Der Nutzer wurde angelegt.');
+
+            if ($currentUser->findByUsername($currentUser->getUsername())) {
+                $request->setKey('isLoggedIn', true);
+                $request->setKey('user_id', $currentUser->getId());
+                $request->setKey('group_id', $currentUser->getGroup_id());
+
+                Dispatcher::route('/benutzerverwaltung/meinprofil/');
+            }
+        } else {
+            $request->setKey('fehler', 'Der Nutzer konnte nicht angelegt werden.');
+        }
+
+        return $currentUser;
+    }
+
+    /**
+     *
+     */
+    public function index() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $tUser = $this->getModel();
+        $tGroup = new TGroup();
+
+        if ($request->post('loeschen') != '') {
+            $this->loeschenFunc();
+        }
 
-            $username = $request->session('username');
+        if ($request->post('aendern') != '') {
+            $this->aendernFunc();
+        }
+
+        $group_id = $request->getKey('group_id', TGroup::GUEST);
+
+        switch ($group_id) {
+            case TGroup::ADMIN:
+                $users = $tUser->findAll();
+                $groups = $tGroup->findAll();
+                break;
+            case TGroup::MANAGER:
+                $users = $tUser->findAllManagersAndBelow();
+                $groups = $tGroup->findAllManagersAndBelow();
+                break;
+            default:
+                Dispatcher::route('/benutzerverwaltung/home/');
+        }
+
+        $engine->assign('users', $users);
+        $engine->assign('groups', $groups);
+    }
+
+    /**
+     *
+     */
+    public function loeschenFunc() {
+        $tUser = new TUser();
+        $request = $this->getRequest();
+
+        $uid = $request->session('uid');
 
-            if (!$request->hasPost()) {
-                return false;
-            }
+        $tUser->find($uid);
+        if (!$tUser->delete()) {
+            $request->setKey('fehler', 'Der Benutzer konnte nicht gelöscht werden.');
+            Dispatcher::route('/home/');
+        } else {
+            $request->setKey('msg', 'Der Benutzer wurde gelöscht.');
+        }
+    }
+
+    /**
+     *
+     */
+    public function aendernFunc() {
+        $request = $this->getRequest();
 
-            $tUser = $this->getModel();
+        $uid = $request->session('uid');
+        $username = $request->session('username');
+        $password = $request->session('password');
+        $group_id = $request->session('groupbox');
+
+        $tUser = $this->getModel();
+        $user = $tUser->find($uid);
+
+        $user->setUsername($username);
+        if ($password != '') {
+            $user->setPassword(md5($password));
+        }
+
+        if ($group_id != '') {
+            $user->setGroup_id($group_id);
+        }
 
-            if ($tUser->findByUsername($username)) {
-                $tUser->setPassword(md5($tUser->getUsername()));
+        if ($tUser->store()) {
+            $request->setKey('msg', 'Der Benutzer wurde erfolgreich aktualisiert.');
+        } else {
+            $request->setKey('fehler', 'Der Benutzer konnte nicht aktualisiert werden.');
+        }
+    }
+
+    /**
+     *
+     */
+    public function resetpasswort() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
 
-                return $tUser->store($tUser->getId(), $tUser);
+        if ($request->post('pw-reset')) {
+            if ($this->resetPasswordFunc()) {
+                Dispatcher::route('/benutzerverwaltung/anmelden/');
             }
+        }
+    }
 
-            $engine->assign('request', $request);
+    /**
+     *
+     * @return bool
+     */
+    public function resetPasswordFunc() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $username = $request->session('username');
+
+        if (!$request->hasPost()) {
             return false;
         }
 
-        /**
-         *
-         */
-        public function meinProfil() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $username = $request->session('username');
-
-            $tUser = $this->getModel();
-            $user = $tUser->find($request->getKey('user_id'));
-
-            if ($request->post('aendern') != '') {
-                $firstname = $request->session('firstname');
-                $lastname = $request->session('lastname');
-
-                $tUser = new TUser();
-                $tUser->setUsername($username);
-                $tUser->setFirstname($firstname);
-                $tUser->setLastname($lastname);
+        $tUser = $this->getModel();
 
-                $password = $request->session('password');
-                if ($password != '') {
-                    $tUser->setPassword(md5($password));
-                }
+        if ($tUser->findByUsername($username)) {
+            $tUser->setPassword(md5($tUser->getUsername()));
 
-                if ($tUser->store($user->getId(), $tUser)) {
-                    $request->setKey('msg', 'Der Nutzer wurde aktualisiert.');
-                    $tUser->findByField('username', $tUser->getUsername());
-                } else {
-                    $request->setKey('fehler', 'Der Nutzer konnte nicht aktualisiert werden.');
-                }
-            }
-        }
-
-        /**
-         *
-         */
-        public function abmelden() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $request->deleteKey('username');
-            $request->deleteKey('group_id');
-            $request->destroySession();
-
-            Dispatcher::route('/');
+            return $tUser->store();
         }
 
-        /**
-         *
-         */
-        public function anmelden() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $username = $request->session('username');
-            $password = md5($request->session('password'));
-
-            $tUser = $this->getModel();
-            $user = $tUser->findByUsername($username);
-
-            if ($user == null) {
-                return;
-            }
-
-            if (($username == $user->getUsername()) && ($password == $user->getPassword())) {
-                $request->setKey('isLoggedIn', true);
-                $request->setKey('user_id', $user->getId());
-                $request->setKey('group_id', $user->getGroup_id());
-
-                $tGroup = new TGroup();
-                if (($group = $tGroup->find($user->getGroup_Id())) == null) {
-                    $request->setKey('fehler', "DB-Inkonsistenz: Prüfen Sie die exisitierenden Gruppen.");
-                }
-
-                $msg = sprintf('Sie gehören der Gruppe %s an.', $group->getName());
-                $request->setKey('msg', $msg);
-
-                $lastpage = $request->getKey('lastpage');
-                if ($lastpage == 'anmelden') {
-                    $lastpage = 'tickets';
-                }
-
-                $request->setKey('lastpage', $lastpage);
-
-                // Routing ist final
-                Dispatcher::route(sprintf('/%s/', $lastpage));
-            }
-
-        }
-
-        /**
-         *
-         */
-        public function registrieren() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $currentUser = new TUser();
-            if ($request->post('registrieren') != '') {
-                $currentUser = $this->registrierenFunc($currentUser);
-            }
+        $engine->assign('request', $request);
+        return false;
+    }
 
-            $engine->assign('currentUser', $currentUser);
-        }
-
-        /**
-         *
-         */
-        public function index() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $tUser = $this->getModel();
-            $tGroup = new TGroup();
-
-            if ($request->post('loeschen') != '') {
-                $this->loeschenFunc();
-            }
-
-            if ($request->post('aendern') != '') {
-                $this->aendernFunc();
-            }
-
-            $group_id = $request->getKey('group_id', TGroup::GUEST);
-
-            switch ($group_id) {
-                case TGroup::ADMIN:
-                    $users = $tUser->findAll();
-                    $groups = $tGroup->findAll();
-                    break;
-                case TGroup::MANAGER:
-                    $users = $tUser->findAllManagersAndBelow();
-                    $groups = $tGroup->findAllManagersAndBelow();
-                    break;
-                default:
-                    Dispatcher::route('/home/');
-            }
-
-            $engine->assign('users', $users);
-            $engine->assign('groups', $groups);
-        }
-
-        /**
-         *
-         */
-        public function resetpasswort() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            if ($request->post('pw-reset')) {
-                if ($this->resetPasswordFunc()) {
-                    Dispatcher::route('/anmelden/');
-                }
-            }
-        }
-
-    }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/controller/ErrorController.php
+++ b/classes/bfw/mvc/controller/ErrorController.php
@@ -1,21 +1,22 @@
 <?php
 
-namespace bfw\mvc\controller {
+namespace bfw\mvc\controller;
+
+use bfw\mvc\common\Controller;
 
-    /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
-     *
-     */
-    class ErrorController extends Controller {
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+class ErrorController extends Controller {
 
-        public function __construct($model, $request) {
-            parent::__construct($model, $request);
-        }
+    public function __construct($model, $request) {
+        parent::__construct($model, $request);
+    }
 
-        public function index() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-        }
+    public function index() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+    }
 
-    }
 }
--- a/classes/bfw/mvc/controller/HistoryController.php
+++ b/classes/bfw/mvc/controller/HistoryController.php
@@ -1,54 +1,55 @@
 <?php
 
-namespace bfw\mvc\controller {
+namespace bfw\mvc\controller;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
 
-    /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
-     *
-     */
+use bfw\mvc\common\Controller;
+use bfw\mvc\model\TGroup;
+use bfw\mvc\model\THistory;
+use bfw\mvc\model\TTicket;
+use bfw\mvc\model\TUser;
 
-    use bfw\mvc\model\TGroup;
-    use bfw\mvc\model\TTicket;
-    use bfw\mvc\model\TUser;
+class HistoryController extends Controller {
+
+    private $user_id;
+    private $group_id;
+    private $currentTicket;
 
-    class HistoryController extends Controller {
+    public function __construct() {
+        $model = new THistory();
+        parent::__construct($model);
 
-        private $user_id;
-        private $group_id;
-        private $currentTicket;
+        $this->currentTicket = null;
+
+        $request = $this->getRequest();
 
-        public function __construct($model, $request) {
-            parent::__construct($model, $request);
+        $this->user_id = $request->getKey('user_id', TUser::SYSTEM);
+        $this->group_id = $request->getKey('group_id', TGroup::GUEST);
+    }
 
-            $this->currentTicket = null;
+    public function index() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
 
-            $this->user_id = $request->getKey('user_id', TUser::SYSTEM);
-            $this->group_id = $request->getKey('group_id', TGroup::GUEST);
+        $tid = $request->session('tid');
+        $ticket = new TTicket();
+
+        if ($ticket->find($tid) == null) {
+            $request->setKey('fehler', 'Datensatz nicht gefunden.');
         }
 
-        public function index() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $tid = $request->session('tid');
-            $ticket = new TTicket();
-
-            $user_id = $request->session('user_id');
-
-            if ($ticket->find($tid, $user_id) == null) {
-                $request->setKey('fehler', 'Datensatz nicht gefunden.');
-                $ticket = new TTicket();
-            }
-
-            $history = $this->getModel();
-            $histories = $history->findAllByField('ticket_id', $tid);
-            if ($histories == null) {
-                $request->setKey('fehler', 'Die Daten sind nicht aktuell.');
-            }
-
-            $engine->assign('ticket', $ticket);
-            $engine->assign('histories', $histories);
+        $history = $this->getModel();
+        $histories = $history->findAllByField('ticket_id', $tid);
+        if ($histories == null) {
+            $request->setKey('fehler', 'Die Daten sind nicht aktuell.');
         }
 
+        $engine->assign('ticket', $ticket);
+        $engine->assign('histories', $histories);
     }
+
 }
\ No newline at end of file
--- a/classes/bfw/mvc/controller/HomeController.php
+++ b/classes/bfw/mvc/controller/HomeController.php
@@ -1,124 +1,122 @@
 <?php
 
-namespace bfw\mvc\controller {
+namespace bfw\mvc\controller;
+
+use bfw\database\Database;
+use bfw\Dispatcher;
+use bfw\mvc\common\Controller;
+use bfw\mvc\model\TGroup;
+use bfw\mvc\model\TText;
+use bfw\mvc\model\TUser;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+class HomeController extends Controller {
+    const TEXT_ID = 2;
 
     /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+     * HomeController constructor.
      *
      */
+    public function __construct() {
+        $model = new TUser();
+        parent::__construct($model);
+    }
 
-    use bfw\Database;
-    use bfw\Dispatcher;
-    use bfw\mvc\model\Model;
-    use bfw\mvc\model\TGroup;
-    use bfw\mvc\model\TText;
-
-    class HomeController extends Controller {
-        const TEXT_ID = 2;
+    /**
+     * Default Index Action
+     *
+     * Zu berücksichtigen ist hier:
+     *
+     * Sowohl GET-Actions als auch POST Actions werden berücksichtigt
+     */
+    public function index() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
 
         /**
-         * HomeController constructor.
-         *
-         * @param Model $model
-         * @param Request $request
-         */
-        public function __construct($model, $request) {
-            parent::__construct($model, $request);
-        }
-
-        /**
-         *
+         * Reset mit Redirect
          */
-        public function eintragen() {
-            $request = $this->getRequest();
-
-            $tText = new TText();
-            $text = $tText->find(self::TEXT_ID);
+        if ($request->getParameter('reset') == '1') {
+            $this->reset($engine, $request);
 
-            $text->setHeadline($request->session('headline'));
-            $text->setText($request->session('text'));
-
-            if ($tText->store(self::TEXT_ID, $text)) {
-                $request->setKey('msg', 'Der CMS-Text wurde aktualisiert.');
-            } else {
-                $request->setKey('fehler', 'Der CMS-Text kontne nicht aktualisiert werden.');
-            }
+            return;
         }
 
         /**
-         *
+         * Eintragen mit Redirect
          */
-        public function reset() {
-            $request = $this->getRequest();
-            $db = Database::getInstance();
+        if ($request->get('unit') == '1') {
+            $this->unit();
 
-            if (!$db->cleanup()) {
-                $request->deleteParameterKey('reset');
-                $request->setKey('fehler', 'Fehler beim Aufräumen');
-                Dispatcher::route('/');
-            }
+            return;
+        }
 
-            $request->deleteParameterKey('reset');
-            $request->destroySession();
-
-            Dispatcher::route('/');
+        if ($request->post('eintragen') != '') {
+            $this->eintragen();
         }
 
-        /**
-         *
-         */
-        public function unit() {
-            $request = $this->getRequest();
+        $tText = new TText();
+        $group_id = $request->getKey('group_id', TGroup::GUEST);
+
+        $text = $tText->find(self::TEXT_ID);
+        $engine->assign('text', $text);
+        $engine->assign('group_id', $group_id);
+    }
 
-            $db = Database::getInstance();
-            $db->csvImport('t_user', 'data/import/test_users.csv');
-            $db->csvImport('t_ticket', 'data/import/test_tickets.csv');
+    /**
+     *
+     */
+    public function reset() {
+        $request = $this->getRequest();
+        $db = Database::getInstance();
 
-            $request->deleteParameterKey('unit');
-
+        if (!$db->cleanup()) {
+            $request->deleteParameterKey('reset');
+            $request->setKey('fehler', 'Fehler beim Aufräumen');
             Dispatcher::route('/');
         }
 
-        /**
-         * Default Index Action
-         *
-         * Zu berücksichtigen ist hier:
-         *
-         * Sowohl GET-Actions als auch POST Actions werden berücksichtigt
-         */
-        public function index() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
+        $request->deleteParameterKey('reset');
+        $request->destroySession();
+
+        Dispatcher::route('/');
+    }
 
-            /**
-             * Reset mit Redirect
-             */
-            if ($request->getParameter('reset') == '1') {
-                $this->reset($engine, $request);
+    /**
+     *
+     */
+    public function unit() {
+        $request = $this->getRequest();
 
-                return;
-            }
+        $db = Database::getInstance();
+        $db->csvImport('t_user', 'data/import/test_users.csv');
+        $db->csvImport('t_ticket', 'data/import/test_tickets.csv');
+
+        $request->deleteParameterKey('unit');
+
+        Dispatcher::route('/');
+    }
 
-            /**
-             * Eintragen mit Redirect
-             */
-            if ($request->get('unit') == '1') {
-                $this->unit();
+    /**
+     *
+     */
+    public function eintragen() {
+        $request = $this->getRequest();
 
-                return;
-            }
+        $tText = new TText();
+        $text = $tText->find(self::TEXT_ID);
 
-            if ($request->post('eintragen') != '') {
-                $this->eintragen();
-            }
-
-            $tText = new TText();
-            $group_id = $request->getKey('group_id', TGroup::GUEST);
+        $text->setHeadline($request->session('headline'));
+        $text->setText($request->session('text'));
 
-            $text = $tText->find(self::TEXT_ID);
-            $engine->assign('text', $text);
-            $engine->assign('group_id', $group_id);
+        if ($tText->store()) {
+            $request->setKey('msg', 'Der CMS-Text wurde aktualisiert.');
+        } else {
+            $request->setKey('fehler', 'Der CMS-Text kontne nicht aktualisiert werden.');
         }
+    }
 
-    }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/controller/TicketsController.php
+++ b/classes/bfw/mvc/controller/TicketsController.php
@@ -1,351 +1,353 @@
 <?php
 
-namespace bfw\mvc\controller {
+namespace bfw\mvc\controller;
+
+/**
+ * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+ *
+ */
+
+use bfw\Dispatcher;
+use bfw\mvc\common\Controller;
+use bfw\mvc\common\Model;
+use bfw\mvc\model\TGroup;
+use bfw\mvc\model\TStatus;
+use bfw\mvc\model\TTicket;
+use bfw\mvc\model\TUser;
+use Logger;
+
+class TicketsController extends Controller {
+    private $user_id;
+    private $group_id;
+    private $currentTicket;
 
     /**
-     * Copyright(C) 2015 Markus Bröker<broeker.markus@googlemail.com>
+     * TicketsController constructor.
      *
      */
+    public function __construct() {
+        $model = new TTicket();
+        parent::__construct($model);
 
-    use bfw\Dispatcher;
-    use bfw\mvc\model\Model;
-    use bfw\mvc\model\TGroup;
-    use bfw\mvc\model\TStatus;
-    use bfw\mvc\model\TTicket;
-    use bfw\mvc\model\TUser;
+        $this->currentTicket = null;
+
+        $request = $this->getRequest();
+
+        $this->user_id = $request->getKey('user_id', TUser::SYSTEM);
+        $this->group_id = $request->getKey('group_id', TGroup::GUEST);
+    }
+
+    /**
+     * Default Index Action
+     */
+    public function index() {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $user_id = $this->user_id;
+        $group_id = $this->group_id;
+
+        $engine = $this->getView();
+        $currentTicket = $this->currentTicket;
 
-    class TicketsController extends Controller {
-        private $user_id;
-        private $group_id;
-        private $currentTicket;
+        // Umleiten zur Historie
+        if ($request->post('historie') != '') {
+            Dispatcher::route("/history/");
+        }
+
+        // finde das aktuelle Ticket, welches per GET live angegeben wurde.
+        if ($request->get('tid') != '') {
+            $currentTicket = $this->processTickedId($user_id);
+            $this->handleRequest($currentTicket, $user_id, $group_id);
+
+            return;
+        }
+
+        // lade das ausgewählte Ticket, Supporter nehmen es automatisch an.
+        if ($request->post('laden') != '') {
+            $currentTicket = $this->processLaden($user_id);
+            $this->handleRequest($currentTicket, $user_id, $group_id);
+
+            return;
+        }
+
+        // erstelle oder aktualisiere das aktuelle Ticket.
+        if ($request->post('eintragen') != '') {
+            $currentTicket = $this->processEintragen($user_id, $group_id);
+            $this->handleRequest($currentTicket, $user_id, $group_id);
+
+            return;
+        }
 
-        /**
-         * TicketsController constructor.
-         *
-         * @param Model $model
-         * @param Request $request
-         */
-        public function __construct($model, $request) {
-            parent::__construct($model, $request);
+        // lösche das aktuelle Ticket.
+        if ($request->post('loeschen') != '') {
+            $this->processLoeschen($user_id);
+            $this->handleRequest($currentTicket, $user_id, $group_id);
+
+            return;
+        }
+
+        $this->handleRequest($this->currentTicket, $this->user_id, $this->group_id);
+    }
+
+    /**
+     * @param $user_id
+     * @return null|TTicket
+     */
+    public function processTickedId($user_id) {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $tUser = new TUser();
+        $user = $tUser->find($user_id);
+
+        if ($user == null) {
+            $request->setKey('fehler', sprintf('Benutzer(%d) konnte nicht mehr gefunden werden.', $user_id));
+            Dispatcher::route('/');
+        }
+
+        $tid = $request->get('tid');
 
-            $this->currentTicket = null;
+        $tTicket = $this->getModel();
+        $currentTicket = $tTicket->find($tid);
+
+        if ($currentTicket == null) {
+            $request->setKey('fehler', sprintf('Ticket Nr. %d konnte nicht gefunden werden.', $tid));
+
+            return null;
+        }
+
+        if (!$currentTicket->hasPrivilege($currentTicket, $user, false)) {
+            $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
 
-            $this->user_id = $request->getKey('user_id', TUser::SYSTEM);
-            $this->group_id = $request->getKey('group_id', TGroup::GUEST);
+            return null;
         }
 
+        return $currentTicket;
+    }
+
+    /**
+     * <b>Diese Funktion kümmert sich um die Anfragen dieses Ticket-Controllers</b>
+     *
+     * @param $currentTicket
+     * @param $user_id
+     * @param $group_id
+     */
+    public function handleRequest($currentTicket, $user_id, $group_id) {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
         /**
-         * <b>Diese Funktion kümmert sich um die Anfragen dieses Ticket-Controllers</b>
-         *
-         * @param $currentTicket
-         * @param $user_id
-         * @param $group_id
+         * @var TTIcket
          */
-        public function handleRequest($currentTicket, $user_id, $group_id) {
-            $request = $this->getRequest();
-            $engine = $this->getView();
+        $tTicket = $this->getModel();
+
+        $tUser = new TUser();
+        $user = $tUser->find($user_id);
 
-            /**
-             * @var Model
-             */
-            $tTicket = $this->getModel();
-
-            $tUser = new TUser();
-            $user = $tUser->find($user_id);
-
-            /**
-             * 'Cron-Job' ohne 'Cron': Alle Tickets werden bei jedem Zugriff geprüft
-             *
-             * Gibt es Tickets, die derzeit gesperrt sind? Befreie Sie! Free Tickets!!!
-             * Falls Tickets frei sind, weise diese korrekt und fair wieder zu.
-             */
-            $tTicket->unlockTickets($tTicket);
-            $tTicket->reassignFreeTickets();
+        /**
+         * 'Cron-Job' ohne 'Cron': Alle Tickets werden bei jedem Zugriff geprüft
+         *
+         * Gibt es Tickets, die derzeit gesperrt sind? Befreie Sie! Free Tickets!!!
+         * Falls Tickets frei sind, weise diese korrekt und fair wieder zu.
+         */
+        $tTicket->unlockTickets();
+        $tTicket->reassignFreeTickets();
 
-            switch ($group_id) {
-                case TGroup::SUPPORTER:
-                    $tickets = $tTicket->findAllTicketsByUserid($user_id);
-                    if ($tickets == null) {
-                        $request->setKey('fehler', 'Es existieren derzeit keine Tickets für Sie!');
-                    }
+        switch ($group_id) {
+            case TGroup::SUPPORTER:
+                $tickets = $tTicket->findAllTicketsByUserid($user_id);
+                if ($tickets == null) {
+                    $request->setKey('fehler', 'Es existieren derzeit keine Tickets für Sie!');
+                }
 
-                    $users = array($tUser->findByUsername($user->getUsername()));
-                    break;
-                case TGroup::ADMIN:
-                case TGroup::MANAGER:
-                    $tickets = $tTicket->findAll();
-                    $users = $tUser->findAll(false);
-                    break;
-                default:
-                    $tickets = $tTicket->findAll();
-                    $users = $tUser->findAll();
-            }
+                $users = array($tUser->findByUsername($user->getUsername()));
+                break;
+            case TGroup::ADMIN:
+            case TGroup::MANAGER:
+                $tickets = $tTicket->findAll();
+                $users = $tUser->findAll(false);
+                break;
+            default:
+                $tickets = $tTicket->findAll();
+                $users = $tUser->findAll();
+        }
 
-            $tStatus = new TStatus();
-            $statusItems = $tStatus->findAll();
+        $tStatus = new TStatus();
+        $statusItems = $tStatus->findAll();
 
-            // erstelle eine neue Ticket-Instanz, falls es keine instanzierte gibt.
-            if ($currentTicket == null) {
-                $currentTicket = new TTicket();
-            }
-
-            $engine->assign('users', $users);
-            $engine->assign('tStatus', $tStatus);
-            $engine->assign('tickets', $tickets);
-            $engine->assign('statusItems', $statusItems);
-            $engine->assign('currentTicket', $currentTicket);
-            $engine->assign('group_id', $group_id);
+        // erstelle eine neue Ticket-Instanz, falls es keine instanzierte gibt.
+        if ($currentTicket == null) {
+            $currentTicket = new TTicket();
         }
 
-        /**
-         * @param $user_id
-         * @return null|TTicket
-         */
-        public function processTickedId($user_id) {
-            $request = $this->getRequest();
-            $engine = $this->getView();
+        $engine->assign('users', $users);
+        $engine->assign('tStatus', $tStatus);
+        $engine->assign('tickets', $tickets);
+        $engine->assign('statusItems', $statusItems);
+        $engine->assign('currentTicket', $currentTicket);
+        $engine->assign('group_id', $group_id);
+    }
+
+    /**
+     * <b>Ticket nach TID laden</b>
+     *
+     * @param $user_id
+     *
+     * @return null|TTicket
+     */
+    public function processLaden($user_id) {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $tid = $request->session('tid');
+
+        $tTicket = $this->getModel();
+        $currentTicket = $tTicket->find($tid);
 
-            $tUser = new TUser();
-            $user = $tUser->find($user_id);
+        if ($currentTicket == null) {
+            $request->setKey('fehler', sprintf('Ticket Nr. %d konnte nicht gefunden werden.', $tid));
+
+            return null;
+        }
+
+        $tUser = new TUser();
+        $user = $tUser->find($user_id);
+
+        if ($user == null) {
+            $request->setKey('fehler', sprintf('Benutzer(%d) konnte nicht mehr gefunden werden.', $user_id));
+
+            return null;
+        }
+
+        $tTicket->lockTicket($currentTicket, $user);
+
+        if (!$currentTicket->hasPrivilege($currentTicket, $user, true)) {
+            $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
+
+            return null;
+        }
+
+        return $currentTicket;
+    }
 
-            if ($user == null) {
-                $request->setKey('fehler', sprintf('Benutzer(%d) konnte nicht mehr gefunden werden.', $user_id));
-                Dispatcher::route('/');
-            }
+    /**
+     * @param $user_id
+     * @param $group_id
+     * @return Model|null
+     */
+    public function processEintragen($user_id, $group_id) {
+        $request = $this->getRequest();
+        $engine = $this->getView();
+
+        $logger = Logger::getLogger('main');
+
+        $tid = $request->session('tid');
+        $status_id = $request->session('status', TStatus::OFFEN);
+
+        $tTicket = $this->getModel();
+
+        if ($tid != '') {
+            $tTicket->find($tid, $user_id);
+        }
 
-            $tid = $request->get('tid');
+        $tUser = new TUser();
+        $user = $tUser->find($user_id);
+        if ($user == null) {
+            return null;
+        }
+
+        $theHolyUserId = $tTicket->getUser_Id();
+        if ($group_id == TGroup::ADMIN || $group_id == TGroup::MANAGER) {
+            $theHolyUserId = $request->session('user_id');
+        }
+
+        $subject = $request->session('subject');
+        $message = $request->session('message');
 
-            $tTicket = $this->getModel();
-            $currentTicket = $tTicket->find($tid);
+        if (($subject == '') && ($message == '')) {
+            $request->setKey('fehler', sprintf('Füllen Sie die Pflichtfelder aus.'));
+
+            return null;
+        }
 
-            if ($currentTicket == null) {
-                $request->setKey('fehler', sprintf('Ticket Nr. %d konnte nicht gefunden werden.', $tid));
+        $tTicket->setUser_Id($theHolyUserId);
+        $tTicket->setStatus_Id($status_id);
+        $tTicket->setSubject($subject);
+        $tTicket->setMessage($message);
+        $tTicket->setLast_Access(date("Y-m-d H:i:s"));
+
+        if ($tid == '') {
+            if ($tTicket->persist()) {
+                $request->setKey('msg', sprintf('Ein neues Ticket wurde erfolgreich eingetragen.'));
+                $logger->info(sprintf('Ticket wurde eingetragen: (%s)', print_r($tTicket->getData(), true)));
 
                 return null;
             }
-
-            if (!$currentTicket->hasPrivilege($currentTicket, $user, false)) {
-                $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
-
-                return null;
-            }
-
-            return $currentTicket;
-        }
-
-        /**
-         * <b>Ticket nach TID laden</b>
-         *
-         * @param $user_id
-         *
-         * @return null|TTicket
-         */
-        public function processLaden($user_id) {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $tid = $request->session('tid');
-
-            $tTicket = $this->getModel();
-            $currentTicket = $tTicket->find($tid);
-
-            if ($currentTicket == null) {
-                $request->setKey('fehler', sprintf('Ticket Nr. %d konnte nicht gefunden werden.', $tid));
-
-                return null;
-            }
-
-            $tUser = new TUser();
-            $user = $tUser->find($user_id);
-
-            if ($user == null) {
-                $request->setKey('fehler', sprintf('Benutzer(%d) konnte nicht mehr gefunden werden.', $user_id));
-
-                return null;
-            }
-
-            $tTicket->lockTicket($currentTicket, $user);
-
-            if (!$currentTicket->hasPrivilege($currentTicket, $user, true)) {
+        } else {
+            if (!$tTicket->hasPrivilege($tTicket, $user, true)) {
                 $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
 
                 return null;
             }
 
-            return $currentTicket;
+            if ($tTicket->getId() != 1) {
+                if ($tTicket->store()) {
+                    $request->setKey('msg', 'Das Ticket wurde erfolgreich aktualisiert.');
+                    $logger->info(sprintf('Ticket wurde aktualisiert: (%s)', print_r($tTicket->getData(), true)));
+                }
+
+                return $tTicket;
+            }
         }
 
-        /**
-         * <b>Löschen von Tickets</b>
-         *
-         * @return bool
-         */
-        public function processLoeschen($user_id) {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $tid = $request->session('tid');
-
-            $tTicket = $this->getModel();
-            $currentTicket = $tTicket->find($tid);
-
-            if ($currentTicket == null) {
-                $request->setKey('fehler', sprintf('Nicht existierende Tickets(%d) können nicht gelöscht werden.', $tid));
-
-                return false;
-            }
+        return null;
+    }
 
-            $tUser = new TUser();
-            $user = $tUser->find($user_id);
-
-            if ($user == null) {
-                $request->setKey('fehler', sprintf('Benutzer(%d) konnte nicht mehr gefunden werden.', $user_id));
-
-                return false;
-            }
+    /**
+     * <b>Löschen von Tickets</b>
+     *
+     * @return bool
+     */
+    public function processLoeschen($user_id) {
+        $request = $this->getRequest();
+        $engine = $this->getView();
 
-            if (!$currentTicket->hasPrivilege($currentTicket, $user, true)) {
-                $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
-
-                return false;
-            }
+        $tid = $request->session('tid');
 
-            if ($currentTicket->delete($tid)) {
-                $request->setKey('msg', sprintf('Das Ticket mit der Nummer %d wurde gelöscht.', $tid));
+        $tTicket = $this->getModel();
+        $currentTicket = $tTicket->find($tid);
 
-                return true;
-            }
-
-            $request->setKey('fehler', sprintf('Das Ticket mit der Nummer %d konnte nicht gelöscht werden.', $tid));
+        if ($currentTicket == null) {
+            $request->setKey('fehler', sprintf('Nicht existierende Tickets(%d) können nicht gelöscht werden.', $tid));
 
             return false;
         }
 
-        /**
-         * @param $user_id
-         * @param $group_id
-         * @return Model|null
-         */
-        public function processEintragen($user_id, $group_id) {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $logger = Logger::getLogger('main');
-
-            $tid = $request->session('tid');
-            $status_id = $request->session('status', TStatus::OFFEN);
-
-            $tTicket = $this->getModel();
-
-            if ($tid != '') {
-                $tTicket->find($tid, $user_id);
-            }
-
-            $tUser = new TUser();
-            $user = $tUser->find($user_id);
-            if ($user == null) {
-                return null;
-            }
-
-            $theHolyUserId = $tTicket->getUser_Id();
-            if ($group_id == TGroup::ADMIN || $group_id == TGroup::MANAGER) {
-                $theHolyUserId = $request->session('user_id');
-            }
-
-            $subject = $request->session('subject');
-            $message = $request->session('message');
+        $tUser = new TUser();
+        $user = $tUser->find($user_id);
 
-            if (($subject == '') && ($message == '')) {
-                $request->setKey('fehler', sprintf('Füllen Sie die Pflichtfelder aus.'));
-
-                return null;
-            }
-
-            $tTicket->setUser_Id($theHolyUserId);
-            $tTicket->setStatus_Id($status_id);
-            $tTicket->setSubject($subject);
-            $tTicket->setMessage($message);
-            $tTicket->setLast_Access(date("Y-m-d H:i:s"));
-
-            if ($tid == '') {
-                if ($tTicket->persist($tTicket)) {
-                    $request->setKey('msg', sprintf('Ein neues Ticket wurde erfolgreich eingetragen.'));
-                    $logger->info(sprintf('Ticket wurde eingetragen: (%s)', print_r($tTicket->getData(), true)));
+        if ($user == null) {
+            $request->setKey('fehler', sprintf('Benutzer(%d) konnte nicht mehr gefunden werden.', $user_id));
 
-                    return null;
-                }
-            } else {
-                if (!$tTicket->hasPrivilege($tTicket, $user, true)) {
-                    $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
-
-                    return null;
-                }
-
-                if ($tTicket->getId() != 1) {
-                    if ($tTicket->store($tid, $tTicket)) {
-                        $request->setKey('msg', 'Das Ticket wurde erfolgreich aktualisiert.');
-                        $logger->info(sprintf('Ticket wurde aktualisiert: (%s)', print_r($tTicket->getData(), true)));
-                    }
-
-                    return $tTicket;
-                }
-            }
-
-            return null;
+            return false;
         }
 
-        /**
-         * Default Index Action
-         */
-        public function index() {
-            $request = $this->getRequest();
-            $engine = $this->getView();
-
-            $user_id = $this->user_id;
-            $group_id = $this->group_id;
-
-            $engine = $this->getView();
-            $currentTicket = $this->currentTicket;
-
-            // Umleiten zur Historie
-            if ($request->post('historie') != '') {
-                Dispatcher::route("/historie/");
-            }
-
-            // finde das aktuelle Ticket, welches per GET live angegeben wurde.
-            if ($request->get('tid') != '') {
-                $currentTicket = $this->processTickedId($user_id);
-                $this->handleRequest($currentTicket, $user_id, $group_id);
-
-                return;
-            }
+        if (!$currentTicket->hasPrivilege($currentTicket, $user, true)) {
+            $request->setKey('fehler', sprintf('Ihnen fehlen die Berechtigungen für das Ticket Nr. %d.', $tid));
 
-            // lade das ausgewählte Ticket, Supporter nehmen es automatisch an.
-            if ($request->post('laden') != '') {
-                $currentTicket = $this->processLaden($user_id);
-                $this->handleRequest($currentTicket, $user_id, $group_id);
-
-                return;
-            }
-
-            // erstelle oder aktualisiere das aktuelle Ticket.
-            if ($request->post('eintragen') != '') {
-                $currentTicket = $this->processEintragen($user_id, $group_id);
-                $this->handleRequest($currentTicket, $user_id, $group_id);
-
-                return;
-            }
-
-            // lösche das aktuelle Ticket.
-            if ($request->post('loeschen') != '') {
-                $this->processLoeschen($user_id);
-                $this->handleRequest($currentTicket, $user_id, $group_id);
-
-                return;
-            }
-
-            $this->handleRequest($this->currentTicket, $this->user_id, $this->group_id);
+            return false;
         }
 
+        if ($currentTicket->delete($tid)) {
+            $request->setKey('msg', sprintf('Das Ticket mit der Nummer %d wurde gelöscht.', $tid));
+
+            return true;
+        }
+
+        $request->setKey('fehler', sprintf('Das Ticket mit der Nummer %d konnte nicht gelöscht werden.', $tid));
+
+        return false;
     }
+
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TAction.php
+++ b/classes/bfw/mvc/model/TAction.php
@@ -1,26 +1,27 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
 
-    /**
-     * Class TAction
-     *
-     * @method string getName()
-     * @mthod setName($param)
-     */
-    class TAction extends Model {
-        const ANGELEGT = 2;
-        const GEANDERT = 3;
-        const GELOESCHT = 4;
+/**
+ * Class TAction
+ *
+ * @method string getName()
+ * @mthod setName($param)
+ */
+class TAction extends Model {
+    const ANGELEGT = 2;
+    const GEANDERT = 3;
+    const GELOESCHT = 4;
 
-        public function __construct() {
-            parent::__construct('t_action');
+    public function __construct() {
+        parent::__construct('t_action');
 
-            $this->data = array(
-                'id' => NULL,
-                'name' => '',
-            );
-        }
+        $this->data = array(
+            'id' => NULL,
+            'name' => '',
+        );
+    }
 
-    }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TGroup.php
+++ b/classes/bfw/mvc/model/TGroup.php
@@ -1,60 +1,61 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
+
+/**
+ * Class TGroup
+ *
+ * @method string getName()
+ * @mthod setName($param)
+ */
+class TGroup extends Model {
+    const GUEST = 5;
+    const SUPPORTER = 4;
+    const MANAGER = 3;
+    const ADMIN = 2;
+    const SYSTEM = 1;
+
+    public function __construct() {
+        parent::__construct('t_group');
+
+        $this->data = array(
+            'id' => NULL,
+            'name' => '',
+        );
+    }
 
     /**
-     * Class TGroup
+     * @param $name
+     * @return array|null
+     */
+    public function findByName($name) {
+        return $this->db->findByField('t_group', 'name', $name);
+    }
+
+    /**
+     * <b>Besorgt ein Array mit der Liste der Manager und Darunter</b>
      *
-     * @method string getName()
-     * @mthod setName($param)
+     * @return array|null
      */
-    class TGroup extends Model {
-        const GUEST = 5;
-        const SUPPORTER = 4;
-        const MANAGER = 3;
-        const ADMIN = 2;
-        const SYSTEM = 1;
+    public function findAllManagersAndBelow() {
+        /**
+         * SYSTEM = 1
+         * ADMIN = 2
+         *  [MANAGER = 3, SUPPORTER = 4]
+         * GUEST = 5
+         */
+        $groups = $this->db->fetchAll($this->table, 'id > 2 and id < 5');
 
-        public function __construct() {
-            parent::__construct('t_group');
+        $list = array();
+        foreach ($groups as $group) {
+            $item = new static();
+            $item->data = $group;
 
-            $this->data = array(
-                'id' => NULL,
-                'name' => '',
-            );
+            $list[] = $item;
         }
 
-        /**
-         * @param $name
-         * @return array|null
-         */
-        public function findByName($name) {
-            return $this->db->findByField('t_group', 'name', $name);
-        }
-
-        /**
-         * <b>Besorgt ein Array mit der Liste der Manager und Darunter</b>
-         *
-         * @return array|null
-         */
-        public function findAllManagersAndBelow() {
-            /**
-             * SYSTEM = 1
-             * ADMIN = 2
-             *  [MANAGER = 3, SUPPORTER = 4]
-             * GUEST = 5
-             */
-            $groups = $this->db->fetchAll($this->table, 'id > 2 and id < 5');
-
-            $list = array();
-            foreach ($groups as $group) {
-                $item = new static();
-                $item->data = $group;
-
-                $list[] = $item;
-            }
-
-            return $list;
-        }
+        return $list;
     }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/THistory.php
+++ b/classes/bfw/mvc/model/THistory.php
@@ -1,84 +1,85 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
+
+/**
+ * Class THistory
+ *
+ * @method getTicket_Id()
+ * @method getAction_Id()
+ * @method getUser_Id()
+ * @method getStatus_Id()
+ *
+ * @method getSubject()
+ * @method getMessage()
+ *
+ * @method getLocked()
+ * @method getLast_Access()
+ *
+ * @method setTicket_Id($param)
+ * @method setAction_Id($param)
+ * @method setUser_Id($param)
+ * @method setStatus_Id($param)
+ *
+ * @method setSubject($param)
+ * @method setMessage($param)
+ *
+ * @method setLocked($locked)
+ * @method setLast_Access($lastAccess)
+ *
+ */
+class THistory extends Model {
+
+    public function __construct() {
+        parent::__construct('t_history');
+
+        $this->data = array(
+            'id' => NULL,
+            'ticked_id' => 1,
+            'action_id' => 1,
+            'user_id' => 1,
+            'status_id' => 1,
+            'subject' => '',
+            'message' => '',
+            'locked' => false,
+            'last_access' => 'now()',
+        );
+    }
 
     /**
-     * Class THistory
-     *
-     * @method getTicket_Id()
-     * @method getAction_Id()
-     * @method getUser_Id()
-     * @method getStatus_Id()
-     *
-     * @method getSubject()
-     * @method getMessage()
-     *
-     * @method getLocked()
-     * @method getLast_Access()
+     * <b>Liefert das Name-Attribut der jeweiligen Action</b>
      *
-     * @method setTicket_Id($param)
-     * @method setAction_Id($param)
-     * @method setUser_Id($param)
-     * @method setStatus_Id($param)
-     *
-     * @method setSubject($param)
-     * @method setMessage($param)
-     *
-     * @method setLocked($locked)
-     * @method setLast_Access($lastAccess)
-     *
+     * @return string
      */
-    class THistory extends Model {
+    public function getActionName() {
+        $action = new TAction();
+        $action->find($this->getAction_Id());
 
-        public function __construct() {
-            parent::__construct('t_history');
+        return $action->getName();
+    }
 
-            $this->data = array(
-                'id' => NULL,
-                'ticked_id' => 1,
-                'action_id' => 1,
-                'user_id' => 1,
-                'status_id' => 1,
-                'subject' => '',
-                'message' => '',
-                'locked' => false,
-                'last_access' => 'now()',
-            );
-        }
-
-        /**
-         * <b>Liefert das Name-Attribut der jeweiligen Action</b>
-         *
-         * @return string
-         */
-        public function getActionName() {
-            $action = new TAction();
-            $action->find($this->getAction_Id());
+    /**
+     * <b>Liefert das Name-Attribut des jeweiligen Status</b>
+     *
+     * @return string|null
+     */
+    public function getStatusName() {
+        $status = new TStatus();
+        $status->find($this->getStatus_Id());
 
-            return $action->getName();
-        }
-
-        /**
-         * <b>Liefert das Name-Attribut des jeweiligen Status</b>
-         *
-         * @return string|null
-         */
-        public function getStatusName() {
-            $status = new TStatus();
-            $status->find($this->getStatus_Id());
+        return $status->getName();
+    }
 
-            return $status->getName();
-        }
+    /**
+     * <b>Liefert das jeweilige Username Attribut des angebenen Benutzers</b>
+     *
+     * @return string
+     */
+    public function getUsername() {
+        $user = new TUser();
 
-        /**
-         * <b>Liefert das jeweilige Username Attribut des angebenen Benutzers</b>
-         *
-         * @return string
-         */
-        public function getUsername() {
-            $user = new TUser();
-
-            return $user->getFormattedUsername($this->getUser_Id());
-        }
+        return $user->getFormattedUsername($this->getUser_Id());
     }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TStatus.php
+++ b/classes/bfw/mvc/model/TStatus.php
@@ -1,36 +1,37 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
+
+/**
+ * Class TStatus
+ *
+ * @method getName()
+ */
+class TStatus extends Model {
+    const OFFEN = 2;
+    const GESCHLOSSEN = 3;
+
+    public function __construct() {
+        parent::__construct('t_status');
+
+        $this->data = array(
+            'id' => NULL,
+            'name' => '',
+        );
+
+    }
 
     /**
-     * Class TStatus
+     * <b>Liefert den Bezeichner des angegebenen PKs der Status-Instanz<</b>
      *
-     * @method getName()
+     * @param $id
+     * @return mixed
      */
-    class TStatus extends Model {
-        const OFFEN = 2;
-        const GESCHLOSSEN = 3;
-
-        public function __construct() {
-            parent::__construct('t_status');
+    public function getFormattedStatus($id) {
+        $status = $this->find($id);
 
-            $this->data = array(
-                'id' => NULL,
-                'name' => '',
-            );
-
-        }
-
-        /**
-         * <b>Liefert den Bezeichner des angegebenen PKs der Status-Instanz<</b>
-         *
-         * @param $id
-         * @return mixed
-         */
-        public function getFormattedStatus($id) {
-            $status = $this->find($id);
-
-            return $status->getName();
-        }
+        return $status->getName();
     }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TText.php
+++ b/classes/bfw/mvc/model/TText.php
@@ -1,28 +1,29 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
 
-    /**
-     * Class TText
-     *
-     * @method int getUser_Id()
-     * @method string getHeadline()
-     * @method string getText()
-     * @method setUser_Id($param)
-     * @method setHeadline($param)
-     * @method setText($param)
-     */
-    class TText extends Model {
-        public function __construct() {
-            parent::__construct('t_text');
+/**
+ * Class TText
+ *
+ * @method int getUser_Id()
+ * @method string getHeadline()
+ * @method string getText()
+ * @method setUser_Id($param)
+ * @method setHeadline($param)
+ * @method setText($param)
+ */
+class TText extends Model {
+    public function __construct() {
+        parent::__construct('t_text');
 
-            $this->data = array(
-                'id' => NULL,
-                'user_id' => 1,
-                'headline' => '',
-                'text' => '',
-            );
+        $this->data = array(
+            'id' => NULL,
+            'user_id' => 1,
+            'headline' => '',
+            'text' => '',
+        );
 
-        }
     }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TTicket.php
+++ b/classes/bfw/mvc/model/TTicket.php
@@ -1,196 +1,201 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
+use Logger;
+
+/**
+ * Class TTicket
+ *
+ * @method int getUser_Id()
+ * @method int getStatus_Id()
+ * @method string getSubject()
+ * @method string getMessage()
+ * @method bool getLocked()
+ * @method timestamp getLast_Access()
+ *
+ * @method setStatus_Id($param)
+ * @method setSubject($param)
+ * @method setMessage($param)
+ * @method setLocked($param)
+ * @method setLast_Access($param)
+ *
+ */
+class TTicket extends Model {
+    private static $logger = null;
+
+    public function __construct() {
+        parent::__construct('t_ticket');
+
+        self::$logger = Logger::getLogger('__CLASS__');
+
+        $this->data = array(
+            'id' => NULL,
+            'user_id' => 1,
+            'status_id' => 1,
+            'subject' => '',
+            'message' => '',
+            'locked' => 0,
+            'last_access' => 'now()',
+        );
+    }
 
     /**
-     * Class TTicket
+     * <b>Findet alle Tickets des angegebenen Nutzers</b>
+     *
      *
-     * @method int getUser_Id()
-     * @method int getStatus_Id()
-     * @method string getSubject()
-     * @method string getMessage()
-     * @method bool getLocked()
-     * @method timestamp getLast_Access()
-     *
-     * @method setStatus_Id($param)
-     * @method setSubject($param)
-     * @method setMessage($param)
-     * @method setLocked($param)
-     * @method setLast_Access($param)
-     *
+     * @param SERIAL $uid
+     * @return array|null
      */
-    class TTicket extends Model {
-        private static $logger = null;
-
-        public function __construct() {
-            parent::__construct('t_ticket');
-
-            self::$logger = \Logger::getLogger('__CLASS__');
+    public function findAllTicketsByUserid($uid) {
+        return $this->findAllByField('user_id', $uid);
+    }
 
-            $this->data = array(
-                'id' => NULL,
-                'user_id' => 1,
-                'status_id' => 1,
-                'subject' => '',
-                'message' => '',
-                'locked' => 0,
-                'last_access' => 'now()',
-            );
+    /**
+     * <b>Weisst frei gewordenen Tickets automatisiert zu.</b>
+     */
+    public function reassignFreeTickets() {
+        $tickets = $this->findAllByField('user_id', 1);
+
+        if (!is_object($tickets)) {
+            return;
         }
 
-        /**
-         * <b>Findet alle Tickets des angegebenen Nutzers</b>
-         *
-         *
-         * @param SERIAL $uid
-         * @return array|null
-         */
-        public function findAllTicketsByUserid($uid) {
-            return $this->findAllByField('user_id', $uid);
-        }
+        $tUser = new TUser();
+        foreach ($tickets as $ticket) {
+            $freeSupporterId = $tUser->getFreeSupporterId();
 
-        /**
-         * <b>Weisst frei gewordenen Tickets automatisiert zu.</b>
-         */
-        public function reassignFreeTickets() {
-            $tickets = $this->findAllByField('user_id', 1);
-
-            $tUser = new TUser();
-            foreach ($tickets as $ticket) {
-                $freeSupporterId = $tUser->getFreeSupporterId();
+            /**
+             * Niemals vergessen: Nur aktualisieren, wenn auch
+             * aktualisiert werden muss.
+             *
+             */
+            if ($freeSupporterId > 1) {
+                $ticket->setUser_Id($freeSupporterId);
+                if ($ticket->store()) {
+                    self::$logger->info(sprintf("TICKET %d wurde neu zugewiesen.", $ticket->getId()));
+                }
+            }
+        }
+    }
 
-                /**
-                 * Niemals vergessen: Nur aktualisieren, wenn auch
-                 * aktualisiert werden muss.
-                 *
-                 */
-                if ($freeSupporterId > 1) {
-                    $ticket->setUser_Id($freeSupporterId);
-                    if ($ticket->store($ticket->getId(), $ticket)) {
-                        self::$logger->info(sprintf("TICKET %d wurde neu zugewiesen.", $ticket->getId()));
-                    }
+    public function lockTicket($ticket, $user) {
+        if ($user->getGroup_id() == TGroup::SUPPORTER) {
+            if ($ticket->getLocked() == false) {
+                $ticket->setLocked(1);
+                $ticket->setLast_Access(date('Y-m-d H:i:s'));
+
+                if ($ticket->store()) {
+                    self::$logger->info(sprintf("TICKET %d wurde gesperrt", $ticket->getId()));
+                    return true;
                 }
             }
         }
 
-        public function lockTicket($ticket, $user) {
-            if ($user->getGroup_id() == TGroup::SUPPORTER) {
-                if ($ticket->getLocked() == false) {
-                    $ticket->setLocked(1);
-                    $ticket->setLast_Access(date('Y-m-d H:i:s'));
+        return false;
+    }
+
+    /**
+     * <b>Das Ticket wird automatisch entsperrt nach 2 Stunden</b>
+     *
+     * @return bool
+     */
+    public function unlockTickets() {
+        $tickets = $this->findAll(false);
+        $user = new TUser();
+
+        foreach ($tickets as $ticket) {
+            if ($ticket->getStatus_Id() == TStatus::GESCHLOSSEN) {
+                continue;
+            }
+
+            // Ticketalter
+            $ticketAge = time() - strtotime($ticket->getLast_Access());
 
-                    if ($this->store($ticket->getId(), $ticket)) {
-                        self::$logger->info(sprintf("TICKET %d wurde gesperrt", $ticket->getId()));
-                        return true;
+            // Die Bearbeitungszeit beträgt 2 Stunden pro Supporter
+            $deadLine = 3600 * 2;
+
+            self::$logger->info('Ticket-Alter: ' . $ticketAge);
+            self::$logger->info('Deadline: ' . $deadLine);
+
+            if ($ticketAge > $deadLine) {
+                self::$logger->info('Time is up: Daten werden geändert.');
+                $freeSupporterId = $user->getFreeSupporterId();
+
+                if ($freeSupporterId > 1) {
+                    $ticket->setUser_Id($freeSupporterId);
+                    $ticket->setLocked(0);
+
+                    if (!$ticket->store()) {
+                        self::$logger->info(sprintf('Fehler beim Schreiben: %s', print_r($ticket->getData(), true)));
                     }
+                } else {
+                    // Es existieren keine Supporter
+                    self::$logger->info(sprintf("%s(): Es existieren keine Supporter!", __METHOD__));
                 }
             }
-
-            return false;
         }
 
-        /**
-         * <b>Das Ticket wird automatisch entsperrt nach 2 Stunden</b>
-         *
-         * @param $tTicket
-         * @return bool
-         */
-        public function unlockTickets($tTicket) {
-            $tickets = $tTicket->findAll(false);
-            $user = new TUser();
-
-            foreach ($tickets as $ticket) {
-                if ($ticket->getStatus_Id() == TStatus::GESCHLOSSEN) {
-                    continue;
-                }
-
-                // Ticketalter
-                $ticketAge = time() - strtotime($ticket->getLast_Access());
-
-                // Die Bearbeitungszeit beträgt 2 Stunden pro Supporter
-                $deadLine = 3600 * 2;
+        return false;
+    }
 
-                self::$logger->info('Ticket-Alter: ' . $ticketAge);
-                self::$logger->info('Deadline: ' . $deadLine);
-
-                if ($ticketAge > $deadLine) {
-                    self::$logger->info('Time is up: Daten werden geändert.');
-                    $freeSupporterId = $user->getFreeSupporterId();
-
-                    if ($freeSupporterId > 1) {
-                        $ticket->setUser_Id($freeSupporterId);
-                        $ticket->setLocked(0);
+    /**
+     * <b>Überladene find Methode</b>
+     *
+     * In früheren Versionen wurde hier das Ticket 'on the fly' modifiziert.
+     * Da das aber nicht Sinn und Zweck einer 'find' Methode ist, wurde das
+     * wieder entfernt und die Modifizierung erfolgt außerhalb...
+     *
+     * <b>Sinn und Zweck dieser Methode ist: 'Ticket-ID: nnn' ins Log zu schreiben...</b>
+     *
+     * @param $id
+     *
+     * @return array|null
+     */
+    public function find($id) {
+        self::$logger->info(sprintf("Ticket-ID: %d", $id));
 
-                        if ($this->store($ticket->getId(), $ticket)) {
-                            continue;
-                        }
-                    } else {
-                        // Es existieren keine Supporter
-                        self::$logger->info(sprintf("%s(): Es existieren keine Supporter!", __METHOD__));
-                    }
-                }
-            }
+        return parent::find($id);
+    }
 
+    /**
+     * <b>Prüft, ob der übergebene Nutzer überhaupt die Berechtigung für das übergebene Ticket besitzt.</b>
+     *
+     * @param $ticket
+     * @param $user
+     * @return bool
+     */
+    public function hasPrivilege($ticket, $user, $write = true) {
+
+        // NULL Tickets: Kein Zugriff
+        if (!is_object($ticket)) {
+            self::$logger->warn(sprintf("%s(): Ticket wurde nicht initialisiert!", __METHOD__));
             return false;
         }
 
-        /**
-         * <b>Überladene find Methode</b>
-         *
-         * In früheren Versionen wurde hier das Ticket 'on the fly' modifiziert.
-         * Da das aber nicht Sinn und Zweck einer 'find' Methode ist, wurde das
-         * wieder entfernt und die Modifizierung erfolgt außerhalb...
-         *
-         * <b>Sinn und Zweck dieser Methode ist: 'Ticket-ID: nnn' ins Log zu schreiben...</b>
-         *
-         * @param $id
-         *
-         * @return array|null
-         */
-        public function find($id) {
-            self::$logger->info(sprintf("Ticket-ID: %d", $id));
+        // NULL User: Kein Zugriff
+        if (!is_object($user)) {
+            self::$logger->warn(sprintf("%s(): Benutzer wurde nicht initialisiert!", __METHOD__));
+            return false;
+        }
 
-            return parent::find($id);
+        // ADMIN UND MANAGER: Zugriff per Default
+        switch ($user->getGroup_Id()) {
+            case TGroup::ADMIN:
+            case TGroup::MANAGER:
+                return true;
         }
 
-        /**
-         * <b>Prüft, ob der übergebene Nutzer überhaupt die Berechtigung für das übergebene Ticket besitzt.</b>
-         *
-         * @param $ticket
-         * @param $user
-         * @return bool
-         */
-        public function hasPrivilege($ticket, $user, $write = true) {
-
-            // NULL Tickets: Kein Zugriff
-            if (!is_object($ticket)) {
-                self::$logger->warn(sprintf("%s(): Ticket wurde nicht initialisiert!", __METHOD__));
-                return false;
+        if ($write == false) {
+            // System-Datensatz herausfiltern
+            if ($ticket->getId() > 1) {
+                return true;
             }
-
-            // NULL User: Kein Zugriff
-            if (!is_object($user)) {
-                self::$logger->warn(sprintf("%s(): Benutzer wurde nicht initialisiert!", __METHOD__));
-                return false;
-            }
-
-            // ADMIN UND MANAGER: Zugriff per Default
-            switch ($user->getGroup_Id()) {
-                case TGroup::ADMIN:
-                case TGroup::MANAGER:
-                    return true;
-            }
-
-            if ($write == false) {
-                // System-Datensatz herausfiltern
-                if ($ticket->getId() > 1) {
-                    return true;
-                }
-            }
-
-            // Ticketbasierter Zugriff: Ticket-Owner == Angemeldeter Benutzer?
-            return ($ticket->getUser_Id() == $user->getId());
         }
 
+        // Ticketbasierter Zugriff: Ticket-Owner == Angemeldeter Benutzer?
+        return ($ticket->getUser_Id() == $user->getId());
     }
+
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TUser.php
+++ b/classes/bfw/mvc/model/TUser.php
@@ -1,103 +1,110 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
+use Logger;
+
+/**
+ * Class TUser
+ *
+ * @method string getUsername()
+ * @method int getGroup_Id()
+ * @method string getPassword()
+ * @method string getFirstname()
+ * @method string getLastname()
+ * @method setUsername()
+ * @method setGroup_Id()
+ * @method setPassword()
+ * @method setFirstname()
+ * @method setLastname()
+ */
+class TUser extends Model {
+    const SYSTEM = 1;
+    private static $logger = null;
+
+    public function __construct() {
+        parent::__construct('t_user');
+
+        self::$logger = Logger::getLogger('__CLASS__');
+
+        $this->data = array(
+            'id' => NULL,
+            'group_id' => TGroup::SYSTEM,
+            'username' => '',
+            'firstname' => '',
+            'lastname' => '',
+            'password' => '',
+        );
+    }
 
     /**
-     * Class TUser
+     * <b>Liefert eine User-Instanz für den per Parameter übergebenen Nutzernamen.</b>
      *
-     * @method string getUsername()
-     * @method int getGroup_Id()
-     * @method string getPassword()
-     * @method string getFirstname()
-     * @method string getLastname()
-     * @method setUsername()
-     * @method setGroup_Id()
-     * @method setPassword()
-     * @method setFirstname()
-     * @method setLastname()
+     * @param $username
+     * @return array|null
      */
-    class TUser extends Model {
-        private static $logger = null;
+    public function findByUsername($username) {
+        $this->data = $this->db->findByField($this->table, 'username', $username);
 
-        const SYSTEM = 1;
-
-        public function __construct() {
-            parent::__construct('t_user');
-
-            self::$logger = \Logger::getLogger('__CLASS__');
-
-            $this->data = array(
-                'id' => NULL,
-                'group_id' => TUser::SYSTEM,
-                'username' => '',
-                'firstname' => '',
-                'lastname' => '',
-                'password' => '',
-            );
+        if ($this->data == null) {
+            return null;
         }
 
-        /**
-         * <b>Liefert eine User-Instanz für den per Parameter übergebenen Nutzernamen.</b>
-         *
-         * @param $username
-         * @return array|null
-         */
-        public function findByUsername($username) {
-            $this->data = $this->db->findByField($this->table, 'username', $username);
+        return $this;
+    }
 
-            if ($this->data == null) {
-                return null;
-            }
+    /**
+     * <b>Liefert den formatierten Nutzernamen zur übergebenen Nutzer-Id</b>
+     *
+     * @param $user_id
+     * @return string
+     */
+    public function getFormattedUsername($user_id) {
+        $user = $this->find($user_id);
 
-            return $this;
+        if (!is_object($user)) {
+            return 'Unbekannt, Unbekannt';
         }
 
-        /**
-         * <b>Liefert den formatierten Nutzernamen zur übergebenen Nutzer-Id</b>
-         *
-         * @param $user_id
-         * @return string
-         */
-        public function getFormattedUsername($user_id) {
-            $user = $this->find($user_id);
-            return sprintf("%s, %s", $user->getLastname(), $user->getFirstname());
-        }
+        return sprintf("%s, %s", $user->getLastname(), $user->getFirstname());
+    }
 
-        /**
-         * <b>FindMethode für alle Manager und Darunter</b>
-         *
-         * @return array|null
-         */
-        public function findAllManagersAndBelow() {
-            $managers = $this->db->query(sprintf("
+    /**
+     * <b>FindMethode für alle Manager und Darunter</b>
+     *
+     * @return array|null
+     */
+    public function findAllManagersAndBelow() {
+        $managers = $this->db->query(sprintf("
             SELECT
                 *
             FROM
               `%s`
             WHERE
               `group_id` in (3,4,5)",
-                $this->table));
+            $this->table));
 
-            $list = array();
-            foreach ($managers as $manager) {
-                $item = new static();
-                $item->data = $manager;
+        $list = array();
+        foreach ($managers as $manager) {
+            $item = new static();
+            $item->data = $manager;
 
-                $list[] = $item;
-            }
-
-            return $list;
+            $list[] = $item;
         }
 
-        /**
-         * liefert den PK des nächst freien Supporters oder
-         * im Falle von nicht vorhandenen Supportern den System-Datensatz
-         *
-         * @return int
-         */
-        public function getFreeSupporterId() {
+        return $list;
+    }
 
-            $sql = sprintf("
+    /**
+     * liefert den PK des nächst freien Supporters oder
+     * im Falle von nicht vorhandenen Supportern den System-Datensatz
+     *
+     * @return int
+     */
+    public function getFreeSupporterId() {
+
+        $sql = sprintf("
           SELECT
 	        u.id,
 	        COUNT(t.user_id) AS `count`
@@ -113,25 +120,25 @@
             `count` ASC
         ");
 
-            $data = $this->db->query($sql);
+        $data = $this->db->query($sql);
 
-            if ($data == null) {
-                // Ich will hier definitiv immer eine gültige ID haben, also einen PK
-                return 1;
-            }
-
-            self::$logger->info(sprintf("Data: %s", print_r($data, true)));
-
-            return $data[0]['id'];
+        if ($data == null) {
+            // Ich will hier definitiv immer eine gültige ID haben, also einen PK
+            return 1;
         }
 
-        /**
-         * <b>Anzahl der Tickets eines Benutzers</b>
-         *
-         * @return mixed
-         */
-        public function getTicketCount() {
-            $sql = sprintf("
+        self::$logger->info(sprintf("Data: %s", print_r($data, true)));
+
+        return $data[0]['id'];
+    }
+
+    /**
+     * <b>Anzahl der Tickets eines Benutzers</b>
+     *
+     * @return mixed
+     */
+    public function getTicketCount() {
+        $sql = sprintf("
             SELECT
               count(*) as anzahl
             FROM
@@ -140,10 +147,9 @@
                 user_id = %d
         ", $this->getId());
 
-            $data = $this->db->query($sql);
+        $data = $this->db->query($sql);
 
-            return $data[0]['anzahl'];
-        }
+        return $data[0]['anzahl'];
+    }
 
-    }
 }
\ No newline at end of file
--- a/classes/bfw/mvc/model/TView.php
+++ b/classes/bfw/mvc/model/TView.php
@@ -1,58 +1,54 @@
 <?php
 
-namespace bfw\mvc\model {
+namespace bfw\mvc\model;
+
+use bfw\mvc\common\Model;
+
+/**
+ * Class TView
+ *
+ * @method string getId()
+ */
+class TView extends Model {
 
     /**
-     * Class TView
+     * Nur Get-Methoden im View
      *
-     * @method string getId()
+     * @param $methodName
+     * @param null $params
+     * @return mixed
      */
-    class TView extends Model {
+    public function __call($methodName, $params = null) {
+        $prefix = substr($methodName, 0, 3);
+        $key = strtolower(substr($methodName, 3));
 
-        /**
-         * Nur Get-Methoden im View
-         *
-         * @param $methodName
-         * @param null $params
-         * @return mixed
-         */
-        public function __call($methodName, $params = null) {
-            $prefix = substr($methodName, 0, 3);
-            $key = strtolower(substr($methodName, 3));
-
-            if ($prefix == 'get') {
-                if (array_key_exists($key, $this->data)) {
-                    return $this->data[$key];
-                }
+        if ($prefix == 'get') {
+            if (array_key_exists($key, $this->data)) {
+                return $this->data[$key];
             }
-
-            exit(sprintf('Unbekannte Methode %s(%s, %s) wurde aufgerufen.', $methodName, $key, $prefix));
         }
 
-        /**
-         * @param $id
-         * @param $object
-         * @return bool
-         */
-        public function store($id, $object) {
-            return false;
-        }
+        exit(sprintf('Unbekannte Methode %s(%s, %s) wurde aufgerufen.', $methodName, $key, $prefix));
+    }
+
+    /**
+     * @return bool
+     */
+    public function store() {
+        return false;
+    }
 
-        /**
-         * @param $id
-         * @return bool
-         */
-        public function delete($id) {
-            return false;
-        }
+    /**
+     * @return bool
+     */
+    public function delete() {
+        return false;
+    }
 
-        /**
-         * @param $id
-         * @param $object
-         * @return bool
-         */
-        public function persist($id, $object) {
-            return false;
-        }
+    /**
+     * @return bool
+     */
+    public function persist() {
+        return false;
     }
 }
\ No newline at end of file