diff --git a/registration-system/admin/pages_cost.php b/registration-system/admin/pages_cost.php
index ac0e66a51bafeb072ecb51bb30e0d25da7bf515a..6749aeb07067e99c38e43fe607213a5511022d64 100644
--- a/registration-system/admin/pages_cost.php
+++ b/registration-system/admin/pages_cost.php
@@ -1,134 +1,10 @@
 <?php
-/**
- * Created by PhpStorm.
- * User: tim
- * Date: 10/4/14
- * Time: 9:36 PM
- */
-
-global $text, $headers, $admin_db, $config_current_fahrt_id, $ajax, $config_reisearten, $config_reisearten_o, $config_studitypen_o, $config_admin_verbose_level, $config_verbose_level, $config_essen;
-
-// AJAX requests up here ============================================================
-if(isset($_REQUEST['ajax'])){
-
-    $data = "";
-    $fid  = $config_current_fahrt_id;
-    $task = $_REQUEST['ajax'];
-
-    if(isset($_REQUEST['data'])){
-        $data = $_REQUEST['data'];
-    } elseif( strpos($task, "set")!==false && strpos($task, "json")!==false ){
-        $data = file_get_contents("php://input");
-    }
-
-    if(!$admin_db->has("cost", ["fahrt_id" => $fid]))
-        $admin_db->insert("cost", ["fahrt_id" => $fid, "tab1"=>"", "tab2"=>"", "tab3" => "", "moneyIO"=>"", "collected"=>60]);
-
-    switch($task){
-
-        // == GETTER ==
-        case "get-price-json":
-            header('Content-Type: application/json');
-            $ajax = $admin_db->get("cost", "tab1", ["fahrt_id" => $fid]);
-            break;
-
-        case "get-shopping-json":
-            header('Content-Type: application/json');
-            $ajax = $admin_db->get("cost", "tab2", ["fahrt_id" => $fid]);
-            break;
-
-        case "get-receipt-json":
-            header('Content-Type: application/json');
-            $ajax = $admin_db->get("cost", "tab3", ["fahrt_id" => $fid]);
-            break;
-
-        case "get-moneyio-json":
-            header('Content-Type: application/json');
-            $ajax = $admin_db->get("cost", "moneyIO", ["fahrt_id" => $fid]);
-            break;
-
-        case "get-other-json":
-            header('Content-Type: application/json');
-            $ret['remain'] =  $admin_db->select("bachelor", ["forname", "sirname", "bachelor_id", "anday(von)", "abday(bis)", "antyp", "abtyp"],
-                                                ["AND"=> [
-                                                    "backstepped" => NULL,
-                                                    "fahrt_id"   => $fid,
-                                                    "repaid"     => NULL
-                                                ]]);
-            $ret['back']   =  $admin_db->select("bachelor", ["forname", "sirname", "bachelor_id", "anday(von)", "abday(bis)", "antyp", "abtyp"],
-                                                ["AND"=> [
-                                                    "backstepped" => NULL,
-                                                    "fahrt_id"   => $fid,
-                                                    "repaid[!]"     => NULL
-                                                ]]);
-            $ret['bezahlt']=  $admin_db->count("bachelor",
-                                                ["AND"=> [
-                                                    "backstepped" => NULL,
-                                                    "fahrt_id"   => $fid,
-                                                    "paid[!]"     => NULL
-                                                ]]);
-            $ret['count']  =  $admin_db->count("bachelor",
-                                                ["AND"=> [
-                                                    "backstepped" => NULL,
-                                                    "fahrt_id"   => $fid
-                                                ]]);
-            $ret['cnt']['all']   = $ret['count'];
-            $ret['cnt']['geman'] = $admin_db->count("bachelor",
-                                                ["AND"=> [
-                                                    "backstepped" => NULL,
-                                                    "fahrt_id"   => $fid,
-                                                    "antyp" => $config_reisearten_o["BUSBAHN"]
-                                                ]]);
-            $ret['cnt']['gemab'] = $admin_db->count("bachelor",
-                                                ["AND"=> [
-                                                    "backstepped" => NULL,
-                                                    "fahrt_id"   => $fid,
-                                                    "abtyp" => $config_reisearten_o["BUSBAHN"]
-                                                ]]);
-            $ret['amount']=  $admin_db->get("cost", "collected",[ "fahrt_id" => $fid]);
-            $ret['fahrt'] =  $admin_db->get("fahrten", ["von", "bis"], ["fahrt_id" => $fid]);
-            $ret['arten'] = $config_reisearten_o;
-
-            if(!$ret['remain'])
-                $ret['remain'] = [];
-            if(!$ret['back'])
-                $ret['back'] = [];
-            $ajax = json_encode($ret);
-            break;
-
-
-        // == SETTER ==
-        case "set-price-json":
-            $admin_db->update("cost",["tab1" => $data], ["fahrt_id" => $fid]);
-            break;
-
-        case "set-shopping-json":
-            $admin_db->update("cost",["tab2" => $data], ["fahrt_id" => $fid]);
-            break;
-
-        case "set-receipt-json":
-            $admin_db->update("cost",["tab3" => $data], ["fahrt_id" => $fid]);
-            break;
-
-        case "set-moneyio-json":
-            $admin_db->update("cost",["moneyIO" => $data], ["fahrt_id" => $fid]);
-            break;
-
-        case "set-amount":
-            $admin_db->update("cost",["collected" => $data], ["fahrt_id" => $fid]);
-            break;
-
-        // == DEFAULT ==
-        default:
-            break;
-    }
 
-}
 
+class AdminCostPage extends AdminPage {
 
-// base/static stuff down here ===========================================================
-else {
-    $headers .= '
+    public function getHeaders() {
+        return '
              <script type="text/javascript" src="../view/js/jquery-1.11.1.min.js"></script>
              <script type="text/javascript" src="../view/js/angular.min.js"></script>
              <script type="text/javascript" src="../view/js/xeditable.js"></script>
@@ -138,49 +14,153 @@ else {
              <script type="text/javascript" src="pages_cost/pages_cost.js"></script>
              <link   type="text/css" rel="stylesheet" href="pages_cost/pages_cost.css" />
              <link   type="text/css" rel="stylesheet" href="../view/css/toastr.css" />';
+    }
 
+    public function getHeader() {
+        return '';
+    }
 
-    $text .= '
-        <div ng-app="pages-cost">
-            <h1>Kostenaufstellung</h1>
+    public function getFooter() {
+        return '';
+    }
 
-            <div ng-controller="TablePriceController as table">
-                <h2>Kosten pro Person</h2>
-                <table-price></table-price>
+    public function getText() {
+        return '
+            <div ng-app="pages-cost">
+                <h1>Kostenaufstellung</h1>
+
+                <div ng-controller="TablePriceController as table">
+                    <h2>Kosten pro Person</h2>
+                    <table-price></table-price>
+                </div>
+
+                <div ng-controller="TableShoppingController as table">
+                    <h2>Einkaufen</h2>
+                    <table-shopping></table-shopping>
+                </div>
+
+                <div ng-controller="TableReceiptController as table">
+                    <h2>Herbergsrechnung</h2>
+                    <table-receipt></table-receipt>
+                </div>
+
+                <div ng-controller="TableMoneyioController as table">
+                    <h2>Money In/Out</h2>
+                    <table-moneyio></table-moneyio>
+                </div>
             </div>
 
-            <div ng-controller="TableShoppingController as table">
-                <h2>Einkaufen</h2>
-                <table-shopping></table-shopping>
-            </div>
 
-            <div ng-controller="TableReceiptController as table">
-                <h2>Herbergsrechnung</h2>
-                <table-receipt></table-receipt>
-            </div>
+            <div class="cost-anmerkung">
+                Hinweise:<br />
+                 <ul>
+                    <li>Zurückgezogene Registrierungen werden hier nicht beachtet! Wenn Bezahlung erhalten unbedingt seperat auf dem Notizzettel verwalten!</li>
+                    <li>Eingesammelter Betrag wird nicht individuell gespeichert. Wird er geändert sind ggf. unterschiedliche Beträge nicht erfasst.</li>
+                    <li>Für falsche Berechnungen wird keine Haftung übernommen. Wenn unsicher -> selbst rechnen und nachprüfen!</li>
+                    <li>Die <strong>effektive</strong> Förderung muss in der "Kosten pro Person"-Tabelle angepasst werden</li>
+                    <li>In der "Kosten pro Person"-Tabelle müssen die <strong>effektiven</strong> Kosten angegeben werden.</li>
+                    <li>Es erfolgt keine Validierung eingegeber Typen. Dezimaltrennzeichen ist ".", nicht ",".</li>
+                    <li>Berechnungen erfolgen mit eingegebener Präzision (ggf. abweichend von der auf zwei Stellen gerundeten Anzeige)</li>
+                    <li>Manche Variablen updaten sich nicht automatisch. Seite neu laden hilft in dem Fall.</li>
+                    <li>Die CSS-Klasse debug blendet debugdaten aus. Zum "Export" können die Werte kopiert werden, wenn man sich die Elemente einblenden lässt.</li>
+                 </ul>
+            </div>';
+    }
 
-            <div ng-controller="TableMoneyioController as table">
-                <h2>Money In/Out</h2>
-                <table-moneyio></table-moneyio>
-            </div>
-        </div>
-
-
-        <div class="cost-anmerkung">
-            Hinweise:<br />
-             <ul>
-                <li>Zurückgezogene Registrierungen werden hier nicht beachtet! Wenn Bezahlung erhalten unbedingt seperat auf dem Notizzettel verwalten!</li>
-                <li>Eingesammelter Betrag wird nicht individuell gespeichert. Wird er geändert sind ggf. unterschiedliche Beträge nicht erfasst.</li>
-                <li>Für falsche Berechnungen wird keine Haftung übernommen. Wenn unsicher -> selbst rechnen und nachprüfen!</li>
-                <li>Die <strong>effektive</strong> Förderung muss in der "Kosten pro Person"-Tabelle angepasst werden</li>
-                <li>In der "Kosten pro Person"-Tabelle müssen die <strong>effektiven</strong> Kosten angegeben werden.</li>
-                <li>Es erfolgt keine Validierung eingegeber Typen. Dezimaltrennzeichen ist ".", nicht ",".</li>
-                <li>Berechnungen erfolgen mit eingegebener Präzision (ggf. abweichend von der auf zwei Stellen gerundeten Anzeige)</li>
-                <li>Manche Variablen updaten sich nicht automatisch. Seite neu laden hilft in dem Fall.</li>
-                <li>Die CSS-Klasse debug blendet debugdaten aus. Zum "Export" können die Werte kopiert werden, wenn man sich die Elemente einblenden lässt.</li>
-             </ul>
-        </div>
-    ';
-
-
-}
\ No newline at end of file
+    public function getAjax() {
+        // some shorthands
+        $fid = $this->fahrt->getID();
+        $db = $this->environment->database;
+        $data = '';
+        // read payload
+        $task = $_REQUEST['ajax'];
+        if (isset($_REQUEST['data'])) {
+            $data = $_REQUEST['data'];
+        } elseif (strpos($task, 'set') !== false && strpos($task, 'json') !== false) {
+            $data = file_get_contents('php://input');
+        }
+
+        // if no data is there yet, add it!
+        if (!$db->has('cost', ['fahrt_id' => $fid])) {
+            $db->insert('cost',
+                ['fahrt_id' => $fid, 'tab1' => '', 'tab2' => '', 'tab3' => '', 'moneyIO' => '', 'collected' => 60]);
+        }
+
+        switch ($task) {
+
+            // == GETTERS ==
+            case 'get-price-json':
+                header('Content-Type: application/json');
+                return $db->get('cost', 'tab1', ['fahrt_id' => $fid]);
+
+            case 'get-shopping-json':
+                header('Content-Type: application/json');
+                return $db->get('cost', 'tab2', ['fahrt_id' => $fid]);
+
+            case 'get-receipt-json':
+                header('Content-Type: application/json');
+                return $db->get('cost', 'tab3', ['fahrt_id' => $fid]);
+
+            case 'get-moneyio-json':
+                header('Content-Type: application/json');
+                return $db->get('cost', 'moneyIO', ['fahrt_id' => $fid]);
+
+            case 'get-other-json':
+                header('Content-Type: application/json');
+                $notwaiting = ['on_waitlist' => 0,
+                    'AND' => [
+                        'transferred[!]' => null,
+                        'on_waitlist' => 1
+                    ]];
+                $baseW = ['fahrt_id' => $fid, 'OR' => $notwaiting, 'backstepped' => null];
+
+                $ret['remain'] = $db->select('bachelor', ['forname', 'sirname', 'bachelor_id', 'anday(von)', 'abday(bis)', 'antyp', 'abtyp'],
+                    ['AND' => array_merge($baseW, ['repaid' => null])]);
+                $ret['back'] = $db->select('bachelor', ['forname', 'sirname', 'bachelor_id', 'anday(von)', 'abday(bis)', 'antyp', 'abtyp'],
+                    ['AND' => array_merge($baseW, ['repaid[!]' => null])]);
+                $ret['bezahlt'] = $db->count('bachelor',
+                    ['AND' => array_merge($baseW, ['paid[!]' => null])]);
+                $ret['count'] = $db->count('bachelor',
+                    ['AND' => $baseW]);
+                $ret['cnt']['all'] = $ret['count'];
+                $ret['cnt']['geman'] = $db->count('bachelor',
+                    ['AND' => array_merge($baseW, ['antyp' => 'BUSBAHN'])]);
+                $ret['cnt']['gemab'] = $db->count('bachelor',
+                    ['AND' => array_merge($baseW, ['antyp' => 'BUSBAHN'])]);
+                $ret['amount'] = $db->get('cost', 'collected', ['fahrt_id' => $fid]);
+                $ret['fahrt'] = $db->get('fahrten', ['von', 'bis'], ['fahrt_id' => $fid]);
+                $ret['arten'] = $this->environment->oconfig['reisearten'];
+
+                if (!$ret['remain'])
+                    $ret['remain'] = [];
+                if (!$ret['back'])
+                    $ret['back'] = [];
+                return json_encode($ret);
+
+            // == SETTER ==
+            case 'set-price-json':
+                $db->update('cost', ['tab1' => $data], ['fahrt_id' => $fid]);
+                break;
+
+            case 'set-shopping-json':
+                $db->update('cost', ['tab2' => $data], ['fahrt_id' => $fid]);
+                break;
+
+            case 'set-receipt-json':
+                $db->update('cost', ['tab3' => $data], ['fahrt_id' => $fid]);
+                break;
+
+            case 'set-moneyio-json':
+                $db->update('cost', ['moneyIO' => $data], ['fahrt_id' => $fid]);
+                break;
+
+            case 'set-amount':
+                $db->update('cost', ['collected' => $data], ['fahrt_id' => $fid]);
+                break;
+
+            // == DEFAULT ==
+            default:
+                break;
+        }
+    }
+}