diff --git a/~dev_rating/application/classes/Controller/Student/Subject.php b/~dev_rating/application/classes/Controller/Student/Subject.php
index d95e98ed28051a2cc88c69a07f4524249c5b92f4..7e70d47ccd551b45a623ea9008a1f8b423df7c29 100644
--- a/~dev_rating/application/classes/Controller/Student/Subject.php
+++ b/~dev_rating/application/classes/Controller/Student/Subject.php
@@ -7,10 +7,13 @@ class Controller_Student_Subject extends Controller_Environment_Student
         $discipline = Model_Discipline::load($id);
         $rates = Model_Rating::getRates($id, $this->user->StudentID);
 
+        $map = self::generateDisciplineMapFrom($rates);
+        
         $this->twig->set([
             'Discipline'    => $discipline,
             'Teachers'      => self::getTeachersListOf($discipline),
-            'DisciplineMap' => self::generateDisciplineMapFrom($rates),
+            'DisciplineMap' => $map['Modules'],
+            'Submodules'    => $map['Submodules'],
             'Semester'      => Model_Semesters::load($discipline->SemesterID),
         ])->set_filename(static::STUDENT . 'subject');
     }
@@ -27,17 +30,14 @@ class Controller_Student_Subject extends Controller_Environment_Student
     }
 
     private static function generateDisciplineMapFrom(Database_Result $rates) {
-        $id = 0;                   # not sure, what it is about :(
-        $sRate = 0;                # completely legacy code, baby
-        $sMaxRate = 0;
+        $disMap = [];              # not sure, what it is about :(
+        $examRate = 0;             # completely legacy code, baby
         $extraRate = 0;
         $bonusRate = 0;
         $bonusMaxRate = 0;
-        $examRate = 0;
         $examMaxRate = 0;
-        $disMap = array();
-        $modulesCount = 0;
         $disMap['Extra']['Rate'] = 0;
+        $submodules = [];
 
         foreach ($rates as $row) {
             switch ($row['ModuleType']) {
@@ -72,46 +72,28 @@ class Controller_Student_Subject extends Controller_Environment_Student
                     break;
 
                 default:
-                    $sRate += (int)$row['Rate'];
-                    $sMaxRate += (int)$row['MaxRate'];
+                    $id = $row['ModuleID'];
+                    $module =& $disMap['Modules'][$id];
 
-                    if ($row['ModuleID'] != $id) {
-                        $id = $row['ModuleID'];
-                        $modulesCount++;
-                    }
+                    $module['Title'] = $row['ModuleName'];
+                    $module['Submodules'][] = $row['SubmoduleID'];
 
-                    $module =& $disMap['Modules'][$modulesCount];
-
-                    if (!isset($module['SubmodulesCount'])) {
-                        $module['Rate'] = 0;
-                        $module['MaxRate'] = 0;
-                        $module['SubmodulesCount'] = 0;
-                    }
-
-                    $module['Title']    = $row['ModuleName'];
-                    $module['Rate']     += (int)$row['Rate'];
-                    $module['MaxRate']  += (int)$row['MaxRate'];
-                    $module['SubmodulesCount']++;
-
-                    $module['Submodules'][] = array(
+                    $submodules[$row['SubmoduleID']] = [
                         'Date'        => $row['Date'],
                         'Title'       => $row['SubmoduleName'],
                         'Description' => $row['SubmoduleDescription'],
-                        'Rate'        => (int)$row['Rate'],
-                        'MaxRate'     => (int)$row['MaxRate'],
-                    );
+                        'Rate'        => $row['Rate'],
+                        'MaxRate'     => $row['MaxRate'],
+                    ];
             }
         }
-        $disMap['ModulesCount'] = $modulesCount;
 
-        $disMap['SemesterRate'] = (int)$sRate;
-        $disMap['SemesterMaxRate'] = (int)$sMaxRate;
         $disMap['ExamRate'] = (int)$examRate;
         $disMap['ExamMaxRate'] = (int)$examMaxRate;
         $disMap['BonusRate'] = (int)$bonusRate;
         $disMap['BonusMaxRate'] = (int)$bonusMaxRate;
         $disMap['ExtraRate'] = (int)$extraRate;
 
-        return $disMap;
+        return ['Modules' => $disMap, 'Submodules' => $submodules];
     }
-}
\ No newline at end of file
+}
diff --git a/~dev_rating/application/views/student/subject.twig b/~dev_rating/application/views/student/subject.twig
index 2b50c6a2e679f8578d2782c022877dd8d1f373d3..8e0a0b3665cb12181b5a54d219f0d56fdedd9f80 100644
--- a/~dev_rating/application/views/student/subject.twig
+++ b/~dev_rating/application/views/student/subject.twig
@@ -63,22 +63,18 @@
                         {% set SecondConjuction = ' Рё' %}
                     {% endif %}
                 {% endif %}
-
-                {% if Discipline.Lectures %}
-                    {{ Discipline.Lectures }}
-                    {{ Rus.NumEnding(Discipline.Lectures, ['час', 'часа', 'часов']) }}
-                    теории{{ FirstConjuction }}
-                {% endif %}
-                {% if Discipline.Practice %}
-                    {{ Discipline.Practice }}
-                    {{ Rus.NumEnding(Discipline.Practice, ['час', 'часа', 'часов']) }}
-                    практики{{ SecondConjuction }}
-                {% endif %}
-                {% if Discipline.Labs %}
-                    {{ Discipline.Labs }}
-                    {{ Rus.NumEnding(Discipline.Labs, ['час', 'часа', 'часов']) }}
-                    лабораторных занятий
-                {% endif %}
+                
+                {% set Hours = [
+                    { Type: 'Lectures', Text: 'теории' ~ FirstConjuction },
+                    { Type: 'Practice', Text: 'практики' ~ SecondConjuction },
+                    { Type: 'Labs',     Text: 'лабораторных занятий' }
+                ] %}
+                
+                {% for Hour in Hours if Discipline[Hour.Type] %}
+                    {{ Discipline[Hour.Type] }}
+                    {{ Rus.NumEnding(Discipline[Hour.Type], ['час', 'часа', 'часов']) }}
+                    {{ Hour.Text }}
+                {% endfor %}
 
             </div>
         </div>
@@ -86,44 +82,51 @@
 
     <h3 class="blockTitle">Баллы за семестр</h3>
 
+    {% set SemesterRate = 0 %}
+    {% set SemesterMaxRate = 0 %}
+    
     <div class="blockMargin">
     {% for Module in DisciplineMap.Modules %}
+        {% set ModuleRate = 0 %}
+        {% set ModuleMaxRate = 0 %}
+        
         <div class="tableTitle Module">
             {{ Module.Title|default('Модуль ' ~ loop.index) }}
         </div>
-        {% for Submodule in Module.Submodules %}
+        {% for SubmoduleID in Module.Submodules %}
+            {% set Submodule = Submodules[SubmoduleID] %}
             <div class="submoduleBlock">
-                <div class="submoduleTitle">{{ Submodule.Title|default('Мероприятие ' ~ loop.index) }}</div>
+                <div class="submoduleTitle">
+                    {{ Submodule.Title|default('Мероприятие ' ~ loop.index) }}
+                </div>
                 <div class="submoduleRate">
-                    {{ Submodule.Rate }} / {{ Submodule.MaxRate }}
+                    {{ +Submodule.Rate }} / {{ +Submodule.MaxRate }}
+                    {% set ModuleRate = ModuleRate + Submodule.Rate %}
                 </div>
                 <div class="submodulePercent">
-                    {% if Submodule.MaxRate <= 0 %}
-                        —
-                    {% else %}
-                        {{ (Submodule.Rate  * 100) // Submodule.MaxRate }} %
-                    {% endif %}
+                    {{ Submodule.MaxRate ? (Submodule.Rate * 100) // Submodule.MaxRate ~ ' %' : '—' }}
+                    {% set ModuleMaxRate = ModuleMaxRate + Submodule.MaxRate %}
                 </div>
                 <div class="submoduleDate">
-                    {% if Submodule.Date != 0 %}
-                        {{ Submodule.Date|date('d.m.Y') }}
-                    {% else %}
-                        —
-                    {% endif %}
+                    {{ Submodule.Date ? Submodule.Date|date('d.m.Y') : '—' }}
                 </div>
             </div>
+            
             {% if loop.last %}
                 <div class="moduleResult">
-                    Итого за модуль: {{ Module.Rate }} / {{ Module.MaxRate }}
+                    Итого за модуль: {{ ModuleRate }} / {{ ModuleMaxRate }}
+                    {% set SemesterRate = SemesterRate + ModuleRate %}
+                    {% set SemesterMaxRate = SemesterMaxRate + ModuleMaxRate %}
                 </div>
             {% endif %}
         {% endfor %}
     {% endfor %}
     </div>
+    
     {% if Discipline.Type == 'exam' %}
     <h3 class="blockTitle">Допуск к экзамену</h3>
     <div class="blockMargin">
-        {% set Admission = 38 - (DisciplineMap.SemesterRate + DisciplineMap.Extra.Rate) %}
+        {% set Admission = 38 - (SemesterRate + DisciplineMap.Extra.Rate) %}
         {% if Admission > 0 %}
             Для допуска к экзамену Вам необходимо получить еще {{ Admission }} {{ Rus.NumEnding(Admission, ['балл', 'балла', 'баллов']) }}.
         {% else %}
@@ -142,7 +145,7 @@
     </div>
 
     <div class="Middle totalRate">
-        Промежуточный итог: {{ DisciplineMap.SemesterRate + DisciplineMap.ExtraRate }} / {{ DisciplineMap.SemesterMaxRate }}
+        Промежуточный итог: {{ SemesterRate + DisciplineMap.ExtraRate }} / {{ SemesterMaxRate }}
     </div>
 
     <h3 class="blockTitle">Экзамен</h3>
@@ -188,17 +191,14 @@
     </div>
 
     <div class="Final totalRate">
-        {% set Rating = DisciplineMap.SemesterRate + DisciplineMap.Extra.Rate + DisciplineMap.Bonus.Rate + DisciplineMap.Exam.Rate %}
-        {% if Rating > 100 %}
-            {% set Rating = 100 %}
-        {% endif %}
-        Итоговый рейтинг: {{ Rating }} / 100
+        {% set Rating = SemesterRate + DisciplineMap.Extra.Rate + DisciplineMap.Bonus.Rate + DisciplineMap.Exam.Rate %}
+        Итоговый рейтинг: {{ min(Rating, 100) }} / 100
     </div>
 
     {% elseif Discipline.Type == 'credit' %}
         <h3 class="blockTitle">Зачет</h3>
         <div class="blockMargin">
-            {% set Admission = 60 - (DisciplineMap.SemesterRate + DisciplineMap.Extra.Rate) %}
+            {% set Admission = 60 - (SemesterRate + DisciplineMap.Extra.Rate) %}
             {% if Admission > 0 %}
                 Для получения зачета необходимо набрать ещё {{ Admission }} {{ Rus.NumEnding(Admission, ['балл', 'балла', 'баллов']) }}.
             {% else %}
@@ -241,11 +241,8 @@
         </div>
 
         <div class="Final totalRate">
-            {% set Rating = DisciplineMap.SemesterRate + DisciplineMap.Extra.Rate + DisciplineMap.Bonus.Rate %}
-            {% if Rating > 100 %}
-                {% set Rating = 100 %}
-            {% endif %}
-            Итоговый рейтинг: {{ Rating }} / 100
+            {% set Rating = SemesterRate + DisciplineMap.Extra.Rate + DisciplineMap.Bonus.Rate %}
+            Итоговый рейтинг: {{ min(Rating, 100) }} / 100
         </div>
     {% endif %}
-{% endblock %}
\ No newline at end of file
+{% endblock %}