Android's K-9 Mail battery life and Dovecot's Push-IMAP

What is Push-IMAP, and why is it useful?

In the world of mobile phones, battery life is a concern. You want to be able maximize the battery life on your mobile phone, while still getting instant notifications of new e-mail. This is where Push-IMAP (aka. IMAP PUSH, P-IMAP) comes into play, an extension based on an RFC which combines with IMAP IDLE. You no longer need to poll the IMAP server if you are using this feature, as you always have an open connection.

What's the problem?

I am using K-9 Mail on my Android phone, and would like to make use of the IMAP PUSH feature but I found it consumes far too much battery. In Dovecot 1.2 when you initiate IMAP IDLE via your IMAP client (eg. K-9 Mail) Dovecot sends a message every 2 minutes stating "OK Still here", this causes the mobile data connection to have to wake up and consumes excessive amounts of battery. There is no way to configure this behavior in Dovecot 1.2 except by a source edit.

The solution

You will need to upgrade your Dovecot installation to 2.0 (if you aren't running 2.0 already,) which is slightly out of the scope of this blog entry. I found the upgrade rather painless by following the Upgrading Dovecot v1.2 to v2.0 guide on the Dovecot Wiki.

Dovecot 2.0 supports a configuration option called imap_idle_notify_interval which enables you to specify the interval between "OK Still here" messages. K-9 mail by default refreshes IDLE connections every 24 minutes, but of course Dovecot wakes up the client much more frequently than that. We are going to fix this behavoir.

The configuration of Dovecot 2.0 is slightly different than Dovecot 1.2, composing of multiple files. If you are using Linux your Dovecot configuration is most likely contained under /etc/dovecot, and on FreeBSD it is contained under /usr/local/etc. You will want to edit the conf.d/20-imap.conf file under the respective directory based on your host operating system.

You will see a stanza similar to the one outlined below, and you will want to uncomment the imap_idle_notify_interval line and replace 2 mins with 29 mins.

protocol imap {
 # How long to wait between "OK Still here" notifications when client is
 # IDLEing.
 #imap_idle_notify_interval = 2 mins

When you have completed this step, you will want to restart Dovecot. This can be accomplished on Linux with /etc/init.d/dovecot restart, or /usr/local/etc/rc.d/dovecot restart on FreeBSD.

My results

By switching the Dovecot server to send the "OK Still here" notification to every 24 minutes instead of 2 minutes the mobile client is woken up much more infrequently, either when you receive a new e-mail or every 29 minutes respectively. This has greatly improved the battery life on my HTC Desire Z with K-9 Mail, and hopefully it will help out with your device issues and being able to instantly receive new e-mail notifications!

An update, RFC style

Clint Pachl e-mailed me to inform me that IMAP4 IDLE RFC (rfc2177) specifics that the client should issue a IDLE command every 29 minutes. I have updated the guide to reflect this change.

Because the K-9 default "Refresh IDLE connection" is 24 minutes, that gives a buffer of 5 minutes if the IMAP server timeout is set to 29 minutes. The RFC and K-9 default times, 29 and 24 respectively, don't seem like a coincidence. I think the RFC may have been an influence on the K-9 devs when choosing a default IDLE refresh.

Consequently, setting Dovecot's imap_idle_notify_interval to 29 minutes seems most appropriate considering K-9's default. This gives K-9 ample time to respond in case of short outages or passing between cell towers (<5min window). However, beyond that window, the server can then shut down the connection.

Setting both the server and the client to the same timeout/refresh may cause some cross-talk.

Disabling menu bar, navigation transparency in Firefox 4 on Windows 7, Vista


Firefox 4 which was released on March 22nd, 2011 is a very fast and featured browser with tons of improvements over previous versions. But like always, Mozilla has changed something in the browser that I don't like, and this time it is the transparency of the new title bar. It is quite distracting, and infact it was so distracting that I needed to figure out how to disable the transparency.

I heard some suggestions to disable Windows Aero, but this isn't really an option since it's disabled on a system basis and what if I only don't like the transparency in Firefox? I found a simple fix by using the features available in userChrome.css to modify the layout of the Firefox.


@namespace url(;
#TabsToolbar, #PersonalToolbar, window, page, dialog, wizard, prefwindow {
 background-color: -moz-dialog !important;

How do I edit userChrome.css?

This tutorial assumes that you have Hide Extensions for known file types unchecked in Windows Explorer Folder Options.

  1. Open Windows Explorer and enter %APPDATA%\Mozilla\Firefox\Profiles into the Address Bar,
  2. On screen you will see a folder with a random name (eg. 7q4fse53.default,) select the folder,
  3. Select the chrome folder in your profile for Mozilla Firefox,
  4. If a file named userChrome.css does not exist: create it by right clicking and selecting "New Text Document" under the New context menu, and rename the newly created file to userChrome.css,
  5. Open the file userChrome.css in Notepad or a text editor of your choice, and paste the content from the userChrome.css section (from above) into the file,
  6. Save the changes you have made to userChrome.css in your text editor,
  7. Restart Mozilla Firefox to see the changes you have made to your userChrome.css file.

It would be helpful if Mozilla made some of these layout changes configurable, this reminds me of the AwesomeBar (TM) feature which not everyone thinks is so awesome. But at least we have userChrome.css, and addons for layout changes.

VLAN tag un-NATed WAN connection on DD-WRT

This is a followup to my Netgear WNR3500L, DD-WRT and TELUS IPTV post.

I am using 802.1q VLAN on my Netgear switch and NAT device running DD-WRT, my whole network is behind a NAT with a separate VLAN for my IPTV. I wanted to have the ability to give unfiltered (un-NATed) network access to certain devices in my household, without having to change any wires.

The solution? 802.1q VLAN tag the WAN VLAN on DD-WRT. It was really very simple, on the Netgear WNR3500L DD-WRT uses VLAN2 as the WAN VLAN (because of the way the internals of this particular Broadcom device work.)

I simply logged into the DD-WRT interface of the device, selected VLANS tab (from the Setup tab) and checked Port 4 (which is really Port 1 on my device, which I have plugged into my 24 port switch) as Tagged, then I restarted the device. Now when I want unfettered internet access to a virtual machine, or desktop I simply add the port (either on my Netgear NAT device or my switch as tagged) to VLAN 2 and it works!

Netgear WNR3500L, DD-WRT and TELUS IPTV


TELUS is shipping an Actiontec V1000H VDSL modem, wireless and NAT combination with HPNA support to customers now. I am with TELUS and have the Optik TV and Turbo 25 internet bundle. I found that the device has a number of issues such as broken UPnP support, wireless coverage is weak, and no USB support. I set out to replace the TELUS supplied solution with my own more flexible solution.

Remember, none of this is supported by TELUS so you are on your own if things break and you need support!


I found a standalone Alcatel Cellpipe 7130 VDSL2 modem that works with TELUS VDSL2 service, and combined it with a Netgear WNR3500L running DD-WRT (svn15943-snow build.) This guide assumes that you generally know the inner workings of DD-WRT, and have already installed DD-WRT on your device.

Problems & Solutions

I ran into a number of issues, all which had easy fixes. The issues were both caused by how TELUS IPTV operates and flaws in the Netgear hardware:

  • DD-WRT would lock up when too many TVs were on in the household
  • If multicast traffic is disabled, TV will play for 30 seconds and then display the connection error on your STB (set top box)
  • Multicast traffic would be broadcasted over wireless, causing wireless to be unusable when TV was being watched
  • Netgear WNR3500L ports are backwards on the switch (Eg, Port 1 is Port 4 in DD-WRT)
  • The VLAN configuration screen in DD-WRT doesn't actually setup the device correctly

I will attempt to describe how I resolved the issues in this article.

Disable SPI Firewall on the Device

The Netgear WNR3500L (herein refered to as device), at 453Mhz in DD-WRT is simply not fast enough to handle the amount of IPTV (multicast, and otherwise) traffic that TELUS TV requires. To fix this issue, simply navigate to the Firewall tab (located under the Security tab) and select Disable for SPI Firewall.

Enable VLANs to limit multicast traffic to IPTV devices

First, you need to enable SSH or Telnet on your device. This can be accomplished under Services tab. Once you have enabled SSH, you may need to Reboot Router to have SSH access enabled. You can simply SSH to the device and setup the VLAN.

This guide assumes that you will use Ports 2 – 4 on the device for IPTV and no other purpose, and Port 1 for your computer (or switch.) We will setup IPTV on VLAN3 on the device. Keep in mind that the ports on the router are device backwards (eg. Port 1 on the back of the device is Port 4 in DD-WRT) as illustrated below.

Physical 1 2 3 4
Virtual 4 3 2 1

In SSH on the device, enter the following commands

nvram set vlan3ports="1 2 3 8*"
nvram set vlan1ports="4 8*"
nvram commit

Once you have completed these steps, you can navigate to the VLANs tab (located under the Setup tab) and setup your VLAN as follows:

Check the Tagged marks for 1-3 at the bottom of the selection and uncheck ports 1-3 on VLAN1 and check them on VLAN3. Your VLAN configuration screen should look somewhat similar to the one shown below after completion.

Ports are listed backwards; Port 4 on VLAN1 is really Port 1 on your device.

Once you have completed the VLANs configuration as listed above (or similar) select the Save button and navigate to the Networking tab (located under Setup tab.) You are now ready to assign an IP address for the device to this new VLAN you have configured.

On the Network Configuration vlan3 select the Unbridged radio button, enable Multicast Forwarding and Masquerade / NAT options for the VLAN. Enter IP address and Subnet mask, once you have completed these steps select the Save button.

Now it is time to setup your DHCP server for the new VLAN you have created. This enables devices to get an IP address on the VLAN, and to communicate with the rest of the network. Simply select the Add button under the DHCPD subheading. Select VLAN3 from the newly created DHCP 0 instance. Then select the Save button to complete the DHCP creation.

Now you are ready to restart your device, navigate over to the Administration tab and select Reboot Router at the bottom of the screen. Once your device has rebooted, if you have followed all the steps listed you should have a separate VLAN on Port 2-4 for your IPTV devices and Port 1 for your computer.

At this point, it would probably be advisable to restart all your IPTV devices in your household by unplugging them from the power and plugging them back in. You may want to test the IPTV ports on your device by plugging a computer into them, and making sure that they are allocated an IP address from