diff --git a/app/build.gradle b/app/build.gradle
index 2ea288ce9b55c6f3e7ea080d19230e76e1747e72..277b964afac01fc00c2a2491e8cd488d1adae116 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,8 +9,8 @@ android {
         applicationId "fr.nitorac.aurionweb"
         minSdkVersion 19
         targetSdkVersion 29
-        versionCode 1
-        versionName "1.0.0"
+        versionCode 3
+        versionName "1.0.2"
         multiDexEnabled true
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/java/fr/nitorac/aurionweb/Utils.java b/app/src/main/java/fr/nitorac/aurionweb/Utils.java
index 3a165f6b66b1a04fa0f9f39798071f403a6cd076..5d970ba63b15dd36c5cfd6bcf781d206f2806351 100644
--- a/app/src/main/java/fr/nitorac/aurionweb/Utils.java
+++ b/app/src/main/java/fr/nitorac/aurionweb/Utils.java
@@ -21,6 +21,7 @@ import java.security.KeyStore;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
 import java.text.CharacterIterator;
 import java.text.Normalizer;
 import java.text.StringCharacterIterator;
@@ -33,8 +34,8 @@ public class Utils {
 
     public final static String BASE_SSL_URL = "https://ranini.iiens.net/aurionweb-check/cert.php?site=";
     private static SSLContext sslContext;
-    private static Certificate casCert;
-    private static Certificate aurionCert;
+    private static X509Certificate casCert;
+    private static X509Certificate aurionCert;
 
     public static Connection wrapSSL(String url) throws GeneralSecurityException, IOException {
         return Jsoup.connect(url)
@@ -45,7 +46,7 @@ public class Utils {
         return CertificateFactory.getInstance("X.509");
     }
 
-    public static Certificate getCasCert(Context c) throws CertificateException {
+    public static X509Certificate getCasCert(Context c) throws CertificateException {
         if (casCert == null){
             InputStream input;
             try{
@@ -57,12 +58,12 @@ public class Utils {
                 Log.e("SSLCertFetch", "Can't get remote SSL cas certificate, fallback on local one");
                 input = c.getResources().openRawResource(R.raw.cas_ensiie_fr);
             }
-            casCert = getSSLFactory().generateCertificate(input);
+            casCert = (X509Certificate) getSSLFactory().generateCertificate(input);
         }
         return casCert;
     }
 
-    public static Certificate getAurionCert(Context c) throws CertificateException {
+    public static X509Certificate getAurionCert(Context c) throws CertificateException {
         if (aurionCert == null){
             InputStream input;
             try{
@@ -74,7 +75,7 @@ public class Utils {
                 Log.e("SSLCertFetch", "Can't get remote SSL aurion certificate, fallback on local one");
                 input = c.getResources().openRawResource(R.raw.aurionweb_ensiie_fr);
             }
-            aurionCert = getSSLFactory().generateCertificate(input);
+            aurionCert = (X509Certificate) getSSLFactory().generateCertificate(input);
         }
         return aurionCert;
     }
diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java
index 6672690bf35698ecb0323f0b295c0f10a6fe4717..ed8390d8aebf569fbcfe39e6db9be78fce3d0615 100644
--- a/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java
+++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/AurionViewFragment.java
@@ -1,6 +1,7 @@
 package fr.nitorac.aurionweb.fragments;
 
 import android.content.Context;
+import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
@@ -17,10 +18,10 @@ import android.widget.Toast;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 
-import java.security.cert.Certificate;
 import java.security.cert.CertificateException;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 import fr.nitorac.aurionweb.R;
 import fr.nitorac.aurionweb.Utils;
@@ -89,9 +90,26 @@ public abstract class AurionViewFragment extends Fragment {
                 public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) {
                     Context c = AurionViewFragment.this.getContext();
                     try{
-                        Certificate cas = Utils.getCasCert(c);
-                        Certificate aurion = Utils.getAurionCert(c);
-                        handler.proceed();
+                        SslCertificate cas = new SslCertificate(Utils.getCasCert(c));
+                        SslCertificate aurion = new SslCertificate(Utils.getAurionCert(c));
+                        SslCertificate erCert = er.getCertificate();
+
+                        if(Build.VERSION.SDK_INT > Build.VERSION_CODES.Q){
+                            if(Objects.equals(aurion.getX509Certificate(), erCert.getX509Certificate()) ||
+                                    Objects.equals(cas.getX509Certificate(), erCert.getX509Certificate())){
+                                handler.proceed();
+                            }else{
+                                handler.cancel();
+                            }
+                        }else{
+                            // Minimal verification but Android won't let me convert SslCertificate to Certificate
+                            if((Objects.equals(cas.getIssuedBy(), erCert.getIssuedBy()) && Objects.equals(cas.getIssuedTo(), erCert.getIssuedTo()) && Objects.equals(cas.getValidNotAfterDate(), erCert.getValidNotAfterDate()) && Objects.equals(cas.getValidNotBeforeDate(), erCert.getValidNotBeforeDate())) ||
+                                    (Objects.equals(aurion.getIssuedBy(), erCert.getIssuedBy()) && Objects.equals(aurion.getIssuedTo(), erCert.getIssuedTo()) && Objects.equals(aurion.getValidNotAfterDate(), erCert.getValidNotAfterDate()) && Objects.equals(aurion.getValidNotBeforeDate(), erCert.getValidNotBeforeDate()))){
+                                handler.proceed();
+                            }else{
+                                handler.cancel();
+                            }
+                        }
                     }catch (CertificateException e){
                         e.printStackTrace();
                         Toast.makeText(c, "Erreur de certificat SSL : " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java
index 192c3c5987e8d99b9b48f18e6816ceadc3be2f3a..146258a289b48e9f43cc3920273327e322d4647d 100644
--- a/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java
+++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/calendar/CalendarFragment.java
@@ -24,8 +24,13 @@ public class CalendarFragment extends AurionViewFragment {
             e.printStackTrace();
             failed = true;
             Log.e(getClass().getSimpleName(), "Impossible de charger le chemin vers l'emploi du temps (" + e.getLocalizedMessage() + ")");
-            Toast.makeText(getContext(), "Impossible de charger le chemin vers l'emploi du temps (" + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show();
-            webView.loadUrl(HomeFragment.AURIONURL, getHeaders());
+            if(getActivity() != null){
+                getActivity().runOnUiThread(() -> {
+                    Toast.makeText(getContext(), "Impossible de charger le chemin vers l'emploi du temps (" + e.getLocalizedMessage() + ")", Toast.LENGTH_LONG).show();
+                    webView.loadUrl(HomeFragment.AURIONURL, getHeaders());
+                });
+            }
+
         }
     }
 
diff --git a/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java b/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java
index 8fc0e0bf1abdbca0e6709c9b2baa0f23607ba74b..6ade17ee8c1e4f6616ee93aad8ab612eae4bdf9b 100644
--- a/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java
+++ b/app/src/main/java/fr/nitorac/aurionweb/fragments/home/HomeFragment.java
@@ -9,12 +9,15 @@ public class HomeFragment extends AurionViewFragment {
 
     public static final String AURIONURL = "https://aurionweb.ensiie.fr";
 
+    private boolean hasLoaded = false;
+
     @Override
     public void pageFinished(WebView view, String url) {
-        if(url.equals("https://aurionweb.ensiie.fr")){
+        if(!hasLoaded){
             view.evaluateJavascript("$(\"#mobile-menu-btn\").click();", paRes -> {
                 Log.e("JSSS", paRes);
             });
+            hasLoaded = true;
         }
     }
 
diff --git a/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java b/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java
index cf295761d3520bc57268a68da0cb00f8183d7a9c..94546c408d40b5f1c6da79e20f8e0e7b9ccf136a 100644
--- a/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java
+++ b/app/src/main/java/fr/nitorac/aurionweb/update/AsyncUpdateCheckerTask.java
@@ -28,7 +28,7 @@ public class AsyncUpdateCheckerTask extends AsyncTask<Void, Void, JsonObject> {
     @Override
     protected JsonObject doInBackground(Void... voids) {
         try {
-            URL url = new URL(UpdateManager.CHECK_URL + URLEncoder.encode(BuildConfig.VERSION_NAME, StandardCharsets.UTF_8.toString()));
+            URL url = new URL(UpdateManager.CHECK_URL + URLEncoder.encode(BuildConfig.VERSION_NAME, StandardCharsets.UTF_8.displayName()));
             HttpURLConnection conn=(HttpURLConnection) url.openConnection();
             conn.setConnectTimeout(10000); // timing out in a minute