* Allow for self joining tables in associations - #293 [James Gibson]
* Added "joinKey" on belongsTo(), hasOne() and hasMany() which allows you to specify a column to join to on the opposite side of the relationship from the "foreignKey" - [James Gibson]
View Enhancements
=================
* Added a better way to escape all HTML entities - [James Gibson]
* Ability to use custom types (HTML 5) on textField and textFieldTag form helpers - [Raul Riera]
* Default to the humanized property name for labels on calculated or non-persistent properties instead of throwing an error - [Andy Bellenie]
* Added escapeHTML argument on simpleFormat() - [Chris Peters]
* Made it possible to set global defaults on autoLink(), excerpt(), highlight() and simpleFormat() - [Chris Peters]
* Added support for array of structs for select() and selectTag() - #680 [William Fisk, Tony Petruzzi]
Controller Enhancements
=======================
* Speed improvement for finding routes when using a large amount of named routes - [James Gibson]
* Wheels now compacts the output of the rendered content - [James Gibson]
Other Enhancements
==================
* Added automatic caching in production mode of function results based on the arguments passed in - [Per Djurner]
* Plugin functions can now be injected into base model adapter and model connection components - [Per Djurner]
* Added support for Unobstructive Javascript - [Raul Riera]
Bug Fixes
=========
* Allow blank values to be passed through to validation - #638 [Per Djurner]
* Allow for encoding autodetection within provides - #674 [Raul Riera]
Miscellaneous
=============
* Removed the "cacheDatabaseSchema" setting, "cacheModelInitialization" should now be used instead - [Per Djurner]
* Added number formatting on the value passed in to "count" in the pluralize() function - [Per Djurner]
* Fixed renderWith() so that it works in all environment modes when returning JSON - #644 [Tony Petruzzi]
* Fixed belongsTo association code when using composite keys - #641 [James Gibson, Andy Bellenie]
* Allow cfthread to be used in views - #612 [Cathy Shapiro, Tony Petruzzi]
* Fixed paging code for non-parameterized queries - #656 [Mike Lester, Tony Petruzzi]
* Corrected bug in request verification when session management was disabled in Railo - #658 [Russ Sivak, Per Djurner]
* Changed "if" to "condition" on all validation methods to get around the fact that "if" is a reserved word in cfscript - #660 [Mohamad El-Husseini, Per Djurner]
* Fixed autolink() so that it correctly links and escapes relative paths - #646 [Tony Petruzzi]
* Fixed so including partials with layouts does not cause duplicated content - #659 [Per Djurner]
* Don't use the cfzip "overwrite" attribute when unzipping plugins since it updates the date on the files on Railo - [William Fisk, Per Djurner]
* Update to the error template to make sure errors are not thrown while trying to send out error emails - [James Gibson]
* Fixes a bug with obfuscation on Railo that happens when the mathematical constant "e" is in the string together with no other letters - [Jon Lynch, Tony Petruzzi, Per Djurner]
* Transaction="none" would throw an error if methods within a callback chain also attempted to make database changes - #613 [Andy Bellenie]
* Fixed bug that prevented the use of custom labels on calculated or non-persisted properties in form helpers and error messages - #630 [Andy Bellenie, Mike Henke]
* Update to renderwith() to return the content if "returnAs" equals "string" - [James Gibson, W. Scott Hayes]
* Removed case-sensitivity on labelXXX arguments passed through to form helpers - [Andy Bellenie]
* Corrected some bugs related to case, ordering and pagination on the H2 database - [Per Djurner]
* made it possible to use plugins on the H2 database - [Per Djurner]
* Fixed autoLink() so that it can handle all types of domains - #560 [Tom King, Tony Petruzzi]
* Corrected deobfuscation logic so that it... umm... works :) - #577 [Per Djurner, James Gibson]
* Fix for obfuscateParam() related to leading zeros in integer values on Railo - #578 [Tony Petruzzi]
* Fixed so correct defaults are set for "valueField" and "textField" on select() when dealing with objects - #445 [Per Djurner]
* Adapters now only fall backs on native code for getting the last inserted key when Railo/ACF can't do it automatically - #562 [Per Djurner]
* simpleFormat() now produce the exact same output regardless of the operating system - #570 [Raul Riera, Tony Petruzzi, Per Djurner]
* imageTag() was outputting the "id" attribute twice when caching was on, fixed now - #582 [Andy Bellenie, Per Djurner]
* Changed to using SCOPE_IDENTITY() as fallback for SQL Server - [Tony Petruzzi, Per Djurner]
* Fixed overwrite problem when using composite keys - #587 [Andy Bellenie, Per Djurner]
* Fixed bug with upper case input in humanize() and allow exception list for when abbreviations aren't caught - #587 [Andy Bellenie, Tony Petruzzi, Per Djurner]
* Made it possible to call model (and other) methods on application / session start - [W. Scott Hayes, Per Djurner]
* Fixed bug in setPagination() where floats could be passed in for the numeric values - [Tony Petruzzi]
* Fixed so labels on dateTimeSelectTags() and dateTimeSelect() get applied correctly to all six possible form inputs - #531 [Raul Riera, Tony Petruzzi, Chris Peters, Per Djurner]
* Made it possible to call the controller data function from a partial located in the root or sub folder - [Per Djurner, Chris Peters]
* Fixed a PostgreSQL pagination query that would fail under certain conditions (edge case) - [Per Djurner]
* Fixed deleting in nested properties - #579 [Adam Michel, Tony Petruzzi]
Miscellaneous
=============
* Removed the `afterFindCallbackLegacySupport` setting and made the new way introduced in Beta 1 the only way - #580 [Per Djurner]
* Changed "class" attribute on flashMessages(), errorMessageOn() and errorMessagesFor() to be camelCased - #554 [Per Djurner]
* Added better error reporting when passing in one primary key value when multiple are expected - #540 [Adam Michel, Tony Petruzzi]
* Support for automatic validations based on database settings (column does not allow nulls, has a maximum length etc) - [James Gibson, Andy Bellenie, Tony Petruzzi]
* Support for handling binary data columns - #133 [Tony Petruzzi]
* Callbacks are not pre-loaded anymore - #388 [Andy Bellenie]
* Support for NOT IN, IN, NOT LIKE, IS NULL, IS NOT NULL in where clause with proper use of cfqueryparam - [Per Djurner, Tony Petruzzi]
* Made it possible to use a blank value as a property default - [Andy Bellenie]
* Ability to skip validation when saving, e.g. save(validate=false) - [Tony Petruzzi]
* Added argument for model methods to be able to turn off callbacks, e.g. save(callbacks=false) - #236 [Andy Bellenie]
* Ability to set a default value for column statistics with "ifNull" argument - #330 [Andy Bellenie]
* Support for nested properties (saving data in associated model objects through the parent) - [James Gibson]
* Added automatic deletion of dependent models - #367 (Per Djurner, Andy Bellenie]
* Added "setUpdatedAtOnCreate" to tell Wheels if it should update the "updatedAt" property when creating new records - [James Gibson]
* New setting "useExpandedColumnAliases" that you can set to "true" to prepend included model properties with their model name in queries - #442 [Andy Bellenie]
* Arguments are now always passed in to "afterFind" callback methods and you can return them to set both queries and objects - [Tony Petruzzi]
* Updated findAll() to allow for more than one association as long as they are direct (i.e. include="assoc1,assoc2" works but not include="assoc1(assoc2)) - [James Gibson]
* Update to add GROUP BY functionality in finders - [James Gibson]
* Allow overriding of soft-deletes - #324 [Andy Bellenie]
* Added accessibleProperties() and protectedProperties() to protect model variables from mass assignment - [James Gibson]
* Ability to set defaults on a model using the "defaultValue" argument to property() - #244 [Andy Bellenie]
* Added transaction handling support, use the "transaction" argument on save(), updateAll() etc, callbacks are automatically wrapped in a transaction - #325 [Andy Bellenie]
* Added a position argument to primaryKeys() for easier retrieval - [Tony Petruzzi]
* Added a setPagination() function to make it possible to use paginationLinks() and similar functions for custom queries (i.e. ones not created with the Wheels ORM) - [Tony Petruzzi]
* Allow database views to be used as a model by calling setPrimaryKey() - #390 [Tony Petruzzi]
View Enhancements
=================
* Labels will now be added automatically for form helpers based on the object's property name (or a custom label set in the model) - [Andy Bellenie]
* Added default for "action" argument on linkTo() - #321 [Andy Bellenie]
* Added 12-hour format to date/time select helpers - #551 [Tony Petruzzi]
* Added a flashMessages() function that outputs all key/values from the Flash - [Per Djurner]
* Added support for inherited / nested layout templates through includeLayout() - [Per Djurner]
* Added "head" argument to styleSheetLinkTag() and JavaScriptIncludeTag() - [Per Djurner]
* flashMessages() can now pass a list of keys that controls which messages to display as well as the order they are displayed in - [Chris Peters]
* Ability for years to display in descending order in date select form tags - [Tony Petruzzi]
* Support for an automatic "assetQueryString" which can be used to force local browser caches to refresh when there is an update to your assets (CSS, JavaScript etc) - [James Gibson]
* Added buttonTag() form helper - [Tony Petruzzi]
* Added "disabled" and "readonly" arguments to form input helpers [Andy Bellenie]
* Allows disabling error elements appearing on form fields by setting "errorElement" - [Andy Bellenie]
* Updates to checkBoxTag() and checkBox() to allow for unchecked values - [James Gibson]
* Added "pageNumberAsParam" argument to paginationLinks() that decides whether the page parameter should be part of the route or just a regular parameter - [James Gibson]
* Added contentFor() and includeContent() used to set/display content - [Tony Petruzzi, Per Djurner]
* Added hasManyRadioButton() and hasManyCheckBox() used to easily add radio buttons / checkboxes for a hasMany relationship on a model when using nested properties. - [James Gibson]
* New global defaults for truncate() and wordTruncate() - [James Gibson]
* Added a toXHTML() function that returns an XHTML compliant string - [Tony Petruzzi]
* Added "dataFunction" argument to includePartial() for getting data from a controller function automatically - [Per Djurner]
* Added a h() function for sanitizing user output - [Tony Petruzzi]
* Added support for external links in linkTo(), startFormTag(), javaScriptIncludeTag() and styleSheetLinkTag() - [Tony Petruzzi]
Controller Enhancements
=======================
* Updated the request processing to not call the action if a before filter has rendered content - [James Gibson]
* Support for using an onMissingMethod() inside controllers - [James Gibson]
* redirectTo() now accepts a "delay" argument which can be used to delay the redirection until after the action code has completed (useful for testing) - [James Gibson, Tony Petruzzi]
* Added addDefaultRoutes(), used to control exactly where in the route order to place the default routes - [Per Djurner]
* New setting called "loadDefaultRoutes" which you can set to false when you want to use addDefaultRoutes() to load the routes manually - [Per Djurner]
* Added the ability to attach files with sendEmail() - [Per Djurner]
* Added "directory" and "deleteFile" arguments to sendFile() - #323 [Tony Petruzzi]
* Added the ability to set wildcard routes - [Andy Bellenie]
* Controllers can now respond to different formats such as "xml", "json", "csv", "pdf" and "xls" - [James Gibson]
* Ability to store Flash in cookies - [Per Djurner]
* Ability to add Flash messages when redirecting - [Per Djurner]
* redirecTo(back=true) can now fall back on a route/controller/action when the referrer is blank instead of throwing an error - [Per Djurner]
* Support for "format" parsing in route patterns ([controller]/[action].[format]) - [James Gibson]
* Ability to pass through arguments to filters - [Per Djurner]
* Added flashKeep() function for keeping Flash contents for one additional request - [Per Djurner]
* You can now validate type on incoming parameters using verifies() - [Tony Petruzzi]
* Defaulted day to 1 and month to 1 when submitting forms - [Tony Petruzzi]
* Added usesLayout() for specifying a controller specific layout - [Tony Petruzzi, Per Djurner]
* You can now perform a redirect instead of aborting the request using verifies(), any extra arguments passed in are passed through to redirectTo() - [Tony Petruzzi]
Other Enhancements
==================
* Allowed plugins to run in maintenance mode - [James Gibson]
* New setting, "errorEmailSubject", that allows you to customize the subject line of error emails - #392 [Per Djurner]
* New setting, "deletePluginDirectories" that tells Wheels whether to delete plugin directories if no corresponding ZIP file exists - #385 [Per Djurner]
* Added a "cachePlugins" setting to allow developers to not cache plugins during the development of them - #304 [Andy Bellenie]
* Allow setting multiple argument defaults at once, e.g. set(functionName="textField,textArea,select", labelPlacement="before" - #426 [Raul Riera, Per Djurner]
* A full testing framework is now included in Wheels, unit tests can be created in the "tests" folder - [Tony Petruzzi]
Bug Fixes
=========
* Session scope is now locked when accessing the Flash - #275 [James Gibson, Per Djurner]
* Corrected the "id" attribute for radioButton() when value is blank - #373 [Tony Petruzzi]
* findByKey() now correctly returns "false" when passed a blank "key" argument - #514 [Andy Bellenie]
* Fixed the handling for the "errorEmailServer" setting so that error emails can now be sent without having to set the server in the ColdFusion administrator - [Per Djurner]
* Corrected pluralize rules - #450 [Joshua Clingenpeel, Tony Petruzzi]
* Remove possible spaces in list passed in to callback registration - #448 [Raul Riera]
* Check to see that a function has a declaration in the settings before setting defaults - [James Gibson]
* Update to capitalize() to return nothing if the passed in string is empty - [James Gibson]
* validatesPresenceOf() now takes whitespace into account - [Tony Petruzzi]
* Fix for lock timeouts occurring during race conditions in the "design" and "development" modes - #467 [John C. Bland II, Andy Bellenie, Tony Petruzzi]
* Fix so Wheels uses passed in width/height in imageTag() when only one of them is passed in - #328 [Andy Bellenie, Per Djurner]
* Don't append .css, .js to asset files when they end in .cfm - [Tony Petruzzi]
* Update to reload to catch the query blank boolean error - [James Gibson]
* onCreate validations do not run when onSave validations fail - #455 [Andy Bellenie]
* Fixes bug with nullable foreign keys in where clause - [Andy Bellenie]
* Update to clean up variables from all scopes after running plugin injection - [James Gibson]
* Updated PostgreSQL types - [Jaroslaw Krzemienski, Per Djurner]
* Fix for race condition when checking for existing controller files in the "design" and "development" modes - #360 [Andrea Campolonghi, Per Djurner]
* Error in SQL Server pagination with mapped columns - #456 [Don Humphreys, Tony Petruzzi]
* Updated hasChanged() for a race condition that wasn't met - [James Gibson]
* Fixed pagination error in Oracle when using the "include" argument - #449 [Per Djurner]
* Fixed incorrect layout rendering for renderPartial() and includePartial() - #488 [Jordan Sitkin, Per Djurner]
* Fix for complex "include" strings - #453 [Jordan Sitkin, Andy Bellenie]
* Fixed naming conflict occurring for properties starting with the same name as its model on included objects - #461 [Tony Petruzzi, Per Djurner, Raul Riera]
* Fixed pluralization issue related to partials used with object(s)/queries and removed the limitation of the file being tied to the model name - #427 [Per Djurner, James Gibson]
* Prevent additional errors from occurring during display of CFML errors - #466 [John C. Bland II, Per Djurner, Tony Petruzzi]
* Added missing support for passing in array of model objects as options to select() - #411 [John C. Bland II, Tony Petruzzi]
* Fixed so "afterFind" callback methods are only called once during pagination - #435 [Bucky Schwarz, Doug Giles, Per Djurner]
* Added "prependOnAnchor" and "appendOnAnchor" arguments to paginationLinks() to get around an issue where the "appendToPage" string was added on anchor pages - #434 [Joshua Clingenpeel, Per Djurner]
* Fixed bug in paginationLinks() when using "appendToPage" with single page result - [Joshua Clingenpeel, Per Djurner]
* Fixed bug with count() when using composite primary keys - [Per Djurner]
* Fixed concurrency issue related to setting the model name on associations - #419 [John C. Bland II, Per Djurner]
* Fix for skipping duplicate columns returned from cfdbinfo when using Oracle - #437 & #439 [Mike Henke, Per Djurner]
* Fix for race conditions when setting the join clause in an application scoped model object - #432 [James Gibson, Per Djurner]
* Fixed so URLFor() is not duplicating controller and action when URL rewriting is off - #433 [Per Djurner]
* Added support to imageTag() for all image types that the CFML engine supports - [Cathy Shapiro, Per Djurner]
* Fixed error with a call to http://localhost/badtemplate.cfm not showing the output of the onmissingtemplate.cfm file - [Clarke Bishop, Andy Bellenie, Per Djurner]
* Corrected link in error email when URL rewriting is on - [Andy Bellenie]
* Fixed bug in MS SQL adapter when paginating and ordering on identically named columns from two tables - #355 [Don Bellamy, Per Djurner]
* Fixed bug where soft deleted rows were returned when using the include argument - #344 [Andy Bellenie, Per Djurner]
* Fixed bug where humanize() would add a space at the beginning of the string if it started with an upper case character - #359 [Per Djurner]
* To fix bugs with change tracking Wheels will now only check for changes to properties that exist on the model object - #353 [James Gibson, Per Djurner]
* Fixed so the keys we use for caching always return identical results so they do not break the cache unnecessarily - [Andy Bellenie, Per Djurner]
* Fixed so average() with integer values work in Railo - #331 [Raul Riera, James Gibson, Per Djurner]
* Fixed so the "for" attribute on form helpers always matches the "id" attribute when it's passed in by the developer - #340 [Chris Peters, Per Djurner]
* Fixed so findAll() afterFind callbacks run when one record is returned - #327 [Ryan Hoppitt, Per Djurner]
* Wrapped debug output completely in "cfoutput" tags so that it works when "enableCFOutputOnly" has been set to true - [William Fisk, Per Djurner]
* Fixed a bug with pagination with outer joins that was creating SQL errors when no records were returned from the pagination query - [James Gibson]
* Made the "objectName" argument check for the object in the "variables" scope by default instead of unscoped - #365 [John C. Bland II, Per Djurner]
* Fixed so the this.dataSource setting is picked up by Wheels when used - #333 [Chris Peters, Per Djurner]
* Fixed so you can use the built-in validation methods for properties that does not exist in the database table - #362 [Andy Bellenie, Per Djurner]
* Fixed so primary key column is not added to order clause when paginating if it has already been specified with tableName.columnName syntax - [Per Djurner]
* Fixed so pluralization/singularization works with camelCased variable names - [Chris Peters, Per Djurner]
* Added line break to stylesheetLinkTag and javaScriptIncludeTag output - #372 [Tony Petruzzi]
* Fixed bug with select() and selectTag() failing with empty collections as options - #374 [Tony Petruzzi]
* Added missing option "variableName" to validatesFormatOf() options - #337 [Raul Riera, Per Djurner]
* Get disallowed methods from Wheels.cfc instead to allow methods in Controller.cfc to be executed as actions - [Per Djurner]
* Fixed so all callbacks run when the valid() method is called - #303 [Tony Petruzzi]
* Allow private methods to be used as controller filters - #380 [Tony Petruzzi]
* Fixed so the date form helpers can accept a blank string as the default value - #391 [Andy Bellenie]
* Fixed so that the "for" and "id" HTML attributes match when passing an empty string in "tagValue" - #303 [Tony Petruzzi]
* Added the datetime2 data type to the Microsoft SQL Server adapter - #401 [Per Djurner]
* Fixed so queries created in afterFind callbacks can be referenced from view helpers - [James Gibson]
* Fixed so links are properly hyphenated when controller/action is part of the placeholder route values. - [William Fisk, Per Djurner]
* Added "xml" datatype for SQL Server 2005/2008 - #295 [Andy Bellenie, Per Djurner]
* Added the Railo specific cfquery attribute called "psq" to make Wheels run on a default installation of Railo - [Raul Riera, Per Djurner]
* Changed setProperties() to allow any passed in variable to be set on the object - [Per Djurner]
* Changed properties() so that it returns anything in the this scope that is not a function - [Per Djurner]
* Modified so SUM, AVG, MIN, MAX returns blank string and COUNT returns 0 when no records are found - [Tony Petruzzi, Per Djurner]
* Support for "if"/"unless" in validate(), validateOnCreate() and validateOnUpdate() - [Per Djurner]
* Support for built-in CFML types in validatesFormatOf() - [Raul Riera, Per Djurner]
* Added "allowBlank" argument on validatesUniquenessOf() - #271 [Per Djurner]
* Removed a query in findAll that didn't need to run when the join type was set to inner - [Mike Henke, Per Djurner]
* Updated model error functions to take and perform actions with properties and name errors - [Tony Petruzzi]
View Enhancements
=================
* Consistent style and reload links added to debug area - [Per Djurner]
* Trimmed final output's white space - #279 [Chris Peters, Per Djurner]
* Humanized list / array items in $optionsForSelect() - #267 [James Gibson]
Controller Enhancements
=======================
* Rewrite Rules for IIS7 - [Sameer Gupta, Mike Rampton, Per Djurner]
* Rewrite support in sub folders in Apache - [Peter Amiri]
* Turned off rewriting for "robots.txt" file - #278 [Chris Peters, Per Djurner]
Other Enhancements
==================
* Support for setting Application.cfc this scoped variables through config/app.cfm - #315 [Jay McEntire, Per Djurner]
* Allow plugin developer to specify a list of supported Wheels versions instead of just one - [Chris Peters, Per Djurner]
* Methods from plugins can now be injected to "Application.cfc" - #288 [James Gibson, Per Djurner]
Bug Fixes
=========
* Fixed AVG SQL calculation when dealing with integer values - [Tony Petruzzi, Per Djurner]
* Fixed so that CFID and CFTOKEN values do not get obfuscated when passed in the URL - [James Gibson]
* Fixed so javaScriptIncludeTag and styleSheetLinkTag can work with files with multiple dots in them - #312 [Mike Henke, Tony Petruzzi]
* Included calculated properties in the propertyNames(), reload(), updateAll(), deleteAll(), includePartial() and renderPartial() methods - [Per Djurner]
* Allow dynamic methods to be called through callbacks - [James Gibson, Per Djurner]
* Fixed so you can pass in the "properties" argument to dynamic methods (it was overridden previously) - [Per Djurner]
* Allow passing along the original where clause when paginating with a criteria on a joined table - Groups [Don Humphreys, Per Djurner]
* Removed unnecessary singularization for associations - Groups [Don Humphreys, Per Djurner]
* Fixed so validations respect the "allowBlank" setting - Groups [Raul Riera, Per Djurner]
* Corrected execution time report when reloading application - [Tony Petruzzi, Per Djurner]
* Allowing negative values in where clause - Groups [Don Humphreys, Tony Petruzzi]
* Work-around for a Railo mapping bug that was causing slowness - #268 [Tony Petruzzi, Per Djurner]
* Fixed an includePartial() error with caching that occured in production mode - #285 [James Gibson, Per Djurner]
* Support passing in a single column query to select() and selectTag() - #300 [Tony Petruzzi]
* Fixed radio button ids to work properly with negative number values - #274 [Elezotte, Per Djurner]
* Removed display of "rewrite.cfm" in error emails - #280 [Raul Riera, Per Djurner]
* Fix for layout handling in sendEmail() on multipart emails - #269 [Chris Peters, Per Djurner]
* Throw Wheels errors based on the "showErrorInformation" setting instead of production mode - #276 [Tony Petruzzi, Per Djurner]
* Fixed so includePartial() / renderPartial() returns a blank string when passed an empty array instead of an error - #287 [James Gibson, Per Djurner]
* Fixed a problem with file naming and case on Linux / Unix when using helpers and plugins - [Chris Peters, Per Djurner]
* Fixed so pagination aborts early when no records exist in the table instead of causing an error - Groups [Per Djurner, James Gibson]
* Fixed so return type is correct when no records are found on using findOne() with returnAs="object" - [Raul Riera, Per Djurner]
* Fixed Railo bug caused by argument defaults on a number of functions - #201, #264 [William Fisk, Tony Petruzzi, Per Djurner]
* Fixed so you can order on included tables in finders without speciyfing table name - [Per Djurner]
* Fixed so pagination returns an empty query instead of the full record set when specifying a page out of range - [Per Djurner]