---
layout: post
title: Apache Wicket 6.1.0 released
excerpt: true
---

The Apache Wicket PMC is proud to announce Apache Wicket 6.1.0!

This release marks the first maintenance release of Wicket 6. Starting with Wicket 6 we use semantic versioning for the future development of Wicket, and as such no API breaks are present in this release compared to 6.0.0.

### New and noteworthy

Wicket CDI has been integrated as a core module, and can be used to manage conversations in your Wicket application with ease.

Wicket Experimental:

 * Wicket Bootstrap has been upgraded to 2.1.1
 * Several issues with Wicket Atmosphere have been resolved

### Known issues

This release has two known issues, which will be solved shortly in 6.1.1 and 6.2.0:

 * [WICKET-4789](https://issues.apache.org/jira/browse/WICKET-4789)
   The way URLs are encoded was changed (WICKET-4645) and now the first 
   request (with ;jsessionid in path) generates invalid internal links.
 * [WICKET-4759](https://issues.apache.org/jira/browse/WICKET-4759)
   FilterForm/FilterToolbar don't work when there's more than one IColumn to 
   be filtered

Any other issues will be released in 6.2.0

### Using this release

With Apache Maven update your dependency to (and don't forget to update any other dependencies on Wicket projects to the same version):

{% highlight xml %}
<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>6.1.0</version>
</dependency>
{% endhighlight %}

Or download and build the distribution yourself, or use our convenience binary package:

 * Source: [6.1.0 source download](http://www.apache.org/dyn/closer.cgi/wicket/6.1.0)
 * Binary: [6.1.0 binary download](http://www.apache.org/dyn/closer.cgi/wicket/6.1.0/binaries)

### Upgrading from earlier versions
 
If you upgrade from 6.0.0, this release is a drop in replacement. If you come from a version prior to 6.0.0, please read our [Wicket 6 migration guide](http://s.apache.org/wicket-6.0-migration) found at http://s.apache.org/wicket-6.0-migration

Have fun!

— The Wicket team
 
### Release Notes - Wicket - Version 6.1.0

#### Squashed bugs

 * [WICKET-4645](https://issues.apache.org/jira/browse/WICKET-4645) - encodeURL broken on Tomcat 7.0.28
 * [WICKET-4656](https://issues.apache.org/jira/browse/WICKET-4656) - Atmosphere example doesn&#x27;t work due to missing &#x27;page&#x27; when creating AjaxRequestTarget
 * [WICKET-4729](https://issues.apache.org/jira/browse/WICKET-4729) - atmosphere example will stop working if opening the same url in a different tab in the same browser
 * [WICKET-4732](https://issues.apache.org/jira/browse/WICKET-4732) - CssPackageResource doesn&#x27;t work if the extension isn&#x27;t css
 * [WICKET-4734](https://issues.apache.org/jira/browse/WICKET-4734) - Button value is double escaped
 * [WICKET-4735](https://issues.apache.org/jira/browse/WICKET-4735) - KittenCaptchaPanel is broken
 * [WICKET-4737](https://issues.apache.org/jira/browse/WICKET-4737) - IllegalStateException on WicketFilter.init() after calling setFilterPath()
 * [WICKET-4738](https://issues.apache.org/jira/browse/WICKET-4738) - DownloadLink doesn&#x27;t wrap the String model used for file name nor does it detach
 * [WICKET-4741](https://issues.apache.org/jira/browse/WICKET-4741) - Only complete handler (no success or failure handler) is called when Ajax link produces an exception
 * [WICKET-4742](https://issues.apache.org/jira/browse/WICKET-4742) - Wicket 6 and Atmospher Integration:  AtmosphereServlet does not delegate WicketFilter for Error Pages .
 * [WICKET-4743](https://issues.apache.org/jira/browse/WICKET-4743) - SerializingObjectSizeOfStrategy do not use framework serializer
 * [WICKET-4749](https://issues.apache.org/jira/browse/WICKET-4749) - TabbedPanel - IModel&lt;?&gt; initModel()
 * [WICKET-4750](https://issues.apache.org/jira/browse/WICKET-4750) - AbstractDefaultAjaxBehavior.getCallbackFunction should not add the event attribute
 * [WICKET-4751](https://issues.apache.org/jira/browse/WICKET-4751) - UploadProgressBar regression
 * [WICKET-4753](https://issues.apache.org/jira/browse/WICKET-4753) - Resource bundles are not resolved on PriorityHeaderItems
 * [WICKET-4755](https://issues.apache.org/jira/browse/WICKET-4755) - &quot;&#x27;NEW VALUE&#x27; is not a valid Serializable&quot; error during ajax form submission
 * [WICKET-4757](https://issues.apache.org/jira/browse/WICKET-4757) - FormComponents remain invalid forever if there is no feedback panel
 * [WICKET-4758](https://issues.apache.org/jira/browse/WICKET-4758) - DOM ids change of the input fields of FilterToolbar
 * [WICKET-4760](https://issues.apache.org/jira/browse/WICKET-4760) - JavaScriptStripper fails with single line comments
 * [WICKET-4761](https://issues.apache.org/jira/browse/WICKET-4761) - ModalWindow.closeCurrent Javascript error
 * [WICKET-4763](https://issues.apache.org/jira/browse/WICKET-4763) - Page&#x27;s stateless hint is initially set to &#x27;false&#x27;
 * [WICKET-4766](https://issues.apache.org/jira/browse/WICKET-4766) - multiple &amp;lt;style&amp;gt; tags in header are rendered incorrectly
 * [WICKET-4768](https://issues.apache.org/jira/browse/WICKET-4768) - Whitespace in TabbedPanel markup causes layout issues
 * [WICKET-4770](https://issues.apache.org/jira/browse/WICKET-4770) - Wicket 6: modal windows in Safari are always in drag or resize mode
 * [WICKET-4773](https://issues.apache.org/jira/browse/WICKET-4773) - ComponentFeedbackPanel broken under Wicket 6.0.0 when RenderStrategy.REDIRECT_TO_RENDER
 * [WICKET-4775](https://issues.apache.org/jira/browse/WICKET-4775) - PageParameters#mergeWith may loose values of the &#x27;other&#x27; PP
 * [WICKET-4780](https://issues.apache.org/jira/browse/WICKET-4780) - Using both MountedMapper and CryptoMapper causes warning

#### Improvement

 * [WICKET-4730](https://issues.apache.org/jira/browse/WICKET-4730) - Filter component does not clear filter fields
 * [WICKET-4731](https://issues.apache.org/jira/browse/WICKET-4731) - TimeField not able to work with a java.sql.Time
 * [WICKET-4736](https://issues.apache.org/jira/browse/WICKET-4736) - JavaScriptFilteredIntoFooterHeaderResponse should reverse filter logic
 * [WICKET-4745](https://issues.apache.org/jira/browse/WICKET-4745) - Allow to set initial state of DebugBar to expanded / collapsed
 * [WICKET-4746](https://issues.apache.org/jira/browse/WICKET-4746) - Wizard component translation for pt_BR
 * [WICKET-4748](https://issues.apache.org/jira/browse/WICKET-4748) - Improve WicketTester to be able to find AjaxBehaviors on second/third/... event name

#### New Feature

 * [WICKET-3969](https://issues.apache.org/jira/browse/WICKET-3969) - Add CDI integration

#### Task

 * [WICKET-4781](https://issues.apache.org/jira/browse/WICKET-4781) - Downgrade the warning that a rendering falls back to redirect_to_buffer to a DEBUG
 