Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/pom.xml
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/pom.xml	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/pom.xml	(revision 6845)
@@ -0,0 +1,157 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.ckeditor</groupId>
+	<artifactId>ckeditor-java-core</artifactId>
+	<version>3.5.3</version>
+	<name>CKEditor for Java - Core</name>
+	<description>CKEditor Server-Side Integration for Java. This Java library
+	enables CKEditor to be used in a Servlet/J2EE environment. It provides
+	JSP tags for creating a CKEditor instance.
+	</description>
+	<url>http://ckeditor.com</url>
+	<inceptionYear>2003</inceptionYear>
+	<licenses>
+		<license>
+			<name>GNU General Public License Version 2 or later (GPL)</name>
+			<url>http://www.gnu.org/licenses/gpl.html</url>
+		</license>
+		<license>
+			<name>GNU Lesser General Public License Version 2.1 (LGPL)</name>
+			<url>http://www.gnu.org/licenses/lgpl.html</url>
+		</license>
+		<license>
+			<name>Mozilla Public License Version 1.1 or later (MPL)</name>
+			<url>http://www.mozilla.org/MPL/MPL-1.1.html</url>
+		</license>
+	</licenses>
+	<organization>
+		<name>CKSource - Frederico Knabben</name>
+		<url>http://cksource.com</url>
+	</organization>
+	<parent>
+		<groupId>org.sonatype.oss</groupId>
+		<artifactId>oss-parent</artifactId>
+		<version>7</version>
+	</parent>
+	<scm>
+		<url>http://svn.ckeditor.com/CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3</url>
+		<connection>scm:svn:http://svn.ckeditor.com/CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3</connection>
+		<developerConnection>scm:svn:https://svn.ckeditor.com/CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3</developerConnection>
+	</scm>
+	<packaging>jar</packaging>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+					<encoding>utf-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>2.2</version>
+				<configuration>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.7</version>
+				<configuration>
+					<quiet>true</quiet>
+					<show>package</show>
+					<docfilessubdirs>true</docfilessubdirs>
+					<keywords>true</keywords>
+					<detectOfflineLinks>false</detectOfflineLinks>
+					<encoding>UTF-8</encoding>
+				</configuration>
+				<executions>
+					<execution>
+						<id>attach-javadocs</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-source-plugin</artifactId>
+				<version>2.1.2</version>
+				<executions>
+					<execution>
+						<id>attach-sources</id>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.3.1</version>
+				<configuration>
+					<archive>
+						<addMavenDescriptor>false</addMavenDescriptor>
+						<manifestEntries>
+							<Implementation-Title>CKEditor for Java - Core</Implementation-Title>
+							<Implementation-Version>2.0</Implementation-Version>
+							<Implementation-Vendor-Id>com.ckeditor</Implementation-Vendor-Id>
+							<Implementation-URL>http://ckeditor.com</Implementation-URL>
+							<Built-By>CKSource - Frederico Knabben</Built-By>
+						</manifestEntries>
+					</archive>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<profiles>
+		<profile>
+			<id>release-sign-artifacts</id>
+			<activation>
+			<property>
+				<name>performRelease</name>
+				<value>true</value>
+			</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-gpg-plugin</artifactId>
+						<executions>
+							<execution>
+							<id>sign-artifacts</id>
+							<phase>verify</phase>
+							<goals>
+								<goal>sign</goal>
+							</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+	<dependencies>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.4</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet.jsp</groupId>
+			<artifactId>jsp-api</artifactId>
+			<version>2.0</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+</project>
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorConfig.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorConfig.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorConfig.java	(revision 6845)
@@ -0,0 +1,182 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * CKEditor configuration class.
+ */
+public class CKEditorConfig implements Cloneable {
+
+	private Map<String, Object> config;
+	
+	/**
+	 * Default constructor.
+	 */
+	public CKEditorConfig() {
+		config = new HashMap<String, Object>();		
+	}
+	
+	/**
+	 * Adds a Number parameter to the configuration.
+	 * <b>Usage:</b>
+	 * <pre>config.addConfigValue("width", 100);</pre>
+	 * <pre>config.addConfigValue("dialog_backgroundCoverOpacity", 0.7);</pre>
+	 * @param key configuration parameter key
+	 * @param value configuration parameter value.
+	 */
+	public void addConfigValue(final String key, final Number value) {
+		config.put(key, value);
+	}
+	
+	/**
+	 * Adds a String parameter to the configuration.
+	 * <b>Usage:</b>
+	 * <pre>config.addConfigValue("baseHref", "http://www.example.com/path/");</pre>
+	 * <pre>config.addConfigValue("toolbar", "[[ 'Source', '-', 'Bold', 'Italic' ]]");</pre>
+	 * @param key configuration parameter key
+	 * @param value configuration parameter value.
+	 */
+	public void addConfigValue(final String key, final String value) {
+		config.put(key, value);
+	}
+	
+	/**
+	 * Adds a Map parameter to the configuration.
+	 * <b>Usage:</b>
+	 * <pre>Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();</pre>
+	 * <pre>map.put("element", "span");</pre>
+	 * <pre>map.put("styles", "{'background-color' : '#(color)'}");</pre>
+	 * <pre>config.addConfigValue("colorButton_backStyle", map);</pre>
+	 * @param key configuration parameter key
+	 * @param value configuration parameter value.
+	 */
+	public void addConfigValue(final String key, 
+								final Map<String, ? extends Object> value) {
+		config.put(key, value);
+	}
+	
+	/**
+	 * Adds a List parameter to the configuration.
+	 * <b>Usage:</b>
+	 * <pre> 
+		List&lt;List&lt;String&gt;&gt; list = new ArrayList&lt;List&lt;String&gt;&gt;();
+		List&lt;String&gt; subList = new ArrayList&lt;String&gt;();
+		subList.add("Source");
+		subList.add("-");
+		subList.add("Bold");
+		subList.add("Italic");
+		list.add(subList);
+		config.addConfigValue("toolbar", list);
+		</pre>
+	 * @param key configuration parameter key
+	 * @param value configuration parameter value.
+	 */
+	public void addConfigValue(final String key, final List<? extends Object> value) {
+		config.put(key, value);
+	}
+	
+	/**
+	 * Adds a Boolean parameter to the configuration.
+	 * <b>Usage:</b>
+	 * <pre>config.addConfigValue("autoUpdateElement", true);</pre> 
+	 * @param key configuration parameter key
+	 * @param value configuration parameter value.
+	 */
+	public void addConfigValue(final String key, final Boolean value) {
+		config.put(key, value);
+	}
+	
+	
+	/**
+	 * Gets a configuration value by key.
+	 * @param key configuration parameter key
+	 * @return configuration parameter value.
+	 */
+	Object getConfigValue(final String key) {
+		return config.get(key);
+	}
+
+	/**
+	 * @return all configuration values.
+	 */
+	Map<String, Object> getConfigValues() {
+		return config;
+	}
+	
+	/**
+	 * Removes a configuration value by key.
+	 * <b>Usage:</b>
+	 * <pre>config.removeConfigValue("toolbar");</pre>
+	 * @param key configuration parameter key.
+	 */
+	public void removeConfigValue(final String key) {
+		config.remove(key);
+	}
+	
+	/**
+	 * Configure settings. Merge configuration and event handlers.
+	 * @return setting configuration.
+	 * @param eventHandler events
+	 */
+	CKEditorConfig configSettings(final EventHandler eventHandler) {
+		try {
+			CKEditorConfig cfg = (CKEditorConfig) this.clone();
+			if (eventHandler != null) {
+				for (String eventName : eventHandler.events.keySet()) {
+					Set<String> set = eventHandler.events.get(eventName);
+					if (set.isEmpty()) {
+						continue;
+					} else if (set.size() == 1) {
+						Map<String, String> hm = new HashMap<String, String>();
+						for (String code : set) {
+							hm.put(eventName, "@@" + code);	
+						}					
+						cfg.addConfigValue("on", hm);
+					} else {
+						Map<String, String> hm = new HashMap<String, String>();
+						StringBuilder sb = new StringBuilder("@@function (ev){");
+						for (String code : set) {
+							sb.append("(");
+							sb.append(code);
+							sb.append(")(ev);");
+						}
+						sb.append("}");
+						hm.put(eventName, sb.toString());
+						cfg.addConfigValue("on", hm);
+					}
+				}
+			}			
+			return cfg;
+		} catch (CloneNotSupportedException e) {
+			return null;
+		}
+		
+		
+	}
+	
+	/**
+	 * Checks if configuration is empty.
+	 * @return true if the configuration is empty.
+	 */
+	public boolean isEmpty() {
+		return config.isEmpty();
+	}
+	
+	/**
+	 * Override.
+	 */
+	protected Object clone() throws CloneNotSupportedException {
+		CKEditorConfig cfg = (CKEditorConfig) super.clone();
+		cfg.config = new HashMap<String, Object>(this.config);
+		return cfg; 
+	}
+	
+		
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorInsertTag.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorInsertTag.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorInsertTag.java	(revision 6845)
@@ -0,0 +1,150 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+
+/**
+ * <code>&lt;ckeditor:editor&gt;</code> tag code.
+ * 
+ * <b>Usage:</b>
+ * <pre>&lt;ckeditor:editor basePath="/ckeditor/" editor="editor1" /&gt;</pre>
+ */
+public class CKEditorInsertTag extends CKEditorTag {
+
+	private static final long serialVersionUID = 1316780332328233835L;
+
+	private static final String DEFAULT_TEXTAREA_ROWS = "8";
+	private static final String DEFAULT_TEXTAREA_COLS = "60";
+	private static final String[] CHARS_FROM  = {"&", "\"", "<", ">"};
+	private static final String[] CHARS_TO = {"&amp;", "&quot;", "&lt;", "&gt;"};
+
+	private String editor;
+	private String value;
+	private Map<String, String> textareaAttributes;
+	
+
+
+	/**
+	 * Default constructor.
+	 */
+	public CKEditorInsertTag() {
+		textareaAttributes = new HashMap<String, String>();
+		editor = "";
+		value = "";
+	}
+	
+	@Override
+	public int doStartTag() throws JspException {
+		JspWriter out = pageContext.getOut();
+		try {
+			out.write(createTextareaTag());
+		} catch (Exception e) {
+			try {
+				HttpServletResponse resp = (HttpServletResponse) 
+														pageContext.getResponse();
+				resp.reset();
+				resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+								"Problem with tag creation.");
+			} catch (IOException e1) {
+				throw new JspException(e1);
+			}
+		}
+		return EVAL_PAGE;
+	}
+	
+	
+	@Override
+	protected String getTagOutput(final CKEditorConfig config) {
+		if (config != null && !config.isEmpty()) {
+			return "CKEDITOR.replace('" + editor + "', " 
+									+ TagHelper.jsEncode(config) + ");";
+		} else {
+			return "CKEDITOR.replace('" + editor + "');";
+		}
+	}
+
+	/**
+	 * Creates HTML code to insert a textarea element into the page.
+	 * @return textarea code
+	 */
+	private String createTextareaTag() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("<textarea name=\"");
+		sb.append(editor);
+		sb.append("\" ");
+		sb.append(createTextareaAttributesText());
+		sb.append(" >");
+		sb.append(escapeHtml(value));
+		sb.append("</textarea>");
+		sb.append("\n");
+		return sb.toString();
+	}
+
+	/**
+	 * Convert special characters to HTML entities.
+	 * @param text
+	 * @return
+	 */
+	private Object escapeHtml(String text) {
+		String result = text;
+		if (text.equals(""))
+			return "";
+		for (int i = 0; i < CHARS_FROM.length; i++) {
+			result = result.replaceAll(CHARS_FROM[i], CHARS_TO[i]);
+		}
+		return result;
+	}
+
+	/**
+	 * Creates a String object from the textarea attributes map.
+	 * @return textarea attributes String object
+	 */
+	private String createTextareaAttributesText() {
+		if (textareaAttributes.isEmpty()) {
+			textareaAttributes.put("rows", DEFAULT_TEXTAREA_ROWS);
+			textareaAttributes.put("cols", DEFAULT_TEXTAREA_COLS);
+		}
+		StringBuilder sb = new StringBuilder();
+		for (String s : textareaAttributes.keySet()) {
+			sb.append(" ");
+			sb.append(s + "=\"" + textareaAttributes.get(s) + "\"");
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * @param editor the editor to set
+	 */
+	public final void setEditor(final String editor) {
+		this.editor = editor;
+	}
+
+	/**
+	 * @param value the String value to set
+	 */
+	public final void setValue(final String value) {
+		this.value = value;
+	}
+	
+	/**
+	 * @param textareaAttr the textarea attributes to set
+	 */
+	public final void setTextareaAttributes(final Map<String, String> textareaAttr) {
+		this.textareaAttributes = textareaAttr;
+	}
+
+	@Override
+	protected String getCKEditorName() {
+		return this.editor;
+	}	
+
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorReplaceAllTag.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorReplaceAllTag.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorReplaceAllTag.java	(revision 6845)
@@ -0,0 +1,66 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+/**
+ * <code>&lt;ckeditor:replaceAll&gt;</code> tag code.
+ * <b>Usage:</b>
+ * <pre>&lt;ckeditor:replaceAll basePath="/ckeditor/" /&gt;</pre>
+ */
+public class CKEditorReplaceAllTag extends CKEditorTag {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -7331873466295495480L;
+	private String className;
+
+	/**
+	 * Default constructor.
+	 */
+	public CKEditorReplaceAllTag() {
+		this.className = "";
+	}
+	
+	@Override
+	protected String getTagOutput(final CKEditorConfig config) {
+		if (config == null || config.isEmpty()) {
+			if (className == null || "".equals(className)) {
+				return "CKEDITOR.replaceAll();";
+			} else {
+				return "CKEDITOR.replaceAll('" + className + "');";
+			}
+		} else {
+			StringBuilder sb = new StringBuilder(
+					"CKEDITOR.replaceAll( function(textarea, config) {\n");
+			if (className != null && !"".equals(className)) {
+				sb.append("	var classRegex = new RegExp('(?:^| )' + '");
+				sb.append(className);
+				sb.append("' + '(?:$| )');\n");
+				sb.append("	if (!classRegex.test(textarea.className))\n");
+				sb.append("		return false;\n");
+			}
+			sb.append("	CKEDITOR.tools.extend(config, ");
+			sb.append(TagHelper.jsEncode(config));
+			sb.append(", true);} );");
+			return sb.toString();
+		}
+	}
+
+
+	/**
+	 * @param className the class name to set
+	 */
+	public final void setClassName(final String className) {
+		this.className = className;
+	}
+
+	@Override
+	protected String getCKEditorName() {
+		return "";
+	}
+
+	
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorReplaceTag.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorReplaceTag.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorReplaceTag.java	(revision 6845)
@@ -0,0 +1,50 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+
+/**
+ * <code>&lt;ckeditor:replace&gt;</code> tag code.
+ * <b>Usage:</b>
+ * <pre>&lt;ckeditor:replace replace="editor1" basePath="/ckeditor/" /&gt;</pre>
+ */
+public class CKEditorReplaceTag extends CKEditorTag {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1316780332328233835L;
+	private String replace;
+
+	/**
+	 * Default constructor.
+	 */
+	public CKEditorReplaceTag() {
+		replace = "";
+	}
+	
+	@Override
+	protected String getTagOutput(final CKEditorConfig config) {
+		if (config != null && !config.isEmpty()) {
+			return "CKEDITOR.replace('" + replace + "', " 
+									+ TagHelper.jsEncode(config) + ");";
+		} else {
+			return "CKEDITOR.replace('" + replace + "');";
+		}
+	}
+
+	/**
+	 * @param replace the name of the replaced element to set
+	 */
+	public final void setReplace(final String replace) {
+		this.replace = replace;
+	}
+
+	@Override
+	protected String getCKEditorName() {
+		return this.replace;
+	}
+
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorTag.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorTag.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/CKEditorTag.java	(revision 6845)
@@ -0,0 +1,251 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.tagext.TagSupport;
+
+/**
+ * Base class for CKEditor tags.
+ */
+public abstract class CKEditorTag extends TagSupport {
+	
+	private static final String TIMESTAMP = "B37D54V";
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5642419066547779817L;
+	private String basePath;
+	private String timestamp;
+	private boolean initialized;
+	private CKEditorConfig config;
+	private EventHandler events;
+	private GlobalEventHandler globalEvents;
+		
+	/**
+	 * Default constructor.
+	 */
+	public CKEditorTag() {
+		timestamp = "B37D54V";		
+		basePath = "";
+		initialized = false;
+		config = null;
+		events = null;
+	}
+	
+
+	@Override
+	public int doEndTag() throws JspException {
+		JspWriter out = pageContext.getOut();
+		configureContextParams();
+		try {
+			String output = "";
+			if (!initialized && !isInitializedParam()) {
+				out.write(init());
+			}
+			if (globalEvents != null) {
+				output += globalEvents.returnGlobalEvents();
+			}
+			CKEditorConfig cfg = null;
+			if (config != null) {
+				cfg = config.configSettings(this.events);
+			}
+			output += getTagOutput(cfg);
+			out.write(TagHelper.script(output));
+		} catch (Exception e) {
+			try {
+				HttpServletResponse resp = (HttpServletResponse) 
+														pageContext.getResponse();
+				resp.reset();
+				resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
+								"Problem with tag creation.");
+				e.printStackTrace();
+			} catch (IOException e1) {
+				throw new JspException(e1);
+			}
+		}
+		return EVAL_PAGE;
+	}
+
+	/**
+	 * Adds to config params from pageContext. Used in integration with CKFinder.
+	 */
+	private void configureContextParams() {
+		if (pageContext.getAttribute("ckeditor-params") != null) {
+			@SuppressWarnings("unchecked")
+			Map<String, Map<String, String>> map = 
+								(Map<String, Map<String, String>>)
+										pageContext.getAttribute("ckeditor-params");
+			if (map.get(getCKEditorName()) != null) {
+				parseParamsFromContext(map.get(getCKEditorName()));
+			} else if (map.get("*") != null) {
+				parseParamsFromContext(map.get("*"));
+			}
+		}		
+	}
+
+	/**
+	 * Parse params from pageContext attribute.
+	 * @param map attributes map
+	 */
+	private void parseParamsFromContext(final Map<String, String> map) {
+		if (!map.isEmpty() && config == null) {
+			config = new CKEditorConfig();
+		}
+		for (String key : map.keySet()) {
+			config.addConfigValue(key, map.get(key));
+		}
+	}
+
+	/**
+	 * Check if earlier CKEditor's have initialized ckeditor.js.
+	 * @return true if have.
+	 */
+	private boolean isInitializedParam() {
+		if ("initialized".equals(pageContext.getAttribute("ckeditor-initialized"))) {
+			return true; 
+		} else {
+			pageContext.setAttribute("ckeditor-initialized", "initialized");
+			return false;
+		}
+	}
+
+	
+	/**
+	 * Returns standard tag output.
+	 * @param config configuration resolved to a string
+	 * @return tag standard output
+	 */
+	protected abstract String getTagOutput(final CKEditorConfig config);
+	
+	/**
+	 * Initialization method for tags.
+	 * @return include ckfinder.js code with attributes and additional code.
+	 */
+	protected String init() {
+		String out = "";
+		String args = "";
+		String ckeditorPath = getBasePath();
+		if (timestamp != null) {
+			args += "?t=" + timestamp;
+		}
+		if (ckeditorPath.contains("..")) {
+			out += TagHelper.script("window.CKEDITOR_BASEPATH='" +  ckeditorPath  + "';");
+		}
+		out += TagHelper.createCKEditorIncJS(ckeditorPath, args);
+		
+		String extraCode = "";
+		if (timestamp != TIMESTAMP) {
+			extraCode += (extraCode.length() > 0) ? "\n" : ""
+				.concat("CKEDITOR.timestamp = '")
+				.concat(timestamp)
+				.concat("';");
+		}
+		if (extraCode.length() > 0) {
+			out += TagHelper.script(extraCode);
+		}
+		return out;
+	}	
+
+	/**
+	 * Checks if basePath contains "/" at the end and adds it if it does not.	
+	 * @return basePath or basePath with "/" added at the end 
+	*/
+	private String getBasePath() {
+		if (basePath.equals("") || basePath.charAt(basePath.length() - 1) != '/') {
+			return basePath.concat("/");
+		} else {
+			return basePath;
+		}
+	}
+
+	/**
+	 * @param basePath the basePath to set
+	 */
+	public final void setBasePath(final String basePath) {
+		this.basePath = basePath;
+	}
+
+	/**
+	 * @return the timestamp attribute
+	 */
+	public final String getTimestamp() {
+		return timestamp;
+	}
+
+	/**
+	 * @param timestamp the timestamp attribute to set
+	 */
+	public final void setTimestamp(final String timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	/**
+	 * @return the initialized attribute
+	 */
+	public final boolean isInitialized() {
+		return initialized;
+	}
+
+	/**
+	 * @param initialized the initialized attribute to set
+	 */
+	public final void setInitialized(final boolean initialized) {
+		this.initialized = initialized;
+	}
+
+	/**
+	 * @return the globalEvents attribute
+	 */
+	public final GlobalEventHandler getGlobalEvents() {
+		return globalEvents;
+	}
+
+	/**
+	 * @param globalEvents the globalEvents attribute to set
+	 */
+	public final void setGlobalEvents(final GlobalEventHandler globalEvents) {
+		this.globalEvents = globalEvents;
+	}
+
+	/**
+	 * @return the config attribute
+	 */
+	public final CKEditorConfig getConfig() {
+		return config;
+	}
+
+	/**
+	 * @param config the config attribute to set
+	 */
+	public final void setConfig(final CKEditorConfig config) {
+		this.config = config;
+	}
+	
+	/**
+	 * @return the events attribute
+	 */
+	public final EventHandler getEvents() {
+		return events;
+	}
+
+	/**
+	 * @param events the events attribute to set
+	 */
+	public final void setEvents(final EventHandler events) {
+		this.events = events;
+	}
+
+	/**
+	 * gets name of the CKEditor instance. 
+	 * @return name if CKEditor instance.
+	 */
+	protected abstract String getCKEditorName();
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/EventHandler.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/EventHandler.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/EventHandler.java	(revision 6845)
@@ -0,0 +1,67 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * CKEditor event handler class.
+ * <b>Usage:</b>
+ * <pre>
+  		EventHandler eventHandler = new EventHandler();
+		eventHandler.addEventHandler("instanceReady","function (ev) {
+			alert(\"Loaded: \" + ev.editor.name); }");
+  </pre>
+ */
+public class EventHandler {
+
+	protected Map<String, Set<String>> events;
+	
+	/**
+	 * Default constructor.
+	 */
+	public EventHandler() {
+		events = new HashMap<String, Set<String>>();
+	}
+	
+	/**
+	 * Adds an event listener.
+	 * @param event Event name
+	 * @param jsCode JavaScript anonymous function or a function name
+	 */
+	public void addEventHandler(final String event, final String jsCode) {
+		if (events.get(event) == null) {
+			events.put(event, new LinkedHashSet<String>());
+		}
+		events.get(event).add(jsCode);
+	}
+	
+	/**
+	 * Clears registered event handlers.
+	 * @param event Event name. If null, all event handlers will be removed (optional).
+	 */
+	public void clearEventHandlers(final String event) {
+		if (event == null) {
+			events = new HashMap<String, Set<String>>();
+		} else {
+			if (events.get(event) != null) {
+				events.get(event).clear();
+			}
+		}
+	}
+	
+	/**
+	 * Gets all registered events.
+	 * @return all registered events
+	 */
+	public Map<String, Set<String>> getEvents() {
+		return events;
+	}
+	
+}
+
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/GlobalEventHandler.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/GlobalEventHandler.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/GlobalEventHandler.java	(revision 6845)
@@ -0,0 +1,49 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * CKEditor global events class.
+ * <b>Usage:</b>
+ * <pre>
+ 	GlobalEventHandler globalEventHandler = new GlobalEventHandler();
+	globalEventHandler.addEventHandler("dialogDefinition","function (ev) {
+							alert(\"Loading dialog window: \" + ev.data.name); }");
+	</pre>
+ */
+public class GlobalEventHandler extends EventHandler {
+
+	
+	private static Map<String, Set<String>> returndEvents;
+	
+	/**
+	 * Resolves global events to a String.
+	 * @return global events resolved to a String
+	 */
+	String returnGlobalEvents() {
+		String out = "";
+		if (returndEvents == null) {
+			returndEvents = new HashMap<String, Set<String>>();
+		}
+		for (String event : events.keySet()) {
+			for (String code : events.get(event)) {
+				if (returndEvents.get(event) == null) {
+					returndEvents.put(event, new LinkedHashSet<String>());
+				}
+				out += (!code.equals("") ? "\n" : "") 
+							+ "CKEDITOR.on('" + event + "', " + code + ");";
+				returndEvents.get(event).add(code);
+				
+			}
+		}
+		return out;
+	}
+	
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/TagHelper.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/TagHelper.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/TagHelper.java	(revision 6845)
@@ -0,0 +1,187 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+package com.ckeditor;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * Helper class for CKEditor tags.
+ */
+public class TagHelper {
+	
+	private static final String[] CHARS_FROM 
+					= {"\\", "/", "\n", "\t", "\r", "\b", "\f", "\""};
+	private static final String[] CHARS_TO 
+					= {"\\\\", "\\/", "\\\n", "\\\t", "\\\r", "\\\b", "\\\f", "\\\""};
+	
+	/**
+	 * Wraps a String with a JavaScript tag.
+	 * @param input input String
+	 * @return input wrapped with a JavaScript tag
+	 */
+	public static String script(final String input) {
+		String out = "<script type=\"text/javascript\">";
+		out += "//<![CDATA[\n";
+		out += input;
+		out += "\n//]]>";
+		out += "</script>\n";		
+		return out;
+	}
+	
+	/**
+	 * Creates JavaScript code for including ckeditor.js.
+	 * @param basePath CKEditor base path
+	 * @param args script arguments
+	 * @return JavaScript code
+	 */
+	public static String createCKEditorIncJS(final String basePath, final String args) {
+		return "<script type=\"text/javascript\" src=\"" 
+				+ basePath + "ckeditor.js" + args + "\"></script>\n";
+	}
+
+	/**
+	 * Provides basic JSON support.
+	 * @param o object to encode
+	 * @return encoded configuration object value
+	 */
+	@SuppressWarnings("unchecked")
+	public static String jsEncode(final Object o) {
+		if (o == null) {
+			return "null";
+		}
+		if (o instanceof String) {
+			return jsEncode((String) o);
+		}
+		if (o instanceof Number) {
+			return jsEncode((Number) o);
+		}
+		if (o instanceof Boolean) {
+			return jsEncode((Boolean) o);
+		}
+		if (o instanceof Map) {
+			return jsEncode((Map<String, Object>) o);
+		}
+		if (o instanceof List) {
+			return jsEncode((List<Object>) o);
+		}
+		if (o instanceof CKEditorConfig) {
+			return jsEncode((CKEditorConfig) o);
+		}			
+		return "";
+	}
+	
+	/**
+	 * Provides basic JSON support for String objects.
+	 * @param s String object to encode
+	 * @return encoded configuration String object value
+	 */
+	public static String jsEncode(final String s) {
+		if (s.indexOf("@@") == 0) {
+			return s.substring(2);	
+		}
+		if (s.length() > 9
+				&& s.substring(0, 9).toUpperCase().equals("CKEDITOR.")) {
+			return s;
+		}			
+		return clearString(s);
+	}
+	
+	/**
+	 * Provides basic JSON support for Number objects.
+	 * @param n Number object to encode
+	 * @return encoded Number object value
+	 */
+	public static String jsEncode(final Number n) {
+		return n.toString().replace(",", ".");
+	}
+	
+	/**
+	 * Provides basic JSON support for Boolean objects.
+	 * @param b Boolean object to encode
+	 * @return encoded Boolean object value
+	 */
+	public static String jsEncode(final Boolean b) {
+		return b.toString();	
+	}
+	
+	/**
+	 * Provides basic JSON support for Map objects.
+	 * @param map Map object to encode
+	 * @return encoded Map object value
+	 */
+	public static String jsEncode(final Map<String, Object> map) {
+		StringBuilder sb = new StringBuilder("{");
+		
+		for (Object obj : map.keySet()) {
+			if (sb.length() > 1) {
+				sb.append(",");
+			}
+			sb.append(jsEncode(obj));
+			sb.append(":");				
+			sb.append(jsEncode(map.get(obj)));
+		}
+		sb.append("}");
+		return sb.toString();
+	}
+	
+	/**
+	 * Provides basic JSON support for List objects.
+	 * @param list List object to encode
+	 * @return encoded List object value
+	 */
+	public static String jsEncode(final List<Object> list) {
+		StringBuilder sb = new StringBuilder("[");
+		for (Object obj : list) {
+			if (sb.length() > 1) {
+				sb.append(",");
+			}
+			sb.append(jsEncode(obj));
+		}
+		sb.append("]");
+		return sb.toString();
+	}
+	
+	/**
+	 * Provides basic JSON support for the configuration object.
+	 * @param config configuration object to encode
+	 * @return encoded configuration object value
+	 */
+	public static String jsEncode(final CKEditorConfig config) {
+		StringBuilder sb = new StringBuilder("{");
+		
+		for (Object obj : config.getConfigValues().keySet()) {
+			if (sb.length() > 1) {
+				sb.append(",");
+			}
+			sb.append(jsEncode(obj));
+			sb.append(":");				
+			sb.append(jsEncode((config.getConfigValue((String) obj))));
+		}
+		sb.append("}");
+		return sb.toString();
+	}
+	
+	/**
+	 * Clears a String from special characters and quotes it.
+	 * @param s input String
+	 * @return cleared String
+	 */
+	private static String clearString(final String s) {
+		String string = s;
+		for (int i = 0; i < CHARS_FROM.length; i++) {
+			string = string.replace(CHARS_FROM[i], CHARS_TO[i]);
+		}
+		if (Pattern.compile("[\\[{].*[\\]}]").matcher(string).matches()) {
+			 return string;
+		} else {
+			return "\"" + string + "\"";	
+		}
+		
+	}
+
+	
+}
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/package-info.java
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/package-info.java	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/java/com/ckeditor/package-info.java	(revision 6845)
@@ -0,0 +1,8 @@
+/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see http://ckeditor.com/license
+*/
+/**
+ * CKEditor for Java - the server side integration for CKEditor.
+ */
+package com.ckeditor;
Index: /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/resources/META-INF/ckeditor.tld
===================================================================
--- /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/resources/META-INF/ckeditor.tld	(revision 6845)
+++ /CKEditor.Java/ckeditor-java-core/tags/ckeditor-java-core-3.5.3/src/main/resources/META-INF/ckeditor.tld	(revision 6845)
@@ -0,0 +1,276 @@
+<!DOCTYPE taglib
+  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+
+<!-- a tab library descriptor -->
+<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
+	http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
+	version="2.0">
+	<tlib-version>3.5.3</tlib-version>
+	<display-name>CKEditor for Java Tag Library</display-name>
+	<jsp-version>1.2</jsp-version>
+	<short-name>ckeditor</short-name>
+	<uri>http://ckeditor.com</uri>
+
+	<description>
+		The CKEditor Tag Library offers a convenient way to create
+		several CKEditor instances with different configurations.
+		Additionally, you can check for user-based capabilities.
+	</description>
+
+	<tag>
+		<display-name>replace</display-name>
+		<name>replace</name>
+		<tag-class>com.ckeditor.CKEditorReplaceTag</tag-class>
+		<body-content>JSP</body-content>
+		<example><![CDATA[
+			<ckeditor:replace replace="editor1" basePath="ckeditor/" />]]></example>
+
+		<attribute>
+			<name>basePath</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>Path to the CKEditor directory.</description>
+		</attribute>
+
+		<attribute>
+			<name>replace</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>Name of the HTML textarea element to replace.</description>
+		</attribute>
+
+		<attribute>
+			<name>timestamp</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+
+		<attribute>
+			<name>initialized</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>boolean</type>
+			<description>Initalization of ckeditor.js. If set to "false", ckeditor.js is
+			included on the page.</description>
+		</attribute>
+
+		<attribute>
+			<name>config</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.CKEditorConfig</type>
+			<description>
+				CKEditor configuration. Example:
+				<![CDATA[
+				CKEditorConfig config2 = new CKEditorConfig();
+				config2.addConfigValue("toolbar","[[ 'Source', '-', 'Bold', 'Italic' ]]");
+				]]>				
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>events</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.EventHandler</type>
+			<description>CKEditor events. Example:
+				<![CDATA[
+				EventHandler eventHandler = new EventHandler();
+				eventHandler.addEventHandler("instanceReady","function (ev) {
+						          alert(\"Loaded: \" + ev.editor.name); }");
+				]]>
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>globalEvents</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.GlobalEventHandler</type>
+			<description>CKEditor global events. Example:
+				<![CDATA[GlobalEventHandler globalEventHandler = new GlobalEventHandler();
+				globalEventHandler.addEventHandler("dialogDefinition","function (ev) {  alert(\"Loading dialog window: \" + ev.data.name); }");
+				]]>
+			</description>
+		</attribute>
+
+	</tag>
+
+	<tag>
+		<display-name>editor</display-name>
+		<name>editor</name>
+		<tag-class>com.ckeditor.CKEditorInsertTag</tag-class>
+		<body-content>JSP</body-content>
+		<example><![CDATA[
+			<ckeditor:editor basePath="../../ckeditor/" editor="editor1" value="This is CKEditor." />]]></example>
+
+		<attribute>
+			<name>basePath</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>Path to the CKEditor directory.</description>
+		</attribute>
+
+		<attribute>
+			<name>editor</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>Name of the textarea element inserted and replaced with CKEditor.</description>
+		</attribute>
+
+		<attribute>
+			<name>value</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>Default CKEditor text value.</description>
+		</attribute>
+		
+		<attribute>
+			<name>textareaAttributes</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>java.util.Map</type>
+			<description>Attributes of the textarea element to insert. Example:
+				
+				<![CDATA[Map<String, String> attr = new HashMap<String, String>();
+				attr.put("rows", "8");
+				attr.put("cols", "50");]]>			
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>timestamp</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+
+		<attribute>
+			<name>initialized</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>boolean</type>
+			<description>Initalization of ckeditor.js. If set to "false", ckeditor.js is
+			included on the page.</description>
+		</attribute>
+
+		<attribute>
+			<name>config</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.CKEditorConfig</type>
+			<description>
+				CKEditor configuration. Example:
+				<![CDATA[
+				CKEditorConfig config2 = new CKEditorConfig();
+				config2.addConfigValue("toolbar","[[ 'Source', '-', 'Bold', 'Italic' ]]");
+				]]>				
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>events</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.EventHandler</type>
+			<description>CKEditor events. Example:
+				<![CDATA[
+				EventHandler eventHandler = new EventHandler();
+				eventHandler.addEventHandler("instanceReady","function (ev) {
+						          alert(\"Loaded: \" + ev.editor.name); }");
+				]]>
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>globalEvents</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.GlobalEventHandler</type>
+			<description>CKEditor global events. Example:
+				<![CDATA[GlobalEventHandler globalEventHandler = new GlobalEventHandler();
+				globalEventHandler.addEventHandler("dialogDefinition","function (ev) {  alert(\"Loading dialog window: \" + ev.data.name); }");
+				]]>
+			</description>
+		</attribute>
+	</tag>
+	
+	<tag>
+		<display-name>replaceAll</display-name>
+		<name>replaceAll</name>
+		<tag-class>com.ckeditor.CKEditorReplaceAllTag</tag-class>
+		<body-content>JSP</body-content>
+
+		<attribute>
+			<name>basePath</name>
+			<required>true</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>Path to the CKEditor directory.</description>
+		</attribute>
+
+		<attribute>
+			<name>className</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<description>CSS class name for the textarea elements to be replaced.</description>
+		</attribute>
+
+		<attribute>
+			<name>timestamp</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+		</attribute>
+
+		<attribute>
+			<name>initialized</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>boolean</type>
+			<description>Initalization of ckeditor.js. If set to "false", ckeditor.js is
+			included on the page.</description>
+		</attribute>
+
+		<attribute>
+			<name>config</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.CKEditorConfig</type>
+			<description>
+				CKEditor configuration. Example:
+				<![CDATA[
+				CKEditorConfig config2 = new CKEditorConfig();
+				config2.addConfigValue("toolbar","[[ 'Source', '-', 'Bold', 'Italic' ]]");
+				]]>				
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>events</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.EventHandler</type>
+			<description>CKEditor events. Example:
+				<![CDATA[
+				EventHandler eventHandler = new EventHandler();
+				eventHandler.addEventHandler("instanceReady","function (ev) {
+						          alert(\"Loaded: \" + ev.editor.name); }");
+				]]>
+			</description>
+		</attribute>
+
+		<attribute>
+			<name>globalEvents</name>
+			<required>false</required>
+			<rtexprvalue>true</rtexprvalue>
+			<type>com.ckeditor.GlobalEventHandler</type>
+			<description>CKEditor global events. Example:
+				<![CDATA[GlobalEventHandler globalEventHandler = new GlobalEventHandler();
+				globalEventHandler.addEventHandler("dialogDefinition","function (ev) {  alert(\"Loading dialog window: \" + ev.data.name); }");
+				]]>
+			</description>
+		</attribute>
+
+	</tag>
+</taglib>
