diff --git a/db/migrations/stored/R__functions.sql b/db/migrations/stored/R__functions.sql
index 562f2b1adac93425a2233c1b3d8a7542b981e909..917d0d7a7b6c0b355a0da6a5d78dd71a8b27a9ba 100644
--- a/db/migrations/stored/R__functions.sql
+++ b/db/migrations/stored/R__functions.sql
@@ -2762,3 +2762,36 @@ NO SQL
     END //
 
 DELIMITER ;
+
+# -------------------------------------------------------------------------------------------
+# Label: Semesters
+# -------------------------------------------------------------------------------------------
+
+DELIMITER //
+DROP FUNCTION IF EXISTS CreateSemester//
+CREATE FUNCTION CreateSemester() RETURNS int(11)
+NO SQL
+BEGIN
+	DECLARE last_sem_id INTEGER;
+    DECLARE sem_num INTEGER;
+    DECLARE sem_year INTEGER;
+    DECLARE vSemesterID INTEGER;
+
+    SELECT MAX(ID) INTO last_sem_id FROM `semesters`;
+    SELECT `Num` INTO sem_num FROM `semesters` WHERE `id`=last_sem_id;
+    SELECT `Year` INTO sem_year FROM `semesters` WHERE `id`=last_sem_id;
+
+    IF (sem_num = '2') THEN
+    	SET sem_year = sem_year + 1;
+        INSERT INTO years(Num) VALUES (sem_year);
+        SET sem_num = '1';
+    ELSE
+    	SET sem_num = '2';
+    END IF;
+
+	INSERT INTO semesters(`Year`, `Num`) VALUES (sem_year, sem_num);
+    SET vSemesterID = LAST_INSERT_ID();
+	RETURN vSemesterID;
+END//
+
+DELIMITER ;
\ No newline at end of file
diff --git a/deploy/phpConfig/sidePanel/admin.json b/deploy/phpConfig/sidePanel/admin.json
index 1946188dc44a4e94cb17c4170fce5484fc4f0da2..71bba2b4221410e14f0799c142122184c4dc87bc 100644
--- a/deploy/phpConfig/sidePanel/admin.json
+++ b/deploy/phpConfig/sidePanel/admin.json
@@ -15,7 +15,7 @@
 			{ "Title": "Предметы", "Anchor": "subjects" },
 			{ "Title": "Дисциплины", "Anchor": "disciplines" },
 			{ "Title": "Семестры", "Anchor": "semesters" },
-			{ "Title": "Регламентные", "Anchor": "#", "Disabled": "true" }
+			{ "Title": "Регламентные", "Anchor": "regulatory" }
 		]
 	},
 	{
diff --git a/media/js/office/regulatory.js b/media/js/office/regulatory.js
new file mode 100644
index 0000000000000000000000000000000000000000..65f7a1f72121ccfe35abd0f8ef6f6e9bc4b4d12f
--- /dev/null
+++ b/media/js/office/regulatory.js
@@ -0,0 +1,32 @@
+/*
+    Добавление нового семестра в semesterSwitcher может сломаться при изменении его представления,
+    так как данный код использует данные о семестрах из HTML-документа. На работу backend-а влиять не должно.
+ */
+
+$(() => {
+    $('#new_semester_button').click(function (e) {
+        $(this).prop('disabled', true);
+        $.post(URLdir + 'handler/regulatory/new').done(result => {
+            let last_sem = $(".semesterSwitcher ul:first-child a");
+            let last_sem_html = last_sem.html();
+            let season = last_sem_html.slice(0, 5);
+            let year = last_sem_html.slice(6, 10);
+            let id = parseInt(last_sem.attr("id").slice(2))+1;
+            let string_id = last_sem.attr("id").slice(0, 2) + id.toString();
+            if (season === "Весна") {
+                season = "Осень";
+            }
+            else {
+                season = "Весна";
+                year++;
+            }
+            $('.semesterSwitcher ul').prepend('<li><a href=\"#\" id=\"' + string_id + '\" class=\"switchSemester\">'+ season + ' ' + year + '</a></li>');
+            Popup.success('Семестр добавлен');
+
+        }).fail(result => {
+            Popup.error('Ошибка при добавлении семестра');
+        }).always(result => {
+            $(this).prop('disabled', false);
+        });
+    });
+});
diff --git a/media/js/semesterSwitcher.js b/media/js/semesterSwitcher.js
index 4a4aeff5737c225fa666d39bd3babda63a2ed90f..0fadcf55176fccca21f714f43cc7621ce78ebb67 100644
--- a/media/js/semesterSwitcher.js
+++ b/media/js/semesterSwitcher.js
@@ -16,5 +16,5 @@ $(function () {
     });
 
     getSemester = () => parseID($semesters);
-});
 
+});
diff --git a/~dev_rating/application/classes/Controller/Handler/Regulatory.php b/~dev_rating/application/classes/Controller/Handler/Regulatory.php
new file mode 100644
index 0000000000000000000000000000000000000000..e242512599a6db522f2372ce3cecd96d025f6ad4
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Handler/Regulatory.php
@@ -0,0 +1,37 @@
+<?php defined('SYSPATH') || die('No direct script access.');
+
+class Controller_Handler_Regulatory extends Controller_Handler_Api
+{
+
+    /** @var  Model_Semesters */
+    protected $model;
+
+    public function before() {
+        parent::before();
+
+        $this->user->checkAccess(User::RIGHTS_ADMIN);
+        $this->model = new Model_Semesters([]);
+    }
+
+    public function action_new() {
+
+        $this->user->checkAccess(User::RIGHTS_ADMIN);
+
+        $semester = $this->model->create();
+
+        if (is_null($semester)) {
+            HTTP_API_Exception::factory(500, 'Ошибка приложения');
+        }
+
+
+        $string = file_get_contents(APPPATH . "/config/general.json");
+        $json_a = json_decode($string, true);
+        $json_a['SemesterID']=$semester->ID;
+
+        $string = json_encode($json_a, JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK);
+        file_put_contents(APPPATH . "/config/general.json", $string);
+
+    }
+
+
+}
diff --git a/~dev_rating/application/classes/Controller/Office/Regulatory.php b/~dev_rating/application/classes/Controller/Office/Regulatory.php
new file mode 100644
index 0000000000000000000000000000000000000000..3be4ad3393979190a0b04f06796930f57da0d638
--- /dev/null
+++ b/~dev_rating/application/classes/Controller/Office/Regulatory.php
@@ -0,0 +1,8 @@
+<?php
+
+class Controller_Office_Regulatory extends Controller_Environment_Office {
+    public function action_index() {
+        $this->user->checkAccess(User::RIGHTS_ADMIN);
+        $this->twig->set_filename(self::OFFICE . 'regulatory/index');
+    }
+}
diff --git a/~dev_rating/application/classes/Model/Semesters.php b/~dev_rating/application/classes/Model/Semesters.php
index d80175c10ade8d4f19ec70d2c76968425f410e1e..5ccd07aa4ed24e7c2d0ccaa4bc701c86a924fa06 100644
--- a/~dev_rating/application/classes/Model/Semesters.php
+++ b/~dev_rating/application/classes/Model/Semesters.php
@@ -25,6 +25,13 @@ class Model_Semesters extends Model
         return $this->data[$name];
     }
 
+    public function create() {
+
+        $sql = 'SELECT `CreateSemester`() AS `ID`';
+        $id = DB::query(Database::SELECT, $sql)
+            ->execute()->get('ID');
+        return self::load($id);
+    }
 
     public static function load($id) {
         $data = DB::query(Database::SELECT, 'CALL `GetSemestersInfo`(:id)')
diff --git a/~dev_rating/application/views/office/regulatory/index.twig b/~dev_rating/application/views/office/regulatory/index.twig
new file mode 100644
index 0000000000000000000000000000000000000000..af9a3cced810f51a460e2acc30f80148a877097f
--- /dev/null
+++ b/~dev_rating/application/views/office/regulatory/index.twig
@@ -0,0 +1,20 @@
+{% extends 'office/base' %}
+
+{% block title %}Регламентные{% endblock %}
+
+{% block office_media %} {# head -> css, js #}
+    {#{{ parent() }}#}   {# fixme #}
+    {{ HTML.style('static/css/common/forms.css')|raw }}
+    {{ HTML.script('static/js/office/regulatory.js')|raw }}
+{% endblock %}
+
+
+{% block office_content %}
+
+    <button class="defaultForm BlueButton P2Width" id="new_semester_button">
+        Новый семестр
+    </button>
+
+    <p>По нажатию кнопки в базе данных будет создан новый семестр. Он станет текущим в конфигурации системы.</p>
+
+{% endblock %}