   if (_pinLedRx != 0xff) digitalWrite(_pinLedRx, LOW);
 }
 
-inline unsigned int getBatteryLevel(void)
+static void updateBatteryLow(void)
 {
   const unsigned char BATREAD_COUNT = 4;
   
+  _isBattLow = HYGRO_BATTERY_OK;
   if (_pinBattery != 0xff)
   {
-    unsigned int retVal = 0;
+    unsigned int adcSum = 0;
+    unsigned char battPct;
     for (unsigned char i=0; i<BATREAD_COUNT; ++i)
-      retVal += analogRead(_pinBattery);
-    retVal /= BATREAD_COUNT;
-    return (unsigned long)retVal * 3300UL / 1023;
-  }
-  else
-    return 3300;  
-}
-
-void transmitTemps(unsigned char txCount)
+      adcSum += analogRead(_pinBattery);
+    // Send level as percent of VCC
+    battPct = (adcSum * 100UL) / (1024 * BATREAD_COUNT);
+
+#ifdef LMREMOTE_SERIAL
+    Serial.print("Battery level: "); Serial.print(retVal, DEC); Serial.print('\n');
+#endif
+
+    if (battPct < BATTERY_LOW_PCT)
+      _isBattLow = HYGRO_BATTERY_LOW;
+    _hygroVal = battPct;
+  }
+}
+
+static void transmitTemp(unsigned char pin)
+{
+  unsigned char outbuf[4];
+  unsigned char nodeId = _rfNodeBaseId + pin;
+  unsigned int val = _previousReads[pin];
+  val <<= (12 - (10 + TEMP_OVERSAMPLE_BITS));
+  outbuf[0] = 0x90 | ((nodeId & 0x3f) >> 2);
+  outbuf[1] = ((nodeId & 0x3f) << 6) | _isRecent | BYTE1_LMREMOTE_KEY | (val >> 8);
+  outbuf[2] = (val & 0xff);
+  outbuf[3] = _isBattLow | _hygroVal;
+  //Serial.println(outbuf[3], HEX);
+
+  // Don't check for air to be clear, we just woke from sleep and it will be milliseconds before
+  // the RFM chip is actually up and running
+  rf12_sendStart(outbuf, sizeof(outbuf));
+  rf12_sendWait(SLEEPMODE_TX);
+}
+
+static void newTempsAvailable(void)
 {
   // Enable the transmitter because it takes 1-5ms to turn on (3ms in my testing)
   rf12_sleep(RF12_WAKEUP);
 
-  char outbuf[
-    sizeof(rf12_probe_update_hdr_t) + 
-    RF_PINS_PER_SOURCE * sizeof(rf12_probe_update_t)
-  ];
-  rf12_probe_update_hdr_t *hdr;
-
-  hdr = (rf12_probe_update_hdr_t *)outbuf;
-  hdr->seqNo = _seqNo++;
-  hdr->batteryLevel = getBatteryLevel();
-  hdr->adcBits = 10 + TEMP_OVERSAMPLE_BITS;
-
+  updateBatteryLow();
   // We're done with the ADC shut it down until the next wake cycle
   ADCSRA &= ~bit(ADEN);
-
-  // Send all values regardless of if they've changed or not
-  rf12_probe_update_t *up = (rf12_probe_update_t *)&hdr[1];
+  if (_isRecent && (_loopCnt > (RECENT_EXPIRE_SECS/_sleepInterval)))
+  {
+    //Serial.print("No longer recent\n");
+    _isRecent = 0;
+  }
+
+  boolean hasTransmitted = false;
   for (unsigned char pin=0; pin < RF_PINS_PER_SOURCE; ++pin)
   {
     if (PIN_DISABLED(pin))
       continue;
-    up->probeIdx = pin;
-    up->adcValue = _previousReads[pin];
-    ++up;
-  }
-
-  // Hacky way to determine how much to send is see where our buffer pointer 
-  // compared to from the start of the buffer
-  unsigned char len = (unsigned int)up - (unsigned int)outbuf;
-
-  if (_pinLedTx != 0xff) digitalWrite(_pinLedTx, HIGH);
-  
-  while (txCount--)
-  {
-    // Don't check for air to be clear, we just woke from sleep and it will be milliseconds before
-    // the RFM chip is actually up and running
-
-    // HDR=0 means to broadcast, no ACK requested
-    rf12_sendStart(0, outbuf, len);
-    rf12_sendWait(2);
-  }  /* while txCount */
-
+    if (hasTransmitted) sleep(WDTO_15MS, false);
+    transmitTemp(pin);
+    hasTransmitted = true;
+  }
+  
   rf12_sleep(RF12_SLEEP);
-  if (_pinLedTx != 0xff) digitalWrite(_pinLedTx, LOW);
-}
-
-inline void newTempsAvailable(void)
-{
-  transmitTemps(1);
-}
-
-void enableAdcPullups(void)
+  if (_pinLedTx != 0xff)
+  {
+    digitalWrite(_pinLedTx, HIGH);
+    sleep(WDTO_15MS, false);
+    digitalWrite(_pinLedTx, LOW);
+  }
+}
+
+static void enableAdcPullups(void)
 {
   for (unsigned char pin=0; pin < RF_PINS_PER_SOURCE; ++pin)
   {

    oversampled_adc = oversampled_adc >> TEMP_OVERSAMPLE_BITS;

#ifdef LMREMOTE_SERIAL
    Serial.println(oversampled_adc, DEC);
#endif
    if (oversampled_adc != _previousReads[pin])
      modified = true;

  delayMicroseconds(10);
}

static void checkTemps(void)
{
  const unsigned char OVERSAMPLE_COUNT[] = {1, 4, 16, 64};  // 4^n
  boolean modified = false;
  unsigned int oversampled_adc = 0;

#ifdef LMREMOTE_SERIAL
  Serial.print(millis(), DEC);
  Serial.print(" Checking temps: ");
#endif

  enableAdcPullups();
  for (unsigned char pin=0; pin < RF_PINS_PER_SOURCE; ++pin)
