diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index d89f60957ef79bee4fac85d477e02474e6b412ef..eaaadbc164fe5b3f79a7041e336a37ef34f0f8fe 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -1810,7 +1810,7 @@ BEGIN
 						teachers.FirstName 		AS 'First',
 						teachers.SecondName 	AS 'Second', 
 						GetRateForDisc(StudentID, disciplines.ID ) 		AS 'Rate', 
-						GetMaxRateForDisc(StudentID, disciplines.ID ) 	AS 'MaxCurrentRate',
+						GetMaxRateForDisc(disciplines.ID ) 				AS 'MaxCurrentRate',
 						InternalIsMapCreated(disciplines.ID)			AS 'isMapCreated',
 						rating_table.Rate 		AS 'ExamRate'
 	FROM `disciplines`
@@ -1819,7 +1819,7 @@ BEGIN
 	LEFT JOIN 	`modules`			ON 	disciplines.ID = modules.DisciplineID AND
 										modules.Type = 2
 	LEFT JOIN 	`submodules` 		ON 	modules.ID = submodules.ModuleID
-	LEFT JOIN 	`rating_table`		ON 	submodules.ID = rating_table.SubModuleID AND
+	LEFT JOIN 	`rating_table`		ON 	submodules.ID = rating_table.SubmoduleID AND
 										rating_table.StudentID = StudentID									
 	WHERE 	GetCurSemesterID() = disciplines.SemesterID AND 
 			InternalIsStudentAttached(StudentID, disciplines.ID)
@@ -1847,7 +1847,7 @@ BEGIN
 	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 
+	LEFT JOIN `rating_table` 	ON 	submodules.ID = rating_table.SubmoduleID AND 
 									StudentID = rating_table.StudentID  
 	ORDER BY 	modules.OrderNum ASC, 
 				submodules.OrderNum ASC;
@@ -3240,17 +3240,15 @@ END //
 
 
 DROP FUNCTION IF EXISTS GetMaxRateForDisc//
-CREATE FUNCTION `GetMaxRateForDisc`	(	`StudentID` INT,  
-										`DisciplineID` INT
+CREATE FUNCTION `GetMaxRateForDisc`	(	`DisciplineID` INT
 									) 	RETURNS int(11)
     NO SQL
 BEGIN
 	RETURN 	(	SELECT SUM(submodules.MaxRate) 
-				FROM `rating_table`
-				INNER JOIN `submodules` ON 	rating_table.SubmoduleID = submodules.ID
-				INNER JOIN `modules`	ON 	submodules.ModuleID = modules.ID AND
-											DisciplineID = modules.DisciplineID
-				WHERE 	rating_table.StudentID = StudentID
+				FROM `modules`
+				LEFT JOIN `submodules` ON 	submodules.ModuleID = modules.ID
+				WHERE 	modules.DisciplineID = DisciplineID AND
+						submodules.isUsed != 0
 				LIMIT 1
 			);
 END //
@@ -3266,7 +3264,7 @@ CREATE FUNCTION `SetStudentRate`(	`TeacherID` 	INT,
     NO SQL
 BEGIN
     DECLARE checker, DisciplineID, groupID, rateID INT;
-    DECLARE isLocked tinyint; 
+    DECLARE isLocked, isUsed tinyint; 
 
 	SET groupID = -1;
 	SELECT students.StudyGroupID 
@@ -3280,8 +3278,8 @@ BEGIN
 
     SET isLocked = 0;
     SET DisciplineID = -1;
-    SELECT modules.DisciplineID, disciplines.isLocked, rating_table.StudentID
-    INTO DisciplineID, isLocked, rateID
+    SELECT modules.DisciplineID, disciplines.isLocked, rating_table.ID, submodules.isUsed
+    INTO DisciplineID, isLocked, rateID, isUsed
 	FROM `submodules`
 	INNER JOIN `modules` 				ON 	submodules.ModuleID = modules.ID
 	INNER JOIN `disciplines` 			ON 	modules.DisciplineID = disciplines.ID
@@ -3292,7 +3290,7 @@ BEGIN
 	LEFT JOIN 	`disciplines_students`	ON 	disciplines.ID = disciplines_students.DisciplineID AND
 											StudentID = disciplines_students.StudentID 	AND
 											1 = disciplines_students.Type
-	LEFT JOIN 	`rating_table`			ON 	SubModuleID = rating_table.SubModuleID AND
+	LEFT JOIN 	`rating_table`			ON 	SubModuleID = rating_table.SubmoduleID AND
 											StudentID = rating_table.StudentID
 	WHERE 	submodules.ID = SubModuleID AND
 			(	disciplines_students.ID IS NOT NULL OR
@@ -3337,6 +3335,13 @@ BEGIN
 					rating_table.Date 
 				)
 		VALUES 	( StudentID, TeacherID, SubmoduleID, Rate, CURDATE() );
+
+		IF NOT isUsed THEN
+			UPDATE `submodules`
+			SET submodules.isUsed = 1
+			WHERE submodules.ID = SubModuleID
+			LIMIT 1;
+		END IF;
 	END IF;
 	RETURN 0;
 END //
diff --git a/db/fix.sql b/db/fix.sql
index e6e9c4ee054a090ee7f5195efaa6e09b88d55bdb..bf157872da9283eee97f406ceead280f7cbaae55 100644
--- a/db/fix.sql
+++ b/db/fix.sql
@@ -16,71 +16,19 @@ ALTER TABLE `recovery_tokens`
   ADD CONSTRAINT `recovery_tokens_ibfk_1` FOREIGN KEY (`AccountID`) REFERENCES `accounts` (`ID`)//
 
 
-  DROP FUNCTION IF EXISTS CreateRecoveryToken//
-CREATE FUNCTION `CreateRecoveryToken`	( 	`AccountID` INT,
-											`Token` VARCHAR(100) charset utf8
-										)	RETURNS int(11)
-    NO SQL
-BEGIN
-	DECLARE checker INT;
 
-	SET checker = -1;
-	SELECT recovery_tokens.ID
-	INTO checker
-	FROM `recovery_tokens`
-	WHERE recovery_tokens.Token = Token
-	LIMIT 1;
-	IF checker <= 0 THEN
-		RETURN -1;
-	END IF; 
 
-	INSERT INTO `recovery_tokens`
-			(recovery_tokens.AccountID, recovery_tokens.Token )
-	VALUES	(AccountID, Token);
-	RETURN LAST_INSERT_ID();
-END//
 
-
-
-DROP FUNCTION IF EXISTS UseRecoveryToken//
-CREATE FUNCTION `UseRecoveryToken`	( 	`Token` VARCHAR(100) charset utf8
-									)	RETURNS int(11)
-    NO SQL
-BEGIN
-	DECLARE checker INT;
-
-	SET checker = -1;
-	SELECT recovery_tokens.ID
-	INTO checker
-	FROM `recovery_tokens`
-	WHERE recovery_tokens.Token = Token
-	LIMIT 1;
-	IF checker <= 0 THEN
-		RETURN -1;
-	END IF; 
-
-	UPDATE `recovery_tokens`
-	SET recovery_tokens.isUsed = 1
-	WHERE recovery_tokens.Token = Token
-	LIMIT 1;
-END//
-
-
-
-DROP PROCEDURE IF EXISTS GetRecoveryInfoByToken//
-CREATE PROCEDURE `GetRecoveryInfoByToken`	( 	IN `Token` VARCHAR(100) charset utf8
-											)
-    NO SQL
-BEGIN 
-	SELECT 	recovery_tokens.ID,
-			recovery_tokens.AccountID,
-			recovery_tokens.Date,
-			recovery_tokens.Token,
-			recovery_tokens.isUsed
-	FROM `recovery_tokens`
-	WHERE recovery_tokens.Token = Token
-	LIMIT 1;
-END //
+ALTER TABLE `submodules`
+ADD `isUsed`  tinyint(1) NOT NULL DEFAULT '0'//
+ 
+UPDATE `submodules`
+SET submodules.isUsed = 1
+WHERE submodules.ID IN 
+	(
+		SELECT DISTINCT rating_table.SubmoduleID
+		FROM `rating_table`
+	)//
 
 
 DELIMITER ;
\ No newline at end of file