diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index d1e808c33a2879b6f107183b286494c55eeb6167..b00b2ebe2df340af7fee6f541c8332e0862b642b 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -1809,7 +1809,7 @@ BEGIN
 END //
 
 
-
+# TODO: slowpoke
 DROP PROCEDURE IF EXISTS GetDisciplinesForStudent//
 CREATE PROCEDURE `GetDisciplinesForStudent`(IN `pStudentID` INT)
     NO SQL
@@ -1818,22 +1818,23 @@ BEGIN
             view_disciplines.SubjectID, 
             view_disciplines.SubjectName, 
             view_disciplines.ExamType,
-            view_disciplines_teachers.LastName       AS 'Last', 
-            view_disciplines_teachers.FirstName      AS 'First',
-            view_disciplines_teachers.SecondName     AS 'Second', 
+            view_teachers.LastName       AS 'Last', 
+            view_teachers.FirstName      AS 'First',
+            view_teachers.SecondName     AS 'Second', 
             (view_rating_result.RateRegular + view_rating_result.RateExtra + 
                 view_rating_result.RateBonus + view_rating_result.RateExam) AS 'Rate', 
             view_disciplines_results.DisciplineRateCur AS 'MaxCurrentRate'
             # --isMapCreated
         FROM `view_disciplines_students`
         INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = view_disciplines_students.DisciplineID
-        INNER JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines_students.DisciplineID
-        INNER JOIN `view_rating_result` ON  view_rating_result.StudentID = pStudentID AND
+        LEFT JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines_students.DisciplineID
+        LEFT JOIN `view_rating_result` ON  view_rating_result.StudentID = pStudentID AND
                                             view_rating_result.DisciplineID = view_disciplines_results.DisciplineID
-        LEFT JOIN `view_disciplines_teachers` ON view_disciplines_teachers.DisciplineID = view_disciplines.DisciplineID 
+        INNER JOIN `view_teachers` ON view_teachers.TeacherID = view_disciplines.AuthorID 
         WHERE   view_disciplines.SemesterID = @CurrentSemesterID AND 
-                view_disciplines_students.StudentID = pStudentID
-        ORDER BY disciplines.ExamType ASC, view_disciplines.DisciplineID ASC;
+                view_disciplines_students.StudentID = pStudentID AND
+                (view_disciplines_students.AttachType IS NULL OR view_disciplines_students.AttachType != 'detach')
+        ORDER BY view_disciplines.ExamType ASC, view_disciplines.DisciplineID ASC;
 END //
 
 
@@ -1843,38 +1844,45 @@ CREATE PROCEDURE `GetMapForStudent`
     (   IN `pStudentID` INT, IN `pDisciplineID` INT)
     NO SQL
 BEGIN  
-    SELECT  modules.ID              AS 'ModuleID', 
-            modules.Name            AS 'ModuleName', 
-            submodules.ID           AS 'SubmoduleID', 
-            submodules.Name         AS 'SubModuleName', 
-            submodules.Description  AS 'SubmoduleDescription', 
-            submodules.MaxRate,
-            submodules.Type         AS 'SubmoduleControl',
-            rating_table.Rate, 
-            rating_table.Date,
-            modules.Type            AS 'ModuleType'
-    FROM `submodules`
-    INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID AND 
-                                    pDisciplineID = modules.DisciplineID
-    LEFT JOIN `rating_table`    ON  submodules.ID = rating_table.SubmoduleID AND 
-                                    pStudentID = rating_table.StudentID 
-
-
-    WHERE   modules.Type != 2 OR
-            submodules.ID = 
-                (   @tmp = (SELECT submodules.ID
-                    FROM `submodules`
-                    INNER JOIN `rating_table` ON rating_table.SubModuleID = submodules.ID
-                    WHERE   submodules.ModuleID = modules.ID AND
-                            rating_table.StudentID = pStudentID
-                    ORDER BY submodules.OrderNum DESC
-                    LIMIT 1)
-                )  OR
-                (@tmp IS NULL AND submodules.OrderNum = 1)
-    ORDER BY    modules.Type ^ 1 ASC,
-                    # 1, 3, 2, 4 ASC
-                modules.OrderNum ASC, 
-                submodules.OrderNum ASC;
+
+    # TODO: delview_rating.ModuleOrderNum, view_rating.SubmoduleOrderNum,
+    # TODO: php time!
+    (SELECT view_rating.ModuleID, 
+            view_rating.ModuleName,
+            view_rating.SubmoduleID,
+            view_rating.SubModuleName,
+            view_rating.SubmoduleRate  AS 'MaxRate',
+            view_rating.Rate,
+            view_rating.Date,
+            view_rating.ModuleOrderNum,
+            view_rating.SubmoduleOrderNum,
+            view_rating.ModuleType
+        FROM `view_rating`
+        WHERE view_rating.StudentID = pStudentID AND
+                view_rating.DisciplineID = pDisciplineID AND
+                view_rating.ModuleType != 'exam'
+    ) UNION (
+    SELECT view_rating.ModuleID, 
+            view_rating.ModuleName,
+            view_rating.SubmoduleID,
+            view_rating.SubModuleName,
+            view_rating.SubmoduleRate  AS 'MaxRate',
+            view_rating.Rate,
+            view_rating.Date,
+            view_rating.ModuleOrderNum,
+            view_rating.SubmoduleOrderNum,
+            view_rating.ModuleType
+        FROM `view_rating`
+        WHERE view_rating.StudentID = pStudentID AND
+                view_rating.DisciplineID = pDisciplineID AND
+                view_rating.ModuleType = 'exam'
+        ORDER BY view_rating.Rate IS NULL ASC,
+                view_rating.SubmoduleOrderNum DESC
+        LIMIT 1
+    ) ORDER BY  ModuleType ^ 1 ASC,
+                # 1, 3, 2, 4 ASC
+                ModuleOrderNum ASC, 
+                SubmoduleOrderNum ASC;
 END //
 
 
@@ -1884,59 +1892,48 @@ CREATE PROCEDURE `GetMapForStudentExam` (   IN `StudentID` INT,
                                         )
     NO SQL
 BEGIN  
-    SELECT  modules.ID              AS 'ModuleID', 
-            modules.Name            AS 'ModuleName', 
-            submodules.ID           AS 'SubmoduleID', 
-            submodules.Name         AS 'SubModuleName', 
-            submodules.Description  AS 'SubmoduleDescription', 
-            submodules.MaxRate,
-            submodules.Type         AS 'SubmoduleControl',
-            rating_table.Rate, 
-            rating_table.Date,
-            modules.Type            AS 'ModuleType'
-    FROM `submodules`
-    INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID AND 
-                                    DisciplineID = modules.DisciplineID
-    LEFT JOIN `rating_table`    ON  submodules.ID = rating_table.SubmoduleID AND 
-                                    StudentID = rating_table.StudentID 
-    ORDER BY    modules.OrderNum ASC, 
-                submodules.OrderNum ASC;
+    SELECT  view_rating.ModuleID, 
+            view_rating.ModuleName,
+            view_rating.SubmoduleID,
+            view_rating.SubModuleName,
+            view_rating.SubmoduleRate  AS 'MaxRate',
+            view_rating.SubmoduleType AS 'SubmoduleControl',
+            view_rating.Rate,
+            view_rating.Date,
+            view_rating.ModuleType
+        FROM `view_rating`
+        WHERE view_rating.StudentID = pStudentID AND
+                view_rating.DisciplineID = pDisciplineID
+        ORDER BY    view_rating.ModuleOrderNum ASC, 
+                    view_rating.SubmoduleOrderNum ASC;
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetMapForDiscipline//
 CREATE PROCEDURE `GetMapForDiscipline`  (   IN `TeacherID`      INT,
-                                            IN `DisciplineID`   INT 
+                                            IN `pDisciplineID`   INT 
                                         )
     NO SQL
 BEGIN  
-    IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) 
-    THEN
-        SELECT  NULL AS 'ID'
-        LIMIT 0;  
-    ELSE
-        SELECT  subjects.ID             AS 'SubjectID',
-                subjects.Name           AS 'SubjectName',   
-                modules.ID              AS 'ModuleID', 
-                modules.Name            AS 'ModuleName', 
-                modules.Type            AS 'ModuleType',
-                submodules.ID           AS 'SubmoduleID', 
-                submodules.Name         AS 'SubModuleName',  
-                submodules.Description  AS 'SubmoduleDescription', 
-                submodules.MaxRate,
-                submodules.Type         AS 'SubmoduleControl'
-        FROM `modules`
-        LEFT JOIN  `submodules` ON modules.ID = submodules.ModuleID
-        INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID
-        INNER JOIN `subjects`   ON disciplines.SubjectID = subjects.ID
-        WHERE   modules.DisciplineID = DisciplineID AND
-                (modules.Type != 2 OR submodules.OrderNum = 1)
-        ORDER BY    modules.Type ^ 1 ASC,
+# kill first param
+        SELECT  view_disciplines.SubjectID,
+                view_disciplines.SubjectName,   
+                view_roadmap.ModuleID, 
+                view_roadmap.ModuleName, 
+                view_roadmap.ModuleType,
+                view_roadmap.SubmoduleID, 
+                view_roadmap.SubmoduleName  AS 'SubModuleName',  
+                view_roadmap.SubmoduleRate  AS 'MaxRate',
+                view_roadmap.SubmoduleType          AS 'SubmoduleControl'
+        FROM `view_roadmap`
+        INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = pDisciplineID
+        WHERE   view_roadmap.DisciplineID = pDisciplineID AND
+                (view_roadmap.ModuleType != 'exam' OR view_roadmap.SubmoduleOrderNum = 1)
+        ORDER BY    view_roadmap.ModuleType ^ 1 ASC,
                     # 1, 3, 2, 4 ASC
-                    modules.OrderNum ASC, 
-                    submodules.OrderNum ASC;
-    END IF;
+                    view_roadmap.ModuleOrderNum ASC, 
+                    view_roadmap.SubmoduleOrderNum ASC;
 END //
 
 
@@ -1946,66 +1943,54 @@ CREATE PROCEDURE `GetMapForDisciplineExam`      (   IN `TeacherID`      INT,
                                                 )
     NO SQL
 BEGIN  
-    IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) 
-    THEN
-        SELECT  NULL AS 'ID'
-        LIMIT 0;  
-    ELSE
-        SELECT  subjects.ID             AS 'SubjectID',
-                subjects.Name           AS 'SubjectName',   
-                modules.ID              AS 'ModuleID', 
-                modules.Name            AS 'ModuleName', 
-                modules.Type            AS 'ModuleType',
-                submodules.ID           AS 'SubmoduleID', 
-                submodules.Name         AS 'SubModuleName', 
-                submodules.Description  AS 'SubmoduleDescription', 
-                submodules.MaxRate,
-                submodules.Type         AS 'SubmoduleControl'
-        FROM `modules`
-        LEFT JOIN  `submodules` ON modules.ID = submodules.ModuleID
-        INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID
-        INNER JOIN `subjects`   ON disciplines.SubjectID = subjects.ID
-        WHERE   modules.DisciplineID = DisciplineID AND
-                (modules.Type = 4 OR modules.Type = 2)
-        ORDER BY modules.OrderNum ASC, 
-                 submodules.OrderNum ASC;
-    END IF;
+
+        SELECT  view_disciplines.SubjectID,
+                view_disciplines.SubjectName,   
+                view_roadmap.ModuleID, 
+                view_roadmap.ModuleName, 
+                view_roadmap.ModuleType,
+                view_roadmap.SubmoduleID, 
+                view_roadmap.SubmoduleName  AS 'SubModuleName',  
+                view_roadmap.SubmoduleRate  AS 'MaxRate',
+                view_roadmap.SubmoduleType          AS 'SubmoduleControl'
+        FROM `view_roadmap`
+        INNER JOIN `view_disciplines` ON view_disciplines.DisciplineID = pDisciplineID
+        WHERE   view_roadmap.DisciplineID = DisciplineID AND
+                (view_roadmap.ModuleType = 'exam' OR view_roadmap.ModuleType = 'extra')
+        ORDER BY    view_roadmap.ModuleType ^ 1 ASC,
+                    # 1, 3, 2, 4 ASC
+                    view_roadmap.ModuleOrderNum ASC, 
+                    view_roadmap.SubmoduleOrderNum ASC;
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetDisciplineInfoByID//
-CREATE PROCEDURE `GetDisciplineInfoByID`(   IN `DiscID` INT )
+CREATE PROCEDURE `GetDisciplineInfoByID`(   IN `pDisciplineID` INT )
     NO SQL
 BEGIN  
-    SELECT  disciplines.AuthorID,
-            disciplines.GradeID             AS 'GradeID',
-            grades.Num                      AS 'GradeNum',
-            grades.Degree                   AS 'Degree',
-            disciplines.ExamType,
-            disciplines.LectionCount,
-            disciplines.PracticeCount,
-            disciplines.LabCount,
-            disciplines.SemesterID,
-            subjects.ID                     AS 'SubjectID',
-            subjects.Name                   AS 'SubjectName',
-            subjects.Abbr                   AS 'SubjectAbbr',
-            departments.ID                  AS 'DepID',
-            departments.Name                AS 'DepName',
-            faculties.ID                    AS 'FacultyID',
-            faculties.Name                  AS 'FacultyName',
-            disciplines.isLocked            AS 'isLocked',
-            (modules.ID IS NOT NULL)        AS 'isBonus',
-            disciplines.isMilestone
-    FROM `disciplines`
-    INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID
-    INNER JOIN `faculties` ON faculties.ID = disciplines.FacultyID
-    INNER JOIN `teachers` ON disciplines.AuthorID = teachers.ID
-    INNER JOIN `departments` ON departments.ID = teachers.DepartmentID
-    INNER JOIN `grades` ON grades.ID = disciplines.GradeID 
-    LEFT JOIN  `modules` ON modules.DisciplineID = disciplines.ID AND
-                            modules.Type = 3
-    WHERE   disciplines.ID = DiscID;
+    SELECT  view_disciplines.AuthorID,
+            view_disciplines.GradeID,
+            view_disciplines.GradeNum,
+            view_disciplines.Degree,
+            view_disciplines.ExamType,
+            view_disciplines.LectionCount,
+            view_disciplines.PracticeCount,
+            view_disciplines.LabCount,
+            view_disciplines.SemesterID,
+            view_disciplines.SubjectID,
+            view_disciplines.SubjectName,
+            view_disciplines.SubjectAbbr,
+            view_disciplines.FacultyID,
+            view_disciplines.FacultyName,
+            view_disciplines.isLocked,
+            view_disciplines.isMilestone,
+            (modules.ID IS NOT NULL)    AS 'isBonus'
+        FROM `view_disciplines`
+        LEFT JOIN  `modules` ON modules.DisciplineID = view_disciplines.DisciplineID AND
+                                modules.Type = 'bonus'
+        WHERE view_disciplines.DisciplineID = pDisciplineID
+        LIMIT 1;
 END //
 
 
@@ -2014,59 +1999,55 @@ END //
 
 
 DROP FUNCTION IF EXISTS AddDiscipline//
-CREATE FUNCTION `AddDiscipline` (   `TeacherID`     INT,
-                                    `GradeID`       INT,
-                                    `SubjectID`     INT,
-                                    `ExamType`      VARCHAR(30) charset utf8,
-                                    `LectionCount`  INT,
-                                    `PracticeCount` INT,
-                                    `LabCount`      INT,
-                                    `FacultyID` INT     
-                                )   RETURNS int(11)
+CREATE FUNCTION `AddDiscipline` 
+    (   `pTeacherID` INT, `pGradeID` INT, `pSubjectID` INT,
+        `pExamType` VARCHAR(30) charset utf8,
+        `pLectionCount` INT, `pPracticeCount` INT, `pLabCount` INT,
+        `pFacultyID` INT
+    )   RETURNS int(11)
     NO SQL
 BEGIN  
-    DECLARE checker, DisciplineID INT; 
+    DECLARE vChecker, vDisciplineID INT DEFAULT -1;
 
-    SET checker = -1;
     SELECT grades.ID
-    INTO checker
-    FROM `grades`
-    INNER JOIN `faculties`  ON  FacultyID = faculties.ID
-    INNER JOIN `subjects`   ON  SubjectID = subjects.ID
-    INNER JOIN `teachers`   ON  TeacherID = teachers.ID
-    WHERE GradeID = grades.ID
-    LIMIT 1;
-    IF  checker <= 0 OR
-        ( ExamType != 'exam' AND ExamType != 'credit')
-    THEN
+        INTO vChecker
+        FROM `grades`
+        INNER JOIN `subjects_faculties` ON  subjects_faculties.SubjectID = pSubjectID AND
+                                            subjects_faculties.FacultyID = pFacultyID
+        INNER JOIN `teachers`   ON  pTeacherID = teachers.ID
+        WHERE pGradeID = grades.ID
+        LIMIT 1;
+    IF vChecker <= 0 THEN
         RETURN -1;
     END IF;
 
     INSERT INTO `disciplines`   
-            (   disciplines.AuthorID, 
-                disciplines.GradeID, 
-                disciplines.SubjectID, 
-                disciplines.ExamType, 
-                disciplines.LectionCount, 
-                disciplines.PracticeCount,
-                disciplines.LabCount,
-                disciplines.SemesterID,
-                disciplines.FacultyID 
-            )
-    VALUES  (   TeacherID, GradeID, SubjectID, ExamType, LectionCount, PracticeCount, LabCount, @CurrentSemesterID, FacultyID );
+        (   disciplines.AuthorID, 
+            disciplines.GradeID, 
+            disciplines.SubjectID, 
+            disciplines.ExamType, 
+            disciplines.LectionCount, 
+            disciplines.PracticeCount,
+            disciplines.LabCount,
+            disciplines.SemesterID,
+            disciplines.FacultyID 
+        )
+        VALUES  (   pTeacherID, pGradeID, pSubjectID, pExamType, 
+                    pLectionCount, pPracticeCount, pLabCount, 
+                    @CurrentSemesterID, pFacultyID );
     
-    SET DisciplineID = LAST_INSERT_ID();
+    SET vDisciplineID = LAST_INSERT_ID();
     INSERT INTO `disciplines_teachers`
-            (   disciplines_teachers.DisciplineID,
-                disciplines_teachers.TeacherID  
-            )
-    VALUES  (   DisciplineID, TeacherID );
+        (   disciplines_teachers.DisciplineID,
+            disciplines_teachers.TeacherID  
+        )
+        VALUES (vDisciplineID, pTeacherID);
 
     IF ExamType = 'exam' THEN
-        SET checker = AddModuleExam(TeacherID, DisciplineID);
+        SET vChecker = AddModuleExam(pTeacherID, vDisciplineID);
     END IF;
-    SET checker = AddModuleExtra(TeacherID, DisciplineID);
-    RETURN DisciplineID;
+    SET vChecker = AddModuleExtra(pTeacherID, vDisciplineID);
+    RETURN vDisciplineID;
 END //
 
 
diff --git a/db/Views.sql b/db/Views.sql
index 5b7e22579d202b7eb35bd9036aa256fad6ba4201..92d84cf65b2b4937564c03f0521bf94e7ba34e4a 100644
--- a/db/Views.sql
+++ b/db/Views.sql
@@ -140,6 +140,7 @@ CREATE OR REPLACE VIEW `view_rating` AS
     INNER JOIN `view_students` ON rating_table.StudentID = view_students.StudentID; 
 
 
+
 CREATE OR REPLACE VIEW `view_rating_result` AS
     SELECT  view_rating.StudentID,
             view_rating.DisciplineID,