*fixes
diff --git a/core/plugins/org.eclipse.dltk.core/compiler/org/eclipse/dltk/compiler/task/TodoTaskSimpleParser.java b/core/plugins/org.eclipse.dltk.core/compiler/org/eclipse/dltk/compiler/task/TodoTaskSimpleParser.java
index 4c1a414..745d465 100644
--- a/core/plugins/org.eclipse.dltk.core/compiler/org/eclipse/dltk/compiler/task/TodoTaskSimpleParser.java
+++ b/core/plugins/org.eclipse.dltk.core/compiler/org/eclipse/dltk/compiler/task/TodoTaskSimpleParser.java
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
+ *     xored software, Inc. - Fixed bug for end of file less whan 4 symbol comments (Andrei Sobolev)
  *******************************************************************************/
 package org.eclipse.dltk.compiler.task;
 
@@ -100,16 +101,19 @@
 	private void processLine(char[] content, int begin, final int end) {
 		for (int i = 0; i < tags.length; ++i) {
 			final char[] tag = tags[i];
-			char ch = content[begin + tag.length];
-			if (begin + tag.length < end && isEnd(ch)
-					|| begin + tag.length == end) {
-				if (compareTag(content, begin, tag)) {
-					final String msg = new String(content, begin, end - begin);
-					try {
-						taskReporter.reportTask(msg, lineNumber, priorities[i],
-								begin, contentPos);
-					} catch (CoreException e) {
-						DLTKCore.error("Error in reportTask()", e);
+			if (begin + tag.length < content.length) {
+				char ch = content[begin + tag.length];
+				if (begin + tag.length < end && isEnd(ch)
+						|| begin + tag.length == end) {
+					if (compareTag(content, begin, tag)) {
+						final String msg = new String(content, begin, end
+								- begin);
+						try {
+							taskReporter.reportTask(msg, lineNumber,
+									priorities[i], begin, contentPos);
+						} catch (CoreException e) {
+							DLTKCore.error("Error in reportTask()", e);
+						}
 					}
 				}
 			}
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/DLTKContentTypeManager.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/DLTKContentTypeManager.java
index 211a201..384816a 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/DLTKContentTypeManager.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/DLTKContentTypeManager.java
@@ -106,6 +106,9 @@
 		// I've disable file content checking for non local environments.
 		IEnvironment environment = EnvironmentManager.getEnvironment(resource
 				.getProject());
+		if (environment == null) {
+			return false;
+		}
 		if (!EnvironmentManager.isLocal(environment)) {
 			return false;
 		}
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/SourceParserUtil.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/SourceParserUtil.java
index 0eee63c..038e647 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/SourceParserUtil.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/core/SourceParserUtil.java
@@ -12,13 +12,20 @@
 	private static final Object AST = "ast"; //$NON-NLS-1$
 	private static final Object FLAGS = "flags"; //$NON-NLS-1$
 
-	/**
-	 * Used to retrive module declaration from source module.
-	 */
+	public static interface IContentAction {
+		void run(ISourceModule module, char[] content);
+	}
+
 	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
 			IProblemReporter reporter) {
 		return getModuleDeclaration(module, reporter,
-				ISourceParserConstants.DEFAULT);
+				ISourceParserConstants.DEFAULT, null);
+	}
+
+	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
+			IProblemReporter reporter, IContentAction action) {
+		return getModuleDeclaration(module, reporter,
+				ISourceParserConstants.DEFAULT, action);
 	}
 
 	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
@@ -26,21 +33,35 @@
 		ISourceModuleInfoCache sourceModuleInfoCache = ModelManager
 				.getModelManager().getSourceModuleInfoCache();
 		ISourceModuleInfo sourceModuleInfo = sourceModuleInfoCache.get(module);
-		return getModuleDeclaration(module, reporter, sourceModuleInfo, flags);
+		return getModuleDeclaration(module, reporter, sourceModuleInfo, flags,
+				null);
 	}
 
-	/**
-	 * Used to retrive module declaration from source module.
-	 */
+	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
+			IProblemReporter reporter, int flags, IContentAction action) {
+		ISourceModuleInfoCache sourceModuleInfoCache = ModelManager
+				.getModelManager().getSourceModuleInfoCache();
+		ISourceModuleInfo sourceModuleInfo = sourceModuleInfoCache.get(module);
+		return getModuleDeclaration(module, reporter, sourceModuleInfo, flags,
+				action);
+	}
 
 	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
 			IProblemReporter reporter, ISourceModuleInfo mifo) {
 		return getModuleDeclaration(module, reporter, mifo,
-				ISourceParserConstants.DEFAULT);
+				ISourceParserConstants.DEFAULT, null);
 	}
 
 	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
-			IProblemReporter reporter, ISourceModuleInfo mifo, int flags) {
+			IProblemReporter reporter, ISourceModuleInfo mifo,
+			IContentAction action) {
+		return getModuleDeclaration(module, reporter, mifo,
+				ISourceParserConstants.DEFAULT, action);
+	}
+
+	public static ModuleDeclaration getModuleDeclaration(ISourceModule module,
+			IProblemReporter reporter, ISourceModuleInfo mifo, int flags,
+			IContentAction action) {
 
 		IDLTKLanguageToolkit toolkit;
 		toolkit = DLTKLanguageManager.getLanguageToolkit(module);
@@ -65,9 +86,13 @@
 					((ISourceParserExtension) sourceParser).setFlags(flags);
 				}
 				try {
+					char[] sourceAsCharArray = module.getSourceAsCharArray();
 					moduleDeclaration = sourceParser.parse(module.getPath()
-							.toString().toCharArray(), module
-							.getSourceAsCharArray(), reporter);
+							.toString().toCharArray(), sourceAsCharArray,
+							reporter);
+					if (action != null) {
+						action.run(module, sourceAsCharArray);
+					}
 				} catch (ModelException e) {
 					if (DLTKCore.DEBUG) {
 						e.printStackTrace();
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/util/Util.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/util/Util.java
index 95b9e7b..86b5674 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/util/Util.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/util/Util.java
@@ -341,7 +341,7 @@
 	 * Finds the first line separator used by the given text.
 	 * 
 	 * @return </code>"\n"</code> or </code>"\r"</code> or </code>"\r\n"</code>,
-	 *         or <code>null</code> if none found
+	 * 	or <code>null</code> if none found
 	 */
 	public static String findLineSeparator(char[] text) {
 		// find the first line separator
@@ -432,6 +432,7 @@
 						"Error receiving file content: retrying("
 								+ String.valueOf(tryCount) + ")", e);
 				DLTKCore.getDefault().getLog().log(status);
+
 				// Some times for RSE we can get here if connection is not
 				// established yet, or if connection are lost.
 				if (tryCount == 0) {
@@ -534,7 +535,6 @@
 	 * Returns whether the given resource path matches one of the
 	 * inclusion/exclusion patterns. NOTE: should not be asked directly using
 	 * pkg root pathes
-	 * 
 	 */
 	public final static boolean isExcluded(IPath resourcePath,
 			char[][] inclusionPatterns, char[][] exclusionPatterns,
@@ -880,9 +880,9 @@
 	 * Unicode value of each character in the strings.
 	 * 
 	 * @return the value <code>0</code> if the str1 is equal to str2; a value
-	 *         less than <code>0</code> if str1 is lexicographically less than
-	 *         str2; and a value greater than <code>0</code> if str1 is
-	 *         lexicographically greater than str2.
+	 * 	less than <code>0</code> if str1 is lexicographically less than str2;
+	 * 	and a value greater than <code>0</code> if str1 is lexicographically
+	 * 	greater than str2.
 	 */
 	public static int compare(char[] str1, char[] str2) {
 		int len1 = str1.length;
@@ -917,7 +917,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       divider = 'b'
+	 * divider = 'b'
 	 *       string = &quot;abbaba&quot;
 	 *       start = 2
 	 *       end = 5
@@ -928,18 +928,17 @@
 	 * </ol>
 	 * 
 	 * @param divider
-	 *            the given divider
+	 * 		the given divider
 	 * @param string
-	 *            the given string
+	 * 		the given string
 	 * @param start
-	 *            the given starting index
+	 * 		the given starting index
 	 * @param end
-	 *            the given ending index
+	 * 		the given ending index
 	 * @return a new array which is the split of the given string using the
-	 *         given divider
+	 * 	given divider
 	 * @throws ArrayIndexOutOfBoundsException
-	 *             if start is lower than 0 or end is greater than the array
-	 *             length
+	 * 		if start is lower than 0 or end is greater than the array length
 	 */
 	public static final String[] splitOn(char divider, String string,
 			int start, int end) {
@@ -971,7 +970,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       array = {&quot;a&quot;, &quot;b&quot;}
+	 * array = {&quot;a&quot;, &quot;b&quot;}
 	 *       separator = '.'
 	 *       =&gt; result = &quot;a.b&quot;
 	 * </pre>
@@ -980,7 +979,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       array = {}
+	 * array = {}
 	 *       separator = '.'
 	 *       =&gt; result = &quot;&quot;
 	 * </pre>
@@ -989,11 +988,11 @@
 	 * </ol>
 	 * 
 	 * @param array
-	 *            the given array
+	 * 		the given array
 	 * @param separator
-	 *            the given separator
+	 * 		the given separator
 	 * @return the concatenation of the given array parts using the given
-	 *         separator between each part
+	 * 	separator between each part
 	 */
 	public static final String concatWith(String[] array, char separator) {
 		StringBuffer buffer = new StringBuffer();
@@ -1014,7 +1013,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       name = &quot;c&quot;
+	 * name = &quot;c&quot;
 	 *       array = { &quot;a&quot;, &quot;b&quot; }
 	 *       separator = '.'
 	 *       =&gt; result = &quot;a.b.c&quot;
@@ -1024,7 +1023,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       name = null
+	 * name = null
 	 *       array = { &quot;a&quot;, &quot;b&quot; }
 	 *       separator = '.'
 	 *       =&gt; result = &quot;a.b&quot;
@@ -1034,7 +1033,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       name = &quot; c&quot;
+	 * name = &quot; c&quot;
 	 *       array = null
 	 *       separator = '.'
 	 *       =&gt; result = &quot;c&quot;
@@ -1044,14 +1043,13 @@
 	 * </ol>
 	 * 
 	 * @param array
-	 *            the given array
+	 * 		the given array
 	 * @param name
-	 *            the given name
+	 * 		the given name
 	 * @param separator
-	 *            the given separator
+	 * 		the given separator
 	 * @return the concatenation of the given array parts using the given
-	 *         separator between each part and appending the given name at the
-	 *         end
+	 * 	separator between each part and appending the given name at the end
 	 */
 	public static final String concatWith(String[] array, String name,
 			char separator) {
@@ -1079,7 +1077,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       first = null
+	 * first = null
 	 *       second = &quot;a&quot;
 	 *       =&gt; result = {&quot;a&quot;}
 	 * </pre>
@@ -1087,7 +1085,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       first = {&quot;a&quot;}
+	 * first = {&quot;a&quot;}
 	 *       second = null
 	 *       =&gt; result = {&quot;a&quot;}
 	 * </pre>
@@ -1096,7 +1094,7 @@
 	 * <li>
 	 * 
 	 * <pre>
-	 *       first = {&quot;a&quot;}
+	 * first = {&quot;a&quot;}
 	 *       second = {&quot;b&quot;}
 	 *       =&gt; result = {&quot;a&quot;, &quot;b&quot;}
 	 * </pre>
@@ -1105,11 +1103,11 @@
 	 * </ol>
 	 * 
 	 * @param first
-	 *            the first array to concatenate
+	 * 		the first array to concatenate
 	 * @param second
-	 *            the array to add at the end of the first array
+	 * 		the array to add at the end of the first array
 	 * @return a new array adding the second array at the end of first array, or
-	 *         null if the two arrays are null.
+	 * 	null if the two arrays are null.
 	 */
 	public static final String[] arrayConcat(String[] first, String second) {
 		if (second == null)
@@ -1197,15 +1195,15 @@
 	 * detected, or an exception is thrown.
 	 * 
 	 * @param in
-	 *            a data input stream.
+	 * 		a data input stream.
 	 * @return a Unicode string.
 	 * @exception EOFException
-	 *                if the input stream reaches the end before all the bytes.
+	 * 		if the input stream reaches the end before all the bytes.
 	 * @exception IOException
-	 *                if an I/O error occurs.
+	 * 		if an I/O error occurs.
 	 * @exception UTFDataFormatException
-	 *                if the bytes do not represent a valid UTF-8 encoding of a
-	 *                Unicode string.
+	 * 		if the bytes do not represent a valid UTF-8 encoding of a Unicode
+	 * 		string.
 	 * @see java.io.DataInputStream#readUnsignedShort()
 	 */
 	public final static char[] readUTF(DataInput in) throws IOException {
@@ -1225,7 +1223,7 @@
 			case 5:
 			case 6:
 			case 7:
-				// 0xxxxxxx
+				// xxxxxxx
 				count++;
 				str[strlen++] = (char) c;
 				break;
@@ -1268,16 +1266,16 @@
 	 * machine-independent manner.
 	 * <p>
 	 * First, two bytes are written to the output stream as if by the
-	 * <code>writeShort</code> method giving the number of bytes to follow.
-	 * This value is the number of bytes actually written out, not the length of
-	 * the string. Following the length, each character of the string is output,
-	 * in sequence, using the UTF-8 encoding for the character.
+	 * <code>writeShort</code> method giving the number of bytes to follow. This
+	 * value is the number of bytes actually written out, not the length of the
+	 * string. Following the length, each character of the string is output, in
+	 * sequence, using the UTF-8 encoding for the character.
 	 * 
 	 * @param str
-	 *            a string to be written.
+	 * 		a string to be written.
 	 * @return the number of bytes written to the stream.
 	 * @exception IOException
-	 *                if an I/O error occurs.
+	 * 		if an I/O error occurs.
 	 * 
 	 */
 	public static int writeUTF(OutputStream out, char[] str) throws IOException {
@@ -1324,12 +1322,12 @@
 	 * "&lt;", "&gt;", "/", ".".
 	 * 
 	 * @param string
-	 *            the signature string
+	 * 		the signature string
 	 * @param start
-	 *            the 0-based character index of the first character
+	 * 		the 0-based character index of the first character
 	 * @return the 0-based character index of the last character
 	 * @exception IllegalArgumentException
-	 *                if this is not an identifier
+	 * 		if this is not an identifier
 	 */
 	public static int scanIdentifier(char[] string, int start) {
 		// need a minimum 1 char