diff --git a/admin/tool/profiling/styles.css b/admin/tool/profiling/styles.css
index 03ec2af301b..4025312cd89 100644
--- a/admin/tool/profiling/styles.css
+++ b/admin/tool/profiling/styles.css
@@ -16,9 +16,6 @@
 .path-admin-tool-profiling .flexible .referencerun {
     font-weight: bold;
 }
-.path-admin-tool-profiling .flexible .r1 .cell {
-    background-color: whitesmoke;
-}
 .path-admin-tool-profiling .flexible {
     margin-left:auto;
     margin-right:auto
diff --git a/grade/tests/behat/grade_UI_settings.feature b/grade/tests/behat/grade_UI_settings.feature
index ee6ec76391d..33ce5b3b58d 100644
--- a/grade/tests/behat/grade_UI_settings.feature
+++ b/grade/tests/behat/grade_UI_settings.feature
@@ -48,11 +48,11 @@ Feature: Site settings can be used to hide parts of the gradebook UI
 
   @javascript
   Scenario: Disable category overriding
-    And ".r1 .course input[type='text']" "css_element" should exist
+    And "tr .course input[type='text']" "css_element" should exist
     Then I navigate to "Grade category settings" node in "Site administration > Grades"
     And I click on "Allow category grades to be manually overridden" "checkbox"
     And I press "Save changes"
     And I follow "Home"
     And I follow "Course 1"
     And I follow "Grades"
-    And ".r0 .course input[type='text']" "css_element" should not exist
+    And "tr .course input[type='text']" "css_element" should not exist
diff --git a/lib/outputcomponents.php b/lib/outputcomponents.php
index 3a2e70a310f..ececc4a7649 100644
--- a/lib/outputcomponents.php
+++ b/lib/outputcomponents.php
@@ -1447,9 +1447,6 @@ class html_writer {
      * method. In most cases this is not an issue at all so we do not clone by default for performance
      * and memory consumption reasons.
      *
-     * Please do not use .r0/.r1 for css, as they will be removed in Moodle 2.9.
-     * @todo MDL-43902 , remove r0 and r1 from tr classes.
-     *
      * @param html_table $table data to be rendered
      * @return string HTML code
      */
@@ -1579,7 +1576,6 @@ class html_writer {
         }
 
         if (!empty($table->data)) {
-            $oddeven    = 1;
             $keys       = array_keys($table->data);
             $lastrowkey = end($keys);
             $output .= html_writer::start_tag('tbody', array());
@@ -1601,12 +1597,10 @@ class html_writer {
                         $row = $newrow;
                     }
 
-                    $oddeven = $oddeven ? 0 : 1;
                     if (isset($table->rowclasses[$key])) {
                         $row->attributes['class'] .= ' ' . $table->rowclasses[$key];
                     }
 
-                    $row->attributes['class'] .= ' r' . $oddeven;
                     if ($key == $lastrowkey) {
                         $row->attributes['class'] .= ' lastrow';
                     }
@@ -2077,9 +2071,7 @@ class html_table {
 
     /**
      * @var array Array of classes to add to particular rows, space-separated string.
-     * Classes 'r0' or 'r1' are added automatically for every odd or even row,
-     * respectively. Class 'lastrow' is added automatically for the last row
-     * in the table.
+     * Class 'lastrow' is added automatically for the last row in the table.
      *
      * Example of usage:
      * $t->rowclasses[9] = 'tenth'
diff --git a/lib/tablelib.php b/lib/tablelib.php
index 426731560b0..2e6960f7730 100644
--- a/lib/tablelib.php
+++ b/lib/tablelib.php
@@ -1016,9 +1016,6 @@ class flexible_table {
 
     /**
      * This function is not part of the public api.
-     *
-     * Please do not use .r0/.r1 for css, as they will be removed in Moodle 2.9.
-     * @todo MDL-43902 , remove r0 and r1 from tr classes.
      */
     function print_row($row, $classname = '') {
         echo $this->get_row_html($row, $classname);
@@ -1034,8 +1031,7 @@ class flexible_table {
      */
     public function get_row_html($row, $classname = '') {
         static $suppress_lastrow = NULL;
-        $oddeven = $this->currentrow % 2;
-        $rowclasses = array('r' . $oddeven);
+        $rowclasses = array();
 
         if ($classname) {
             $rowclasses[] = $classname;
diff --git a/lib/tests/html_writer_test.php b/lib/tests/html_writer_test.php
index bf6ecee5ca8..43f1ece2ee2 100644
--- a/lib/tests/html_writer_test.php
+++ b/lib/tests/html_writer_test.php
@@ -206,7 +206,7 @@ class core_html_writer_testcase extends basic_testcase {
 
         $expected = <<<EOF
 <table class="generaltable" id="Jeffrey" data-name="Colin">
-<tbody><tr class="r0 lastrow" id="Bob" data-name="Fred">
+<tbody><tr class="lastrow" id="Bob" data-name="Fred">
 <td class="cell c0 lastcol" id="Jeremy" data-name="John" style=""></td>
 </tr>
 </tbody>
diff --git a/lib/tests/tablelib_test.php b/lib/tests/tablelib_test.php
index dba5b3ae9bf..4a59e444c0e 100644
--- a/lib/tests/tablelib_test.php
+++ b/lib/tests/tablelib_test.php
@@ -361,7 +361,10 @@ class core_tablelib_testcase extends basic_testcase {
         $table->define_columns($columns);
         $table->define_headers($headers);
         $table->define_baseurl('/invalid.php');
+
         $row = $table->get_row_html($data);
         $this->assertRegExp('/row 0 col 0/', $row);
+        $this->assertRegExp('/<tr class=""/', $row);
+        $this->assertRegExp('/<td class="cell c0"/', $row);
     }
 }
diff --git a/mod/workshop/allocation/manual/styles.css b/mod/workshop/allocation/manual/styles.css
index 39141869607..df2a21e8b5e 100644
--- a/mod/workshop/allocation/manual/styles.css
+++ b/mod/workshop/allocation/manual/styles.css
@@ -6,12 +6,12 @@
     margin: 0px auto;
 }
 
-.path-mod-workshop .manual-allocator .allocations .r0 {
+.path-mod-workshop .manual-allocator .allocations tbody tr:nth-of-type(odd) {
     background-color: #eee;
 }
 
-.path-mod-workshop .manual-allocator .allocations .r0.highlightreviewerof,
-.path-mod-workshop .manual-allocator .allocations .r0.highlightreviewedby {
+.path-mod-workshop .manual-allocator .allocations tbody tr:nth-of-type(odd).highlightreviewerof,
+.path-mod-workshop .manual-allocator .allocations tbody tr:nth-of-type(odd).highlightreviewedby {
     background-color: inherit;
 }
 
diff --git a/report/outline/tests/behat/outline.feature b/report/outline/tests/behat/outline.feature
index ffcea0f8cc3..65ef7f60ba1 100644
--- a/report/outline/tests/behat/outline.feature
+++ b/report/outline/tests/behat/outline.feature
@@ -49,8 +49,8 @@ Feature: View an outline report
     And I log in as "teacher1"
     And I follow "Course 1"
     When I navigate to "Activity report" node in "Course administration > Reports"
-    Then I should see "2" in the "//tr[contains(concat(' ', normalize-space(@class),' '),' r0 ')]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
-    And I should see "1" in the "//tr[contains(concat(' ', normalize-space(@class),' '),' r1 ')]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
+    Then I should see "2" in the "//tbody/tr[(position() mod 2)=1]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
+    And I should see "1" in the "//tbody/tr[(position() mod 2)=0]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
 
   @javascript
   Scenario: View the outline report when only the standard log reader is enabled
@@ -71,8 +71,8 @@ Feature: View an outline report
     And I log in as "admin"
     And I follow "Course 1"
     When I navigate to "Activity report" node in "Course administration > Reports"
-    Then I should see "2" in the "//tr[contains(concat(' ', normalize-space(@class),' '),' r0 ')]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
-    And I should see "1" in the "//tr[contains(concat(' ', normalize-space(@class),' '),' r1 ')]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
+    Then I should see "2" in the "//tbody/tr[(position() mod 2)=1]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
+    And I should see "1" in the "//tbody/tr[(position() mod 2)=0]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
 
   @javascript
   Scenario: View the outline report when both the standard and legacy log readers are enabled
@@ -95,8 +95,8 @@ Feature: View an outline report
     And I log in as "teacher1"
     And I follow "Course 1"
     When I navigate to "Activity report" node in "Course administration > Reports"
-    Then I should see "2" in the "//tr[contains(concat(' ', normalize-space(@class),' '),' r0 ')]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
-    And I should see "1" in the "//tr[contains(concat(' ', normalize-space(@class),' '),' r1 ')]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
+    Then I should see "2" in the "//tbody/tr[(position() mod 2)=1]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
+    And I should see "1" in the "//tbody/tr[(position() mod 2)=0]/child::td[contains(concat(' ', normalize-space(@class),' '),' numviews ')]" "xpath_element"
 
   @javascript
   Scenario: View the outline report when no log reader is enabled
diff --git a/theme/upgrade.txt b/theme/upgrade.txt
index 8c9d3768232..66045456fe4 100644
--- a/theme/upgrade.txt
+++ b/theme/upgrade.txt
@@ -18,15 +18,15 @@ information provided here is intended especially for theme designer.
 
 * CSS related functions in theme class and csslib.php were refactored, addons that are
   using this private API need to be updated
-* Please update your css to use 'tr:nth-of-type(odd/even)' instead of '.ro/.r1' to apply tr specific css for various tables.
+* Please update your css to use 'tr:nth-of-type(odd/even)' instead of '.r0/.r1' to apply tr specific css for various tables.
   These classes are deprecated now and will be removed in Moodle 2.9. This has done to better support styling tables that will be altered by JavaScript.
   Here is an example to update your css:
   Old code:
     table.generaltable .r0 {background-color: #F0F0F0;}
     table.generaltable .r1 {background-color: #F0F0F0;}
   New code:
-    table.generaltable > tbody > tr:nth-of-type(odd) {background-color: #F0F0F0;}
     table.generaltable > tbody > tr:nth-of-type(even) {background-color: #F0F0F0;}
+    table.generaltable > tbody > tr:nth-of-type(odd) {background-color: #F0F0F0;}
 
 Removed themes:
 * afterburner, anomaly, arialist, binarius, boxxie, brick, formal_white, formfactor, fusion, leatherbound,