[ROM] CyanogenMod 9.1.0d (Android 4.0.4) 
Obviously, it's the CyanogenMod team and all CM contributors in the first place.
Besides that and my own humble work, CM for Milestone would not be where it is now without the essential works of Skrilax_CZ (2nd-init, OpenRecovery, custom kernel, 2ndboot fixes and more), Czechop (hack to the kernel usb initialization code that allows to keep BP working after 2ndboot to custom kernel), f_pasha (gkisystem semaphore patch), Tiago Sousa (author of the original overclock kernel module) and contributions from others that I forgot to list here
Also worth mentioning is a lot of notable work done by the Defy developers: Epsylon, Quarx and Maniac103
The original 2ndboot code is by Dmitriy Taychenachev and Eugen Maksimov.
Please note that Milestone is not officially supported by CyanogenMod.
Home page: http://android.doshaska.net/cm9
Build from source: http://android.doshaska.net/cm9build
gapps 20121225: http://d-h.st/xd0
OpenRecovery 2ndbootOR: http://code.google.com/p/cyanogenmod...ootOR_v1_1.zip
Because of limited space in system, gapps are installed to /data/vendor. But if ext partition is present on sdcard, they are moved to /sd-ext.
Therefore ext partition is highly recommended for CM9, otherwise the space for apps in /data will be too limited.
You can find instructions on how to resize fat and create ext3 partition directly in OpenRecovery in this very fine guide by pontomedon:
Full guide from stock Motorola Android to CyanogenMod 7 for Milestone
CM9 for Milestone is using 2ndboot to run custom kernel despite the bootloader kernel lock.
Android 4.x requires at least 340MB RAM available to kernel and userspace
As we have only 225MB, don't expect any miracles - the hardware constrains count.
HW acceleration increases application's RAM demands. You can use the included HWA Settings app to disable it per app.
You tell me
9.1.0d (4.0.4) 07.01.2013
- fix: keep keyboard backlight off while keyboard is hidden
- fix crash on launch of certain apps (e.g. Aldiko) - use workaround for occasional mysteriously zeroed bitmap scale parameter
- Apollo music player fixes - jellybean backports; reworked image fetching and caching (by iwo)
9.1.0c (4.0.4) 30.12.2012
- call recording: fix recording for calls with asterisk in the phone number
- fix the per app HW acceleration disable code to work according to application package name as specified by HWA Settings app (the original implementation [which pre-dated HWA app usage] used process name, not package name)
- re-implement the 'Disable Dock Observer' option - for users of phone cases with magnetic closures (to prevent the screen turning on in reaction to a magnet appearing near the phone)
9.1.0b (4.0.4) 26.12.2012
- fix VoiceSearch, VoiceTyping and Talk (voice) - please use the updated gapps package http://d-h.st/xd0
- fix adb toggle
- fix possible crash when recording videos and re-enable limited preview frame rate for better Camera app responsiveness
- fix backup of system files (mostly gapps) during ROM updates
- add built-in call recording option; no beeps every 10s during call recording any more
- updated CMFileManager
- wifi: disable 802.11n support by default (HT_Enable in tiwlan.ini) to prevent stale data connections when using certain N routers
- kernel: reverted doubling of the DAC fifo size to 16384 (to prevent audio drop-outs) as it caused broken audio playback in certain games
in case you're wondering why the new build is not uploaded to github as before, see https://github.com/blog/1302-goodbye-uploads
9.1.0a (4.0.4) 11.12.2012
- fix relaunch of some activities on keyboard slide out/in (e.g. YouTube playback, Root Explorer...)
- CMFileManager included (backport from JB)
- fix unwanted lcd-backlight activation by camera button while the screen is off (was related to the light sensor workaround that allows to use camera button to provoke sending of light sensor data without waiting for ALS interrupt)
- better handling of Basband Processor panic (by maniac103) - instead of immediate reboot like in stock firmware, user is notified and can choose to postpone the reboot (e.g. when he's got some work to finish first). Note about the reason of reboot is displayed after restart.
- workarounds for some motorola RIL issues that cause occasional data connectivity problems (by maniac103)
- optional swap activation on boot via /system/etc/init.d/12swap
-- requires swap partition present as third partition on sdcard
-- swap size (in kB) is determined by persist.sys.swapsize property
-- no persist.sys.swapsize property defined or set to 0 means no swap activation
example how to set persist.sys.swapsize property in terminal:
setprop persist.sys.swapsize 16384
9.1.0 (4.0.4) 05.12.2012
notable recent fixes and features:
- support for connecting to adhoc wifi
- fixed wifi networking when using UPnP/DLNA apps
- note that this build is done from the branch with removed theme engine,
as the theme support seems to be too heavy, hurting performance of our device
- video recording (not exactly smooth yet, but working nevertheless)
- added missing sysctl to prevent RAM fragmentation (cause of gmaps freezes)
- camera is working (only taking pictures, not video recording; panorama mode is not working)
- switched back to Calendar and LatinIME built from source (use the updated gapps-ics-4.0.3-20120302)
- bootanimation is enabled by default, it can be disabled under performance settings
- baseband selection is under device>advanced settings
- usb and native wifi tethering is not working yet (but should be fixed soon, probably in the next build)
- until the open source solution will be ready, Google builds of Calendar and CalendarProvider are installed via gapps to provide Google Calendar sync. Google build of LatinIME is included to provide access to downloadable dictionaries.
- most of the gapps are installed to /data/vendor. if you are updating from earlier CM9 build, use "rm -r /system/*" in recovery console before installation to make sure you don't run out of space in /system because of previously installed gapps
- bootanimation is disabled (debug.sf.nobootanimation=1 in build.prop), because the default bootanim takes more than 80MB of RAM while running, which may cause issues - from very long boot time to bootloops.