diff --git a/CHANGELOG.md b/CHANGELOG.md
index e3bcbc010fef47ac99fe69bcbc6d72d5acf420a2..78f6a60668eb93ea392aae0eb44e514803a60671 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file.
 - Improve schedule rerendering
 - Implement infinite scroll
 - Add beta banner for release preparation
+- Add more B1 / B2 indicator
 
 ### 🐛 Bug Fixes
 
@@ -18,6 +19,11 @@ All notable changes to this project will be documented in this file.
 - Mobile view not showing with refactor of schedule generation call
 - [**breaking**] Autoregeneration was broken by changement to autogen
 - Mobile error reporting
+- Prepare for deployment
+- Safari not touching
+- Improve merge algorithm
+- Improve error message
+- Many small UI tweaks
 
 ### 🚜 Refactor
 
diff --git a/aep-schedule-generator/src/data/group.rs b/aep-schedule-generator/src/data/group.rs
index 3d6dbde613a637232c13e7d43494ca2f0b650811..36417d5c7fd4e86811dcf62400273f535e2c7d98 100644
--- a/aep-schedule-generator/src/data/group.rs
+++ b/aep-schedule-generator/src/data/group.rs
@@ -31,8 +31,7 @@ impl Group {
                 let new_hour = new_period.hours | p.hours;
                 let is_mergeable = p.day == new_period.day
                     && p.room == new_period.room
-                    && (p.hours.start() == new_hour.start() + 4
-                        || p.hours.end() + 4 == new_hour.end());
+                    && (p.hours.is_contiguous(new_hour));
                 let keep = !is_mergeable || new_hours == Hours::default();
                 if is_mergeable {
                     new_hours |= new_hour;
@@ -49,8 +48,7 @@ impl Group {
                         let new_hour = new_period.hours | p.hours;
                         p.day == new_period.day
                             && p.room == new_period.room
-                            && (p.hours.start() == new_hour.start() + 4
-                                || p.hours.end() + 4 == new_hour.end())
+                            && (p.hours.is_contiguous(new_hour))
                     })
                     .unwrap();
                 first_period.hours |= new_hours;
diff --git a/aep-schedule-generator/src/data/time/hours.rs b/aep-schedule-generator/src/data/time/hours.rs
index be21f741fc81c800fe3041a54b2f67de1942d08e..2901ec49e333764f8c634e8e5e07c7e2ece189e0 100644
--- a/aep-schedule-generator/src/data/time/hours.rs
+++ b/aep-schedule-generator/src/data/time/hours.rs
@@ -53,6 +53,10 @@ impl Hours {
         (self.end() >> 2) + 8
     }
 
+    pub fn is_contiguous(self, other: Self) -> bool {
+        self.start().abs_diff(other.start()) <= 5 || self.end().abs_diff(other.end()) <= 5
+    }
+
     pub fn starting_text(self) -> String {
         let mut hour = self.starting_hour().to_string();
         let minute = self.start_minutes();
diff --git a/aep-schedule-website/Cargo.lock b/aep-schedule-website/Cargo.lock
index 863ad386592587ff3f5909d53b371092ddfe0840..ce4ba564e0a0a5aa40c27d7d2a3fca92a971d3de 100644
--- a/aep-schedule-website/Cargo.lock
+++ b/aep-schedule-website/Cargo.lock
@@ -388,9 +388,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.6.1"
+version = "1.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952"
+checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
 
 [[package]]
 name = "cached"
@@ -441,9 +441,9 @@ dependencies = [
 
 [[package]]
 name = "cc"
-version = "1.1.6"
+version = "1.1.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f"
+checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549"
 
 [[package]]
 name = "cfg-if"
@@ -878,9 +878,9 @@ dependencies = [
 
 [[package]]
 name = "email_address"
-version = "0.2.7"
+version = "0.2.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46b7a0ac6570e31bfe2c6cf575a576a55af9893d1a6b30b4444e6e90b216bb84"
+checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
 
 [[package]]
 name = "encoding_rs"
@@ -925,9 +925,9 @@ dependencies = [
 
 [[package]]
 name = "flate2"
-version = "1.0.30"
+version = "1.0.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
+checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920"
 dependencies = [
  "crc32fast",
  "miniz_oxide",
@@ -1375,9 +1375,9 @@ dependencies = [
 
 [[package]]
 name = "hyper-util"
-version = "0.1.6"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956"
+checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9"
 dependencies = [
  "bytes",
  "futures-channel",
@@ -1443,9 +1443,9 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.2.6"
+version = "2.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
+checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
 dependencies = [
  "equivalent",
  "hashbrown 0.14.5",
@@ -2059,9 +2059,9 @@ dependencies = [
 
 [[package]]
 name = "object"
-version = "0.36.2"
+version = "0.36.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e"
+checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
 dependencies = [
  "memchr",
 ]
@@ -2291,9 +2291,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.17"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+dependencies = [
+ "zerocopy",
+]
 
 [[package]]
 name = "prettyplease"
@@ -2458,9 +2461,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.10.5"
+version = "1.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
+checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -2628,9 +2631,9 @@ dependencies = [
 
 [[package]]
 name = "rustls-pemfile"
-version = "2.1.2"
+version = "2.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
+checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
 dependencies = [
  "base64",
  "rustls-pki-types",
@@ -2638,9 +2641,9 @@ dependencies = [
 
 [[package]]
 name = "rustls-pki-types"
-version = "1.7.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
+checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
 
 [[package]]
 name = "rustls-webpki"
@@ -2774,11 +2777,12 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.120"
+version = "1.0.122"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
+checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
 dependencies = [
  "itoa",
+ "memchr",
  "ryu",
  "serde",
 ]
@@ -2826,9 +2830,9 @@ dependencies = [
 
 [[package]]
 name = "serde_test"
-version = "1.0.176"
+version = "1.0.177"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a2f49ace1498612d14f7e0b8245519584db8299541dfe31a06374a828d620ab"
+checksum = "7f901ee573cab6b3060453d2d5f0bae4e6d628c23c0a962ff9b5f1d7c8d4f1ed"
 dependencies = [
  "serde",
 ]
@@ -3110,14 +3114,15 @@ dependencies = [
 
 [[package]]
 name = "tempfile"
-version = "3.10.1"
+version = "3.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
+checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
 dependencies = [
  "cfg-if",
  "fastrand",
+ "once_cell",
  "rustix",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -3190,9 +3195,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.39.1"
+version = "1.39.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a"
+checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1"
 dependencies = [
  "backtrace",
  "bytes",
@@ -3255,9 +3260,9 @@ dependencies = [
 
 [[package]]
 name = "toml"
-version = "0.8.16"
+version = "0.8.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
 dependencies = [
  "serde",
  "serde_spanned",
@@ -3267,18 +3272,18 @@ dependencies = [
 
 [[package]]
 name = "toml_datetime"
-version = "0.6.7"
+version = "0.6.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
 dependencies = [
  "serde",
 ]
 
 [[package]]
 name = "toml_edit"
-version = "0.22.17"
+version = "0.22.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16"
+checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
 dependencies = [
  "indexmap",
  "serde",
@@ -3669,11 +3674,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 
 [[package]]
 name = "winapi-util"
-version = "0.1.8"
+version = "0.1.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
 dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
 ]
 
 [[package]]
@@ -3719,6 +3724,15 @@ dependencies = [
  "windows-targets 0.52.6",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
 [[package]]
 name = "windows-targets"
 version = "0.48.5"
@@ -3842,9 +3856,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 
 [[package]]
 name = "winnow"
-version = "0.6.16"
+version = "0.6.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b480ae9340fc261e6be3e95a1ba86d54ae3f9171132a73ce8d4bbaf68339507c"
+checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f"
 dependencies = [
  "memchr",
 ]
@@ -3877,6 +3891,7 @@ version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
 dependencies = [
+ "byteorder",
  "zerocopy-derive",
 ]
 
diff --git a/aep-schedule-website/src/frontend/app.rs b/aep-schedule-website/src/frontend/app.rs
index d8d493b29f6b7f18e324824329a3899a7e48fda3..c53b5bfe1da144d81f26fb81c58355f5dc115104 100644
--- a/aep-schedule-website/src/frontend/app.rs
+++ b/aep-schedule-website/src/frontend/app.rs
@@ -37,7 +37,7 @@ pub fn App() -> impl IntoView {
                     <A class="rounded-md font-medium text-gray-700 text-lg font-sans tracking-tight" href="/apropos">"À propos"</A>
 
 
-                    <a href="https://git.step.polymtl.ca/Lemark/aep-schedule-generator-rusty/-/issues/new" class="sources pad-left"  target="_blank">
+                    <a href="https://forms.gle/u5AWgGx7vcLbCPCc7" class="sources pad-left"  target="_blank">
                         <span class="rounded-md font-medium text-gray-700 text-lg font-sans tracking-tight">"Signaler un bug"</span>
                         <Bug weight=IconWeight::Regular size="3vh"/>
                     </a>
diff --git a/aep-schedule-website/src/frontend/components/options/courses_selector.rs b/aep-schedule-website/src/frontend/components/options/courses_selector.rs
index a7a0197f77acc3d02e2d7b5e0f371ff85f58caa8..162309c034e29265833b8980159728a981dc1311 100644
--- a/aep-schedule-website/src/frontend/components/options/courses_selector.rs
+++ b/aep-schedule-website/src/frontend/components/options/courses_selector.rs
@@ -35,7 +35,7 @@ where
                 open.update(|b| *b = !*b);
                 submit();
             }
-            class="chips gap-2"
+            class="gap-2 cursor-pointer items-center py-1.5 px-3 rounded-lg flex"
             class=("bg-green-500", move || {open.get()})
             class=("bg-red-500", move || {!open.get()})
         >
@@ -46,6 +46,7 @@ where
                         <div class="flex group-text w-full justify-between">
                             <span>{p.day.to_string()}</span>
                             <span class="period-group">{p.hours.to_string()}</span>
+                            <span>{p.week_nb.to_string()}</span>
                         </div>
                     }
                 }).collect_view()}
@@ -165,8 +166,8 @@ where
         >
             <SearchCourse courses=courses.clone() action_courses set_active_tab/>
         </Await>
-        <div class="flex w-full flex-wrap">
-            <button class="tab-button chips" class=("tab-selected", move || active_tab.get() == "") id="personal" on:pointerdown={
+        <div class="flex w-full flex-wrap gap-1">
+            <button class="flex items-center py-1 px-2 rounded-xl bg-amber-500 text-black transition" class=("opacity-75", move || active_tab.get() != "") id="personal" on:pointerdown={
                 move |_| set_active_tab.set("".to_string())
             }>
                 <CalendarX weight=IconWeight::Regular size="16px"/>
@@ -177,10 +178,10 @@ where
                 key=|c| c.sigle.clone()
                 children=move |course| {
                     let sigle = course.sigle.to_string();
-                    let add_hidden = move || sigle == active_tab.get();
+                    let add_hidden = move || sigle != active_tab.get();
                     let sigle = course.sigle.to_string();
                     view!{
-                        <button class="tab-button chips" class=("tab-selected", add_hidden) id=&sigle on:pointerdown={
+                        <button class="flex items-center py-1 px-2 rounded-xl bg-amber-500 text-black transition" class=("opacity-75", add_hidden) id=&sigle on:pointerdown={
                             let sigle = sigle.clone();
                             move |_| set_active_tab.set(sigle.clone())
                         }>
diff --git a/aep-schedule-website/src/frontend/components/options/todo.rs b/aep-schedule-website/src/frontend/components/options/todo.rs
index 8a4cb056f288fc62be02f4271915f98b88b8d180..755e4633f640c3409206c2200dfd7e9617ab6b4a 100644
--- a/aep-schedule-website/src/frontend/components/options/todo.rs
+++ b/aep-schedule-website/src/frontend/components/options/todo.rs
@@ -1,8 +1,8 @@
 use std::cmp::Ordering;
 
-use leptos::*;
-
+use crate::frontend::components::icons::warning_circle::WarningCircle;
 use crate::frontend::{pages::generator::FirstGenerationDone, state::OptionState};
+use leptos::*;
 
 #[component]
 pub fn Step(
@@ -70,16 +70,26 @@ pub fn Todo() -> impl IntoView {
                 <div class="lg:py-6 lg:pr-16">
                     <Step n=1 step title="Ajoutez vos cours" description="Utilisez la barre de recherche à gauche pour trouver et sélectionner vos cours. Une fois les cours sélectionnés, ils apparaîtront comme un onglet."/>
                     <Step n=2 step title="Ouvrez des sections" description="Assurez d'avoir au moins une section d'ouverte pour la théorie et la pratique. En sélectionnant l'onglet du cours et en appuyant sur les sections.">
-                        <span class="text-red-800">{state.section_error}</span>
+                        <div class="warning-box" class=("hidden", move || state.section_error.get().is_empty())>
+                            <WarningCircle size="2em"/>
+                            <span>
+                                {state.section_error}
+                            </span>
+                        </div>
                     </Step>
                     <Step n=3 step title="Forcer des heures libres" description="Sélectionnez une plage de temps à avoir absolument libre en pressant et relâchant sur votre horaire personnel.">
-                        <span class="text-red-800">{state.personal_error}</span>
+                        <div class="warning-box" class=("hidden", move || state.personal_error.get().is_empty())>
+                            <WarningCircle size="2em"/>
+                            <span>
+                                {state.personal_error}
+                            </span>
+                        </div>
                     </Step>
                     <Step n=4 step title="Ajustez les paramètres" description="Bougez les curseurs en bas pour ajuster vos préférences. Vous pouvez choisir d'avoir plus de congés, de commencer en moyenne les cours plus tôt ou plus tard, ou de finir en moyenne plus tôt."/>
                     <div class="flex items-center">
                         <div class="flex flex-col items-center mr-4">
                             <div>
-                                <div class="flex transition-colors items-center justify-center w-10 h-10 border rounded-full" class=("bg-gray-100", move || step.get() != 5) class=("bg-green-400", move || step.get() == 5)>
+                                <div class="flex transition-colors items-center justify-center w-10 h-10 border rounded-full" class=("bg-gray-100", move || step.get() < 5) class=("bg-green-400", move || step.get() == 5)  class=("bg-amber-400", move || step.get() == 6) >
                                     <svg class="w-6 text-gray-600" stroke="currentColor" viewBox="0 0 24 24">
                                         <polyline fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="6,12 10,16 18,8"></polyline>
                                     </svg>
diff --git a/aep-schedule-website/src/frontend/components/schedule.rs b/aep-schedule-website/src/frontend/components/schedule.rs
index 5c21a8d7b666ce2726cfd9c14e1bca8d74af87ab..75d50946fc580df6d4d852e84fae014ff1ea9ee6 100644
--- a/aep-schedule-website/src/frontend/components/schedule.rs
+++ b/aep-schedule-website/src/frontend/components/schedule.rs
@@ -47,7 +47,7 @@ fn PeriodEvent<'a>(
     course: &'a TakenCourse,
     period_type: &'static str,
 ) -> impl IntoView {
-    let location = period.hours.to_string() + " - " + period.room.as_str();
+    let mut location = period.hours.to_string() + " - " + period.room.as_str();
     let sigle = course.sigle.to_string() + " - " + period_type;
     let mut class = match i % 8 {
         0 => " color1".to_string(),
@@ -60,8 +60,14 @@ fn PeriodEvent<'a>(
         _ => " color8".to_string(),
     };
     match period.week_nb {
-        WeekNumber::B1 => class.push_str(" b1"),
-        WeekNumber::B2 => class.push_str(" b2"),
+        WeekNumber::B1 => {
+            class.push_str(" b1");
+            location.push_str(" B1");
+        }
+        WeekNumber::B2 => {
+            class.push_str(" b2");
+            location.push_str(" B2");
+        }
         _ => (),
     }
 
@@ -120,7 +126,7 @@ pub fn ScheduleComponent(schedule: Schedule, calendar: Rc<Calendar>) -> impl Int
     let link: NodeRef<A> = create_node_ref();
 
     view! {
-        <div class="flex flex-col w-full items-center">
+        <div class="flex flex-col w-full items-center card p-2">
             <a class="hidden" download="cours.ics" href=move || download.get() node_ref=link></a>
             <table class="cours">
                 {schedule.taken_courses.iter().enumerate().map(|(i, c)| view!{<Course i course={c} />}).collect_view()}
diff --git a/aep-schedule-website/src/frontend/components/schedules.rs b/aep-schedule-website/src/frontend/components/schedules.rs
index a1cc9edc02f47f8863f70c6f492bd009853f2703..91086363bd03e1c36391679781a252895fda4cc4 100644
--- a/aep-schedule-website/src/frontend/components/schedules.rs
+++ b/aep-schedule-website/src/frontend/components/schedules.rs
@@ -1,5 +1,6 @@
 use std::rc::Rc;
 
+use crate::frontend::components::icons::warning_circle::WarningCircle;
 use crate::frontend::components::options::todo::Todo;
 use crate::frontend::state::OptionState;
 use crate::{backend::routes::get_calendar, frontend::components::schedule::ScheduleComponent};
@@ -13,12 +14,14 @@ pub fn SchedulesComponent() -> impl IntoView {
         <Await
             future=get_calendar
             children=move |calendar| {
-                match state.step.get() == 6 {
+                let bad_generation = state.schedule.get().is_empty();
+                let generated = state.step.get() == 6;
+                match generated && !bad_generation {
                     true => {
                         let calendar = Rc::new(calendar.clone().unwrap());
                         view !{
                             <For
-                                each=move || {state.schedule.get()}
+                                each=move || state.schedule.get()
                                 key= |course| course.id
                                 children= move |schedule| {
                                     let calendar = Rc::clone(&calendar);
@@ -27,11 +30,24 @@ pub fn SchedulesComponent() -> impl IntoView {
                                     }
                                 }
                             />
-                        }
+                        }.into_view()
                     },
                     _ => view ! {
                         <Todo/>
-                    }
+                        {
+                            match generated && bad_generation {
+                                true => Some(view !{
+                                    <div class="warning-box">
+                                        <WarningCircle size="4em"/>
+                                        <span>
+                                            "Aucun horaire n'a pu être généré, augmentez le nombre de conflits ou ouvrez des sections. Probablement que deux groupes sont toujours en conflits."
+                                        </span>
+                                    </div>
+                                }),
+                                false => None,
+                            }
+                        }
+                    }.into_view()
                 }
             }
         />
diff --git a/aep-schedule-website/src/frontend/pages/classroom.rs b/aep-schedule-website/src/frontend/pages/classroom.rs
index 4c4adbe6ae35fe863c98a3deb062c6682649113a..a3576be54d2d2ad56bccb0f8601ab8039dfb4d60 100644
--- a/aep-schedule-website/src/frontend/pages/classroom.rs
+++ b/aep-schedule-website/src/frontend/pages/classroom.rs
@@ -66,7 +66,7 @@ pub fn ClassRoomComponent() -> impl IntoView {
                 {classrooms.as_ref().map(|classrooms| {
                     let classrooms = classrooms.iter().map(|c| AutoCompleteOption::new(c.to_string(), c.to_string())).collect();
                     view!{
-                        <AutoComplete suggestion_list=classrooms placeholder="Local" class="w-96" submit=on_submit id="input-classroom"/>
+                        <AutoComplete suggestion_list=classrooms placeholder="Local" class="w-96 shadow-2xl border-b-4 border-amber-500 focus:outline-none focus:ring-0" submit=on_submit id="input-classroom"/>
                     }
                 }).ok()}
             </Await>
diff --git a/aep-schedule-website/style/main.scss b/aep-schedule-website/style/main.scss
index d70311a1631988e99110163342065985bbbb2e6d..3e989a66b179bcb51c31317552c5bb7e417e6b70 100644
--- a/aep-schedule-website/style/main.scss
+++ b/aep-schedule-website/style/main.scss
@@ -108,7 +108,7 @@ main {
 	justify-items: center;
 	background-color: $background-color;
 	padding: 1.0rem;
-	gap: 0.2em;
+	gap: 0.5em;
 	animation: 0.5s ease-out 0s 1 slideInFromLeft;
 }
 
diff --git a/aep-schedule-website/style/options.scss b/aep-schedule-website/style/options.scss
index 051f66c92eb624ec7526bc1dd2dd20592e743f1d..7811b6a28634d2d27bf942f09f10afa608f01b6d 100644
--- a/aep-schedule-website/style/options.scss
+++ b/aep-schedule-website/style/options.scss
@@ -81,32 +81,6 @@
   background-color: $background-color;
 }
 
-.chips {
-  padding: 5px 8px;
-  border-radius: 15px;
-  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
-  font-size: 16px;
-  display: flex;
-  align-items: center;
-}
-
-.tab-button {
-  background-color: $tern-color;
-  border: none;
-  color: $tern-text;
-  margin-top: 5px;
-  margin-right: 5px;
-  text-align: center;
-  justify-content: left;
-  text-decoration: none;
-  transition-duration: 150ms;
-}
-
-.tab-selected {
-  background-color: $highlight-color;
-  color: $tern-text;
-}
-
 .close {
   background: none;
   border: none;
diff --git a/aep-schedule-website/style/schedule.scss b/aep-schedule-website/style/schedule.scss
index 701433779957dc84b1500c1c9d3ac350d6be7651..3ea33940f8b456ac3112a59abf179575d59c905b 100644
--- a/aep-schedule-website/style/schedule.scss
+++ b/aep-schedule-website/style/schedule.scss
@@ -72,7 +72,7 @@ $days: $time-width 10px repeat(5, 1fr);
 .event {
   border-radius: 0.5em;
   padding: 1px;
-  margin: 0 2px;
+  margin: 1px 1px 2px 2px;
   font-weight: bold;
   font-size: 70%;
   text-align: center;
@@ -91,13 +91,13 @@ $days: $time-width 10px repeat(5, 1fr);
 }
 
 .b1 {
-  width: 45%;
-  margin-right: 55%;
+  width: calc(50% - 2px);
+  margin-right: calc(50% + 1px);
 }
 
 .b2 {
-  width: 45%;
-  margin-left: 55%;
+  width: calc(50% - 2px);
+  margin-left: calc(50% + 1px);
 }
 
 .button-download {