diff --git a/db/Sample.sql b/db/Sample.sql
index b0a385c2d3b004b61a7d04915186300bdeb2f8ad..7b4a7b52e30a5444ecfc7972337b3b7c21fecaee 100644
--- a/db/Sample.sql
+++ b/db/Sample.sql
@@ -20,7 +20,17 @@ SET time_zone = "+00:00";
 -- База данных: `Sample2`
 --
 
-
+--
+-- Дамп данных таблицы `grades`
+--
+INSERT INTO `grades` (`ID`, `Grade`, `Degree`) VALUES
+(1, 1, 'bachelor'),
+(2, 2, 'bachelor'),
+(3, 3, 'bachelor'),
+(4, 4, 'bachelor'),
+(5, 5, 'specialist'),
+(6, 1, 'master'),
+(7, 2, 'master');
 
 --
 -- Дамп данных таблицы `job_positions`
@@ -129,7 +139,7 @@ INSERT INTO `specializations` (`ID`, `Name`, `Abbr`, `FacultyID`) VALUES
 -- Дамп данных таблицы `study_groups`
 --
 
-INSERT INTO `study_groups` (`ID`, `Grade`, `GroupNum`, `SpecializationID`, `Name`) VALUES
+INSERT INTO `study_groups` (`ID`, `GradeID`, `GroupNum`, `SpecializationID`, `Name`) VALUES
 (1, 1, 1, 1, NULL),
 (2, 1, 2, 1, NULL),
 (3, 1, 3, 2, NULL),
@@ -171,7 +181,7 @@ INSERT INTO `teachers` (`ID`, `LastName`, `FirstName`, `SecondName`, `JobPositio
 -- Дамп данных таблицы `disciplines`
 --
 
-INSERT INTO `disciplines` (`ID`, `Grade`, `SubjectID`, `AuthorID`, `ExamType`, `SemesterID`, `PracticeCount`, `LectionCount`, `FacultyID`) VALUES
+INSERT INTO `disciplines` (`ID`, `GradeID`, `SubjectID`, `AuthorID`, `ExamType`, `SemesterID`, `PracticeCount`, `LectionCount`, `FacultyID`) VALUES
 (1, 1, 1, 1, 'exam', 1, 0, 36, 1),
 (2, 1, 5, 2, 'exam', 1, 18, 36, 1),
 (3, 1, 2, 1, 'credit', 1, 18, 0, 1),
diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql
index cd70d23540bf6f2f3624956df4925fbebb540879..22faf6f24dbe65ba030ed5b0b0d3453e349e5016 100644
--- a/db/StoredProcedures.sql
+++ b/db/StoredProcedures.sql
@@ -244,7 +244,7 @@ END //
 
 
 DROP PROCEDURE IF EXISTS GetStudyGroups//
-CREATE PROCEDURE `GetStudyGroups`	( 	IN `Grade` 		INT,
+CREATE PROCEDURE `GetStudyGroups`	( 	IN `GradeID` 	INT,
 										IN `FacultyID` 	INT  
 									)
     NO SQL
@@ -257,14 +257,14 @@ BEGIN
 			specializations.FacultyID	AS 'FacultyID'
 	FROM `study_groups`
 	INNER JOIN `specializations` ON specializations.ID = study_groups.SpecializationID
-	WHERE 	( Grade = 0 OR study_groups.Grade = Grade ) AND 
+	WHERE 	( GradeID = 0 OR study_groups.GradeID = GradeID ) AND 
 			specializations.FacultyID = FacultyID
-	ORDER BY specializations.ID ASC, study_groups.Grade ASC, study_groups.GroupNum ASC;
+	ORDER BY specializations.ID ASC, grades.ID ASC, study_groups.GroupNum ASC;
 END //
 
 
 DROP PROCEDURE IF EXISTS GetStudyGroupsOrdByGroups//
-CREATE PROCEDURE `GetStudyGroupsOrdByGroups`	( 	IN `Grade` 		INT,
+CREATE PROCEDURE `GetStudyGroupsOrdByGroups`	( 	IN `GradeID` 	INT,
 													IN `FacultyID` 	INT  
 												)
     NO SQL
@@ -277,7 +277,7 @@ BEGIN
 			specializations.FacultyID	AS 'FacultyID'
 	FROM `study_groups`
 	INNER JOIN `specializations` ON specializations.ID = study_groups.SpecializationID
-	WHERE 	study_groups.Grade = Grade AND 
+	WHERE 	study_groups.GradeID = GradeID AND 
 			specializations.FacultyID = FacultyID
 	ORDER BY study_groups.GroupNum ASC;
 END //
@@ -293,11 +293,14 @@ BEGIN
 			students.FirstName 		AS 'StudentFirst',  
 			students.SecondName	 	AS 'StudentSecond',
 			students.AccountID 		AS 'StudentAccID',
-			study_groups.ID 			AS 'GroupID',
-			study_groups.Grade 			AS 'GroupGrade',	
-			study_groups.GroupNum 		AS 'GroupNum'
+			study_groups.ID 		AS 'GroupID',
+			grades.ID 				AS 'GradeID',
+			grades.Grade 			AS 'GroupGrade',
+			grades.Degree 			AS 'GroupDegree',	
+			study_groups.GroupNum 	AS 'GroupNum'
 	FROM `students`
 	INNER JOIN `study_groups` ON students.StudyGroupID = study_groups.ID
+	INNER JOIN `grades` ON study_groups.GradeID = grades.ID
 	WHERE students.StudyGroupID = StudyGroupID
 	ORDER BY students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
 
@@ -315,10 +318,13 @@ BEGIN
 			students.SecondName	 	AS 'StudentSecond',
 			students.AccountID 		AS 'StudentAccID',
 			study_groups.ID 		AS 'GroupID',
-			study_groups.Grade 		AS 'GroupGrade',	
+			grades.ID 				AS 'GradeID',
+			grades.Grade 			AS 'GroupGrade',
+			grades.Degree 			AS 'GroupDegree',		
 			study_groups.GroupNum 	AS 'GroupNum'
 	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
 	WHERE specializations.FacultyID = FacultyID
 	ORDER BY students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
@@ -388,7 +394,9 @@ CREATE PROCEDURE `GetGroupsForDiscipline`	( 	IN `DisciplineID` INT	)
 BEGIN
 	SELECT 	disciplines_groups.ID 	AS 'DiscGroupID',
 			study_groups.ID 		AS 'GroupID', 
-			study_groups.Grade 		AS 'GroupGrade', 
+			grades.ID 				AS 'GradeID',
+			grades.Grade 			AS 'GroupGrade',
+			grades.Degree 			AS 'GroupDegree',	
 			study_groups.GroupNum 	AS 'GroupNum', 
 			study_groups.Name 		AS 'GroupName',
 			specializations.ID 		AS 'SpecID',
@@ -397,15 +405,16 @@ BEGIN
 	FROM `disciplines_groups`
 	INNER JOIN `study_groups` 		ON study_groups.ID = disciplines_groups.StudyGroupID
 	INNER JOIN `specializations` 	ON study_groups.SpecializationID = specializations.ID
+	INNER JOIN `grades` 			ON study_groups.GradeID = grades.ID
 	WHERE disciplines_groups.DisciplineID = DisciplineID
-	ORDER BY study_groups.Grade ASC, study_groups.GroupNum ASC;
+	ORDER BY grades.ID ASC, study_groups.GroupNum ASC;
 
 END //
 
 
 
 DROP PROCEDURE IF EXISTS GetStudentsByGrade//
-CREATE PROCEDURE `GetStudentsByGrade`	(	IN `Grade` INT,
+CREATE PROCEDURE `GetStudentsByGrade`	(	IN `GradeID` INT,
 											IN `FacultyID` INT )
     NO SQL
 BEGIN  
@@ -415,13 +424,15 @@ BEGIN
 							students.SecondName			AS 'StudentSecond',
 							students.AccountID			AS 'StudentAccID',
 							study_groups.ID 			AS 'GroupID',
-							study_groups.Grade 			AS 'GroupGrade',	
+							grades.ID 					AS 'GradeID',
+							grades.Grade 				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
 		INNER JOIN `specializations` 		ON study_groups.SpecializationID = specializations.ID
-		WHERE 	study_groups.Grade = Grade AND
+		WHERE 	study_groups.GradeID = GradeID AND
 				specializations.FacultyID = FacultyID
 		ORDER BY students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
 
@@ -514,7 +525,9 @@ BEGIN
 				students.FirstName		AS 'First',  
 				students.SecondName 	AS 'Second', 
 				study_groups.ID 		AS 'GroupID', 
-				study_groups.Grade 		AS 'StudentGrade', 
+				grades.ID 				AS 'GradeID',
+				grades.Grade 			AS 'StudentGrade',
+				grades.Degree 			AS 'StudentDegree', 
 				study_groups.GroupNum 	AS 'GroupNum', 
 				study_groups.Name 		AS 'GroupName',
 				specializations.ID 		AS 'SpecID', 
@@ -735,7 +748,7 @@ DROP FUNCTION IF EXISTS CreateStudent//
 CREATE FUNCTION `CreateStudent`(	`Last` 			VARCHAR(30) CHARSET utf8, 
 									`First` 		VARCHAR(30) CHARSET utf8, 
 									`Second` 		VARCHAR(30) CHARSET utf8, 
-									`Grade` 		INT, 
+									`GradeID` 		INT, 
 									`GroupN` 		INT, 
 									`FacultyID` 	INT, 
 									`Code` 			VARCHAR(40) CHARSET utf8 
@@ -748,7 +761,7 @@ BEGIN
 	INTO StudyGroupID 
 	FROM `study_groups` 
 	INNER JOIN `specializations` ON study_groups.SpecializationID = specializations.ID
-	WHERE 	study_groups.Grade = Grade 	AND 
+	WHERE 	study_groups.GradeID = GradeID 	AND 
 			study_groups.GroupNum = GroupN AND 
 			specializations.FacultyID = FacultyID 
 	LIMIT 1;
@@ -963,7 +976,7 @@ END //
 
 
 DROP PROCEDURE IF EXISTS SearchStudents//
-CREATE PROCEDURE `SearchStudents`	(	IN `Grade` INT, 
+CREATE PROCEDURE `SearchStudents`	(	IN `GradeID` INT, 
 										IN `GroupN` INT,
 										IN `FacultyID` INT,
 										IN `Last` VARCHAR(30) CHARSET utf8, 
@@ -976,18 +989,21 @@ BEGIN
 			students.LastName		AS 'StudentLast',	
 			students.FirstName 		AS 'StudentFirst',
 			students.SecondName		AS 'StudentSecond',
-			study_groups.Grade 		AS 'GroupGrade',
+			grades.ID 					AS 'GradeID',
+			grades.Grade 				AS 'GroupGrade',
+			grades.Degree 				AS 'GroupDegree',
 			study_groups.GroupNum 	AS 'GroupNum'
 	FROM `students`
 	INNER JOIN `study_groups` 		ON students.StudyGroupID = study_groups.ID
 	INNER JOIN `specializations`	ON study_groups.SpecializationID = specializations.ID
-	WHERE 	( Grade = 0 OR study_groups.Grade = Grade) AND
+	INNER JOIN `grades` 			ON study_groups.GradeID = GradeID 
+	WHERE 	( GradeID = 0 OR study_groups.GradeID = GradeID) AND
 			( GroupN = 0  OR study_groups.GroupNum = GroupN) AND
 			( FacultyID = 0 OR specializations.FacultyID = FacultyID) AND 
 			( students.LastName LIKE CONCAT(Last,"%") ) AND 
 			( students.FirstName LIKE CONCAT(First,"%") ) AND
 			( students.SecondName LIKE CONCAT(Second,"%") )
-	ORDER BY study_groups.Grade ASC, study_groups.GroupNum ASC;
+	ORDER BY grades.ID ASC, study_groups.GroupNum ASC;
 
 
 END //
@@ -997,7 +1013,7 @@ END //
 
 
 DROP PROCEDURE IF EXISTS SearchStudentsNew//
-CREATE PROCEDURE `SearchStudentsNew`	(	IN `Grade` INT, 
+CREATE PROCEDURE `SearchStudentsNew`	(	IN `GradeID` INT, 
 											IN `GroupN` INT,
 											IN `FacultyID` INT,
 											IN `Last` VARCHAR(30) CHARSET utf8, 
@@ -1011,16 +1027,19 @@ BEGIN
 			students.LastName		AS 'StudentLast',	
 			students.FirstName 		AS 'StudentFirst',
 			students.SecondName		AS 'StudentSecond',
-			study_groups.Grade 		AS 'GroupGrade',
+			grades.ID 					AS 'GradeID',
+			grades.Grade 				AS 'GroupGrade',
+			grades.Degree 				AS 'GroupDegree',
 			study_groups.GroupNum 	AS 'GroupNum'
 	FROM `students`
 	INNER JOIN `study_groups` 			ON 	students.StudyGroupID = study_groups.ID
 	INNER JOIN `specializations`		ON 	study_groups.SpecializationID = specializations.ID
+	INNER JOIN `grades` 			ON study_groups.GradeID = GradeID 
 	LEFT JOIN `disciplines_students` 	ON 	students.ID = disciplines_students.StudentID AND 
 											DisciplineID = disciplines_students.DisciplineID
 	LEFT JOIN `disciplines_groups` 		ON 	disciplines_groups.StudyGroupID = study_groups.ID AND
 											DisciplineID = disciplines_groups.DisciplineID
-	WHERE 	( Grade = 0 OR study_groups.Grade = Grade) AND
+	WHERE 	( GradeID = 0 OR study_groups.GradeID = GradeID) AND
 			( GroupN = 0  OR study_groups.GroupNum = GroupN) AND
 			( FacultyID = 0 OR specializations.FacultyID = FacultyID) AND 
 			( students.LastName LIKE CONCAT(Last,"%") ) AND 
@@ -1030,19 +1049,19 @@ BEGIN
 				( 	disciplines_groups.ID IS NULL AND disciplines_students.Type IS NULL 	)
 			)
 
-	ORDER BY study_groups.Grade ASC, study_groups.GroupNum ASC;
+	ORDER BY grades.ID ASC, study_groups.GroupNum ASC;
 
 
 END //
 
 DROP PROCEDURE IF EXISTS getStudentsNotAttendingDiscipline//
-CREATE PROCEDURE `getStudentsNotAttendingDiscipline`	(	IN `Grade` INT, 
-											IN `StudyGroupID` INT,
-											IN `FacultyID` INT,
-											IN `Last` VARCHAR(30) CHARSET utf8, 
-											IN `First` VARCHAR(30) CHARSET utf8, 
-										 	IN `Second` VARCHAR(30) CHARSET utf8,
-										 	IN `DisciplineID` INT
+CREATE PROCEDURE `getStudentsNotAttendingDiscipline`	(	IN `GradeID` INT, 
+															IN `StudyGroupID` INT,
+															IN `FacultyID` INT,
+															IN `Last` VARCHAR(30) CHARSET utf8, 
+															IN `First` VARCHAR(30) CHARSET utf8, 
+														 	IN `Second` VARCHAR(30) CHARSET utf8,
+														 	IN `DisciplineID` INT
 										)
     NO SQL
 BEGIN  
@@ -1051,7 +1070,9 @@ BEGIN
 			students.FirstName 		AS 'StudentFirst',
 			students.SecondName		AS 'StudentSecond',
 			study_groups.ID 		AS 'GroupID',
-			study_groups.Grade 		AS 'GroupGrade',
+			grades.ID 					AS 'GradeID',
+			grades.Grade 				AS 'GroupGrade',
+			grades.Degree 				AS 'GroupDegree',
 			study_groups.GroupNum 	AS 'GroupNum'
 	FROM `students`
 	INNER JOIN `study_groups` 			ON 	students.StudyGroupID = study_groups.ID
@@ -1060,7 +1081,7 @@ BEGIN
 											DisciplineID = disciplines_students.DisciplineID
 	LEFT JOIN `disciplines_groups` 		ON 	disciplines_groups.StudyGroupID = study_groups.ID AND
 											DisciplineID = disciplines_groups.DisciplineID
-	WHERE 	( Grade = 0 OR study_groups.Grade = Grade) AND
+	WHERE 	( GradeID = 0 OR study_groups.GradeID = GradeID) AND
 			( StudyGroupID = 0  OR study_groups.ID = StudyGroupID) AND
 			( FacultyID = 0 OR specializations.FacultyID = FacultyID) AND 
 			( students.LastName LIKE CONCAT(Last,"%") ) AND 
@@ -1070,7 +1091,7 @@ BEGIN
 				( 	disciplines_groups.ID IS NULL AND disciplines_students.Type IS NULL 	)
 			)
 
-	ORDER BY study_groups.Grade ASC, study_groups.GroupNum ASC;
+	ORDER BY grades.ID ASC, study_groups.GroupNum ASC;
 
 
 END //
@@ -1109,7 +1130,9 @@ CREATE PROCEDURE `GetDisciplineInfoByID`(	IN `DiscID` INT )
 BEGIN  
 	-- TODO: Inline InternalCheckRate
 	SELECT 	disciplines.AuthorID,
-			disciplines.Grade 			AS 'DisciplineGrade',
+			disciplines.GradeID 			AS 'DisciplineGradeID',
+			grades.Grade 					AS 'DisciplineGrade',
+			grades.Degree 					AS 'DisciplineDegree',
 			disciplines.ExamType,
 			disciplines.LectionCount,
 			disciplines.PracticeCount,
@@ -1125,7 +1148,8 @@ BEGIN
 	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 `departments` ON departments.ID = teachers.DepartmentID
+	INNER JOIN `grades` ON grades.ID = disciplines.GradeID 
 	WHERE 	disciplines.ID = DiscID;
 END //
 
@@ -1188,13 +1212,17 @@ BEGIN
 
 	SELECT DISTINCT disciplines.ID 			AS 'DisciplineID',
                     disciplines.ExamType 	AS 'DisciplineType',
-                    disciplines.Grade 		AS 'DisciplineGrade',
+					disciplines.GradeID 			AS 'DisciplineGradeID',
+					grades.Grade 					AS 'DisciplineGrade',
+					grades.Degree 					AS 'DisciplineDegree',
                     subjects.ID 			AS 'SubjectID',
                     subjects.Name 			AS 'SubjectName',
                     disciplines_teachers.ID AS 'DisciplineTeacherID',
                     study_groups.ID 		AS 'StudyGroupID', 
                     study_groups.GroupNum 	AS 'StudyGroupNum', 
-                    study_groups.Grade 		AS 'StudyGroupGrade',
+                    grades2.ID 	 			AS 'StudyGroupGradeID',
+                    grades2.Grade 			AS 'StudyGroupGrade',
+                    grades2.Degree 			AS 'StudyGroupDegree',
                     study_groups.Name 		AS 'StudyGroupName',
                     (TeacherID = disciplines.AuthorID) 	AS 'isAuthor',
                     (modules.ID IS NOT NULL)			AS 'isMapCreated'
@@ -1202,13 +1230,15 @@ BEGIN
     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 
 											disciplines_teachers.TeacherID = TeacherID
     INNER JOIN `subjects`				ON 	subjects.ID = disciplines.SubjectID
     LEFT JOIN  `study_groups` 			ON 	study_groups.ID = disciplines_groups.StudyGroupID
     LEFT JOIN `modules` 				ON 	disciplines.ID = modules.DisciplineID
+    LEFT JOIN `grades` grades2 			ON 	grades2.ID = study_groups.GradeID
     WHERE 	disciplines.SemesterID = semID
-    ORDER BY 	disciplines.Grade 		ASC, 
+    ORDER BY 	grades.ID 				ASC, 
     			subjects.Name 			ASC,
     			study_groups.GroupNum 	ASC;
 END //
@@ -1238,18 +1268,21 @@ BEGIN
 							students.FirstName,
 							students.SecondName,
 							study_groups.ID 		AS 'GroupID',
-							study_groups.Grade,
+							grades.ID 				AS 'GradeID',
+							grades.Grade,
+							grades.Degree 			AS 'Degree',
 							study_groups.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_groups` 		ON 	DisciplineID = disciplines_groups.DisciplineID AND
 													study_groups.ID = disciplines_groups.StudyGroupID 
 		LEFT JOIN 	`disciplines_students`		ON 	DisciplineID = disciplines_students.DisciplineID AND
 													students.ID = disciplines_students.StudentID
 		WHERE 		disciplines_groups.StudyGroupID IS NOT NULL OR
 					disciplines_students.StudentID IS NOT NULL
-		ORDER BY 	study_groups.Grade ASC, study_groups.GroupNum ASC, students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
+		ORDER BY 	grades.ID ASC, study_groups.GroupNum ASC, students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
 
 	ELSE 
 		SELECT 	NULL AS 'StudentID',
@@ -1502,11 +1535,14 @@ BEGIN
 							students.LastName,
 							students.FirstName,
 							students.SecondName,
-							study_groups.Grade,
+							grades.ID 				AS 'GradeID',
+							grades.Grade,
+							grades.Degree 			AS 'Degree',
 							study_groups.GroupNum,
 							(disciplines_students.Type IS NOT NULL OR 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_groups` 		ON 	DisciplineID = disciplines_groups.DisciplineID AND
 													study_groups.ID = disciplines_groups.StudyGroupID 
 		LEFT JOIN 	`disciplines_students`		ON 	DisciplineID = disciplines_students.DisciplineID AND
@@ -1515,7 +1551,7 @@ BEGIN
 				(	( disciplines_students.Type IS NULL OR disciplines_students.Type != 'detach' ) AND 
 					disciplines_groups.StudyGroupID IS NOT NULL 
 				)
-		ORDER BY study_groups.Grade ASC, study_groups.GroupNum ASC, students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
+		ORDER BY grades.ID ASC, study_groups.GroupNum ASC, students.LastName ASC, students.FirstName ASC, students.SecondName ASC;
 	ELSE 
 		SELECT 	NULL AS 'StudentID',
 				NULL AS 'LastName',
@@ -1608,7 +1644,7 @@ END //
 
 DROP FUNCTION IF EXISTS AddDiscipline//
 CREATE FUNCTION `AddDiscipline`	(	`TeacherID` 	INT,
-									`Grade`			INT,
+									`GradeID`			INT,
 									`SubjectID`		INT,
 									`ExamType`		VARCHAR(30),
 									`LectionCount`  INT,
@@ -1620,10 +1656,16 @@ BEGIN
     DECLARE semID, checker INT; 
     SET semID = GetCurSemesterID();   
 
-	IF NOT (Grade > 0) THEN
+    SELECT grades.ID
+    INTO checker
+    FROM `grades`
+    WHERE grades.ID = GradeID
+    LIMIT 1;
+	IF NOT (checker > 0) THEN
 		RETURN -1;
 	END IF; 
 
+	SET checker = -1;
     SELECT faculties.ID
     INTO checker
     FROM `faculties`
@@ -1646,14 +1688,14 @@ BEGIN
 
 
 	INSERT INTO `disciplines` 	(	disciplines.AuthorID, 
-									disciplines.Grade, 
+									disciplines.GradeID, 
 									disciplines.SubjectID, 
 									disciplines.ExamType, 
 									disciplines.LectionCount, 
 									disciplines.PracticeCount,
 									disciplines.SemesterID,
 									disciplines.FacultyID )
-	VALUES 					( TeacherID, Grade, SubjectID, ExamType, LectionCount, PracticeCount, semID, FacultyID );
+	VALUES 					( TeacherID, GradeID, SubjectID, ExamType, LectionCount, PracticeCount, semID, FacultyID );
 	
 	-- RETURN 	(	SELECT disciplines.ID
 	-- 			FROM   `disciplines`
@@ -1719,18 +1761,22 @@ END //
 DROP FUNCTION IF EXISTS ChangeDisciplineGrade//
 CREATE FUNCTION `ChangeDisciplineGrade`	(	`TeacherID` 	INT,
 											`DisciplineID`	INT,
-											`Grade`			INT	
+											`GradeID`			INT	
 							 			) 	RETURNS int(11)
     NO SQL
 BEGIN 
     DECLARE checker INT;  					 
 	
-
-	-- TODO: Grade
-	IF NOT (Grade > 0) THEN
+    SELECT grades.ID
+    INTO checker
+    FROM `grades`
+    WHERE grades.ID = GradeID
+    LIMIT 1;
+	IF NOT (checker > 0) THEN
 		RETURN -1;
-	END IF; 
+	END IF;  
 	
+	SET checker = -1;
 	SELECT disciplines.ID
 	INTO checker 
 	FROM `disciplines`
@@ -1746,13 +1792,13 @@ BEGIN
 		RETURN -1;
 	END IF;
 
-	SELECT disciplines.Grade 
+	SELECT disciplines.GradeID 
 	INTO checker
 	FROM `disciplines`
 	WHERE disciplines.ID = DisciplineID
 	LIMIT 1;
 
-	IF checker != Grade THEN
+	IF checker != GradeID THEN
 		DELETE FROM `disciplines_groups`
 		WHERE disciplines_groups.DisciplineID = DisciplineID;
 
@@ -1762,7 +1808,7 @@ BEGIN
 
 
 	UPDATE `disciplines`
-	SET disciplines.Grade = Grade
+	SET disciplines.GradeID = GradeID
 	WHERE disciplines.ID = DisciplineID;
 	RETURN 0;
 
diff --git a/db/Structure.sql b/db/Structure.sql
index b669520c661a7d82b53f3bed636433b14c14a31f..e8ae646b86bd8ffb8a10a88b8cca7b18cd12ddd1 100644
--- a/db/Structure.sql
+++ b/db/Structure.sql
@@ -78,7 +78,7 @@ CREATE TABLE IF NOT EXISTS `departments` (
 
 CREATE TABLE IF NOT EXISTS `disciplines` (
   `ID` int(11) NOT NULL AUTO_INCREMENT,
-  `Grade` int(11) NOT NULL,
+  `GradeID` int(11) NOT NULL,
   `SubjectID` int(11) NOT NULL,
   `AuthorID` int(11) NOT NULL,
   `ExamType` enum('exam','credit') NOT NULL,
@@ -87,6 +87,7 @@ CREATE TABLE IF NOT EXISTS `disciplines` (
   `LectionCount` int(11) NOT NULL DEFAULT '0',
   `FacultyID` int(11) NOT NULL,
   PRIMARY KEY (`ID`),
+  KEY `GradeID`   (`GradeID`),
   KEY `SubjectID` (`SubjectID`),
   KEY `TeacherID` (`AuthorID`),
   KEY `SemesterID` (`SemesterID`),
@@ -309,12 +310,13 @@ CREATE TABLE IF NOT EXISTS `students` (
 
 CREATE TABLE IF NOT EXISTS `study_groups` (
   `ID` int(11) NOT NULL AUTO_INCREMENT,
-  `Grade` int(11) NOT NULL,
+  `GradeID` int(11) NOT NULL,
   `GroupNum` int(11) NOT NULL,
   `SpecializationID` int(11) NOT NULL,
   `Name` varchar(50) DEFAULT NULL,
   PRIMARY KEY (`ID`),
-  UNIQUE KEY `Grade` (`Grade`,`GroupNum`,`SpecializationID`),
+  UNIQUE KEY `GradeID_2` (`GradeID`,`GroupNum`,`SpecializationID`),
+  KEY `GradeID` (`GradeID`),
   KEY `SpecializtionID` (`SpecializationID`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
 
@@ -351,6 +353,24 @@ CREATE TABLE IF NOT EXISTS `submodules` (
   KEY `ModuleID` (`ModuleID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
+
+
+-- --------------------------------------------------------
+
+--
+-- Структура таблицы `grades`
+--
+
+CREATE TABLE IF NOT EXISTS `grades` (
+  `ID` int(11) NOT NULL AUTO_INCREMENT,
+  `Grade` int(11) NOT NULL,
+  `Degree` enum('bachelor','master','specialist') NOT NULL,
+  PRIMARY KEY (`ID`),
+  UNIQUE KEY `Grade_2` (`Grade`,`Degree`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+
 -- --------------------------------------------------------
 
 --
@@ -443,7 +463,8 @@ ALTER TABLE `disciplines`
   ADD CONSTRAINT `disciplines_ibfk_2` FOREIGN KEY (`SubjectID`) REFERENCES `subjects` (`ID`),
   ADD CONSTRAINT `disciplines_ibfk_4` FOREIGN KEY (`SemesterID`) REFERENCES `semesters` (`ID`),
   ADD CONSTRAINT `disciplines_ibfk_5` FOREIGN KEY (`AuthorID`) REFERENCES `teachers` (`ID`),
-  ADD CONSTRAINT `disciplines_ibfk_6` FOREIGN KEY (`FacultyID`) REFERENCES `faculties` (`ID`);
+  ADD CONSTRAINT `disciplines_ibfk_6` FOREIGN KEY (`FacultyID`) REFERENCES `faculties` (`ID`),
+  ADD CONSTRAINT `disciplines_ibfk_7` FOREIGN KEY (`GradeID`) REFERENCES `grades` (`ID`);
 
 --
 -- Ограничения внешнего ключа таблицы `disciplines_groups`
@@ -510,7 +531,8 @@ ALTER TABLE `students`
 -- Ограничения внешнего ключа таблицы `study_groups`
 --
 ALTER TABLE `study_groups`
-  ADD CONSTRAINT `study_groups_ibfk_4` FOREIGN KEY (`SpecializationID`) REFERENCES `specializations` (`ID`);
+  ADD CONSTRAINT `study_groups_ibfk_4` FOREIGN KEY (`SpecializationID`) REFERENCES `specializations` (`ID`),
+  ADD CONSTRAINT `study_groups_ibfk_5` FOREIGN KEY (`GradeID`) REFERENCES `grades` (`ID`);
 
 --
 -- Ограничения внешнего ключа таблицы `submodules`