Skip to content

Added PowerSaving for all ESP32-based repeaters#1687

Open
IoTThinks wants to merge 9 commits intomeshcore-dev:devfrom
IoTThinks:MCdev-PowerSaving-for-all-esp32-repeaters-202602
Open

Added PowerSaving for all ESP32-based repeaters#1687
IoTThinks wants to merge 9 commits intomeshcore-dev:devfrom
IoTThinks:MCdev-PowerSaving-for-all-esp32-repeaters-202602

Conversation

@IoTThinks
Copy link
Copy Markdown
Contributor

@IoTThinks IoTThinks commented Feb 13, 2026

Hi friends,
This is the cleanup PR for this old PR #1353
The changes are below:

  1. (New) Let ESP32-based repeaters to sleep immediately receiving and process a LoRa packet
  2. (New) Added detailed response for powersaving CLI
  3. Supported sleep for all ESP32-based repeaters
  4. (New) Reduced time drift ESP32-based repeaters in power saving
  5. Added getIRQGpio to return DIO1 (SX1262) and DIO0 (SX127x)
  6. Fixed DIO0, DIO1 and RESET for Heltec v2. This is to allow Heltec v2 to do power saving. Well, I have a lot of requests to support Heltec v2.
  7. Added getIRQGpio to return DIO0 for Lilygo T3S3 SX1276
  8. Added getIRQGpio to return DIO0 for Lilygo TLoRa SX1276

I have tested with RAK4631, Heltec v3, Heltec v4 and Heltec V4 with ESPNOW.
I will set this as Draft to see if I miss anything and let all of my repeaters to run for a while.

Thanks a lot and have a nice day.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 13, 2026

Still need to fix for those TBeam boards.
Will do it tomorrow.

@IoTThinks IoTThinks marked this pull request as ready for review February 14, 2026 13:54
@IoTThinks IoTThinks marked this pull request as draft February 14, 2026 14:11
IoTThinks added a commit to IoTThinks/EasySkyMesh that referenced this pull request Feb 14, 2026
@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 14, 2026

@towerviewcams Here you go.
These files are for UPGRADE from existing repeater firmware.
https://github.com/IoTThinks/EasySkyMesh/tree/main/firmware/Testing/PR-1687

This PR should be for ESP32-based repeaters only.
I have tested RAK4631 to ensure the PR does not break PowerSaving in NRF52.

  • powersaving on => It should tell you to have effect immediately.

Testing steps for ESP32-based repeaters

  • powersaving on => It should tell you to to wait 2 minutes to see the power reduction. Around 14mA for Heltec v4. Around 10mA for Heltec v3.
    When receiving a LoRa packet, it will process and sleep again immediately.
  • For heltecv4 with bridge, it will say "Bridge not supported" and will not go to sleep.
  • powersaving off => Returns Off
  • powersaving => To see status On or Off
  • start ota => It will skip sleep and stay at 120mA. You can do OTA as normal. After automatically reboot, the powersaving will automatically run after 2 minutes from boot.
  • clock => for time drift, around 1 minute/24 hours.

Please help to test.
Thanks a lot.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 14, 2026

For Heltec v4, when doing "start ota", the current may jump to ...750mA then down to 124mA.
So if the power supply is not stable for spike or set at low voltage (3.6-3.8v) the "start ota" may fail to start.
I see this happen even if "powersaving off".

It should be ok for battery.

@IoTThinks IoTThinks marked this pull request as ready for review February 15, 2026 03:20
@cra0
Copy link
Copy Markdown

cra0 commented Feb 15, 2026

+1 testing atm

@towerviewcams
Copy link
Copy Markdown

towerviewcams commented Feb 15, 2026

V4 testing on two boards results:

*fresh flash 1.13 firmware, powersaving delay is 22 seconds, then drops to 11.6mA sleep.
**testing/PR-1687 flashed over the 1.13 firmware and sleep is FAST! after packet process, sleep is immediate. 11.6mA
(version shows 1.12 29-Jan-2026) on the test bin for PR1687) FYI. I know this file is new because powersaving now reply with "On - After 2 minutes".

I have also verified that the receiver sensitivity remains normal with my lab test companion set to -9 power and the V4 has rssi of my test signals at -117 setup in a RF cage (normal RX level for V4 in my test cage). Also checked to make sure GC1109 has power on VCC pin full time-yes. So the LNA is always on.

Now running live on the mesh here in Oregon USA. repeating packets normally working good.

Next for Rak!

**Update
Testing 2, 4631 rak boards with new stock 1.13 works great and sleep is immediate at 4mA

@beachmiles
Copy link
Copy Markdown

beachmiles commented Feb 17, 2026

There is a chance that rtc_gpio_hold_dis will release this pin P_LORA_PA_EN to its default state which is off. May want to put the rtc_gpio_hold_dis function after setting the pin. There could be an extremely short blip on waking up after deep sleep that may not really show too much during testing but is not ideal.

pinMode(P_LORA_PA_EN, OUTPUT);
digitalWrite(P_LORA_PA_EN,HIGH);
rtc_gpio_hold_dis((gpio_num_t)P_LORA_PA_EN);

The esp32 docs are not super clear on this rtc_gpio_hold_dis function and may be missing some detail that the gpio_hold_dis function had Discussion about it here.
#1600 (comment)

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 18, 2026

@beachmiles This is required in deepsleep as I understand.

rtc_gpio_hold_dis

This PowerSaving uses light sleep.
So during lightsleep, GPIO states and RAM are intact / unchanged.

@beachmiles
Copy link
Copy Markdown

beachmiles commented Feb 19, 2026

Initial testing on this firmware is very good with VERY low power usage during sleep (6.7mA at 5.095V / 34.2 mW) and its extremely quick in going back to sleep after handling traffic.
Nice job!!

The bright white LED is still flashing during communication which it ideally wouldn't be doing while in powersave.
I believe this is the P_LORA_TX_LED pin?
Ideally a check for powersaving_enabled flag could be done before running this function,
_board->onBeforeTransmit();

Otherwise you'd have to put the check in each of the onBeforeTransmit functions in all of the variants cpp files. Save a little bit of juice and reducing this small current spike during TX could help keep the PA voltage a bit more steady giving slightly better TX performance?

@mikecarper
Copy link
Copy Markdown

mikecarper commented Feb 19, 2026

@beachmiles can you remove the led on code and measure the power difference? If it's small then chasing this down might not be worth it; if it's significant then this is important

@towerviewcams
Copy link
Copy Markdown

@beachmiles can you remove the led on code and measure the power difference? If it's small then chasing this down might not be worth it; if it's significant then this is important

I remove the current limit resister on all my boards. Might be a small amount but why have a light show in a sealed box that no one can see. Buy areas like Oregon is now the benefit is a bit more then slow areas.

@beachmiles
Copy link
Copy Markdown

beachmiles commented Feb 19, 2026

@beachmiles can you remove the led on code and measure the power difference? If it's small then chasing this down might not be worth it; if it's significant then this is important

Will try to see if I can compile it with it off and do some testing. I am not only concerned about saving a tiny bit of power but also ensuring there is no VCC / 3.3V voltage drop with the bright LED on why transmitting as that same rail is used by the PA chip which could degrade its TX signal strength.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 20, 2026

@towerviewcams @beachmiles Likely very minimum power saved if turn off led after TX.

but also ensuring there is no VCC / 3.3V voltage drop with the bright LED on why transmitting as that same rail is used by the PA chip which could degrade its TX signal strength.

It makes sense.
I actually love to see the led on during TX for ...debugging :D
Generally, the LED seems to be ON for Heltec boards only.

Ideally a check for powersaving_enabled flag could be done before running this function,
_board->onBeforeTransmit();

Let me see if the code can access powersaving_flag.

@Theo-Marshall
Copy link
Copy Markdown

Theo-Marshall commented Feb 20, 2026

This works great for my ESP32C6 board. Current from 38 mA down to 6.5 mA, basically just spending energy on keeping the sx1262 in RX!
image

@beachmiles
Copy link
Copy Markdown

beachmiles commented Feb 20, 2026

Excuse my continued editing of this post. My original findings were bad as I was disabling the PA as well as the LED so was seeing way better power savings with the PA off.

I couldn't easily access the powersaving_flag inside RadioLibWrappers.cpp so I just commented out the LED turning on in HeltecV4Board.cpp and built and flashed to my v4.

With the LED on during TX I am seeing ~3.5W spikes that drops the voltage from my 5V usb power supply from 5.09V all the way down to 4.78V.

Edit 3. @mikecarper Having the LED turned off lowers this TX peak to 3.35W and the 5.09V voltage dropping to 4.83V.
So the powersavings with the LED off only saves~150mW during TX blasts which is still not insignificant.

Im guessing the onboard 3.3V regulator is handling this voltage drop without its 3.3V output dropping too far, but Im fairly sure its 3.3V output is not going to be steady during these short blasts of the LED which could slightly decrease the PA signal strength.

Maybe this powersaving flag could be a uint8 instead of a bool so you could set different levels of powersaving for folks that want LEDs flashing and still have decent powersaving. I def love LEDs when I am debugging/troubleshooting but not when its sealed inside a box powered by a battery.

This is the build I finally got working with only 1 line commented out that turns on the LED on the heltec v4 variant.
meshcore_Heltec_v4_Repeater_PR1687_wLED_Off_v3.zip

@mikecarper
Copy link
Copy Markdown

The savings here are significant. Great find @beachmiles. With powersaving on, led off makes a lot of sense; I don't think we need to make a setting here. If you want blinking lights just turn powersaving off.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 20, 2026

I am willing to off the led in powersaving on.
Still finding a way to reach the powersaving_enabled flag in Heltec v3 and v4.
Do you have any suggested simple fix for this?

BTW, if this is bad not because of power consumption but because of the voltage drop during TX.
Then the LED should not be on during TX at all regardless powersaving is on or off.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

@Theo-Marshall Thanks a lot for your testing.
Glad it works as my Xiao C6 has not reached me yet.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 20, 2026

@mikecarper @beachmiles Confirmed having lower voltage drop via USB cable when LED is on. Measured by realtime usb monitor.
However, this issue happens even in main power and may affect TX.
Actually, the main power will be less stable to current spike like LED compared to battery.

So I suggest we or any friends here propose a way to turn off LED for all boards in all modes instead of just in powersaving mode.

Many boards have this features. RAK4631 does not have it.

@basiccode12
Copy link
Copy Markdown

basiccode12 commented Feb 21, 2026

@IoTThinks Hi, my apologies on a little confused.

Some places say seeed esp32s3 + WIO works, some say it works with a pin hack. Some say its not working. Any chance I can get an update or eta (no hack).

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Feb 21, 2026

@basiccode12 This new PR requires no pin hack / change for Xiao Wio S3 combo.
This combo has a 30-pin connector link.

You may try the bin here.

https://github.com/IoTThinks/EasySkyMesh/releases/tag/PowerSaving13

Please note Xiao S3 (non Wio) + Wio Sx1262 is different.
This combo uses basic GPIOs only.
It is supported too in the link.
I will create a PR for this combo too.

@basiccode12
Copy link
Copy Markdown

basiccode12 commented Feb 21, 2026

@basiccode12 This new PR requires no pin hack / change for Xiao Wio S3 combo. This combo has a 30-pin connector link.

You may try the bin here.

https://github.com/IoTThinks/EasySkyMesh/releases/tag/PowerSaving13

Please note Xiao S3 (non Wio) + Wio Sx1262 is different. This combo uses basic GPIOs only. It is supported too in the link. I will create a PR for this combo too.

Thanks!, 66mA for 2 mins then to 9mA on a 30 pin connector type. Went straight back to sleep after repeat.
----> The only thing i noticed is there were no adverts in sleep. Is it supposed to wake for adverts? Has anyone else noticed this?

@IoTThinks
Copy link
Copy Markdown
Contributor Author

@basiccode12 All esp32 repeaters will wakeup every 30 minutes to check if to send adverts.

Last version, periodically adverts were sent correctly.

This version sleep after a few cycles after wakeup.

Let me monitor the adverts.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

@basiccode12 So your board is Xiao Wio S3.

Does it show battery percentage?

@IoTThinks
Copy link
Copy Markdown
Contributor Author

@AI7NC I'm doing the spam test against the fix now for Heltec v4.2.
Meanwhile, the time is still correct and advert is still continue to run.

@AI7NC
Copy link
Copy Markdown
Contributor

AI7NC commented Apr 5, 2026 via email

@terminalvelocity23
Copy link
Copy Markdown

What custom commands do you use?

Here's my config.

set prv.key 'key'
set radio 868.7313232,62.5,7,7
set name 'name'
set repeat on
set lat 'lat'
set lon 'lon'
set tx 22
set direct.txdelay 0.5
set txdelay 1.5
set rxdelay 2
set af 2
set agc.reset.interval 8
password 'password'
set multi.acks 1
set radio.rxgain off
powersaving on

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Apr 5, 2026

@terminalvelocity23 My new fix servived 60 K MeshCore requests.
The fix is to use friendlier lock to the FreeTOS than the current Arduino lock.

I will test another 60K requests tomorrow.

Your CLI commands look "harmless" (no impact).

@terminalvelocity23
Copy link
Copy Markdown

@IoTThinks good, because my repeater has crashed again. Panic / exception reset.

@Theo-Marshall
Copy link
Copy Markdown

I have a esp32c6 repeater that's been rock solid with an uptime of 38 days currently.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Apr 6, 2026

@terminalvelocity23 @fizzyfuzzle @AI7NC Please help to test this.
The fix is to use friendlier lock to the FreeRTOS than the current Arduino lock.
The version is "PowerSaving14.1-FixedWDTMux".

I have tested it with 3 spammers (MeshCore companion usb).
You may use CLI "powerlog" to see the last reset log if any.
Thanks a lot.
https://github.com/IoTThinks/EasySkyMesh/tree/main/firmware/Testing/2026-04-03-PowerSaving14.1-TEST

@terminalvelocity23
Copy link
Copy Markdown

@IoTThinks flashing now.

@AI7NC
Copy link
Copy Markdown
Contributor

AI7NC commented Apr 6, 2026

https://github.com/IoTThinks/EasySkyMesh/tree/main/firmware/Testing/2026-04-03-PowerSaving14.1-TEST

Is this for Heltec hardware V4.2 or hardware V4.3?

@towerviewcams
Copy link
Copy Markdown

https://github.com/IoTThinks/EasySkyMesh/tree/main/firmware/Testing/2026-04-03-PowerSaving14.1-TEST

Is this for Heltec hardware V4.2 or hardware V4.3?

14.1 has always covered both boards. I'm testing both at the house. so far so good at about 9 hours

@AI7NC
Copy link
Copy Markdown
Contributor

AI7NC commented Apr 6, 2026

Ok, my home repeater is running 14.1 4/6 build

@IoTThinks
Copy link
Copy Markdown
Contributor Author

@AI7NC The bin file PS14.1 is for both Heltec 4.2 and 4.3.
It automatically detects Heltec 4.2 or 4.3 based on FEM control pin.

On Heltec 4.2, set radio.fem.rxgain on/off will return not supported
On Heltec 4.3, you can set it on/off.

@fizzyfuzzle
Copy link
Copy Markdown

@IoTThinks latest build is still running without resets after 1 day and 6 hours so fingers crossed ;)

But it looks like it is using slightly more power (battery percentage going down faster), is that possible or is that just a coincident?

@terminalvelocity23
Copy link
Copy Markdown

terminalvelocity23 commented Apr 7, 2026

But it looks like it is using slightly more power (battery percentage going down faster), is that possible or is that just a coincident?

My scope shows idle current at 18-19 mA for a 4.3 board with everything turned on.
It's been a day and a half without resets, so, I'm leaving it till 48h on air and then flashing my firmware back, cause I need my patches. Will leave one V4.3 board on the bench running it for further testing.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

IoTThinks commented Apr 8, 2026

@fizzyfuzzle @terminalvelocity23 Glad it still works.
After a few days, if it is fine, I will push the changes here.

For the battery, when I tested, the power during sleep is still the same at 13mA.
The fix is to use safer lock for dual core esp32 only.
It may due to better RX so the board wakes more.

Let me monitor this battery usage on my Heltec v4.2 later.

@IoTThinks
Copy link
Copy Markdown
Contributor Author

I have just checked Heltec v4.2 (radio.rx is on).
It is still at 13.3mA at sleep and goes instant sleep after RX/TX.

It even has a BME680 sensor.
image

@IoTThinks
Copy link
Copy Markdown
Contributor Author

My scope shows idle current at 18-19 mA for a 4.3 board with everything turned on.

@terminalvelocity23 FEM is on too?
Yes, FEM control will be kept unchanged during sleep.

But why Heltec v4.3 goes up to 18-19mA with FEM on?
It should be the same as Heltec v4.2 (FEM is always on) at 13mA.

@AI7NC
Copy link
Copy Markdown
Contributor

AI7NC commented Apr 8, 2026

Ok, my home repeater is running 14.1 4/6 build

Uptime 29 hours so far.

image

@fizzyfuzzle
Copy link
Copy Markdown

1 day and 20 hours up now, still looking good 👍

@terminalvelocity23
Copy link
Copy Markdown

terminalvelocity23 commented Apr 8, 2026

@terminalvelocity23 FEM is on too? Yes, FEM control will be kept unchanged during sleep.

But why Heltec v4.3 goes up to 18-19mA with FEM on? It should be the same as Heltec v4.2 (FEM is always on) at 13mA.

FEM is on, RX boost is on. I don't know why. I've been testing this with a Siglent scope and Fluke 87, both were pretty accurate in the past. Don't have a spare 4.2 board on hand to test the current without pulling the repeaters apart. In the past I've tested it and it showed 13-14 mA IIRC.

upd: I noticed that the voltage in your setup is 3.6 V, and I've tested at 4.2 V. Maybe that's the cause, but I doubt it. I'll retest with 3.6 V and FEM on and off.

@terminalvelocity23
Copy link
Copy Markdown

I've tested it again at 3.6 V. With everything on, it's the same 18 mA as before. RX boost on/off doesn't change the current noticeably (it's less than 0.5 mA). Switching the LNA off makes the board draw 8-9 mA at idle.

@terminalvelocity23
Copy link
Copy Markdown

2 v4.2 nodes 48h up with no resets, I'd say it's stable enough.

@fizzyfuzzle
Copy link
Copy Markdown

Here also hit the 2 days mark on a v4.3 with 80.000+ received messages and no resets 👍

@IoTThinks
Copy link
Copy Markdown
Contributor Author

Switching the LNA off makes the board draw 8-9 mA at idle.

@terminalvelocity23 So basically, FEM off also uses 3-4mA more (last time is 5.5mA when both FEM and LNA off).
In new fix, a bit weird why Heltec v4.3 uses extra mA compared to Heltec v4.2 even when FEM is off.

Let me see.

@fizzyfuzzle
Copy link
Copy Markdown

I am also running the v4.3 with FEM off and I have the feeling (did not measure it but based on the battery percentage) that it is slightly using more power then the previous builds before this 'lock' change.

It can be coincidence, but this 3-4mA increase looks indeed also the change in percentage I noticed. It also looks like the rtc is running faster then it did with previous builds (not sure might also be because it has a longer online time ;))

@towerviewcams
Copy link
Copy Markdown

image

@towerviewcams
Copy link
Copy Markdown

towerviewcams commented Apr 8, 2026

@IoTThinks
Kevin, this firm does not draw any more power then previous PS14.1

This is fem off, rxgain on

and with both fem and rxgain off I'm at 5.7mA

All working normally

@IoTThinks
Copy link
Copy Markdown
Contributor Author

Let me investigate.
There is no code change at the RTC clock.
Mainly noInterrupts()/interrupts() vs. portENTER_CRITICAL(&sleepMux)/portEXIT_CRITICAL(&sleepMux);

This is the current code:


 void sleep(uint32_t secs) override {
    // Skip if not allow to sleep
    if (inhibit_sleep) {
      delay(1); // Give MCU to OTA to run
      return;
    }

    // Use more accurate clock in sleep
#if SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256
    if (rtc_clk_slow_src_get() != SOC_RTC_SLOW_CLK_SRC_RC_FAST) {

      // Switch slow clock source to RC_FAST / 256 (~31.25 kHz)
      rtc_clk_slow_src_set(SOC_RTC_SLOW_CLK_SRC_RC_FAST);

      // Calibrate slow clock
      esp_clk_slow_boot_cal(1024);
    }
#endif

    // Configure GPIO wakeup
    gpio_num_t wakeupPin = (gpio_num_t)getIRQGpio();
    esp_sleep_enable_gpio_wakeup();
    gpio_wakeup_enable((gpio_num_t)wakeupPin, GPIO_INTR_HIGH_LEVEL); // Wake up when receiving a LoRa packet

    // Configure timer wakeup
    if (secs > 0) {
      esp_sleep_enable_timer_wakeup(secs * 1000000ULL); // Wake up periodically to do scheduled jobs
    }

    // Disable CPU interrupt servicing
    noInterrupts();

    // Skip sleep if there is a LoRa packet
    if (digitalRead(wakeupPin) == HIGH) {
      interrupts();
      return;
    }

    // MCU enters light sleep
    esp_light_sleep_start();

    // Avoid ISR flood during wakeup due to HIGH LEVEL interrupt
    gpio_wakeup_disable(wakeupPin);
    gpio_set_intr_type(wakeupPin, GPIO_INTR_POSEDGE);

    // Enable CPU interrupt servicing
    interrupts();
  }

This is the fix:

void sleep(uint32_t secs) override {
    // Skip if not allow to sleep
    if (inhibit_sleep) {
      delay(1); // Give MCU to OTA to run
      return;
    }

    // Use more accurate clock in sleep
#if SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256
    if (rtc_clk_slow_src_get() != SOC_RTC_SLOW_CLK_SRC_RC_FAST) {

      // Switch slow clock source to RC_FAST / 256 (~31.25 kHz)
      rtc_clk_slow_src_set(SOC_RTC_SLOW_CLK_SRC_RC_FAST);

      // Calibrate slow clock
      esp_clk_slow_boot_cal(1024);
    }
#endif

    // Set GPIO wakeup
    gpio_num_t wakeupPin = (gpio_num_t)getIRQGpio();    

    // Configure timer wakeup
    if (secs > 0) {
      esp_sleep_enable_timer_wakeup(secs * 1000000ULL); // Wake up periodically to do scheduled jobs
    }

    // Disable CPU interrupt servicing
    // noInterrupts();
    portENTER_CRITICAL(&sleepMux);

    // Skip sleep if there is a LoRa packet
    if (gpio_get_level(wakeupPin) == HIGH) {
      portEXIT_CRITICAL(&sleepMux);
      delay(1);
      return;
    }

    // Configure GPIO wakeup
    esp_sleep_enable_gpio_wakeup();
    gpio_wakeup_enable((gpio_num_t)wakeupPin, GPIO_INTR_HIGH_LEVEL); // Wake up when receiving a LoRa packet

    // MCU enters light sleep
    esp_light_sleep_start();

    // Avoid ISR flood during wakeup due to HIGH LEVEL interrupt
    gpio_wakeup_disable(wakeupPin);
    gpio_set_intr_type(wakeupPin, GPIO_INTR_POSEDGE);

    // Enable CPU interrupt servicing
    // interrupts();
    portEXIT_CRITICAL(&sleepMux);
  }

@fizzyfuzzle
Copy link
Copy Markdown

@towerviewcams @IoTThinks
Thanks both for testing and checking 👍

Then it was probably some other variable at play 😅
Latest build is still stable without any restarts, so guess this change seems to work and can be applied to this PR right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.