diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index ca648782a4011b70123dc5eaa0f970669cb9c32d..c21fbd1516d5ebbb8fa161e08fcb7d9ddb07ed8b 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -7,6 +7,10 @@ DROP FUNCTION IF EXISTS SetHashKey//
 DROP PROCEDURE IF EXISTS GetCurSemesterID//
 DROP PROCEDURE IF EXISTS GetHashKey//
 
+drop function if exists InternalIsTeacherBinded//
+DROP FUNCTION IF EXISTS GetSemesterID//
+DROP PROCEDURE IF EXISTS GetStudyGroupsForDisciplineFull//
+
 # -------------------------------------------------------------------------------------------
 # Label: abbreviations
 # -------------------------------------------------------------------------------------------
@@ -36,33 +40,19 @@ CREATE FUNCTION `InternalIsStudentAttached`
     (`pStudentID` INT, `pDisciplineID` INT) RETURNS BOOLEAN
     NO SQL
 BEGIN 
-    DECLARE vChecker boolean;
-
-    # 1. student in main group and not detached OR
-    # 2. student attached
-    SELECT  (   (   disciplines_students.Type IS NOT NULL AND disciplines_students.Type = 'attach' ) OR
-                (   disciplines_groups.GroupID IS NOT NULL AND
-                    disciplines_groups.GroupID = study_groups.ID AND
-                    ( disciplines_students.Type IS NULL OR disciplines_students.Type != 'detach' )
-                )
-            )
-        INTO vChecker
-        FROM `students`
-        INNER JOIN  `study_groups`          ON  students.GroupID = study_groups.ID
-        LEFT JOIN   `disciplines_students`  ON  disciplines_students.StudentID = pStudentID AND
-                                                disciplines_students.DisciplineID = pDisciplineID
-        LEFT JOIN   `disciplines_groups`    ON  study_groups.ID = disciplines_groups.GroupID AND
-                                                disciplines_groups.DisciplineID = pDisciplineID
-        WHERE students.ID = pStudentID
-        LIMIT 1;
-
-    RETURN (vChecker IS NOT NULL AND vChecker);
+    RETURN EXISTS(
+        SELECT * FROM `view_disciplines_students`
+        WHERE view_disciplines_students.StudentID = pStudentID AND
+              view_disciplines_students.DisciplineID = pDisciplineID AND
+              (view_disciplines_students.AttachType IS NULL OR
+                  view_disciplines_students.AttachType = 'attach')
+        );
 END //
 
 
 # check, that teacher teach this course
-drop function if exists InternalIsTeacherBinded//
-CREATE FUNCTION `InternalIsTeacherBinded`
+drop function if exists InternalIsTeacherBounded//
+CREATE FUNCTION `InternalIsTeacherBounded`
     (   `pTeacherID` INT, `pDisciplineID` INT) RETURNS BOOLEAN
     NO SQL
 BEGIN  
@@ -247,24 +237,18 @@ END //
 
 
 
+
 # check, if any module is created
 DROP FUNCTION IF EXISTS InternalIsMapCreated//
 CREATE FUNCTION `InternalIsMapCreated`
     (   `pDisciplineID` INT) RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vRes INT DEFAULT -1;
-
-    SELECT SUM(submodules.MaxRate) 
-    INTO vRes
-    FROM `modules`
-    LEFT JOIN `submodules` ON   submodules.ModuleID = modules.ID
-    WHERE   modules.DisciplineID = pDisciplineID AND
-            (modules.Type = 'regular' OR ( modules.Type = 'exam' AND submodules.OrderNum = 1))
-    LIMIT 1;
-
-
-    RETURN (vRes = 100);
+    SELECT EXISTS (
+        SELECT * FROM `view_disciplines_results`
+        WHERE view_disciplines_results.DisciplineID = pDisciplineID AND
+              view_disciplines_results.DisciplineRateMax = 100
+    );
 END //
 
 
@@ -279,7 +263,7 @@ BEGIN
         SET accounts.Notification = 1
         WHERE accounts.ID = AccountID
         LIMIT 1;
-    RETURN 0;
+    RETURN ROW_COUNT()-1;
 END //
 
 
@@ -337,11 +321,10 @@ DROP FUNCTION IF EXISTS GetBitmaskByPagename//
 CREATE FUNCTION `GetBitmaskByPagename` (`pPagename` TEXT CHARSET utf8) RETURNS int(11)
     NO SQL
 BEGIN
-    RETURN( SELECT page_access.Bitmask
+    RETURN (SELECT page_access.Bitmask
                 FROM `page_access`
                 WHERE page_access.Pagename = pPagename
-                LIMIT 1
-        );
+                LIMIT 1);
 END //
 
 
@@ -354,31 +337,14 @@ END //
 
 
 DROP FUNCTION IF EXISTS SetSemesterID//
-CREATE FUNCTION `SetSemesterID` (`SemesterID` INT) RETURNS int(11)
+CREATE FUNCTION `SetSemesterID` (`pSemesterID` INT) RETURNS int(11)
     NO SQL
 BEGIN
-    SET @CurrentSemesterID = SemesterID;
+    SET @CurrentSemesterID = pSemesterID;
     RETURN 0;
 END //
 
 
-
-
-
-DROP FUNCTION IF EXISTS GetSemesterID//
-CREATE FUNCTION `GetSemesterID` (`pYear` INT, `pNum` INT) RETURNS int(11)
-    NO SQL
-BEGIN
-    RETURN( SELECT semesters.ID 
-                FROM `semesters` 
-                WHERE semesters.Year = pYear AND semesters.Num = pNum 
-                LIMIT 1
-        );
-END //
-
-
-
-
 DROP PROCEDURE IF EXISTS GetSemesterInfo//
 CREATE PROCEDURE `GetSemesterInfo` (IN `pSemesterID` INT)
     NO SQL
@@ -520,7 +486,7 @@ CREATE PROCEDURE `GetStudyGroups`
     (IN `pGradeID` INT, IN `pFacultyID` INT)
     NO SQL
 BEGIN
-    SELECT  view_groups.GroupID   AS 'ID',
+    SELECT  view_groups.GroupID AS 'ID',
             view_groups.GroupNum,
             view_groups.SpecName,
             view_groups.SpecAbbr 
@@ -531,12 +497,12 @@ BEGIN
 END //
 
 
-# get all study groups, that takes this course
+# get all general study groups, that takes this course
 DROP PROCEDURE IF EXISTS GetStudyGroupsForDiscipline//
 CREATE PROCEDURE `GetStudyGroupsForDiscipline` (IN `pDisciplineID` INT)
     NO SQL
 BEGIN
-    SELECT  view_groups.GroupID   AS 'ID',
+    SELECT  view_groups.GroupID AS 'ID',
             view_groups.GroupNum,
             view_groups.GradeID,
             view_groups.GradeNum,
@@ -550,28 +516,6 @@ BEGIN
         ORDER BY view_groups.GradeID ASC, view_groups.GroupID ASC;
 END //
 
-# get all study groups, that takes this course, including groups with attached students
-DROP PROCEDURE IF EXISTS GetStudyGroupsForDisciplineFull//
-CREATE PROCEDURE `GetStudyGroupsForDisciplineFull` (IN `pDisciplineID` INT)
-    NO SQL
-BEGIN
-    SELECT DISTINCT 
-            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.GroupID ASC;
-END //
-
-
-
-
 
 
 # -------------------------------------------------------------------------------------------
@@ -686,8 +630,7 @@ CREATE PROCEDURE `GetPersonalInfo` ( IN `pUserID` INT )
     NO SQL
 BEGIN 
     DECLARE vAccountType INT DEFAULT -1;
-    SELECT user_roles.Type
-        INTO vAccountType
+    SELECT user_roles.Type INTO vAccountType
         FROM `accounts`
         INNER JOIN `user_roles` ON accounts.UserRoleID = user_roles.ID 
         WHERE accounts.ID = pUserID 
@@ -743,29 +686,23 @@ CREATE FUNCTION `ActivateAccount`
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vUserID INT DEFAULT -1;
     # check for matching with existing accounts (note: Login & E-Mail are unique)
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    # check for existing of accounts with such Code
-    SELECT accounts.ID
-        INTO vUserID
-        FROM `accounts` 
-        WHERE accounts.ActivationCode = pCode
-        LIMIT 1;
-    IF vUserID <= 0 THEN
-        RETURN -2;
-    END IF;
-
     # activate account
     UPDATE `accounts` 
-        SET     accounts.Login = pLogin, 
-                accounts.Password = pPassword, 
-                accounts.EMail = pEMail, 
-                accounts.ActivationCode = NULL
-        WHERE accounts.ID = vUserID 
+        SET accounts.Login = pLogin,
+            accounts.Password = pPassword,
+            accounts.EMail = pEMail,
+            accounts.ActivationCode = NULL
+        WHERE accounts.ActivationCode = pCode AND
+              (@vAccountID = accounts.ID) > 0 # save accountID
         LIMIT 1;
-    RETURN vUserID;
+
+    IF (ROW_COUNT() = 0) THEN
+        RETURN -2;
+    END IF;
+    RETURN @vAccountID;
 END //
 
 
@@ -928,8 +865,7 @@ END //
 DROP PROCEDURE IF EXISTS GetTeachersForDiscipline//
 CREATE PROCEDURE `GetTeachersForDiscipline`(IN `pDisciplineID` INT)
     NO SQL
-BEGIN  
-
+BEGIN
     SELECT  view_disciplines_teachers.TeacherID AS 'ID',
             view_disciplines_teachers.LastName,
             view_disciplines_teachers.FirstName,
@@ -975,7 +911,7 @@ BEGIN
             view_teachers.DepName,
             (view_teachers.TeacherID = vAuthorID) AS 'IsAuthor'
         FROM `view_teachers`
-        WHERE NOT EXISTS    (SELECT disciplines_teachers.ID
+        WHERE NOT EXISTS(   SELECT disciplines_teachers.ID
                                 FROM `disciplines_teachers`
                                 WHERE   disciplines_teachers.TeacherID = view_teachers.TeacherID AND
                                         disciplines_teachers.DisciplineID = pDisciplineID)  AND
@@ -1017,7 +953,7 @@ BEGIN
 END //
 
 
-# TODO: check necessary
+
 DROP FUNCTION IF EXISTS CreateTeacherByDepName//
 CREATE FUNCTION `CreateTeacherByDepName`
     (   `pLastName` VARCHAR(30) CHARSET utf8,
@@ -1031,7 +967,7 @@ BEGIN
     DECLARE vAccountID, vChecker, vRoleID, vDepID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-# try to find a department with pDepartmentName
+    # try to find a department with pDepartmentName
     SELECT departments.ID
         INTO vDepID
         FROM `departments`
@@ -1986,7 +1922,7 @@ BEGIN
 
     IF  pAuthorID = pNewAuthorID OR
         NOT InternalIsTeacherAuthor(pAuthorID, pDisciplineID) OR
-        NOT InternalIsTeacherBinded(pNewAuthorID, pDisciplineID)
+        NOT InternalIsTeacherBounded(pNewAuthorID, pDisciplineID)
     THEN
         RETURN -1;
     END IF;
@@ -2095,7 +2031,7 @@ CREATE FUNCTION `CountRatings`
 BEGIN  
     DECLARE vRes INT DEFAULT 0;
 
-    IF  NOT InternalIsTeacherBinded(pTeacherID, pDisciplineID) THEN
+    IF  NOT InternalIsTeacherBounded(pTeacherID, pDisciplineID) THEN
         RETURN -1;
     END IF;
 
diff --git a/~dev_rating/application/classes/Model/DataArr/StudyGroups.php b/~dev_rating/application/classes/Model/DataArr/StudyGroups.php
index beb00196a82cad428c85dc97fcfdb999f4dc2b67..92e7457ea3b63904e9c3c833fc9b607c75fdc4dd 100644
--- a/~dev_rating/application/classes/Model/DataArr/StudyGroups.php
+++ b/~dev_rating/application/classes/Model/DataArr/StudyGroups.php
@@ -8,12 +8,6 @@ class Model_DataArr_StudyGroups extends Model
         return DB::query(Database::SELECT, $sql)->execute();
     }
 
-    // public function getStudyGroups($Grade, $FacultyID)
-    // {
-    //     $sql = "CALL `GetStudyGroups`('$Grade', '$FacultyID'); ";
-    //     return DB::query(Database::SELECT, $sql)->execute();
-    // }
-	
     public function getStudyGroups($grade, $facultyID)
     {
         $sql = "CALL `GetStudyGroups`('$grade', '$facultyID'); ";