diff --git a/billabox.yaml b/billabox.yaml
index b630811a849e14fa9e15bdbb61aa0f05f209e266..c87e6046383669e5d73d8512d178812f5d9a2960 100644
--- a/billabox.yaml
+++ b/billabox.yaml
@@ -57,8 +57,25 @@ wifi:
 
 web_server:
   port: 80
+  version: 3
   local: true
   # include_internal: true
+  sorting_groups:
+    - id: g_environment
+      name: "Environment"
+      sorting_weight: 10
+    - id: g_doors
+      name: "Doors"
+      sorting_weight: 20
+    - id: g_lights
+      name: "Lights"
+      sorting_weight: 30
+    - id: g_controls
+      name: "Display"
+      sorting_weight: 40
+    - id: g_diagnostics
+      name: "Diagnostics"
+      sorting_weight: 50
 
 prometheus:
   include_internal: true
@@ -82,6 +99,8 @@ sensor:
   - platform: wifi_signal
     id: rssi
     name: "Wifi Signal"
+    web_server:
+      sorting_group_id: g_diagnostics
     update_interval: 60s
 
   - platform: uptime
@@ -94,24 +113,40 @@ sensor:
     address: 0x76
     temperature:
       name: "Temperature 0"
+      web_server:
+        sorting_group_id: g_environment
     pressure:
       name: "Pressure 0"
+      internal: true
+      web_server:
+        sorting_group_id: g_environment
     humidity:
       name: "Humidity 0"
+      web_server:
+        sorting_group_id: g_environment
 
   - platform: bme280_i2c
     id: bme280_1
     address: 0x77
     temperature:
       name: "Temperature 1"
+      web_server:
+        sorting_group_id: g_environment
     pressure:
       name: "Pressure 1"
+      internal: true
+      web_server:
+        sorting_group_id: g_environment
     humidity:
       name: "Humidity 1"
+      web_server:
+        sorting_group_id: g_environment
 
   - platform: rotary_encoder
     id: encoder
-    name: "Rotary Encoder"
+    name: "Encoder Position"
+    web_server:
+      sorting_group_id: g_controls
     pin_a: GPIO04
     pin_b: GPIO16
     resolution: 2
@@ -133,7 +168,9 @@ sensor:
 binary_sensor:
   - platform: gpio
     id: encoder_button
-    name: "Rotary Encoder Button"
+    name: "Encoder Button"
+    web_server:
+      sorting_group_id: g_controls
     pin:
       number: GPIO17
       inverted: true
@@ -145,10 +182,13 @@ binary_sensor:
         - switch.turn_on: display_active
 
   - platform: gpio
-    id: door_left
-    name: "Door Left"
+    id: door_left_closed
+    name: "Left Door Closed"
+    web_server:
+      sorting_group_id: g_doors
     pin:
       number: GPIO18
+      inverted: true
       mode:
         input: true
         pullup: true
@@ -160,10 +200,13 @@ binary_sensor:
         - switch.turn_off: display_active
 
   - platform: gpio
-    id: door_right
-    name: "Door Right"
+    id: door_right_closed
+    name: "Right Door Closed"
+    web_server:
+      sorting_group_id: g_doors
     pin:
       number: GPIO19
+      inverted: true
       mode:
         input: true
         pullup: true
@@ -177,7 +220,9 @@ binary_sensor:
 switch:
   - platform: template
     id: display_active
-    name: "Display Active"
+    name: "Active"
+    web_server:
+      sorting_group_id: g_controls
     optimistic: true
     restore_mode: ALWAYS_ON
     on_turn_on:
@@ -199,17 +244,25 @@ switch:
 text_sensor:
   - platform: version
     name: "ESPHome Version"
+    web_server:
+      sorting_group_id: g_diagnostics
     hide_timestamp: true
 
   - platform: debug
-    #device:
-    #  name: "Device: Info"
+    # device:
+    #   name: "Info"
+    #   web_server:
+    #       sorting_group_id: g_diagnostics
     reset_reason:
-      name: "Device: Reset Reason"
+      name: "Reset Reason"
+      web_server:
+          sorting_group_id: g_diagnostics
 
   - platform: template
     id: device_uptime
-    name: "Device: Uptime"
+    name: "Uptime"
+    web_server:
+      sorting_group_id: g_diagnostics
     update_interval: 15s
     lambda: |-
       uint32_t dur = id(device_uptime_seconds).state;
@@ -235,7 +288,9 @@ text_sensor:
 button:
   - platform: restart
     id: device_reset
-    name: "Device: Reset"
+    name: "Reset"
+    web_server:
+        sorting_group_id: g_diagnostics
 
 spi:
   - id: spi_bus
@@ -267,22 +322,31 @@ output:
 light:
   - platform: monochromatic
     id: display_backlight
-    name: "Display Backlight"
+    name: "Backlight"
+    web_server:
+      sorting_group_id: g_controls
     internal: true
     output: backlight_pwm
     restore_mode: ALWAYS_ON
 
-  - platform: fastled_clockless
-    id: upper_left
+  - platform: neopixelbus
+    id: lightbars
     name: "Lightbars"
-    chipset: WS2813
+    web_server:
+      sorting_group_id: g_lights
+    type: WRGB
+    variant: WS2811
     pin: GPIO13
     num_leds: 180
-    rgb_order: BRG
+    restore_mode: RESTORE_AND_ON
+    initial_state:
+      color_mode: RGB_WHITE
 
 number:
   - platform: template
-    name: "Display Timeout"
+    name: "Backlight Timeout"
+    web_server:
+      sorting_group_id: g_controls
     optimistic: true
     id: display_timeout
     unit_of_measurement: "s"
@@ -294,9 +358,11 @@ number:
     mode: box
 
   - platform: template
-    name: "Display Backlight"
-    optimistic: true
     id: display_brightness
+    name: "Backlight"
+    web_server:
+      sorting_group_id: g_controls
+    optimistic: true
     unit_of_measurement: "%"
     initial_value: 100
     restore_value: true
@@ -310,9 +376,11 @@ number:
           brightness: !lambda 'return x/100.0;'
 
   - platform: template
-    name: "Display Backlight (Dimmed)"
-    optimistic: true
     id: display_brightness_dimmed
+    name: "Backlight (Dimmed)"
+    web_server:
+      sorting_group_id: g_controls
+    optimistic: true
     unit_of_measurement: "%"
     initial_value: 20
     restore_value: true