diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index e9aa59517232706c6fabc2d25bc1885998b02f3b..cd70d23540bf6f2f3624956df4925fbebb540879 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -1325,7 +1325,8 @@ CREATE FUNCTION `SetStudentRate`(	`TeacherID` 	INT,
 									`Rate` 			INT ) 
 									RETURNS int(11)
     NO SQL
-BEGIN  
+BEGIN
+	-- TODO: log  
     DECLARE checker, discID, groupID, semID, rateID INT; 
     SET discID = -1;
     SET groupID = -1; 					 
@@ -1680,41 +1681,67 @@ END //
 
 
 
+DROP FUNCTION IF EXISTS ChangeDisciplineSubject//
+CREATE FUNCTION `ChangeDisciplineSubject`	(	`TeacherID` 	INT,
+												`DisciplineID`	INT,
+												`SubjectID`		INT		
+							 				) 	RETURNS int(11)
+    NO SQL
+BEGIN 
+    DECLARE checker INT;  					 
+	
+	SELECT disciplines.ID
+	INTO checker 
+	FROM `disciplines`
+	WHERE 	disciplines.ID = DisciplineID AND 
+			disciplines.AuthorID = TeacherID
+	LIMIT 1;
+	IF NOT (checker > 0) THEN 
+		RETURN -1;
+	END IF;
 
-DROP FUNCTION IF EXISTS ChangeDiscipline//
-CREATE FUNCTION `ChangeDiscipline`	(	`TeacherID` 	INT,
-										`DisciplineID`	INT,
-										`ExamType`		VARCHAR(30),
-										`LectionCount`  INT,
-										`PracticeCount` INT,
-										`Grade`			INT,
-										`SubjectID`		INT		
-							 		) 	RETURNS int(11)
+	SELECT subjects.ID 
+	INTO checker
+	FROM `subjects`
+	WHERE subjects.ID = SubjectID
+	LIMIT 1;
+	IF NOT (checker > 0) THEN 
+		RETURN -1;
+	END IF;
+
+	UPDATE `disciplines`
+	SET disciplines.SubjectID = SubjectID
+	WHERE disciplines.ID = DisciplineID;
+
+	RETURN 0;
+END //
+
+DROP FUNCTION IF EXISTS ChangeDisciplineGrade//
+CREATE FUNCTION `ChangeDisciplineGrade`	(	`TeacherID` 	INT,
+											`DisciplineID`	INT,
+											`Grade`			INT	
+							 			) 	RETURNS int(11)
     NO SQL
 BEGIN 
     DECLARE checker INT;  					 
 	
+
+	-- TODO: Grade
 	IF NOT (Grade > 0) THEN
 		RETURN -1;
 	END IF; 
 	
-	SELECT disciplines_teachers.ID
+	SELECT disciplines.ID
 	INTO checker 
-	FROM `disciplines_teachers`
-	WHERE disciplines_teachers.DisciplineID = DisciplineID AND disciplines_teachers.TeacherID 	= TeacherID
+	FROM `disciplines`
+	WHERE 	disciplines.ID = DisciplineID AND 
+			disciplines.AuthorID = TeacherID
 	LIMIT 1;
 	IF NOT (checker > 0) THEN 
 		RETURN -1;
 	END IF;
 
-	SET checker = -1;
-	SELECT rating_table.ID
-	INTO checker
-	FROM `rating_table`
-	INNER JOIN `submodules` ON submodules.ID = rating_table.SubmoduleID
-	INNER JOIN `modules` ON modules.ID = submodules.ModuleID
-	WHERE modules.DisciplineID = DisciplineID
-	LIMIT 1;
+	SET checker = InternalCheckRate(DisciplineID);
 	IF checker > 0 THEN
 		RETURN -1;
 	END IF;
@@ -1735,25 +1762,99 @@ BEGIN
 
 
 	UPDATE `disciplines`
-	SET 	disciplines.ExamType = ExamType,
-			disciplines.LectionCount = LectionCount,
-			disciplines.PracticeCount = PracticeCount,
-			disciplines.Grade = Grade,
-			disciplines.SubjectID = SubjectID
+	SET disciplines.Grade = Grade
 	WHERE disciplines.ID = DisciplineID;
+	RETURN 0;
 
-	-- TODO: добавить проверки на изменение
-	IF ExamType = 'exam' THEN
-		SET checker = AddModuleExam(TeacherID, DisciplineID);
-	ELSE
-		SET checker = DeleteModuleExam(TeacherID, DisciplineID);
+END //
+
+
+DROP FUNCTION IF EXISTS ChangeDisciplineControl//
+CREATE FUNCTION `ChangeDisciplineControl`	(	`TeacherID` 	INT,
+												`DisciplineID`	INT,
+												`ExamType`		VARCHAR(30)	
+							 				) 	RETURNS int(11)
+    NO SQL
+BEGIN 
+    DECLARE checker INT;  					 
+	
+
+	SELECT disciplines.ID
+	INTO checker 
+	FROM `disciplines`
+	WHERE 	disciplines.ID = DisciplineID AND 
+			disciplines.AuthorID = TeacherID
+	LIMIT 1;
+	IF NOT (checker > 0) THEN 
+		RETURN -1;
 	END IF;
 
+	SET checker = InternalCheckRate(DisciplineID);
+	IF checker > 0 THEN
+		RETURN -1;
+	END IF;
+
+	SELECT disciplines.ExamType 
+	INTO checker
+	FROM `disciplines`
+	WHERE disciplines.ID = DisciplineID
+	LIMIT 1;
+
+
+	IF 	(checker = 0 AND ExamType = 'credit') OR 
+		(checker = 1 AND ExamType = 'exam') 		
+	THEN
+		UPDATE `disciplines`
+		SET 	disciplines.ExamType = ExamType
+		WHERE disciplines.ID = DisciplineID;
+
+		IF ExamType = 'exam' THEN
+			SET checker = AddModuleExam(TeacherID, DisciplineID);
+		ELSE
+			SET checker = DeleteModuleExam(TeacherID, DisciplineID);
+		END IF;
+	END IF;
 	RETURN 0;
+END //
+
+DROP FUNCTION IF EXISTS ChangeDisciplineHours//
+CREATE FUNCTION `ChangeDisciplineHours`	(	`TeacherID` 	INT,
+											`DisciplineID`	INT,
+											`Hours`  		INT,
+											`Type` 			INT
+										-- Type: 0 - Practice Hours, 1 - Lection Hours	
+							 		) 	RETURNS int(11)
+    NO SQL
+BEGIN 
+    DECLARE checker INT;  					 
+		
+	SELECT disciplines.ID
+	INTO checker
+	FROM `disciplines`
+	WHERE 	disciplines.ID = DisciplineID AND 
+			disciplines.AuthorID = TeacherID
+	LIMIT 1;
+	IF NOT (checker > 0) THEN 
+		RETURN -1;
+	END IF;
 
+	-- TODO: switch
+	IF Type = 0 THEN
+		UPDATE `disciplines`
+		SET 	disciplines.PracticeCount = Hours
+		WHERE disciplines.ID = DisciplineID;
+	END IF;
+	IF Type = 1 THEN
+		UPDATE `disciplines`
+		SET 	disciplines.LectionCount = Hours
+		WHERE disciplines.ID = DisciplineID;
+	END IF;
+
+	RETURN 0;
 END //
 
 
+
 DROP FUNCTION IF EXISTS BindGroup//
 CREATE FUNCTION `BindGroup`	(	`AccessedTeacherID` 	INT,
 								`DisciplineID` 	INt,