diff --git a/auth/src/main/java/org/entcore/auth/controllers/AuthController.java b/auth/src/main/java/org/entcore/auth/controllers/AuthController.java
index bfdf28b5b9..0923cea889 100644
--- a/auth/src/main/java/org/entcore/auth/controllers/AuthController.java
+++ b/auth/src/main/java/org/entcore/auth/controllers/AuthController.java
@@ -24,6 +24,7 @@
 import fr.wseduc.rs.Get;
 import fr.wseduc.rs.Post;
 import fr.wseduc.rs.Put;
+import fr.wseduc.rs.ApiDoc;
 import fr.wseduc.security.ActionType;
 import fr.wseduc.security.SecuredAction;
 import fr.wseduc.webutils.Either;
@@ -101,6 +102,8 @@
 import java.util.regex.Pattern;
 
 import static fr.wseduc.webutils.Utils.*;
+import static fr.wseduc.webutils.request.RequestUtils.getTokenHeader;
+
 import static org.entcore.auth.oauth.OAuthAuthorizationResponse.*;
 import static org.entcore.common.aggregation.MongoConstants.TRACE_TYPE_CONNECTOR;
 import static org.entcore.common.http.response.DefaultResponseHandler.defaultResponseHandler;
@@ -462,6 +465,33 @@ private void activateUser(final String activationCode, final String login, Strin
 		});
 	}
 
+	@Post("/oauth2/token-as-cookie")
+	@SecuredAction(value = "", type = ActionType.AUTHENTICATED)
+	@ApiDoc("Gives back a cookie to the user corresponding to its jwtToken")
+	public void tokenAsCookie(final HttpServerRequest request) {
+		UserUtils.getAuthenticatedUserInfos(eb, request).onSuccess(user -> {
+			final Optional<String> jwtToken = getTokenHeader(request);
+			if(jwtToken.isPresent()) {
+				final String oneSessionId = UUID.randomUUID().toString();
+				UserUtils.createSessionWithId(eb, user.getUserId(), oneSessionId, false)
+					.onSuccess(e -> {
+						log.debug("[AuthController@tokenAsCookie] Session created for user");
+						final long timeout = config.getLong("cookie_timeout", Long.MIN_VALUE);
+						CookieHelper.getInstance().setSigned("oneSessionId", oneSessionId, timeout, request);
+						CookieHelper.set("authenticated", "true", timeout, request);
+						Renders.render(request, new JsonObject().put("succces", true));
+					})
+					.onFailure(th -> {
+						log.warn("[AuthController@tokenAsCookie] Error while creating session", th);
+						Renders.renderError(request);
+					});
+			} else {
+				log.warn("[AuthController@tokenAsCookie] Called without a jwt token");
+				Renders.badRequest(request);
+			}
+		});
+	}
+
 	private void loginResult(final HttpServerRequest request, String error, String callBack) {
 		final JsonObject context = new JsonObject();
 		if (callBack != null && !callBack.trim().isEmpty()) {
diff --git a/auth/src/main/resources/view-src/wayf.html b/auth/src/main/resources/view-src/wayf.html
index 694c669349..b7e7db9ece 100644
--- a/auth/src/main/resources/view-src/wayf.html
+++ b/auth/src/main/resources/view-src/wayf.html
@@ -124,12 +124,12 @@ <h2 class="row vertical-spacing">
 				{{/providers}}
 			</section>
 			<div style="float:right">
-				<div id="insert" style="margin-bottom:45px;font-size: 1.5vh;display:none" >
+				<div id="insert" style="margin-bottom:45px;font-size: 14px;display:none" >
 					<i18n>wayf.insert.title</i18n><br>
 					<a href="{{#i18n}}wayf.insert.link{{/i18n}}" target="_blank" translate content="wayf.insert.link.content"></a>
 				</div>
 
-				<a href="{{#i18n}}auth.charter{{/i18n}}" target="_blank" translate content="wayf.label.cgu" style="font-size: 1.5vh;"></a>
+				<a href="{{#i18n}}auth.charter{{/i18n}}" target="_blank" translate content="wayf.label.cgu" style="font-size: 14px;"></a>
 			</div>
 			<img id="partner" src="{{#i18n}}wayf.logo.partner{{/i18n}}" style="margin-left:15px;width:{{#i18n}}wayf.logo.partner.width{{/i18n}};display:none" alt="Logo partenaire">
 		</section>
diff --git a/directory/src/main/java/org/entcore/directory/services/impl/DefaultSchoolService.java b/directory/src/main/java/org/entcore/directory/services/impl/DefaultSchoolService.java
index 1a5c8e96b1..786227a9e8 100644
--- a/directory/src/main/java/org/entcore/directory/services/impl/DefaultSchoolService.java
+++ b/directory/src/main/java/org/entcore/directory/services/impl/DefaultSchoolService.java
@@ -518,16 +518,19 @@ public void massDistributionEducationMobileApp(JsonArray data, Integer transacti
 			List<Long> education_levels = StringUtils.isEmpty(education) ? Collections.EMPTY_LIST :
 					Arrays.stream(education.split(",")).mapToLong(Long::parseLong).boxed().collect(Collectors.toList());
 			Boolean hasApp = jo.getBoolean("hasApp");
+			Boolean ignoreMFA = jo.getBoolean("ignoreMFA");
 
 			if (structureId != null) {
 				String query = "MATCH (s:Structure {id: {structureId}}) " +
 						"SET s.levelsOfEducation = {levelsOfEducation} " +
 						"SET s.distributions = {distributions} " +
+						"SET s.ignoreMFA = {ignoreMFA} " +
 						"SET s.hasApp = {hasApp}";
 
 				JsonObject params = new JsonObject().put("structureId", structureId)
 						.put("levelsOfEducation", education_levels)
 						.put("distributions", distributions)
+						.put("ignoreMFA", ignoreMFA)
 						.put("hasApp", hasApp);
 
 				s.add(query, params);
diff --git a/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Importer.java b/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Importer.java
index b3ab7c0885..ac46f28d91 100644
--- a/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Importer.java
+++ b/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Importer.java
@@ -1177,9 +1177,10 @@ public void addStructureNameInGroups(String structureExternalId, String prefix)
 	}
 
 	public void removeOldCommunicationRules(String prefix) {
+		// On utilise la joinKey car il arrive que l'externalId d'une structure soit arbitraire et ne reflète pas l'id dans l'AAF...
 		final String query =
 				"MATCH (s:Structure)<-[:DEPENDS*1..2]-(g:Group)-[c:COMMUNIQUE]-(u:User) " +
-				"WHERE s.externalId STARTS WITH {prefix} AND u.source = {currentSource} " +
+				"WHERE ANY(joinKey IN s.joinKey WHERE joinKey STARTS WITH {prefix}) AND u.source = {currentSource} " +
 				"AND (c.source IS NULL OR c.source <> 'MANUAL') AND NOT (u)-[:IN]->(g) " +
 				"DELETE c";
 		transactionHelper.add(query, new JsonObject().put("prefix", prefix).put("currentSource", currentSource));
@@ -1242,4 +1243,4 @@ public void setPrefixToImportList(JsonArray importSubDirectories) {
 	public JsonArray getPrefixToImportList() {
 		return this.importsPrefixList;
 	}
-}
+}
\ No newline at end of file
diff --git a/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Structure.java b/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Structure.java
index 281558c971..414ccfa5d1 100644
--- a/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Structure.java
+++ b/feeder/src/main/java/org/entcore/feeder/dictionary/structures/Structure.java
@@ -236,7 +236,7 @@ public void createFunctionGroupIfAbsent(String groupExternalId, String name, Str
 		if (isNotEmpty(label)) {
 			String query =
 					"MATCH (s:Structure { externalId : {structureExternalId}}) " +
-					(source == null ? "WHERE (NOT(HAS(s.timetable)) OR s.timetable = '' OR s.timetable = 'NOP') " : "WHERE s.timetable = s.source ") +
+					//(source == null ? "WHERE (NOT(HAS(s.timetable)) OR s.timetable = '' OR s.timetable = 'NOP') " : "WHERE s.timetable = s.source ") +
 					"CREATE s<-[:DEPENDS]-(c:Group:FunctionGroup:" + label + "Group {props}) " +
 					"SET c.source = coalesce({source}, s.source)";
 			JsonObject params = new JsonObject()
@@ -595,4 +595,4 @@ public JsonObject getStruct() {
 		return struct;
 	}
 
-}
+}
\ No newline at end of file
diff --git a/feeder/src/main/java/org/entcore/feeder/timetable/AbstractTimetableImporter.java b/feeder/src/main/java/org/entcore/feeder/timetable/AbstractTimetableImporter.java
index ad724fb361..03ad917120 100644
--- a/feeder/src/main/java/org/entcore/feeder/timetable/AbstractTimetableImporter.java
+++ b/feeder/src/main/java/org/entcore/feeder/timetable/AbstractTimetableImporter.java
@@ -423,6 +423,9 @@ public void handle(Message<JsonObject> event) {
 
 	protected void addSubject(String id, JsonObject currentEntity) {
 		final String code = currentEntity.getString("Code");
+		if(code == null)
+			return;
+
 		String subjectId = subjectsMapping.get(code);
 		if (isEmpty(subjectId)) {
 			final String externalId = structureExternalId + "$" + currentEntity.getString("Code");
diff --git a/gradle.properties b/gradle.properties
index 021cc5c965..719e102554 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,7 +4,7 @@ modowner=org.entcore
 modname=ent-core
 
 # Your module version
-version=4.11.17
+version=4.11.18
 
 # The test timeout in seconds
 testtimeout=300