From efa8618efa42d6dbe7e3e4d4303e681685ed8c3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Mon, 3 Sep 2018 13:29:20 +0200
Subject: [PATCH 01/16] MOBILE-2567 chat: Add margin bottom when keyboard is
 open

---
 src/addon/messages/pages/discussion/discussion.html      | 2 +-
 src/addon/mod/chat/pages/chat/chat.html                  | 2 +-
 src/app/app.scss                                         | 4 +++-
 src/components/tabs/tabs.scss                            | 1 +
 src/core/emulator/pages/capture-media/capture-media.html | 2 +-
 5 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/addon/messages/pages/discussion/discussion.html b/src/addon/messages/pages/discussion/discussion.html
index 1c7b2e325..89bd5a6be 100644
--- a/src/addon/messages/pages/discussion/discussion.html
+++ b/src/addon/messages/pages/discussion/discussion.html
@@ -12,7 +12,7 @@
         </a>
     </core-navbar-buttons>
 </ion-header>
-<ion-content>
+<ion-content class="has-footer">
     <core-loading [hideUntil]="loaded">
         <!-- Load previous messages. -->
         <ion-infinite-scroll [enabled]="canLoadMore" (ionInfinite)="loadPrevious($event)" position="top">
diff --git a/src/addon/mod/chat/pages/chat/chat.html b/src/addon/mod/chat/pages/chat/chat.html
index fbdf3bce1..c440dce08 100644
--- a/src/addon/mod/chat/pages/chat/chat.html
+++ b/src/addon/mod/chat/pages/chat/chat.html
@@ -8,7 +8,7 @@
         </ion-buttons>
     </ion-navbar>
 </ion-header>
-<ion-content>
+<ion-content  class="has-footer">
     <core-loading [hideUntil]="loaded">
         <div aria-live="polite">
             <div *ngFor="let message of messages; index as index; last as last">
diff --git a/src/app/app.scss b/src/app/app.scss
index 59e4bfb88..5df6a8ce9 100644
--- a/src/app/app.scss
+++ b/src/app/app.scss
@@ -919,8 +919,10 @@ ion-app.app-root {
 }
 
 body.keyboard-is-open {
-  .scroll-content, .fixed-content {
+  ion-content:not(.has-footer) {
+    > .scroll-content, > .fixed-content {
       margin-bottom: 0 !important;
+    }
   }
 
   core-ion-tabs .tabbar {
diff --git a/src/components/tabs/tabs.scss b/src/components/tabs/tabs.scss
index 92429699d..b39c0f89e 100644
--- a/src/components/tabs/tabs.scss
+++ b/src/components/tabs/tabs.scss
@@ -26,6 +26,7 @@ ion-app.app-root .core-tabs-bar {
             word-wrap: break-word;
             display: block;
             width: 100%;
+            line-height: 1.2em;
         }
 
         &[aria-selected=true] {
diff --git a/src/core/emulator/pages/capture-media/capture-media.html b/src/core/emulator/pages/capture-media/capture-media.html
index 8ea643e22..60e2c6dd2 100644
--- a/src/core/emulator/pages/capture-media/capture-media.html
+++ b/src/core/emulator/pages/capture-media/capture-media.html
@@ -11,7 +11,7 @@
         </ion-buttons>
     </ion-navbar>
 </ion-header>
-<ion-content>
+<ion-content  class="has-footer">
     <core-loading [hideUntil]="readyToCapture">
         <div class="core-av-wrapper">
             <!-- Video stream for image and video. -->

From 36fac6c00fd744ecba4e83d42b092f59faccd5cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Mon, 3 Sep 2018 14:00:20 +0200
Subject: [PATCH 02/16] MOBILE-2567 assignment: Style users who need to submit

---
 .../components/submission/addon-mod-assign-submission.html  | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/addon/mod/assign/components/submission/addon-mod-assign-submission.html b/src/addon/mod/assign/components/submission/addon-mod-assign-submission.html
index ba7f9c590..f8d03552a 100644
--- a/src/addon/mod/assign/components/submission/addon-mod-assign-submission.html
+++ b/src/addon/mod/assign/components/submission/addon-mod-assign-submission.html
@@ -112,15 +112,15 @@
                 <ion-item text-wrap *ngIf="membersToSubmit && membersToSubmit.length > 0">
                     <h2>{{ 'addon.mod_assign.userswhoneedtosubmit' | translate: {$a: ''} }}</h2>
                     <div *ngFor="let user of membersToSubmit">
-                        <a *ngIf="user.fullname" (click)="openUserProfile(user.id)" [title]="user.fullname">
+                        <a ion-item text-wrap *ngIf="user.fullname" (click)="openUserProfile(user.id)" [title]="user.fullname">
                             <ion-avatar item-start>
                                 <img [src]="user.profileimageurl" core-external-content [alt]="'core.pictureof' | translate:{$a: user.fullname}" role="presentation" onError="this.src='assets/img/user-avatar.png'">
                             </ion-avatar>
                             <h2>{{ user.fullname }}</h2>
                         </a>
-                        <p *ngIf="!user.fullname">
+                        <ion-item text-wrap *ngIf="!user.fullname">
                             {{ 'addon.mod_assign.hiddenuser' | translate }} <core-format-text [text]="user"></core-format-text>
-                        </p>
+                        </ion-item>
                     </div>
                 </ion-item>
 

From cc20483ae547e669e557f248406dbfbd99b5e755 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Mon, 3 Sep 2018 16:02:36 +0200
Subject: [PATCH 03/16] MOBILE-2567 sites: add more padding on icon only
 buttons

---
 src/app/app.scss | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/app/app.scss b/src/app/app.scss
index 5df6a8ce9..08adcea53 100644
--- a/src/app/app.scss
+++ b/src/app/app.scss
@@ -396,6 +396,12 @@ ion-app.app-root {
     }
   }
 
+  .item .item-button[icon-only] {
+      height: 2.8em;
+      font-size: 1.6rem;
+      padding: 0 3px;
+  }
+
   // Ionic fix. Button can occupy all page if not.
   ion-select {
     position: relative;

From 6f11b7df8c83934c2e2c29bdca61c0814c7abed6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Mon, 3 Sep 2018 16:38:15 +0200
Subject: [PATCH 04/16] MOBILE-2567 mainmenu: Fix my courses button menu

---
 src/core/mainmenu/pages/menu/menu.scss | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/core/mainmenu/pages/menu/menu.scss b/src/core/mainmenu/pages/menu/menu.scss
index ae7a4fcbc..2fa0db196 100644
--- a/src/core/mainmenu/pages/menu/menu.scss
+++ b/src/core/mainmenu/pages/menu/menu.scss
@@ -6,11 +6,15 @@ ion-app.app-root page-core-mainmenu {
     .ion-fa-graduation-cap {
         @extend .fa-graduation-cap;
         @extend .fa;
+        font-size: 21px;
+        height: 21px;
     }
 
     .ion-ios-fa-graduation-cap-outline {
         color: transparent;
         -webkit-text-stroke-width: 0.8px;
         -webkit-text-stroke-color: $tabs-tab-color-inactive;
+        font-size: 23px;
+        height: 23px;
     }
 }

From da6d4877c2441f032b862e4e974a943ca902057d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Mon, 3 Sep 2018 16:53:03 +0200
Subject: [PATCH 05/16] MOBILE-2567 choice: Style radio buttons for iOS

---
 src/app/app.ios.scss | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/app/app.ios.scss b/src/app/app.ios.scss
index 8684dbd18..edb7d3071 100644
--- a/src/app/app.ios.scss
+++ b/src/app/app.ios.scss
@@ -138,4 +138,22 @@ ion-app.app-root.ios {
   .card-ios.with-borders .item-ios:last-child .item-inner {
     border-bottom: 0;
   }
+
+
+  .radio-ios .radio-icon {
+    @include position(0, null, null, 0);
+    @include margin(0);
+    @include border-radius($radio-md-icon-border-radius);
+
+    position: relative;
+    display: block;
+
+    width: $checkbox-ios-icon-size;
+    height: $checkbox-ios-icon-size;
+
+    border-width: $checkbox-ios-icon-border-width;
+    border-style: $checkbox-ios-icon-border-style;
+    border-color: $checkbox-ios-icon-border-color-off;
+    background-color: $checkbox-ios-background-color-off;
+  }
 }
\ No newline at end of file

From 7ab32c7afbe7c08a27adcea5acaf95c8283e70c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 10:22:26 +0200
Subject: [PATCH 06/16] MOBILE-2567 ux: Fix more RTL rules

---
 src/addon/files/pages/list/list.html                         | 2 +-
 .../component/addon-mod-assign-feedback-comments.html        | 2 +-
 .../toc-popover/addon-mod-assign-submission-toc-popover.html | 2 +-
 .../mod/data/components/index/addon-mod-data-index.html      | 2 +-
 .../glossary/components/index/addon-mod-glossary-index.html  | 2 +-
 .../components/toc-popover/addon-mod-imscp-toc-popover.html  | 2 +-
 src/addon/mod/lesson/pages/player/player.html                | 2 +-
 src/addon/mod/lesson/pages/player/player.scss                | 5 -----
 src/addon/mod/quiz/pages/review/review.html                  | 4 ++--
 .../mod/wiki/components/index/addon-mod-wiki-index.html      | 2 +-
 src/addon/notifications/pages/list/list.html                 | 2 +-
 .../qtype/calculated/component/addon-qtype-calculated.html   | 2 +-
 .../qtype/shortanswer/component/addon-qtype-shortanswer.html | 2 +-
 src/components/timer/core-timer.html                         | 2 +-
 .../overview-events/core-courses-overview-events.html        | 4 ++--
 src/core/emulator/pages/capture-media/capture-media.html     | 2 +-
 src/core/login/pages/sites/sites.html                        | 2 +-
 17 files changed, 18 insertions(+), 23 deletions(-)

diff --git a/src/addon/files/pages/list/list.html b/src/addon/files/pages/list/list.html
index 791a6d6db..9bb3ee955 100644
--- a/src/addon/files/pages/list/list.html
+++ b/src/addon/files/pages/list/list.html
@@ -36,7 +36,7 @@
     </core-loading>
 
     <!-- Upload a private file. -->
-    <ion-fab bottom right *ngIf="showUpload && root != 'site' && !path">
+    <ion-fab bottom end *ngIf="showUpload && root != 'site' && !path">
         <button ion-fab (click)="uploadFile()" [attr.aria-label]="'core.fileuploader.uploadafile' | translate">
             <ion-icon name="add"></ion-icon>
         </button>
diff --git a/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html b/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html
index 62f3857f9..cfb780447 100644
--- a/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html
+++ b/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html
@@ -5,7 +5,7 @@
         <core-format-text [component]="component" [componentId]="assign.cmid" [maxHeight]="80" [fullOnClick]="true" [fullTitle]="plugin.name" [text]="text"></core-format-text>
     </p>
     <div item-end>
-        <div text-right>
+        <div text-end>
             <button ion-button icon-only clear *ngIf="canEdit" (click)="editComment()" color="dark">
                 <ion-icon name="create"></ion-icon>
             </button>
diff --git a/src/addon/mod/book/components/toc-popover/addon-mod-assign-submission-toc-popover.html b/src/addon/mod/book/components/toc-popover/addon-mod-assign-submission-toc-popover.html
index ed35905b6..6d3dca6f0 100644
--- a/src/addon/mod/book/components/toc-popover/addon-mod-assign-submission-toc-popover.html
+++ b/src/addon/mod/book/components/toc-popover/addon-mod-assign-submission-toc-popover.html
@@ -1,5 +1,5 @@
 <ion-list>
     <a ion-item text-wrap *ngFor="let chapter of chapters" (click)="loadChapter(chapter.id)" detail-none>
-        <p [attr.padding-start]="chapter.level == 1 ? true : null">{{chapter.title}}</p>
+        <p [attr.padding-left]="chapter.level == 1 ? true : null">{{chapter.title}}</p>
     </a>
 </ion-list>
diff --git a/src/addon/mod/data/components/index/addon-mod-data-index.html b/src/addon/mod/data/components/index/addon-mod-data-index.html
index 3d3d4e3f2..c195f2b41 100644
--- a/src/addon/mod/data/components/index/addon-mod-data-index.html
+++ b/src/addon/mod/data/components/index/addon-mod-data-index.html
@@ -92,7 +92,7 @@
 
 </core-loading>
 
-<ion-fab bottom right *ngIf="canAdd">
+<ion-fab bottom end *ngIf="canAdd">
     <button ion-fab (click)="gotoAddEntries($event)" [attr.aria-label]="'addon.mod_data.addentries' | translate">
         <ion-icon name="add"></ion-icon>
     </button>
diff --git a/src/addon/mod/glossary/components/index/addon-mod-glossary-index.html b/src/addon/mod/glossary/components/index/addon-mod-glossary-index.html
index adf3b4689..4ad1add14 100644
--- a/src/addon/mod/glossary/components/index/addon-mod-glossary-index.html
+++ b/src/addon/mod/glossary/components/index/addon-mod-glossary-index.html
@@ -61,7 +61,7 @@
             </ion-infinite-scroll>
         </core-loading>
 
-        <ion-fab bottom right *ngIf="canAdd">
+        <ion-fab bottom end *ngIf="canAdd">
             <button ion-fab (click)="openNewEntry()" [attr.aria-label]="'addon.mod_glossary.addentry' | translate">
                 <ion-icon name="add"></ion-icon>
             </button>
diff --git a/src/addon/mod/imscp/components/toc-popover/addon-mod-imscp-toc-popover.html b/src/addon/mod/imscp/components/toc-popover/addon-mod-imscp-toc-popover.html
index 4c1c9b21b..6bda8d594 100644
--- a/src/addon/mod/imscp/components/toc-popover/addon-mod-imscp-toc-popover.html
+++ b/src/addon/mod/imscp/components/toc-popover/addon-mod-imscp-toc-popover.html
@@ -1,5 +1,5 @@
 <ion-list>
     <a ion-item *ngFor="let item of items" (click)="loadItem(item.href)" detail-none [class.core-bold]="!item.href">
-        <span padding-start *ngFor="let i of getNumberForPadding(item.level)"></span>{{item.title}}
+        <span padding-left *ngFor="let i of getNumberForPadding(item.level)"></span>{{item.title}}
     </a>
 </ion-list>
diff --git a/src/addon/mod/lesson/pages/player/player.html b/src/addon/mod/lesson/pages/player/player.html
index 6bb4f6a75..a6a2c73c6 100644
--- a/src/addon/mod/lesson/pages/player/player.html
+++ b/src/addon/mod/lesson/pages/player/player.html
@@ -50,7 +50,7 @@
 
                         <!-- Short answer. -->
                         <ng-container *ngSwitchCase="'shortanswer'">
-                            <ion-input padding-start [type]="question.input.type" placeholder="{{ 'addon.mod_lesson.youranswer' | translate }}" [id]="question.input.id" [formControlName]="question.input.name" autocorrect="off" [maxlength]="question.input.maxlength">
+                            <ion-input padding-left [type]="question.input.type" placeholder="{{ 'addon.mod_lesson.youranswer' | translate }}" [id]="question.input.id" [formControlName]="question.input.name" autocorrect="off" [maxlength]="question.input.maxlength">
                             </ion-input>
                         </ng-container>
 
diff --git a/src/addon/mod/lesson/pages/player/player.scss b/src/addon/mod/lesson/pages/player/player.scss
index f492ff4b3..9e0535938 100644
--- a/src/addon/mod/lesson/pages/player/player.scss
+++ b/src/addon/mod/lesson/pages/player/player.scss
@@ -7,11 +7,6 @@ ion-app.app-root page-addon-mod-lesson-player {
 
     ion-input[padding-left] input[padding-left] {
         // Applying padding-left to the ion-input applies it twice since it's replicated in the inner input.
-        padding-left: 0;
-    }
-
-    ion-input[padding-start] input[padding-start] {
-        // Applying padding-start to the ion-input applies it twice since it's replicated in the inner input.
         @include padding(null, null, null, 0);
     }
 
diff --git a/src/addon/mod/quiz/pages/review/review.html b/src/addon/mod/quiz/pages/review/review.html
index 1d6ffb483..49670516f 100644
--- a/src/addon/mod/quiz/pages/review/review.html
+++ b/src/addon/mod/quiz/pages/review/review.html
@@ -88,12 +88,12 @@
 <!-- Arrows to go to next/previous. -->
 <ng-template #navArrows>
     <ion-row align-items-center>
-        <ion-col>
+        <ion-col text-start>
             <a ion-button icon-only color="light" *ngIf="previousPage >= 0" (click)="changePage(previousPage)" [title]="'core.previous' | translate">
                 <ion-icon name="arrow-back" md="ios-arrow-back"></ion-icon>
             </a>
         </ion-col>
-        <ion-col text-right>
+        <ion-col text-end>
             <a ion-button icon-only color="light" *ngIf="nextPage >= -1" (click)="changePage(nextPage)" [title]="'core.next' | translate">
                 <ion-icon name="arrow-forward" md="ios-arrow-forward"></ion-icon>
             </a>
diff --git a/src/addon/mod/wiki/components/index/addon-mod-wiki-index.html b/src/addon/mod/wiki/components/index/addon-mod-wiki-index.html
index 2747bb87e..ffa86beb8 100644
--- a/src/addon/mod/wiki/components/index/addon-mod-wiki-index.html
+++ b/src/addon/mod/wiki/components/index/addon-mod-wiki-index.html
@@ -73,7 +73,7 @@
 
 </core-loading>
 
-<ion-fab bottom right *ngIf="canEdit">
+<ion-fab bottom end *ngIf="canEdit">
     <button ion-fab (click)="goToNewPage()" [attr.aria-label]="'addon.mod_wiki.createpage' | translate">
         <ion-icon name="add"></ion-icon>
     </button>
diff --git a/src/addon/notifications/pages/list/list.html b/src/addon/notifications/pages/list/list.html
index b08d112f3..c75a3d715 100644
--- a/src/addon/notifications/pages/list/list.html
+++ b/src/addon/notifications/pages/list/list.html
@@ -20,7 +20,7 @@
                     <img [src]="notification.profileimageurlfrom || 'assets/img/user-avatar.png'" core-external-content [alt]="'core.pictureof' | translate:{$a: notification.userfromfullname}" role="presentation">
                 </ion-avatar>
                 <h2>{{notification.userfromfullname}}</h2>
-                <div item-end *ngIf="!notification.timeread"><ion-icon name="record" color="primary"></ion-icon></div>
+                <div item-end *ngIf="!notification.timeread"><core-icon name="fa-circle" color="primary"></core-icon></div>
                 <p>{{notification.timecreated | coreDateDayOrTime}}</p>
             </ion-item>
             <ion-item text-wrap>
diff --git a/src/addon/qtype/calculated/component/addon-qtype-calculated.html b/src/addon/qtype/calculated/component/addon-qtype-calculated.html
index ab11e293c..db25e4f4b 100644
--- a/src/addon/qtype/calculated/component/addon-qtype-calculated.html
+++ b/src/addon/qtype/calculated/component/addon-qtype-calculated.html
@@ -18,7 +18,7 @@
 
                 <!-- Input to enter the answer. -->
                 <ion-col>
-                    <ion-input padding-start type="text" placeholder="{{ 'core.question.answer' | translate }}" [attr.name]="question.input.name" [value]="question.input.value" [disabled]="question.input.readOnly" [ngClass]="[question.input.correctClass]" autocorrect="off">
+                    <ion-input padding-left type="text" placeholder="{{ 'core.question.answer' | translate }}" [attr.name]="question.input.name" [value]="question.input.value" [disabled]="question.input.readOnly" [ngClass]="[question.input.correctClass]" autocorrect="off">
                     </ion-input>
                 </ion-col>
 
diff --git a/src/addon/qtype/shortanswer/component/addon-qtype-shortanswer.html b/src/addon/qtype/shortanswer/component/addon-qtype-shortanswer.html
index bdf6f49ab..550e65863 100644
--- a/src/addon/qtype/shortanswer/component/addon-qtype-shortanswer.html
+++ b/src/addon/qtype/shortanswer/component/addon-qtype-shortanswer.html
@@ -2,6 +2,6 @@
     <ion-item text-wrap>
         <p><core-format-text [component]="component" [componentId]="componentId" [text]="question.text"></core-format-text></p>
     </ion-item>
-    <ion-input padding-start type="text" placeholder="{{ 'core.question.answer' | translate }}" [attr.name]="question.input.name" [value]="question.input.value" autocorrect="off" [disabled]="question.input.readOnly" [ngClass]="[question.input.correctClass]">
+    <ion-input padding-left type="text" placeholder="{{ 'core.question.answer' | translate }}" [attr.name]="question.input.name" [value]="question.input.value" autocorrect="off" [disabled]="question.input.readOnly" [ngClass]="[question.input.correctClass]">
     </ion-input>
 </section>
diff --git a/src/components/timer/core-timer.html b/src/components/timer/core-timer.html
index 31262562e..03c48900c 100644
--- a/src/components/timer/core-timer.html
+++ b/src/components/timer/core-timer.html
@@ -1,4 +1,4 @@
-<ion-item #container class="core-timer" [attr.text-center]="align == 'center' ? true : null" [attr.text-right]="align == 'right' ? true : null">
+<ion-item #container class="core-timer" [attr.text-center]="align == 'center' ? true : null" [attr.text-end]="align == 'right' ? true : null">
     <ion-icon name="timer" item-start></ion-icon>
     <label *ngIf="timeLeft > 0 && timerText">{{ timerText }}</label>
     <span *ngIf="timeLeft > 0">{{ timeLeft | coreSecondsToHMS }}</span>
diff --git a/src/core/courses/components/overview-events/core-courses-overview-events.html b/src/core/courses/components/overview-events/core-courses-overview-events.html
index ff5aed5ec..3e010a2a5 100644
--- a/src/core/courses/components/overview-events/core-courses-overview-events.html
+++ b/src/core/courses/components/overview-events/core-courses-overview-events.html
@@ -1,11 +1,11 @@
 <ng-template #eventTemplate let-event="event">
-    <a ion-item core-link text-wrap detail-none capture="true" class="core-course-module-handler item-media" [href]="event.url" [title]="event.name" [class.item-badge-right-phone]="event.action && event.action.showitemcount">
+    <a ion-item core-link text-wrap detail-none capture="true" class="core-course-module-handler item-media" [href]="event.url" [title]="event.name">
         <img item-start [src]="event.iconUrl" core-external-content alt="" role="presentation" *ngIf="event.iconUrl" class="core-module-icon">
         <h2><core-format-text [text]="event.name"></core-format-text></h2>
         <p>{{event.timesort * 1000 | coreFormatDate:"dfmediumdate" }} <core-format-text *ngIf="showCourse" [text]="event.course.fullnamedisplay"></core-format-text></p>
         <button ion-button clear item-end class="hidden-phone" (click)="action($event, event.action.url)" [title]="event.action.name" [disabled]="!event.action.actionable" *ngIf="event.action">
             {{event.action.name}}
-            <ion-badge item-end margin-end *ngIf="event.action.showitemcount">{{event.action.itemcount}}</ion-badge>
+            <ion-badge item-end margin-start *ngIf="event.action.showitemcount">{{event.action.itemcount}}</ion-badge>
         </button>
         <ion-badge class="hidden-tablet" item-end *ngIf="event.action.showitemcount">{{event.action.itemcount}}</ion-badge>
     </a>
diff --git a/src/core/emulator/pages/capture-media/capture-media.html b/src/core/emulator/pages/capture-media/capture-media.html
index 60e2c6dd2..5e2fd78ec 100644
--- a/src/core/emulator/pages/capture-media/capture-media.html
+++ b/src/core/emulator/pages/capture-media/capture-media.html
@@ -47,7 +47,7 @@
                 <ion-icon name="trash"></ion-icon>
             </button>
         </ion-col>
-        <ion-col padding text-right class="chrono-container">
+        <ion-col padding text-end class="chrono-container">
             <core-chrono *ngIf="!isImage" [hidden]="hasCaptured" [running]="isCapturing" [reset]="resetChrono" [endTime]="maxTime" (onEnd)="stopCapturing()"></core-chrono>
         </ion-col>
     </ion-row>
diff --git a/src/core/login/pages/sites/sites.html b/src/core/login/pages/sites/sites.html
index ffe217791..b1d283c18 100644
--- a/src/core/login/pages/sites/sites.html
+++ b/src/core/login/pages/sites/sites.html
@@ -24,7 +24,7 @@
             </button>
         </a>
     </ion-list>
-    <ion-fab bottom right>
+    <ion-fab bottom end>
         <button ion-fab (click)="add()" [attr.aria-label]="'core.add' | translate">
             <ion-icon name="add"></ion-icon>
         </button>

From 05b2616667c084349c896d30347a409cf3146976 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 12:14:23 +0200
Subject: [PATCH 07/16] MOBILE-2567 forum: Fix some forum styles

---
 .../index/addon-mod-forum-index.html          | 10 +++---
 src/addon/mod/forum/components/index/index.ts |  6 ++++
 .../components/post/addon-mod-forum-post.html | 36 ++++++++++---------
 .../forum/pages/discussion/discussion.html    |  4 +--
 .../forum/pages/discussion/discussion.scss    |  9 +++++
 5 files changed, 41 insertions(+), 24 deletions(-)
 create mode 100644 src/addon/mod/forum/pages/discussion/discussion.scss

diff --git a/src/addon/mod/forum/components/index/addon-mod-forum-index.html b/src/addon/mod/forum/components/index/addon-mod-forum-index.html
index ddbebcadf..8d88b2378 100644
--- a/src/addon/mod/forum/components/index/addon-mod-forum-index.html
+++ b/src/addon/mod/forum/components/index/addon-mod-forum-index.html
@@ -32,12 +32,12 @@
                         </ion-avatar>
                         <h2><core-format-text [text]="discussion.subject"></core-format-text></h2>
                         <p *ngIf="discussion.userfullname">
-                            <ion-note float-end padding-start><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</ion-note>
+                            <ion-note float-end padding-left><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</ion-note>
                             {{discussion.userfullname}}
                         </p>
                     </ion-item>
                     <ion-card-content>
-                        <ion-note text-right *ngIf="discussion.groupname">
+                        <ion-note text-end *ngIf="discussion.groupname">
                             <ion-icon name="people"></ion-icon> {{ discussion.groupname }}
                         </ion-note>
                         <p><core-format-text [maxHeight]="60" [component]="component" [componentId]="componentId" [text]="discussion.message"></core-format-text></p>
@@ -50,9 +50,9 @@
                         </ion-avatar>
                         <h2><ion-icon name="pin" *ngIf="discussion.pinned"></ion-icon> <core-format-text [text]="discussion.subject"></core-format-text></h2>
                         <p>
-                            <ion-note float-end padding-start>
+                            <ion-note float-end padding-left text-end>
                                 {{discussion.created | coreDateDayOrTime}}
-                                <div *ngIf="discussion.numunread"><ion-icon name="record"></ion-icon> {{ 'addon.mod_forum.unreadpostsnumber' | translate:{ '$a' : discussion.numunread} }}</div>
+                                <div *ngIf="discussion.numunread"><core-icon name="fa-circle" color="primary"></core-icon> {{ 'addon.mod_forum.unreadpostsnumber' | translate:{ '$a' : discussion.numunread} }}</div>
                             </ion-note>
                             {{discussion.userfullname}}
                         </p>
@@ -93,7 +93,7 @@
             </ion-infinite-scroll>
         </core-loading>
 
-        <ion-fab bottom right *ngIf="forum && forum.cancreatediscussions">
+        <ion-fab bottom end *ngIf="forum && forum.cancreatediscussions">
             <button ion-fab (click)="openNewDiscussion()" [attr.aria-label]="addDiscussionText">
                 <ion-icon name="add"></ion-icon>
             </button>
diff --git a/src/addon/mod/forum/components/index/index.ts b/src/addon/mod/forum/components/index/index.ts
index 72993f242..942c456ea 100644
--- a/src/addon/mod/forum/components/index/index.ts
+++ b/src/addon/mod/forum/components/index/index.ts
@@ -88,6 +88,12 @@ export class AddonModForumIndexComponent extends CoreCourseModuleMainActivityCom
         this.viewDiscObserver = this.eventsProvider.on(AddonModForumProvider.VIEW_DISCUSSION_EVENT, (data) => {
             if (this.forum && this.forum.id == data.forumId) {
                 this.selectedDiscussion = this.splitviewCtrl.isOn() ? data.discussion : 0;
+
+                // Invalidate discussion list if it was not read.
+                const discussion = this.discussions.find((disc) => disc.discussion == data.discussion);
+                if (discussion && discussion.numunread > 0) {
+                    this.forumProvider.invalidateDiscussionsList(this.forum.id);
+                }
             }
         }, this.sitesProvider.getCurrentSiteId());
 
diff --git a/src/addon/mod/forum/components/post/addon-mod-forum-post.html b/src/addon/mod/forum/components/post/addon-mod-forum-post.html
index b5d7c22eb..1260a8b5d 100644
--- a/src/addon/mod/forum/components/post/addon-mod-forum-post.html
+++ b/src/addon/mod/forum/components/post/addon-mod-forum-post.html
@@ -1,18 +1,20 @@
-<ion-item text-wrap>
-    <ion-avatar item-start (click)="openUserProfile(post.userid)">
-        <img [src]="post.userpictureurl" onError="this.src='assets/img/user-avatar.png'" core-external-content [alt]="'core.pictureof' | translate:{$a: post.userfullname}" role="presentation">
-    </ion-avatar>
-    <h2><span [class.core-bold]="post.parent == 0"><core-format-text [text]="post.subject"></core-format-text></span></h2>
-    <p>
-        <ion-note float-end padding-start *ngIf="!post.modified"><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</ion-note>
-        <ion-note float-end padding-start *ngIf="post.modified">
-            {{post.modified | coreDateDayOrTime}}
-            <div *ngIf="unread"><ion-icon name="record"></ion-icon> {{ 'addon.mod_forum.unread' | translate }}</div>
-        </ion-note>
-        {{post.userfullname}}
-    </p>
-</ion-item>
-<ion-card-content>
+<ion-card-header text-wrap no-padding >
+    <ion-item text-wrap>
+        <ion-avatar item-start (click)="openUserProfile(post.userid)">
+            <img [src]="post.userpictureurl" onError="this.src='assets/img/user-avatar.png'" core-external-content [alt]="'core.pictureof' | translate:{$a: post.userfullname}" role="presentation">
+        </ion-avatar>
+        <h2><span [class.core-bold]="post.parent == 0"><core-format-text [text]="post.subject"></core-format-text></span></h2>
+        <p>
+            <ion-note float-end padding-left *ngIf="!post.modified"><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</ion-note>
+            <ion-note float-end padding-left text-end *ngIf="post.modified">
+                {{post.modified | coreDateDayOrTime}}
+                <div *ngIf="unread"><core-icon name="fa-circle" color="primary"></core-icon> {{ 'addon.mod_forum.unread' | translate }}</div>
+            </ion-note>
+            {{post.userfullname}}
+        </p>
+    </ion-item>
+</ion-card-header>
+<ion-card-content padding-top>
     <core-format-text [component]="component" [componentId]="componentId" [text]="post.message"></core-format-text>
     <div *ngFor="let attachment of post.attachments">
         <!-- Files already attached to the submission. -->
@@ -21,12 +23,12 @@
         <core-local-file *ngIf="attachment.name" [file]="attachment"></core-local-file>
     </div>
 </ion-card-content>
-<ion-item text-right *ngIf="post.id && post.canreply">
+<ion-item no-padding text-end *ngIf="post.id && post.canreply" class="addon-forum-reply-button">
     <button ion-button icon-left clear small (click)="showReply()" [attr.aria-controls]="'addon-forum-reply-edit-form-' + uniqueId" [attr.aria-expanded]="replyData.replyingTo === post.id">
         <ion-icon name="undo"></ion-icon> {{ 'addon.mod_forum.reply' | translate }}
     </button>
 </ion-item>
-<ion-item text-right *ngIf="!post.id && (!replyData.isEditing || replyData.replyingTo != post.parent)">
+<ion-item text-end *ngIf="!post.id && (!replyData.isEditing || replyData.replyingTo != post.parent)">
     <button ion-button icon-left clear small (click)="editReply()" [attr.aria-controls]="'addon-forum-reply-edit-form-' + uniqueId" [attr.aria-expanded]="replyData.replyingTo === post.parent">
         <ion-icon name="create"></ion-icon> {{ 'addon.mod_forum.edit' | translate }}
     </button>
diff --git a/src/addon/mod/forum/pages/discussion/discussion.html b/src/addon/mod/forum/pages/discussion/discussion.html
index dd59860cf..3d0048019 100644
--- a/src/addon/mod/forum/pages/discussion/discussion.html
+++ b/src/addon/mod/forum/pages/discussion/discussion.html
@@ -30,7 +30,7 @@
             <ion-icon name="warning"></ion-icon> {{ 'addon.mod_forum.discussionlocked' | translate }}
         </ion-card>
 
-        <ion-card *ngIf="discussion" margin-bottom>
+        <ion-card *ngIf="discussion" margin-bottom class="highlight">
             <addon-mod-forum-post [post]="discussion" [courseId]="courseId" [discussionId]="discussionId" [component]="component" [componentId]="cmId" [replyData]="replyData" [originalData]="originalData" [defaultSubject]="defaultSubject" [forum]="forum" [trackPosts]="trackPosts" (onPostChange)="postListChanged()"></addon-mod-forum-post>
         </ion-card>
 
@@ -51,7 +51,7 @@
             <ion-card>
                 <addon-mod-forum-post [post]="post" [courseId]="courseId" [discussionId]="discussionId" [component]="component" [componentId]="cmId" [replyData]="replyData" [originalData]="originalData" [defaultSubject]="defaultSubject" [forum]="forum" [trackPosts]="trackPosts" (onPostChange)="postListChanged()"></addon-mod-forum-post>
             </ion-card>
-            <div padding-start *ngIf="post.children.length && post.children[0].subject">
+            <div padding-left *ngIf="post.children.length && post.children[0].subject">
                 <ng-container *ngFor="let child of post.children">
                     <ng-container *ngTemplateOutlet="nestedPosts; context: {post: child}"></ng-container>
                 </ng-container>
diff --git a/src/addon/mod/forum/pages/discussion/discussion.scss b/src/addon/mod/forum/pages/discussion/discussion.scss
new file mode 100644
index 000000000..b4151f311
--- /dev/null
+++ b/src/addon/mod/forum/pages/discussion/discussion.scss
@@ -0,0 +1,9 @@
+ion-app.app-root page-addon-mod-forum-discussion {
+    .card.highlight .card-header .item {
+        background-color: $gray-lighter;
+    }
+
+    .addon-forum-reply-button .label {
+        margin: 0;
+    }
+}
\ No newline at end of file

From 050dbaa6cad06ee375555b3e9390c223e53a373e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 12:26:03 +0200
Subject: [PATCH 08/16] MOBILE-2567 forum: Recover unread post info

---
 src/addon/mod/forum/components/post/addon-mod-forum-post.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/addon/mod/forum/components/post/addon-mod-forum-post.html b/src/addon/mod/forum/components/post/addon-mod-forum-post.html
index 1260a8b5d..17a9779ad 100644
--- a/src/addon/mod/forum/components/post/addon-mod-forum-post.html
+++ b/src/addon/mod/forum/components/post/addon-mod-forum-post.html
@@ -8,7 +8,7 @@
             <ion-note float-end padding-left *ngIf="!post.modified"><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</ion-note>
             <ion-note float-end padding-left text-end *ngIf="post.modified">
                 {{post.modified | coreDateDayOrTime}}
-                <div *ngIf="unread"><core-icon name="fa-circle" color="primary"></core-icon> {{ 'addon.mod_forum.unread' | translate }}</div>
+                <div *ngIf="trackPosts && !post.postread"><core-icon name="fa-circle" color="primary"></core-icon> {{ 'addon.mod_forum.unread' | translate }}</div>
             </ion-note>
             {{post.userfullname}}
         </p>

From 2c54c12a01ce2a34d85a437421fa3fa7cf102688 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 12:51:27 +0200
Subject: [PATCH 09/16] MOBILE-2567 forum: Show locked discussion warning for
 teachers

---
 src/addon/mod/forum/components/index/index.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/addon/mod/forum/components/index/index.ts b/src/addon/mod/forum/components/index/index.ts
index 942c456ea..8ab76ab1f 100644
--- a/src/addon/mod/forum/components/index/index.ts
+++ b/src/addon/mod/forum/components/index/index.ts
@@ -412,7 +412,7 @@ export class AddonModForumIndexComponent extends CoreCourseModuleMainActivityCom
             forumId: this.forum.id,
             discussionId: discussion.discussion,
             trackPosts: this.trackPosts,
-            locked: discussion.locked && !discussion.canreply
+            locked: discussion.locked
         };
         this.splitviewCtrl.push('AddonModForumDiscussionPage', params);
     }

From 15dac04d8d2657437967c9c377d68c329161070b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 13:28:13 +0200
Subject: [PATCH 10/16] MOBILE-2567 ux: Style select

---
 src/app/app.scss                              | 22 ++++++++++++++++---
 .../pages/my-overview/my-overview.html        |  4 ++--
 src/theme/variables.scss                      |  4 ++++
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/src/app/app.scss b/src/app/app.scss
index 08adcea53..3a4cf162f 100644
--- a/src/app/app.scss
+++ b/src/app/app.scss
@@ -374,6 +374,13 @@ ion-app.app-root {
     @include core-headings();
   }
 
+  .item core-format-text,
+  core-format-text {
+    p {
+      margin-bottom: 1rem;
+    }
+  }
+
   // Images in ion-card have width 100% and display block. Remove that when the image is in core-format-text.
   ion-card core-format-text img {
     width: min-content;
@@ -417,10 +424,19 @@ ion-app.app-root {
       }
   }
 
-  :not(.item) > * > * > ion-select,
+  ion-select {
+    color: $core-select-placeholder-color;
+    align-self: start;
+
+    .select-icon .select-icon-inner {
+      color: $core-select-placeholder-color;
+    }
+  }
+
+  ion-select.core-button-select,
   .core-button-select {
     background-color: white;
-    color: $core-color;
+    color: $core-select-placeholder-color;
     white-space: normal;
     align-self: start;
     max-width: none;
@@ -452,7 +468,7 @@ ion-app.app-root {
     }
 
     .select-icon .select-icon-inner {
-      color: $core-color;
+      color: $core-select-placeholder-color;
     }
 
     ion-icon:last-child {
diff --git a/src/core/courses/pages/my-overview/my-overview.html b/src/core/courses/pages/my-overview/my-overview.html
index 095ac7eff..4055e823b 100644
--- a/src/core/courses/pages/my-overview/my-overview.html
+++ b/src/core/courses/pages/my-overview/my-overview.html
@@ -37,7 +37,7 @@
                     <core-loading [hideUntil]="courses.loaded" class="core-loading-center">
                         <!-- "Time" selector. -->
                         <div padding class="clearfix" [hidden]="showFilter" ion-row justify-content-between>
-                            <ion-select float-start [title]="'core.show' | translate" [(ngModel)]="courses.selected" ion-col (ngModelChange)="selectedChanged()" interface="popover">
+                            <ion-select float-start [title]="'core.show' | translate" [(ngModel)]="courses.selected" ion-col (ngModelChange)="selectedChanged()" interface="popover" class="core-button-select">
                                 <ion-option value="inprogress">{{ 'core.courses.inprogress' | translate }}</ion-option>
                                 <ion-option value="future">{{ 'core.courses.future' | translate }}</ion-option>
                                 <ion-option value="past">{{ 'core.courses.past' | translate }}</ion-option>
@@ -82,7 +82,7 @@
                     </ion-refresher>
 
                     <div padding [hidden]="!(timeline.loaded || timelineCourses.loaded)">
-                        <ion-select [(ngModel)]="timeline.sort" (ngModelChange)="switchSort()" interface="popover">
+                        <ion-select [(ngModel)]="timeline.sort" (ngModelChange)="switchSort()" interface="popover" class="core-button-select">
                             <ion-option value="sortbydates">{{ 'core.courses.sortbydates' | translate }}</ion-option>
                             <ion-option value="sortbycourses">{{ 'core.courses.sortbycourses' | translate }}</ion-option>
                         </ion-select>
diff --git a/src/theme/variables.scss b/src/theme/variables.scss
index 10e70f4b2..4f5b43224 100644
--- a/src/theme/variables.scss
+++ b/src/theme/variables.scss
@@ -135,6 +135,7 @@ $core-login-box-background-border: $gray !default;
 $core-login-box-text-color: $text-color !default;
 $core-login-button-outline: false !default;
 $core-login-loading-color: false !default;
+$core-select-placeholder-color: $core-color;
 
 // App iOS Variables
 // --------------------------------------------------
@@ -149,6 +150,7 @@ $tabs-ios-tab-color-inactive: $tabs-tab-color-inactive;
 $button-ios-outline-background-color: $core-button-outline-background-color;
 $toolbar-ios-height: 44px + 8; // Avoid toolbar with different heights.
 $checkbox-ios-icon-border-radius: 0px !default;
+$select-ios-placeholder-color: $core-select-placeholder-color;
 $radio-ios-disabled-opacity: .5 !default;
 $checkbox-ios-disabled-opacity: .5 !default;
 $toggle-ios-disabled-opacity: .5 !default;
@@ -166,6 +168,7 @@ $spinner-md-crescent-color: $core-spinner-color;
 $tabs-md-tab-color-inactive: $tabs-tab-color-inactive;
 $button-md-outline-background-color: $core-button-outline-background-color;
 $font-family-md-base: "Roboto", "Noto Sans", "Helvetica Neue", sans-serif !default;
+$select-md-placeholder-color: $core-select-placeholder-color;
 $radio-md-disabled-opacity: .5 !default;
 $checkbox-md-disabled-opacity: .5 !default;
 $toggle-md-disabled-opacity: .5 !default;
@@ -181,6 +184,7 @@ $loading-wp-spinner-color: $core-loading-spinner-color;
 $spinner-wp-circles-color: $core-spinner-color;
 $tabs-wp-tab-color-inactive: $tabs-tab-color-inactive;
 $button-wp-outline-background-color: $core-button-outline-background-color;
+$select-wp-placeholder-color: $core-select-placeholder-color;
 $radio-wp-disabled-opacity: .5 !default;
 $checkbox-wp-disabled-opacity: .5 !default;
 $toggle-wp-disabled-opacity: .5 !default;

From edf940f6041390764dd59f7145cca60970e7a423 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 14:46:55 +0200
Subject: [PATCH 11/16] MOBILE-2567 wiki: Change page string

---
 src/addon/mod/wiki/components/index/index.ts | 2 +-
 src/addon/mod/wiki/lang/en.json              | 1 -
 src/theme/variables.scss                     | 2 ++
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/addon/mod/wiki/components/index/index.ts b/src/addon/mod/wiki/components/index/index.ts
index bf0116676..b030bbb16 100644
--- a/src/addon/mod/wiki/components/index/index.ts
+++ b/src/addon/mod/wiki/components/index/index.ts
@@ -84,7 +84,7 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
             protected userProvider: CoreUserProvider, private popoverCtrl: PopoverController) {
         super(injector, content);
 
-        this.pageStr = this.translate.instant('addon.mod_wiki.page');
+        this.pageStr = this.translate.instant('addon.mod_wiki.wikipage');
     }
 
     /**
diff --git a/src/addon/mod/wiki/lang/en.json b/src/addon/mod/wiki/lang/en.json
index d8b4dcca2..e8d9a0d78 100644
--- a/src/addon/mod/wiki/lang/en.json
+++ b/src/addon/mod/wiki/lang/en.json
@@ -10,7 +10,6 @@
     "newpagetitle": "New page title",
     "nocontent": "There is no content for this page",
     "notingroup": "Not in group",
-    "page": "Page",
     "pageexists": "This page already exists.",
     "pagename": "Page name",
     "subwiki": "Sub-wiki",
diff --git a/src/theme/variables.scss b/src/theme/variables.scss
index 4f5b43224..9d393a442 100644
--- a/src/theme/variables.scss
+++ b/src/theme/variables.scss
@@ -169,6 +169,7 @@ $tabs-md-tab-color-inactive: $tabs-tab-color-inactive;
 $button-md-outline-background-color: $core-button-outline-background-color;
 $font-family-md-base: "Roboto", "Noto Sans", "Helvetica Neue", sans-serif !default;
 $select-md-placeholder-color: $core-select-placeholder-color;
+$label-md-text-color: $text-color !default;
 $radio-md-disabled-opacity: .5 !default;
 $checkbox-md-disabled-opacity: .5 !default;
 $toggle-md-disabled-opacity: .5 !default;
@@ -185,6 +186,7 @@ $spinner-wp-circles-color: $core-spinner-color;
 $tabs-wp-tab-color-inactive: $tabs-tab-color-inactive;
 $button-wp-outline-background-color: $core-button-outline-background-color;
 $select-wp-placeholder-color: $core-select-placeholder-color;
+$label-wp-text-color: $text-color !default;
 $radio-wp-disabled-opacity: .5 !default;
 $checkbox-wp-disabled-opacity: .5 !default;
 $toggle-wp-disabled-opacity: .5 !default;

From 7e4dbd736e2170df7b5bc075168ed1d516efa700 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 16:57:31 +0200
Subject: [PATCH 12/16] MOBILE-2567 ux: Seems that
 $core-text-input-md-show-highlight is not needed anymore

---
 src/app/app.ios.scss                  | 65 ---------------------------
 src/app/app.md.scss                   | 65 ---------------------------
 src/core/login/pages/site/site.html   |  2 +-
 src/core/login/pages/sites/sites.scss |  4 +-
 src/theme/variables.scss              |  4 +-
 5 files changed, 4 insertions(+), 136 deletions(-)

diff --git a/src/app/app.ios.scss b/src/app/app.ios.scss
index edb7d3071..c6d73a607 100644
--- a/src/app/app.ios.scss
+++ b/src/app/app.ios.scss
@@ -59,71 +59,6 @@ ion-app.app-root.ios {
       height: 100%;
   }
 
-
-  // Highlights inside the input element.
-  @if ($core-text-input-ios-show-highlight) {
-    .card-ios, .list-ios {
-      // In order to get a 2px border we need to add an inset
-      // box-shadow 1px (this is to avoid the div resizing)
-
-      // The last item in a list has a border on the item, not the
-      // inner item, so add it to the item itself
-      .item-input.item-input-has-focus:last-child,
-      .item-input.input-has-focus:last-child {
-        @include ios-input-highlight($text-input-ios-highlight-color);
-
-        .item-inner ion-input {
-          box-shadow: none;
-        }
-      }
-
-      // Show the focus highlight when the input has focus
-      .item-input.ng-valid.item-input-has-value:not(.input-has-focus):not(.item-input-has-focus):last-child,
-      .item-input.ng-valid.input-has-value:not(.input-has-focus):not(.item-input-has-focus):last-child {
-        @include ios-input-highlight($text-input-ios-highlight-color-valid);
-
-        .item-inner ion-input {
-          box-shadow: none;
-        }
-      }
-
-      .item-input.ng-invalid.ng-touched:not(.input-has-focus):not(.item-input-has-focus):last-child {
-        @include ios-input-highlight($text-input-ios-highlight-color-invalid);
-
-        .item-inner ion-input {
-          box-shadow: none;
-        }
-      }
-    }
-
-    .item-ios.item-input {
-      .item-inner {
-        border: 0;
-      }
-
-      &.item-block .item-inner ion-input {
-        border-bottom: $hairlines-width solid $list-border-color;
-      }
-
-      // TODO remove all uses of input-has-focus in v4
-      &.item-input-has-focus .item-inner ion-input,
-      &.input-has-focus .item-inner ion-input {
-        @include ios-input-highlight($text-input-ios-highlight-color);
-      }
-
-      // Show the valid highlight when it has the .ng-valid class and a value
-      &.ng-valid.item-input-has-value:not(.input-has-focus):not(.item-input-has-focus) .item-inner ion-input,
-      &.ng-valid.input-has-value:not(.input-has-focus):not(.item-input-has-focus) .item-inner ion-input {
-        @include ios-input-highlight($text-input-ios-highlight-color-valid);
-      }
-
-      // Show the invalid highlight when it has the invalid class and has been touched
-      &.ng-invalid.ng-touched:not(.input-has-focus):not(.item-input-has-focus) .item-inner ion-input {
-        @include ios-input-highlight($text-input-ios-highlight-color-invalid);
-      }
-    }
-  }
-
   // Different levels of padding.
   @for $i from 0 through 15 {
     .core-padding-#{$i} {
diff --git a/src/app/app.md.scss b/src/app/app.md.scss
index c183e0c3c..de8eefcf1 100644
--- a/src/app/app.md.scss
+++ b/src/app/app.md.scss
@@ -41,71 +41,6 @@ ion-app.app-root.md {
       height: calc(100% - #{($navbar-md-height)});
   }
 
-  // Highlights inside the input element.
-  @if ($core-text-input-md-show-highlight) {
-    .card-md, .list-md {
-      // In order to get a 2px border we need to add an inset
-      // box-shadow 1px (this is to avoid the div resizing)
-
-      // The last item in a list has a border on the item, not the
-      // inner item, so add it to the item itself
-      .item-input.item-input-has-focus:last-child,
-      .item-input.input-has-focus:last-child {
-        @include md-input-highlight($text-input-md-highlight-color);
-
-        .item-inner ion-input {
-          box-shadow: none;
-        }
-      }
-
-      .item-input.ng-valid.item-input-has-value:not(.input-has-focus):not(.item-input-has-focus):last-child,
-      .item-input.ng-valid.input-has-value:not(.input-has-focus):not(.item-input-has-focus):last-child {
-        @include md-input-highlight($text-input-md-highlight-color-valid);
-
-        .item-inner ion-input {
-          box-shadow: none;
-        }
-      }
-
-      .item-input.ng-invalid.ng-touched:not(.input-has-focus):not(.item-input-has-focus):last-child {
-        @include md-input-highlight($text-input-md-highlight-color-invalid);
-
-        .item-inner ion-input {
-          box-shadow: none;
-        }
-      }
-    }
-
-    .item-md.item-input {
-      .item-inner {
-        border: 0;
-      }
-
-      &.item-block .item-inner ion-input {
-        border-bottom: 1px solid $list-border-color;
-      }
-
-      // TODO remove all uses of input-has-focus in v4
-      &.item-input-has-focus .item-inner ion-input,
-      &.input-has-focus .item-inner ion-input {
-        @include md-input-highlight($text-input-md-highlight-color);
-      }
-
-      // Show the valid highlight when it has the .ng-valid class and a value
-      // TODO remove all uses of input-has-focus in v4
-      // TODO remove all uses of input-has-value in v4
-      &.ng-valid.item-input-has-value:not(.input-has-focus):not(.item-input-has-focus) .item-inner ion-input,
-      &.ng-valid.input-has-value:not(.input-has-focus):not(.item-input-has-focus) .item-inner ion-input {
-        @include md-input-highlight($text-input-md-highlight-color-valid);
-      }
-
-      // Show the invalid highlight when it has the invalid class and has been touched
-      &.ng-invalid.ng-touched:not(.input-has-focus):not(.item-input-has-focus) .item-inner ion-input {
-        @include md-input-highlight($text-input-md-highlight-color-invalid);
-      }
-    }
-  }
-
   // Different levels of padding.
   @for $i from 0 through 15 {
     .core-padding-#{$i} {
diff --git a/src/core/login/pages/site/site.html b/src/core/login/pages/site/site.html
index 6632e4278..737e6ef89 100644
--- a/src/core/login/pages/site/site.html
+++ b/src/core/login/pages/site/site.html
@@ -14,7 +14,7 @@
         <div text-center padding>
             <img src="assets/img/login_logo.png" class="avatar-full login-logo" role="presentation">
         </div>
-        <form ion-list no-lines [formGroup]="siteForm" (ngSubmit)="connect(siteForm.value.siteUrl)">
+        <form ion-list [formGroup]="siteForm" (ngSubmit)="connect(siteForm.value.siteUrl)">
             <!-- Form to input the site URL if there are no fixed sites. -->
             <div *ngIf="!fixedSites">
                 <p padding>{{ 'core.login.newsitedescription' | translate }}</p>
diff --git a/src/core/login/pages/sites/sites.scss b/src/core/login/pages/sites/sites.scss
index 04cca753b..ba18de255 100644
--- a/src/core/login/pages/sites/sites.scss
+++ b/src/core/login/pages/sites/sites.scss
@@ -1,5 +1,5 @@
 ion-app.app-root page-core-login-sites {
-    .item-button[icon-only] ion-icon {
-        font-size: 2.3em;
+    .item-ios .item-button[icon-only] ion-icon {
+        font-size: 2.1em;
     }
 }
diff --git a/src/theme/variables.scss b/src/theme/variables.scss
index 9d393a442..2505ef59d 100644
--- a/src/theme/variables.scss
+++ b/src/theme/variables.scss
@@ -142,7 +142,6 @@ $core-select-placeholder-color: $core-color;
 // iOS only Sass variables can go here
 
 $text-input-ios-show-focus-highlight: false;
-$core-text-input-ios-show-highlight: false;
 $item-ios-avatar-size: 54px;
 $loading-ios-spinner-color: $core-loading-spinner-color;
 $spinner-ios-ios-color: $core-spinner-color;
@@ -159,8 +158,7 @@ $toggle-ios-disabled-opacity: .5 !default;
 // --------------------------------------------------
 // Material Design only Sass variables can go here
 
-$text-input-md-show-focus-highlight: false;
-$core-text-input-md-show-highlight: true;
+$text-input-md-show-focus-highlight: true;
 $item-md-detail-push-show: true;
 $item-md-avatar-size: 54px;
 $loading-md-spinner-color: $core-loading-spinner-color;

From e68aef3c632ea5b1ac7f7a2ebcdceaa7fe3e4d8f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Tue, 4 Sep 2018 17:30:47 +0200
Subject: [PATCH 13/16] MOBILE-2567 workshop: Fix empty group report selector

---
 .../mod/workshop/components/index/addon-mod-workshop-index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html b/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html
index f1513402d..83adb867f 100644
--- a/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html
+++ b/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html
@@ -130,7 +130,7 @@
         </ng-container>
 
         <!-- MULTIPLE PHASES SUBMISSION OR GREATER only teachers -->
-        <ion-card class="with-borders" *ngIf="access.canviewallsubmissions && workshop.phase >= workshopPhases.PHASE_SUBMISSION && grades && grades.length">
+        <ion-card class="with-borders" *ngIf="access.canviewallsubmissions && workshop.phase >= workshopPhases.PHASE_SUBMISSION && ((grades && grades.length) || (groupInfo && (groupInfo.separateGroups || groupInfo.visibleGroups)))">
             <ion-item-divider color="light" text-wrap *ngIf="workshop.phase == workshopPhases.PHASE_SUBMISSION">
                 <h2>{{ 'addon.mod_workshop.submissionsreport' | translate }}</h2>
             </ion-item-divider>

From 46d56f153db0f5fb6079d4fe0a624b74d816ce48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Wed, 5 Sep 2018 10:13:31 +0200
Subject: [PATCH 14/16] MOBILE-2567 feedback: Fix navigation to analysis

---
 .../mod/feedback/components/index/index.ts    |  3 +-
 src/addon/mod/feedback/providers/helper.ts    | 42 +++++++++----------
 2 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/src/addon/mod/feedback/components/index/index.ts b/src/addon/mod/feedback/components/index/index.ts
index cc0e922d9..74ac6e14d 100644
--- a/src/addon/mod/feedback/components/index/index.ts
+++ b/src/addon/mod/feedback/components/index/index.ts
@@ -423,9 +423,10 @@ export class AddonModFeedbackIndexComponent extends CoreCourseModuleMainActivity
 
                 this.warning = '';
                 if (analysis.warnings.length) {
-                    this.warning = analysis.warnings.find((warning) => {
+                    const warning = analysis.warnings.find((warning) => {
                         return warning.warningcode == 'insufficientresponsesforthisgroup';
                     });
+                    this.warning = warning && warning.message;
                 }
             }
         });
diff --git a/src/addon/mod/feedback/providers/helper.ts b/src/addon/mod/feedback/providers/helper.ts
index cbd1ea4d5..87d75b0bb 100644
--- a/src/addon/mod/feedback/providers/helper.ts
+++ b/src/addon/mod/feedback/providers/helper.ts
@@ -13,7 +13,7 @@
 // limitations under the License.
 
 import { Injectable } from '@angular/core';
-import { NavController } from 'ionic-angular';
+import { NavController, ViewController } from 'ionic-angular';
 import { AddonModFeedbackProvider } from './feedback';
 import { CoreUserProvider } from '@core/user/providers/user';
 import { CoreTextUtilsProvider } from '@providers/utils/text';
@@ -35,17 +35,17 @@ export class AddonModFeedbackHelperProvider {
     }
 
     /**
-     * Check if the page we are going to open is in the history and returns the number of pages in the stack to go back.
+     * Check if the page we are going to open is in the history and returns the view controller in the stack to go back.
      *
      * @param {string} pageName       Name of the page we want to navigate.
      * @param {number} instance       Activity instance Id. I.e FeedbackId.
      * @param {string} paramName      Param name where to find the instance number.
      * @param {string} prefix         Prefix to check if we are out of the activity context.
      * @param {NavController} navCtrl Nav Controller of the view.
-     * @return {number}   Returns the number of times the history needs to go back to find the specified page.
+     * @return {ViewController}   Returns view controller found or null.
      */
-    protected getActivityHistoryBackCounter(pageName: string, instance: number, paramName: string, prefix: string,
-            navCtrl: NavController): number {
+    protected getPageView(pageName: string, instance: number, paramName: string, prefix: string,
+            navCtrl: NavController): ViewController {
         let historyInstance, params,
             view = navCtrl.getActive();
 
@@ -65,13 +65,13 @@ export class AddonModFeedbackHelperProvider {
 
             // Page found.
             if (view.name == pageName) {
-                return view.index;
+                return view;
             }
 
             view = navCtrl.getPrevious(view);
         }
 
-        return 0;
+        return null;
     }
 
     /**
@@ -223,26 +223,24 @@ export class AddonModFeedbackHelperProvider {
      * @return {Promise<void>}    Resolved when navigation animation is done.
      */
     openFeature(feature: string, navCtrl: NavController, module: any, courseId: number, group: number = 0): Promise<void> {
-        const pageName = feature && feature != 'analysis' ? 'AddonModFeedback' + feature + 'Page' : 'AddonModFeedbackIndexPage';
-        let backTimes = 0;
-
-        const stateParams = {
-            module: module,
-            moduleId: module.id,
-            courseId: courseId,
-            feedbackId: module.instance,
-            group: group
-        };
+        const pageName = feature && feature != 'analysis' ? 'AddonModFeedback' + feature + 'Page' : 'AddonModFeedbackIndexPage',
+            stateParams = {
+                module: module,
+                moduleId: module.id,
+                courseId: courseId,
+                feedbackId: module.instance,
+                group: group
+            };
 
         // Only check history if navigating through tabs.
         if (pageName == 'AddonModFeedbackIndexPage') {
             stateParams['tab'] = feature == 'analysis' ? 'analysis' : 'overview';
-            backTimes = this.getActivityHistoryBackCounter(pageName, module.instance, 'feedbackId', 'AddonModFeedback', navCtrl);
-        }
+            const view = this.getPageView(pageName, module.instance, 'feedbackId', 'AddonModFeedback', navCtrl);
 
-        if (backTimes > 0) {
-            // Go back X times until the the page we want to reach.
-            return navCtrl.remove(navCtrl.getActive().index, backTimes);
+            if (view) {
+                // Go back to the found page.
+                return navCtrl.popTo(view);
+            }
         }
 
         // Not found, open new state.

From cdff2a83aec59a6733b47b9c3537cc921791ecd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Wed, 5 Sep 2018 10:58:15 +0200
Subject: [PATCH 15/16] MOBILE-2567 workshop: Add message when you have no
 assessments

---
 .../workshop/components/index/addon-mod-workshop-index.html  | 5 ++++-
 src/addon/mod/workshop/lang/en.json                          | 1 +
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html b/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html
index 83adb867f..5ac411c4f 100644
--- a/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html
+++ b/src/addon/mod/workshop/components/index/addon-mod-workshop-index.html
@@ -119,10 +119,13 @@
                 </ion-item>
             </ion-card>
 
-            <ion-card class="with-borders" *ngIf="canAssess && assessments && assessments.length">
+            <ion-card class="with-borders" *ngIf="canAssess">
                 <ion-item-divider color="light" text-wrap>
                     <h2>{{ 'addon.mod_workshop.assignedassessments' | translate }}</h2>
                 </ion-item-divider>
+                <ion-item text-wrap *ngIf="!assessments || !assessments.length">
+                    <p>{{ 'addon.mod_workshop.assignedassessmentsnone' | translate }}</p>
+                </ion-item>
                 <ng-container *ngFor="let assessment of assessments">
                     <addon-mod-workshop-submission [submission]="assessment.submission" [assessment]="assessment" [courseId]="workshop.course" [module]="module" [workshop]="workshop" [access]="access" summary="true"></addon-mod-workshop-submission>
                 </ng-container>
diff --git a/src/addon/mod/workshop/lang/en.json b/src/addon/mod/workshop/lang/en.json
index d63f0d836..4a2056785 100644
--- a/src/addon/mod/workshop/lang/en.json
+++ b/src/addon/mod/workshop/lang/en.json
@@ -9,6 +9,7 @@
     "assessmentstrategynotsupported": "Assessment strategy {{$a}} not supported",
     "assessmentweight": "Assessment weight",
     "assignedassessments": "Assigned submissions to assess",
+    "assignedassessmentsnone": "You have no assigned submission to assess",
     "conclusion": "Conclusion",
     "createsubmission": "Start preparing your submission",
     "deletesubmission": "Delete submission",

From d04b47c756cfd111054b480f4bbb3441c38fe197 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Wed, 5 Sep 2018 11:41:35 +0200
Subject: [PATCH 16/16] MOBILE-2567 data: Fix search button padding

---
 src/addon/mod/data/pages/search/search.html | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/addon/mod/data/pages/search/search.html b/src/addon/mod/data/pages/search/search.html
index fe3f63426..fcc6e1830 100644
--- a/src/addon/mod/data/pages/search/search.html
+++ b/src/addon/mod/data/pages/search/search.html
@@ -47,9 +47,11 @@
                 <core-compile-html [text]="advancedSearch" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html>
             </div>
         </ion-list>
-        <button ion-button block margin type="submit" icon-start>
-            <ion-icon name="search"></ion-icon>
-            {{ 'addon.mod_data.search' | translate }}
-        </button>
+        <div padding>
+            <button ion-button block type="submit" icon-start>
+                <ion-icon name="search"></ion-icon>
+                {{ 'addon.mod_data.search' | translate }}
+            </button>
+        </div>
     </form>
 </ion-content>