Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/FCKeditor.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/FCKeditor.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/FCKeditor.java	(revision 2729)
@@ -48,10 +48,8 @@
 
 	// defaults
-	private String toolbarSet = PropertiesLoader
-			.getProperty("fckeditor.toolbarSet");
-	private String width = PropertiesLoader.getProperty("fckeditor.width");
-	private String height = PropertiesLoader.getProperty("fckeditor.height");
-	private String basePath = PropertiesLoader
-			.getProperty("fckeditor.basePath");
+	private String toolbarSet = PropertiesLoader.getEditorToolbarSet();
+	private String width = PropertiesLoader.getEditorWidth();
+	private String height = PropertiesLoader.getEditorHeight();
+	private String basePath = PropertiesLoader.getEditorBasePath();
 
 	/**
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/connector/Dispatcher.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/connector/Dispatcher.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/connector/Dispatcher.java	(revision 2729)
@@ -109,5 +109,5 @@
 		if (!Command.isValidForGet(context.getCommandStr()))
 			getResponse = GetResponse.getErrorInvalidCommand();
-		else if (!ResourceType.isValid(context.getTypeStr()))
+		else if (!ResourceType.isValidType(context.getTypeStr()))
 			getResponse = GetResponse.getErrorInvalidType();
 		else if (!UtilsFile.isValidPath(context.getCurrentFolderStr()))
@@ -240,5 +240,5 @@
 		else if (!Command.isValidForPost(context.getCommandStr()))
 			uploadResponse = UploadResponse.getErrorInvalidCommand();
-		else if (!ResourceType.isValid(context.getTypeStr()))
+		else if (!ResourceType.isValidType(context.getTypeStr()))
 			uploadResponse = UploadResponse.getErrorInvalidType();
 		else if (!UtilsFile.isValidPath(context.getCurrentFolderStr()))
@@ -260,5 +260,5 @@
 				logger.debug("Parameter NewFile: {}", fileName);
 				// check the extension
-				if (!ExtensionsHandler.isAllowed(type, FilenameUtils
+				if (type.isNotAllowedExtension(FilenameUtils
 						.getExtension(fileName)))
 					uploadResponse = UploadResponse.getErrorInvalidExtension();
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ConnectorHandler.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ConnectorHandler.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ConnectorHandler.java	(revision 2729)
@@ -29,5 +29,6 @@
 /**
  * Handler for Connector-related properties.<br />
- * Wraps to the {@link PropertiesLoader}.
+ * Wraps to the {@link PropertiesLoader}.<br />
+ * <em>Deprecated methods will be removed in 2.5</em>
  * 
  * @version $Id$
@@ -42,5 +43,5 @@
 
 		// try to instantiate the Connector object
-		String className = PropertiesLoader.getProperty("connector.impl");
+		String className = PropertiesLoader.getConnectorImpl();
 		if (Utils.isEmpty(className))
 			logger.error("Empty Connector implementation class name provided");
@@ -63,5 +64,7 @@
 	 * 
 	 * @return UserFilesPath
+	 * @see PropertiesLoader#getUserFilesPath()
 	 */
+	@Deprecated
 	public static String getUserFilesPath() {
 		return PropertiesLoader.getProperty("connector.userFilesPath");
@@ -72,5 +75,7 @@
 	 * 
 	 * @return UserFilesAbsolutePath
+	 * @see PropertiesLoader#getUserFilesAbsolutePath()
 	 */
+	@Deprecated
 	public static String getUserFilesAbsolutePath() {
 		return PropertiesLoader.getProperty("connector.userFilesAbsolutePath");
@@ -81,5 +86,7 @@
 	 * 
 	 * @return ForceSingleExtension
+	 * @see PropertiesLoader#isForceSingleExtension()
 	 */
+	@Deprecated
 	public static boolean isForceSingleExtension() {
 		return Boolean.valueOf(PropertiesLoader
@@ -91,5 +98,7 @@
 	 * 
 	 * @return SecureImageUploads
+	 * @see PropertiesLoader#isSecureImageUploads()
 	 */
+	@Deprecated
 	public static boolean isSecureImageUploads() {
 		return Boolean.valueOf(PropertiesLoader
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ExtensionsHandler.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ExtensionsHandler.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ExtensionsHandler.java	(revision 2729)
@@ -37,7 +37,10 @@
  * versa.
  * </p>
+ * <em>Class will be removed in 2.6.</em>
  * 
  * @version $Id$
+ * @deprecated Functionality merged with {@link ResourceType}.
  */
+@Deprecated
 public class ExtensionsHandler {
 
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/LocalizedMessages.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/LocalizedMessages.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/LocalizedMessages.java	(revision 2729)
@@ -87,6 +87,5 @@
 
 		if (localeResolver == null) {
-			String className = PropertiesLoader
-					.getProperty("localization.localeResolverImpl");
+			String className = PropertiesLoader.getLocaleResolverImpl();
 
 			if (Utils.isEmpty(className))
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/PropertiesLoader.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/PropertiesLoader.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/PropertiesLoader.java	(revision 2729)
@@ -37,7 +37,7 @@
  * <li>Load <code>fckeditor.properties</code> if present.</li>
  * </ol>
- * <em>Attention</em>: Properties specified in
- * <code>fckeditor.properties</code> will override properties loaded from
- * <code>default.properties</code>. (intended behavior)<br />
+ * <em>Attention</em>: Properties specified in <code>fckeditor.properties</code>
+ * will override properties loaded from <code>default.properties</code>.
+ * (intended behavior)<br />
  * <em>Hint</em>: You may set properties programmatically with
  * {@link #setProperty(String, String)} instead or additionally.
@@ -46,5 +46,6 @@
  */
 public class PropertiesLoader {
-	private static final Logger logger = LoggerFactory.getLogger(PropertiesLoader.class);
+	private static final Logger logger = LoggerFactory
+			.getLogger(PropertiesLoader.class);
 	private static Properties properties = new Properties();
 
@@ -94,5 +95,5 @@
 			}
 
-		}		
+		}
 	}
 
@@ -126,7 +127,8 @@
 		properties.setProperty(key, value);
 	}
-	
+
 	/**
 	 * Retrieve the <em>cloned</em> properties.
+	 * 
 	 * @return The properties in the loader
 	 */
@@ -134,3 +136,129 @@
 		return (Properties) properties.clone();
 	}
+
+	public static String getEditorToolbarSet() {
+		return properties.getProperty("fckeditor.toolbarSet");
+	}
+
+	public static String getEditorWidth() {
+		return properties.getProperty("fckeditor.width");
+	}
+
+	public static String getEditorHeight() {
+		return properties.getProperty("fckeditor.height");
+	}
+
+	public static String getEditorBasePath() {
+		return properties.getProperty("fckeditor.basePath");
+	}
+
+	public static String getFileResourceTypePath() {
+		return properties.getProperty("connector.resourceType.file.path");
+	}
+
+	public static String getFlashResourceTypePath() {
+		return properties.getProperty("connector.resourceType.flash.path");
+	}
+
+	public static String getImageResourceTypePath() {
+		return properties.getProperty("connector.resourceType.image.path");
+	}
+
+	public static String getMediaResourceTypePath() {
+		return properties.getProperty("connector.resourceType.media.path");
+	}
+
+	public static String getFileResourceTypeAllowedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.file.extensions.allowed");
+	}
+	
+	public static String getFileResourceTypeDeniedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.file.extensions.denied");
+	}
+	
+	public static String getFlashResourceTypeAllowedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.flash.extensions.allowed");
+	}
+	
+	public static String getFlashResourceTypeDeniedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.flash.extensions.denied");
+	}
+	
+	public static String getImageResourceTypeAllowedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.image.extensions.allowed");
+	}
+	
+	public static String getImageResourceTypeDeniedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.image.extensions.denied");
+	}
+	
+	public static String getMediaResourceTypeAllowedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.media.extensions.allowed");
+	}
+	
+	public static String getMediaResourceTypeDeniedExtensions() {
+		return properties
+				.getProperty("connector.resourceType.media.extensions.denied");
+	}
+	
+	/**
+	 * Getter for <code>connector.userFilesPath</code> property
+	 * 
+	 * @return UserFilesPath
+	 */
+	public static String getUserFilesPath() {
+		return properties.getProperty("connector.userFilesPath");
+	}
+
+	/**
+	 * Getter for <code>connector.userFilesAbsolutePath</code> property
+	 * 
+	 * @return UserFilesAbsolutePath
+	 */
+	public static String getUserFilesAbsolutePath() {
+		return properties.getProperty("connector.userFilesAbsolutePath");
+	}
+
+	/**
+	 * Getter for <code>connector.forceSingleExtension</code> property
+	 * 
+	 * @return ForceSingleExtension
+	 */
+	public static boolean isForceSingleExtension() {
+		return Boolean.valueOf(properties
+				.getProperty("connector.forceSingleExtension"));
+	}
+
+	/**
+	 * Getter for <code>connector.secureImageUploads</code> property
+	 * 
+	 * @return SecureImageUploads
+	 */
+	public static boolean isSecureImageUploads() {
+		return Boolean.valueOf(properties
+				.getProperty("connector.secureImageUploads"));
+	}
+	
+	public static String getConnectorImpl() {
+		return properties.getProperty("connector.impl");
+	}
+	
+	public static String getUserActionImpl() {
+		return properties.getProperty("connector.userActionImpl");
+	}
+	
+	public static String getUserPathsBuilderImpl() {
+		return properties.getProperty("connector.userPathBuilderImpl");
+	}
+	
+	public static String getLocaleResolverImpl() {
+		return properties.getProperty("localization.localeResolverImpl");
+	}
 }
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/RequestCycleHandler.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/RequestCycleHandler.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/RequestCycleHandler.java	(revision 2729)
@@ -47,6 +47,5 @@
 
 		// 1. try to instantiate the UserAction object
-		String className = PropertiesLoader
-				.getProperty("connector.userActionImpl");
+		String className = PropertiesLoader.getUserActionImpl();
 		if (Utils.isEmpty(className))
 			logger.error("Empty UserAction implementation class name provided");
@@ -65,6 +64,5 @@
 
 		// 2. try to instantiate the UserPathBuilder object
-		className = PropertiesLoader
-				.getProperty("connector.userPathBuilderImpl");
+		className = PropertiesLoader.getUserPathsBuilderImpl();
 		if (Utils.isEmpty(className))
 			logger
Index: /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ResourceType.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ResourceType.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/main/java/net/fckeditor/handlers/ResourceType.java	(revision 2729)
@@ -21,24 +21,51 @@
 package net.fckeditor.handlers;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 import net.fckeditor.tool.Utils;
 
 /**
- * Common resource type holder without any implementation (connector) specific stuff.
- *
+ * TODO improve doc Common resource type holder without any implementation
+ * (connector) specific stuff.
+ * 
  * @version $Id$
  */
 public class ResourceType {
+
 	private String name;
 	private String path;
-	private static Map<String, ResourceType> types = new HashMap<String, ResourceType>(4);
-		
-	public static final ResourceType FILE = new ResourceType("file", PropertiesLoader.getProperty("connector.resourceType.file.path"));
-	public static final ResourceType FLASH = new ResourceType("flash", PropertiesLoader.getProperty("connector.resourceType.flash.path"));
-	public static final ResourceType IMAGE = new ResourceType("image", PropertiesLoader.getProperty("connector.resourceType.image.path"));
-	public static final ResourceType MEDIA = new ResourceType("media", PropertiesLoader.getProperty("connector.resourceType.media.path"));
-	
+	private Set<String> allowedEextensions;
+	private Set<String> deniedExtensions;
+
+	private static Map<String, ResourceType> types = new HashMap<String, ResourceType>(
+			4);
+	public static final ResourceType FILE = new ResourceType("file",
+			PropertiesLoader.getFileResourceTypePath(), Utils
+					.getSet(PropertiesLoader
+							.getFileResourceTypeAllowedExtensions()), Utils
+					.getSet(PropertiesLoader
+							.getFileResourceTypeDeniedExtensions()));
+	public static final ResourceType FLASH = new ResourceType("flash",
+			PropertiesLoader.getFlashResourceTypePath(), Utils
+					.getSet(PropertiesLoader
+							.getFlashResourceTypeAllowedExtensions()), Utils
+					.getSet(PropertiesLoader
+							.getFlashResourceTypeDeniedExtensions()));
+	public static final ResourceType IMAGE = new ResourceType("image",
+			PropertiesLoader.getImageResourceTypePath(), Utils
+					.getSet(PropertiesLoader
+							.getImageResourceTypeAllowedExtensions()), Utils
+					.getSet(PropertiesLoader
+							.getImageResourceTypeDeniedExtensions()));
+	public static final ResourceType MEDIA = new ResourceType("media",
+			PropertiesLoader.getMediaResourceTypePath(), Utils
+					.getSet(PropertiesLoader
+							.getMediaResourceTypeAllowedExtensions()), Utils
+					.getSet(PropertiesLoader
+							.getMediaResourceTypeDeniedExtensions()));
+
 	static {
 		types.put(FILE.getName(), FILE);
@@ -47,27 +74,67 @@
 		types.put(MEDIA.getName(), MEDIA);
 	}
-	
-	private ResourceType(final String name, final String path) {
+
+	private ResourceType(final String name, final String path,
+			final Set<String> allowedEextensions,
+			final Set<String> deniedExtensions) {
 		this.name = name;
 		this.path = path;
-	}
-	
+
+		if (allowedEextensions.isEmpty() && deniedExtensions.isEmpty())
+			throw new IllegalArgumentException(
+					"Both sets are empty, one has always to be filled");
+
+		if (!allowedEextensions.isEmpty() && !deniedExtensions.isEmpty())
+			throw new IllegalArgumentException(
+					"Both sets contain extensions, only one can be filled at the same time");
+
+		this.allowedEextensions = allowedEextensions;
+		this.deniedExtensions = deniedExtensions;
+	}
+
+	/**
+	 * 
+	 * @return the name
+	 */
 	public String getName() {
 		return name;
 	}
-	
+
+	/**
+	 * 
+	 * @return the path
+	 */
 	public String getPath() {
 		return path;
 	}
-	
+
+	/**
+	 * This will give you a read-only reference to the allowed extensions set.
+	 * 
+	 * @return the allowedEextensions
+	 */
+	public Set<String> getAllowedEextensions() {
+		return Collections.unmodifiableSet(allowedEextensions);
+	}
+
+	/**
+	 * This will give you a read-only reference to the denied extensions set.
+	 * 
+	 * @return the deniedExtensions
+	 */
+	public Set<String> getDeniedExtensions() {
+		return Collections.unmodifiableSet(deniedExtensions);
+	}
+
 	/**
 	 * Getter for a {@link ResourceType} for a specified string. <br>
 	 * The comparison isn't case sensitive!
 	 * 
-	 * @param name A resource type to retrieve.
-	 * @return A {@link ResourceType} object holding the value
-	 *         represented by the string argument.
+	 * @param name
+	 *            A resource type to retrieve.
+	 * @return A {@link ResourceType} object holding the value represented by
+	 *         the string argument.
 	 * @throws IllegalArgumentException
-	 *            If 'name' is <code>null</code>, empty, or does not exist.
+	 *             If 'name' is <code>null</code>, empty, or does not exist.
 	 */
 	public static ResourceType valueOf(final String name) {
@@ -80,5 +147,5 @@
 		return rt;
 	}
-	
+
 	/**
 	 * Checks if a specified string represents a valid resource type.<br>
@@ -90,6 +157,7 @@
 	 *         <code>false</code>.
 	 */
-	public static boolean isValid(final String name) {
-		return (Utils.isEmpty(name)) ? false : types.containsKey(name.toLowerCase());
+	public static boolean isValidType(final String name) {
+		return (Utils.isEmpty(name)) ? false : types.containsKey(name
+				.toLowerCase());
 	}
 
@@ -101,6 +169,6 @@
 	 * @param name
 	 *            A resource type string to check.
-	 * @return A {@link ResourceType} object holding the value
-	 *         represented by the string argument, or <code>null</code>.
+	 * @return A {@link ResourceType} object holding the value represented by
+	 *         the string argument, or <code>null</code>.
 	 */
 	public static ResourceType getResourceType(final String name) {
@@ -111,8 +179,9 @@
 		}
 	}
-	
+
 	/**
 	 * Tries to determine ResourceType from string and return {@link #FILE} if
-	 * provided string is invalid.<br><br>
+	 * provided string is invalid.<br>
+	 * <br>
 	 * The comparison isn't case sensitive!
 	 * 
@@ -126,10 +195,45 @@
 		return rt == null ? FILE : rt;
 	}
-	
-	/* (non-Javadoc)
+
+	/**
+	 * Checks if an extension is allowed/denied for a file type based on the
+	 * allowed and denied sets.
+	 * 
+	 * @param extension
+	 *            The extension you want to check.
+	 * @return <code>true</code> is extension is allowed else <code>false</code>
+	 *         . <em>Attention</em>: <code>false</code> is always returned if
+	 *         'extension' is empty.
+	 */
+	public boolean isAllowedExtension(final String extension) {
+		if (Utils.isEmpty(extension))
+			return false;
+		String ext = extension.toLowerCase();
+		if (allowedEextensions.isEmpty())
+			return !deniedExtensions.contains(ext);
+		if (deniedExtensions.isEmpty())
+			return allowedEextensions.contains(ext);
+		return false;
+	}
+
+	/**
+	 * This is a stupid negating wrapper around
+	 * {@link #isAllowedExtension(String)}.
+	 * 
+	 * @param extension
+	 * @return <code>true</code> if extension is not allowed else
+	 *         <code>false</code>.
+	 */
+	public boolean isNotAllowedExtension(final String extension) {
+		return !isAllowedExtension(extension);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	@Override
-	public boolean equals(Object obj) {		
+	public boolean equals(Object obj) {
 		if (this == obj)
 			return true;
@@ -141,7 +245,8 @@
 		return name.equals(rt.getName());
 	}
-	
+
 	/*
 	 * (non-Javadoc)
+	 * 
 	 * @see java.lang.Object#hashCode()
 	 */
Index: /FCKeditor.Java/trunk/java-core/src/test/java/net/fckeditor/handlers/ExtensionsHandlerTest.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/test/java/net/fckeditor/handlers/ExtensionsHandlerTest.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/test/java/net/fckeditor/handlers/ExtensionsHandlerTest.java	(revision 2729)
@@ -30,5 +30,8 @@
  *
  * @version $Id$
+ * @see {@link ResourceTypeTest}
+ * @deprecated same reason as in {@link ExtensionsHandler}
  */
+@Deprecated
 public class ExtensionsHandlerTest {
 	
Index: /FCKeditor.Java/trunk/java-core/src/test/java/net/fckeditor/handlers/ResourceTypeTest.java
===================================================================
--- /FCKeditor.Java/trunk/java-core/src/test/java/net/fckeditor/handlers/ResourceTypeTest.java	(revision 2728)
+++ /FCKeditor.Java/trunk/java-core/src/test/java/net/fckeditor/handlers/ResourceTypeTest.java	(revision 2729)
@@ -51,15 +51,15 @@
 	@Test
 	public void isValid01() throws Exception {
-		assertFalse(ResourceType.isValid("1234"));
+		assertFalse(ResourceType.isValidType("1234"));
 	}
 
 	@Test
 	public void isValid02() throws Exception {
-		assertTrue(ResourceType.isValid("fLash"));
+		assertTrue(ResourceType.isValidType("fLash"));
 	}
 
 	@Test
 	public void isValid03() throws Exception {
-		assertTrue(ResourceType.isValid("MeDiA"));
+		assertTrue(ResourceType.isValidType("MeDiA"));
 	}
 
