diff --git a/db/StoredFunctions.sql b/db/StoredFunctions.sql
index ce20a0fd5517d023f957a604a5248f506136beed..50cba8c3aff4dab888aba0ca0f239c7aa1a63fc3 100644
--- a/db/StoredFunctions.sql
+++ b/db/StoredFunctions.sql
@@ -16,6 +16,9 @@ DROP FUNCTION IF EXISTS InternalNotify//
 DROP FUNCTION IF EXISTS GetDisciplineMaxRate//
 DROP FUNCTION IF EXISTS OrderModuleTypesForSession//
 
+DROP FUNCTION IF EXISTS CreateStudyGroup//
+
+
 # -------------------------------------------------------------------------------------------
 # Label: abbreviations
 # -------------------------------------------------------------------------------------------
@@ -76,7 +79,7 @@ CREATE FUNCTION `InternalIsTeacherAuthor`
     NO SQL
 BEGIN
     RETURN EXISTS (SELECT * FROM `disciplines`
-                    WHERE disciplines.ID = pDisciplineID AND disciplines.AuthorID = pTeacherID);
+                        WHERE disciplines.ID = pDisciplineID AND disciplines.AuthorID = pTeacherID);
 END //
 
 
@@ -124,6 +127,7 @@ BEGIN
     );
 END //
 
+# ordering helper
 DROP FUNCTION IF EXISTS InternalOrderModuleTypesForSession//
 CREATE FUNCTION `InternalOrderModuleTypesForSession`
     (`pModuleType` INT ) RETURNS INT(3)
@@ -149,6 +153,8 @@ NO SQL
 # Label: magic
 # -------------------------------------------------------------------------------------------
 
+# set values of record with key \pKey,
+# if doesn't exist, then create.
 DROP FUNCTION IF EXISTS SetSettings//
 CREATE FUNCTION `SetSettings`
     (`pKey` VARCHAR(50) CHARSET utf8, `pVal` INT, `pValS` VARCHAR(300) CHARSET utf8
@@ -196,6 +202,7 @@ END //
 # Label: semesters
 # -------------------------------------------------------------------------------------------
 
+# set current(for user) semester, life time - db session
 DROP FUNCTION IF EXISTS SetSemesterID//
 CREATE FUNCTION `SetSemesterID` (`pSemesterID` INT) RETURNS int(11)
     NO SQL
@@ -211,8 +218,9 @@ END //
 # Label: study groups
 # -------------------------------------------------------------------------------------------
 
-DROP FUNCTION IF EXISTS CreateStudyGroup//
-CREATE FUNCTION `CreateStudyGroup`
+# negative int, if already exists
+DROP FUNCTION IF EXISTS CreateGroup//
+CREATE FUNCTION `CreateGroup`
     (   `pGradeID` INT, `pGroupNum` INT,
         `pSpecializationID` INT, `pGroupName` VARCHAR(50) CHARSET utf8
     )   RETURNS int(11)
@@ -524,7 +532,6 @@ CREATE FUNCTION `CreateStudent`
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
         `pGradeID` INT, `pGroupNum` INT, `pFacultyID` INT,
-        # TODO: delete pGradeID
         `pActivationCode` VARCHAR(40) CHARSET utf8
     )   RETURNS int(11)
     NO SQL
@@ -557,13 +564,14 @@ BEGIN
 END //
 
 
-
+# unlike fn CreateStudent, this can create all missing records (group, grade, specialization)
 DROP FUNCTION IF EXISTS CreateStudentEx//
 CREATE FUNCTION `CreateStudentEx`
     (   `pLastName` VARCHAR(30) CHARSET utf8,
         `pFirstName` VARCHAR(30) CHARSET utf8,
         `pSecondName` VARCHAR(30) CHARSET utf8,
-        `pGradeNum` INT, `pGroupNum` INT,
+        `pGradeNum` INT,
+        `pGroupNum` INT,
         `pDegree` VARCHAR(20) CHARSET utf8,
         `pSpecName` VARCHAR(50) CHARSET utf8,
         `pFacultyID` INT,
@@ -656,16 +664,19 @@ BEGIN
     DECLARE vChecker, vDisciplineID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
+    # create discipline
     INSERT INTO `disciplines`
         (AuthorID, GradeID, SubjectID, ExamType, LectureCount, PracticeCount,LabCount, SemesterID,FacultyID)
         VALUES  (   pTeacherID, pGradeID, pSubjectID, pExamType, pLectureCount, pPracticeCount, pLabCount,
                     @CurrentSemesterID, pFacultyID);
     SET vDisciplineID = LAST_INSERT_ID();
 
+    # bind teacher(author)
     INSERT INTO `disciplines_teachers`
         (DisciplineID,TeacherID)
         VALUES (vDisciplineID, pTeacherID);
 
+    # add exam and extra modules
     IF pExamType = 'exam' THEN
         SET vChecker = AddModuleExam(pTeacherID, vDisciplineID);
     END IF;
@@ -763,36 +774,41 @@ BEGIN
     IF vExtraID <= 0 THEN
         RETURN -1;
     END IF;
-    # check changed change exam type
+    # check that exam type really changed
     IF  (vOldExamType = pExamType) THEN
         RETURN 0;
     END IF;
 
 
-    IF pExamType = 'exam' THEN
+    IF pExamType = 'exam' THEN # change to exam
         SET vExtraMax = 7;
+        # count discipline's current max rate
         SELECT view_disciplines_results.DisciplineRateMax INTO vChecker
             FROM `view_disciplines_results`
             WHERE view_disciplines_results.DisciplineID = pDisciplineID
             LIMIT 1;
+        # can't add exam module
         IF vChecker >= 61 THEN
             RETURN 1;
         END IF;
         SET vChecker = AddModuleExam(pTeacherID, pDisciplineID);
 
-        # delete extra submodules
+        # delete extra submodules(only 1 extra for exam)
         DELETE FROM `submodules`
             WHERE submodules.OrderNum > 1 AND submodules.ModuleID = vExtraID;
-    ELSE
+    ELSE # change to credit
         SET vExtraMax = 29;
         SET vChecker = DeleteModuleExam(pTeacherID, pDisciplineID);
+        # 2 extra submodules (1 created for exam)
         SET vChecker = AddSubmodule(pTeacherID, vExtraID, vExtraMax, '', NULL, 'LandmarkControl');
     END IF;
 
+    # set new exam type
     UPDATE `disciplines`
         SET disciplines.ExamType = pExamType
         WHERE disciplines.ID = pDisciplineID
         LIMIT 1;
+    # set max rate for extra
     UPDATE `submodules`
         SET submodules.MaxRate = vExtraMax
         WHERE submodules.ModuleID = vExtraID;
@@ -842,15 +858,14 @@ BEGIN
     DECLARE vChecker INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-# 1. check if AccessedTeacher is author
+    # 1. check if AccessedTeacher is author
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
         InternalIsMapLocked(pDisciplineID)
     THEN
         RETURN -1;
     END IF;
 
-# 2. check if study group is bound to discipline
-    # TODO: extract method
+    # 2. check if group is bound to discipline
     SELECT disciplines_groups.ID INTO vChecker
         FROM `disciplines_groups`
         WHERE   disciplines_groups.GroupID = pGroupID AND
@@ -860,7 +875,7 @@ BEGIN
         RETURN 1;
     END IF;
 
-# 3. delete students of this group which were bound to discipline before
+    # 3. delete students of this group which were bound to discipline before
     DELETE FROM `disciplines_students`
         WHERE disciplines_students.DisciplineID = pDisciplineID AND
             disciplines_students.StudentID IN
@@ -869,7 +884,7 @@ BEGIN
                     WHERE students.GroupID = pGroupID
                 );
 
-# 4. bind whole group
+    # 4. bind whole group
     INSERT INTO `disciplines_groups`
         (DisciplineID, GroupID)
         VALUES (pDisciplineID, pGroupID );
@@ -887,12 +902,12 @@ BEGIN
     DECLARE vInGroup, vChecker, vGroupID, vTemp INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-# 1. check if AccessedTeacher is author
+    # 1. check if AccessedTeacher is author
     IF NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) THEN
         RETURN -1;
     END IF;
 
-# 2. check if student's group is bound yet
+    # 2. check if student's group is bound yet
     SELECT disciplines_groups.ID INTO vInGroup
         FROM `students`
             INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
@@ -910,7 +925,7 @@ BEGIN
     END IF;
 
 
-# 3. try bind student
+    # 3. try bind student
     INSERT INTO `disciplines_students`
         (DisciplineID, StudentID, Type)
         VALUES (pDisciplineID, pStudentID, 'attach')
@@ -918,7 +933,6 @@ BEGIN
         ON DUPLICATE KEY UPDATE
             disciplines_students.StudentID = disciplines_students.StudentID;
     RETURN 0;
-
 END //
 
 
@@ -933,6 +947,7 @@ BEGIN
         RETURN -1;
     END IF;
 
+    # detach group from the discipline
     DELETE FROM `disciplines_groups`
         WHERE disciplines_groups.DisciplineID = pDisciplineID AND
             disciplines_groups.GroupID = pGroupID
@@ -962,6 +977,7 @@ BEGIN
         RETURN -1;
     END IF;
 
+    # try to get general group, if student in it.
     SELECT disciplines_groups.ID INTO vInGroup
         FROM `students`
         INNER JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = pDisciplineID AND
@@ -969,7 +985,7 @@ BEGIN
         WHERE students.ID = pStudentID
         LIMIT 1;
 
-    IF vInGroup > 0 THEN
+    IF vInGroup > 0 THEN # student in general group
         INSERT INTO `disciplines_students`
             (DisciplineID, StudentID, Type)
             VALUES (pDisciplineID, pStudentID, 'detach');
@@ -990,6 +1006,7 @@ CREATE FUNCTION `BindTeacher`
     ) RETURNS int(11)
     NO SQL
 BEGIN
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) THEN
         RETURN -1;
     END IF;
@@ -1024,7 +1041,7 @@ BEGIN
 END //
 
 
-
+# assign new author to discipline
 DROP FUNCTION IF EXISTS DelegateDiscipline//
 CREATE FUNCTION `DelegateDiscipline`
     (   `pAuthorID` INT, `pNewAuthorID` INT, `pDisciplineID` INT
@@ -1059,18 +1076,21 @@ BEGIN
         RETURN -1;
     END IF;
 
+    # clear logs
     DELETE FROM `logs_rating`
         WHERE logs_rating.SubModuleID IN
             (SELECT view_roadmap.SubmoduleID
                 FROM `view_roadmap`
                 WHERE view_roadmap.DisciplineID = pDisciplineID);
 
+    # clear rating
     DELETE FROM `rating_table`
         WHERE rating_table.SubModuleID IN
             (SELECT view_roadmap.SubmoduleID
              FROM `view_roadmap`
              WHERE view_roadmap.DisciplineID = pDisciplineID);
 
+    # unlock discipline
     UPDATE `disciplines`
         SET disciplines.IsLocked = 0
         WHERE disciplines.ID = pDisciplineID
@@ -1100,33 +1120,31 @@ BEGIN
         RETURN -1;
     END IF;
 
+    # delete only if discipline cleared(doesn't exists related rating's records)
     SET vTemp = CountRatings(pAuthorID, pDisciplineID);
     IF vTemp > 0 THEN
         RETURN -1;
     END IF;
 
-    # TODO: ClearDiscipline if need
-
-
+    # delete roadmap
     DELETE FROM `submodules`
         WHERE submodules.ModuleID IN
             (SELECT modules.ID
                 FROM `modules`
                 WHERE modules.DisciplineID = pDisciplineID
             );
-
     DELETE FROM `modules`
         WHERE modules.DisciplineID = pDisciplineID;
 
+    # detach all entities from discipline
     DELETE FROM `disciplines_teachers`
         WHERE disciplines_teachers.DisciplineID = pDisciplineID;
-
     DELETE FROM `disciplines_students`
         WHERE disciplines_students.DisciplineID = pDisciplineID;
-
     DELETE FROM `disciplines_groups`
         WHERE disciplines_groups.DisciplineID = pDisciplineID;
 
+    # delete discipline
     DELETE FROM `disciplines`
         WHERE disciplines.ID = pDisciplineID
         LIMIT 1;
@@ -1135,7 +1153,7 @@ BEGIN
 END //
 
 
-
+# get count of related with discipline records in rating_table
 DROP FUNCTION IF EXISTS CountRatings//
 CREATE FUNCTION `CountRatings`
     (   `pTeacherID` INT, `pDisciplineID` INT
@@ -1204,25 +1222,11 @@ CREATE FUNCTION `ChangeModuleName`
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vDisciplineID INT DEFAULT -1;
-    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
-
-    SELECT disciplines.ID INTO vDisciplineID
-        FROM `modules`
-        INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID AND
-                                    disciplines.AuthorID = pTeacherID
-        WHERE   modules.ID = pModuleID AND
-                modules.Type = 'regular'
-        LIMIT 1;
-    IF vDisciplineID <= 0 OR
-        InternalIsMapLocked(vDisciplineID)
-    THEN
-        RETURN -1;
-    END IF;
-
     UPDATE `modules`
         SET modules.Name = pName
-        WHERE modules.ID = pModuleID
+        WHERE modules.ID = pModuleID AND
+              modules.Type = 'regular' AND
+              NOT InternalIsMapLocked(modules.DisciplineID)
         LIMIT 1;
     RETURN ROW_COUNT()-1;
 END //
@@ -1236,7 +1240,7 @@ CREATE FUNCTION `AddModule`
     ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker INT DEFAULT 0;
+    DECLARE vOrderNum INT DEFAULT 0;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID) OR
@@ -1245,14 +1249,15 @@ BEGIN
         RETURN -1;
     END IF;
 
-    SELECT MAX(modules.OrderNum)+1 INTO vChecker
+    # get free orderNum
+    SELECT MAX(modules.OrderNum)+1 INTO vOrderNum
         FROM `modules`
         WHERE   modules.DisciplineID = pDisciplineID AND modules.Type = 'regular'
         LIMIT 1;
 
     INSERT INTO `modules`
         (Name, OrderNum, DisciplineID )
-        VALUES (pName, vChecker, pDisciplineID);
+        VALUES (pName, vOrderNum, pDisciplineID);
     RETURN LAST_INSERT_ID();
 END //
 
@@ -1271,6 +1276,7 @@ BEGIN
         RETURN -1;
     END IF;
 
+    # check exam module existence
     SELECT modules.ID
         INTO vChecker
         FROM `modules`
@@ -1282,9 +1288,10 @@ BEGIN
 
     INSERT INTO `modules`
         (Name, OrderNum, DisciplineID, Type)
-        VALUES  ('Экзамен' , 3141692 , pDisciplineID, 'exam');
+        VALUES  ('Экзамен' , 3141592 , pDisciplineID, 'exam');
 
     SET vModule = LAST_INSERT_ID();
+    # 3 attempt for pass exam
     SET vChecker = AddSubmodule(pTeacherID, vModule, 40, '', NULL, 'LandmarkControl');
     SET vChecker = AddSubmodule(pTeacherID, vModule, 40, '', NULL, 'LandmarkControl');
     SET vChecker = AddSubmodule(pTeacherID, vModule, 40, '', NULL, 'LandmarkControl');
@@ -1299,11 +1306,13 @@ CREATE FUNCTION `AddModuleExtra`
     NO SQL
 BEGIN
     DECLARE vChecker, vModule, vType, vGap INT DEFAULT -1;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
     IF  NOT InternalIsTeacherAuthor(pTeacherID, pDisciplineID)
     THEN
         RETURN -1;
     END IF;
 
+    # try to find existing extra module
     SELECT modules.ID INTO vChecker
         FROM `modules`
         WHERE modules.DisciplineID = pDisciplineID AND modules.Type = 'extra'
@@ -1312,11 +1321,13 @@ BEGIN
         RETURN -2;
     END IF;
 
+    # add extra module
     INSERT INTO `modules`
         (Name, OrderNum, DisciplineID, Type)
         VALUES ('Добор баллов' , 2900666 , pDisciplineID, 'extra');
 
 
+    # get discipline exam type
     SELECT  modules.ID, disciplines.ExamType
         INTO vModule, vType
         FROM `modules`
@@ -1328,13 +1339,12 @@ BEGIN
         RETURN -1;
     END IF;
 
+    # 1 extra attempt for exam and 2 for credit
     SET vGap = -1;
-    IF vType = 1 THEN
-    # exam
+    IF vType = 1 THEN # exam
         SET vGap = 7;
     END IF;
-    IF vType = 2 THEN
-    # credit
+    IF vType = 2 THEN # credit
         SET vGap = 29;
         SET vChecker = AddSubmodule(pTeacherID, vModule, vGap, '', NULL, 'LandmarkControl');
     END IF;
@@ -1350,35 +1360,33 @@ CREATE FUNCTION `DeleteModule`
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker INT DEFAULT -1;
+    DECLARE vDisciplineID INT DEFAULT -1;
 
-    SELECT disciplines.ID
-        INTO vChecker
+    # get discipline ID
+    SELECT disciplines.ID INTO vDisciplineID
         FROM `modules`
         INNER JOIN `disciplines`    ON  modules.DisciplineID = disciplines.ID AND
                                         disciplines.AuthorID = pTeacherID
         WHERE modules.ID = pModuleID
         LIMIT 1;
-    IF  vChecker <= 0 THEN
-        RETURN -1;
-    END IF;
 
-    IF  NOT InternalIsTeacherAuthor(pTeacherID, vChecker) OR
-        InternalIsMapLocked(vChecker)
+    # check rights
+    IF  NOT InternalIsTeacherAuthor(pTeacherID, vDisciplineID) OR
+        InternalIsMapLocked(vDisciplineID)
     THEN
         RETURN -1;
     END IF;
 
     DELETE FROM `submodules`
         WHERE submodules.ModuleID = pModuleID;
-
     DELETE FROM `modules`
         WHERE modules.ID = pModuleID;
 
+    # restore continuous ordering
     SET @counter = 0;
     UPDATE `modules`
         SET modules.OrderNum = (@counter := @counter + 1)
-        WHERE   modules.DisciplineID = vChecker AND
+        WHERE   modules.DisciplineID = vDisciplineID AND
                 modules.Type = 'regular'
         ORDER BY modules.OrderNum ASC;
 
@@ -1400,8 +1408,8 @@ BEGIN
         RETURN -1;
     END IF;
 
-    SELECT modules.ID
-        INTO vExamModuleID
+    # get exam module ID
+    SELECT modules.ID INTO vExamModuleID
         FROM `modules`
         WHERE   modules.Type = 'exam' AND
                 modules.DisciplineID = pDisciplineID
@@ -1412,7 +1420,6 @@ BEGIN
 
     DELETE FROM `submodules`
         WHERE vExamModuleID = submodules.ModuleID;
-
     DELETE FROM `modules`
         WHERE vExamModuleID = modules.ID
         LIMIT 1;
@@ -1431,6 +1438,7 @@ BEGIN
     DECLARE vChecker, vOrder1, vOrder2,
             vDisciplineID1, vDisciplineID2 INT DEFAULT -1;
 
+    # get disciplineID and orderNum for 1st module(pModuleID1)
     SELECT  modules.OrderNum,
             modules.DisciplineID
         INTO vOrder1, vDisciplineID1
@@ -1441,6 +1449,7 @@ BEGIN
                 modules.Type = 'regular'
         LIMIT 1;
 
+    # get disciplineID and orderNum for 2st module(pModuleID2)
     SELECT  modules.OrderNum,
             modules.DisciplineID
         INTO vOrder2, vDisciplineID2
@@ -1450,20 +1459,21 @@ BEGIN
                 modules.ID = pModuleID2 AND
                 modules.Type = 'regular'
         LIMIT 1;
+
+    # check that modules belong to one discipline, check rights
     IF  vDisciplineID1 != vDisciplineID2 OR vDisciplineID1 <= 0 OR
         InternalIsMapLocked(vDisciplineID1) THEN
         RETURN -1;
     END IF;
 
+    # swap
     UPDATE `modules`
         SET modules.OrderNum = 271828
         WHERE modules.ID = pModuleID1;
-
     UPDATE `modules`
         SET modules.OrderNum = vOrder1
         WHERE modules.ID = pModuleID2
         LIMIT 1;
-
     UPDATE `modules`
         SET modules.OrderNum = vOrder2
         WHERE modules.ID = pModuleID1
@@ -1487,8 +1497,8 @@ BEGIN
         RETURN -1;
     END IF;
 
-    SELECT modules.ID
-        INTO vChecker
+    # check existing of bonus module
+    SELECT modules.ID INTO vChecker
         FROM `modules`
         WHERE   modules.DisciplineID = pDisciplineID AND
                 modules.Type = 'bonus';
@@ -1496,21 +1506,11 @@ BEGIN
         RETURN -2;
     END IF;
 
-
     INSERT INTO `modules`
         (Name, OrderNum, DisciplineID, Type)
-        VALUES  ('Бонусные баллы' , 2141692 , pDisciplineID, 3 );
-
-    SELECT  modules.ID
-        INTO vModuleID
-        FROM `modules`
-        WHERE   modules.DisciplineID = pDisciplineID AND
-                modules.Type = 'bonus'
-        LIMIT 1;
-    IF vModuleID <= 0 THEN
-        RETURN -1;
-    END IF;
+        VALUES  ('Бонусные баллы' , 2141692 , pDisciplineID, 'bonus');
 
+    SET vModuleID = LAST_INSERT_ID();
     SET vChecker = AddSubmodule(pTeacherID, vModuleID, 10, '', NULL, 'LandmarkControl');
     RETURN 0;
 END //
@@ -1529,12 +1529,12 @@ BEGIN
         RETURN -1;
     END IF;
 
-    SELECT modules.ID
-    INTO vBonusModuleID
-    FROM `modules`
-    WHERE   modules.Type = 'bonus' AND
-            modules.DisciplineID = pDisciplineID
-    LIMIT 1;
+    # get bonus module ID
+    SELECT modules.ID INTO vBonusModuleID
+        FROM `modules`
+        WHERE   modules.Type = 'bonus' AND
+                modules.DisciplineID = pDisciplineID
+        LIMIT 1;
     IF vBonusModuleID <= 0 THEN
         RETURN -1;
     END IF;
@@ -1556,108 +1556,94 @@ END //
 # -------------------------------------------------------------------------------------------
 
 DROP FUNCTION IF EXISTS ChangeSubmoduleMaxAndControl//
-CREATE FUNCTION `ChangeSubmoduleMaxAndControl`  (   `TeacherID`     INT,
-                                                    `SubmoduleID`   INT,
-                                                    `MaxRate`       INT,
-                                                    `ControlType`   VARCHAR(30) CHARSET utf8
-                                            )   RETURNS int(11)
+CREATE FUNCTION `ChangeSubmoduleMaxAndControl`
+    (   `pTeacherID`     INT,
+        `pSubmoduleID`   INT,
+        `pMaxRate`       INT,
+        `pControlType`   VARCHAR(30) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, disciplineID INT;
+    DECLARE vChecker, vDisciplineID, vIsLocked INT DEFAULT -1;
 
-    SET vChecker = -1;
-    SET disciplineID = -1;
-    SELECT  submodules.ID,
-            disciplines.ID
-    INTO vChecker, disciplineID
-    FROM `submodules`
-    INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID
-    INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
-    WHERE   TeacherID = disciplines.AuthorID AND
-            SubmoduleID = submodules.ID
-    LIMIT 1;
-    IF  vChecker <= 0 OR
-        disciplineID <= 0 OR
-        InternalIsMapLocked(disciplineID) THEN
+    # check that discipline and submodule exists and doesn't locked
+    SELECT disciplines.IsLocked INTO vIsLocked
+        FROM `submodules`
+        INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID
+        INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
+        WHERE   disciplines.AuthorID = pTeacherID AND
+                submodules.ID = pSubmoduleID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
         RETURN -1;
     END IF;
 
 
     UPDATE `submodules`
-    SET     submodules.MaxRate = MaxRate,
-            submodules.Type = ControlType
-    WHERE submodules.ID = SubmoduleID
-    LIMIT 1;
+        SET     submodules.MaxRate = MaxRate,
+                submodules.Type = pControlType
+        WHERE submodules.ID = pSubmoduleID
+        LIMIT 1;
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS ChangeSubmoduleName//
-CREATE FUNCTION `ChangeSubmoduleName`   (   `TeacherID`     INT,
-                                            `SubmoduleID`   INT,
-                                            `Name`          VARCHAR(200) CHARSET utf8
-                                        )   RETURNS int(11)
+CREATE FUNCTION `ChangeSubmoduleName`
+    (   `pTeacherID` INT,
+        `pSubmoduleID` INT,
+        `pName` VARCHAR(200) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, disciplineID INT;
+    DECLARE vIsLocked INT DEFAULT -1;
 
-    SET disciplineID = -1;
-    SET vChecker = -1;
-    SELECT  submodules.ID,
-            disciplines.ID
-    INTO vChecker, disciplineID
-    FROM `submodules`
-    INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID
-    INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
-    WHERE   TeacherID = disciplines.AuthorID AND
-            SubmoduleID = submodules.ID
-    LIMIT 1;
-    IF  vChecker <= 0 OR
-        disciplineID <= 0 OR
-        InternalIsMapLocked(disciplineID) THEN
+    SELECT disciplines.IsLocked INTO vIsLocked
+        FROM `submodules`
+        INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID
+        INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
+        WHERE   disciplines.AuthorID = pTeacherID AND
+                submodules.ID = pSubmoduleID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
         RETURN -1;
     END IF;
 
     UPDATE `submodules`
-    SET submodules.Name = Name
-    WHERE submodules.ID = SubmoduleID
-    LIMIT 1;
+        SET submodules.Name = pName
+        WHERE submodules.ID = pSubmoduleID
+        LIMIT 1;
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS ChangeSubmoduleDescription//
-CREATE FUNCTION `ChangeSubmoduleDescription`    (   `TeacherID`     INT,
-                                                    `SubmoduleID`   INT,
-                                                    `Description`   VARCHAR(200) CHARSET utf8
-                                                )   RETURNS int(11)
+CREATE FUNCTION `ChangeSubmoduleDescription`
+    (   `pTeacherID` INT,
+        `pSubmoduleID` INT,
+        `pDescription` VARCHAR(200) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, disciplineID INT;
+    DECLARE vIsLocked INT DEFAULT -1;
 
-    SET vChecker = -1;
-    SET disciplineID = -1;
-    SELECT  submodules.ID,
-            disciplines.ID
-    INTO vChecker, disciplineID
-    FROM `submodules`
-    INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID
-    INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
-    WHERE   TeacherID = disciplines.AuthorID AND
-            SubmoduleID = submodules.ID
-    LIMIT 1;
-    IF  vChecker <= 0 OR
-        disciplineID <= 0 OR
-        InternalIsMapLocked(disciplineID) THEN
+    SELECT disciplines.IsLocked INTO vIsLocked
+        FROM `submodules`
+        INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID
+        INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
+        WHERE   disciplines.AuthorID = pTeacherID AND
+                submodules.ID = pSubmoduleID
+        LIMIT 1;
+    IF  vIsLocked != 0 THEN
         RETURN -1;
     END IF;
 
     UPDATE `submodules`
-    SET submodules.Description  = Description
-    WHERE submodules.ID = SubmoduleID
-    LIMIT 1;
+        SET submodules.Description  = pDescription
+        WHERE submodules.ID = pSubmoduleID
+        LIMIT 1;
     RETURN 0;
 END //
 
@@ -1670,37 +1656,27 @@ CREATE FUNCTION `DeleteSubmodule`
     ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, vModuleID, vDisciplineID INT DEFAULT -1;
+    DECLARE vIsLocked, vModuleID INT DEFAULT -1;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    SELECT submodules.ID, modules.ID, disciplines.ID
-        INTO vChecker, vModuleID, vDisciplineID
+    SELECT modules.ID, disciplines.IsLocked
+        INTO vModuleID, vIsLocked
         FROM `submodules`
         INNER JOIN `modules` ON modules.ID = submodules.ModuleID
         INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID
         WHERE   disciplines.AuthorID = pTeacherID AND
                 submodules.ID = pSubmoduleID
         LIMIT 1;
-    IF  vChecker <= 0 OR
-        vDisciplineID <= 0 OR
-        InternalIsMapLocked(vDisciplineID) THEN
+    IF  vIsLocked != 0 THEN
         RETURN -1;
     END IF;
 
-    SET vChecker = -1;
-    SELECT rating_table.StudentID
-        INTO vChecker
-        FROM `rating_table`
-        WHERE rating_table.SubmoduleID = pSubmoduleID
-        LIMIT 1;
-    IF vChecker > 0 THEN
-        RETURN -2;
-    END IF;
-
+    # handler will catch constraint violation
     DELETE FROM `submodules`
         WHERE submodules.ID = pSubmoduleID
         LIMIT 1;
 
-
+    # restore continuous ordering
     SET @counter = 0;
     UPDATE `submodules`
         SET submodules.OrderNum = (@counter := @counter + 1)
@@ -1721,49 +1697,39 @@ CREATE FUNCTION `AddSubmodule`
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker INT DEFAULT -1;
+    DECLARE vOrderNum, vIsLocked INT DEFAULT -1;
+    DECLARE vDescription VARCHAR(200) CHARSET utf8 DEFAULT pDescription;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    SELECT disciplines.ID
-        INTO vChecker
+    # check author and discipline lock
+    SELECT disciplines.IsLocked INTO vIsLocked
         FROM `modules`
-        INNER JOIN `disciplines` ON disciplines.ID = modules.DisciplineID
+        INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
         WHERE   disciplines.AuthorID = pTeacherID AND
                 modules.ID = pModuleID
         LIMIT 1;
-    IF  vChecker <= 0 OR
-        InternalIsMapLocked(vChecker)
-    THEN
+    IF  vIsLocked != 0 THEN
         RETURN -1;
     END IF;
 
-
-    SET vChecker = 0;
-    SELECT MAX(submodules.OrderNum)
-        INTO vChecker
+    # get free order
+    SET vOrderNum = 0;
+    SELECT MAX(submodules.OrderNum) INTO vOrderNum
         FROM `submodules`
         WHERE submodules.ModuleID = pModuleID
         LIMIT 1;
-    IF vChecker IS NULL THEN
-        SET vChecker = 0;
-    END IF;
-    SET vChecker = vChecker + 1;
+    SET vOrderNum = vOrderNum + 1;
 
-    IF pDescription = '' THEN
-        INSERT INTO `submodules`
-            (ModuleID, MaxRate, OrderNum, Name, Description, Type)
-            VALUES  (pModuleID, pMaxRate, vChecker, pName, NULL, pControlType);
-    ELSE
-        INSERT INTO `submodules`
-            (ModuleID, MaxRate, OrderNum, Name, Description, Type )
-            VALUES (pModuleID, pMaxRate, vChecker, pName, pDescription, pControlType);
+    # insert submodule
+
+    IF vDescription = '' THEN
+        SET vDescription = NULL;
     END IF;
+    INSERT INTO `submodules`
+        (ModuleID, MaxRate, OrderNum, Name, Description, Type)
+        VALUES  (pModuleID, pMaxRate, vOrderNum, pName, vDescription, pControlType);
 
-    RETURN  (SELECT submodules.ID
-                FROM `submodules`
-                WHERE   submodules.ModuleID = pModuleID AND
-                        submodules.OrderNum = vChecker
-                LIMIT 1
-            );
+    RETURN  LAST_INSERT_ID();
 END //
 
 
@@ -1785,7 +1751,7 @@ BEGIN
         INNER JOIN `disciplines`    ON  disciplines.ID = modules.DisciplineID
         WHERE   disciplines.AuthorID = pTeacherID AND
                 submodules.ID = pSubmoduleID1
-    LIMIT 1;
+        LIMIT 1;
 
     SELECT  submodules.OrderNum,
             submodules.ModuleID
@@ -1797,12 +1763,14 @@ BEGIN
                 submodules.ID = pSubmoduleID2
         LIMIT 1;
 
+    # check, that modules exists and belong to one discipline
     IF  vModule1 <= 0 OR vModule1 != vModule2 OR
         InternalIsMapLocked(vDisciplineID)
     THEN
         RETURN -1;
     END IF;
 
+    # swap
     UPDATE `submodules`
         SET submodules.OrderNum     = 271828
         WHERE submodules.ID = pSubmoduleID1
@@ -1872,99 +1840,76 @@ END //
 
 DROP FUNCTION IF EXISTS SetStudentRate//
 CREATE FUNCTION `SetStudentRate`
-(   `pTeacherID` INT, `pStudentID` INT,
-    `pSubmoduleID` INT, `pRate` INT ) RETURNS int(11)
+    (   `pTeacherID` INT,
+        `pStudentID` INT,
+        `pSubmoduleID` INT,
+        `pRate` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker, vDisciplineID, vGroupID, vRateID, vMaxRate, vMtype INT DEFAULT -1;
-    DECLARE vIsOver, vIsLocked, vIsUsed tinyint DEFAULT 0;
-
-    SELECT students.GroupID
-        INTO vGroupID
-        FROM `students`
-        WHERE students.ID = pStudentID
-        LIMIT 1;
-    IF vGroupID <= 0 THEN
-        RETURN -1;
-    END IF;
-
-    SET vMaxRate = CalculateMaxRateForExtra(pSubmoduleID, pStudentID);
+    DECLARE vDisciplineID, vMaxRate, vModuleType INT DEFAULT -1;
+    DECLARE vIsOver, vIsLocked, vIsUsed BOOLEAN DEFAULT FALSE;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    SET vIsOver = 1;
-    SELECT  modules.DisciplineID,
+    SET vIsOver = TRUE;
+    SELECT  disciplines.ID,
             disciplines.IsLocked,
-            disciplines.isMilestone,
-            rating_table.StudentID,
+            disciplines.IsMilestone,
             submodules.IsUsed,
-            CASE
-                WHEN modules.type='extra' THEN
-                CalculateMaxRateForExtra(pSubmoduleID, pStudentID)
-            ELSE
-                submodules.maxRate
-            END,
+            submodules.maxRate,
             modules.Type
-    INTO vDisciplineID, vIsLocked, vIsOver, vRateID, vIsUsed, vMaxRate, vMtype
-    FROM `submodules`
-    INNER JOIN `modules`                ON  submodules.ModuleID = modules.ID
-    INNER JOIN `disciplines`            ON  modules.DisciplineID = disciplines.ID
-    INNER JOIN `disciplines_teachers`   ON  disciplines.ID = disciplines_teachers.DisciplineID AND
-                                            pTeacherID = disciplines_teachers.TeacherID
-    LEFT JOIN   `disciplines_groups`    ON  disciplines.ID = disciplines_groups.DisciplineID AND
-                                            vGroupID = disciplines_groups.GroupID
-    LEFT JOIN   `disciplines_students`  ON  disciplines.ID = disciplines_students.DisciplineID AND
-                                            pStudentID = disciplines_students.StudentID  AND
-                                            1 = disciplines_students.Type
-    LEFT JOIN   `rating_table`          ON  pSubmoduleID = rating_table.SubmoduleID AND
-                                            pStudentID = rating_table.StudentID
-    WHERE   submodules.ID = pSubModuleID AND
-            (   disciplines_students.ID IS NOT NULL OR
-                disciplines_groups.ID IS NOT NULL
-            )
-    LIMIT 1;
+        INTO vDisciplineID, vIsLocked, vIsOver, vIsUsed, vMaxRate, vModuleType
+        FROM `submodules`
+        INNER JOIN `modules`                ON  submodules.ModuleID = modules.ID
+        INNER JOIN `disciplines`            ON  modules.DisciplineID = disciplines.ID
+        WHERE   submodules.ID = pSubModuleID
+        LIMIT 1;
 
-    IF  vDisciplineID <= 0 OR
+    # correct max rate for extra module
+    IF vModuleType = 4 THEN # 4 - extra
+        SET vMaxRate = CalculateMaxRateForExtra(pSubmoduleID, pStudentID);
+    END IF;
+
+    # 1) check rights
+    # 2) check, you can't rate regular and bonus after milestone
+    IF  NOT InternalIsStudentAttached(pStudentID, vDisciplineID) OR
+        NOT InternalIsTeacherBounded(pTeacherID, vDisciplineID) OR
         pRate > vMaxRate OR
-        (vIsOver > 0 AND (vMtype = 1 OR vMtype = 3))
+        (vIsOver AND (vModuleType = 1 OR vModuleType = 3)) # 1 - regular, 3 - bonus
     THEN
         RETURN -2;
     END IF;
 
-
-    IF vRateID IS NOT NULL AND vRateID > 0 THEN
-        INSERT INTO `logs_rating`
-                (StudentID, SubmoduleID, TeacherID, Rate, Action )
-        VALUES  (pStudentID, pSubModuleID, pTeacherID, pRate, 'change');
-
-        UPDATE `rating_table`
-        SET     rating_table.TeacherID  = pTeacherID,
-                rating_table.Rate       = pRate,
-                rating_table.Date       = CURDATE()
-        WHERE   pSubmoduleID = rating_table.SubmoduleID AND
-                pStudentID = rating_table.StudentID
+    # add rate, or update old
+    SET @tmp = -1;
+    INSERT INTO `rating_table`
+        (StudentID, TeacherID, SubmoduleID, Rate, Date)
+        VALUES  ( pStudentID, pTeacherID, pSubmoduleID, pRate, CURDATE())
+        ON DUPLICATE KEY UPDATE
+            rating_table.TeacherID  = (@tmp = pTeacherID),
+            rating_table.Rate       = pRate,
+            rating_table.Date       = CURDATE();
+
+    # log rate
+    INSERT INTO `logs_rating`
+        (StudentID, SubmoduleID, TeacherID, Rate, Action )
+        VALUES  (pStudentID, pSubModuleID, pTeacherID, pRate,
+                        CASE WHEN @tmp >= 0 THEN 'add' ELSE 'change' END);
+
+    # lock discipline for structure editing
+    IF NOT vIsLocked THEN
+        UPDATE `disciplines`
+        SET disciplines.IsLocked = TRUE
+        WHERE disciplines.ID = vDisciplineID
         LIMIT 1;
+    END IF;
 
-    ELSE
-        IF NOT vIsLocked THEN
-            UPDATE `disciplines`
-            SET     disciplines.IsLocked = 1
-            WHERE   disciplines.ID = vDisciplineID
-            LIMIT 1;
-        END IF;
-
-        INSERT INTO `logs_rating`
-                (StudentID, SubmoduleID, TeacherID, Rate, Action )
-        VALUES  (pStudentID, pSubModuleID, pTeacherID, pRate, 'add');
-
-        INSERT INTO `rating_table`
-            (   StudentID, TeacherID, SubmoduleID, Rate, Date)
-            VALUES  ( pStudentID, pTeacherID, pSubmoduleID, pRate, CURDATE() );
-
-        IF NOT vIsUsed THEN
-            UPDATE `submodules`
-            SET submodules.IsUsed = 1
+    # add submodule to max rate counting
+    IF NOT vIsUsed THEN
+        UPDATE `submodules`
+            SET submodules.IsUsed = TRUE
             WHERE submodules.ID = pSubModuleID
             LIMIT 1;
-        END IF;
     END IF;
     RETURN 0;
 END //
@@ -1981,23 +1926,28 @@ END //
 
 DROP FUNCTION IF EXISTS SetRequestStatus//
 CREATE FUNCTION `SetRequestStatus`
-(`pRequestID` INT, `pStatus` VARCHAR(20) CHARSET utf8) RETURNS int(11)
+    (`pRequestID` INT, `pStatus` VARCHAR(20) CHARSET utf8
+    ) RETURNS int(11)
     NO SQL
 BEGIN
     UPDATE `requests`
         SET requests.Status = pStatus
         WHERE requests.ID = pRequestID
         LIMIT 1;
-    RETURN 0;
+    RETURN ROW_COUNT()-1;
 END//
 
 
 DROP FUNCTION IF EXISTS CreateRequest//
 CREATE FUNCTION `CreateRequest`
-(   `pAccountID` INT, `pTitle` VARCHAR(50) CHARSET utf8,
-    `pDescription` TEXT CHARSET utf8) RETURNS int(11)
+    (   `pAccountID` INT,
+        `pTitle` VARCHAR(50) CHARSET utf8,
+        `pDescription` TEXT CHARSET utf8
+    ) RETURNS int(11)
     NO SQL
 BEGIN
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+
     INSERT INTO `requests`
         (AccountID, Title, Description, Status)
         VALUES  (pAccountID, pTitle, pDescription, 'opened');
@@ -2015,15 +1965,16 @@ END//
 
 DROP FUNCTION IF EXISTS CreateRecoveryToken//
 CREATE FUNCTION `CreateRecoveryToken`
-(   `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
-    `pToken` VARCHAR(100) CHARSET utf8)   RETURNS int(11)
+    (   `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
+        `pToken` VARCHAR(100) CHARSET utf8
+    ) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vChecker INT DEFAULT 0;
     DECLARE vAccountID INT DEFAULT -1;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    SELECT accounts.ID
-        INTO vAccountID
+    # get account ID
+    SELECT accounts.ID INTO vAccountID
         FROM `accounts`
         WHERE accounts.EMail = pAccountOrEMail
         LIMIT 1;
@@ -2031,15 +1982,7 @@ BEGIN
         RETURN -1;
     END IF;
 
-    SELECT recovery_tokens.ID
-        INTO vChecker
-        FROM `recovery_tokens`
-        WHERE recovery_tokens.Token = pToken
-        LIMIT 1;
-    IF vChecker > 0 THEN
-        RETURN -1;
-    END IF;
-
+    # handle catch constraints violations
     INSERT INTO `recovery_tokens`
         (AccountID, Token )
         VALUES  (vAccountID, pToken);
@@ -2055,20 +1998,12 @@ CREATE FUNCTION `UseRecoveryToken`
 BEGIN
     DECLARE vChecker INT DEFAULT -1;
 
-    SELECT recovery_tokens.ID
-        INTO vChecker
-        FROM `recovery_tokens`
-        WHERE recovery_tokens.Token = pToken
-        LIMIT 1;
-    IF vChecker <= 0 THEN
-        RETURN -1;
-    END IF;
-
+    # set token used
     UPDATE `recovery_tokens`
         SET recovery_tokens.IsUsed = 1
         WHERE recovery_tokens.Token = pToken
         LIMIT 1;
-    RETURN 0;
+    RETURN ROW_COUNT()-1;
 END//
 
 
diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index db5f9dadde7b723e9b8b7cf03558e35269e9be60..23e62b1bb7bf353d415b3fb0ffcb6ee0f1f78e88 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -9,6 +9,10 @@ DROP PROCEDURE IF EXISTS GetStudyGroupsForDisciplineFull//
 DROP PROCEDURE IF EXISTS GetStudyGroupsForDiscipline//
 DROP PROCEDURE IF EXISTS GetStudyGroups//
 
+DROP PROCEDURE IF EXISTS GetDisciplineInfoByID//
+DROP PROCEDURE IF EXISTS GetMapForDisciplineExam//
+DROP PROCEDURE IF EXISTS GetMapForDiscipline//
+
 # -------------------------------------------------------------------------------------------
 # Label: abbreviations
 # -------------------------------------------------------------------------------------------
@@ -628,10 +632,12 @@ BEGIN
 END //
 
 
-
-
+DROP PROCEDURE IF EXISTS GetMapForStudent//
+DROP PROCEDURE IF EXISTS GetMapForStudentExam//
 DROP PROCEDURE IF EXISTS GetRatesForStudentsGroup//
-CREATE PROCEDURE `GetRatesForStudentsGroup`
+
+DROP PROCEDURE IF EXISTS GetRatesForGroup//
+CREATE PROCEDURE `GetRatesForGroup`
     (   IN `pDisciplineID` INT, IN `pGroupID` INT)
     NO SQL
 BEGIN
@@ -666,9 +672,8 @@ END //
 
 
 
-# TODO: rename GetRatesForStudent
-DROP PROCEDURE IF EXISTS GetMapForStudent//
-CREATE PROCEDURE `GetMapForStudent`
+DROP PROCEDURE IF EXISTS GetRates//
+CREATE PROCEDURE `GetRates`
     (   IN `pStudentID` INT, IN `pDisciplineID` INT)
     NO SQL
 BEGIN
@@ -704,8 +709,8 @@ END //
 
 
 # TODO: rename ~ GetRatesForStudent, Rating
-DROP PROCEDURE IF EXISTS GetMapForStudentExam//
-CREATE PROCEDURE `GetMapForStudentExam`
+DROP PROCEDURE IF EXISTS GetRatesExam//
+CREATE PROCEDURE `GetRatesExam`
     (	IN `pStudentID` INT, IN `pDisciplineID` INT)
     NO SQL
 BEGIN
@@ -727,11 +732,10 @@ BEGIN
 END //
 
 
-# TODO: rename GetRoadMap
 # TODO: order hardcode
 # get roadmap of discipline
-DROP PROCEDURE IF EXISTS GetMapForDiscipline//
-CREATE PROCEDURE `GetMapForDiscipline`
+DROP PROCEDURE IF EXISTS GetRoadmap//
+CREATE PROCEDURE `GetRoadmap`
     (   IN `pDisciplineID`   INT)
     NO SQL
 BEGIN
@@ -755,10 +759,9 @@ BEGIN
 END //
 
 
-# TODO: rename GetRoadMap
 # get roadmap of discipline exam
-DROP PROCEDURE IF EXISTS GetMapForDisciplineExam//
-CREATE PROCEDURE `GetMapForDisciplineExam`
+DROP PROCEDURE IF EXISTS GetRoadmapExam//
+CREATE PROCEDURE `GetRoadmapExam`
     (   IN `pDisciplineID` INT)
     NO SQL
 BEGIN
@@ -781,9 +784,8 @@ BEGIN
 END //
 
 
-# TODO: rename GetDisciplineInfo
-DROP PROCEDURE IF EXISTS GetDisciplineInfoByID//
-CREATE PROCEDURE `GetDisciplineInfoByID`
+DROP PROCEDURE IF EXISTS GetDisciplineInfo//
+CREATE PROCEDURE `GetDisciplineInfo`
     (   IN `pDisciplineID` INT)
     NO SQL
 BEGIN
diff --git a/db/Views.sql b/db/Views.sql
index e30a36d8592a0993cba00789018008f07c83f578..c39efedeae9de1994a548eb699459a6b25369930 100644
--- a/db/Views.sql
+++ b/db/Views.sql
@@ -147,11 +147,10 @@ CREATE OR REPLACE VIEW `view_rating_result` AS
                  (rating_table.Rate IS NULL) ASC,
                  view_roadmap.SubmoduleOrderNum DESC
              LIMIT 1
-            ) AS 'RateExam',
-            (RateRegular + RateExtra + RateExam + RateBonus) AS 'RateResult'
+            ) AS 'RateExam'
         FROM `rating_table`
         LEFT JOIN `view_roadmap` ON view_roadmap.SubmoduleID = rating_table.SubmoduleID
-        GROUP BY view_rating.StudentID, view_rating.DisciplineID;
+        GROUP BY rating_table.StudentID, view_roadmap.DisciplineID;
 
 
 
diff --git a/db/fix.sql b/db/fix.sql
index a65baddf95fa3cf19e9d34955e231d45e08ffd06..a8caae05f9e12749047033ee9aa717ec3780fb7d 100644
--- a/db/fix.sql
+++ b/db/fix.sql
@@ -35,5 +35,9 @@ UPDATE `general_settings` SET general_settings.Name = 'SemesterID' WHERE general
 UPDATE `general_settings` SET general_settings.Name = 'HashKey' WHERE general_settings.ID = 2;
 ALTER TABLE  `general_settings` ADD UNIQUE (`Name`);
 
+# just for fun :/
+UPDATE `modules`
+SET modules.OrderNum = 3141592
+WHERE modules.OrderNum = 3141692;
 
 
diff --git a/~dev_rating/application/classes/Model/Student.php b/~dev_rating/application/classes/Model/Student.php
index 331dd6bb63872d1fc5cbe74741ff03d688215367..a6d82f2f3b5d57482e6b91eb6e86af6030c70e8c 100644
--- a/~dev_rating/application/classes/Model/Student.php
+++ b/~dev_rating/application/classes/Model/Student.php
@@ -10,13 +10,13 @@ class Model_Student extends Model
     
     public function getDisciplineMap($student_id, $subject_id)
     {
-        $sql = "CALL `GetMapForStudent`('$student_id', '$subject_id'); ";
+        $sql = "CALL `GetRates`('$student_id', '$subject_id'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
     
     public function getDisciplineInfoByID($discipline_id)
     {
-        $sql = "CALL `GetDisciplineInfoByID`('$discipline_id'); ";
+        $sql = "CALL `GetDisciplineInfo`('$discipline_id'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
     
diff --git a/~dev_rating/application/classes/Model/Teacher/Map.php b/~dev_rating/application/classes/Model/Teacher/Map.php
index 250f9775c4932bc18dbecafbc3af4eab533e333f..c5fc6e1c7ca7a26454c376ad3c2885530e45b8e0 100644
--- a/~dev_rating/application/classes/Model/Teacher/Map.php
+++ b/~dev_rating/application/classes/Model/Teacher/Map.php
@@ -93,13 +93,13 @@ class Model_Teacher_Map extends Model
 	
     public function getDisciplineInfoByID($discipline_id)
     {
-        $sql = "CALL `GetDisciplineInfoByID`('$discipline_id'); ";
+        $sql = "CALL `GetDisciplineInfo`('$discipline_id'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
 
     public function getMapForDiscipline($disciplineID)
     {
-        $sql = "CALL `GetMapForDiscipline`('$disciplineID'); ";
+        $sql = "CALL `GetRoadmap`('$disciplineID'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
 	
diff --git a/~dev_rating/application/classes/Model/Teacher/Rating.php b/~dev_rating/application/classes/Model/Teacher/Rating.php
index f359f6751a8cb009ef46ec366b7860cf97599f72..6ab1dcde29e64db0f7092f3d6d4eb8c870e7db70 100644
--- a/~dev_rating/application/classes/Model/Teacher/Rating.php
+++ b/~dev_rating/application/classes/Model/Teacher/Rating.php
@@ -16,25 +16,25 @@ class Model_Teacher_Rating extends Model
     
     public function getMapForDiscipline($disciplineID)
     {
-        $sql = "CALL `GetMapForDiscipline`('$disciplineID'); ";
+        $sql = "CALL `GetRoadmap`('$disciplineID'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
     
     public function getMapForStudent($studentID, $disciplineID)
     {
-        $sql = "CALL `GetMapForStudent`('$studentID', '$disciplineID'); ";
+        $sql = "CALL `GetRates`('$studentID', '$disciplineID'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
 
     public function getMapForStudentExam($studentID, $disciplineID)
     {
-        $sql = "CALL `GetMapForStudentExam`('$studentID', '$disciplineID'); ";
+        $sql = "CALL `GetRatesExam`('$studentID', '$disciplineID'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
 
     public function GetMapForDisciplineExam($disciplineID)
     {
-        $sql = "CALL `GetMapForDisciplineExam`('$disciplineID'); ";
+        $sql = "CALL `GetRoadmapExam`('$disciplineID'); ";
         return DB::query(Database::SELECT, $sql)->execute();
     }
     
@@ -52,7 +52,7 @@ class Model_Teacher_Rating extends Model
 
     public function getRatesForStudentsGroup($disciplineID, $groupID)
     {
-        $sql = "CALL `getRatesForStudentsGroup`('$disciplineID', '$groupID')";
+        $sql = "CALL `GetRatesForGroup`('$disciplineID', '$groupID')";
         return DB::query(Database::SELECT, $sql)->execute();
     }