diff --git a/db/migrations/stored/R__functions.sql b/db/migrations/stored/R__functions.sql
index 85b866306b9b8c493b7c3cc4b6f896eae05e4d86..e5230b72ce0a80e7a1184de8d243e9f7dd28e9f2 100644
--- a/db/migrations/stored/R__functions.sql
+++ b/db/migrations/stored/R__functions.sql
@@ -162,33 +162,36 @@ DROP FUNCTION IF EXISTS CreateGroup//
 CREATE FUNCTION CreateGroup (
     pGradeID INT,
     pGroupNum INT,
-    pSpecializationID INT,
-    pGroupName VARCHAR(50) CHARSET utf8,
+    pSpecName VARCHAR(200) CHARSET utf8,
+    pFacultyID INT,
     pYear INT
 ) RETURNS int(11) # group id
 NO SQL
 BEGIN
-    DECLARE vGroupID, vFacultyID, vGroupYear, vIsSpecMatch INT DEFAULT -1;
+    DECLARE vGroupID, vSpecId, vGroupYear, vIsSpecMatch INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    SET vFacultyID = (SELECT FacultyID FROM specializations WHERE specializations.ID = pSpecializationID LIMIT 1);
+    # create specialization
+    INSERT INTO specializations (Name, Abbr, FacultyID) VALUES  (pSpecName, NULL, pFacultyID)
+    ON DUPLICATE KEY UPDATE
+        specializations.ID = LAST_INSERT_ID(specializations.ID);
+    SET vSpecId = LAST_INSERT_ID();
 
-    # create discipline
-    INSERT INTO study_groups (GradeID, GroupNum, FacultyID) VALUES (pGradeID, pGroupNum, vFacultyID)
+    # create group
+    INSERT INTO study_groups (GradeID, GroupNum, FacultyID) VALUES (pGradeID, pGroupNum, pFacultyID)
         ON DUPLICATE KEY UPDATE
             study_groups.ID = LAST_INSERT_ID(study_groups.ID);
     SET vGroupID = LAST_INSERT_ID();
 
-    SELECT groups_years.GroupID, (groups_years.SpecializationID = pSpecializationID AND
-                                  (pGroupName IS NULL OR groups_years.Name <=> pGroupName))
+    SELECT groups_years.GroupID, groups_years.SpecializationID = vSpecId
         INTO vGroupYear, vIsSpecMatch
         FROM groups_years
         WHERE groups_years.GroupID = vGroupID AND groups_years.Year = pYear
         LIMIT 1;
 
     IF vGroupYear = -1 THEN
-        INSERT INTO groups_years (GroupID, Year, SpecializationID, Name)
-        VALUES (vGroupID, pYear, pSpecializationID, pGroupName);
+        INSERT INTO groups_years (GroupID, Year, SpecializationID)
+        VALUES (vGroupID, pYear, vSpecId);
     ELSEIF NOT vIsSpecMatch THEN
         RETURN -1;
     END IF;
@@ -719,18 +722,12 @@ CREATE FUNCTION CreateStudentEx (
 )   RETURNS int(11)
 NO SQL
 BEGIN
-    DECLARE vAccountID, vGradeID, vSpecID, vGroupID, vYear INT DEFAULT -1;
+    DECLARE vGradeID, vGroupID, vYear INT DEFAULT -1;
     DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN -1;
 
-    # get specialization id
-    INSERT INTO specializations (Name, Abbr, FacultyID) VALUES  (pSpecName, NULL, pFacultyID)
-        ON DUPLICATE KEY UPDATE
-            specializations.ID = LAST_INSERT_ID(specializations.ID);
-    SET vSpecID = LAST_INSERT_ID();
-
     SET vYear = COALESCE((SELECT Year FROM semesters WHERE semesters.ID = pSemesterID LIMIT 1), -1);
     SET vGradeID = CreateGrade(pGradeNum, pDegree);
-    SET vGroupID = CreateGroup(vGradeID, pGroupNum, vSpecID, NULL, vYear);
+    SET vGroupID = CreateGroup(vGradeID, pGroupNum, pSpecName, pFacultyID, vYear);
     RETURN CreateStudent(pLastName, pFirstName, pSecondName, vGroupID, pActivationCode, pSemesterID);
 END //
 
diff --git a/~dev_rating/application/classes/Controller/Api/V0/Student.php b/~dev_rating/application/classes/Controller/Api/V0/Student.php
index 29e32c19d9fd2aff0ef530ba538428ee66abb9ba..59fedd5837036db1038f1bdeda2ae17943d2c1d6 100644
--- a/~dev_rating/application/classes/Controller/Api/V0/Student.php
+++ b/~dev_rating/application/classes/Controller/Api/V0/Student.php
@@ -167,7 +167,14 @@ class Controller_Api_V0_Student extends Controller_Handler_Api {
                     throw new InvalidArgumentException('RecordBook: grade not found');
                 }
 
-                $group = Model_Group::find($gradeID, $recordBookData->group, $recordBookData->facultyID);
+                $speciality = $recordBookData->speciality;
+                if (strpos($speciality, ' - ') == 8) {
+                    $speciality = substr($speciality, 11);
+                }
+
+                $year = Model_Plan::load($recordBookData->planID)->Year;
+
+                $group = Model_Group::findOrCreate($gradeID, $recordBookData->group, $speciality, $recordBookData->facultyID, $year);
                 if (is_null($group)) {
                     throw new InvalidArgumentException('RecordBook: group not found');
                 }
diff --git a/~dev_rating/application/classes/Model/Group.php b/~dev_rating/application/classes/Model/Group.php
index f4c759360b5649b297d60e815dd6a724f01baf38..e7d65539e0eeb9f805bfa326d4af221752350f51 100644
--- a/~dev_rating/application/classes/Model/Group.php
+++ b/~dev_rating/application/classes/Model/Group.php
@@ -14,12 +14,14 @@ class Model_Group extends Model
         return $g;
     }
 
-    public static function find($gradeID, $groupNum, $facultyID) {
-        $sql = 'SELECT `FindGroup`(:gradeID, :groupNum, :facultyID) AS `ID`';
+    public static function findOrCreate($gradeID, $groupNum, $specialization, $facultyID, $year) {
+        $sql = 'SELECT `CreateGroup`(:gradeID, :groupNum, :specialization, :facultyID, :year) AS `ID`';
         $id = DB::query(Database::SELECT, $sql)
             ->param(':gradeID', $gradeID)
             ->param(':groupNum', $groupNum)
+            ->param(':specialization', $specialization)
             ->param(':facultyID', $facultyID)
+            ->param(':year', $year)
             ->execute()->get('ID');
         if ($id <= 0) {
             return null;