diff --git a/Jenkinsfile b/Jenkinsfile
index 4ffe65e24..0d0d293c8 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -8,7 +8,7 @@ pipeline {
   }
   agent {
     docker {
-      image 'silverpeas/silverbuild'
+      image 'silverpeas/silverbuild:6.3'
       args '-v $HOME/.m2:/home/silverbuild/.m2 -v $HOME/.gitconfig:/home/silverbuild/.gitconfig -v $HOME/.ssh:/home/silverbuild/.ssh -v $HOME/.gnupg:/home/silverbuild/.gnupg'
     }
   }
diff --git a/mobile-configuration/pom.xml b/mobile-configuration/pom.xml
index 37b798771..afa604f36 100644
--- a/mobile-configuration/pom.xml
+++ b/mobile-configuration/pom.xml
@@ -28,7 +28,7 @@
   <parent>
     <groupId>org.silverpeas.components</groupId>
     <artifactId>mobile</artifactId>
-    <version>6.3-SNAPSHOT</version>
+    <version>6.3.7-SNAPSHOT</version>
   </parent>
 
   <groupId>org.silverpeas.components.mobile</groupId>
diff --git a/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties b/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties
index e16ec9889..95f0aa07c 100644
--- a/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties
+++ b/mobile-configuration/src/main/config/properties/org/silverpeas/mobile/mobileSettings.properties
@@ -25,6 +25,8 @@ defaultDomainId=0
 homepage.lastpublications=true
 # display upcomming events or not on main home page
 homepage.lastevents=true
+# display lasts news or not on main home page
+homepage.lastnews=true
 # display free zone on main home page
 homepage.freezone=true
 # display free zone thin on main home page
@@ -33,6 +35,10 @@ homepage.freezonethin=true
 spacehomepage.lastpublications=true
 # display last events or not on spaces home page
 spacehomepage.lastevents=true
+# display last news or not on spaces home page
+spacehomepage.lastnews=true
+
+spacehomepage.displayUrlType=true
 
 # home page zones order
 homepage.zone.changeorder=false
@@ -102,6 +108,7 @@ chat.enable=false
 
 # external url for help
 help.url=
+help.target=
 
 # specials parameters
 ios.link.open.in.iframe=true
@@ -122,4 +129,7 @@ manifest.json.path=
 
 #footer custom buttons
 #customButtonUrl1=
-#customButtonUrl2=
\ No newline at end of file
+#customButtonUrl2=
+
+# maintain http session (store ids in local storage)
+maintain.session=true
\ No newline at end of file
diff --git a/mobile-war/pom.xml b/mobile-war/pom.xml
index 95a547512..5ecdd213a 100644
--- a/mobile-war/pom.xml
+++ b/mobile-war/pom.xml
@@ -30,7 +30,7 @@
   <parent>
     <groupId>org.silverpeas.components</groupId>
     <artifactId>mobile</artifactId>
-    <version>6.3-SNAPSHOT</version>
+    <version>6.3.7-SNAPSHOT</version>
   </parent>
 
   <groupId>org.silverpeas.components.mobile</groupId>
diff --git a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
index c6504d919..176311cff 100644
--- a/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
+++ b/mobile-war/src/main/java/org/silverpeas/bridge/MobilFilter.java
@@ -43,6 +43,7 @@
 import org.silverpeas.core.util.SettingBundle;
 import org.silverpeas.core.util.URLUtil;
 import org.silverpeas.core.web.mvc.controller.MainSessionController;
+import org.silverpeas.mobile.shared.dto.ContentsTypes;
 
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
@@ -102,10 +103,13 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
 
       if (isMobile && !url.contains("sso") && !url.contains("services") &&
           !url.contains("spmobile") && !url.contains(URLUtil.getApplicationURL() + "/chat/") &&
+          !url.contains(URLUtil.getApplicationURL() + "/media/") &&
           !url.contains(URLUtil.getApplicationURL() + "/visio/") &&
           !url.contains(URLUtil.getApplicationURL() + "/util/") && (!tablet) &&
           !url.contains("attached_file") && !url.contains("Ticket") &&
-          !url.contains("LinkFile/Key") && redirect) {
+          !url.contains("LinkFile/Key")  &&
+          !url.contains("Logout")  &&
+          !url.contains("FileServer/thumbnail") && redirect) {
         String params = "";
         if (url.contains("Publication")) {
           String id = url.substring(url.lastIndexOf("/") + 1);
@@ -113,6 +117,16 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
           String appId = pub.getInstanceId();
           params = "?shortcutContentType=Publication&shortcutContentId=" + id + "&shortcutAppId=" +
               appId;
+        } else if (url.contains("/Topic/")) {
+          // sample : /silverpeas/Topic/6278?ComponentId=kmelia2431
+          String id = url.substring(url.lastIndexOf("/")+1);
+          String appId = ((HttpServletRequest) req).getParameter("ComponentId");
+          params = "?shortcutContentType=Folder&shortcutContentId=" + id + "&shortcutAppId=" + appId;
+        } else if (url.contains("Form")) {
+          // sample : /silverpeas/Form/1?ComponentId=formsOnline1
+          String id = url.substring(url.lastIndexOf("/") + 1);
+          String appId = req.getParameter("ComponentId");
+          params = "?shortcutContentType=Form&shortcutContentId=" + id + "&shortcutAppId=" + appId;
         } else if (url.contains("Media")) {
           String id = url.substring(url.lastIndexOf("/") + 1);
           Media media = getGalleryService().getMedia(new MediaPK(id));
@@ -172,6 +186,12 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
         } else if (url.contains("Component")) {
           String appId = url.substring(url.lastIndexOf("/") + 1);
           params = "?shortcutContentType=Component&shortcutAppId=" + appId;
+        } else if (url.contains("Space")) {
+          String spaceId = url.substring(url.lastIndexOf("/") + 1);
+          params = "?shortcutContentType=Space&shortcutAppId=" + spaceId;
+        } else if (url.contains("/needSession")) {
+          String appId = url.replaceAll("/needSession","");
+          params = "?shortcutContentType=Url&shortcutAppId=" + appId;
         } else if (!url.contains("AuthenticationServlet") &&
             (url.endsWith("silverpeas") || url.endsWith("silverpeas/") ||
                 url.contains("/silverpeas/"))) {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java
index e38c969c1..f6f573eb2 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/SpMobil.java
@@ -34,6 +34,7 @@
 import com.google.gwt.event.logical.shared.ResizeEvent;
 import com.google.gwt.event.logical.shared.ResizeHandler;
 import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Cookies;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.Widget;
@@ -72,9 +73,11 @@
 import org.silverpeas.mobile.client.common.event.authentication.AuthenticationEventHandler;
 import org.silverpeas.mobile.client.common.mobil.MobilUtils;
 import org.silverpeas.mobile.client.common.mobil.Orientation;
+import org.silverpeas.mobile.client.common.navigation.LinksManager;
 import org.silverpeas.mobile.client.common.navigation.PageHistory;
 import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly;
 import org.silverpeas.mobile.client.common.network.NetworkHelper;
+import org.silverpeas.mobile.client.common.resources.ResourcesManager;
 import org.silverpeas.mobile.client.common.storage.CacheStorageHelper;
 import org.silverpeas.mobile.client.common.storage.LocalStorageHelper;
 import org.silverpeas.mobile.client.components.base.Page;
@@ -117,6 +120,9 @@ public class SpMobil implements EntryPoint, AuthenticationEventHandler {
   private static Orientation orientation = null;
   private static List<App> apps = new ArrayList<App>();
 
+  private static int nbRetryLogin = 0;
+  private static boolean SSO = false;
+
   public static DetailUserDTO getUser() {
     return user;
   }
@@ -138,6 +144,7 @@ public static void setUser(final DetailUserDTO user) {
    * Init. spmobile.
    */
   public void onModuleLoad() {
+    exportNativeFunctions();
     // init connexion supervision
     NetworkHelper.getInstance();
 
@@ -173,6 +180,8 @@ public void onModuleLoad() {
     EventBus.getInstance().addHandler(ExceptionEvent.TYPE, new ErrorManager());
     EventBus.getInstance().addHandler(AbstractAuthenticationErrorEvent.TYPE, this);
 
+    SSO = !ResourcesManager.getSSOPath().isEmpty();
+
     loadIds(null);
 
     NodeList<Element> tags = Document.get().getElementsByTagName("meta");
@@ -258,15 +267,18 @@ public static void displayMainPage() {
     }
     getMainPage().setUser(user);
     RootPanel.get().clear();
+    PageHistory.getInstance().clear();
     RootPanel.get().add(getMainPage());
     PageHistory.getInstance().goTo(new HomePage());
 
     if ((shortcutAppId != null && shortcutContentType != null && shortcutContentId != null) ||
         shortcutContributionId != null ||
-        (shortcutContentType != null && shortcutContentType.equals("Component") &&
+        (shortcutContentType != null && (shortcutContentType.equals("Component") || shortcutContentType.equals("Space")) &&
             shortcutAppId != null)) {
       ShortCutRouter.route(user, shortcutAppId, shortcutContentType, shortcutContentId,
-          shortcutContributionId, shortcutRole);
+              shortcutContributionId, shortcutRole);
+    } else if (shortcutContentType != null && shortcutContentType.equalsIgnoreCase("Url") && shortcutAppId != null) {
+      LinksManager.openIframePage(shortcutAppId);
     } else {
       MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<HomePageDTO>() {
 
@@ -308,9 +320,19 @@ public void attempt() {
           super.attempt();
           FullUserDTO u = AuthentificationManager.getInstance().loadUser();
           if (u != null) {
+            nbRetryLogin = 0;
             ServicesLocator.getServiceNavigation().getUser(u.getLogin(), u.getDomainId(), this);
           } else {
-            tryToRelogin(attempt);
+            String login = Cookies.getCookie("svpLogin");
+            String domainId = Cookies.getCookie("defaultDomain");
+            if (login != null && domainId != null && !login.isEmpty() && !domainId.isEmpty()) {
+              ServicesLocator.getServiceNavigation().getUser(login, domainId, this);
+            } else {
+              if (nbRetryLogin < 5) {
+                tryToRelogin(attempt);
+                nbRetryLogin++;
+              }
+            }
           }
         }
 
@@ -320,6 +342,17 @@ public void onSuccess(final Method method, final DetailUserDTO detailUserDTO) {
           setUser(detailUserDTO);
           setUserProfile(UserProfileDTO.getBean(
               LocalStorageHelper.load(AuthentificationManager.USER_PROFIL, IUserProfile.class)));
+          if (getUserProfile() == null) {
+            UserProfileDTO p = new UserProfileDTO();
+            p.setFullName(detailUserDTO.getFirstName() + " " + detailUserDTO.getLastName());
+            p.setAvatar(detailUserDTO.getAvatar());
+            p.setFirstName(detailUserDTO.getFirstName());
+            p.setLastName(detailUserDTO.getLastName());
+            p.setLanguage(detailUserDTO.getLanguage());
+            p.setId(detailUserDTO.getId());
+            p.seteMail(detailUserDTO.geteMail());
+            setUserProfile(p);
+          }
 
           ServicesLocator.getServiceTermsOfService().show(new MethodCallback<Boolean>() {
             @Override
@@ -345,6 +378,7 @@ public void onFailure(final Method method, final Throwable t) {
           tryToRelogin(attempt);
         }
       };
+
       action.attempt();
     } else {
       //Login
@@ -353,6 +387,10 @@ public void onFailure(final Method method, final Throwable t) {
     }
   }
 
+  public static boolean isSSO() {
+      return SSO;
+  }
+
   private void tryToRelogin(final Command attempt) {
     FullUserDTO user = AuthentificationManager.getInstance().loadUser();
     if (user != null) {
@@ -503,4 +541,8 @@ public static Config getConfiguration() {
   public void onAuthenticationError(final AbstractAuthenticationErrorEvent event) {
     displayLoginPage(((AuthenticationException) event.getException()));
   }
+
+  public static native void exportNativeFunctions()/*-{
+    $wnd.navigateTo = $entry(@org.silverpeas.mobile.client.common.navigation.LinksManager::navigateToPermalink(*));
+  }-*/;
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java
index 4720da6ed..2c03d528f 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/comments/CommentsApp.java
@@ -97,7 +97,6 @@ public void addComment(final AddCommentEvent event) {
       dto.setComponentId(event.getInstanceId());
       dto.setResourceId(event.getContentId());
       dto.setResourceType(event.getContentType());
-      dto.setTextForHtml(event.getMessage());
 
       MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<CommentDTO>() {
         @Override
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java
index 2bf0d4e7b..8ad5da7b3 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/contacts/pages/widgets/ContactItem.java
@@ -39,6 +39,7 @@
 import org.silverpeas.mobile.client.common.resources.ResourcesManager;
 import org.silverpeas.mobile.client.resources.ApplicationResources;
 import org.silverpeas.mobile.shared.dto.DetailUserDTO;
+import org.silverpeas.mobile.shared.dto.PropertyDTO;
 
 public class ContactItem extends Composite {
 
@@ -122,31 +123,32 @@ public void setData(DetailUserDTO userData) {
       nbTel++;
     }
     if (nbTel == 0) {
-      tel.add(new InlineHTML("&nbsp;"));
+      tel.setVisible(false);
     }
 
-    for (String prop :userData.getProperties()) {
-
-      String value = userData.getPropertieValue(prop);
-      if (isPhoneNumber(value)) {
-        HTMLPanel field = new HTMLPanel("");
-        Anchor tel = new Anchor();
-        tel.setStyleName("tel-link");
-        tel.setText(value);
-        tel.setHref("tel:" + value);
-        field.add(tel);
-
-        Anchor sms = new Anchor();
-        sms.setHref("sms:" + value);
-        Image smsImg = new Image(resourcesContact.sms());
-        sms.getElement().appendChild(smsImg.getElement());
-        field.add(sms);
-
-        container.add(field);
-      } else {
-        HTML field = new HTML(value);
-        field.setStylePrimaryName(prop);
-        container.add(field);
+    for (PropertyDTO prop :userData.getProperties()) {
+      String value = prop.getValue();
+      if (value != null & !value.isEmpty()) {
+        if (isPhoneNumber(value)) {
+          HTMLPanel field = new HTMLPanel("");
+          Anchor tel = new Anchor();
+          tel.setStyleName("tel-link");
+          tel.setText(value);
+          tel.setHref("tel:" + value);
+          field.add(tel);
+
+          Anchor sms = new Anchor();
+          sms.setHref("sms:" + value);
+          Image smsImg = new Image(resourcesContact.sms());
+          sms.getElement().appendChild(smsImg.getElement());
+          field.add(sms);
+
+          container.add(field);
+        } else {
+          HTML field = new HTML(value);
+          field.setStylePrimaryName(prop.getKey());
+          container.add(field);
+        }
       }
     }
   }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java
index d04337447..a2adc5335 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/DocumentsApp.java
@@ -129,6 +129,12 @@ private void displayContent(final ContentDTO content) {
       setMainPage(page);
       page.show();
       EventBus.getInstance().fireEvent(new DocumentsLoadPublicationEvent(content));
+    } else if (content.getType().equals(ContentsTypes.Component.toString())) {
+      ApplicationInstanceDTO data = new ApplicationInstanceDTO();
+      data.setId(content.getInstanceId());
+      data.setType(Apps.kmelia.name());
+      NavigationAppInstanceChangedEvent event = new NavigationAppInstanceChangedEvent(data);
+      appInstanceChanged(event);
     } else if (content.getType().equals(ContentsTypes.Attachment.toString())) {
       final DocumentsApp app = this;
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java
index be249fea6..9c72af6e0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/documents/pages/PublicationPage.java
@@ -147,6 +147,16 @@ public void onLoadedPublication(PublicationLoadedEvent event) {
   @Override
   public void onLoadedPublicationAttachments(final PublicationAttachmentsLoadedEvent event) {
     for (SimpleDocumentDTO attachment : event.getAttachments()) {
+      if (!publication.getNotAllowedDownloads().isEmpty()) {
+        attachment.setDownloadable(true);
+        for (String idNotAllowed : publication.getNotAllowedDownloads()) {
+          if (idNotAllowed.equals(attachment.getId())) {
+            attachment.setDownloadable(false);
+          }
+        }
+      } else {
+        attachment.setDownloadable(true);
+      }
       Attachment a = new Attachment();
       a.setAttachment(attachment);
       attachments.add(a);
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java
index 0fd34baf3..d8b51d45e 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/favorites/FavoritesApp.java
@@ -25,7 +25,6 @@
 package org.silverpeas.mobile.client.apps.favorites;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.user.client.rpc.AsyncCallback;
 import org.fusesource.restygwt.client.Method;
 import org.silverpeas.mobile.client.apps.favorites.events.app.AbstractFavoritesAppEvent;
 import org.silverpeas.mobile.client.apps.favorites.events.app.AddFavoriteEvent;
@@ -39,7 +38,6 @@
 import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationEventHandler;
 import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationShowContentEvent;
 import org.silverpeas.mobile.client.common.EventBus;
-import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.ServicesLocator;
 import org.silverpeas.mobile.client.common.app.App;
 import org.silverpeas.mobile.client.common.event.ErrorEvent;
@@ -115,7 +113,6 @@ public void attempt() {
 
   @Override
   public void gotoApp(final GotoAppEvent event) {
-
       MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() {
         @Override
         public void attempt() {
@@ -136,6 +133,7 @@ public void onSuccess(final Method method,
           EventBus.getInstance().fireEvent(new NavigationAppInstanceChangedEvent(applicationInstanceDTO));
         }
       };
+      action.attempt();
   }
 
   @Override
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java
index 59f4bbfcf..9e2d1396e 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/FormsOnlineApp.java
@@ -177,7 +177,7 @@ public void saveForm(final FormSaveEvent formSaveEvent) {
   }
 
   private static native void saveForm(FormsOnlineApp app, JavaScriptObject fd, String token, String stkn, String instanceId, String formId) /*-{
-    var url = "/silverpeas/services/formsOnline/"+instanceId+"/saveForm/" + formId;
+    var url = "/silverpeas/services/mobile/formsOnline/"+instanceId+"/saveForm/" + formId;
     var xhr = new XMLHttpRequest();
     xhr.open("POST", url, false);
     xhr.setRequestHeader("X-Silverpeas-Session", token);
@@ -367,6 +367,20 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) {
 
   @Override
   public void showContent(final NavigationShowContentEvent event) {
+    if (event.getContent().getType().equals("Form")) {
+      ApplicationInstanceDTO appInst = new ApplicationInstanceDTO();
+      appInst.setId(event.getContent().getInstanceId());
+      this.setApplicationInstance(appInst);
+
+      String id = event.getContent().getId();
+      FormOnlineLoadEvent ev = new FormOnlineLoadEvent();
+      FormDTO form = new FormDTO();
+      form.setXmlFormName(id);
+      ev.setForm(form);
+      ev.getForm().setId(id);
+      loadFormOnline(ev);
+    }
+
     if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.formsOnline.name())) {
       ApplicationInstanceDTO appInst = new ApplicationInstanceDTO();
       appInst.setId(event.getContent().getInstanceId());
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java
index 20227e000..3b97de5bb 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormOnlineEditPage.java
@@ -98,6 +98,7 @@ public void onFormsOnlineLoad(final FormsOnlineLoadedEvent event) {}
   @Override
   public void onFormLoaded(final FormLoadedEvent formLoadedEvent) {
     data = formLoadedEvent.getFormFields();
+    fields.clear();
       for (FormFieldDTO f : formLoadedEvent.getFormFields()) {
         FieldEditable field = new FieldEditable();
         field.setData(f);
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java
index 7c6f4a670..295eedcf7 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/formsonline/pages/FormsOnlinePage.java
@@ -112,7 +112,6 @@ public FormsOnlinePage() {
     msg = GWT.create(FormsOnlineMessages.class);
     setPageTitle(msg.title());
     initWidget(uiBinder.createAndBindUi(this));
-    container.getElement().getStyle().setHeight(12, Style.Unit.EM);
     EventBus.getInstance().addHandler(AbstractFormsOnlinePagesEvent.TYPE, this);
     EventBus.getInstance().fireEvent(new FormsOnlineLoadEvent());
   }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java
index be4f2a28a..d4a061a0a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/hyperlink/HyperLinkApp.java
@@ -25,6 +25,7 @@
 package org.silverpeas.mobile.client.apps.hyperlink;
 
 import org.fusesource.restygwt.client.Method;
+import org.fusesource.restygwt.client.MethodCallback;
 import org.fusesource.restygwt.client.TextCallback;
 import org.silverpeas.mobile.client.apps.navigation.events.app.external.AbstractNavigationEvent;
 import org.silverpeas.mobile.client.apps.navigation.events.app.external.NavigationAppInstanceChangedEvent;
@@ -37,6 +38,7 @@
 import org.silverpeas.mobile.client.common.event.ErrorEvent;
 import org.silverpeas.mobile.client.common.navigation.LinksManager;
 import org.silverpeas.mobile.client.common.network.NetworkHelper;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;
 import org.silverpeas.mobile.shared.dto.navigation.Apps;
 
@@ -64,21 +66,21 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) {
     if (event.getInstance().getType().equals(Apps.hyperlink.name())) {
       this.instance = event.getInstance();
 
-      ServicesLocator.getServiceHyperLink().getUrl(instance.getId(), new TextCallback() {
+      ServicesLocator.getServiceHyperLink().getUrl(instance.getId(), new MethodCallback<HyperLinkDTO>() {
         @Override
         public void onFailure(final Method method, final Throwable t) {
           EventBus.getInstance().fireEvent(new ErrorEvent(t));
         }
 
         @Override
-        public void onSuccess(final Method method, final String url) {
-          openLink(url);
+        public void onSuccess(Method method, HyperLinkDTO hyperLinkDTO) {
+          openLink(hyperLinkDTO);
         }
       });
     }
   }
 
-  private void openLink(String url) {
+  private void openLink(HyperLinkDTO url) {
     Notification.activityStop();
     NetworkHelper.hideOfflineIndicator();
     LinksManager.processLink(url);
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java
index c9c280286..8b9fcc831 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/MediaApp.java
@@ -26,7 +26,10 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
 import org.fusesource.restygwt.client.Method;
+import org.silverpeas.mobile.client.apps.documents.DocumentsApp;
 import org.silverpeas.mobile.client.apps.media.events.app.AbstractMediaAppEvent;
 import org.silverpeas.mobile.client.apps.media.events.app.MediaAppEventHandler;
 import org.silverpeas.mobile.client.apps.media.events.app.MediaPreviewLoadEvent;
@@ -215,10 +218,30 @@ public void appInstanceChanged(NavigationAppInstanceChangedEvent event) {
     }
   }
 
+  private void loadAppInstance(final ContentDTO content) {
+    MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() {
+
+      @Override
+      public void attempt() {
+        ServicesLocator.getServiceNavigation()
+                .getApp(content.getInstanceId(), content.getId(), content.getType(), this);
+      }
+
+      @Override
+      public void onSuccess(final Method method,
+                            final ApplicationInstanceDTO app) {
+        super.onSuccess(method, app);
+        setApplicationInstance(app);
+        appInstanceChanged(new NavigationAppInstanceChangedEvent(app));
+      }
+    };
+    action.attempt();
+  }
+
   @Override
   public void showContent(final NavigationShowContentEvent event) {
     if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.gallery.name())) {
-      super.showContent(event);
+      loadAppInstance(event.getContent());
     } else if (event.getContent().getType().equals(ContentsTypes.Media.name()) ||
         event.getContent().getType().equals(ContentsTypes.Photo.name()) ||
         event.getContent().getType().equals(ContentsTypes.Sound.name()) ||
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java
index 7aa2e16f0..3486efd17 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/media/pages/widgets/AddMediaButton.java
@@ -103,7 +103,7 @@ public void mediaNotUploaded(int codeError) {
 
     @UiHandler("link")
     void upload(ClickEvent event) {
-        if (!NetworkHelper.isOnline()) {
+        if (NetworkHelper.isOnline()) {
             clickOnInputFile(file.getElement());
         } else {
             Notification.alert(globalMsg.needToBeOnline());
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java
index 941fc22b5..b03234e0d 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/NavigationApp.java
@@ -26,6 +26,7 @@
 
 import com.google.gwt.core.client.GWT;
 import org.fusesource.restygwt.client.Method;
+import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.apps.navigation.events.app.AbstractNavigationAppEvent;
 import org.silverpeas.mobile.client.apps.navigation.events.app.LoadSpacesAndAppsEvent;
 import org.silverpeas.mobile.client.apps.navigation.events.app.NavigationAppEventHandler;
@@ -37,11 +38,14 @@
 import org.silverpeas.mobile.client.apps.navigation.pages.NavigationPage;
 import org.silverpeas.mobile.client.common.EventBus;
 import org.silverpeas.mobile.client.common.ServicesLocator;
+import org.silverpeas.mobile.client.common.ShortCutRouter;
 import org.silverpeas.mobile.client.common.app.App;
 import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.ContentsTypes;
 import org.silverpeas.mobile.shared.dto.HomePageDTO;
+import org.silverpeas.mobile.shared.dto.navigation.HomePages;
+import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO;
 
 public class NavigationApp extends App implements NavigationAppEventHandler,NavigationEventHandler {
 
@@ -100,10 +104,26 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) {
 
   @Override
   public void showContent(final NavigationShowContentEvent event) {
-    if (event.getContent().getType().equals(ContentsTypes.Space.name())) {
-      NavigationPage page = new NavigationPage();
-      page.setRootSpaceId(event.getContent().getId());
-      page.show();
-    }
+      if (event.getContent().getType().equals(ContentsTypes.Space.name())) {
+          MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<SpaceDTO>() {
+              @Override
+              public void attempt() {
+                  String id = event.getContent().getInstanceId();
+                  if (id == null || id.isEmpty()) id = event.getContent().getId();
+                  ServicesLocator.getServiceNavigation().getSpace(id, this);
+              }
+              @Override
+              public void onSuccess(Method method, SpaceDTO space) {
+                  if (space.getHomePageType() == HomePages.APP.getValue()) {
+                      ShortCutRouter.route(SpMobil.getUser(), space.getHomePageParameter(), "Component", null, null, null);
+                  } else {
+                      NavigationPage page = new NavigationPage();
+                      page.setRootSpaceId(event.getContent().getInstanceId());
+                      page.show();
+                  }
+              }
+          };
+          action.attempt();
+      }
   }
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java
index 098d63234..62a5f7cd3 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/FavoriteItem.java
@@ -35,6 +35,7 @@
 import org.silverpeas.mobile.client.common.navigation.LinksManager;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.MyLinkDTO;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
 public class FavoriteItem extends Composite {
 
@@ -68,7 +69,9 @@ public void setData(MyLinkDTO data) {
 
   @UiHandler("link")
   protected void onClick(ClickEvent event) {
-    LinksManager.processLink(data.getUrl());
+    HyperLinkDTO link = new HyperLinkDTO();
+    link.setUrl(data.getUrl());
+    LinksManager.processLink(link);
   }
 
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java
index cc255de5f..4f453de39 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/navigation/pages/widgets/ShortCutItem.java
@@ -36,6 +36,7 @@
 import org.silverpeas.mobile.client.common.navigation.LinksManager;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.ShortCutLinkDTO;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
 public class ShortCutItem extends Composite {
 
@@ -71,7 +72,9 @@ public void setData(ShortCutLinkDTO data) {
 
   @UiHandler("link")
   protected void onClick(ClickEvent event) {
-    LinksManager.processLink(data.getUrl());
+    HyperLinkDTO link = new HyperLinkDTO();
+    link.setUrl(data.getUrl());
+    LinksManager.processLink(link);
   }
 
   public void setCssId(String id) {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java
index bdd87828a..62a080b3f 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/news/NewsApp.java
@@ -40,6 +40,7 @@
 import org.silverpeas.mobile.client.common.ServicesLocator;
 import org.silverpeas.mobile.client.common.app.App;
 import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly;
+import org.silverpeas.mobile.shared.dto.ContentDTO;
 import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;
 import org.silverpeas.mobile.shared.dto.navigation.Apps;
 import org.silverpeas.mobile.shared.dto.news.NewsDTO;
@@ -100,10 +101,30 @@ public void appInstanceChanged(final NavigationAppInstanceChangedEvent event) {
     }
   }
 
+  private void loadAppInstance(final ContentDTO content) {
+    MethodCallbackOnlineOnly action = new MethodCallbackOnlineOnly<ApplicationInstanceDTO>() {
+
+      @Override
+      public void attempt() {
+        ServicesLocator.getServiceNavigation()
+                .getApp(content.getInstanceId(), content.getId(), content.getType(), this);
+      }
+
+      @Override
+      public void onSuccess(final Method method,
+                            final ApplicationInstanceDTO app) {
+        super.onSuccess(method, app);
+        setApplicationInstance(app);
+        appInstanceChanged(new NavigationAppInstanceChangedEvent(app));
+      }
+    };
+    action.attempt();
+  }
+
   @Override
   public void showContent(final NavigationShowContentEvent event) {
     if (event.getContent().getType().equals("Component") && event.getContent().getInstanceId().startsWith(Apps.quickinfo.name())) {
-      super.showContent(event);
+      loadAppInstance(event.getContent());
     } else {
       // actually manage by document app
     }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java
index 35b07176e..0f9b400a0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/apps/notificationsbox/NotificationsBoxApp.java
@@ -100,7 +100,7 @@ public void onSuccess(final Method method,
             EventBus.getInstance()
                 .fireEvent(new NotificationsLoadedEvent(notificationReceivedDTOS));
             if (notificationReceivedDTOS.getMoreElement()) {
-              loadNotifications(event, nbCall);
+              loadNotifications(event, nbCall+1);
             }
           }
         };
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java
index bba1bca91..9e46ccd19 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/AuthentificationManager.java
@@ -24,6 +24,7 @@
 
 package org.silverpeas.mobile.client.common;
 
+import com.google.gwt.core.client.GWT;
 import com.google.gwt.http.client.Request;
 import com.google.gwt.http.client.RequestBuilder;
 import com.google.gwt.http.client.RequestCallback;
@@ -42,6 +43,7 @@
 import org.silverpeas.mobile.client.common.navigation.PageHistory;
 import org.silverpeas.mobile.client.common.network.MethodCallbackOnlineOnly;
 import org.silverpeas.mobile.client.common.network.NetworkHelper;
+import org.silverpeas.mobile.client.common.resources.ResourcesManager;
 import org.silverpeas.mobile.client.common.storage.LocalStorageHelper;
 import org.silverpeas.mobile.client.pages.connexion.ConnexionPage;
 import org.silverpeas.mobile.shared.dto.DetailUserDTO;
@@ -93,8 +95,11 @@ public void storeUser(final DetailUserDTO user, final UserProfileDTO profil, Str
     SpMobil.setUser(user);
 
     FullUserDTO u = new FullUserDTO(login, encryptedPassword, domainId, user);
-    LocalStorageHelper.store(USER_CONNECTED_KEY, u.getAutoBean());
-    LocalStorageHelper.store(USER_PROFIL, profil.getAutoBean());
+    String maintainSession = ResourcesManager.getParam("maintain.session");
+    if (maintainSession.equalsIgnoreCase("true")) {
+      LocalStorageHelper.store(USER_CONNECTED_KEY, u.getAutoBean());
+      LocalStorageHelper.store(USER_PROFIL, profil.getAutoBean());
+    }
   }
 
   public void updateAvatarInCache(final String avatarData) {
@@ -102,8 +107,11 @@ public void updateAvatarInCache(final String avatarData) {
     SpMobil.getUserProfile().setAvatar(avatarData);
     FullUserDTO user = FullUserDTO.getBean(LocalStorageHelper.load(USER_CONNECTED_KEY, IFullUser.class));
     user.setAvatar(avatarData);
-    LocalStorageHelper.store(USER_CONNECTED_KEY, user.getAutoBean());
-    LocalStorageHelper.store(USER_PROFIL, SpMobil.getUserProfile().getAutoBean());
+    String maintainSession = ResourcesManager.getParam("maintain.session");
+    if (maintainSession.equalsIgnoreCase("true")) {
+      LocalStorageHelper.store(USER_CONNECTED_KEY, user.getAutoBean());
+      LocalStorageHelper.store(USER_PROFIL, SpMobil.getUserProfile().getAutoBean());
+    }
   }
 
   /**
@@ -256,9 +264,7 @@ public void onSuccess(final Method method, final Boolean showTermsOfServices) {
                 @Override
                 public void onFailure(final Method method, final Throwable t) {
                   //super.onFailure(method, t);
-                  Window.alert(
-                      "Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage());
-
+                  GWT.log("Normaly never happen !!! " + t.getClass().getName() + " " + t.getMessage());
                   if (t instanceof AuthenticationException) {
                     EventBus.getInstance().fireEvent(new AuthenticationErrorEvent(t));
                   } else {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java
index 6de2ed037..b22424e9a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/navigation/LinksManager.java
@@ -24,6 +24,7 @@
 
 package org.silverpeas.mobile.client.common.navigation;
 
+import com.google.gwt.core.client.JsArrayString;
 import com.google.gwt.user.client.Window;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.apps.contacts.events.app.ContactsFilteredLoadEvent;
@@ -35,6 +36,7 @@
 import org.silverpeas.mobile.client.components.IframePage;
 import org.silverpeas.mobile.shared.dto.ContentsTypes;
 import org.silverpeas.mobile.shared.dto.contact.ContactScope;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
 /**
  * @author svu
@@ -43,7 +45,16 @@ public class LinksManager {
 
   private static Boolean iosShowIframe = Boolean.parseBoolean(ResourcesManager.getParam("ios.link.open.in.iframe"));
 
-  public static void processLink(String url) {
+  public static void navigateToPermalink(String url) {
+    HyperLinkDTO dto = new HyperLinkDTO();
+    dto.setUrl(url);
+    dto.setInternalLink(true);
+    dto.setOpenNewWindow(false);
+    processLink(dto);
+  }
+
+  public static void processLink(HyperLinkDTO hyperLinkDTO) {
+    String url = hyperLinkDTO.getUrl();
     if(sameContext(url)) {
       String shortcutContentType = "";
       String shortcutAppId = null;
@@ -91,7 +102,7 @@ public static void processLink(String url) {
         }
         EventBus.getInstance().fireEvent(new ContactsFilteredLoadEvent(type, filter));
       } else {
-        openExternalLink(url);
+        openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink());
         return;
       }
 
@@ -99,7 +110,7 @@ public static void processLink(String url) {
           .route(SpMobil.getUser(), shortcutAppId, shortcutContentType, shortcutContentId, null, null);
       return;
     }
-    openExternalLink(url);
+    openExternalLink(url, hyperLinkDTO.getOpenNewWindow(), hyperLinkDTO.getInternalLink());
   }
 
   private static boolean sameContext(String url) {
@@ -113,18 +124,33 @@ private static boolean sameContext(String url) {
     return ((url.startsWith("/") || url.startsWith(context)));
   }
 
-  public static void openExternalLink(String url) {
+  public static void openExternalLink(String url, boolean openNewWindow, boolean internalLink) {
     if (MobilUtils.isIOS()) {
       if (iosShowIframe) {
-        IframePage page = new IframePage(url);
-        page.setPageTitle("");
-        page.show();
+        openIframePage(url);
       } else {
-        //Window.Location.assign(url);
-        Window.open(url, "_self", "");
+        openExternalLinkStandard(url, openNewWindow, internalLink);
       }
     } else {
-      Window.open(url, "_blank", "");
+      openExternalLinkStandard(url, openNewWindow, internalLink);
+    }
+  }
+
+  public static void openIframePage(String url) {
+    IframePage page = new IframePage(url);
+    page.setPageTitle("");
+    page.show();
+  }
+
+  private static void openExternalLinkStandard(String url, boolean openNewWindow, boolean internalLink) {
+    if (internalLink) {
+      openIframePage(url);
+    } else {
+      if (openNewWindow) {
+        Window.open(url, "_blank", "");
+      } else {
+        Window.open(url, "_self", "");
+      }
     }
   }
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java
index 1a87c3704..a6f02643a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineBackground.java
@@ -26,12 +26,14 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
 import org.fusesource.restygwt.client.Method;
 import org.fusesource.restygwt.client.MethodCallback;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.EventBus;
 import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.event.ErrorEvent;
+import org.silverpeas.mobile.client.common.resources.ResourcesManager;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 
 /**
@@ -49,12 +51,16 @@ public void attempt() {
   public void onFailure(final Method method, final Throwable t) {
     if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) {
       // Session expired, need to re-authent
-      SpMobil.getInstance().loadIds(new Command() {
-        @Override
-        public void execute() {
-          attempt();
-        }
-      });
+      if (SpMobil.isSSO()) {
+        Window.Location.assign(ResourcesManager.getSSOPath());
+      } else {
+        SpMobil.getInstance().loadIds(new Command() {
+          @Override
+          public void execute() {
+            attempt();
+          }
+        });
+      }
     } else {
       if (NetworkHelper.needToGoOffine(t)) {
         // Lost connexion during requesting
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java
index c0faa2217..02dc28f59 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/MethodCallbackOnlineOnly.java
@@ -26,12 +26,15 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
 import org.fusesource.restygwt.client.Method;
 import org.fusesource.restygwt.client.MethodCallback;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.EventBus;
 import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.event.ErrorEvent;
+import org.silverpeas.mobile.client.common.resources.ResourcesManager;
+import org.silverpeas.mobile.client.components.Popin;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 
 /**
@@ -51,12 +54,18 @@ public void onFailure(final Method method, final Throwable t) {
     Notification.activityStop();
     if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) {
       // Session expired, need to re-authent
-      SpMobil.getInstance().loadIds(new Command() {
-        @Override
-        public void execute() {
-          attempt();
-        }
-      });
+      if (SpMobil.isSSO()) {
+        Window.Location.assign(ResourcesManager.getSSOPath());
+      } else {
+        SpMobil.getInstance().loadIds(new Command() {
+          @Override
+          public void execute() {
+            attempt();
+          }
+        });
+      }
+    } else if (method.getResponse().getStatusCode() == 404) {
+      new Popin(msg.notfoundError()).show();
     } else {
       if (NetworkHelper.needToGoOffine(t)) {
         // Lost connexion during requesting
@@ -72,6 +81,4 @@ public void execute() {
   public void onSuccess(final Method method, final T t) {
     Notification.activityStop();
   }
-
-
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java
index a0c54a3f0..55164fe1d 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/network/TextCallbackOnlineOnly.java
@@ -26,12 +26,14 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.Window;
 import org.fusesource.restygwt.client.Method;
 import org.fusesource.restygwt.client.TextCallback;
 import org.silverpeas.mobile.client.SpMobil;
 import org.silverpeas.mobile.client.common.EventBus;
 import org.silverpeas.mobile.client.common.Notification;
 import org.silverpeas.mobile.client.common.event.ErrorEvent;
+import org.silverpeas.mobile.client.common.resources.ResourcesManager;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 
 /**
@@ -56,12 +58,16 @@ public void onFailure(final Method method, final Throwable t) {
     Notification.activityStop();
     if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) {
       // Session expired, need to re-authent
-      SpMobil.getInstance().loadIds(new Command() {
-        @Override
-        public void execute() {
-          attempt();
-        }
-      });
+      if (SpMobil.isSSO()) {
+        Window.Location.assign(ResourcesManager.getSSOPath());
+      } else {
+        SpMobil.getInstance().loadIds(new Command() {
+          @Override
+          public void execute() {
+            attempt();
+          }
+        });
+      }
     } else {
       if (NetworkHelper.needToGoOffine(t)) {
         // Lost connexion during requesting
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java
index 154d62fdc..04f25dab2 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/common/resources/ResourcesManager.java
@@ -26,8 +26,10 @@
 
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsonUtils;
+import com.google.gwt.dom.client.Document;
 import com.google.gwt.json.client.JSONObject;
 import com.google.gwt.json.client.JSONParser;
+import org.silverpeas.mobile.client.apps.documents.DocumentsApp;
 
 /**
  * @author: svu
@@ -63,6 +65,10 @@ public static String getParam(String key) {
     return param;
   }
 
+  public static String getSSOPath() {
+    return Document.get().getElementById("ssoPath").getAttribute("value");
+  }
+
   public static native JavaScriptObject getLabels() /*-{
     return $wnd.labels;
   }-*/;
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java
index 8acefe203..894b041e9 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/IframePage.java
@@ -55,6 +55,7 @@ private void init() {
     frame.getElement().getStyle().setTop(SpMobil.getMainPage().getHeaderHeight(), Style.Unit.PX);
     setViewport();
     initWidget(frame);
+    setSize("100vw", "100vh");
     EventBus.getInstance().addHandler(AbstractWindowEvent.TYPE, this);
   }
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java
index 67383d171..65ee2070f 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/attachments/Attachment.java
@@ -45,6 +45,7 @@
 import org.silverpeas.mobile.client.common.navigation.UrlUtils;
 import org.silverpeas.mobile.client.common.network.NetworkHelper;
 import org.silverpeas.mobile.client.common.storage.CacheStorageHelper;
+import org.silverpeas.mobile.client.components.IframePage;
 import org.silverpeas.mobile.client.resources.ApplicationMessages;
 import org.silverpeas.mobile.shared.dto.documents.SimpleDocumentDTO;
 
@@ -81,9 +82,9 @@ public void setAttachment(SimpleDocumentDTO data) {
   private void render() {
     Image img = null;
     String sizeValue;
-      /*if (!data..isDownloadAllowed()) {
-        link.setStylePrimaryName("not-downloadable");
-      }*/
+    if (!data.isDownloadable()) {
+      link.setStylePrimaryName("not-downloadable");
+    }
     if (data.getSize() < 1024 * 1024) {
       sizeValue = String.valueOf(data.getSize() / 1024);
       size.setInnerHTML(msg.sizeK(sizeValue));
@@ -121,43 +122,68 @@ private void render() {
     // link generation
     try {
       String url = UrlUtils.getAttachedFileLocation();
-      url += "componentId/";
-      url += data.getInstanceId();
-      url += "/attachmentId/";
-      url += data.getId();
-      url += "/lang/";
-      url += data.getLang();
-      url += "/name/";
-      url += data.getFileName();
-
+      if (data.isDownloadable()) {
+        url += "componentId/";
+        url += data.getInstanceId();
+        url += "/attachmentId/";
+        url += data.getId();
+        url += "/lang/";
+        url += data.getLang();
+        url += "/name/";
+        url += data.getFileName();
+      } else {
+        url = "#";
+      }
       link.setHref(url);
       if (MobilUtils.isIOS()) {
-        //link.setTarget("_blank");
-        link.addClickHandler(new ClickHandler() {
-          @Override
-          public void onClick(final ClickEvent clickEvent) {
-            String u = ((Anchor) clickEvent.getSource()).getHref();
-            if (NetworkHelper.isOnline()) {
-              CacheStorageHelper.store(u);
+        if (data.isDownloadable()) {
+          link.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent clickEvent) {
+              String u = ((Anchor) clickEvent.getSource()).getHref();
+              if (NetworkHelper.isOnline()) {
+                CacheStorageHelper.store(u);
+              }
+              Window.open(u, "_blank", "fullscreen=yes");
             }
-            Window.open(u, "_blank", "fullscreen=yes");
-          }
-        });
+          });
+        } else {
+          link.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent clickEvent) {
+              viewDocument();
+            }
+          });
+        }
       } else {
-        link.setTarget("_self");
-        link.getElement().setAttribute("download", data.getFileName());
-        link.addClickHandler(new ClickHandler() {
-          @Override
-          public void onClick(final ClickEvent clickEvent) {
-            if (NetworkHelper.isOnline()) {
-              CacheStorageHelper.store(((Anchor) clickEvent.getSource()).getHref());
+        if (data.isDownloadable()) {
+          link.setTarget("_self");
+          link.getElement().setAttribute("download", data.getFileName());
+          link.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent clickEvent) {
+              if (NetworkHelper.isOnline()) {
+                CacheStorageHelper.store(((Anchor) clickEvent.getSource()).getHref());
+              }
+            }
+          });
+        } else {
+          link.addClickHandler(new ClickHandler() {
+            @Override
+            public void onClick(final ClickEvent clickEvent) {
+              viewDocument();
             }
-          }
-        });
+          });
+        }
       }
     } catch (JavaScriptException e) {
       Notification.alert(e.getMessage());
     }
 
   }
+
+private void viewDocument() {
+    IframePage page = new IframePage("/silverpeas/services/media/viewer/embed/pdf?documentId="+data.getId()+"&documentType=attachment&language="+data.getLang()+"&embedPlayer=true");
+    page.show();
+  }
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java
index a0d51b46f..106659320 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/base/NavigationMenu.java
@@ -93,8 +93,13 @@ public NavigationMenu() {
     user.getElement().setId("user");
     String url = ResourcesManager.getParam("help.url");
     if (url != null && !url.isEmpty()) {
+      String target = ResourcesManager.getParam("help.target");
       help.setHref(url);
-      help.setTarget("_self");
+      if (target != null && !target.isEmpty()) {
+        help.setTarget(target);
+      } else {
+        help.setTarget("_blank");
+      }
     }
     EventBus.getInstance().addHandler(AbstractPageEvent.TYPE, this);
   }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java
index c0bbcb2d7..a5f9c55c8 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/components/forms/FieldEditable.java
@@ -165,7 +165,7 @@ public void setData(FormFieldDTO data) {
       t.setReadOnly(data.isReadOnly());
       t.addChangeHandler(this);
       w = t;
-    }  else if(type.equalsIgnoreCase("text") || type.equalsIgnoreCase("simpletext")) {
+    }  else if(type.equalsIgnoreCase("text") || type.equalsIgnoreCase("simpletext") || type.equalsIgnoreCase("map")) {
       TextBox t = new TextBox();
       t.setText(data.getValue());
       t.setReadOnly(data.isReadOnly());
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
index 138717225..40512753a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages.java
@@ -45,7 +45,7 @@ public interface ApplicationMessages extends Messages {
   @DefaultMessage("Corriger")
   String correctBtnLabel();
 
-  @DefaultMessage("© 2001-2020 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- Tous droits réservés")
+  @DefaultMessage("© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- Tous droits réservés")
   SafeHtml copyright();
 
   @DefaultMessage("Parcourir la plateforme")
@@ -186,4 +186,7 @@ public interface ApplicationMessages extends Messages {
   @DefaultMessage("Envoyées")
   SafeHtml sended();
 
+  @DefaultMessage("Ressource non trouvée")
+  String notfoundError();
+
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties
index 355e02b4d..3948f3666 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_en.properties
@@ -30,7 +30,7 @@ confirmBtnLabel=Confirm
 cancelBtnLabel=Cancel
 correctBtnLabel=Correct
 
-copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- All rights reserved
+copyright=© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- All rights reserved
 infoTitle=Information
 ok=OK
 
@@ -80,4 +80,6 @@ showPwd=Show password
 hidePwd=Hide password
 
 received=Received
-sended=Sended
\ No newline at end of file
+sended=Sended
+
+notfoundError=Ressource not found
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties
index a7b654cf2..2b050fc99 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/client/resources/ApplicationMessages_fr.properties
@@ -29,7 +29,7 @@ confirmBtnLabel=Confirmer
 cancelBtnLabel=Annuler
 correctBtnLabel=Corriger
 
-copyright=© 2001-2016 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- Tous droits réservés
+copyright=© 2001-2023 <a target='_blank' href='http://www.silverpeas.com'>Silverpeas</a>	- Tous droits réservés
 
 infoTitle=Information
 ok=OK
@@ -83,4 +83,6 @@ showPwd=Afficher le mot de passe
 hidePwd=Masquer le mot de passe
 
 received=Reçues
-sended=Envoyées
\ No newline at end of file
+sended=Envoyées
+
+notfoundError=Ressource non trouv�e
\ No newline at end of file
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java
index 4d4ff5c4c..5dc7d34e7 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/UserNotificationServerEventMobileListener.java
@@ -25,8 +25,11 @@
 package org.silverpeas.mobile.server;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.jsoup.Jsoup;
 import org.silverpeas.core.notification.sse.CDIServerEventListener;
 import org.silverpeas.core.notification.user.UserNotificationServerEvent;
+import org.silverpeas.core.notification.user.server.channel.silvermail.SILVERMAILMessage;
+import org.silverpeas.core.notification.user.server.channel.silvermail.SILVERMAILPersistence;
 import org.silverpeas.core.util.logging.SilverLogger;
 import org.silverpeas.mobile.server.services.helpers.NotificationsPushHelper;
 
@@ -48,7 +51,11 @@ public void on(final UserNotificationServerEvent event) {
       String json = event.getData("", null);
       Map<String, Object> data = mapper.readValue(json, Map.class);
       Boolean isCreation = (Boolean) data.get("isCreation");
+      String id = (String) data.get("id");
       if (Boolean.TRUE.equals(isCreation)) {
+        SILVERMAILMessage msg =  SILVERMAILPersistence.getMessage(event.getEmitterUserId(), Long.valueOf(id));
+        data.put("body", Jsoup.parse(msg.getBody()).wholeText());
+        data.put("notificationId", (String) id);
         NotificationsPushHelper.getInstance().sendNotification(emitterUserId, data);
       }
     } catch(Exception e) {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java
index 0c3940eb8..fb02aa517 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/AbstractRestWebService.java
@@ -4,10 +4,15 @@
 import org.silverpeas.core.security.authentication.AuthenticationCredential;
 import org.silverpeas.core.security.authentication.AuthenticationService;
 import org.silverpeas.core.security.authentication.AuthenticationServiceProvider;
+import org.silverpeas.core.security.session.SessionInfo;
+import org.silverpeas.core.security.session.SessionManagement;
+import org.silverpeas.core.security.session.SessionManagementProvider;
 import org.silverpeas.core.util.ResourceLocator;
 import org.silverpeas.core.util.SettingBundle;
+import org.silverpeas.core.util.logging.SilverLogger;
 import org.silverpeas.core.web.mvc.controller.MainSessionController;
 import org.silverpeas.core.web.rs.RESTWebService;
+import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory;
 import org.silverpeas.mobile.server.common.CommandCreateList;
 import org.silverpeas.mobile.shared.StreamingList;
 import org.silverpeas.mobile.shared.dto.BaseDTO;
@@ -43,6 +48,33 @@ protected void setMainsessioncontroller(String login, String password, String do
         new MainSessionController(key, getHttpRequest().getSession());
   }
 
+  protected void initSilverpeasSession(HttpServletRequest request) {
+    MainSessionController controller = (MainSessionController) request.getSession()
+            .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT);
+    if (controller == null) {
+      SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement();
+      SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId());
+      if (sessionInfo.getSessionId() == null) {
+        sessionInfo = sessionManagement.openSession(getUser(), request);
+      }
+
+      try {
+        controller = new MainSessionController(sessionInfo, request.getSession());
+      } catch (SilverpeasException e) {
+        SilverLogger.getLogger(this).error(e);
+      }
+      request.getSession()
+              .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller);
+    }
+
+    GraphicElementFactory gef = (GraphicElementFactory) request.getSession()
+            .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT);
+    if (gef == null && controller != null) {
+      gef = new GraphicElementFactory(controller);
+      request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef);
+    }
+  }
+
   protected StreamingList createStreamingList(CommandCreateList command, int callNumber, int callSize, String cacheKey) throws Exception {
     List list;
     if (callNumber == 0) {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java
index 4f03332f3..50b931f58 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceConnection.java
@@ -40,8 +40,14 @@
 import org.silverpeas.core.security.authentication.exception.AuthenticationPwdNotAvailException;
 import org.silverpeas.core.security.authentication.exception.AuthenticationUserAccountBlockedException;
 import org.silverpeas.core.security.authentication.exception.AuthenticationUserAccountDeactivatedException;
+import org.silverpeas.core.security.session.SessionInfo;
+import org.silverpeas.core.security.session.SessionManagement;
+import org.silverpeas.core.security.session.SessionManagementProvider;
+import org.silverpeas.core.util.logging.SilverLogger;
 import org.silverpeas.core.web.chat.listeners.ChatUserAuthenticationListener;
+import org.silverpeas.core.web.mvc.controller.MainSessionController;
 import org.silverpeas.core.web.rs.UserPrivilegeValidation;
+import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory;
 import org.silverpeas.mobile.server.helpers.DataURLHelper;
 import org.silverpeas.mobile.server.services.helpers.UserHelper;
 import org.silverpeas.mobile.shared.dto.DetailUserDTO;
@@ -137,6 +143,8 @@ public DetailUserDTO login(List<String> ids) {
       throw new WebApplicationException(AuthenticationError.CanCreateMainSessionController.name());
     }
 
+    initSilverpeasSession();
+
     DetailUserDTO userDTO = new DetailUserDTO();
     userDTO = UserHelper.getInstance().populate(user);
 
@@ -154,6 +162,33 @@ public DetailUserDTO login(List<String> ids) {
     return userDTO;
   }
 
+  private void initSilverpeasSession() {
+    MainSessionController controller = (MainSessionController) request.getSession()
+            .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT);
+    if (controller == null) {
+      SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement();
+      SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId());
+      if (sessionInfo.getSessionId() == null) {
+        sessionInfo = sessionManagement.openSession(getUser(), request);
+      }
+
+      try {
+        controller = new MainSessionController(sessionInfo, request.getSession());
+      } catch (SilverpeasException e) {
+        SilverLogger.getLogger(this).error(e);
+      }
+      request.getSession()
+              .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller);
+    }
+
+    GraphicElementFactory gef = (GraphicElementFactory) request.getSession()
+            .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT);
+    if (gef == null && controller != null) {
+      gef = new GraphicElementFactory(controller);
+      request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef);
+    }
+  }
+
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Path("userExist/{login}/{domainId}")
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java
index f833cff1d..c30596ee0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceContact.java
@@ -132,7 +132,8 @@ public List<DetailUserDTO> getContacts(@PathParam("type") String type,
         List tabUserDetail = getUsersByQuery(filter, "UserFull");
         for (int i = 0; i < tabUserDetail.size(); i++) {
           if (i >= startIndex && i < startIndex + pageSize) {
-            listUsers.add(populate(tabUserDetail.get(i)));
+            DetailUserDTO dto = populate(tabUserDetail.get(i));
+            if (dto != null) listUsers.add(dto);
           }
         }
       } else if (type.equals(ContactFilters.ALL_EXT)) {
@@ -320,19 +321,20 @@ private DetailUserDTO populate(Object user) {
       SilverLogger.getLogger(this).debug(SpMobileLogModule.getName(), "ServiceContact.populate",
           "User id=" + userDetail.getId());
       UserFull userFull = UserFull.getById(userDetail.getId());
-      DetailUserDTO dto = new DetailUserDTO();
-      dto.setId(userFull.getId());
-      dto.setFirstName(userFull.getFirstName());
-      dto.setLastName(userFull.getLastName());
-      dto.seteMail(userFull.geteMail());
-      dto.setStatus(userFull.getStatus());
-      dto.setAvatar(userFull.getAvatar());
-      dto.setLanguage(userFull.getUserPreferences().getLanguage());
-      dto.setConnected(userFull.isConnected());
-      String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(),
-          getSettings().getString("avatar.size", "24x"));
-      dto.setAvatar(avatar);
+      DetailUserDTO dto = null;
       if (userFull != null) {
+        dto = new DetailUserDTO();
+        dto.setId(userFull.getId());
+        dto.setFirstName(userFull.getFirstName());
+        dto.setLastName(userFull.getLastName());
+        dto.seteMail(userFull.geteMail());
+        dto.setStatus(userFull.getStatus());
+        dto.setAvatar(userFull.getAvatar());
+        dto.setLanguage(userFull.getUserPreferences().getLanguage());
+        dto.setConnected(userFull.isConnected());
+        String avatar = DataURLHelper.convertAvatarToUrlData(userDetail.getAvatarFileName(),
+            getSettings().getString("avatar.size", "24x"));
+        dto.setAvatar(avatar);
         for (String prop : getUserProperties()) {
           dto.addProperty(prop, userFull.getValue(prop));
         }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java
index 5ba98fe69..8ac52841f 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceDocuments.java
@@ -40,6 +40,7 @@
 import org.silverpeas.core.contribution.attachment.AttachmentServiceProvider;
 import org.silverpeas.core.contribution.attachment.model.SimpleDocument;
 import org.silverpeas.core.contribution.attachment.model.SimpleDocumentPK;
+import org.silverpeas.core.contribution.attachment.util.SimpleDocumentList;
 import org.silverpeas.core.contribution.publication.model.CompletePublication;
 import org.silverpeas.core.contribution.publication.model.PublicationDetail;
 import org.silverpeas.core.contribution.publication.model.PublicationLink;
@@ -444,6 +445,18 @@ public PublicationDTO getPublication(@PathParam("id") String id,
         } catch (Exception e) {
           SilverLogger.getLogger(this).warn("Unable to get views number", e);
         }
+
+        // List all attachements not downloadable for readers
+        ResourceReference foreignKey = new ResourceReference(id, componentId);
+        SimpleDocumentList<SimpleDocument> attachements = AttachmentServiceProvider.getAttachmentService().listAllDocumentsByForeignKey(foreignKey, null);
+        ArrayList<String> notAllowedDownloads = new ArrayList<>();
+        for (SimpleDocument attachement : attachements) {
+          if (!attachement.isDownloadAllowedForReaders() && !attachement.canBeModifiedBy(getUser())) {
+            notAllowedDownloads.add(attachement.getId());
+          }
+        }
+        dto.setNotAllowedDownloads(notAllowedDownloads);
+
       } else if (type.equals(ContentsTypes.News.toString())) {
         dto.setViewsNumber(QuickInfoService.get().getNews(contributionId).getNbAccess());
       } else {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java
index 162fcd486..cd3bc7022 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceFormsOnline.java
@@ -25,6 +25,7 @@
 package org.silverpeas.mobile.server.services;
 
 import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.silverpeas.components.formsonline.FormsOnlineComponentSettings;
 import org.silverpeas.components.formsonline.model.FormDetail;
 import org.silverpeas.components.formsonline.model.FormInstance;
@@ -47,6 +48,7 @@
 import org.silverpeas.core.contribution.content.form.Form;
 import org.silverpeas.core.contribution.content.form.FormException;
 import org.silverpeas.core.contribution.content.form.RecordSet;
+import org.silverpeas.core.contribution.content.form.form.HtmlForm;
 import org.silverpeas.core.contribution.content.form.form.XmlForm;
 import org.silverpeas.core.contribution.content.form.record.GenericFieldTemplate;
 import org.silverpeas.core.contribution.template.publication.PublicationTemplate;
@@ -247,16 +249,30 @@ private FormRequestDTO populate(final FormInstance f)
         dto.setStateLabel(formsOnlineBundle.getString("formsOnline.stateUnread"));
         break;
     }
-    XmlForm formXml = ((XmlForm) f.getFormWithData());
-    if (formXml != null) {
-      DataRecord record = formXml.getData();
-      List<FormFieldDTO> dataForm = new ArrayList<>();
-      for (String name : record.getFieldNames()) {
-        Field field = record.getField(name);
-        FormFieldDTO fieldDTO = populateField(f, field);
-        dataForm.add(fieldDTO);
+    if (f.getFormWithData() instanceof XmlForm) {
+      XmlForm formXml = ((XmlForm) f.getFormWithData());
+      if (formXml != null) {
+        DataRecord record = formXml.getData();
+        List<FormFieldDTO> dataForm = new ArrayList<>();
+        for (String name : record.getFieldNames()) {
+          Field field = record.getField(name);
+          FormFieldDTO fieldDTO = populateField(f, field);
+          dataForm.add(fieldDTO);
+        }
+        dto.setData(dataForm);
+      }
+    } else {
+      HtmlForm formHTML = ((HtmlForm) f.getFormWithData());
+      if (formHTML != null) {
+        DataRecord record = formHTML.getData();
+        List<FormFieldDTO> dataForm = new ArrayList<>();
+        for (String name : record.getFieldNames()) {
+          Field field = record.getField(name);
+          FormFieldDTO fieldDTO = populateField(f, field);
+          dataForm.add(fieldDTO);
+        }
+        dto.setData(dataForm);
       }
-      dto.setData(dataForm);
     }
     return dto;
   }
@@ -281,8 +297,10 @@ private FormFieldDTO populateField(final FormInstance f, final Field field) {
             fieldDTO.setValueId(field.getValue());
           } else {
             int index = Arrays.asList(keys).indexOf(field.getValue());
-            fieldDTO.setValue(values[index]);
-            fieldDTO.setValueId(field.getValue());
+            if (index != -1) {
+              fieldDTO.setValue(values[index]);
+              fieldDTO.setValueId(field.getValue());
+            }
           }
 
         } else {
@@ -352,6 +370,12 @@ public List<FormFieldDTO> getForm(@PathParam("formName") String formName) {
     List<FormFieldDTO> fields = new ArrayList<>();
 
     try {
+      if (NumberUtils.isDigits(formName)) {
+        FormPK pk = new FormPK(formName, componentId);
+        FormDetail fd = FormsOnlineService.get().loadForm(pk);
+        formName = fd.getXmlFormName();
+      }
+
       PublicationTemplate template = getPublicationTemplate(formName, true);
       Form formUpdate = getEmptyForm(template);
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java
index 7e2ee9400..186e7f6e5 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceHyperLink.java
@@ -29,6 +29,7 @@
 import org.silverpeas.core.admin.service.Administration;
 import org.silverpeas.core.annotation.WebService;
 import org.silverpeas.core.web.rs.annotation.Authorized;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
@@ -47,23 +48,27 @@ public class ServiceHyperLink extends AbstractRestWebService {
   @Context
   HttpServletRequest request;
 
-  @PathParam("mobile/appId")
+  @PathParam("appId")
   private String componentId;
 
-  static final String PATH = "hyperlink";
+  static final String PATH = "mobile/hyperlink";
 
   @GET
-  @Produces(MediaType.TEXT_PLAIN)
+  @Produces(MediaType.APPLICATION_JSON)
   @Path("/")
-  public String getUrl() {
-    String url = "";
+  public HyperLinkDTO getUrl() {
+    HyperLinkDTO dto = new HyperLinkDTO();
     try {
       ComponentInstLight app = Administration.get().getComponentInstLight(componentId);
-      url = app.getParameterValue("URL");
+      dto.setUrl(app.getParameterValue("URL"));
+      String v = app.getParameterValue("openNewWindow");
+      dto.setOpenNewWindow(v.equalsIgnoreCase("yes"));
+      v = app.getParameterValue("isInternalLink");
+      dto.setInternalLink(v.equalsIgnoreCase("yes"));
     } catch (AdminException e) {
       throw new WebApplicationException(e);
     }
-    return url;
+    return dto;
   }
 
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java
index 9242b31cc..c8d846b16 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceMedia.java
@@ -400,7 +400,7 @@ public VideoStreamingDTO getVideoStreaming(@PathParam("appId") String instanceId
    */
   @GET
   @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-  @Path("videostream/{pictureId}")
+  @Path("photo/{pictureId}")
   public PhotoDTO getPreviewPicture(@PathParam("appId") String instanceId, @PathParam("pictureId") String pictureId) {
 
     PhotoDTO picture = null;
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java
index 7f05dc493..7f0a958b0 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNavigation.java
@@ -25,14 +25,10 @@
 package org.silverpeas.mobile.server.services;
 
 import org.apache.commons.lang3.EnumUtils;
-import org.jsoup.Connection;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
 import org.silverpeas.components.gallery.model.Media;
 import org.silverpeas.components.gallery.model.MediaPK;
 import org.silverpeas.components.gallery.service.MediaServiceProvider;
 import org.silverpeas.components.quickinfo.model.News;
-import org.silverpeas.core.SilverpeasException;
 import org.silverpeas.core.admin.component.model.ComponentInst;
 import org.silverpeas.core.admin.component.model.ComponentInstLight;
 import org.silverpeas.core.admin.service.AdminException;
@@ -47,15 +43,11 @@
 import org.silverpeas.core.contribution.publication.model.PublicationPK;
 import org.silverpeas.core.contribution.publication.service.PublicationService;
 import org.silverpeas.core.mylinks.model.LinkDetail;
-import org.silverpeas.core.security.session.SessionInfo;
-import org.silverpeas.core.security.session.SessionManagement;
-import org.silverpeas.core.security.session.SessionManagementProvider;
 import org.silverpeas.core.security.token.synchronizer.SynchronizerToken;
 import org.silverpeas.core.util.SettingBundle;
 import org.silverpeas.core.util.StringUtil;
 import org.silverpeas.core.util.logging.SilverLogger;
 import org.silverpeas.core.web.look.PublicationHelper;
-import org.silverpeas.core.web.mvc.controller.MainSessionController;
 import org.silverpeas.core.web.rs.UserPrivilegeValidation;
 import org.silverpeas.core.web.rs.annotation.Authorized;
 import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory;
@@ -66,31 +58,15 @@
 import org.silverpeas.mobile.server.services.helpers.UserHelper;
 import org.silverpeas.mobile.server.services.helpers.events.EventsHelper;
 import org.silverpeas.mobile.server.services.helpers.events.NextEvents;
-import org.silverpeas.mobile.shared.dto.ContentsTypes;
-import org.silverpeas.mobile.shared.dto.DetailUserDTO;
-import org.silverpeas.mobile.shared.dto.HomePageDTO;
-import org.silverpeas.mobile.shared.dto.RightDTO;
-import org.silverpeas.mobile.shared.dto.ShortCutLinkDTO;
+import org.silverpeas.mobile.shared.dto.*;
 import org.silverpeas.mobile.shared.dto.almanach.CalendarEventDTO;
 import org.silverpeas.mobile.shared.dto.documents.PublicationDTO;
-import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;
-import org.silverpeas.mobile.shared.dto.navigation.Apps;
-import org.silverpeas.mobile.shared.dto.navigation.HomePages;
-import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO;
-import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO;
+import org.silverpeas.mobile.shared.dto.navigation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
-import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -199,34 +175,6 @@ private DetailUserDTO initSession(DetailUserDTO user) {
       return null;
     }
   }
-
-  private void initSilverpeasSession() {
-    MainSessionController controller = (MainSessionController) request.getSession()
-        .getAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT);
-    if (controller == null) {
-      SessionManagement sessionManagement = SessionManagementProvider.getSessionManagement();
-      SessionInfo sessionInfo = sessionManagement.validateSession(request.getSession().getId());
-      if (sessionInfo.getSessionId() == null) {
-        sessionInfo = sessionManagement.openSession(getUser(), request);
-      }
-
-      try {
-        controller = new MainSessionController(sessionInfo, request.getSession());
-      } catch (SilverpeasException e) {
-        SilverLogger.getLogger(this).error(e);
-      }
-      request.getSession()
-          .setAttribute(MainSessionController.MAIN_SESSION_CONTROLLER_ATT, controller);
-    }
-
-    GraphicElementFactory gef = (GraphicElementFactory) request.getSession()
-        .getAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT);
-    if (gef == null && controller != null) {
-      gef = new GraphicElementFactory(controller);
-      request.getSession().setAttribute(GraphicElementFactory.GE_FACTORY_SESSION_ATT, gef);
-    }
-  }
-
   protected void setUserInSession(UserDetail user) {
     request.getSession().setAttribute(AbstractAuthenticateService.USER_ATTRIBUT_NAME, user);
   }
@@ -241,7 +189,8 @@ protected UserDetail getUserInSession() {
   public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
     if (spaceId.equals("null")) spaceId = null;
 
-    initSilverpeasSession();
+    initSilverpeasSession(request);
+    request.getSession().setAttribute("Silverpeas_Portlet_SpaceId", spaceId);
 
     String look = "";
     try {
@@ -280,14 +229,14 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
       if (spaceId == null) {
         maxNews = settings.getInteger("home.news.size", 3);
       } else {
-        maxNews = settings.getInteger("home.news.size", 3);
-      }
-      List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId);
-      if (lastNews != null && lastNews.size() > maxNews) {
-        lastNews = lastNews.subList(0, maxNews);
+        maxNews = settings.getInteger("space.homepage.news.nb", 3);
       }
 
-      data.setNews(NewsHelper.getInstance().populate(lastNews, false));
+      if ((spaceId == null && getSettings().getBoolean("homepage.lastnews", true)) ||
+              (spaceId != null && getSettings().getBoolean("spacehomepage.lastnews", true))) {
+        List<News> lastNews = NewsHelper.getInstance().getLastNews(getUser().getId(), spaceId, maxNews);
+        data.setNews(NewsHelper.getInstance().populate(lastNews, false));
+      }
 
       if (spaceId == null || spaceId.isEmpty()) {
         List<LinkDetail> links =
@@ -407,12 +356,13 @@ public HomePageDTO getHomePageData(@PathParam("spaceId") String spaceId) {
         }
       } else if (spaceId != null) {
         SpaceInst space = Administration.get().getSpaceInstById(spaceId);
-        if (space.getFirstPageType() == HomePages.URL.getValue()) {
+        if (space.getFirstPageType() == HomePages.URL.getValue() &&
+                getSettings().getBoolean("spacehomepage.displayUrlType")) {
+          String url = space.getFirstPageExtraParam();
+          if (url.startsWith("/") && !url.startsWith("/silverpeas") && !url.startsWith("$")) url = "/silverpeas" + url;
           String html =
-              "<iframe frameborder='0' onLoad='javaScript:this.height = this.contentWindow" +
-                  ".document.body" +
-                  ".scrollHeight ;' style='width:100%;' src='" + space.getFirstPageExtraParam() +
-                  "'></iframe>";
+                  "<iframe frameborder='0' style='width:100vw;height:100vh' src='" + url +
+                          "'></iframe>";
           data.setHtmlFreeZone(html);
         }
       }
@@ -514,6 +464,22 @@ public Boolean isWorkflowApp(@PathParam("instanceId") String intanceId) {
     }
   }
 
+  @GET
+  @Produces(MediaType.APPLICATION_JSON)
+  @Path("space/{spaceId}/")
+  public SpaceDTO getSpace(@PathParam("spaceId") String spaceId) {
+    try {
+      SpaceInst space = Administration.get().getSpaceInstById(spaceId);
+      SpaceDTO dto = new SpaceDTO();
+      dto.setHomePageType(space.getFirstPageType());
+      dto.setHomePageParameter(space.getFirstPageExtraParam());
+      return dto;
+    } catch (AdminException e) {
+      SilverLogger.getLogger(this).error(e);
+      throw new WebApplicationException(e);
+    }
+  }
+
   //TODO : remove appType
   @GET
   @Produces(MediaType.APPLICATION_JSON)
@@ -523,7 +489,7 @@ public List<SilverpeasObjectDTO> getSpacesAndApps(@PathParam("rootSpaceId") Stri
     if (rootSpaceId !=null && rootSpaceId.equals("null")) rootSpaceId = null;
     try {
       if (rootSpaceId == null) {
-        String[] spaceIds = Administration.get().getAllSpaceIds(getUser().getId());
+        String[] spaceIds = Administration.get().getAllRootSpaceIds(getUser().getId());
         for (String spaceId : spaceIds) {
           SpaceInst space = Administration.get().getSpaceInstById(spaceId);
           if (!space.isRemoved()) {
@@ -580,18 +546,22 @@ public ApplicationInstanceDTO getApp(@PathParam("instanceId") String instanceId,
     if (instanceId == null) {
       if (contentType.equals(ContentsTypes.Publication.name())) {
         PublicationDetail pub = PublicationService.get().getDetail(new PublicationPK(contentId));
+        if (pub == null) throw new NotFoundException();
         instanceId = pub.getInstanceId();
       } else if (contentType.equals(ContentsTypes.Media.name())) {
         Media media = MediaServiceProvider.getMediaService().getMedia(new MediaPK(contentId));
+        if (media == null) throw new NotFoundException();
         instanceId = media.getInstanceId();
       } else if (contentType.equals(ContentsTypes.Event.name())) {
         ContributionIdentifier contributionId =
             ContributionIdentifier.decode(new String(StringUtil.fromBase64(contentId)));
         localId = contributionId.getLocalId();
         instanceId = contributionId.getComponentInstanceId();
+        if (instanceId.equals("?")) throw new NotFoundException();
       }
     }
     ApplicationInstanceDTO dto = getApplicationInstanceDTO(instanceId);
+    if (dto == null) throw new NotFoundException();
     dto.setExtraId(localId);
     return dto;
   }
@@ -621,7 +591,6 @@ private boolean containApp(SpaceInst space) throws Exception {
   private String[] getUserRoles(String componentId, String userId) {
     return organizationController.getUserProfiles(userId, componentId);
   }
-
   private SpaceDTO populate(SpaceInst space) {
     SpaceDTO dto = new SpaceDTO();
     dto.setId(space.getId());
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java
index fb1d8114a..a9e3d7dd4 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/ServiceNotifications.java
@@ -355,7 +355,7 @@ public void delete(List<NotificationBoxDTO> selection) {
     if (selection.get(0) instanceof NotificationSendedDTO) {
       for (NotificationBoxDTO dto : selection) {
         try {
-          SentNotificationInterface.get().deleteNotif((int) dto.getIdNotif(), getUser().getId());
+          SentNotificationInterface.get().deleteNotif(String.valueOf(dto.getIdNotif()), Integer.parseInt(getUser().getId()));
         } catch (NotificationException e) {
           SilverLogger.getLogger(this).error(e);
         }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java
index 988e1f1b6..1d656df19 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NewsHelper.java
@@ -36,18 +36,13 @@
 import org.silverpeas.core.admin.service.AdminException;
 import org.silverpeas.core.admin.service.Administration;
 import org.silverpeas.core.admin.service.OrganizationController;
+import org.silverpeas.core.admin.user.model.UserDetail;
 import org.silverpeas.core.contribution.publication.model.PublicationDetail;
-import org.silverpeas.core.contribution.publication.service.PublicationService;
 import org.silverpeas.core.io.file.ImageResizingProcessor;
 import org.silverpeas.core.io.file.SilverpeasFileProcessor;
-import org.silverpeas.core.util.CollectionUtil;
-import org.silverpeas.core.util.ResourceLocator;
-import org.silverpeas.core.util.ServiceProvider;
-import org.silverpeas.core.util.SettingBundle;
-import org.silverpeas.core.util.StringUtil;
+import org.silverpeas.core.util.*;
 import org.silverpeas.core.util.file.FileRepositoryManager;
 import org.silverpeas.core.util.logging.SilverLogger;
-import org.silverpeas.core.web.look.PublicationUpdateDateComparator;
 import org.silverpeas.core.web.util.viewgenerator.html.GraphicElementFactory;
 import org.silverpeas.mobile.shared.dto.news.NewsDTO;
 
@@ -55,12 +50,7 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.MissingResourceException;
+import java.util.*;
 
 /**
  * @author: svu
@@ -80,8 +70,8 @@ public static NewsHelper getInstance() {
     return instance;
   }
 
-  public List<News> getLastNews(String userId, String spaceId) throws Exception {
-    if(spaceId != null) {
+  public List<News> getLastNews(String userId, String spaceId, int maxNews) throws Exception {
+    if (spaceId != null) {
       List<String> appIds = new ArrayList<String>();
       String[] cIds = organizationController.getAvailCompoIds(spaceId, userId);
       for (String id : cIds) {
@@ -94,7 +84,7 @@ public List<News> getLastNews(String userId, String spaceId) throws Exception {
       for (String appId : appIds) {
         news.addAll(service.getVisibleNews(appId));
       }
-      Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
+      news = sortAndTruncate(maxNews, news);
       return news;
     } else {
       // News on main page
@@ -106,15 +96,15 @@ public List<News> getLastNews(String userId, String spaceId) throws Exception {
       } catch (MissingResourceException e) {}
       if (newsSource != null && newsSource.isEmpty() == false) {
           if (newsSource.trim().startsWith("quickinfo")) {
-            news = getNewsByComponentId(newsSource, false, userId);
+            news = getNewsByComponentId(newsSource, false, userId, maxNews);
+            news = sortAndTruncate(maxNews, news);
           } else if (newsSource.trim().equals("*")) {
-            news = getAllNews(userId);
+            news = getAllNews(userId, maxNews);
+            news = sortAndTruncate(maxNews, news);
           } else {
-            news = getDelegatedNews(userId);
+            news = getDelegatedNews(userId, maxNews);
           }
       }
-      Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
-      Collections.reverse(news);
       return news;
     }
   }
@@ -123,21 +113,39 @@ private boolean isVisibleNews(PublicationDetail news) {
     return news.isValid() && news.isVisible();
   }
 
-  private List<News> getDelegatedNews(String userId) throws Exception {
+  private List<News> getDelegatedNews(String userId, int maxNews) throws Exception {
     List<News> news = new ArrayList();
     List<DelegatedNews> delegatedNews = DelegatedNewsServiceProvider.getDelegatedNewsService().getAllValidDelegatedNews();
-
+    UserDetail u = Administration.get().getUserDetail(userId);
+    Date now = new Date();
+    int count = 0;
     for (DelegatedNews delegated : delegatedNews) {
-      PublicationDetail pub = delegated.getPublicationDetail();
-      if (pub.canBeAccessedBy(Administration.get().getUserDetail(userId))) {
-        News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId());
+      if (count >= maxNews) break;
+      News aNews = null;
+      if (delegated.getBeginDate() == null && delegated.getEndDate() == null) {
+        aNews = getNews(delegated, u);
+      } else if (delegated.getBeginDate() != null && now.after(delegated.getBeginDate())
+              && delegated.getEndDate() != null && now.before(delegated.getEndDate())) {
+        aNews = getNews(delegated, u);
+      } else if (delegated.getBeginDate() != null && now.after(delegated.getBeginDate()) && delegated.getEndDate() == null) {
+        aNews = getNews(delegated, u);
+      } else if (delegated.getEndDate() != null && now.before(delegated.getEndDate())) {
+         aNews = getNews(delegated, u);
+      }
+      if (aNews != null) {
         news.add(aNews);
+        count++;
       }
     }
-
     return news;
   }
 
+  private News getNews(DelegatedNews delegated, UserDetail u) {
+    News aNews = QuickInfoService.get().getNewsByForeignId(delegated.getPubId());
+    if (!aNews.canBeAccessedBy(u)) aNews = null;
+    return aNews;
+  }
+
   public List<News> getNewsByAppId(String appId, boolean managerAccess) {
     QuickInfoService service = QuickInfoServiceProvider.getQuickInfoService();
     List<News> news;
@@ -150,19 +158,19 @@ public List<News> getNewsByAppId(String appId, boolean managerAccess) {
     return news;
   }
 
-  private List<News> getAllNews(String userId) throws AdminException {
+  private List<News> getAllNews(String userId, int maxNews) throws AdminException {
     List<News> news = new ArrayList<>();
     List<String> apps = CollectionUtil
         .asList(organizationController.getComponentIdsForUser(userId, "quickinfo"));
     for (String appId : apps) {
-      news.addAll(getNewsByComponentId(appId, false, userId));
+      news.addAll(getNewsByComponentId(appId, false, userId, maxNews));
     }
-    //TODO sort list
+    news = sortAndTruncate(maxNews, news);
 
     return news;
   }
 
-  private List<News> getNewsByComponentId(String appId, boolean managerAccess, String userId) throws AdminException {
+  private List<News> getNewsByComponentId(String appId, boolean managerAccess, String userId, int maxNews) throws AdminException {
     QuickInfoService service = QuickInfoServiceProvider.getQuickInfoService();
     List<News> news = new ArrayList<>();
 
@@ -173,6 +181,17 @@ private List<News> getNewsByComponentId(String appId, boolean managerAccess, Str
         news = service.getVisibleNews(appId);
       }
     }
+    news = sortAndTruncate(maxNews, news);
+
+    return news;
+  }
+
+  private static List<News> sortAndTruncate(int maxNews, List<News> news) {
+    Collections.sort(news, (o1, o2) -> o1.getUpdateDate().compareTo(o2.getUpdateDate()));
+    //Collections.reverse(news);
+    if (news != null && news.size() > maxNews) {
+      news = news.subList(0, maxNews);
+    }
     return news;
   }
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java
index 8eb22cfec..5a6128e46 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/services/helpers/NotificationsPushHelper.java
@@ -130,11 +130,13 @@ public String sendToToken(final String userId, String token, Map<String, Object>
       // This registration token comes from the client FCM SDKs.
 
       // See documentation on defining a message payload.
-      response = getNotificationPermalink(String.valueOf(notifData.get("id")))
+      response = getNotificationPermalink(userId, String.valueOf(notifData.get("id")))
           // No push if no permalink
           .map(l -> Message.builder()
               .putData("subject", String.valueOf(notifData.get("subject")))
               .putData("sender", String.valueOf(notifData.get("sender")))
+              .putData("body", String.valueOf(notifData.get("body")))
+              .putData("notificationId", String.valueOf(notifData.get("notificationId")))
               .putData("permalink", l))
           .map(m -> m.setToken(token))
           .map(Message.Builder::build)
@@ -156,10 +158,8 @@ public String sendToToken(final String userId, String token, Map<String, Object>
     return response;
   }
 
-  private Optional<String> getNotificationPermalink(String id) {
-    return ofNullable(id)
-        .map(Long::decode)
-        .map(SILVERMAILPersistence::getMessage)
-        .map(SILVERMAILMessage::getUrl);
+  private Optional<String> getNotificationPermalink(String userId, String id) {
+    SILVERMAILMessage m = SILVERMAILPersistence.getMessage(userId, Long.valueOf(id));
+    return ofNullable(m.getUrl());
   }
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java
index 679c872d7..083924f12 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/server/servlets/PublicationContentServlet.java
@@ -185,6 +185,17 @@ private void displayWysiwyg(String html, HttpServletRequest request, HttpServlet
       }
       img.attr("src", newSource);
     }
+    Elements anchors = doc.getElementsByTag("a");
+    for (Element a : anchors) {
+      String href = a.attr("href");
+      String target = a.attr("target");
+      if (!target.equalsIgnoreCase("_blank")) {
+        if (href.contains("/silverpeas/") && !href.contains(".jsp")) {
+          a.attr("href", "#");
+          a.attr("onclick", "parent.navigate('" + href + "');");
+        }
+      }
+    }
 
     html = doc.outerHtml();
     OutputStreamWriter out = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java
index 63bb3288c..3048f86d4 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/DetailUserDTO.java
@@ -25,7 +25,9 @@
 package org.silverpeas.mobile.shared.dto;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Set;
 
 public class DetailUserDTO implements Serializable{
@@ -46,18 +48,19 @@ public class DetailUserDTO implements Serializable{
   private String sessionKey;
   private boolean connected;
   private boolean notificationBox;
-  private LinkedHashMap<String, String> properties = new LinkedHashMap<String, String>();
+  private List<PropertyDTO> properties = new ArrayList<>();
 
   public void addProperty(String key, String value) {
-    properties.put(key, value);
+    PropertyDTO dto = new PropertyDTO();
+    dto.setKey(key);
+    dto.setValue(value);
+    this.properties.add(dto);
   }
-
-  public Set<String> getProperties() {
-    return properties.keySet();
+  public void setProperties(List<PropertyDTO> properties) {
+    this.properties = properties;
   }
-
-  public String getPropertieValue(String key) {
-    return properties.get(key);
+  public List<PropertyDTO> getProperties() {
+    return properties;
   }
 
   public String getId() {
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java
new file mode 100644
index 000000000..cea66b17f
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/PropertyDTO.java
@@ -0,0 +1,24 @@
+package org.silverpeas.mobile.shared.dto;
+
+import java.io.Serializable;
+
+public class PropertyDTO implements Serializable {
+    private String key;
+    private String value;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java
index cc0054f92..08e10e925 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/authentication/UserProfileDTO.java
@@ -249,29 +249,31 @@ public AutoBean<IUserProfile> getAutoBean () {
   }
 
   public static UserProfileDTO getBean (AutoBean<IUserProfile> b) {
-    UserProfileDTO user = new UserProfileDTO();
-    user.setAnonymous(b.as().isAnonymous());
-    user.setAccessLevel(b.as().getAccessLevel());
-    user.setAvatar(b.as().getAvatar());
-    user.setId(b.as().getId());
-    user.setConnected(b.as().isConnected());
-    user.setApiToken(b.as().getApiToken());
-    user.setContactsUri(b.as().getContactsUri());
-    user.setDeletedState(b.as().isDeletedState());
-    user.setDomainId(b.as().getDomainId());
-    user.seteMail(b.as().geteMail());
-    user.setLanguage(b.as().getLanguage());
-    user.setLogin(b.as().getLogin());
-    user.setFirstName(b.as().getFirstName());
-    user.setDomainName(b.as().getDomainName());
-    user.setFullName(b.as().getFullName());
-    user.setStatus(b.as().getStatus());
-    user.setUri(b.as().getUri());
-    user.setLastName(b.as().getLastName());
-    user.setSpecificId(b.as().getSpecificId());
-    user.setWebPage(b.as().getWebPage());
-    user.setDeactivatedState(b.as().isDeactivatedState());
-
+    UserProfileDTO user = null;
+    if (b!= null) {
+      user = new UserProfileDTO();
+      user.setAnonymous(b.as().isAnonymous());
+      user.setAccessLevel(b.as().getAccessLevel());
+      user.setAvatar(b.as().getAvatar());
+      user.setId(b.as().getId());
+      user.setConnected(b.as().isConnected());
+      user.setApiToken(b.as().getApiToken());
+      user.setContactsUri(b.as().getContactsUri());
+      user.setDeletedState(b.as().isDeletedState());
+      user.setDomainId(b.as().getDomainId());
+      user.seteMail(b.as().geteMail());
+      user.setLanguage(b.as().getLanguage());
+      user.setLogin(b.as().getLogin());
+      user.setFirstName(b.as().getFirstName());
+      user.setDomainName(b.as().getDomainName());
+      user.setFullName(b.as().getFullName());
+      user.setStatus(b.as().getStatus());
+      user.setUri(b.as().getUri());
+      user.setLastName(b.as().getLastName());
+      user.setSpecificId(b.as().getSpecificId());
+      user.setWebPage(b.as().getWebPage());
+      user.setDeactivatedState(b.as().isDeactivatedState());
+    }
     return user;
   }
 
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java
index b742b9643..59264111a 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/comments/CommentDTO.java
@@ -98,16 +98,16 @@ public String getText() {
 
   public void setText(final String text) {
     this.text = text;
+    this.textForHtml = "";
   }
 
   public String getTextForHtml() {
+    if (textForHtml.isEmpty()) {
+      textForHtml = text;
+    }
     return textForHtml;
   }
 
-  public void setTextForHtml(final String textForHtml) {
-    this.textForHtml = textForHtml;
-  }
-
   public UserProfileDTO getAuthor() {
     return author;
   }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java
index 7592f3829..4c223c998 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/PublicationDTO.java
@@ -47,6 +47,8 @@ public class PublicationDTO extends BaseDTO implements Serializable, Comparable<
   private String vignette;
   private int viewsNumber;
 
+  private List<String> notAllowedDownloads;
+
   public String getName() {
     return name;
   }
@@ -136,4 +138,11 @@ public void setCreationDate(final String creationDate) {
   public int getViewsNumber() { return viewsNumber; }
 
   public void setViewsNumber(final int viewsNumber) { this.viewsNumber = viewsNumber; }
+
+  public void setNotAllowedDownloads(List<String> notAllowedDownloads) {
+    this.notAllowedDownloads = notAllowedDownloads;
+  }
+  public List<String> getNotAllowedDownloads() {
+    return notAllowedDownloads;
+  }
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java
index ca0a4ac17..24116573b 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/documents/SimpleDocumentDTO.java
@@ -48,6 +48,10 @@ public class SimpleDocumentDTO implements Serializable {
   private String comment;
   private long size, creationDate, updateDate;
 
+  private String spId;
+
+  private boolean downloadable;
+
 
   public String getId() {
     return id;
@@ -184,4 +188,11 @@ public long getUpdateDate() {
   public void setUpdateDate(final long updateDate) {
     this.updateDate = updateDate;
   }
+
+public void setDownloadable(boolean downloadable) {
+    this.downloadable = downloadable;
+  }
+  public boolean isDownloadable() {
+    return this.downloadable;
+  }
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java
new file mode 100644
index 000000000..14513eca2
--- /dev/null
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/dto/hyperlink/HyperLinkDTO.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2000 - 2022 Silverpeas
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * As a special exception to the terms and conditions of version 3.0 of
+ * the GPL, you may redistribute this Program in connection with Free/Libre
+ * Open Source Software ("FLOSS") applications as described in Silverpeas's
+ * FLOSS exception.  You should have received a copy of the text describing
+ * the FLOSS exception, and it is also available here:
+ * "https://www.silverpeas.org/legal/floss_exception.html"
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.silverpeas.mobile.shared.dto.hyperlink;
+
+import org.silverpeas.mobile.shared.dto.BaseDTO;
+
+import java.io.Serializable;
+
+public class HyperLinkDTO implements Serializable {
+
+  private String url;
+  private boolean openNewWindow;
+  private boolean internalLink;
+
+  public HyperLinkDTO() {
+  }
+
+  public String getUrl() {
+    return url;
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+  public boolean getOpenNewWindow() {
+    return openNewWindow;
+  }
+
+  public void setOpenNewWindow(boolean openNewWindow) {
+    this.openNewWindow = openNewWindow;
+  }
+
+  public boolean getInternalLink() {
+    return internalLink;
+  }
+
+  public void setInternalLink(boolean internalLink) {
+    this.internalLink = internalLink;
+  }
+}
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java
index e08837d6d..1000c1ada 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceHyperLink.java
@@ -24,8 +24,9 @@
 
 package org.silverpeas.mobile.shared.services.rest;
 
+import org.fusesource.restygwt.client.MethodCallback;
 import org.fusesource.restygwt.client.RestService;
-import org.fusesource.restygwt.client.TextCallback;
+import org.silverpeas.mobile.shared.dto.hyperlink.HyperLinkDTO;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -39,5 +40,5 @@ public interface ServiceHyperLink extends RestService {
 
   @GET
   @Path("{appId}/")
-  public void getUrl(@PathParam("appId") String appId, TextCallback callback);
+  public void getUrl(@PathParam("appId") String appId, MethodCallback<HyperLinkDTO> callback);
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java
index 0d2674a6d..5ef688498 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceMedia.java
@@ -92,6 +92,6 @@ public void getAllQuestions(@PathParam("appId") String appId,
 
   @GET
   @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-  @Path("{appId}/videostream/{pictureId}")
+  @Path("{appId}/photo/{pictureId}")
   public void getPreviewPicture(@PathParam("appId") String instanceId, @PathParam("pictureId") String pictureId, MethodCallback<PhotoDTO> callback);
 }
diff --git a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java
index 02a98c7b7..b95b56d41 100644
--- a/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java
+++ b/mobile-war/src/main/java/org/silverpeas/mobile/shared/services/rest/ServiceNavigation.java
@@ -31,6 +31,7 @@
 import org.silverpeas.mobile.shared.dto.HomePageDTO;
 import org.silverpeas.mobile.shared.dto.navigation.ApplicationInstanceDTO;
 import org.silverpeas.mobile.shared.dto.navigation.SilverpeasObjectDTO;
+import org.silverpeas.mobile.shared.dto.navigation.SpaceDTO;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
@@ -48,6 +49,11 @@
 @Path("/mobile/navigation")
 public interface ServiceNavigation extends RestService {
 
+  @GET
+  @Produces(MediaType.APPLICATION_JSON)
+  @Path("space/{spaceId}/")
+  public void getSpace(@PathParam("spaceId") String spaceId, MethodCallback<SpaceDTO> callback);
+
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Path("spacesAndApps/{rootSpaceId}/")
diff --git a/mobile-war/src/main/webapp/WEB-INF/app-init.template b/mobile-war/src/main/webapp/WEB-INF/app-init.template
index 0e834d3e6..86250f507 100644
--- a/mobile-war/src/main/webapp/WEB-INF/app-init.template
+++ b/mobile-war/src/main/webapp/WEB-INF/app-init.template
@@ -5,28 +5,31 @@ if (firebaseConfig != null) {
   const messaging = firebase.messaging();
   navigator.serviceWorker.register('/silverpeas/spmobile/app-sw.js')
       .then((registration) => {
-        messaging.useServiceWorker(registration);
+       navigator.serviceWorker.ready.then(function(reg) {
+           messaging.useServiceWorker(registration);
 
-        // Request permission and get token.....
-        Notification.requestPermission().then(function(permission) {
-          if (permission === "granted") {
-            messaging.getToken().then(token => {
-              console.log("Token Is : " + token);
-              storeToken(token);
+            // Request permission and get token.....
+            Notification.requestPermission().then(function(permission) {
+              if (permission === "granted") {
+                messaging.getToken().then(token => {
+                  console.log("Token Is : " + token);
+                  storeToken(token);
+                });
+              } else {
+                console.log("No permission to send push");
+              }
             });
-          } else {
-            console.log("No permission to send push");
-          }
         });
       });
 
   messaging.onMessage(payload => {
     const notificationOptions = {
-      body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png'
+      body : payload.data["body"], icon : '/silverpeas/util/icons/desktop-user-notification.png',
+      data : payload.data
     };
 
     navigator.serviceWorker.getRegistration('/silverpeas/spmobile/').then(registration => {
-            registration.showNotification(payload.data["sender"], notificationOptions)
+            registration.showNotification(payload.data["subject"], notificationOptions)
     });
   });
 } else {
diff --git a/mobile-war/src/main/webapp/WEB-INF/app-sw.template b/mobile-war/src/main/webapp/WEB-INF/app-sw.template
index ed7735cf4..d4400a570 100644
--- a/mobile-war/src/main/webapp/WEB-INF/app-sw.template
+++ b/mobile-war/src/main/webapp/WEB-INF/app-sw.template
@@ -10,9 +10,9 @@ if (firebaseConfig != null) {
 
   messaging.setBackgroundMessageHandler(function(payload) {
     console.log('[firebase-messaging-sw.js] Received background message ', payload);
-    const notificationTitle = payload.data["sender"];
+    const notificationTitle = payload.data["subject"];
     const notificationOptions = {
-      body : payload.data["subject"], icon : '/silverpeas/util/icons/desktop-user-notification.png',
+      body : payload.data["body"], icon : '/silverpeas/util/icons/desktop-user-notification.png',
       data : payload.data
     };
 
@@ -24,7 +24,10 @@ if (firebaseConfig != null) {
      const pushData = event.notification.data;
      event.notification.close();
      if (!pushData["permalink"].endsWith("/null")) {
-      event.waitUntil(self.clients.openWindow(pushData["permalink"]));
+       fetch('/silverpeas/services/mobile/notification/readed/' + pushData["notificationId"], {
+           method: 'PUT'
+       });
+       event.waitUntil(self.clients.openWindow(pushData["permalink"]));
      }
   });
 
diff --git a/mobile-war/src/main/webapp/spmobile/spmobil.jsp b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
index 232d5219c..ec8b36497 100644
--- a/mobile-war/src/main/webapp/spmobile/spmobil.jsp
+++ b/mobile-war/src/main/webapp/spmobile/spmobil.jsp
@@ -139,6 +139,9 @@
       var windowHeight = window.innerHeight;
       document.body.style.height = windowHeight + "px";
     }
+    function navigate(url) {
+      window.navigateTo(url);
+    }
   </script>
 
   <%
@@ -151,6 +154,15 @@
 
 </head>
 <body class="ui-panel-wrapper ui-page-theme-a csspinner traditional" onload="resize();">
+<%
+  String fullSsoPath = "";
+  if (!ssoPath.trim().isEmpty()) {
+    fullSsoPath = request.getRequestURL().toString();
+    fullSsoPath = fullSsoPath.replace("/spmobile/spmobil.jsp", "");
+    fullSsoPath = fullSsoPath + ssoPath;
+  }
+%>
+<input type="hidden" id="ssoPath" value="<%=fullSsoPath%>">
 <div id="oneinch"
      style="position: absolute;padding: 0;visibility: hidden;width: 1in;height: 1in;"></div>
 
diff --git a/pom.xml b/pom.xml
index 33bb0fcc6..8fee4ee06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,14 +35,14 @@
   <groupId>org.silverpeas.components</groupId>
   <artifactId>mobile</artifactId>
   <packaging>pom</packaging>
-  <version>6.3-SNAPSHOT</version>
+  <version>6.3.7-SNAPSHOT</version>
   <name>Silverpeas Mobile component</name>
 
   <properties>
-    <silverpeas.version>6.3-build221011</silverpeas.version>
+    <silverpeas.version>6.3.7-build250214</silverpeas.version>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
-     <next.release>6.3</next.release>
+     <next.release>6.3.7</next.release>
   </properties>
 
   <repositories>