diff --git a/db/StoredFunctions.sql b/db/StoredFunctions.sql
index 251aed9cd7db4d1224e70800c51366ceb447b0b9..6f528bb8e0f0ab39a3e88203563492d8c0e2dccd 100644
--- a/db/StoredFunctions.sql
+++ b/db/StoredFunctions.sql
@@ -668,7 +668,7 @@ CREATE FUNCTION `CreateStudent`
     )   RETURNS int(11)
     NO SQL
 BEGIN
-    DECLARE vAccountID, vGroupID, vStudentID INT DEFAULT -1;
+    DECLARE vAccountID, vGroupID, vStudentID, vSemesterID INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
     # find group
@@ -693,10 +693,16 @@ BEGIN
         (AccountID, LastName, FirstName, SecondName)
         VALUES  (vAccountID, pLastName, pFirstName, pSecondName);
 
+
+    SELECT general_settings.Val INTO vSemesterID
+        FROM `general_settings`
+        WHERE general_settings.Name = 'SemesterID'
+        LIMIT 1;
+
     # bind group in current semester
     INSERT INTO `students_groups`
         (StudentID, GroupID, SemesterID)
-        VALUES (LAST_INSERT_ID(), vGroupID, @CurrentSemesterID);
+        VALUES (LAST_INSERT_ID(), vGroupID, vSemesterID);
 
     RETURN 0;
 END //
@@ -767,24 +773,7 @@ BEGIN
         SET vGroupID = LAST_INSERT_ID();
     END IF;
 
-    # TODO: user roles
-    # create account
-    INSERT INTO `accounts`
-        (Login, Password , EMail, UserRoleID, ActivationCode )
-        VALUES  ( NULL, NULL, NULL, 1, pActivationCode);
-    SET vAccountID = LAST_INSERT_ID();
-
-    # create student
-    INSERT INTO `students`
-        (AccountID, LastName, FirstName, SecondName)
-        VALUES  (vAccountID, pLastName, pFirstName, pSecondName);
-
-    # bind group in current semester
-    INSERT INTO `students_groups`
-        (StudentID, GroupID, SemesterID)
-        VALUES (LAST_INSERT_ID(), vGroupID, @CurrentSemesterID);
-
-    RETURN ROW_COUNT()-1;
+    RETURN CreateStudent(pLastName, pFirstName, pSecondName, vGradeID, pGroupNum, pFacultyID, pActivationCode);
 END //
 
 
@@ -2210,17 +2199,18 @@ DROP FUNCTION IF EXISTS CreateRecoveryToken//
 CREATE FUNCTION `CreateRecoveryToken`
     (   `pAccountOrEMail` VARCHAR(255) CHARSET utf8,
         `pToken` VARCHAR(100) CHARSET utf8
-    )	RETURNS VARCHAR(255) charset utf8
+    )   RETURNS VARCHAR(255) charset utf8
     NO SQL
 BEGIN
     DECLARE vAccountID INT DEFAULT -1;
-    DECLARE vUserFullName TEXT;
-    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
+    DECLARE vUserFullName TEXT charset utf8;
+    DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -2;
 
     # get account ID
     SELECT accounts.ID INTO vAccountID
         FROM `accounts`
-        WHERE accounts.EMail = pAccountOrEMail
+        WHERE accounts.EMail = pAccountOrEMail OR
+              accounts.Login = pAccountOrEMail
         LIMIT 1;
     IF vAccountID <= 0 THEN
         RETURN '';
@@ -2234,12 +2224,13 @@ BEGIN
     # transform all unused recovery tokens into used
     UPDATE `recovery_tokens`
     SET recovery_tokens.isUsed = 1
-    WHERE recovery_tokens.isUsed = 0;
+    WHERE   recovery_tokens.isUsed = 0 AND
+            recovery_tokens.AccountID = vAccountID;
 
     # handle catch constraints violations
     INSERT INTO `recovery_tokens`
-        (AccountID, Token )
-    VALUES  (vAccountID, Token);
+        ( AccountID, Token )
+        VALUES  (vAccountID, pToken);
     RETURN vUserFullName;
 END//
 
@@ -2248,7 +2239,7 @@ CREATE FUNCTION `GetUserFullNameByAccountID`
     (   `pAccountID` INT(11))   RETURNS VARCHAR(255) charset utf8
 NO SQL
 BEGIN
-    DECLARE vUserFullName VARCHAR(255);
+    DECLARE vUserFullName VARCHAR(255) charset utf8;
     DECLARE vChecker INT DEFAULT -1;
 
     SELECT students.ID As ID, CONCAT(students.LastName,' ',students.FirstName,' ',students.SecondName) As UserName
diff --git a/~dev_rating/media/js/discipline/EditStudents.js b/~dev_rating/media/js/discipline/EditStudents.js
index 1e4e653dcecf97d33d01a7157ab5052c766aa98e..333cc1a6a982ec4c168e4d8c559cf8ee589fb395 100644
--- a/~dev_rating/media/js/discipline/EditStudents.js
+++ b/~dev_rating/media/js/discipline/EditStudents.js
@@ -91,7 +91,8 @@ $(function() {
             },
             function(searchResult){
                 var searchResult = $.parseJSON(searchResult);
-                var i = 0;
+                console.log(searchResult);
+                var i = -1;
                 jSearchResult.html("");
                 var jClone = jSearchResult.clone();
 
@@ -112,7 +113,7 @@ $(function() {
                     jCurGroup.append(jTempStudent);
                 }
 
-                if (i <= 0) {
+                if (searchResult.length <= 0) {
                     jSearchResult.append(jStudentEmptyPrototype.clone());
                 } else {
                     jSearchResult.replaceWith(jClone);
diff --git a/~dev_rating/media/js/rating.js b/~dev_rating/media/js/rating.js
index dd5740410a2ecf72f519cc796ac01af0382b5dbe..d8539aea6d68c82460daf59f5d05f9590195625c 100644
--- a/~dev_rating/media/js/rating.js
+++ b/~dev_rating/media/js/rating.js
@@ -188,6 +188,9 @@ $(function() {
         var newRate = 0;
         if (jThis.children("input").val() !== "")
             newRate = parseInt(jThis.children("input").val());
+        if (newRate == oldRate)
+            return;
+
         var rateResult = newRate;
 
         // считаем баллы по строке
@@ -321,20 +324,8 @@ $(function() {
 
     $(".commonCell").focusout(function(){
         g_isFocusCell = false;
-        var newRate = 0;
-
-        //alert(123);
-        if ($(this).children("input").val() !== "")
-        {
-            
-            newRate = parseInt($(this).children("input").val());
-
-            if (newRate != oldRate)
-            {
-                Rating($(this), oldRate);
-            }
-        }
-
+        Rating($(this), oldRate);
+        
         TdUnFocus();
         UnsetTdInfo($(this));
         controlRowVisualization($(this).parent());