 #define MAIN_SENSOR_UPDATE 60000
 
 // LCD
-LiquidCrystal_I2C _lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
+//LiquidCrystal_I2C _lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
 
 // Touched
 CapacitiveSensor _touch = CapacitiveSensor(touchCommonPin,touchSensPin); 
 
 // Athmospheric Sensor 
-Adafruit_BMP085 _bmp = Adafruit_BMP085(1234);
+Adafruit_BMP085 _mainSensor = Adafruit_BMP085(0);
+
+// Sensor Defintion
+typedef struct SensorStruct {
+  char * name; 
+  uint8_t id; // Sensor ID
+  float value; 
+  char * unit; // Unit
+} SensorDefinition;
+
+// Rendering
+typedef struct RenderStruct {
+  LiquidCrystal_I2C lcd; // LCD
+  SensorDefinition * sensor; // Sensor to display
+  byte tick; // Used for transition
+} RenderDefinition;
 
 // Sensor RX Data
-typedef struct sensorData_t{
+typedef struct RxSensorDataStruct {
   byte id; // size 1
   float value; // size 4
+} RxSensorDataDefinition;
+
+typedef union RxSensorRawDataStruc{
+  RxSensorDataDefinition decoded;
+  uint8_t raw[5]; // total size of 5 bytes
+} RxSensorRawDataDefinition;
+
+// RX Message
+typedef struct ReceiverStruct {
+  uint8_t stream[VW_MAX_MESSAGE_LEN]; // Raw Rx Stream
+  RxSensorRawDataDefinition value; // Decoded Value
+} ReceiverDefinition;
+
+// Main Application Structure
+typedef struct ApplicationStruct {
+  byte nbrSensor;
+  SensorDefinition sensors[2]; // Sensors Definition
+  RenderDefinition render; // LCD rendering
+  ReceiverDefinition rx; // RX receiver
+  unsigned long lastTouched; // Last Touched time
+} ApplicationDefinition;
+
+// Static Definition
+ApplicationDefinition _app = {
+  2, // Total number of sensors
+  // Sensors
+  {
+    // Sensor #1
+    {
+      "Inside Temp",
+      0, // Sensor ID
+      -99.0, // Initial Value
+      "°C"
+    },
+    // Sensor #2
+    {
+      "Outside Temp",
+      42, // Sensor ID
+      -99.0, // Initial Value
+      "°C"
+    }
+  },
+    // Render
+  {
+    LiquidCrystal_I2C(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin)
+    // Init other field with 0
+  },
+  
+  // RX Reveiver
+  {
+    // Init array with 0
+  },
+  0 // last touched
 };
 
-typedef union sensorData_union_t{
-  sensorData_t data;
-  uint8_t raw[5]; // total size of 5 bytes
-};
-
-// Main Sensor Definition
-typedef struct mainSensorDef_t {
-  float pressure;
-  float temp;
-};
-
-// Remote Sensor Defintion
-typedef struct remoteSensorDef_t {
-  char * name;
-  uint8_t id;
-  float temp;
-};
-
-// RX message
-uint8_t _message[VW_MAX_MESSAGE_LEN];
-
-// LCD State
-State _lcdHome = State(updateSensor);
-
-// Remote Sensors
-remoteSensorDef_t * _remoteSensors;
-
-// Last Touched
-unsigned long _lastTouch;
 
 void setup() {
   // Led Setup

  vw_setup(2000);

  // Set Up LCD
  _lcd.begin (16,2); // 16x2 LCD
  _lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  _lcd.setBacklight(HIGH);
  _lcd.home();
  _lcd.print("--- Welcome ---");

  // Start the receiver
  vw_rx_start();

  // Initialise 
  if(!_bmp.begin())
  {
    /* There was a problem detecting the BMP085 ... check your connections */
    Serial.print("Ooops, no BMP085 detected ...");
  }

  // Remote sensore Static Def
  _remoteSensors = new remoteSensorDef_t[2];

  _remoteSensors[0].name="Sonde 1";
  _remoteSensors[0].id=42;

  _remoteSensors[0].name="Sonde 2";
  _remoteSensors[0].id=69;
}

void loop() {

      if(messageLen>4)
      {
        // Convert Byte to Sensor Data
        //RxSensorRawDataDefinition sensor;

        for (int k=0; k < 5; k++)
        { 
          _app.rx.value.raw[k] = _app.rx.stream[k];
        }
        
        // Fire this new value        
        fireNewSensorValue(_app.rx.value.decoded.id, _app.rx.value.decoded.value);
      } 
      else
      {
