diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index 95f008e623f50711c43364ad5b914add52b22678..d1e808c33a2879b6f107183b286494c55eeb6167 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -16,7 +16,7 @@ DELIMITER //
 # "SetRate" stored procedure can change isLocked flag
 DROP FUNCTION IF EXISTS InternalIsMapLocked//
 CREATE FUNCTION `InternalIsMapLocked`
-(`disciplineID` INT) RETURNS boolean
+    (`disciplineID` INT) RETURNS boolean
     NO SQL
 BEGIN  
     DECLARE checker INT DEFAULT -1;
@@ -33,7 +33,7 @@ END //
 # check, that student really take this course
 DROP FUNCTION IF EXISTS InternalIsStudentAttached//
 CREATE FUNCTION `InternalIsStudentAttached`
-(`StudentID` INT, `DisciplineID` INT) RETURNS boolean
+    (`StudentID` INT, `DisciplineID` INT) RETURNS boolean
     NO SQL
 BEGIN 
     DECLARE checker boolean;
@@ -676,7 +676,7 @@ BEGIN
         FROM `view_study_groups`
         WHERE   view_study_groups.GradeID = pGradeID AND
                 view_study_groups.FacultyID = pFacultyID
-        ORDER BY study_groups.GroupNum ASC;
+        ORDER BY view_study_groups.GroupNum ASC;
 END //
 
 
@@ -694,7 +694,7 @@ BEGIN
             view_study_groups.SpecName,
             view_study_groups.SpecAbbr
         FROM `disciplines_groups`
-        INNER JOIN `view_study_groups` ON disciplines_groups.GroupID = view_study_groups.GroupID
+        INNER JOIN `view_study_groups` ON disciplines_groups.StudyGroupID = view_study_groups.GroupID
         WHERE disciplines_groups.DisciplineID = pDisciplineID
         ORDER BY view_study_groups.GradeID ASC, view_study_groups.GroupID ASC;
 END //
@@ -705,18 +705,17 @@ CREATE PROCEDURE `GetStudyGroupsForDisciplineFull` (IN `pDisciplineID` INT)
     NO SQL
 BEGIN
     SELECT DISTINCT 
-    # select all students and collapse all groups
-            view_study_groups.GroupID   AS 'ID',
-            view_study_groups.GroupNum,
-            view_study_groups.GradeID,
-            view_study_groups.GradeNum,
-            view_study_groups.Degree,
-            view_study_groups.SpecID,
-            view_study_groups.SpecName,
-            view_study_groups.SpecAbbr
+            view_disciplines_students.GroupID   AS 'ID',
+            view_disciplines_students.GroupNum,
+            view_disciplines_students.GradeID,
+            view_disciplines_students.GradeNum,
+            view_disciplines_students.Degree,
+            view_disciplines_students.SpecID,
+            view_disciplines_students.SpecName,
+            view_disciplines_students.SpecAbbr
         FROM `view_disciplines_students`
         WHERE view_disciplines_students.DisciplineID = pDisciplineID
-        ORDER BY view_disciplines_students.GradeID ASC, view_disciplines_students.GroupNum ASC;
+        ORDER BY view_disciplines_students.GradeID ASC, view_disciplines_students.GroupID ASC;
 END //
 
 
@@ -963,144 +962,137 @@ END //
 
 
 DROP FUNCTION IF EXISTS ChangePassword//
-CREATE FUNCTION `ChangePassword`    (   `UserID` INT,  
-                                        `Password` VARCHAR(255) CHARSET utf8
-                                    )   RETURNS int(11)
+CREATE FUNCTION `ChangePassword`
+    (   `pUserID` INT, `pPassword` VARCHAR(255) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE checker INT;
-
-    IF Password IS NULL THEN
-        RETURN -1;
-    END IF;
+    DECLARE vChecker INT DEFAULT -1;
 
     # check account with UserID
-    SET checker = -1;
     SELECT accounts.ID
-    INTO checker
-    FROM `accounts`
-    WHERE accounts.ID = UserID
-    LIMIT 1;
-    IF checker <= 0 THEN
+        INTO vChecker
+        FROM `accounts`
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
+    IF vChecker <= 0 OR pPassword IS NULL THEN
         RETURN -1;
     END IF;
 
     # set new password
     UPDATE `accounts`
-    SET accounts.Password = Password
-    WHERE accounts.ID = UserID
-    LIMIT 1;
+        SET accounts.Password = pPassword
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS ChangeLogin//
-CREATE FUNCTION `ChangeLogin`   (   `UserID` INT,  
-                                    `Login` VARCHAR(50) CHARSET utf8
-                                )   RETURNS int(11)
+CREATE FUNCTION `ChangeLogin`
+    (   `pUserID` INT, `pLogin` VARCHAR(50) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE checker INT;
+    DECLARE vChecker INT DEFAULT -1;
 
     # check for account with UserID
-    SET checker = -1;
     SELECT accounts.ID
-    INTO checker
-    FROM `accounts` 
-    WHERE accounts.ID = UserID
-    LIMIT 1;
-    IF checker <= 0 THEN
+        INTO vChecker
+        FROM `accounts` 
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
+    IF vChecker <= 0 THEN
         RETURN -1;
     END IF;
 
     # search accounts with Login (login must be unique)
-    SET checker = -1;
+    SET vChecker = -1;
     SELECT accounts.ID 
-    INTO checker
-    FROM `accounts`
-    WHERE accounts.Login = Login
-    LIMIT 1;
-    IF checker > 0 THEN 
+        INTO vChecker
+        FROM `accounts`
+        WHERE accounts.Login = pLogin
+        LIMIT 1;
+    IF vChecker > 0 THEN 
         RETURN -1;
     END IF;
 
-
     # set new login
     UPDATE `accounts` 
-    SET accounts.Login = Login
-    WHERE accounts.ID = UserID
-    LIMIT 1;
+        SET accounts.Login = pLogin
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS ChangeMail//
-CREATE FUNCTION `ChangeMail`    (   `UserID` INT,  
-                                    `EMail` VARCHAR(50) CHARSET utf8
-                                )   RETURNS int(11)
+CREATE FUNCTION `ChangeMail`   
+    (   `pUserID` INT, `pEMail` VARCHAR(50) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE checker INT;
+    DECLARE vChecker INT DEFAULT -1;
     
     # check for account with UserID
-    SET checker = -1;
     SELECT accounts.ID 
-    INTO checker
-    FROM `accounts` 
-    WHERE accounts.ID = UserID
-    LIMIT 1;
-    IF checker <= 0 THEN
+        INTO vChecker
+        FROM `accounts` 
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
+    IF vChecker <= 0 THEN
         RETURN -1;
     END IF;
 
     # search accounts with EMail (e-mail must be unique)
-    SET checker = -1;
+    SET vChecker = -1;
     SELECT accounts.ID 
-    INTO checker
-    FROM `accounts`
-    WHERE accounts.EMail = EMail
-    LIMIT 1;
+    INTO vChecker
+        FROM `accounts`
+        WHERE accounts.EMail = pEMail
+        LIMIT 1;
     IF checker > 0 THEN 
         RETURN -1;
     END IF;
 
     # set new e-mail
     UPDATE `accounts` 
-    SET accounts.EMail = EMail
-    WHERE accounts.ID = UserID
-    LIMIT 1;
+        SET accounts.EMail = pEMail
+        WHERE accounts.ID = pUserID
+        LIMIT 1;
     RETURN 0;
 END //
 
 
 
 DROP FUNCTION IF EXISTS SignIn//
-CREATE FUNCTION `SignIn`(   `LoginOrMail` VARCHAR(255) CHARSET utf8, 
-                            `Password`  VARCHAR(64) CHARSET utf8
-                        )   RETURNS int(11)
+CREATE FUNCTION `SignIn`
+    (   `pLoginOrMail` VARCHAR(255) CHARSET utf8, 
+        `pPassword`  VARCHAR(64) CHARSET utf8
+    )   RETURNS int(11)
     NO SQL
 BEGIN 
-    DECLARE curID INT;
+    DECLARE vAccountID INT DEFAULT -1;
 
-    SET curID = -1;
+    #check account existence
     SELECT accounts.ID
-    INTO curID
-    FROM `accounts`
-    WHERE   accounts.Password = Password AND
-            (   accounts.Login = LoginOrMail OR 
-                accounts.EMail = LoginOrMail    )
-    LIMIT 1;
-    IF curID <= 0 THEN 
+        INTO vAccountID
+        FROM `accounts`
+        WHERE   accounts.Password = pPassword AND
+                (accounts.Login = pLoginOrMail OR accounts.EMail = pLoginOrMail)
+        LIMIT 1;
+    IF vAccountID <= 0 THEN 
         RETURN -1;
     END IF;
 
     # loging
     INSERT INTO `logs_signin`
-            (   logs_signin.AccountID   )
-    VALUES  (   curID   );
-        RETURN curID;
+        (logs_signin.AccountID)
+        VALUES  (vAccountID);
+
+    RETURN vAccountID;
 END //
 
 
@@ -1112,163 +1104,150 @@ END //
 
 
 DROP FUNCTION IF EXISTS ChangeTeacherInfo//
-CREATE FUNCTION `ChangeTeacherInfo` (   `TeacherID`     INT, 
-                                        `TeacherLast` VARCHAR(30) CHARSET utf8,
-                                        `TeacherFirst` VARCHAR(30) CHARSET utf8,
-                                        `TeacherSecond` VARCHAR(30) CHARSET utf8,
-                                        `JobPositionID` INT,
-                                        `DepartmentID` INT
-                                    )   RETURNS int(11)
+CREATE FUNCTION `ChangeTeacherInfo` 
+    (   `pTeacherID` INT, 
+        `pLastName` VARCHAR(30) CHARSET utf8,
+        `pFirstName` VARCHAR(30) CHARSET utf8,
+        `pSecondName` VARCHAR(30) CHARSET utf8,
+        `pJobPositionID` INT,
+        `pDepartmentID` INT
+    ) RETURNS int(11)
     NO SQL
 BEGIN  
-    DECLARE checker INT;
-    SET checker = -1;
+    DECLARE vChecker INT DEFAULT -1;
 
     # check existing of Teacher, jobPosition & Department
     SELECT teachers.ID
-    INTO checker
-    FROM `teachers`
-    INNER JOIN `job_positions`  ON  JobPositionID = job_positions.ID
-    INNER JOIN `departments`    ON  DepartmentID = departments.ID
-    WHERE TeacherID = teachers.ID
-    LIMIT 1;
-    IF  checker <= 0 OR
-        TeacherLast IS NULL OR
-        TeacherSecond IS NULL OR
-        TeacherSecond IS NULL
+        INTO vChecker
+        FROM `teachers`
+        INNER JOIN `job_positions` ON job_positions.ID = pJobPositionID
+        INNER JOIN `departments` ON departments.ID = pDepartmentID
+        WHERE pTeacherID = teachers.ID
+        LIMIT 1;
+    IF  vChecker <= 0 OR
+        pLastName IS NULL OR
+        pSecondName IS NULL OR
+        pFirstName IS NULL
     THEN 
         RETURN -1;
     END IF;
 
     # set new info
     UPDATE `teachers`
-    SET     teachers.LastName = TeacherLast,
-            teachers.FirstName = TeacherFirst,
-            teachers.SecondName = TeacherSecond,
-            teachers.JobPositionID = JobPositionID,
-            teachers.DepartmentID = DepartmentID
-    WHERE TeacherID = teachers.ID
-    LIMIT 1;
+        SET teachers.LastName = pLastName,
+            teachers.FirstName = pFirstName,
+            teachers.SecondName = pSecondName,
+            teachers.JobPositionID = pJobPositionID,
+            teachers.DepartmentID = pDepartmentID
+        WHERE teachers.ID = pTeacherID
+        LIMIT 1;
     RETURN 0;
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetTeachersByFaculty//
-CREATE PROCEDURE `GetTeachersByFaculty` (   IN `FacultyID` INT  
-                                        )
+CREATE PROCEDURE `GetTeachersByFaculty` (IN `pFacultyID` INT)
     NO SQL
 BEGIN
-    SELECT  teachers.ID             AS 'ID', 
-            teachers.LastName       AS 'Last', 
-            teachers.FirstName      AS 'First', 
-            teachers.SecondName     AS 'Second', 
-            teachers.AccountID      AS 'AccountID',
-            job_positions.Name      AS 'JobPositionName', 
-            departments.ID          AS 'DepID',
-            departments.Name        AS 'DepName'
-    FROM `teachers`
-    INNER JOIN `departments`    ON  departments.ID = teachers.DepartmentID AND
-                                    FacultyID = departments.FacultyID
-    INNER JOIN `job_positions`  ON  job_positions.ID = teachers.JobPositionID
-    ORDER BY    teachers.LastName ASC, 
-                teachers.FirstName ASC, 
-                teachers.SecondName ASC;
+    SELECT  view_teachers.Teacher       AS 'ID',
+            view_teachers.LastName      AS 'Last',
+            view_teachers.FirstName     AS 'First',
+            view_teachers.SecondName    AS 'Second',
+            view_teachers.AccountID,
+            view_teachers.JobPositionName,
+            view_teachers.DepID,
+            view_teachers.DepName
+        FROM `view_teachers`
+        WHERE view_teachers.FacultyID = pFacultyID
+        ORDER BY view_teachers.LastName ASC, view_teachers.FirstName ASC;
 END //
 
 
-# CHANGE
 
 DROP PROCEDURE IF EXISTS GetTeachersByDepartment//
-CREATE PROCEDURE `GetTeachersByDepartment`  (   IN `DepartmentID` INT  
-                                            )
+CREATE PROCEDURE `GetTeachersByDepartment` (IN `pDepartmentID` INT)
     NO SQL
 BEGIN
-    SELECT  teachers.ID             AS 'ID', 
-            teachers.LastName       AS 'Last', 
-            teachers.FirstName      AS 'First', 
-            teachers.SecondName     AS 'Second', 
-            teachers.AccountID      AS 'AccountID', 
-            job_positions.Name      AS 'JobPositionName', 
-            departments.ID          AS 'DepID',
-            departments.Name        AS 'DepName'
-    FROM `teachers`
-    INNER JOIN `departments`    ON  teachers.DepartmentID = departments.ID AND
-                                    DepartmentID = departments.ID
-    INNER JOIN `job_positions`  ON  job_positions.ID = teachers.JobPositionID
-    ORDER BY    teachers.LastName ASC, 
-                teachers.FirstName ASC, 
-                teachers.SecondName ASC;
+    SELECT  view_teachers.Teacher       AS 'ID',
+            view_teachers.LastName      AS 'Last',
+            view_teachers.FirstName     AS 'First',
+            view_teachers.SecondName    AS 'Second',
+            view_teachers.AccountID,
+            view_teachers.JobPositionName,
+            view_teachers.DepID,
+            view_teachers.DepName
+        FROM `view_teachers`
+        WHERE view_teachers.DepID = pDepartmentID
+        ORDER BY view_teachers.LastName ASC, view_teachers.FirstName ASC;
 END //
 
 
 DROP FUNCTION IF EXISTS CreateTeacher//
-CREATE FUNCTION `CreateTeacher`(    `Last`          VARCHAR(30) CHARSET utf8, 
-                                    `First`         VARCHAR(30) CHARSET utf8, 
-                                    `Second`        VARCHAR(30) CHARSET utf8, 
-                                    `JobPositionID` INT, 
-                                    `DepartmentID`  INT, 
-                                    `Code`          VARCHAR(40) CHARSET utf8 
-                                )   RETURNS int(11)
+CREATE FUNCTION `CreateTeacher`
+    (   `pLastName` VARCHAR(30) CHARSET utf8, 
+        `pFirstName` VARCHAR(30) CHARSET utf8, 
+        `pSecondName` VARCHAR(30) CHARSET utf8, 
+        `pJobPositionID` INT, 
+        `pDepartmentID`  INT, 
+        `pActivationCode` VARCHAR(40) CHARSET utf8 
+    ) RETURNS int(11)
     NO SQL
 BEGIN 
-    DECLARE accID, checker, RoleID INT;
+    DECLARE vAccountID, vChecker, vRoleID INT DEFAULT -1;
 
-    IF Code IS NULL OR Last IS NULL OR First IS NULL THEN
+    # check input params
+    IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN
         RETURN -1;
     END IF;
 
     # check Department & jobPosition existing
-    SET checker = -1;
     SELECT departments.ID 
-    INTO checker
-    FROM `departments`
-    INNER JOIN `job_positions` ON job_positions.ID = JobPositionID
-    WHERE departments.ID = DepartmentID
-    LIMIT 1;
-    IF checker <= 0 THEN
+        INTO vChecker
+        FROM `departments`
+        INNER JOIN `job_positions` ON job_positions.ID = pJobPositionID
+        WHERE departments.ID = pDepartmentID
+        LIMIT 1;
+    IF vChecker <= 0 THEN
         RETURN -1;
     END IF;
 
     # search accounts with same Code
-    SET accID = -1;
     SELECT accounts.ID 
-    INTO accID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF accID > 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID > 0 THEN
         RETURN -2;
     END IF;
 
     # user role 2 - common teacher
     # add new account
     INSERT INTO `accounts` 
-            ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode )
-    VALUES  ( NULL, NULL, NULL, 2, Code);
+        (   accounts.Login , accounts.Password , accounts.EMail, 
+            accounts.UserRoleID, accounts.ActivationCode )
+        VALUES  ( NULL, NULL, NULL, 2, pActivationCode);
     
 
     # get this account ID
-    SET accID = -1;
+    SET vAccountID = -1;
     SELECT accounts.ID 
-    INTO accID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF accID <= 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID <= 0 THEN
         RETURN -3;
     END IF; 
     
     # add new teacher
     INSERT INTO `teachers` 
         (   teachers.AccountID, 
-            teachers.LastName, 
-            teachers.FirstName, 
-            teachers.SecondName, 
-            teachers.JobPositionID, 
-            teachers.DepartmentID
+            teachers.LastName, teachers.FirstName, teachers.SecondName, 
+            teachers.JobPositionID, teachers.DepartmentID
         )
-    VALUES  (accID, Last, First, Second, JobPositionID, DepartmentID);
+        VALUES  (vAccountID, pLastName, pFirstName, pSecondName, pJobPositionID, pDepartmentID);
     RETURN 0;
 END //
 
@@ -1276,63 +1255,67 @@ END //
 # TODO: deprecated
 
 DROP FUNCTION IF EXISTS CreateTeacherByDepName//
-CREATE FUNCTION `CreateTeacherByDepName`(   `Last`          VARCHAR(30) CHARSET utf8, 
-                                            `First`         VARCHAR(30) CHARSET utf8, 
-                                            `Second`        VARCHAR(30) CHARSET utf8, 
-                                            `DepartmentName` VARCHAR(200) CHARSET utf8, 
-                                            `Code`          VARCHAR(40) CHARSET utf8 
-                                        )   RETURNS int(11)
+CREATE FUNCTION `CreateTeacherByDepName`
+    (   `pLastName` VARCHAR(30) CHARSET utf8, 
+        `pFirstName` VARCHAR(30) CHARSET utf8, 
+        `pSecondName` VARCHAR(30) CHARSET utf8, 
+        `pDepartmentName` VARCHAR(200) CHARSET utf8, 
+        `pActivationCode` VARCHAR(40) CHARSET utf8 
+    )   RETURNS int(11)
     NO SQL
 BEGIN 
-    DECLARE curID, checker, RoleID, DepID INT;
+    DECLARE vAccountID, vChecker, vRoleID, vDepID INT DEFAULT -1;
 
-    IF Code IS NULL OR Last IS NULL OR First IS NULL THEN
+    # check input params
+    IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN
         RETURN -1;
     END IF;
 
-    SET checker = -1;
+    # try to find a department with pDepartmentName
     SELECT departments.ID 
-    INTO DepID
-    FROM `departments`
-    WHERE   departments.Name = DepartmentName OR
-            (DepartmentName = '' AND departments.Name IS NULL)
-    LIMIT 1;
+        INTO vDepID
+        FROM `departments`
+        WHERE   departments.Name = pDepartmentName OR
+                (pDepartmentName = '' AND departments.Name IS NULL)
+                # or stub department record 
+        LIMIT 1;
     IF DepID <= 0 THEN
         RETURN -1;
     END IF;
 
-    SET checker = -1;
+    # TODO: hard code '12'
+    # try to find default job_position 
     SELECT job_positions.ID 
-    INTO checker
-    FROM `job_positions`
-    WHERE job_positions.ID = 12
-    LIMIT 1;
-    IF checker <= 0 THEN
+        INTO vChecker
+        FROM `job_positions`
+        WHERE job_positions.ID = 12
+        LIMIT 1;
+    IF vChecker <= 0 THEN
         RETURN -1;
     END IF;
 
-    SET curID = -1;
     SELECT accounts.ID 
-    INTO curID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF curID > 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID > 0 THEN
         RETURN -2;
     END IF;
 
     # TODO: user roles
     INSERT INTO `accounts` 
-            ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode )
-    VALUES  ( NULL, NULL, NULL, 2, Code);
+        (   accounts.Login , accounts.Password , accounts.EMail, 
+            accounts.UserRoleID, accounts.ActivationCode )
+        VALUES  ( NULL, NULL, NULL, 2, pActivationCode);
 
-    SET curID = -1;
+    SET vAccountID = -1;
     SELECT accounts.ID 
-    INTO curID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF curID <= 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID <= 0 THEN
         RETURN -3;
     END IF; 
 
@@ -1344,70 +1327,75 @@ BEGIN
             teachers.JobPositionID, 
             teachers.DepartmentID
         )
-    VALUES  (curID, Last, First, Second, 12, DepID);
+        VALUES  (vAccountID, pLastName, pFirstName, pSecondName, 12, vDepID);
     RETURN 0;
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetTeachersForDiscipline//
-CREATE PROCEDURE `GetTeachersForDiscipline`(IN `DisciplineID` INT)
+CREATE PROCEDURE `GetTeachersForDiscipline`(IN `pDisciplineID` INT)
     NO SQL
 BEGIN  
 
-        SELECT  teachers.ID             AS 'ID', 
-                teachers.LastName       AS 'Last', 
-                teachers.FirstName      AS 'First', 
-                teachers.SecondName     AS 'Second', 
-                job_positions.ID        AS 'JobPositionID',
-                job_positions.Name      AS 'JobPositionName', 
-                departments.ID          AS 'DepID',
-                departments.Name        AS 'DepName',
-                faculties.ID            AS 'FacultyID', 
-                faculties.Name          AS 'FacultyName', 
-                faculties.Abbr          AS 'FacultyAbbr',
-                (teachers.ID = disciplines.AuthorID)    AS 'isAuthor'
-        FROM `disciplines_teachers`
-        INNER JOIN `disciplines`    ON  disciplines.ID = disciplines_teachers.DisciplineID
-        INNER JOIN `teachers`       ON  teachers.ID = disciplines_teachers.TeacherID
-        INNER JOIN `departments`    ON  departments.ID = teachers.DepartmentID
-        INNER JOIN `faculties`      ON  departments.FacultyID = faculties.ID
-        INNER JOIN `job_positions`  ON  job_positions.ID = teachers.JobPositionID
-        WHERE disciplines_teachers.DisciplineID = DisciplineID
-        ORDER BY isAuthor DESC, teachers.LastName ASC;
+    SELECT  view_disciplines_teachers.TeacherID     AS 'ID',
+            view_disciplines_teachers.LastName      AS 'Last',
+            view_disciplines_teachers.FirstName     AS 'First',
+            view_disciplines_teachers.SecondName    AS 'Second',
+            view_disciplines_teachers.JobPositionID,
+            view_disciplines_teachers.JobPositionName,
+            view_disciplines_teachers.DepID,
+            view_disciplines_teachers.DepName,
+            view_disciplines_teachers.FacultyID,
+            view_disciplines_teachers.FacultyAbbr,
+            view_disciplines_teachers.IsAuthor      AS 'isAuthor'   
+        FROM `view_disciplines_teachers`
+        WHERE view_disciplines_teachers.DisciplineID = pDisciplineID
+        ORDER BY view_disciplines_teachers.IsAuthor DESC, 
+                view_disciplines_teachers.LastName ASC, 
+                view_disciplines_teachers.FirstName ASC;
 END //
 
 
 
-# TODO: rename
+# TODO: fail
 DROP PROCEDURE IF EXISTS SearchTeachers//
-CREATE PROCEDURE `SearchTeachers`       (   IN `FacultyID` INT,
-                                            IN `DepartmentID` INT,
-                                            IN `Name` VARCHAR(100) CHARSET utf8, 
-                                            IN `DisciplineID` INT  
-                                        )
+CREATE PROCEDURE `SearchTeachers`      
+    (   IN `pFacultyID` INT, IN `pDepartmentID` INT,
+        IN `pFullName` VARCHAR(100) CHARSET utf8,
+        IN `pDisciplineID` INT  )
     NO SQL
 BEGIN
-    SELECT  teachers.ID             AS 'ID', 
-            teachers.LastName       AS 'Last', 
-            teachers.FirstName      AS 'First', 
-            teachers.SecondName     AS 'Second', 
-            teachers.AccountID      AS 'AccountID',
-            job_positions.Name      AS 'JobPositionName', 
-            departments.ID          AS 'DepID',
-            departments.Name        AS 'DepName'
-    FROM `teachers`
-    INNER JOIN `departments`    ON  teachers.DepartmentID = departments.ID AND
-                                    ( DepartmentID = 0 OR DepartmentID = departments.ID ) AND
-                                    ( FacultyID = 0 OR FacultyID = departments.FacultyID ) 
-    INNER JOIN `job_positions`  ON  teachers.JobPositionID = job_positions.ID
-    WHERE   NOT InternalIsTeacherBindeded(teachers.ID, DisciplineID) AND
-            CONCAT(teachers.LastName, teachers.FirstName, teachers.SecondName) LIKE CONCAT("%",Name,"%")
-    ORDER BY    departments.FacultyID ASC, 
-                departments.Name ASC, 
-                teachers.LastName ASC, 
-                teachers.FirstName ASC, 
-                teachers.SecondName ASC;
+    DECLARE vAuthorID INt DEFAULT -1;
+    SELECT disciplines.AuthorID
+        INTO vAuthorID
+        FROM `disciplines`
+        WHERE disciplines.ID = pDisciplineID
+        LIMIT 1;
+
+
+    SELECT DISTINCT 
+            view_teachers.TeacherID     AS 'ID',
+            view_teachers.LastName      AS 'Last',
+            view_teachers.FirstName     AS 'First',
+            view_teachers.SecondName    AS 'Second',
+            view_teachers.JobPositionName,
+            view_teachers.DepID,
+            view_teachers.DepName,
+            (view_teachers.TeacherID = vAuthorID) AS 'isAuthor'    
+        FROM `view_teachers`
+        LEFT JOIN `disciplines_teachers` ON disciplines_teachers.TeacherID = view_teachers.TeacherID AND
+                                            disciplines_teachers.DisciplineID = pDisciplineID
+        WHERE disciplines_teachers.ID IS NULL AND
+            (pDepartmentID = 0 OR pDepartmentID = view_teachers.DepID ) AND
+            pFacultyID = view_teachers.FacultyID AND
+            CONCAT( view_teachers.LastName, 
+                    view_teachers.FirstName, 
+                    view_teachers.SecondName) 
+                LIKE CONCAT("%",pFullName,"%")
+        ORDER BY view_teachers.FacultyID ASC,
+                view_teachers.DepName ASC,
+                view_teachers.LastName ASC, view_teachers.FirstName ASC;
 END //
 
 
@@ -1417,426 +1405,346 @@ END //
 
 DROP PROCEDURE IF EXISTS GetStudentsByStudyGroups//
 DROP PROCEDURE IF EXISTS GetStudents//
-CREATE PROCEDURE `GetStudents`  (   IN `StudyGroupID` INT  
-                                )
+CREATE PROCEDURE `GetStudents`  (IN `pGroupID` INT)
     NO SQL
 BEGIN
-    SELECT  students.ID             AS 'ID', 
-            students.LastName       AS 'Last', 
-            students.FirstName      AS 'First',  
-            students.SecondName     AS 'Second',
-            students.AccountID      AS 'AccountID',
-            grades.ID               AS 'GradeID',
-            grades.Num              AS 'GradeNum',
-            grades.Degree           AS 'Degree',    
-            study_groups.ID         AS 'GroupID',
-            study_groups.GroupNum   AS 'GroupNum'
-    FROM `students`
-    INNER JOIN `study_groups`   ON  students.StudyGroupID = study_groups.ID AND
-                                    StudyGroupID = study_groups.ID
-    INNER JOIN `grades` ON study_groups.GradeID = grades.ID
-    ORDER BY    students.LastName ASC, 
-                students.FirstName ASC, 
-                students.SecondName ASC;
+    SELECT  view_students.StudentID     AS 'ID',
+            view_students.LastName      AS 'Last',
+            view_students.FirstName     AS 'FirstName',
+            view_students.SecondName    AS 'SecondName',
+            view_students.AccountID,
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum
+        FROM `view_students`
+        WHERE view_students.GroupID = pGroupID
+        ORDER BY view_students.LastName ASC, view_students.FirstName ASC;
 END //
 
 
 
 
 DROP PROCEDURE IF EXISTS GetStudentsByFaculty//
-CREATE PROCEDURE `GetStudentsByFaculty` (   IN `FacultyID` INT  
+CREATE PROCEDURE `GetStudentsByFaculty` (   IN `pFacultyID` INT  
                                         )
     NO SQL
 BEGIN
-        SELECT  students.ID             AS 'ID', 
-                students.LastName       AS 'Last', 
-                students.FirstName      AS 'First',  
-                students.SecondName     AS 'Second',
-                students.AccountID      AS 'AccountID',
-                grades.ID               AS 'GradeID',
-                grades.Num              AS 'GradeNum',
-                study_groups.ID         AS 'GroupID',
-                study_groups.GroupNum   AS 'GroupNum',
-                grades.Degree           AS 'Degree'     
-        FROM `students`
-        INNER JOIN `study_groups`       ON  study_groups.ID = students.StudyGroupID
-        INNER JOIN `grades`             ON  study_groups.GradeID = grades.ID
-        INNER JOIN `specializations`    ON  study_groups.SpecializationID =  specializations.ID AND 
-                                            FacultyID = specializations.FacultyID
-        ORDER BY    students.LastName ASC, 
-                    students.FirstName ASC, 
-                    students.SecondName ASC;
-END //
-
+    SELECT  view_students.StudentID     AS 'ID',
+            view_students.LastName      AS 'Last',
+            view_students.FirstName     AS 'FirstName',
+            view_students.SecondName    AS 'SecondName',
+            view_students.AccountID,
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum
+    FROM `view_students`
+    WHERE view_students.FacultyID = pFacultyID
+    ORDER BY view_students.LastName ASC, view_students.FirstName ASC;
+END //
+
+
+
+-- TODO: deprecated
+-- DROP PROCEDURE IF EXISTS GetStudentsByGradeID//
+-- CREATE PROCEDURE `GetStudentsByGradeID` (   IN `GradeID` INT,
+--                                             IN `FacultyID` INT )
+--     NO SQL
+-- BEGIN 
+--     SELECT DISTINCT     students.ID                 AS 'StudentID',
+--                         students.LastName           As 'StudentLast',
+--                         students.FirstName          AS 'StudentFirst',
+--                         students.SecondName         AS 'StudentSecond',
+--                         students.AccountID          AS 'StudentAccID',
+--                         study_groups.ID             AS 'GroupID',
+--                         grades.ID                   AS 'GradeID',
+--                         grades.Num                  AS 'GroupGrade',
+--                         grades.Degree               AS 'GroupDegree',   
+--                         study_groups.GroupNum       AS 'GroupNum',
+--                         disciplines_students.Type   AS 'Type'
+--                         # where it's?
+--     FROM `students`
+--     INNER JOIN `study_groups`       ON  students.StudyGroupID = study_groups.ID AND 
+--                                         GradeID = study_groups.GradeID 
+--     INNER JOIN `specializations`    ON  study_groups.SpecializationID = specializations.ID AND 
+--                                         FacultyID = specializations.FacultyID 
+--     INNER JOIN `grades`             ON  study_groups.GradeID = grades.ID
+--     ORDER BY    students.LastName ASC, 
+--                 students.FirstName ASC, 
+--                 students.SecondName ASC;
+-- END //
 
 
 
-DROP PROCEDURE IF EXISTS GetStudentsByGradeID//
-CREATE PROCEDURE `GetStudentsByGradeID` (   IN `GradeID` INT,
-                                            IN `FacultyID` INT )
-    NO SQL
-BEGIN  
-    SELECT DISTINCT     students.ID                 AS 'StudentID',
-                        students.LastName           As 'StudentLast',
-                        students.FirstName          AS 'StudentFirst',
-                        students.SecondName         AS 'StudentSecond',
-                        students.AccountID          AS 'StudentAccID',
-                        study_groups.ID             AS 'GroupID',
-                        grades.ID                   AS 'GradeID',
-                        grades.Num                  AS 'GroupGrade',
-                        grades.Degree               AS 'GroupDegree',   
-                        study_groups.GroupNum       AS 'GroupNum',
-                        disciplines_students.Type   AS 'Type'
-    FROM `students`
-    INNER JOIN `study_groups`       ON  students.StudyGroupID = study_groups.ID AND 
-                                        GradeID = study_groups.GradeID 
-    INNER JOIN `specializations`    ON  study_groups.SpecializationID = specializations.ID AND 
-                                        FacultyID = specializations.FacultyID 
-    INNER JOIN `grades`             ON  study_groups.GradeID = grades.ID
-    ORDER BY    students.LastName ASC, 
-                students.FirstName ASC, 
-                students.SecondName ASC;
-END //
-
-
 
 DROP FUNCTION IF EXISTS CreateStudent//
-CREATE FUNCTION `CreateStudent`(    `Last`          VARCHAR(30) CHARSET utf8, 
-                                    `First`         VARCHAR(30) CHARSET utf8, 
-                                    `Second`        VARCHAR(30) CHARSET utf8, 
-                                    `GradeID`       INT, 
-                                    `GroupN`        INT, 
-                                    `FacultyID`     INT, 
-                                    `Code`          VARCHAR(40) CHARSET utf8 
-                                )   RETURNS int(11)
+CREATE FUNCTION `CreateStudent`
+    (   `pLastName` VARCHAR(30) CHARSET utf8, 
+        `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
 BEGIN 
-    DECLARE accID, StudyGroupID INT;
+    DECLARE vAccountID, vGroupID INT DEFAULT -1;
 
-    IF Code IS NULL OR Last IS NULL OR First IS NULL THEN
+    # check input params
+    IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN
         RETURN -1;
     END IF;
 
-    # find studygroup
-    SET StudyGroupID = -1;
-    SELECT study_groups.ID 
-    INTO StudyGroupID 
-    FROM `study_groups` 
-    INNER JOIN `specializations`    ON  study_groups.SpecializationID = specializations.ID AND
-                                        FacultyID = specializations.FacultyID
-    WHERE   study_groups.GradeID = GradeID  AND 
-            study_groups.ID = GroupN
-    LIMIT 1;
-    IF StudyGroupID <= 0 THEN
+    # find group
+    SELECT view_study_groups.GroupID
+        INTO vGroupID
+        FROM `view_study_groups`
+        WHERE   view_study_groups.FacultyID = pFacultyID AND
+                view_study_groups.GradeID = pGradeID AND
+                view_study_groups.GroupNum = pGroupNum
+        LIMIT 1;
+    IF vGroupID <= 0 THEN
         RETURN -1;
     END IF; 
 
-
     # try to find account with same activation code
-    SET accID = -1;
     SELECT accounts.ID 
-    INTO accID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF accID > 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID > 0 THEN
         RETURN -2;
     END IF;
 
     # create new account
     INSERT INTO `accounts` 
-            ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode )
-    VALUES  ( NULL, NULL, NULL, 1, Code);
+        (   accounts.Login , accounts.Password , accounts.EMail, 
+            accounts.UserRoleID, accounts.ActivationCode )
+        VALUES ( NULL, NULL, NULL, 1, pActivationCode);
         
-
     # get created account ID
-    SET accID = -1;
+    SET vAccountID = -1;
     SELECT accounts.ID 
-    INTO accID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF accID <= 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID <= 0 THEN
         RETURN -3;
     END IF; 
     
-
     # create student
     INSERT INTO `students` 
             (students.StudyGroupID, students.AccountID, students.LastName, students.FirstName, students.SecondName)
-    VALUES  (StudyGroupID, accID, Last, First, Second);
+    VALUES  (vGroupID, vAccountID, pLastName, pFirstName, pSecondName);
     RETURN 0;
 END //
 
 
 # TODO: ?#$@! magic
 DROP FUNCTION IF EXISTS CreateStudentEx//
-CREATE FUNCTION `CreateStudentEx`(  `Last`          VARCHAR(30) CHARSET utf8, 
-                                    `First`         VARCHAR(30) CHARSET utf8, 
-                                    `Second`        VARCHAR(30) CHARSET utf8, 
-                                    `GradeNum`      INT,
-                                    `groupNum`      INT,
-                                    `Degree`        VARCHAR(20) CHARSET utf8, 
-                                    `SpecName`      VARCHAR(50) CHARSET utf8, 
-                                    `FacultyID`     INT, 
-                                    `Code`          VARCHAR(40) CHARSET utf8 
-                                )   RETURNS int(11)
+CREATE FUNCTION `CreateStudentEx`
+    (   `pLastName` VARCHAR(30) CHARSET utf8, 
+        `pFirstName` VARCHAR(30) CHARSET utf8, 
+        `pSecondName` VARCHAR(30) CHARSET utf8, 
+        `pGradeNum` INT, `pGroupNum` INT,
+        `pDegree` VARCHAR(20) CHARSET utf8, 
+        `pSpecName` VARCHAR(50) CHARSET utf8, 
+        `pFacultyID` INT,
+        `pAtivationCode` VARCHAR(40) CHARSET utf8 
+    )   RETURNS int(11)
     NO SQL
 BEGIN 
-    DECLARE curID, gradeID, specID, SG_ID INT;
+    DECLARE vAccountID, vGradeID, vSpecID, vGroupID INT DEFAULT -1;
 
-    IF Code IS NULL OR Last IS NULL OR First IS NULL THEN
+    IF pActivationCode IS NULL OR pLastName IS NULL OR pFirstName IS NULL THEN
         RETURN -1;
     END IF;
 
-    SET gradeID = -1;
+    # try to find grade
     SELECT grades.ID 
-    INTO gradeID
-    FROM `grades`
-    WHERE   grades.Num = GradeNum AND
-            grades.Degree = Degree
-    LIMIT 1;
-    IF gradeID <= 0 THEN
-        INSERT INTO `grades`
-                (grades.Num, grades.Degree)
-        VALUES  (GradeNum, Degree);
-
-        SET gradeID = -1;
-        SELECT grades.ID 
-        INTO gradeID
+        INTO vGradeID
         FROM `grades`
-        WHERE   grades.Num = GradeNum AND
-                grades.Degree = Degree
+        WHERE   grades.Num = pGradeNum AND
+                grades.Degree = pDegree
         LIMIT 1;
+
+    # such grade doesn't exist
+    IF vGradeID <= 0 THEN
+        # insert new grade with pGradeNum and pDegree
+        INSERT INTO `grades`
+            (grades.Num, grades.Degree)
+            VALUES (pGradeNum, pDegree);
+
+        # find inserted grade
+        SET vGradeID = LAST_INSERT_ID();
     END IF;
 
+    # try to find group
+    SELECT view_study_groups.GroupID
+        INTO vGroupID
+        FROM `view_study_groups`
+        WHERE   view_study_groups.FacultyID = pFacultyID AND 
+            view_study_groups.GroupNum = pGroupNum AND
+            view_study_groups.GradeID = vGradeID
+        LIMIT 1; 
 
-    SET SG_ID = -1;
-    SELECT study_groups.ID 
-    INTO SG_ID
-    FROM `study_groups`
-    INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID
-    WHERE   study_groups.GroupNum = groupNum AND
-            study_groups.GradeID = gradeID AND
-            specializations.FacultyID = FacultyID 
-    LIMIT 1;
-    IF SG_ID <= 0 THEN
-        SET specID = -1;
-        SELECT specializations.ID
-        INTO specID
-        FROM `specializations`
-        WHERE   (   specializations.Name = SpecName OR 
-                    ( SpecName = '' AND specializations.Name IS NULL ) 
-                )   AND
-                specializations.FacultyID = FacultyID
-        LIMIT 1;
-        IF specID <= 0 THEN
-            INSERT INTO `specializations`
-                    (specializations.Name, specializations.Abbr, specializations.FacultyID )
-            VALUES  (SpecName, NULL, FacultyID);
+    # group not found
+    IF vGroupID <= 0 THEN
 
-            SET specID = -1;
-            SELECT specializations.ID
-            INTO specID
+        # try to find specialization
+        SELECT specializations.ID
+            INTO vSpecID
             FROM `specializations`
-            WHERE   specializations.Name = SpecName AND
-                    specializations.FacultyID = FacultyID
+            WHERE   (specializations.Name = pSpecName OR
+                        (pSpecName = '' AND specializations.Name IS NULL)) AND
+                    specializations.FacultyID = pFacultyID
             LIMIT 1;
+
+        # specialization not found
+        IF vSpecID <= 0 THEN
+            # create new specialization
+            INSERT INTO `specializations`
+                (specializations.Name, specializations.Abbr, specializations.FacultyID )
+                VALUES  (pSpecName, NULL, pFacultyID);
+
+            SET vSpecID = LAST_INSERT_ID();
         END IF;
 
+        # create new group
         INSERT INTO `study_groups`
-                (study_groups.GradeID, study_groups.GroupNum, study_groups.SpecializationID)
-        VALUES  (gradeID, groupNum, specID);
+            (study_groups.GradeID, study_groups.GroupNum, study_groups.SpecializationID)
+            VALUES  (vGradeID, pGroupNum, vSpecID);
 
-        SET SG_ID = -1;
-        SELECT study_groups.ID 
-        INTO SG_ID
-        FROM `study_groups`
-        INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID
-        WHERE   study_groups.GroupNum = groupNum AND
-                study_groups.GradeID = gradeID AND
-                specializations.FacultyID = FacultyID 
-        LIMIT 1;
-        IF SG_ID <= 0 THEN
-            RETURN -1;
-        END IF;
+        SET vGroupID = LAST_INSERT_ID();
     END IF;
 
-    SET curID = -1;
+    # check accounts with such activation code
     SELECT accounts.ID 
-    INTO curID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF curID > 0 THEN
+        INTO vAccountID
+        FROM `accounts`
+        WHERE accounts.ActivationCode = pActivationCode
+        LIMIT 1;
+    IF vAccountID > 0 THEN
         RETURN -2;
     END IF;
 
     # TODO: user roles
+    # create account
     INSERT INTO `accounts` 
-            ( accounts.Login , accounts.Password , accounts.EMail, accounts.UserRoleID, accounts.ActivationCode )
-    VALUES  ( NULL, NULL, NULL, 1, Code);
-        
-    SET curID = -1;
-    SELECT accounts.ID 
-    INTO curID
-    FROM `accounts`
-    WHERE accounts.ActivationCode = Code
-    LIMIT 1;
-    IF curID <= 0 THEN
+        ( accounts.Login , accounts.Password , accounts.EMail, 
+            accounts.UserRoleID, accounts.ActivationCode )
+        VALUES  ( NULL, NULL, NULL, 1, pActivationCode);
+
+    SET vAccountID = LAST_INSERT_ID();
+    IF vAccountID <= 0 THEN
         RETURN -3;
     END IF; 
     
+    # create student
     INSERT INTO `students` 
-            (students.StudyGroupID, students.AccountID, students.LastName, students.FirstName, students.SecondName)
-    VALUES  (SG_ID, curID, Last, First, Second);
+        (students.StudyGroupID, students.AccountID, 
+            students.LastName, students.FirstName, students.SecondName)
+        VALUES (vGroupID, vAccountID, pLastName, pFirstName, pSecondName);
     RETURN 0;
 END //
 
 
 
-# DROP PROCEDURE IF EXISTS SearchStudents//
-# CREATE PROCEDURE `SearchStudents`    (   IN `GradeID` INT, 
-#                                      IN `GroupN` INT,
-#                                      IN `FacultyID` INT,
-#                                      IN `Name` VARCHAR(100) CHARSET utf8
-#                                  )
-#     NO SQL
-# BEGIN  
-#  SELECT  students.ID             AS 'ID',
-#          students.LastName       AS 'Last',  
-#          students.FirstName      AS 'First',
-#          students.SecondName     AS 'Second',
-#          grades.ID               AS 'GradeID',
-#          grades.Num              AS 'GradeNum',
-#          grades.Degree           AS 'Degree',
-#          study_groups.ID         AS 'GroupID',
-#          study_groups.GroupNum   AS 'GroupNum'
-#  FROM `students`
-#  INNER JOIN `study_groups`       ON  students.StudyGroupID = study_groups.ID AND
-#                                      GradeID = study_groups.GradeID AND
-#                                      ( GroupN = 0  OR GroupN = study_groups.GroupNum )
-#  INNER JOIN `specializations`    ON  study_groups.SpecializationID = specializations.ID
-#  INNER JOIN `grades`             ON  study_groups.GradeID = grades.ID 
-#  WHERE   FacultyID = specializations.FacultyID AND
-#          CONCAT(students.LastName, students.FirstName, students.SecondName) LIKE CONCAT("%",Name,"%")
-#  ORDER BY grades.ID ASC, study_groups.GroupNum ASC;
-# END //
-
 
 
+# found students, that doesn't in discipline general group and not attached 
 DROP PROCEDURE IF EXISTS SearchStudents//
-CREATE PROCEDURE `SearchStudents`   (   IN `GradeID` INT, 
-                                        IN `StudyGroupID` INT,
-                                        IN `FacultyID` INT,
-                                        IN `Name` VARCHAR(100) CHARSET utf8,
-                                        IN `DisciplineID` INT
-                                    )
+CREATE PROCEDURE `SearchStudents`   
+    (   IN `pGradeID` INT, IN `pGroupID` INT, IN `pFacultyID` INT,
+        IN `pFullName` VARCHAR(100) CHARSET utf8, 
+        IN `pDisciplineID` INT)
     NO SQL
-BEGIN  
-    SELECT  students.ID             AS 'ID',
-            students.LastName       AS 'Last',  
-            students.FirstName      AS 'First',
-            students.SecondName     AS 'Second',
-            grades.ID               AS 'GradeID',
-            grades.Num              AS 'GradeNum',
-            grades.Degree           AS 'Degree',
-            study_groups.ID         AS 'GroupID',
-            study_groups.GroupNum   AS 'GroupNum'
-    FROM `students`
-    INNER JOIN `study_groups`           ON  students.StudyGroupID = study_groups.ID AND
-                                            GradeID = study_groups.GradeID AND
-                                            ( StudyGroupID = 0  OR StudyGroupID = study_groups.ID )
-    INNER JOIN `specializations`        ON  study_groups.SpecializationID = specializations.ID AND
-                                            FacultyID = specializations.FacultyID
-    INNER JOIN `grades`                 ON  study_groups.GradeID = grades.ID 
-    LEFT JOIN   `disciplines_groups`    ON  study_groups.ID = disciplines_groups.StudyGroupID AND
-                                            DisciplineID = disciplines_groups.DisciplineID
-    WHERE   CONCAT(students.LastName, students.FirstName, students.SecondName) LIKE CONCAT("%",Name,"%") AND
-            NOT InternalIsStudentAttached(students.ID, DisciplineID) AND
-            disciplines_groups.ID IS NULL
-    ORDER BY    grades.ID ASC, 
-                study_groups.GroupNum ASC;
-END //
-
-
-
+BEGIN
+    SELECT  view_students.StudentID     AS 'ID',
+            view_students.LastName      AS 'Last',  
+            view_students.FirstName     AS 'First',
+            view_students.SecondName    AS 'Second',
+            view_students.GradeID,
+            view_students.GradeNum,
+            view_students.Degree,
+            view_students.GroupID,
+            view_students.GroupNum
+        FROM `view_students`
+        LEFT JOIN `disciplines_students` ON disciplines_students.StudentID = view_students.StudentID AND
+                                            disciplines_students.DisciplineID = pDisciplineID
+        LEFT JOIN `disciplines_groups` ON   disciplines_groups.StudyGroupID = view_students.GroupID AND
+                                            disciplines_groups.DisciplineID = pDisciplineID
+        WHERE   view_students.FacultyID = pFacultyID AND
+                view_students.GradeID = pGradeID AND
+                (view_students.GroupID = pGroupID OR pGroupID = 0) AND
+                CONCAT(view_students.LastName, view_students.FirstName, view_students.SecondName) 
+                    LIKE CONCAT("%", pFullName,"%") AND
+                disciplines_groups.ID IS NULL AND
+                (disciplines_students.Type IS NULL OR disciplines_students.Type != 'attach')
+        ORDER BY    view_students.GradeID ASC, 
+                    view_students.GroupID ASC;
+END //
+
+
+# TODO: --TeacherID param
+# search students, that in main group or attached
 DROP PROCEDURE IF EXISTS GetStudentsForDiscipline//
-CREATE PROCEDURE `GetStudentsForDiscipline` (   IN `TeacherID` INT,
-                                                IN `DisciplineID` INT 
-                                            )
+CREATE PROCEDURE `GetStudentsForDiscipline` 
+    (   IN `TeacherID` INT, IN `pDisciplineID` INT)
     NO SQL
-BEGIN                
-    IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) 
-    THEN
-        SELECT  NULL AS 'ID'
-        LIMIT 0;
-    
-    ELSE
-        SELECT DISTINCT     students.ID                 AS 'ID',
-                            students.LastName           AS 'Last',
-                            students.FirstName          AS 'First',
-                            students.SecondName         AS 'Second',
-                            grades.ID                   AS 'GradeID',
-                            grades.Num                  AS 'GradeNum',
-                            grades.Degree               AS 'Degree',
-                            study_groups.ID             AS 'GroupID',
-                            study_groups.GroupNum       AS 'GroupNum',
-                            disciplines_students.Type   AS 'Type'
-        FROM `students`
-        INNER JOIN `study_groups`           ON  students.StudyGroupID = study_groups.ID
-        INNER JOIN `grades`                 ON  grades.ID = study_groups.GradeID
-        LEFT JOIN `disciplines_students`    ON  DisciplineID = disciplines_students.DisciplineID AND
-                                                students.ID = disciplines_students.StudentID
-        LEFT JOIN `disciplines_groups`      ON  DisciplineID = disciplines_groups.DisciplineID AND
-                                                study_groups.ID = disciplines_groups.StudyGroupID
-        INNER JOIN `disciplines`            ON  DisciplineID = disciplines.ID
-        WHERE   disciplines_groups.ID IS NOT NULL OR
-                disciplines_students.ID IS NOT NULL
-        ORDER BY    grades.ID = disciplines.GradeID DESC,
-                    grades.ID ASC, 
-                    study_groups.GroupNum ASC, 
-                    students.LastName ASC, 
-                    students.FirstName ASC, 
-                    students.SecondName ASC;
-    END IF;
+BEGIN  
+    SELECT  view_disciplines_students.StudentID     AS 'ID',
+            view_disciplines_students.LastName      AS 'Last',  
+            view_disciplines_students.FirstName     AS 'First',
+            view_disciplines_students.SecondName    AS 'Second',
+            view_disciplines_students.GradeID,
+            view_disciplines_students.GradeNum,
+            view_disciplines_students.Degree,
+            view_disciplines_students.GroupID,
+            view_disciplines_students.GroupNum,
+            view_disciplines_students.AttachType    AS 'Type'
+        FROM `view_disciplines_students`
+        WHERE view_disciplines_students.DisciplineID = pDisciplineID
+        ORDER BY    (view_disciplines_students.AttachType IS NULL OR 
+                        view_disciplines_students.AttachType = 'detach') DESC,
+                    view_disciplines_students.GradeID ASC, 
+                    view_disciplines_students.GroupNum ASC, 
+                    view_disciplines_students.LastName ASC, 
+                    view_disciplines_students.FirstName ASC;
 END //
 
 
-
+# TODO: --TeacherID param
+# search students, that in main group or attached
 DROP PROCEDURE IF EXISTS GetStudentsForRating//
-CREATE PROCEDURE `GetStudentsForRating`     (   IN `TeacherID` INT,
-                                                IN `DisciplineID` INT 
-                                            )
+CREATE PROCEDURE `GetStudentsForRating`     
+    (   IN `TeacherID` INT, IN `pDisciplineID` INT)
     NO SQL
-BEGIN                
-    IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) 
-    THEN
-        SELECT  NULL AS 'ID'
-        LIMIT 0;
-    ELSE 
-        SELECT DISTINCT     students.ID             AS 'ID',
-                            students.LastName       AS 'Last',
-                            students.FirstName      AS 'First',
-                            students.SecondName     AS 'Second',
-                            grades.ID               AS 'GradeID',
-                            grades.Num              AS 'GradeNum',
-                            grades.Degree           AS 'Degree',
-                            study_groups.ID         AS 'GroupID',
-                            study_groups.GroupNum   AS 'GroupNum',
-                            (disciplines_students.Type IS NOT NULL AND disciplines_students.Type = 'attach') AS 'isAttached'
-        FROM `students`
-        INNER JOIN `study_groups`           ON students.StudyGroupID = study_groups.ID
-        INNER JOIN `grades`                 ON grades.ID = study_groups.GradeID
-        LEFT JOIN   `disciplines_students`  ON  DisciplineID = disciplines_students.DisciplineID AND
-                                                students.ID = disciplines_students.StudentID
-        WHERE   InternalIsStudentAttached(students.ID, DisciplineID)
-        ORDER BY    grades.ID ASC, 
-                    study_groups.GroupNum ASC, 
-                    students.LastName ASC, 
-                    students.FirstName ASC, 
-                    students.SecondName ASC;
-    END IF;
+BEGIN   
+    SELECT  view_disciplines_students.StudentID     AS 'ID',
+            view_disciplines_students.LastName      AS 'Last',  
+            view_disciplines_students.FirstName     AS 'First',
+            view_disciplines_students.SecondName    AS 'Second',
+            view_disciplines_students.GradeID,
+            view_disciplines_students.GradeNum,
+            view_disciplines_students.Degree,
+            view_disciplines_students.GroupID,
+            view_disciplines_students.GroupNum,
+            (view_disciplines_students.AttachType IS NOT NULL AND
+                view_disciplines_students.AttachType = 'attach') AS 'isAttached'
+        FROM `view_disciplines_students`
+        WHERE   view_disciplines_students.DisciplineID = pDisciplineID AND
+                (view_disciplines_students.AttachType IS NULL OR 
+                        view_disciplines_students.AttachType = 'attach')
+        ORDER BY    view_disciplines_students.GradeID ASC, 
+                    view_disciplines_students.GroupNum ASC, 
+                    view_disciplines_students.LastName ASC, 
+                    view_disciplines_students.FirstName ASC;  
 END //
 
 
@@ -1851,88 +1759,88 @@ END //
 
 
 DROP PROCEDURE IF EXISTS GetDisciplines//
-CREATE PROCEDURE `GetDisciplines` (  IN `FacultyID` INT )
+CREATE PROCEDURE `GetDisciplines` (  IN `pFacultyID` INT )
     NO SQL
 BEGIN
-    SELECT  disciplines.ID          AS 'ID', 
-            subjects.ID             AS 'SubjectID', 
-            subjects.Name           AS 'SubjectName', 
-            disciplines.ExamType    AS 'ExamType',
-            departments.Name        AS 'DepName',
-            InternalIsMapCreated(disciplines.ID)   AS 'isMapCreated'
-    FROM `disciplines`
-    INNER JOIN  `subjects`    ON  disciplines.SubjectID = subjects.ID 
-    INNER JOIN  `teachers`    ON  disciplines.AuthorID = teachers.ID
-    INNER JOIN  `departments`   ON  teachers.DepartmentID = departments.ID 
-    WHERE  @CurrentSemesterID = disciplines.SemesterID AND
-        disciplines.FacultyID = FacultyID
-    ORDER BY departments.Name ASC;   
+    SELECT  view_disciplines.DisciplineID   AS 'ID',
+            view_disciplines.SubjectID,
+            view_disciplines.SubjectName,
+            view_disciplines.ExamType,
+            (view_disciplines_results.DisciplineRateMax = 100)
+        FROM `view_disciplines`
+        INNER JOIN `view_disciplines_results` 
+            ON view_disciplines_results.DisciplineID = view_disciplines.DisciplineID
+        WHERE view_disciplines.SemesterID = @CurrentSemesterID AND
+            view_disciplines.FacultyID = pFacultyID
+        ORDER BY view_disciplines.DepName ASC;   
 END //
 
 
-# TODO bad query
+
+# variant 2
 DROP PROCEDURE IF EXISTS GetDisciplinesForTeacher//
-CREATE PROCEDURE `GetDisciplinesForTeacher`(IN `TeacherID` INT)
+CREATE PROCEDURE `GetDisciplinesForTeacher`(IN `pTeacherID` INT)
     NO SQL
 BEGIN  
-    SELECT DISTINCT disciplines.ID                      AS 'ID',
-                    disciplines.ExamType                AS 'ExamType',
-                    disciplines.GradeID                 AS 'GradeID',
-                    grades.Num                          AS 'GradeNum',
-                    grades.Degree                       AS 'Degree',
-                    study_groups.ID                     AS 'GroupID', 
-                    study_groups.GroupNum               AS 'GroupNum', 
-                    study_groups.Name                   AS 'GroupName',
-                    subjects.ID                         AS 'SubjectID',
-                    subjects.Name                       AS 'SubjectName',
-                    (TeacherID = disciplines.AuthorID)      AS 'isAuthor',
-                    InternalIsMapCreated(disciplines.ID)    AS 'isMapCreated',
-                    disciplines.isLocked                    AS 'isLocked'
-    FROM `disciplines_groups`
-    RIGHT JOIN `disciplines`            ON  disciplines_groups.DisciplineID = disciplines.ID OR
-                                            disciplines_groups.DisciplineID IS NULL 
-    INNER JOIN  `grades`                ON  grades.ID = disciplines.GradeID
-    INNER JOIN `disciplines_teachers`   ON  disciplines.ID = disciplines_teachers.DisciplineID AND 
-                                            TeacherID = disciplines_teachers.TeacherID 
-    INNER JOIN `subjects`               ON  subjects.ID = disciplines.SubjectID
-    LEFT JOIN  `study_groups`           ON  study_groups.ID = disciplines_groups.StudyGroupID
-    WHERE   disciplines.SemesterID = @CurrentSemesterID
-    ORDER BY    grades.ID               ASC, 
-                subjects.Name           ASC,
-                disciplines.ID          ASC,
-                study_groups.GroupNum   ASC;
+    SELECT DISTINCT view_disciplines.DisciplineID       AS 'ID',
+                    view_disciplines.ExamType,
+                    view_disciplines.GradeID,
+                    view_disciplines.GradeNum,
+                    view_disciplines.Degree,
+                    view_study_groups.GroupID, 
+                    view_study_groups.GroupNum, 
+                    view_study_groups.GroupName,
+                    view_disciplines.SubjectID,
+                    view_disciplines.SubjectName,
+                    (pTeacherID = view_disciplines.AuthorID)   AS 'isAuthor',
+                    (view_disciplines_results.DisciplineRateMax = 100)    AS 'isMapCreated',
+                    view_disciplines.isLocked                AS 'isLocked'
+    FROM `disciplines_teachers`
+    LEFT JOIN `disciplines_groups` ON disciplines_groups.DisciplineID = disciplines_teachers.DisciplineID
+    LEFT JOIN `view_study_groups` ON view_study_groups.GroupID = disciplines_groups.StudyGroupID
+    INNER JOIN `view_disciplines` ON disciplines_teachers.DisciplineID = view_disciplines.DisciplineID
+    LEFT JOIN `view_disciplines_results` ON view_disciplines_results.DisciplineID = view_disciplines.DisciplineID
+    WHERE disciplines_teachers.TeacherID = pTeacherID AND
+            view_disciplines.SemesterID = @CurrentSemesterID
+    ORDER BY    view_disciplines.GradeID ASC, 
+                view_disciplines.SubjectName ASC,
+                view_disciplines.DisciplineID ASC,
+                view_study_groups.GroupNum ASC;
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetDisciplinesForStudent//
-CREATE PROCEDURE `GetDisciplinesForStudent`(IN `StudentID` INT)
+CREATE PROCEDURE `GetDisciplinesForStudent`(IN `pStudentID` INT)
     NO SQL
 BEGIN  
-    SELECT              disciplines.ID          AS 'ID', 
-                        subjects.ID             AS 'SubjectID', 
-                        subjects.Name           AS 'SubjectName', 
-                        disciplines.ExamType    AS 'ExamType',
-                        teachers.LastName       AS 'Last', 
-                        teachers.FirstName      AS 'First',
-                        teachers.SecondName     AS 'Second', 
-                        GetRateForDisc(StudentID, disciplines.ID )      AS 'Rate', 
-                        GetMaxRateForDisc(disciplines.ID )              AS 'MaxCurrentRate',
-                        InternalIsMapCreated(disciplines.ID)            AS 'isMapCreated'
-    FROM `disciplines`
-    INNER JOIN  `subjects`          ON  disciplines.SubjectID = subjects.ID 
-    INNER JOIN  `teachers`          ON  disciplines.AuthorID = teachers.ID                              
-    WHERE   @CurrentSemesterID = disciplines.SemesterID AND 
-            InternalIsStudentAttached(StudentID, disciplines.ID)
-    ORDER BY disciplines.ExamType ASC, Rate DESC;    
+    SELECT  view_disciplines.DisciplineID           AS 'ID', 
+            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_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
+                                            view_rating_result.DisciplineID = view_disciplines_results.DisciplineID
+        LEFT JOIN `view_disciplines_teachers` ON view_disciplines_teachers.DisciplineID = view_disciplines.DisciplineID 
+        WHERE   view_disciplines.SemesterID = @CurrentSemesterID AND 
+                view_disciplines_students.StudentID = pStudentID
+        ORDER BY disciplines.ExamType ASC, view_disciplines.DisciplineID ASC;
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetMapForStudent//
-CREATE PROCEDURE `GetMapForStudent` (   IN `StudentID` INT, 
-                                        IN `DisciplineID` INT
-                                    )
+CREATE PROCEDURE `GetMapForStudent` 
+    (   IN `pStudentID` INT, IN `pDisciplineID` INT)
     NO SQL
 BEGIN  
     SELECT  modules.ID              AS 'ModuleID', 
@@ -1947,9 +1855,9 @@ BEGIN
             modules.Type            AS 'ModuleType'
     FROM `submodules`
     INNER JOIN `modules`        ON  submodules.ModuleID = modules.ID AND 
-                                    DisciplineID = modules.DisciplineID
+                                    pDisciplineID = modules.DisciplineID
     LEFT JOIN `rating_table`    ON  submodules.ID = rating_table.SubmoduleID AND 
-                                    StudentID = rating_table.StudentID 
+                                    pStudentID = rating_table.StudentID 
 
 
     WHERE   modules.Type != 2 OR
@@ -1958,7 +1866,7 @@ BEGIN
                     FROM `submodules`
                     INNER JOIN `rating_table` ON rating_table.SubModuleID = submodules.ID
                     WHERE   submodules.ModuleID = modules.ID AND
-                            rating_table.StudentID = StudentID
+                            rating_table.StudentID = pStudentID
                     ORDER BY submodules.OrderNum DESC
                     LIMIT 1)
                 )  OR
@@ -2003,7 +1911,7 @@ CREATE PROCEDURE `GetMapForDiscipline`  (   IN `TeacherID`      INT,
                                         )
     NO SQL
 BEGIN  
-    IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) 
+    IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) 
     THEN
         SELECT  NULL AS 'ID'
         LIMIT 0;  
@@ -2038,7 +1946,7 @@ CREATE PROCEDURE `GetMapForDisciplineExam`      (   IN `TeacherID`      INT,
                                                 )
     NO SQL
 BEGIN  
-    IF NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) 
+    IF NOT InternalIsTeacherBinded(TeacherID, DisciplineID) 
     THEN
         SELECT  NULL AS 'ID'
         LIMIT 0;  
@@ -2564,7 +2472,7 @@ BEGIN
     END IF;
 
 # 2. check if BindingTeacher has rights to access this discipline
-    IF InternalIsTeacherBindeded(BindingTeacherID,DisciplineID)
+    IF InternalIsTeacherBinded(BindingTeacherID,DisciplineID)
     THEN
         RETURN 1;
     END IF;
@@ -2772,7 +2680,7 @@ CREATE FUNCTION `CountRatings`  (   `TeacherID` INT,
 BEGIN  
     DECLARE res boolean; 
 
-    IF  NOT InternalIsTeacherBindeded(TeacherID, DisciplineID) THEN
+    IF  NOT InternalIsTeacherBinded(TeacherID, DisciplineID) THEN
         RETURN -1;
     END IF;
 
@@ -4088,7 +3996,7 @@ CREATE PROCEDURE `GetFinalFormInfo`
 (IN `pDisciplineID` INT, IN `pGroupID` INT)
     NO SQL
 BEGIN 
-    DECLARE curSem INT;
+    DECLARE vCurSemester INT;
     SET vCurSemester = @CurrentSemesterID;
 
     SELECT  study_groups.GroupNum AS 'GroupNum', 
diff --git a/db/Views.sql b/db/Views.sql
index e6bb6a2ff2c5090520def16d411a7a606509e397..5b7e22579d202b7eb35bd9036aa256fad6ba4201 100644
--- a/db/Views.sql
+++ b/db/Views.sql
@@ -1,3 +1,6 @@
+
+
+
 CREATE OR REPLACE VIEW `view_study_groups` AS 
     SELECT  study_groups.ID         AS 'GroupID',
             study_groups.GroupNum   AS 'GroupNum',
@@ -17,9 +20,6 @@ CREATE OR REPLACE VIEW `view_study_groups` AS
     INNER JOIN `faculties` ON faculties.ID = specializations.FacultyID; 
 
 
-
-
-
 CREATE OR REPLACE VIEW `view_teachers` AS 
     SELECT  teachers.ID         AS 'TeacherID', 
             teachers.LastName, 
@@ -75,6 +75,16 @@ CREATE OR REPLACE VIEW `view_disciplines` AS
     INNER JOIN `grades` ON grades.ID = disciplines.GradeID;
 
 
+CREATE OR REPLACE VIEW `view_disciplines_results` AS
+    SELECT  modules.DisciplineID,
+            SUM(submodules.MaxRate) AS 'DisciplineRateMax',
+            SUM(submodules.MaxRate*submodules.isUsed) AS 'DisciplineRateCur'
+    FROM `submodules`
+    INNER JOIN `modules` ON modules.ID = submodules.ModuleID
+    WHERE (modules.Type = 'regular') OR (modules.Type = 'exam' AND submodules.OrderNum = 1)
+    GROUP BY modules.DisciplineID;
+
+
 CREATE OR REPLACE VIEW `view_disciplines_teachers` AS 
     SELECT  view_disciplines.DisciplineID,
             view_teachers.*,
@@ -85,13 +95,14 @@ CREATE OR REPLACE VIEW `view_disciplines_teachers` AS
 
 
 CREATE OR REPLACE VIEW `view_disciplines_students` AS 
-    SELECT  disciplines_students.DisciplineID,  
+    SELECT  disciplines_students.DisciplineID,
+            disciplines_students.Type AS 'AttachType',
             view_students.*
     FROM `disciplines_students`
     INNER JOIN `view_students` ON    view_students.StudentID = disciplines_students.StudentID 
-    WHERE disciplines_students.Type = 'attach'
     UNION DISTINCT
     SELECT  disciplines_groups.DisciplineID,
+            NULL AS 'AttachType',
             view_students.*
     FROM `disciplines_groups`
     LEFT JOIN `view_students` ON view_students.GroupID = disciplines_groups.StudyGroupID
@@ -145,3 +156,4 @@ CREATE OR REPLACE VIEW `view_rating_result` AS
     WHERE view_rating.Rate IS NOT NULL
     GROUP BY view_rating.StudentID, view_rating.DisciplineID;
 
+