 +
 +    @Override
 +    public void setValue(Object value) {
-+        this.property.setValue(this.converter.convertToModel(this.type.cast(value), this.locale));
++        this.property.setValue(this.converter.convertToModel(this.getType().cast(value), this.locale));
 +    }
 +
 +    @Override

+    /**
+     * Primary constructor.
+     *
+     * @param type this property type
+     * @param property underlying property
+     * @param converter converts this property's values from/to the underlying property's values
+     * @param locale the {@link Locale} to provide to {@code converter}, or null for none
+     * @throws IllegalArgumentException if {@code type}, {@code property}, or {@code converter} is null
+     */
+    public ConvertedProperty(Class<? extends P> type, Property<M> property, Converter<P, M> converter, Locale locale) {
+        if (type == null)
+            throw new IllegalArgumentException("null type");
+        if (property == null)
+            throw new IllegalArgumentException("null property");
+        if (converter == null)
+            throw new IllegalArgumentException("null converter");
+        this.type = type;
+        this.property = property;
+        this.converter = converter;
+        this.locale = locale;

+     * <p>
+     * Equivalent to:
+     *  <blockquote><code>
+     *  ConvertedProperty(property, converter, null)
+     *  </code></blockquote>
+     */
+    public ConvertedProperty(Property<M> property, Converter<P, M> converter) {
+        this(property, converter, null);
+    }
+
+    @Override
+    public Class<? extends P> getType() {
+        return this.converter.getPresentationType();
+    }
+
+    @Override
