Index: /java/FramclipsePlugin/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /java/FramclipsePlugin/.settings/org.eclipse.jdt.core.prefs	(revision 13)
+++ /java/FramclipsePlugin/.settings/org.eclipse.jdt.core.prefs	(revision 13)
@@ -0,0 +1,12 @@
+#Thu Dec 27 23:56:16 CET 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
Index: /java/FramclipsePlugin/.settings/org.eclipse.pde.core.prefs
===================================================================
--- /java/FramclipsePlugin/.settings/org.eclipse.pde.core.prefs	(revision 13)
+++ /java/FramclipsePlugin/.settings/org.eclipse.pde.core.prefs	(revision 13)
@@ -0,0 +1,3 @@
+#Tue Jun 23 20:32:54 CEST 2009
+eclipse.preferences.version=1
+resolve.requirebundle=false
Index: /java/FramclipsePlugin/META-INF/MANIFEST.MF
===================================================================
--- /java/FramclipsePlugin/META-INF/MANIFEST.MF	(revision 13)
+++ /java/FramclipsePlugin/META-INF/MANIFEST.MF	(revision 13)
@@ -0,0 +1,65 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Framclipse Plug-in
+Bundle-SymbolicName: com.framsticks.framclipse;singleton:=true
+Bundle-Version: 0.6.0
+Bundle-Activator: com.framsticks.framclipse.Framclipse
+Bundle-Vendor: Jan Kuźniak, Jakub Bocheński
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.views,
+ org.eclipse.ui.ide
+Eclipse-LazyStart: true
+Export-Package: 
+ .,
+ com.framsticks.framclipse;
+  uses:="org.eclipse.jface.resource,
+   org.eclipse.ui.plugin,
+   org.jdom,
+   org.osgi.framework,
+   org.eclipse.jface.text.rules,
+   com.framsticks.framclipse.syntaxColoring,
+   com.framsticks.framclipse.editors.configuration",
+ com.framsticks.framclipse.editors;
+  uses:="org.eclipse.jface.text.source,
+   com.framsticks.framclipse.internal.parser,
+   org.eclipse.swt.widgets,
+   org.eclipse.ui.editors.text",
+ com.framsticks.framclipse.editors.codeCompletion;
+  uses:="org.eclipse.jface.text,
+   com.framsticks.framclipse.editors,
+   com.framsticks.framclipse.internal.parser,
+   org.eclipse.swt.graphics,
+   org.eclipse.jface.text.contentassist",
+ com.framsticks.framclipse.editors.configuration;
+  uses:="org.eclipse.jface.text,
+   com.framsticks.framclipse.editors,
+   org.eclipse.jface.text.reconciler,
+   org.eclipse.jface.text.source,
+   org.eclipse.core.runtime,
+   org.eclipse.core.filebuffers,
+   org.eclipse.jface.text.rules,
+   org.eclipse.jface.text.contentassist,
+   com.framsticks.framclipse.internal.parser,
+   org.eclipse.jface.text.presentation",
+ com.framsticks.framclipse.editors.folding,
+ com.framsticks.framclipse.editors.hover,
+ com.framsticks.framclipse.editors.outline,
+ com.framsticks.framclipse.internal.parser;x-internal:=true,
+ com.framsticks.framclipse.syntaxColoring;uses:="org.eclipse.swt.graphics,org.eclipse.jface.text.rules",
+ org.jdom,
+ org.jdom.adapters,
+ org.jdom.filter,
+ org.jdom.input,
+ org.jdom.output,
+ org.jdom.transform,
+ org.jdom.xpath
+Bundle-ClassPath: .,
+ lib/jdom.jar,
+ lib/jaxen-core.jar,
+ lib/jaxen-jdom.jar,
+ lib/saxpath.jar
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/Framclipse.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/Framclipse.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/Framclipse.java	(revision 13)
@@ -0,0 +1,164 @@
+package com.framsticks.framclipse;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.jdom.Document;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.osgi.framework.BundleContext;
+
+import com.framsticks.framclipse.editors.configuration.FramscriptPartitionScanner;
+import com.framsticks.framclipse.syntaxColoring.ColorManager;
+import com.framsticks.framclipse.syntaxColoring.FramscriptCodeScanner;
+
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Framclipse extends AbstractUIPlugin {
+
+	private static final String FRAMSCRIPT_SYNTAX = "framscript.xml";
+	private static final String FRAMSCRIPT_CONTEXT = "framscontext.xml";
+
+	public final static String FRAMSCRIPT_PARTITIONING = "__framscript_partitioning";
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "Framclipse";
+
+	// The shared instance
+	private static Framclipse plugin;
+
+	private ColorManager colorManager;
+
+	private RuleBasedScanner codeScanner;
+
+	private Map<String, FramscriptPartitionScanner> partitionScanners;
+
+	private Document framscriptSyntax;
+	private Document framscriptContext;
+
+	/**
+	 * The constructor
+	 */
+	public Framclipse() {
+		plugin = this;
+		partitionScanners = new HashMap<String, FramscriptPartitionScanner>();
+	}
+
+	/**
+	 * Returns the singleton color manager.
+	 * 
+	 * @return the singleton color manager.
+	 */
+	public ColorManager getColorManager() {
+		if (colorManager == null) {
+			colorManager = new ColorManager();
+		}
+		return colorManager;
+	}
+
+	/**
+	 * Returns the singleton Framscript scanner.
+	 * 
+	 * @return the singleton Framscript scanner
+	 */
+	public RuleBasedScanner getFramscriptCodeScanner() {
+		if (codeScanner == null) {
+			codeScanner = new FramscriptCodeScanner();
+		}
+		return codeScanner;
+	}
+
+	/**
+	 * Return a scanner for creating framscript partitions.
+	 * 
+	 * @return a scanner for creating framscript partitions
+	 */
+	public FramscriptPartitionScanner getFramscriptPartitionScanner(String codeFileName) {
+		FramscriptPartitionScanner partitionScanner = partitionScanners.get(codeFileName);
+		if (partitionScanner == null) {
+			partitionScanner = new FramscriptPartitionScanner(codeFileName);
+			partitionScanners.put(codeFileName, partitionScanner);
+		}
+		return partitionScanner;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 * 
+	 * @return the shared instance
+	 */
+	public static Framclipse getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given plug-in
+	 * relative path
+	 * 
+	 * @param path
+	 *            the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+
+	public Document getFramscriptSyntax() {
+		if (framscriptSyntax == null) {
+			framscriptSyntax = readDocument(FRAMSCRIPT_SYNTAX);
+		}
+
+		return framscriptSyntax;
+	}
+
+	public Document getFramscriptContext() {
+		if (framscriptContext == null) {
+			framscriptContext = readDocument(FRAMSCRIPT_CONTEXT);
+		}
+
+		return framscriptContext;
+	}
+
+	private Document readDocument(String fileName) {
+		Document document = null;
+		try {
+			SAXBuilder builder = new SAXBuilder();
+			ClassLoader classLoader = getDefault().getClass().getClassLoader();
+			URL syntaxURL = classLoader.getResource(fileName);
+			document = builder.build(syntaxURL);
+		} catch (JDOMException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return document;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/EditorType.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/EditorType.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/EditorType.java	(revision 13)
@@ -0,0 +1,15 @@
+package com.framsticks.framclipse.editors;
+
+public enum EditorType {
+	FRAMSCRIPT("script"), NEURO("neuro"), EXPDEF("expdef"), STYLE("style"), SHOW("show");
+
+	private final String extension;
+
+	private EditorType(String extension) {
+		this.extension = extension;
+	}
+
+	public String getExtension() {
+		return extension;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/ExpdefEditor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/ExpdefEditor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/ExpdefEditor.java	(revision 13)
@@ -0,0 +1,9 @@
+package com.framsticks.framclipse.editors;
+
+public class ExpdefEditor extends FramclipseEditor {
+
+	public ExpdefEditor() {
+		super(EditorType.EXPDEF);
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditor.java	(revision 13)
@@ -0,0 +1,196 @@
+package com.framsticks.framclipse.editors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.TextOperationAction;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+import com.framsticks.framclipse.editors.configuration.FramscriptSourceViewerConfiguration;
+import com.framsticks.framclipse.editors.folding.FramclipseFoldingAnnotation;
+import com.framsticks.framclipse.editors.outline.FramclipseEditorOutlinePage;
+import com.framsticks.framclipse.internal.parser.ElementWithOffset;
+import com.framsticks.framclipse.internal.parser.Node;
+
+
+public class FramclipseEditor extends TextEditor {
+
+	protected final EditorType editorType;
+	private ProjectionSupport projectionSupport;
+	private List<FramclipseFoldingAnnotation> prevAnnotations = new ArrayList<FramclipseFoldingAnnotation>();
+	private ProjectionAnnotationModel annotationModel;
+	
+	private FramclipseEditorOutlinePage outlinePage = null;
+	private boolean outlineRequested = false;
+	
+	protected Node fileModel = null;
+
+	public FramclipseEditor(EditorType editorType) {
+		System.out.println("starting framclipse editor of type: " + editorType);
+		this.editorType = editorType;
+		setSourceViewerConfiguration(new FramscriptSourceViewerConfiguration(editorType, this));
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+
+		super.createPartControl(parent);
+		ProjectionViewer viewer =(ProjectionViewer)getSourceViewer();
+        
+        projectionSupport = new ProjectionSupport(viewer,getAnnotationAccess(),getSharedColors());
+		projectionSupport.install();
+		
+		//turn projection mode on
+		viewer.doOperation(ProjectionViewer.TOGGLE);
+		
+		annotationModel = viewer.getProjectionAnnotationModel();
+	}
+
+	/**
+	 * The <code>FramscriptEditor</code> implementation of this
+	 * <code>AbstractTextEditor</code> method extend the actions to add those
+	 * specific to the receiver.
+	 */
+	@Override
+	protected void createActions() {
+		super.createActions();
+
+		ResourceBundle resourceBundle = FramclipseEditorMessages.getResourceBundle();
+		String prefix = "ContentAssistProposal.";
+		int operationCode = ISourceViewer.CONTENTASSIST_PROPOSALS;
+		IAction a = new TextOperationAction(resourceBundle, prefix, this, operationCode);
+		String id = ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS;
+		a.setActionDefinitionId(id);
+		setAction("ContentAssistProposal", a); //$NON-NLS-1$
+	}
+
+	public EditorType getEditorType() {
+		return editorType;
+	}
+
+	@Override
+	protected ISourceViewer createSourceViewer(Composite parent,
+			IVerticalRuler ruler, int styles) {
+		ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+
+    	// ensure decoration support has been created and configured.
+    	getSourceViewerDecorationSupport(viewer);
+    	
+    	((TextViewer)viewer).addPostSelectionChangedListener(new ISelectionChangedListener() {
+
+			public void selectionChanged(SelectionChangedEvent event) {
+				
+				TextSelection selection = (TextSelection) event.getSelection();
+				
+				if(getFileModel() != null)
+				{
+					Node element = ((ElementWithOffset)getFileModel()).getElementForOffset(selection.getOffset());
+					//System.out.println("selected: " + element);
+					if(outlinePage != null)
+						outlinePage.setSelectedElement(element);
+					
+				}
+				
+			}
+    		
+    	});
+    	
+    	return viewer;
+	}
+	
+	public void updateFoldingStructure(List<FramclipseFoldingAnnotation> annotations)
+	{
+		List<Annotation> removals = new ArrayList<Annotation>();
+		HashMap newAnnotations = new HashMap();
+		
+		//System.out.println("got " + annotations.size() + " annotations.");
+		
+		for(int l = 0; l < prevAnnotations.size(); ++l)
+		{
+			FramclipseFoldingAnnotation equiv = prevAnnotations.get(l).hasEquivalent(annotations, getSourceViewer().getDocument()); 
+			if(equiv == null)
+			{
+				removals.add(prevAnnotations.get(l));
+			}
+			else
+			{
+				annotations.remove(equiv);
+			}
+		}
+		
+		for(Annotation annot : removals)
+			prevAnnotations.remove(annot);
+		
+		for(FramclipseFoldingAnnotation annot : annotations)
+		{ 
+			//System.out.println("adding for: " + annot.getAnnotatedElement());
+			prevAnnotations.add(annot);
+			newAnnotations.put(annot, new Position(annot.getAnnotatedElement().getBeginOffset(), 
+					annot.getAnnotationLength()));
+		}
+			
+		ProjectionAnnotation[] toDelete = new ProjectionAnnotation[removals.size()];
+		removals.toArray(toDelete);
+				
+		annotationModel.modifyAnnotations(toDelete,newAnnotations,null);
+	}
+
+	public Node getFileModel() {
+		return fileModel;
+	}
+
+	public void setFileModel(Node fileModel) {
+		this.fileModel = fileModel;
+	}
+
+	@Override
+	public Object getAdapter(Class adapter) {
+		if(IContentOutlinePage.class.equals(adapter))
+		{
+			outlineRequested = true;
+			
+			if(outlinePage == null)
+			{
+				outlinePage = new FramclipseEditorOutlinePage(this);
+				if(getFileModel() != null)
+					outlinePage.setInput(getFileModel());
+			}
+			
+			return outlinePage;
+		}
+		
+		return super.getAdapter(adapter);
+	}
+	
+	public void updateOutlinePage()
+	{
+		if(outlineRequested)
+		{
+			if(outlinePage == null)
+			{
+				outlinePage = new FramclipseEditorOutlinePage(this);
+			}
+			
+			//if(getFileModel() != null)
+			outlinePage.setInput(getFileModel());
+		}
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditorMessages.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditorMessages.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditorMessages.java	(revision 13)
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+package com.framsticks.framclipse.editors;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class FramclipseEditorMessages {
+
+	private static final String RESOURCE_BUNDLE = "com.framsticks.framclipse.editors.FramclipseEditorMessages";//$NON-NLS-1$
+
+	private static ResourceBundle resourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE);
+
+	private FramclipseEditorMessages() {
+	}
+
+	public static String getString(String key) {
+		try {
+			return resourceBundle.getString(key);
+		} catch (MissingResourceException e) {
+			return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
+		}
+	}
+
+	public static ResourceBundle getResourceBundle() {
+		return resourceBundle;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditorMessages.properties
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditorMessages.properties	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramclipseEditorMessages.properties	(revision 13)
@@ -0,0 +1,33 @@
+## Actions ##
+
+ContentAssistProposal.label=Content Assist@Ctrl+SPACE
+ContentAssistProposal.tooltip=Content Assist
+ContentAssistProposal.image=
+ContentAssistProposal.description=Content Assist
+
+ContentAssistTip.label=Content Tip@Ctrl+SHIFT+SPACE
+ContentAssistTip.tooltip=Content Tip
+ContentAssistTip.image=
+ContentAssistTip.description=Content Tip
+
+DefineFoldingRegion.label=Define Folding Region
+DefineFoldingRegion.tooltip=Define Folding Region
+DefineFoldingRegion.image=
+DefineFoldingRegion.description=Define Folding Region
+
+TogglePresentation.label=Change Presentation
+TogglePresentation.tooltip=Enable/Disable Segmented Source Viewer
+TogglePresentation.image=togglepresentation.gif
+TogglePresentation.description=Enable/Disable Segmented Source Viewer
+
+OutlinePage.segment.title_pattern=position {0}
+
+AutoIndent.error.bad_location_1=JavaAutoIndentStrategy.getAutoIndentString: BadLocationException
+AutoIndent.error.bad_location_2=JavaAutoIndentStrategy.calcShiftBackReplace: BadLocationException
+
+CompletionProcessor.ContextInfo.display.pattern=proposal {0} at position {1}
+CompletionProcessor.ContextInfo.value.pattern=proposal {0} valid from {1} to {2}
+CompletionProcessor.Proposal.ContextInfo.pattern={0} valid 5 characters around insertion point
+CompletionProcessor.Proposal.hoverinfo.pattern=Java keyword: {0}
+
+JavaTextHover.emptySelection=empty selection
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramscriptEditor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramscriptEditor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/FramscriptEditor.java	(revision 13)
@@ -0,0 +1,8 @@
+package com.framsticks.framclipse.editors;
+
+public class FramscriptEditor extends FramclipseEditor {
+
+	public FramscriptEditor() {
+		super(EditorType.FRAMSCRIPT);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/NeuroEditor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/NeuroEditor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/NeuroEditor.java	(revision 13)
@@ -0,0 +1,9 @@
+package com.framsticks.framclipse.editors;
+
+public class NeuroEditor extends FramclipseEditor {
+
+	public NeuroEditor() {
+		super(EditorType.NEURO);
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/ShowEditor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/ShowEditor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/ShowEditor.java	(revision 13)
@@ -0,0 +1,9 @@
+package com.framsticks.framclipse.editors;
+
+public class ShowEditor extends FramclipseEditor {
+
+	public ShowEditor() {
+		super(EditorType.SHOW);
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/StyleEditor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/StyleEditor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/StyleEditor.java	(revision 13)
@@ -0,0 +1,9 @@
+package com.framsticks.framclipse.editors;
+
+public class StyleEditor extends FramclipseEditor {
+
+	public StyleEditor() {
+		super(EditorType.STYLE);
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/FramscriptCompletionProcessor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/FramscriptCompletionProcessor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/FramscriptCompletionProcessor.java	(revision 13)
@@ -0,0 +1,374 @@
+package com.framsticks.framclipse.editors.codeCompletion;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.contentassist.ContextInformation;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorMapping;
+import org.eclipse.ui.IPathEditorInput;
+import org.jdom.Attribute;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.xpath.XPath;
+
+import com.framsticks.framclipse.Framclipse;
+import com.framsticks.framclipse.editors.EditorType;
+import com.framsticks.framclipse.editors.FramclipseEditor;
+import com.framsticks.framclipse.internal.parser.ASTFObject;
+import com.framsticks.framclipse.internal.parser.ASTGlobalInclude;
+import com.framsticks.framclipse.internal.parser.ASTProperty;
+import com.framsticks.framclipse.internal.parser.FramclipseParser;
+import com.framsticks.framclipse.internal.parser.Node;
+import com.framsticks.framclipse.syntaxColoring.FramscriptCodeScanner;
+
+
+/**
+ * Framscript completion processor.
+ */
+public class FramscriptCompletionProcessor implements IContentAssistProcessor {
+
+	private final Set<String> contexts;
+
+	protected final FramclipseEditor editor;
+
+	protected final EditorType editorType;
+
+	protected FramclipseParser parser;
+
+	public FramscriptCompletionProcessor(Set<String> contexts,
+			FramclipseEditor editor, EditorType editorType) {
+		super();
+		this.contexts = contexts;
+		this.editor = editor;
+		this.editorType = editorType;
+	}
+
+	protected IContextInformationValidator validator = new Validator();
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	@SuppressWarnings("unchecked")
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
+			int documentOffset) {
+
+		// get text before cursor
+		IDocument document = viewer.getDocument();
+		String elementPart = SyntaxUtils.getElementBefore(document,
+				documentOffset);
+
+		// check if there is a dot before this text -> then fetch parent
+		int offset = documentOffset - elementPart.length() - 1;
+
+		String parent = null;
+		List<String> elementsBefore = SyntaxUtils.getElementsBefore(document,
+				offset);
+		try {
+			parent = SyntaxUtils.getLastElementType(elementsBefore);
+		} catch (Exception e1) {
+			e1.printStackTrace();
+		}
+
+		// now if we have parent, ask XPath
+		List<OrderableCompletionProposal> proposals = new ArrayList<OrderableCompletionProposal>();
+		if (EditorType.EXPDEF.equals(editorType) && "ExpParams".equals(parent)) {
+			addExpParamsProposals(viewer.getDocument(), documentOffset,
+					elementPart, proposals);
+		} else {
+			String query = SyntaxUtils.ROOT + "/*";
+			if ((parent != null) && (parent.length() > 0)) {
+				query += "[@" + SyntaxUtils.NAME_ATTRIBUTE + "='" + parent
+						+ "']/" + SyntaxUtils.ELEMENT_ELEMENT;
+			}
+			Document syntax = Framclipse.getDefault().getFramscriptSyntax();
+			try {
+				XPath xpath = XPath.newInstance(query);
+				List<Element> list = xpath.selectNodes(syntax);
+				for (Element element : list) {
+					Attribute context = element
+							.getAttribute(SyntaxUtils.CONTEXT_ATTRIBUTE);
+					if ((context == null)
+							|| contexts.contains(context.getValue())) {
+						addCompletion(element, documentOffset, elementPart,
+								proposals);
+					}
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		if (parent == null || parent.length() == 0)
+			addKeywordProposals(documentOffset, elementPart, proposals);
+
+		Collections.sort(proposals);
+
+		ICompletionProposal[] result = new ICompletionProposal[proposals.size()];
+		result = proposals.toArray(result);
+		return result;
+	}
+
+	void addExpParamsProposals(IDocument document, int documentOffset,
+			String elementPart, List<OrderableCompletionProposal> proposals) {
+		Node model = editor.getFileModel();
+		if (model == null) 
+			return;
+		processExpParamNode(model, documentOffset, elementPart, proposals);
+	}
+
+	static void processExpParamNode(Node model, int documentOffset,
+			String elementPart, List<OrderableCompletionProposal> proposals) {
+		{
+			final int modelNumChild = model.jjtGetNumChildren();
+			for (int i = 0; i < modelNumChild; ++i) {
+				final Node child = model.jjtGetChild(i);
+				if (child instanceof ASTFObject) {
+					final ASTFObject fo = (ASTFObject) child;
+					if ("prop".equals(fo.getClassName())) {
+						String id = "", name = null, type = null;
+						final int numChildren = fo.jjtGetNumChildren();
+						for (int j = 0; j < numChildren; j++) {
+							final Node fochild = fo.jjtGetChild(j);
+							if (fochild instanceof ASTProperty) {
+								final ASTProperty prop = (ASTProperty) fochild;
+								final String pname = prop.getName();
+								if ("id".equalsIgnoreCase(pname)) {
+									id = prop.getValue();
+									if (id == null || id.length() == 0
+											|| !id.startsWith(elementPart)) {
+										break;
+									}
+								} else if ("name".equalsIgnoreCase(pname)) {
+									name = prop.getValue();
+								} else if ("type".equalsIgnoreCase(pname)) {
+									type = prop.getValue();
+								}
+							}
+						}
+						addExpdefCompletion(documentOffset, elementPart,
+								proposals, id, name, type);
+					}
+				} else if (child instanceof ASTGlobalInclude) {
+					processExpParamNode(child, documentOffset, elementPart,
+							proposals);
+				}
+			}
+		}
+	}
+
+	static void addExpdefCompletion(int documentOffset, String elementPart,
+			List<OrderableCompletionProposal> proposals, String id,
+			String name, String type) {
+
+		if (id == null || id.length() == 0 || !id.startsWith(elementPart))
+			return;
+		String descr = id;
+		if (type != null) {
+			type = type.trim();
+			final char t = type.charAt(0);
+			final String typeName = SyntaxUtils.typeName(t);
+			if (typeName != null)
+				type = typeName;
+			descr += " " + type;
+		}
+		 if (name != null)
+		 descr += " (" + name + ")";
+		final OrderableCompletionProposal prop = new OrderableCompletionProposal(
+				id, documentOffset - elementPart.length(),
+				elementPart.length(), id.length() - 1, null, descr, null, null);
+		prop.setName(id);
+		proposals.add(prop);
+	}
+
+	void addKeywordProposals(int documentOffset, String elementPart,
+			List<OrderableCompletionProposal> proposals) {
+		for (String kwd : FramscriptCodeScanner.keywords) {
+			if (kwd.startsWith(elementPart)) {
+				OrderableCompletionProposal prop = getProposalForKeyword(kwd,
+						documentOffset, elementPart);
+				proposals.add(prop);
+			}
+		}
+	}
+
+	/**
+	 * Function to customize the creation of completion proposals based on the
+	 * current keyword. For example, the <code>if</code> keyword gets some
+	 * additional parentheses.
+	 * 
+	 * @param kwd
+	 * @param documentOffset
+	 * @param elementPart
+	 * @return
+	 */
+	OrderableCompletionProposal getProposalForKeyword(String kwd,
+			int documentOffset, String elementPart) {
+		OrderableCompletionProposal prop = null;
+
+		if ("if".equals(kwd)) {
+			String repString = kwd + " ()";
+			prop = new OrderableCompletionProposal(repString, documentOffset
+					- elementPart.length(), elementPart.length(), repString
+					.length() - 1, null, kwd + " keyword", null, null);
+		} else {
+			prop = new OrderableCompletionProposal(kwd, documentOffset
+					- elementPart.length(), elementPart.length(), kwd.length(),
+					null, kwd + " keyword", null, null);
+		}
+
+		prop.setName(kwd);
+		return prop;
+	}
+
+	@SuppressWarnings("unchecked")
+	private void addCompletion(Element element, int documentOffset,
+			String elementPart, List<OrderableCompletionProposal> proposals) {
+		String name = element.getAttributeValue(SyntaxUtils.NAME_ATTRIBUTE);
+		String completion = name;
+		int cursorPosition = name.length();
+		String functionValue = element
+				.getAttributeValue(SyntaxUtils.FUNCTION_ATTRIBUTE);
+		boolean function = (functionValue != null)
+				&& functionValue.equals("true");
+		String displayString = "";
+		IContextInformation contextInformation = null;
+		displayString = completion;
+		if (function) {
+			completion += "()";
+			displayString += "(";
+			Element arguments = element.getChild(SyntaxUtils.ARGUMENTS_ELEMENT);
+			if (arguments != null) {
+				List<Element> argumentsList = arguments
+						.getChildren(SyntaxUtils.ARGUMENT_ELEMENT);
+				for (Element argument : argumentsList) {
+					String attributeType = argument
+							.getAttributeValue(SyntaxUtils.TYPE_ATTRIBUTE);
+					if ((attributeType == null)
+							|| (attributeType.length() == 0)) {
+						attributeType = "void";
+					}
+					String attributeName = argument
+							.getAttributeValue(SyntaxUtils.NAME_ATTRIBUTE);
+					displayString += attributeType + " " + attributeName + ", ";
+				}
+				if (argumentsList.size() > 0) {
+					displayString = displayString.substring(0, displayString
+							.length() - 2);
+				}
+			}
+			displayString += ")";
+			contextInformation = new ContextInformation(completion,
+					displayString);
+			cursorPosition++;
+		}
+
+		String type = element.getAttributeValue(SyntaxUtils.TYPE_ATTRIBUTE);
+		if ((type != null) && (type.length() > 0)) {
+			displayString += "  " + type;
+		}
+
+		String context = element
+				.getAttributeValue(SyntaxUtils.CONTEXT_ATTRIBUTE);
+		if ((context != null) && (context.length() > 0)) {
+			displayString += " (" + context + ")";
+		}
+
+		if (completion.startsWith(elementPart)) {
+			int replacementLength = elementPart.length();
+			int replacementOffset = documentOffset - replacementLength;
+			OrderableCompletionProposal completionProposal = new OrderableCompletionProposal(
+					completion, replacementOffset, replacementLength,
+					cursorPosition, null, displayString, contextInformation,
+					null);
+			completionProposal.setName(name);
+			completionProposal.setFunction(function);
+			proposals.add(completionProposal);
+		}
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer,
+			int documentOffset) {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return new char[] { '.' };
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		return new char[] {};
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		return validator;
+	}
+
+	public FramclipseEditor getEditor() {
+		return editor;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public String getErrorMessage() {
+		return null;
+	}
+
+	/**
+	 * Simple content assist tip closer. The tip is valid in a range of 5
+	 * characters around its popup location.
+	 */
+	protected static class Validator implements IContextInformationValidator,
+			IContextInformationPresenter {
+
+		protected int installOffset;
+
+		/*
+		 * @see IContextInformationValidator#isContextInformationValid(int)
+		 */
+		public boolean isContextInformationValid(int offset) {
+			return Math.abs(installOffset - offset) < 5;
+		}
+
+		/*
+		 * @see IContextInformationValidator#install(IContextInformation,
+		 * ITextViewer, int)
+		 */
+		public void install(IContextInformation info, ITextViewer viewer,
+				int offset) {
+			installOffset = offset;
+		}
+
+		/*
+		 * @see
+		 * org.eclipse.jface.text.contentassist.IContextInformationPresenter
+		 * #updatePresentation(int, TextPresentation)
+		 */
+		public boolean updatePresentation(int documentPosition,
+				TextPresentation presentation) {
+			return false;
+		}
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/OrderableCompletionProposal.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/OrderableCompletionProposal.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/OrderableCompletionProposal.java	(revision 13)
@@ -0,0 +1,201 @@
+package com.framsticks.framclipse.editors.codeCompletion;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+
+public class OrderableCompletionProposal implements ICompletionProposal,
+		Comparable<OrderableCompletionProposal> {
+
+	/** The string to be displayed in the completion proposal popup. */
+	private String fDisplayString;
+	/** The replacement string. */
+	private String fReplacementString;
+	/** The replacement offset. */
+	private int fReplacementOffset;
+	/** The replacement length. */
+	private int fReplacementLength;
+	/** The cursor position after this proposal has been applied. */
+	private int fCursorPosition;
+	/** The image to be displayed in the completion proposal popup. */
+	private Image fImage;
+	/** The context information of this proposal. */
+	private IContextInformation fContextInformation;
+	/** The additional info of this proposal. */
+	private String fAdditionalProposalInfo;
+
+	private boolean function;
+	private String name;
+	private String type;
+
+	/**
+	 * Creates a new completion proposal based on the provided information. The
+	 * replacement string is considered being the display string too. All
+	 * remaining fields are set to <code>null</code>.
+	 * 
+	 * @param replacementString
+	 *            the actual string to be inserted into the document
+	 * @param replacementOffset
+	 *            the offset of the text to be replaced
+	 * @param replacementLength
+	 *            the length of the text to be replaced
+	 * @param cursorPosition
+	 *            the position of the cursor following the insert relative to
+	 *            replacementOffset
+	 */
+	public OrderableCompletionProposal(String replacementString, int replacementOffset,
+			int replacementLength, int cursorPosition) {
+		this(replacementString, replacementOffset, replacementLength, cursorPosition, null, null,
+				null, null);
+	}
+
+	/**
+	 * Creates a new completion proposal. All fields are initialized based on
+	 * the provided information.
+	 * 
+	 * @param replacementString
+	 *            the actual string to be inserted into the document
+	 * @param replacementOffset
+	 *            the offset of the text to be replaced
+	 * @param replacementLength
+	 *            the length of the text to be replaced
+	 * @param cursorPosition
+	 *            the position of the cursor following the insert relative to
+	 *            replacementOffset
+	 * @param image
+	 *            the image to display for this proposal
+	 * @param displayString
+	 *            the string to be displayed for the proposal
+	 * @param contextInformation
+	 *            the context information associated with this proposal
+	 * @param additionalProposalInfo
+	 *            the additional information associated with this proposal
+	 */
+	public OrderableCompletionProposal(String replacementString, int replacementOffset,
+			int replacementLength, int cursorPosition, Image image, String displayString,
+			IContextInformation contextInformation, String additionalProposalInfo) {
+		Assert.isNotNull(replacementString);
+		Assert.isTrue(replacementOffset >= 0);
+		Assert.isTrue(replacementLength >= 0);
+		Assert.isTrue(cursorPosition >= 0);
+
+		fReplacementString = replacementString;
+		fReplacementOffset = replacementOffset;
+		fReplacementLength = replacementLength;
+		fCursorPosition = cursorPosition;
+		fImage = image;
+		fDisplayString = displayString;
+		fContextInformation = contextInformation;
+		fAdditionalProposalInfo = additionalProposalInfo;
+	}
+
+	/*
+	 * @see ICompletionProposal#apply(IDocument)
+	 */
+	public void apply(IDocument document) {
+		try {
+			document.replace(fReplacementOffset, fReplacementLength, fReplacementString);
+		} catch (BadLocationException x) {
+			// ignore
+		}
+	}
+
+	/*
+	 * @see ICompletionProposal#getSelection(IDocument)
+	 */
+	public Point getSelection(IDocument document) {
+		return new Point(fReplacementOffset + fCursorPosition, 0);
+	}
+
+	/*
+	 * @see ICompletionProposal#getContextInformation()
+	 */
+	public IContextInformation getContextInformation() {
+		return fContextInformation;
+	}
+
+	/*
+	 * @see ICompletionProposal#getImage()
+	 */
+	public Image getImage() {
+		return fImage;
+	}
+
+	/*
+	 * @see ICompletionProposal#getDisplayString()
+	 */
+	public String getDisplayString() {
+		if (fDisplayString != null) {
+			return fDisplayString;
+		}
+		return fReplacementString;
+	}
+
+	/*
+	 * @see ICompletionProposal#getAdditionalProposalInfo()
+	 */
+	public String getAdditionalProposalInfo() {
+		return fAdditionalProposalInfo;
+	}
+
+	public boolean isFunction() {
+		return function;
+	}
+
+	public void setFunction(boolean function) {
+		this.function = function;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public int compareTo(OrderableCompletionProposal o) {
+		if (o.function && !function) {
+			return -1;
+		}
+		if (!o.function && function) {
+			return 1;
+		}
+
+		if ((type == null) && (o.type != null)) {
+			int typeNameComparison = -1 * o.type.compareTo(name);
+			if (typeNameComparison == 0) {
+				return -1;
+			}
+			return typeNameComparison;
+		}
+		if (type != null) {
+			if (o.type == null) {
+				int typeNameComparison = type.compareTo(o.name);
+				if (typeNameComparison == 0) {
+					return 1;
+				}
+				return typeNameComparison;
+			}
+
+			int typeComparison = type.compareTo(o.type);
+			if (typeComparison != 0) {
+				return typeComparison;
+			}
+		}
+
+		return name.compareTo(o.name);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/PropertyCompletionProcessor.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/PropertyCompletionProcessor.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/PropertyCompletionProcessor.java	(revision 13)
@@ -0,0 +1,219 @@
+package com.framsticks.framclipse.editors.codeCompletion;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.jdom.Attribute;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.xpath.XPath;
+
+import com.framsticks.framclipse.Framclipse;
+
+
+/**
+ * Framscript completion processor.
+ */
+public class PropertyCompletionProcessor implements IContentAssistProcessor {
+
+	private final Set<String> contexts;
+	private final Set<String> objectContexts;
+	private final Map<String, String> propertyTypes;
+
+	public PropertyCompletionProcessor(Set<String> contexts, Set<String> objectContexts,
+			Map<String, String> propertyTypes) {
+		this.contexts = contexts;
+		this.objectContexts = objectContexts;
+		this.propertyTypes = propertyTypes;
+	}
+
+	protected IContextInformationValidator validator = new Validator();
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	@SuppressWarnings("unchecked")
+	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
+		// get text before cursor
+		IDocument document = viewer.getDocument();
+		String elementPart = SyntaxUtils.getElementBefore(document, documentOffset);
+
+		// now if we have parent, ask XPath
+		List<OrderableCompletionProposal> proposals = new ArrayList<OrderableCompletionProposal>();
+
+		String query = SyntaxUtils.ROOT + "/" + SyntaxUtils.TYPE_ELEMENT;
+		Document syntax = Framclipse.getDefault().getFramscriptSyntax();
+		try {
+			XPath xpath = XPath.newInstance(query);
+			List<Element> list = xpath.selectNodes(syntax);
+			for (Element element : list) {
+				String name = element.getAttribute(SyntaxUtils.NAME_ATTRIBUTE).getValue();
+				if ((name != null) && propertyTypes.keySet().contains(name)) {
+					Attribute context = element.getAttribute(SyntaxUtils.CONTEXT_ATTRIBUTE);
+					if ((context == null) || contexts.contains(context.getValue())) {
+						addTypeCompletions(documentOffset, elementPart, element, proposals);
+					}
+				}
+
+				String context = element.getAttribute(SyntaxUtils.CONTEXT_ATTRIBUTE).getValue();
+				if ((context != null) && objectContexts.contains(context)) {
+					addObjectCompletions(documentOffset, elementPart, element, proposals);
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		Collections.sort(proposals);
+		ICompletionProposal[] result = new ICompletionProposal[proposals.size()];
+		result = proposals.toArray(result);
+		return result;
+	}
+
+	@SuppressWarnings("unchecked")
+	private void addTypeCompletions(int documentOffset, String elementPart, Element typeElement,
+			List<OrderableCompletionProposal> proposals) throws JDOMException {
+
+		String typeName = typeElement.getAttribute(SyntaxUtils.NAME_ATTRIBUTE).getValue();
+		String objectName = propertyTypes.get(typeName);
+
+		List<Element> fieldsList = typeElement.getChildren(SyntaxUtils.ELEMENT_ELEMENT);
+		for (Element element : fieldsList) {
+			addCompletion(element, documentOffset, elementPart, objectName, proposals);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private void addObjectCompletions(int documentOffset, String elementPart,
+			Element objectElement, List<OrderableCompletionProposal> proposals)
+			throws JDOMException {
+
+		String objectName = objectElement.getAttribute(SyntaxUtils.NAME_ATTRIBUTE).getValue();
+		addCompletion(objectElement, documentOffset, elementPart, null, proposals);
+
+		List<Element> fieldsList = objectElement.getChildren(SyntaxUtils.ELEMENT_ELEMENT);
+		for (Element element : fieldsList) {
+			addCompletion(element, documentOffset, elementPart, objectName, proposals);
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	private void addCompletion(Element element, int documentOffset, String elementPart,
+			String objectName, List<OrderableCompletionProposal> proposals) {
+		String name = element.getAttributeValue(SyntaxUtils.NAME_ATTRIBUTE);
+		String completion = name;
+		int cursorPosition = name.length();
+
+		// since we are to propose property completions, we do not want function
+		// names here
+		String functionValue = element.getAttributeValue(SyntaxUtils.FUNCTION_ATTRIBUTE);
+		boolean function = (functionValue != null) && functionValue.equals("true");
+		if (function) {
+			return;
+		}
+
+		String displayString = "";
+		if (objectName != null) {
+			displayString += objectName + ": ";
+		}
+		displayString += completion + ":";
+		IContextInformation contextInformation = null;
+
+		String type = element.getAttributeValue(SyntaxUtils.TYPE_ATTRIBUTE);
+		if ((type != null) && (type.length() > 0)) {
+			displayString += "  (" + type + ")";
+		}
+
+		if (completion.startsWith(elementPart)) {
+			int replacementLength = elementPart.length();
+			int replacementOffset = documentOffset - replacementLength;
+			OrderableCompletionProposal completionProposal = new OrderableCompletionProposal(
+					completion + ": ", replacementOffset, replacementLength, cursorPosition + 2,
+					null, displayString, contextInformation, null);
+
+			completionProposal.setType(objectName);
+			completionProposal.setName(completion);
+			proposals.add(completionProposal);
+		}
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public char[] getCompletionProposalAutoActivationCharacters() {
+		return new char[] { '.' };
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public char[] getContextInformationAutoActivationCharacters() {
+		return new char[] {};
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public IContextInformationValidator getContextInformationValidator() {
+		return validator;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IContentAssistProcessor
+	 */
+	public String getErrorMessage() {
+		return null;
+	}
+
+	/**
+	 * Simple content assist tip closer. The tip is valid in a range of 5
+	 * characters around its popup location.
+	 */
+	protected static class Validator implements IContextInformationValidator,
+			IContextInformationPresenter {
+
+		protected int installOffset;
+
+		/*
+		 * @see IContextInformationValidator#isContextInformationValid(int)
+		 */
+		public boolean isContextInformationValid(int offset) {
+			return Math.abs(installOffset - offset) < 5;
+		}
+
+		/*
+		 * @see IContextInformationValidator#install(IContextInformation,
+		 *      ITextViewer, int)
+		 */
+		public void install(IContextInformation info, ITextViewer viewer, int offset) {
+			installOffset = offset;
+		}
+
+		/*
+		 * @see org.eclipse.jface.text.contentassist.IContextInformationPresenter#updatePresentation(int,
+		 *      TextPresentation)
+		 */
+		public boolean updatePresentation(int documentPosition, TextPresentation presentation) {
+			return false;
+		}
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/SyntaxUtils.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/SyntaxUtils.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/codeCompletion/SyntaxUtils.java	(revision 13)
@@ -0,0 +1,279 @@
+package com.framsticks.framclipse.editors.codeCompletion;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.xpath.XPath;
+
+import com.framsticks.framclipse.Framclipse;
+
+
+/**
+ * Utils for finding function and field names in document and describing them
+ * (e.g. using type).
+ * 
+ * @author Jan Kuniak
+ */
+public class SyntaxUtils {
+
+	public static final String ROOT = "/framscript";
+
+	public static final String CONTEXT_ATTRIBUTE = "context";
+	public static final String FUNCTION_ATTRIBUTE = "function";
+	public static final String NAME_ATTRIBUTE = "name";
+	public static final String TYPE_ATTRIBUTE = "type";
+
+	public static final String ARGUMENT_ELEMENT = "argument";
+	public static final String ARGUMENTS_ELEMENT = "arguments";
+	public static final String DESCRIPTION_ELEMENT = "description";
+	public static final String ELEMENT_ELEMENT = "element";
+	public static final String TYPE_ELEMENT = "type";
+
+	// /////////////////////////////////////////////////////////////////////////
+	// Before
+	// ///////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Returns identifier before the cursor (if any).
+	 * 
+	 * @param document
+	 *            document in which element is to be found.
+	 * @param offset
+	 *            cursor position in the document.
+	 * @return identifier before the cursor if any, "" if not found.
+	 */
+	public static String getElementBefore(IDocument document, int offset) {
+		String result = "";
+		int i = offset - 1;
+		try {
+			while ((i > 0)) {
+				char ch = document.getChar(i);
+				if (!Character.isJavaIdentifierPart(ch)) {
+					return result;
+				}
+
+				result = ch + result;
+				i--;
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+	/**
+	 * Returns brace block, starting with opening brace, ending with closing
+	 * brace and regarding braces inside.
+	 * 
+	 * @param document
+	 *            document to search brace block in.
+	 * @param offset
+	 *            cursor position in the document.
+	 * @return brace block if found, "" otherwise.
+	 */
+	public static String getBraceBlockBefore(IDocument document, int offset) {
+		String result = "";
+		int i = offset - 1;
+		int bracketsCount = 0;
+		try {
+			while ((i > 0)) {
+				char ch = document.getChar(i);
+
+				switch (ch) {
+				case ')':
+					bracketsCount++;
+					break;
+				case '(':
+					bracketsCount--;
+					break;
+				case '\n':
+					return result;
+				default:
+					if (bracketsCount == 0) {
+						return result;
+					}
+				}
+				result = ch + result;
+				i--;
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+	/**
+	 * Returns list of elements (Classes, methods, fields) connected with dots
+	 * ending with the element before the cursor position. Functions does not
+	 * contain braces blocks.
+	 * 
+	 * @param document
+	 *            document to search elements in.
+	 * @param offset
+	 *            cursor position in the document.
+	 * @return list of strings found, may be empty, never null.
+	 */
+	public static List<String> getElementsBefore(IDocument document, int offset) {
+
+		List<String> objects = new ArrayList<String>();
+		String object = "";
+		try {
+			char probablyDot = document.getChar(offset);
+
+			while (probablyDot == '.') {
+				String bracketBlock = SyntaxUtils.getBraceBlockBefore(document, offset);
+				offset -= bracketBlock.length();
+				object = SyntaxUtils.getElementBefore(document, offset);
+				if (object.length() == 0) {
+					return objects;
+				}
+				objects.add(object);
+
+				offset -= object.length() + 1;
+				if (offset < 0) {
+					return objects;
+				}
+
+				probablyDot = document.getChar(offset);
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+
+		return objects;
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// After
+	// ///////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Returns identifier after the cursor position (if any) including character
+	 * at position.
+	 * 
+	 * @param document
+	 *            document in which element is to be found.
+	 * @param offset
+	 *            cursor position in the document.
+	 * @return identifier after the cursor if any, "" if not found.
+	 */
+	public static String getElementAfter(IDocument document, int offset) {
+		String result = "";
+		int i = offset;
+		try {
+			while ((i < document.getLength())) {
+				char ch = document.getChar(i);
+				if (!Character.isJavaIdentifierPart(ch)) {
+					return result;
+				}
+
+				result += ch;
+				i++;
+			}
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+		return result;
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// At
+	// ///////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Returns list of elements (Classes, methods, fields) connected with dots
+	 * ending with the element at the cursor position. Functions does not
+	 * contain braces blocks.
+	 * 
+	 * @param document
+	 *            document to search elements in.
+	 * @param offset
+	 *            cursor position in the document.
+	 * @return list of strings found, may be empty, never null.
+	 */
+	public static String getElementAt(IDocument document, int offset) {
+		return getElementBefore(document, offset) + getElementAfter(document, offset);
+	}
+
+	/**
+	 * Returns identifier at the cursor position (if any).
+	 * 
+	 * @param document
+	 *            document in which element is to be found.
+	 * @param offset
+	 *            cursor position in the document.
+	 * @return identifier at the cursor if any, "" if not found.
+	 */
+	public static List<String> getElementsAt(IDocument document, int offset) {
+		String before = SyntaxUtils.getElementBefore(document, offset);
+		int dotPosition = offset - before.length() - 1;
+		List<String> elements = SyntaxUtils.getElementsBefore(document, dotPosition);
+		String elementAt = SyntaxUtils.getElementAt(document, offset);
+		if (elementAt.length() > 0) {
+			elements.add(elementAt);
+		}
+
+		return elements;
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// Other
+	// ///////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Returns the type of the last element in the list, regarding types of it's
+	 * predecesors, i.e. it distinguishes <code>Vector.new()</code> from
+	 * <code>Dictionary.new()</code> and so on.
+	 * 
+	 * @param elements
+	 *            vector of elements (identifiers).
+	 * @return type of the last element in the list.
+	 * @throws JDOMException
+	 *             if parsing exception occurs (problem with configuration
+	 *             file).
+	 */
+	public static String getLastElementType(List<String> elements) throws JDOMException {
+
+		if (elements.size() == 0) {
+			return "";
+		}
+		Document syntax = Framclipse.getDefault().getFramscriptSyntax();
+
+		int i = elements.size() - 1;
+		String type = elements.get(i);
+
+		while ((--i >= 0) && (type != null) && (type.length() > 0)) {
+			String nextElement = elements.get(i);
+			String query = SyntaxUtils.ROOT;
+			query += "/*[@" + SyntaxUtils.NAME_ATTRIBUTE + "='" + type + "']";
+			query += "/*[@" + SyntaxUtils.NAME_ATTRIBUTE + "='" + nextElement + "']";
+			XPath xpath = XPath.newInstance(query);
+			Element element = (Element) xpath.selectSingleNode(syntax);
+			type = element.getAttributeValue(SyntaxUtils.TYPE_ATTRIBUTE);
+		}
+		return type;
+	}
+
+	public static String typeName(char type) {
+		switch (type) {
+		case 'd':
+			return "integer";
+		case 'f':
+			return "float";
+		case 's':
+			return "string";
+		case 'p':
+			return "Function";
+		case 'o':
+			return "object";
+		case 'x':
+			return "unknown";
+		}
+		return null;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/ExpdefDocumentSetupParticipant.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/ExpdefDocumentSetupParticipant.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/ExpdefDocumentSetupParticipant.java	(revision 13)
@@ -0,0 +1,10 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import com.framsticks.framclipse.editors.EditorType;
+
+public class ExpdefDocumentSetupParticipant extends FramclipseDocumentSetupParticipant {
+
+	public ExpdefDocumentSetupParticipant() {
+		super(EditorType.EXPDEF);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramclipseDocumentSetupParticipant.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramclipseDocumentSetupParticipant.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramclipseDocumentSetupParticipant.java	(revision 13)
@@ -0,0 +1,53 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import org.eclipse.core.filebuffers.IDocumentSetupParticipant;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.rules.FastPartitioner;
+import org.jdom.Attribute;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.xpath.XPath;
+
+import com.framsticks.framclipse.Framclipse;
+import com.framsticks.framclipse.editors.EditorType;
+
+
+public class FramclipseDocumentSetupParticipant implements IDocumentSetupParticipant {
+
+	private final EditorType editorType;
+
+	public FramclipseDocumentSetupParticipant(EditorType editorType) {
+		this.editorType = editorType;
+	}
+
+	/*
+	 * @see org.eclipse.core.filebuffers.IDocumentSetupParticipant#setup(org.eclipse.jface.text.IDocument)
+	 */
+	public void setup(IDocument document) {
+		if (document instanceof IDocumentExtension3) {
+			IDocumentExtension3 extension3 = (IDocumentExtension3) document;
+			FramscriptPartitionScanner scanner = Framclipse.getDefault()
+					.getFramscriptPartitionScanner(getCodeFieldName());
+			IDocumentPartitioner partitioner = new FastPartitioner(scanner,
+					FramscriptPartitionScanner.PARTITION_TYPES);
+			extension3.setDocumentPartitioner(Framclipse.FRAMSCRIPT_PARTITIONING, partitioner);
+			partitioner.connect(document);
+		}
+	}
+
+	private String getCodeFieldName() {
+		Document context = Framclipse.getDefault().getFramscriptContext();
+		try {
+			String query = "//file[@pattern='*." + editorType.getExtension() + "']/code";
+			XPath xpath = XPath.newInstance(query);
+			Element code = (Element) xpath.selectSingleNode(context);
+			Attribute codeFieldNameAttribute = code.getAttribute("member");
+			return codeFieldNameAttribute.getValue();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return "";
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramclipseReconcilingStrategy.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramclipseReconcilingStrategy.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramclipseReconcilingStrategy.java	(revision 13)
@@ -0,0 +1,239 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IURIEditorInput;
+
+import com.framsticks.framclipse.editors.FramclipseEditor;
+import com.framsticks.framclipse.editors.folding.FramclipseFoldingAnnotation;
+import com.framsticks.framclipse.internal.parser.ASTCodeSection;
+import com.framsticks.framclipse.internal.parser.ASTFObject;
+import com.framsticks.framclipse.internal.parser.ASTFunction;
+import com.framsticks.framclipse.internal.parser.ASTGlobalInclude;
+import com.framsticks.framclipse.internal.parser.ASTProperty;
+import com.framsticks.framclipse.internal.parser.ElementWithOffset;
+import com.framsticks.framclipse.internal.parser.FramclipseParser;
+import com.framsticks.framclipse.internal.parser.Node;
+
+
+public class FramclipseReconcilingStrategy implements IReconcilingStrategy,
+														IReconcilingStrategyExtension
+{
+
+	FramclipseEditor fEditor = null;
+	private IDocument fDocument;
+	private FramclipseParser parser = new FramclipseParser();
+	
+	protected final ArrayList<Position> fPositions = new ArrayList<Position>();
+	
+	public void reconcile(IRegion partition) {
+		
+		doAll();
+	}
+
+	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+		doAll();
+	}
+
+	public void setDocument(IDocument document) {
+		this.fDocument = document;
+		
+	}
+
+	public FramclipseEditor getEditor() {
+		return fEditor;
+	}
+
+	public void setEditor(FramclipseEditor editor) {
+		fEditor = editor;
+	}
+
+	public void initialReconcile() {
+		System.out.println("initial reconcile...");
+		doAll();
+	}
+
+	public void setProgressMonitor(IProgressMonitor monitor) {
+		
+	}
+	
+	void doAll()
+	{
+		Display.getDefault().syncExec(new Runnable() {
+			
+			public void run() {
+				Object adapter = fEditor.getAdapter(ITextOperationTarget.class);
+				if(adapter instanceof TextViewer)
+				{
+					TextViewer viewer = (TextViewer)adapter;
+					try
+					{
+						viewer.setRedraw(false);
+						
+						parseDocument();
+						fEditor.updateOutlinePage();
+						
+						collectAndUpdateAnnotations();
+					}
+					finally
+					{
+						viewer.setRedraw(true);
+					}
+				}
+			}
+			
+		});
+	
+	}
+	
+	void parseDocument()
+	{
+		
+		URL path = null;
+		final IEditorInput ei = fEditor.getEditorInput();
+		if (ei instanceof IPathEditorInput) {
+			final IPathEditorInput pei = (IPathEditorInput) ei;
+			final IPath p = pei.getPath().makeAbsolute();
+			try {
+				path = p.toFile().toURL();
+			} catch (MalformedURLException e) {
+				path= null;
+			}
+		}   
+		if (ei instanceof IURIEditorInput) {
+			final IURIEditorInput uei = (IURIEditorInput) ei;
+			final URI uri = uei.getURI();
+			try {
+				path = uri.toURL();
+			} catch (MalformedURLException e) {
+				path = null;
+			}			
+		}
+		Node model = parser.parse(fDocument.get(), fEditor.getEditorType(),path);
+		fEditor.setFileModel(model);
+	}
+	
+	void recursiveAddAnnotations(List<FramclipseFoldingAnnotation> annotations, Node element)
+	{
+		if (element instanceof ASTGlobalInclude)
+			return;
+		if(element instanceof ASTFObject ||
+		   element instanceof ASTProperty || 
+		   element instanceof ASTFunction ||
+		   element instanceof ASTCodeSection)
+		{
+			try {
+				ElementWithOffset ewo = (ElementWithOffset)element;
+				/*if(ewo instanceof ASTFObject)
+					System.out.println("adding for " + ((ASTFObject)ewo).getClassName());*/
+				if(fDocument.getLineOfOffset(ewo.getBeginOffset()) != fDocument.getLineOfOffset(ewo.getEndOffset()))
+				{
+					annotations.add(new FramclipseFoldingAnnotation(ewo));
+				}
+				
+			}
+			catch(BadLocationException ex)
+			{
+				
+			}
+			
+		}
+		
+		for(int k = 0; k < element.jjtGetNumChildren(); ++k)
+			recursiveAddAnnotations(annotations, element.jjtGetChild(k));
+	}
+	
+	void collectAndUpdateAnnotations()
+	{
+		Node model = fEditor.getFileModel();
+		
+		if(model != null)
+		{
+			List<FramclipseFoldingAnnotation> annots = new ArrayList<FramclipseFoldingAnnotation>();
+			recursiveAddAnnotations(annots, model);
+			
+			//System.out.println("collected annotations: " + annots.size());
+			
+			fEditor.updateFoldingStructure(annots);	
+		}
+	}
+	
+	/**
+	 * @deprecated
+	 */
+	void scanAll()
+	{
+		fPositions.clear();
+		
+		try
+		{
+			boolean tildeSectionStartFound = false;
+			int tildeStartPos = 0;
+			boolean plainSectionStartFound = false;
+			int plainStartPos = 0;
+			
+			String lineSep = System.getProperty("line.separator");
+			
+			for(int k = 0; k < fDocument.getNumberOfLines(); ++k)
+			{
+				String line = fDocument.get(fDocument.getLineOffset(k), fDocument.getLineLength(k));
+				
+				if(line.matches(".*:( |\\t)*" + lineSep)){
+					if(!tildeSectionStartFound)
+					{
+						plainSectionStartFound = true;
+						plainStartPos = fDocument.getLineOffset(k);
+					}
+				}
+				else if(line.matches(".*~( |\\t)*" + lineSep))
+				{
+					if(!tildeSectionStartFound)
+					{
+						tildeStartPos = fDocument.getLineOffset(k);
+						tildeSectionStartFound = true;
+					}
+					else
+					{
+						fPositions.add(new Position(tildeStartPos, fDocument.getLineOffset(k) + fDocument.getLineLength(k) - tildeStartPos));
+						tildeSectionStartFound = false;
+					}
+				}
+				else if(line.matches("( |\\t)*" + lineSep))
+				{
+					if(plainSectionStartFound)
+					{
+						if(!tildeSectionStartFound)
+						{
+							plainSectionStartFound = false;
+							fPositions.add(new Position(plainStartPos, fDocument.getLineOffset(k) - plainStartPos));
+						}
+					}
+				}
+			}
+		}
+		catch(Exception e)
+		{
+			e.printStackTrace();
+		}
+	
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptDocumentSetupParticipant.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptDocumentSetupParticipant.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptDocumentSetupParticipant.java	(revision 13)
@@ -0,0 +1,10 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import com.framsticks.framclipse.editors.EditorType;
+
+public class FramscriptDocumentSetupParticipant extends FramclipseDocumentSetupParticipant {
+
+	public FramscriptDocumentSetupParticipant() {
+		super(EditorType.FRAMSCRIPT);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptPartitionScanner.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptPartitionScanner.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptPartitionScanner.java	(revision 13)
@@ -0,0 +1,38 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.rules.EndOfLineRule;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.MultiLineRule;
+import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
+import org.eclipse.jface.text.rules.Token;
+
+public class FramscriptPartitionScanner extends RuleBasedPartitionScanner {
+	public final static String CODE = "__framscript_code";
+	public final static String DESCRIPTION = "__framscript_description";
+	public final static String UNDEFINED = "__framscript_undefined";
+	
+	public final static String COMMENT = "__framscript_comment";
+
+	public final static String[] PARTITION_TYPES = new String[] { CODE, DESCRIPTION, UNDEFINED, COMMENT};
+
+	public FramscriptPartitionScanner(String codeFileName) {
+		IToken code = new Token(CODE);
+		IToken description = new Token(DESCRIPTION);
+		IToken comment = new Token(COMMENT);
+
+		List<IPredicateRule> rules = new ArrayList<IPredicateRule>();
+		rules.add(new MultiLineRule(codeFileName + ":~", "~", code, '\\', false));
+		rules.add(new MultiLineRule(":~", "~", description, '\\', false));
+		rules.add(new EndOfLineRule(":", new Token(UNDEFINED)));
+		rules.add(new EndOfLineRule("#", comment));
+
+		IPredicateRule[] result = new IPredicateRule[rules.size()];
+		result = rules.toArray(result);
+		setPredicateRules(result);
+		setDefaultReturnToken(new Token(UNDEFINED));
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptSourceViewerConfiguration.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptSourceViewerConfiguration.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/FramscriptSourceViewerConfiguration.java	(revision 13)
@@ -0,0 +1,237 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.MonoReconciler;
+import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.ITokenScanner;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.swt.graphics.Color;
+import org.jdom.Attribute;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.xpath.XPath;
+
+import com.framsticks.framclipse.Framclipse;
+import com.framsticks.framclipse.editors.EditorType;
+import com.framsticks.framclipse.editors.FramclipseEditor;
+import com.framsticks.framclipse.editors.codeCompletion.FramscriptCompletionProcessor;
+import com.framsticks.framclipse.editors.codeCompletion.PropertyCompletionProcessor;
+import com.framsticks.framclipse.editors.codeCompletion.SyntaxUtils;
+import com.framsticks.framclipse.editors.hover.FramscriptTextHover;
+import com.framsticks.framclipse.syntaxColoring.ColorManager;
+import com.framsticks.framclipse.syntaxColoring.FramclipseColors;
+import com.framsticks.framclipse.syntaxColoring.FramclipseCommentScanner;
+import com.framsticks.framclipse.syntaxColoring.FramscriptCodeScanner;
+
+
+public class FramscriptSourceViewerConfiguration extends SourceViewerConfiguration {
+
+	private FramscriptCodeScanner codeScanner;
+	private final EditorType editorType;
+	private FramclipseEditor editor;
+
+	public FramscriptSourceViewerConfiguration(EditorType editorType, FramclipseEditor editor) {
+		System.out.println("creating sourceViewerConfiguration for type: " + editorType);
+		this.editorType = editorType;
+		this.editor = editor;
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// code highlighting
+	// ///////////////////////////////////////////////////////////////////////
+
+	@Override
+	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+		return new String[] { IDocument.DEFAULT_CONTENT_TYPE, FramscriptPartitionScanner.CODE };
+	}
+
+	protected ITokenScanner getFramscriptCodeScanner() {
+		ColorManager cm = Framclipse.getDefault().getColorManager();
+		if (codeScanner == null) {
+			codeScanner = new FramscriptCodeScanner();
+			Color defaultColor = cm.getColor(FramclipseColors.DEFAULT);
+			TextAttribute textAttribute = new TextAttribute(defaultColor);
+			Token defaultToken = new Token(textAttribute);
+			codeScanner.setDefaultReturnToken(defaultToken);
+		}
+		return codeScanner;
+	}
+	
+	private ITokenScanner commentScanner = null;
+	
+	protected ITokenScanner getCommentScanner()
+	{
+		if(commentScanner == null)
+			commentScanner = new FramclipseCommentScanner();
+		
+		return commentScanner;
+	}
+
+	@Override
+	public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer) {
+		return Framclipse.FRAMSCRIPT_PARTITIONING;
+	}
+
+	@Override
+	public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+		PresentationReconciler reconciler = new PresentationReconciler();
+		String partitioning = getConfiguredDocumentPartitioning(sourceViewer);
+		reconciler.setDocumentPartitioning(partitioning);
+
+		DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getFramscriptCodeScanner());
+		reconciler.setDamager(dr, FramscriptPartitionScanner.CODE);
+		reconciler.setRepairer(dr, FramscriptPartitionScanner.CODE);
+
+		ColorManager colorManager = Framclipse.getDefault().getColorManager();
+		Color color = colorManager.getColor(FramclipseColors.DESCRIPTION);
+		dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(color)));
+		reconciler.setDamager(dr, FramscriptPartitionScanner.DESCRIPTION);
+		reconciler.setRepairer(dr, FramscriptPartitionScanner.DESCRIPTION);
+
+		color = colorManager.getColor(FramclipseColors.DEFAULT);
+		dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(color)));
+		reconciler.setDamager(dr, FramscriptPartitionScanner.UNDEFINED);
+		reconciler.setRepairer(dr, FramscriptPartitionScanner.UNDEFINED);
+		reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+		reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+		
+		//colorManager = Framclipse.getDefault().getColorManager();
+		//color = colorManager.getColor(FramclipseColors.COMMENT);
+		//dr = new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(color)));
+		dr = new DefaultDamagerRepairer(getCommentScanner());
+		reconciler.setDamager(dr, FramscriptPartitionScanner.COMMENT);
+		reconciler.setRepairer(dr, FramscriptPartitionScanner.COMMENT);
+
+		return reconciler;
+	}
+
+	static class SingleTokenScanner extends BufferedRuleBasedScanner {
+		public SingleTokenScanner(TextAttribute attribute) {
+			setDefaultReturnToken(new Token(attribute));
+		}
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// content assist
+	// ///////////////////////////////////////////////////////////////////////
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+
+		ContentAssistant assistant = new ContentAssistant();
+		String partitioning = getConfiguredDocumentPartitioning(sourceViewer);
+		assistant.setDocumentPartitioning(partitioning);
+
+		Set<String> contexts = new HashSet<String>();
+		Document framscriptContext = Framclipse.getDefault().getFramscriptContext();
+		try {
+			String query = "//file[@pattern='*." + editorType.getExtension() + "']/code/context";
+			XPath xpath = XPath.newInstance(query);
+			List<Element> list = xpath.selectNodes(framscriptContext);
+			for (Element element : list) {
+				Attribute name = element.getAttribute(SyntaxUtils.NAME_ATTRIBUTE);
+				contexts.add(name.getValue());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		FramscriptCompletionProcessor framscriptCompletionProcessor = new FramscriptCompletionProcessor(
+				contexts,editor,editorType);
+		assistant.setContentAssistProcessor(framscriptCompletionProcessor,
+				FramscriptPartitionScanner.CODE);
+
+		PropertyCompletionProcessor propertyCompletionProcessor = getPropertyCompletionProcessor(
+				contexts, framscriptContext);
+		assistant.setContentAssistProcessor(propertyCompletionProcessor,
+				IDocument.DEFAULT_CONTENT_TYPE);
+
+		assistant.enableAutoActivation(true);
+		assistant.setAutoActivationDelay(500);
+		int orientation = IContentAssistant.PROPOSAL_OVERLAY;
+		assistant.setProposalPopupOrientation(orientation);
+		orientation = IContentAssistant.CONTEXT_INFO_ABOVE;
+		assistant.setContextInformationPopupOrientation(orientation);
+
+		return assistant;
+	}
+
+	@SuppressWarnings("unchecked")
+	private PropertyCompletionProcessor getPropertyCompletionProcessor(Set<String> contexts,
+			Document framscriptContext) {
+
+		Map<String, String> propertyTypes = new HashMap<String, String>();
+		try {
+			String query = "//file[@pattern='*." + editorType.getExtension() + "']/property";
+			XPath xpath = XPath.newInstance(query);
+			List<Element> list = xpath.selectNodes(framscriptContext);
+			for (Element element : list) {
+				Attribute name = element.getAttribute(SyntaxUtils.NAME_ATTRIBUTE);
+				Attribute type = element.getAttribute(SyntaxUtils.TYPE_ATTRIBUTE);
+				propertyTypes.put(type.getValue(), name.getValue());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		Set<String> objectContexts = new HashSet<String>();
+		try {
+			String query = "//file[@pattern='*." + editorType.getExtension() + "']/object";
+			XPath xpath = XPath.newInstance(query);
+			List<Element> list = xpath.selectNodes(framscriptContext);
+			for (Element element : list) {
+				Attribute context = element.getAttribute(SyntaxUtils.CONTEXT_ATTRIBUTE);
+				objectContexts.add(context.getValue());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		PropertyCompletionProcessor propertyCompletionProcessor = new PropertyCompletionProcessor(
+				contexts, objectContexts, propertyTypes);
+		return propertyCompletionProcessor;
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// text hover
+	// ///////////////////////////////////////////////////////////////////////
+
+	@Override
+	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
+		if (FramscriptPartitionScanner.CODE.equals(contentType)) {
+			return new FramscriptTextHover();
+		}
+		return null;
+	}
+
+	@Override
+	public IReconciler getReconciler(ISourceViewer sourceViewer) {
+		FramclipseReconcilingStrategy strategy = new FramclipseReconcilingStrategy();
+		strategy.setEditor(editor);
+		
+		MonoReconciler reconciler = new MonoReconciler(strategy,false);
+		
+        
+        return reconciler;
+	}
+	
+	
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/NeuroDocumentSetupParticipant.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/NeuroDocumentSetupParticipant.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/NeuroDocumentSetupParticipant.java	(revision 13)
@@ -0,0 +1,10 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import com.framsticks.framclipse.editors.EditorType;
+
+public class NeuroDocumentSetupParticipant extends FramclipseDocumentSetupParticipant {
+
+	public NeuroDocumentSetupParticipant() {
+		super(EditorType.NEURO);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/ShowDocumentSetupParticipant.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/ShowDocumentSetupParticipant.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/ShowDocumentSetupParticipant.java	(revision 13)
@@ -0,0 +1,10 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import com.framsticks.framclipse.editors.EditorType;
+
+public class ShowDocumentSetupParticipant extends FramclipseDocumentSetupParticipant {
+
+	public ShowDocumentSetupParticipant() {
+		super(EditorType.SHOW);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/StyleDocumentSetupParticipant.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/StyleDocumentSetupParticipant.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/configuration/StyleDocumentSetupParticipant.java	(revision 13)
@@ -0,0 +1,10 @@
+package com.framsticks.framclipse.editors.configuration;
+
+import com.framsticks.framclipse.editors.EditorType;
+
+public class StyleDocumentSetupParticipant extends FramclipseDocumentSetupParticipant {
+
+	public StyleDocumentSetupParticipant() {
+		super(EditorType.STYLE);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/folding/FramclipseFoldingAnnotation.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/folding/FramclipseFoldingAnnotation.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/folding/FramclipseFoldingAnnotation.java	(revision 13)
@@ -0,0 +1,60 @@
+package com.framsticks.framclipse.editors.folding;
+
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+
+import com.framsticks.framclipse.internal.parser.ASTCodeSection;
+import com.framsticks.framclipse.internal.parser.ASTFunction;
+import com.framsticks.framclipse.internal.parser.ASTProperty;
+import com.framsticks.framclipse.internal.parser.ElementWithOffset;
+
+
+public class FramclipseFoldingAnnotation extends ProjectionAnnotation 
+{
+	ElementWithOffset annotatedElement;
+	
+	public FramclipseFoldingAnnotation(ElementWithOffset element)
+	{
+		this.annotatedElement = element;
+	}
+	
+	public ElementWithOffset getAnnotatedElement()
+	{
+		return annotatedElement;
+	}
+	
+	public int getAnnotationLength()
+	{
+		int defaultLen = annotatedElement.getEndOffset() - annotatedElement.getBeginOffset() + 1;
+		
+		int lineSepLen = System.getProperty("line.separator").length();
+		
+		if(annotatedElement instanceof ASTFunction)
+			return defaultLen + lineSepLen;
+		
+		if(annotatedElement instanceof ASTProperty)
+			return defaultLen + lineSepLen;
+		
+		if(annotatedElement instanceof ASTCodeSection)
+			return defaultLen + lineSepLen;
+		
+		return defaultLen;
+	}
+	
+	public boolean isEquivalent(FramclipseFoldingAnnotation annot, IDocument doc)
+	{
+		return annotatedElement.isEquivalent(annot.annotatedElement, doc);
+			
+	}
+	
+	public FramclipseFoldingAnnotation hasEquivalent(List<FramclipseFoldingAnnotation> list, IDocument doc)
+	{
+		for(FramclipseFoldingAnnotation annot : list)
+			if(annot.isEquivalent(this, doc))
+				return annot;
+		
+		return null;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/hover/FramscriptTextHover.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/hover/FramscriptTextHover.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/hover/FramscriptTextHover.java	(revision 13)
@@ -0,0 +1,178 @@
+package com.framsticks.framclipse.editors.hover;
+
+import java.util.List;
+
+import org.eclipse.jface.internal.text.html.BrowserInformationControl;
+import org.eclipse.jface.internal.text.html.HTMLTextPresenter;
+import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IInformationControlExtension4;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.information.IInformationProviderExtension2;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.xpath.XPath;
+
+import com.framsticks.framclipse.Framclipse;
+import com.framsticks.framclipse.editors.codeCompletion.SyntaxUtils;
+
+
+public class FramscriptTextHover implements ITextHover, ITextHoverExtension, IInformationProviderExtension2 {
+	
+	private static final class PresenterControlCreator extends AbstractReusableInformationControlCreator {
+
+		public IInformationControl doCreateInformationControl(Shell parent) {
+			int shellStyle= SWT.RESIZE | SWT.TOOL;
+			int style= SWT.V_SCROLL | SWT.H_SCROLL;
+			if (BrowserInformationControl.isAvailable(parent))
+				return new BrowserInformationControl(parent, shellStyle, style);
+			else
+				return new DefaultInformationControl(parent, shellStyle, style, new HTMLTextPresenter(false));
+		}
+	}
+
+	private static final class HoverControlCreator extends AbstractReusableInformationControlCreator {
+		
+		public IInformationControl doCreateInformationControl(Shell parent) {
+			if (BrowserInformationControl.isAvailable(parent))
+				return new BrowserInformationControl(parent, SWT.TOOL | SWT.NO_TRIM, SWT.NONE, EditorsUI.getTooltipAffordanceString());
+			else
+				return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(true), EditorsUI.getTooltipAffordanceString());
+		}
+
+		/*
+		 * @see org.eclipse.jdt.internal.ui.text.java.hover.AbstractReusableInformationControlCreator#canReuse(org.eclipse.jface.text.IInformationControl)
+		 */
+		public boolean canReuse(IInformationControl control) {
+			if (!super.canReuse(control))
+				return false;
+			
+			if (control instanceof IInformationControlExtension4)
+				((IInformationControlExtension4)control).setStatusText(EditorsUI.getTooltipAffordanceString());
+			
+			return true;
+		}
+	}
+
+
+
+	private static final int DESCRIPTION_LENGTH = 60;
+	
+	private IInformationControlCreator fHoverControlCreator;
+	
+	private IInformationControlCreator fPresenterControlCreator;
+	
+	public IInformationControlCreator getInformationPresenterControlCreator() {
+		if (fPresenterControlCreator == null)
+			fPresenterControlCreator= new PresenterControlCreator();
+		return fPresenterControlCreator;
+	}
+
+	public IInformationControlCreator getHoverControlCreator() {
+		if (fHoverControlCreator == null)
+			fHoverControlCreator= new HoverControlCreator();
+		return fHoverControlCreator;
+	}
+
+	public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+		int offset = hoverRegion.getOffset() + hoverRegion.getLength();
+		IDocument document = textViewer.getDocument();
+
+		List<String> elements = SyntaxUtils.getElementsAt(document, offset);
+
+		if (elements.size() == 0) {
+			return null;
+		}
+
+		String name = elements.remove(elements.size() - 1);
+		String elementFormat = "%s[@" + SyntaxUtils.NAME_ATTRIBUTE + "='%s']/";
+		String query = SyntaxUtils.ROOT + "/";
+
+		if (elements.size() == 0) {
+			query += String.format(elementFormat, SyntaxUtils.TYPE_ELEMENT, name);
+		} else { // elements.size() > 1
+			String parent;
+			try {
+				parent = SyntaxUtils.getLastElementType(elements);
+			} catch (JDOMException e) {
+				e.printStackTrace();
+				return null;
+			}
+			query += String.format(elementFormat, SyntaxUtils.TYPE_ELEMENT, parent)
+					+ String.format(elementFormat, SyntaxUtils.ELEMENT_ELEMENT, name);
+		}
+		query += SyntaxUtils.DESCRIPTION_ELEMENT;
+
+		Document syntax = Framclipse.getDefault().getFramscriptSyntax();
+		try {
+			XPath xpath = XPath.newInstance(query);
+			Element element = (Element) xpath.selectSingleNode(syntax);
+			if (element == null) {
+				return null;
+			}
+
+			return formatDescription(element.getValue());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return null;
+	}
+
+	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
+		IDocument document = textViewer.getDocument();
+		String after = SyntaxUtils.getElementAfter(document, offset);
+
+		int line = 0;
+		try {
+			line = document.getLineOfOffset(offset);
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+
+		int lineStart = offset;
+		try {
+			lineStart = document.getLineInformation(line).getOffset();
+		} catch (BadLocationException e) {
+			e.printStackTrace();
+		}
+		IRegion region = new Region(lineStart, offset + after.length() - lineStart);
+
+		return region;
+	}
+
+	private static String formatDescription(String description) {
+		String result = "";
+		int offset = 0;
+		while (offset < description.length()) {
+			int length = DESCRIPTION_LENGTH;
+			if (offset + length > description.length()) {
+				result += description.substring(offset);
+				return result;
+			}
+
+			for (int i = length; i > 0; i--) {
+				if (Character.isWhitespace(description.charAt(offset + i))) {
+					length = i;
+					i = 0;
+				}
+			}
+
+			result += description.substring(offset, offset + length) + "\n";
+			offset += length + 1;
+		}
+		return result;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlineContentProvider.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlineContentProvider.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlineContentProvider.java	(revision 13)
@@ -0,0 +1,162 @@
+package com.framsticks.framclipse.editors.outline;
+
+import java.util.List;
+
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DefaultPositionUpdater;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IPositionUpdater;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.framsticks.framclipse.editors.FramclipseEditor;
+import com.framsticks.framclipse.internal.parser.ASTFunction;
+import com.framsticks.framclipse.internal.parser.ASTGlobalDecl;
+import com.framsticks.framclipse.internal.parser.ASTIdentList;
+import com.framsticks.framclipse.internal.parser.Node;
+
+
+public class FramclipseEditorOutlineContentProvider implements ITreeContentProvider
+{
+	private Node root;
+	private FramclipseEditor editor;
+
+	protected final static String FRAMCLIPSE_ELEM_POSITIONS = "__framclipse_elem_positions";
+	protected IPositionUpdater positionUpdater = new DefaultPositionUpdater(FRAMCLIPSE_ELEM_POSITIONS);
+	
+	public FramclipseEditorOutlineContentProvider(FramclipseEditor framsEditor)
+	{
+		this.editor = framsEditor;
+	}
+	
+	public Object[] getChildren(Object parentElement) {
+		
+		if(parentElement instanceof Node)
+		{
+			Node node = (Node)parentElement;
+			
+			if(node instanceof ASTFunction)
+			{
+				if(node.jjtGetNumChildren() > 1)
+				{
+					ASTIdentList params = (ASTIdentList) node.jjtGetChild(1);
+					List<String> names = params.getIdents();
+					
+					Node[] children = new Node[names.size()];
+					
+					for(int l = 0; l < names.size(); ++l)
+						children[l] = new IdentifierNode(names.get(l), "Parameter", node);
+					
+					return children;
+				}
+				return new Object[0];
+			}
+			if(node instanceof ASTGlobalDecl)
+			{
+				if(node.jjtGetNumChildren() > 0)
+				{
+					ASTIdentList params = (ASTIdentList) node.jjtGetChild(0);
+					List<String> names = params.getIdents();
+					
+					Node[] children = new Node[names.size()];
+					
+					for(int l = 0; l < names.size(); ++l)
+						children[l] = new IdentifierNode(names.get(l), "Variable", node);
+					
+					return children;
+				}
+				return new Object[0];
+			}
+			
+			if(node.jjtGetNumChildren() > 0)
+			{
+				Node[] children = new Node[node.jjtGetNumChildren()];
+				
+				for(int k = 0; k < node.jjtGetNumChildren(); ++k)
+					children[k] = node.jjtGetChild(k);
+				
+				return children;
+			}
+		}
+		
+
+		return new Object[0];
+	}
+
+	public Object getParent(Object element) {
+
+		if(element instanceof Node)
+		{
+			return ((Node)element).jjtGetParent();
+		}
+		return null;
+	}
+
+	public boolean hasChildren(Object element) {
+		
+		if(element instanceof Node)
+		{
+			if(element instanceof ASTFunction)
+			{
+				return ((Node)element).jjtGetNumChildren() > 1;
+			}
+			
+			return ((Node)element).jjtGetNumChildren() > 0;
+		}
+		
+		return false;
+	}
+
+	public Object[] getElements(Object inputElement) {
+		if (root == null)
+			return new Object[0];
+		if(root.jjtGetNumChildren() > 0)
+		{
+			Node[] children = new Node[root.jjtGetNumChildren()];
+			
+			for(int k = 0; k < root.jjtGetNumChildren(); ++k)
+				children[k] = root.jjtGetChild(k);
+			
+			return children;
+		}
+		
+		return new Object[0];
+	}
+
+	public void dispose() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		if (oldInput != null)
+		{
+			IDocument document = editor.getDocumentProvider().getDocument(oldInput);
+			if (document != null)
+			{
+				try
+				{
+					document.removePositionCategory(FRAMCLIPSE_ELEM_POSITIONS);
+				}
+				catch (BadPositionCategoryException x)
+				{
+				}
+				document.removePositionUpdater(positionUpdater);
+			}
+		}
+		
+		root =  (Node) newInput;
+
+		if (newInput != null)
+		{
+			IDocument document = editor.getDocumentProvider().getDocument(newInput);
+			if (document != null)
+			{
+				document.addPositionCategory(FRAMCLIPSE_ELEM_POSITIONS);
+				document.addPositionUpdater(positionUpdater);
+				
+			}
+		}
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlineLabelProvider.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlineLabelProvider.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlineLabelProvider.java	(revision 13)
@@ -0,0 +1,82 @@
+package com.framsticks.framclipse.editors.outline;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.swt.graphics.Image;
+
+import com.framsticks.framclipse.internal.parser.ASTFObject;
+import com.framsticks.framclipse.internal.parser.Node;
+
+
+public class FramclipseEditorOutlineLabelProvider implements ILabelProvider 
+{
+
+	IDocument fDocument;
+	
+	public FramclipseEditorOutlineLabelProvider(IDocument doc)
+	{
+		this.fDocument = doc;
+	}
+	
+	public Image getImage(Object element) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public String getText(Object element) {
+		
+//		if(element instanceof ASTFObject)
+//		{
+//			ASTFObject obj = (ASTFObject)element;
+//			IRegion reg = obj.getIdRegion();
+//			
+//			String prefix = "?";
+//			
+//			try
+//			{
+//				if(reg != null)
+//				{
+//					prefix = fDocument.get(reg.getOffset(), reg.getLength());
+//					prefix = prefix.substring(prefix.indexOf(':') + 1);
+//				}
+//			}
+//			catch(BadLocationException ex)
+//			{
+//				
+//			}
+//			
+//			String returnVal = prefix + " - " + obj.getClassName() + " : Object"; 
+//			
+//			return returnVal;
+//		}
+		
+		if(element instanceof Node)
+			return element.toString();
+		
+		return null;
+	}
+
+	public void addListener(ILabelProviderListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void dispose() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public boolean isLabelProperty(Object element, String property) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	public void removeListener(ILabelProviderListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlinePage.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlinePage.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/FramclipseEditorOutlinePage.java	(revision 13)
@@ -0,0 +1,162 @@
+package com.framsticks.framclipse.editors.outline;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+import com.framsticks.framclipse.editors.FramclipseEditor;
+import com.framsticks.framclipse.internal.parser.ElementWithOffset;
+import com.framsticks.framclipse.internal.parser.Node;
+
+
+public class FramclipseEditorOutlinePage extends ContentOutlinePage
+{
+	private FramclipseEditor editor;
+	private Object input;
+	private FramclipseEditorOutlineContentProvider contentProvider;
+	private FramclipseEditorOutlineLabelProvider labelProvider;
+	
+	boolean flag = false;
+	
+	public FramclipseEditorOutlinePage(FramclipseEditor editor)
+	{
+		super();
+		this.editor = editor;
+	}
+
+	@Override
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+		TreeViewer viewer = getTreeViewer();
+		contentProvider = new FramclipseEditorOutlineContentProvider(editor);
+		viewer.setContentProvider(contentProvider);
+		labelProvider = new FramclipseEditorOutlineLabelProvider(editor.getDocumentProvider().
+				getDocument(editor.getEditorInput()));
+		viewer.setLabelProvider(labelProvider);
+		viewer.addSelectionChangedListener(this);
+
+		//control is created after input is set
+		if (input != null)
+			viewer.setInput(input);
+	}
+	
+	public void setInput(Object input)
+	{
+		this.input = input;
+		update();
+	}
+	
+	public void update()
+	{
+		if(Display.getCurrent() != null)
+		{
+			Display.getCurrent().asyncExec(new Runnable() {
+
+				public void run() {
+					
+					TreeViewer viewer = getTreeViewer();
+
+					if (viewer != null)
+					{
+						Control control = viewer.getControl();
+						if (control != null && !control.isDisposed())
+						{
+							control.setRedraw(false);
+							viewer.setInput(input);
+							viewer.expandAll();
+							control.setRedraw(true);
+						}
+					}
+
+				}
+				
+			});
+		}
+	}
+	
+	ElementWithOffset getAncestorWithOffset(Node node)
+	{
+		if(node instanceof ElementWithOffset)
+			return (ElementWithOffset)node;
+		
+		if(node.jjtGetParent() != null)
+		{
+			return getAncestorWithOffset(node.jjtGetParent());
+		}
+		
+		return null;
+	}
+
+	@Override
+	public void selectionChanged(SelectionChangedEvent event) {
+		super.selectionChanged(event);
+		//find out which item in tree viewer we have selected, and set highlight range accordingly
+		
+		if(flag)
+		{
+			flag = false;
+			return;
+		}
+
+		ISelection selection = event.getSelection();
+		if (!selection.isEmpty())
+		{
+			Node element = (Node)((IStructuredSelection) selection).getFirstElement();
+			
+			ElementWithOffset ancestor = getAncestorWithOffset(element);
+			
+			int start = ancestor.getBeginOffset();
+			int len = ancestor.getEndOffset() - ancestor.getBeginOffset() + 1;
+
+			try
+			{
+				editor.setHighlightRange(start, len, true);
+				//editor.getSelectionProvider().setSelection(new TextSelection(start, len));
+			}
+			catch (IllegalArgumentException x)
+			{
+				editor.resetHighlightRange();
+			}
+		}
+		else
+		{
+			editor.resetHighlightRange();
+		}
+	}
+	
+	public void setSelectedElement(Node element)
+	{
+		if(element != null)
+		{
+			flag = true;
+			getTreeViewer().setSelection(new StructuredSelection(element), true);
+			
+			ElementWithOffset ancestor = getAncestorWithOffset(element);
+			
+			int start = ancestor.getBeginOffset();
+			int len = ancestor.getEndOffset() - ancestor.getBeginOffset() + 1;
+
+			try
+			{
+				editor.setHighlightRange(start, len, false);
+				//editor.getSelectionProvider().setSelection(new TextSelection(start, len));
+			}
+			catch (IllegalArgumentException x)
+			{
+				editor.resetHighlightRange();
+			}
+
+		}
+		else
+		{
+			editor.resetHighlightRange();
+		}
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/IdentifierNode.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/IdentifierNode.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/editors/outline/IdentifierNode.java	(revision 13)
@@ -0,0 +1,57 @@
+package com.framsticks.framclipse.editors.outline;
+
+import com.framsticks.framclipse.internal.parser.Node;
+
+public class IdentifierNode implements Node {
+	
+	Node parent;
+	String identifier;
+	String type;
+	
+	public IdentifierNode(String id, String nodeType, Node parent)
+	{
+		this.identifier = id;
+		this.type = nodeType;
+		this.parent = parent;
+	}
+
+	public void jjtAddChild(Node n, int i) {
+		
+	}
+
+	public void jjtClose() {
+		
+
+	}
+
+	public Node jjtGetChild(int i) {
+		
+		return null;
+	}
+
+	public int jjtGetNumChildren() {
+		
+		return 0;
+	}
+
+	public Node jjtGetParent() {
+		return parent;
+	}
+
+	public void jjtOpen() {
+
+	}
+
+	public void jjtSetParent(Node n) {
+		this.parent = n;
+
+	}
+
+	@Override
+	public String toString() {
+		return identifier + ": " + type;
+	}
+	
+	
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTCodeSection.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTCodeSection.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTCodeSection.java	(revision 13)
@@ -0,0 +1,21 @@
+/* Generated By:JJTree: Do not edit this line. ASTCodeSection.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+
+public class ASTCodeSection extends ElementWithOffset {
+  public ASTCodeSection(int id) {
+    super(id);
+  }
+
+  public ASTCodeSection(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+
+@Override
+public String toString() {
+	return "Code";
+}
+
+  
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTComment.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTComment.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTComment.java	(revision 13)
@@ -0,0 +1,21 @@
+/* Generated By:JJTree: Do not edit this line. ASTComment.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+public class ASTComment extends ElementWithOffset {
+  public ASTComment(int id) {
+    super(id);
+  }
+
+  public ASTComment(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+
+@Override
+public String toString() {
+	
+	return "Comment";
+}
+
+  
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFObject.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFObject.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFObject.java	(revision 13)
@@ -0,0 +1,101 @@
+/* Generated By:JJTree: Do not edit this line. ASTFObject.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Region;
+
+
+public class ASTFObject extends ElementWithOffset {
+	
+	private String className = "N/A";
+	
+	public ASTFObject(int id) {
+	    super(id);
+	}
+	
+	public ASTFObject(FramclipseNonScriptParser p, int id) {
+	    super(p, id);
+	}
+	
+	@Override
+	public String toString() {		
+		String id = "";
+		for (Node child : children)  
+		{
+			if(child  instanceof ASTProperty)
+			{
+				ASTProperty prop = (ASTProperty)child ; 
+				String name = prop.getName(); 
+				if ("id".equalsIgnoreCase(name))
+					id = prop.getValue()+" : ";
+			}
+		}
+		return id+className;
+	}
+
+	public String getClassName() {
+		return className;
+	}
+
+	public void setClassName(String className) {
+		this.className = className;
+	}
+  
+	public IRegion getIdRegion()
+	{		
+		if(children != null)
+		{
+			for (Node child : children)  
+			{
+				if(child  instanceof ASTProperty)
+				{
+					ASTProperty prop = (ASTProperty)child ; 
+					String name = prop.getName(); 
+					if(name != null && name.toLowerCase().equals("id") )
+					{
+						return new Region(prop.getBeginOffset(), prop.getEndOffset() - prop.getBeginOffset() + 1); 
+					}
+				}
+			}
+		}
+		
+		return null;
+	}
+
+	@Override
+	public boolean isEquivalent(ElementWithOffset element, IDocument document) {
+		
+		if(!(element instanceof ASTFObject))
+			return false;
+		
+		ASTFObject obj = ((ASTFObject)element);
+		
+		if(!(getClassName().equals(obj.getClassName())))
+			return false;
+		
+		IRegion reg1 = getIdRegion();
+		IRegion reg2 = obj.getIdRegion();
+		
+		if(reg1 != null && reg2 == null || reg1 == null && reg2 != null)
+			return false;
+		
+		if(reg1 != null && reg2 != null)
+		{
+			try
+			{
+				if(!document.get(reg1.getOffset(), reg1.getLength()).equals(document.get(reg2.getOffset(), reg2.getLength())))
+					return false;
+			}
+			catch(Exception ex)
+			{
+				
+			}
+		}
+		
+		return super.isEquivalent(element, document);
+	}
+
+	
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFramclipseFile.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFramclipseFile.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFramclipseFile.java	(revision 13)
@@ -0,0 +1,15 @@
+/* Generated By:JJTree: Do not edit this line. ASTFramclipseFile.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+public class ASTFramclipseFile extends ElementWithOffset {
+	
+  public ASTFramclipseFile(int id) {
+    super(id);
+  }
+
+  public ASTFramclipseFile(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFunction.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFunction.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTFunction.java	(revision 13)
@@ -0,0 +1,76 @@
+/* Generated By:JJTree: Do not edit this line. ASTFunction.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+
+public class ASTFunction extends ElementWithOffset {
+
+  public ASTFunction(int id) {
+    super(id);
+  }
+
+  public ASTFunction(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+  
+  public String getPrimaryName()
+  {
+	  if(this.children != null && this.children.length > 0 && this.children[0] instanceof ASTIdentList)
+	  {
+		  List<String> aliases = ((ASTIdentList)children[0]).getIdents(); 
+		  if(aliases.size() > 0)
+			  return aliases.get(0);
+	  }
+	  
+	  return "[unnamed]";
+  }
+  
+  public int getNumArguments()
+  {
+	  if(this.children != null && this.children.length > 1 && this.children[1] instanceof ASTIdentList)
+	  {
+		  return ((ASTIdentList)children[1]).getIdents().size();
+	  }
+
+	  return 0;
+  }
+  
+	@Override
+	public String toString() {
+		return getPrimaryName() + ": Function"; // [" + getNumArguments() + "]";
+	}
+
+	@Override
+	public boolean isEquivalent(ElementWithOffset element, IDocument document) {
+		if(!(element instanceof ASTFunction))
+			return false;
+		
+		if(getEndOffset() - getBeginOffset() != element.getEndOffset() - element.getBeginOffset())
+			return false;
+		
+		ASTFunction func = (ASTFunction)element;
+		
+		if(func.getNumArguments() != getNumArguments())
+			return false;
+		
+		if(jjtGetNumChildren() != func.jjtGetNumChildren())
+			return false;
+		
+		if(jjtGetNumChildren() > 0)
+		{
+			List<String> ownAliases = ((ASTIdentList)children[0]).getIdents();
+			List<String> otherAliases = ((ASTIdentList)func.children[0]).getIdents();
+			
+			if(!ownAliases.equals(otherAliases))
+				return false;
+		}
+		
+		return true;
+	}
+	
+	
+  
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTGlobalDecl.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTGlobalDecl.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTGlobalDecl.java	(revision 13)
@@ -0,0 +1,37 @@
+/* Generated By:JJTree: Do not edit this line. ASTGlobalDecl.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+import java.util.List;
+
+import org.eclipse.jface.text.IDocument;
+
+
+public class ASTGlobalDecl extends ElementWithOffset {
+  public ASTGlobalDecl(int id) {
+    super(id);
+  }
+
+	public ASTGlobalDecl(FramclipseNonScriptParser p, int id) {
+	    super(p, id);
+	}
+
+	@Override
+	public String toString() {
+		return "Global Variables";
+	}
+	
+	@Override
+	public boolean isEquivalent(ElementWithOffset element, IDocument document) {
+		
+		if(!super.isEquivalent(element, document))
+			return false;
+		List<String> vars1 = ((ASTIdentList)children[0]).getIdents();
+		List<String> vars2 = ((ASTIdentList)element.children[0]).getIdents();
+		
+		if(!(vars1.equals(vars2)))
+			return false;
+		return true;
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTGlobalInclude.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTGlobalInclude.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTGlobalInclude.java	(revision 13)
@@ -0,0 +1,52 @@
+/* Generated By:JJTree: Do not edit this line. ASTGlobalInclude.java Version 4.1 */
+/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.framsticks.framclipse.internal.parser;
+
+import org.eclipse.jface.text.IDocument;
+
+public class ASTGlobalInclude extends ElementWithOffset {
+	protected String fileName = "N/A";
+	protected boolean valid = true;
+
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName.replaceAll("\"", "");
+	}
+
+	public boolean isValid() {
+		return valid;
+	}
+
+	public void setValid(boolean valid) {
+		this.valid = valid;
+	}
+
+	public ASTGlobalInclude(int id) {
+		super(id);
+	}
+
+	public ASTGlobalInclude(FramclipseNonScriptParser p, int id) {
+		super(p, id);
+	}
+	@Override
+	public String toString() {
+		String string = fileName +  ": Included file";
+		if (!valid) string += " (invalid)";
+		return string;
+	}
+
+	@Override
+	public boolean isEquivalent(ElementWithOffset element, IDocument document) {
+		
+		if(!(element instanceof ASTGlobalInclude))
+			return false;
+		return this.fileName.equals(((ASTGlobalInclude)element).fileName);
+	}
+}
+/*
+ * JavaCC - OriginalChecksum=40d625900bf5e5355db844d7eafe0ebd (do not edit this
+ * line)
+ */
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTIdentList.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTIdentList.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTIdentList.java	(revision 13)
@@ -0,0 +1,32 @@
+/* Generated By:JJTree: Do not edit this line. ASTIdentList.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class ASTIdentList extends SimpleNode {
+	
+	private List<String> idents = new ArrayList<String>();
+	
+  public ASTIdentList(int id) {
+    super(id);
+  }
+
+  public ASTIdentList(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+  
+  public List<String> getIdents()
+  {
+	  return Collections.unmodifiableList(idents);
+  }
+  
+  public void addIdent(String id)
+  {
+	  if(!idents.contains(id))
+		  idents.add(id);
+  }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTIncludeStmt.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTIncludeStmt.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTIncludeStmt.java	(revision 13)
@@ -0,0 +1,43 @@
+/* Generated By:JJTree: Do not edit this line. ASTIncludeStmt.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+import org.eclipse.jface.text.IDocument;
+
+
+public class ASTIncludeStmt extends ElementWithOffset {
+	
+	private String fileName = "N/A";
+	
+  public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName.replaceAll("\"", "");
+	}
+
+public ASTIncludeStmt(int id) {
+    super(id);
+  }
+
+  public ASTIncludeStmt(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+
+	@Override
+	public String toString() {
+		return fileName +  ": Included file";
+	}
+
+	@Override
+	public boolean isEquivalent(ElementWithOffset element, IDocument document) {
+		
+		if(!(element instanceof ASTIncludeStmt))
+			return false;
+		return this.fileName.equals(((ASTIncludeStmt)element).fileName);
+	}
+  
+	
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTMultiLinePropertyValue.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTMultiLinePropertyValue.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTMultiLinePropertyValue.java	(revision 13)
@@ -0,0 +1,16 @@
+/* Generated By:JJTree: Do not edit this line. ASTMultiLinePropertyValue.java Version 4.1 */
+/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.framsticks.framclipse.internal.parser;
+
+public
+class ASTMultiLinePropertyValue extends SimpleNode {
+  public ASTMultiLinePropertyValue(int id) {
+    super(id);
+  }
+
+  public ASTMultiLinePropertyValue(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+
+}
+/* JavaCC - OriginalChecksum=4687e1872966df1aac8aea04184ebf9e (do not edit this line) */
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTProperty.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTProperty.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTProperty.java	(revision 13)
@@ -0,0 +1,76 @@
+/* Generated By:JJTree: Do not edit this line. ASTProperty.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+import org.eclipse.jface.text.IDocument;
+
+
+public class ASTProperty extends ElementWithOffset {
+	
+  private String name = "[noname]";
+
+	protected String value = "[undefined]";
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+  
+  
+  public ASTProperty(int id) {
+    super(id);
+  }
+
+  public ASTProperty(FramclipseNonScriptParser p, int id) {
+    super(p, id);
+  }
+
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@Override
+	public String toString() {
+		return name + ": "+value;
+	}
+
+	@Override
+	public boolean isEquivalent(ElementWithOffset element, IDocument document) {
+		if(!(element instanceof ASTProperty))
+			return false;
+		if(!(this.name.equals(((ASTProperty)element).name)))
+			return false;
+		
+		return super.isEquivalent(element, document);
+	}
+
+	@Override
+	public void jjtClose() {
+		
+		if (children != null && children.length == 1){
+			if (children[0] instanceof ASTSingleLinePropertyValue) {
+				ASTSingleLinePropertyValue v = (ASTSingleLinePropertyValue) children[0];
+				value = v.getValue();
+				children = null;
+			} else 
+				if (children[0] instanceof ASTMultiLinePropertyValue) {					
+					value = "...";
+					children = null;
+				}
+		}
+			
+		super.jjtClose();
+	}
+	
+	
+
+
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTSingleLinePropertyValue.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTSingleLinePropertyValue.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ASTSingleLinePropertyValue.java	(revision 13)
@@ -0,0 +1,27 @@
+/* Generated By:JJTree: Do not edit this line. ASTSingleLinePropertyValue.java Version 4.1 */
+/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.framsticks.framclipse.internal.parser;
+
+public class ASTSingleLinePropertyValue extends SimpleNode {
+	protected String value = "[undefined]";
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+	public ASTSingleLinePropertyValue(int id) {
+		super(id);
+	}
+
+	public ASTSingleLinePropertyValue(FramclipseNonScriptParser p, int id) {
+		super(p, id);
+	}
+
+}
+/*
+ * JavaCC - OriginalChecksum=40fd018df40c33d67aefe6b6ad939e94 (do not edit this
+ * line)
+ */
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStream.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStream.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStream.java	(revision 13)
@@ -0,0 +1,110 @@
+/* Generated By:JavaCC: Do not edit this line. CharStream.java Version 4.0 */
+package com.framsticks.framclipse.internal.parser;
+
+/**
+ * This interface describes a character stream that maintains line and
+ * column number positions of the characters.  It also has the capability
+ * to backup the stream to some extent.  An implementation of this
+ * interface is used in the TokenManager implementation generated by
+ * JavaCCParser.
+ *
+ * All the methods except backup can be implemented in any fashion. backup
+ * needs to be implemented correctly for the correct operation of the lexer.
+ * Rest of the methods are all used to get information like line number,
+ * column number and the String that constitutes a token and are not used
+ * by the lexer. Hence their implementation won't affect the generated lexer's
+ * operation.
+ */
+
+public interface CharStream {
+
+  /**
+   * Returns the next character from the selected input.  The method
+   * of selecting the input is the responsibility of the class
+   * implementing this interface.  Can throw any java.io.IOException.
+   */
+  char readChar() throws java.io.IOException;
+
+  /**
+   * Returns the column position of the character last read.
+   * @deprecated 
+   * @see #getEndColumn
+   */
+  int getColumn();
+
+  /**
+   * Returns the line number of the character last read.
+   * @deprecated 
+   * @see #getEndLine
+   */
+  int getLine();
+
+  /**
+   * Returns the column number of the last character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getEndColumn();
+
+  /**
+   * Returns the line number of the last character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getEndLine();
+
+  /**
+   * Returns the column number of the first character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getBeginColumn();
+
+  /**
+   * Returns the line number of the first character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getBeginLine();
+
+  /**
+   * Backs up the input stream by amount steps. Lexer calls this method if it
+   * had already read some characters, but could not use them to match a
+   * (longer) token. So, they will be used again as the prefix of the next
+   * token and it is the implemetation's responsibility to do this right.
+   */
+  void backup(int amount);
+
+  /**
+   * Returns the next character that marks the beginning of the next token.
+   * All characters must remain in the buffer between two successive calls
+   * to this method to implement backup correctly.
+   */
+  char BeginToken() throws java.io.IOException;
+
+  /**
+   * Returns a string made up of characters from the marked token beginning 
+   * to the current buffer position. Implementations have the choice of returning
+   * anything that they want to. For example, for efficiency, one might decide
+   * to just return null, which is a valid implementation.
+   */
+  String GetImage();
+
+  /**
+   * Returns an array of characters that make up the suffix of length 'len' for
+   * the currently matched token. This is used to build up the matched string
+   * for use in actions in the case of MORE. A simple and inefficient
+   * implementation of this is as follows :
+   *
+   *   {
+   *      String t = GetImage();
+   *      return t.substring(t.length() - len, t.length()).toCharArray();
+   *   }
+   */
+  char[] GetSuffix(int len);
+
+  /**
+   * The lexer calls this function to indicate that it is done with the stream
+   * and hence implementations can free any resources held by this class.
+   * Again, the body of this function can be just empty and it will not
+   * affect the lexer's operation.
+   */
+  void Done();
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStreamWithOffset.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStreamWithOffset.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStreamWithOffset.java	(revision 13)
@@ -0,0 +1,453 @@
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
+package com.framsticks.framclipse.internal.parser;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public class CharStreamWithOffset implements CharStream
+{
+  public static final boolean staticFlag = false;
+  int bufsize;
+  int available;
+  int tokenBegin;
+  public int bufpos = -1;
+  protected int bufline[];
+  protected int bufcolumn[];
+  int charOffset = 0;
+
+  protected int column = 0;
+  protected int line = 1;
+
+  protected boolean prevCharIsCR = false;
+  protected boolean prevCharIsLF = false;
+
+  protected java.io.Reader inputStream;
+
+  protected char[] buffer;
+  protected int maxNextCharInd = 0;
+  protected int inBuf = 0;
+  protected int tabSize = 8;
+
+  protected void setTabSize(int i) { tabSize = i; }
+  protected int getTabSize(int i) { return tabSize; }
+
+
+  protected void ExpandBuff(boolean wrapAround)
+  {
+     char[] newbuffer = new char[bufsize + 2048];
+     int newbufline[] = new int[bufsize + 2048];
+     int newbufcolumn[] = new int[bufsize + 2048];
+
+     try
+     {
+        if (wrapAround)
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           System.arraycopy(buffer, 0, newbuffer,
+                                             bufsize - tokenBegin, bufpos);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+        }
+        else
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos -= tokenBegin);
+        }
+     }
+     catch (Throwable t)
+     {
+        throw new Error(t.getMessage());
+     }
+
+
+     bufsize += 2048;
+     available = bufsize;
+     tokenBegin = 0;
+  }
+
+  protected void FillBuff() throws java.io.IOException
+  {
+     if (maxNextCharInd == available)
+     {
+        if (available == bufsize)
+        {
+           if (tokenBegin > 2048)
+           {
+              bufpos = maxNextCharInd = 0;
+              available = tokenBegin;
+           }
+           else if (tokenBegin < 0)
+              bufpos = maxNextCharInd = 0;
+           else
+              ExpandBuff(false);
+        }
+        else if (available > tokenBegin)
+           available = bufsize;
+        else if ((tokenBegin - available) < 2048)
+           ExpandBuff(true);
+        else
+           available = tokenBegin;
+     }
+
+     int i;
+     try {
+        if ((i = inputStream.read(buffer, maxNextCharInd,
+                                    available - maxNextCharInd)) == -1)
+        {
+           inputStream.close();
+           throw new java.io.IOException();
+        }
+        else
+        {
+           maxNextCharInd += i;
+           charOffset += i;
+        }
+        return;
+     }
+     catch(java.io.IOException e) {
+        --bufpos;
+        backup(0);
+        if (tokenBegin == -1)
+           tokenBegin = bufpos;
+        throw e;
+     }
+  }
+
+  public char BeginToken() throws java.io.IOException
+  {
+     tokenBegin = -1;
+     char c = readChar();
+     tokenBegin = bufpos;
+
+     return c;
+  }
+
+  protected void UpdateLineColumn(char c)
+  {
+     column++;
+
+     if (prevCharIsLF)
+     {
+        prevCharIsLF = false;
+        line += (column = 1);
+     }
+     else if (prevCharIsCR)
+     {
+        prevCharIsCR = false;
+        if (c == '\n')
+        {
+           prevCharIsLF = true;
+        }
+        else
+           line += (column = 1);
+     }
+
+     switch (c)
+     {
+        case '\r' :
+           prevCharIsCR = true;
+           break;
+        case '\n' :
+           prevCharIsLF = true;
+           break;
+        case '\t' :
+           column--;
+           column += (tabSize - (column % tabSize));
+           break;
+        default :
+           break;
+     }
+
+     bufline[bufpos] = line;
+     bufcolumn[bufpos] = column;
+  }
+
+  public char readChar() throws java.io.IOException
+  {
+     if (inBuf > 0)
+     {
+        --inBuf;
+
+        if (++bufpos == bufsize)
+           bufpos = 0;
+
+        return buffer[bufpos];
+     }
+
+     if (++bufpos >= maxNextCharInd)
+        FillBuff();
+
+     char c = buffer[bufpos];
+
+     UpdateLineColumn(c);
+     return (c);
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndColumn
+   */
+
+  public int getColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndLine
+   */
+
+  public int getLine() {
+     return bufline[bufpos];
+  }
+
+  public int getEndColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  public int getEndLine() {
+     return bufline[bufpos];
+  }
+  
+  public int getBeginOffset() {
+	   return charOffset - maxNextCharInd + tokenBegin;
+  }
+
+   public int getOffset() {
+	   return charOffset - maxNextCharInd + bufpos + 1;
+  }
+  
+
+  public int getBeginColumn() {
+     return bufcolumn[tokenBegin];
+  }
+
+  public int getBeginLine() {
+     return bufline[tokenBegin];
+  }
+
+  public void backup(int amount) {
+
+    inBuf += amount;
+    if ((bufpos -= amount) < 0)
+       bufpos += bufsize;
+    
+  }
+
+  public CharStreamWithOffset(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    available = bufsize = buffersize;
+    buffer = new char[buffersize];
+    bufline = new int[buffersize];
+    bufcolumn = new int[buffersize];
+  }
+
+  public CharStreamWithOffset(java.io.Reader dstream, int startline,
+                          int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.Reader dstream)
+  {
+     this(dstream, 1, 1, 4096);
+  }
+  public void ReInit(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    if (buffer == null || buffersize != buffer.length)
+    {
+      available = bufsize = buffersize;
+      buffer = new char[buffersize];
+      bufline = new int[buffersize];
+      bufcolumn = new int[buffersize];
+    }
+    prevCharIsLF = prevCharIsCR = false;
+    tokenBegin = inBuf = maxNextCharInd = 0;
+    bufpos = -1;
+  }
+
+  public void ReInit(java.io.Reader dstream, int startline,
+                     int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+
+  public void ReInit(java.io.Reader dstream)
+  {
+     ReInit(dstream, 1, 1, 4096);
+  }
+  public CharStreamWithOffset(java.io.InputStream dstream, String encoding, int startline,
+  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+     this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+     this(dstream, encoding, startline, startcolumn, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, int startline,
+                          int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+     this(dstream, encoding, 1, 1, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream)
+  {
+     this(dstream, 1, 1, 4096);
+  }
+
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  public void ReInit(java.io.InputStream dstream, int startline,
+                          int startcolumn, int buffersize)
+  {
+     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+
+  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(dstream, encoding, 1, 1, 4096);
+  }
+
+  public void ReInit(java.io.InputStream dstream)
+  {
+     ReInit(dstream, 1, 1, 4096);
+  }
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                     int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(dstream, encoding, startline, startcolumn, 4096);
+  }
+  public void ReInit(java.io.InputStream dstream, int startline,
+                     int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+  public String GetImage()
+  {
+     if (bufpos >= tokenBegin)
+        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+     else
+        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                              new String(buffer, 0, bufpos + 1);
+  }
+
+  public char[] GetSuffix(int len)
+  {
+     char[] ret = new char[len];
+
+     if ((bufpos + 1) >= len)
+        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+     else
+     {
+        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                          len - bufpos - 1);
+        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+     }
+
+     return ret;
+  }
+
+  public void Done()
+  {
+     buffer = null;
+     bufline = null;
+     bufcolumn = null;
+  }
+
+  /**
+   * Method to adjust line and column numbers for the start of a token.
+   */
+  public void adjustBeginLineColumn(int newLine, int newCol)
+  {
+     int start = tokenBegin;
+     int len;
+
+     if (bufpos >= tokenBegin)
+     {
+        len = bufpos - tokenBegin + inBuf + 1;
+     }
+     else
+     {
+        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+     }
+
+     int i = 0, j = 0, k = 0;
+     int nextColDiff = 0, columnDiff = 0;
+
+     while (i < len &&
+            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+     {
+        bufline[j] = newLine;
+        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+        bufcolumn[j] = newCol + columnDiff;
+        columnDiff = nextColDiff;
+        i++;
+     } 
+
+     if (i < len)
+     {
+        bufline[j] = newLine++;
+        bufcolumn[j] = newCol + columnDiff;
+
+        while (i++ < len)
+        {
+           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+              bufline[j] = newLine++;
+           else
+              bufline[j] = newLine;
+        }
+     }
+
+     line = bufline[j];
+     column = bufcolumn[j];
+  }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStreamWithOffset.tmp
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStreamWithOffset.tmp	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/CharStreamWithOffset.tmp	(revision 13)
@@ -0,0 +1,452 @@
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
+package pl.kuzniak.framclipse.internal.parser;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public class CharStreamWithOffset implements CharStream
+{
+  public static final boolean staticFlag = false;
+  int bufsize;
+  int available;
+  int tokenBegin;
+  public int bufpos = -1;
+  protected int bufline[];
+  protected int bufcolumn[];
+  int charOffset = 0;
+
+  protected int column = 0;
+  protected int line = 1;
+
+  protected boolean prevCharIsCR = false;
+  protected boolean prevCharIsLF = false;
+
+  protected java.io.Reader inputStream;
+
+  protected char[] buffer;
+  protected int maxNextCharInd = 0;
+  protected int inBuf = 0;
+  protected int tabSize = 8;
+
+  protected void setTabSize(int i) { tabSize = i; }
+  protected int getTabSize(int i) { return tabSize; }
+
+
+  protected void ExpandBuff(boolean wrapAround)
+  {
+     char[] newbuffer = new char[bufsize + 2048];
+     int newbufline[] = new int[bufsize + 2048];
+     int newbufcolumn[] = new int[bufsize + 2048];
+
+     try
+     {
+        if (wrapAround)
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           System.arraycopy(buffer, 0, newbuffer,
+                                             bufsize - tokenBegin, bufpos);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+        }
+        else
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos -= tokenBegin);
+        }
+     }
+     catch (Throwable t)
+     {
+        throw new Error(t.getMessage());
+     }
+
+
+     bufsize += 2048;
+     available = bufsize;
+     tokenBegin = 0;
+  }
+
+  protected void FillBuff() throws java.io.IOException
+  {
+     if (maxNextCharInd == available)
+     {
+        if (available == bufsize)
+        {
+           if (tokenBegin > 2048)
+           {
+              bufpos = maxNextCharInd = 0;
+              available = tokenBegin;
+           }
+           else if (tokenBegin < 0)
+              bufpos = maxNextCharInd = 0;
+           else
+              ExpandBuff(false);
+        }
+        else if (available > tokenBegin)
+           available = bufsize;
+        else if ((tokenBegin - available) < 2048)
+           ExpandBuff(true);
+        else
+           available = tokenBegin;
+     }
+
+     int i;
+     try {
+        if ((i = inputStream.read(buffer, maxNextCharInd,
+                                    available - maxNextCharInd)) == -1)
+        {
+           inputStream.close();
+           throw new java.io.IOException();
+        }
+        else
+        {
+           maxNextCharInd += i;
+           charOffset += i;
+        }
+        return;
+     }
+     catch(java.io.IOException e) {
+        --bufpos;
+        backup(0);
+        if (tokenBegin == -1)
+           tokenBegin = bufpos;
+        throw e;
+     }
+  }
+
+  public char BeginToken() throws java.io.IOException
+  {
+     tokenBegin = -1;
+     char c = readChar();
+     tokenBegin = bufpos;
+
+     return c;
+  }
+
+  protected void UpdateLineColumn(char c)
+  {
+     column++;
+
+     if (prevCharIsLF)
+     {
+        prevCharIsLF = false;
+        line += (column = 1);
+     }
+     else if (prevCharIsCR)
+     {
+        prevCharIsCR = false;
+        if (c == '\n')
+        {
+           prevCharIsLF = true;
+        }
+        else
+           line += (column = 1);
+     }
+
+     switch (c)
+     {
+        case '\r' :
+           prevCharIsCR = true;
+           break;
+        case '\n' :
+           prevCharIsLF = true;
+           break;
+        case '\t' :
+           column--;
+           column += (tabSize - (column % tabSize));
+           break;
+        default :
+           break;
+     }
+
+     bufline[bufpos] = line;
+     bufcolumn[bufpos] = column;
+  }
+
+  public char readChar() throws java.io.IOException
+  {
+     if (inBuf > 0)
+     {
+        --inBuf;
+
+        if (++bufpos == bufsize)
+           bufpos = 0;
+
+        return buffer[bufpos];
+     }
+
+     if (++bufpos >= maxNextCharInd)
+        FillBuff();
+
+     char c = buffer[bufpos];
+
+     UpdateLineColumn(c);
+     return (c);
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndColumn
+   */
+
+  public int getColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndLine
+   */
+
+  public int getLine() {
+     return bufline[bufpos];
+  }
+
+  public int getEndColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  public int getEndLine() {
+     return bufline[bufpos];
+  }
+  
+  public int getBeginOffset() {
+	   return charOffset - maxNextCharInd + tokenBegin;
+  }
+
+   public int getOffset() {
+	   return charOffset - maxNextCharInd + bufpos + 1;
+  }
+  
+
+  public int getBeginColumn() {
+     return bufcolumn[tokenBegin];
+  }
+
+  public int getBeginLine() {
+     return bufline[tokenBegin];
+  }
+
+  public void backup(int amount) {
+
+    inBuf += amount;
+    if ((bufpos -= amount) < 0)
+       bufpos += bufsize;
+  }
+
+  public CharStreamWithOffset(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    available = bufsize = buffersize;
+    buffer = new char[buffersize];
+    bufline = new int[buffersize];
+    bufcolumn = new int[buffersize];
+  }
+
+  public CharStreamWithOffset(java.io.Reader dstream, int startline,
+                          int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.Reader dstream)
+  {
+     this(dstream, 1, 1, 4096);
+  }
+  public void ReInit(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    inputStream = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    if (buffer == null || buffersize != buffer.length)
+    {
+      available = bufsize = buffersize;
+      buffer = new char[buffersize];
+      bufline = new int[buffersize];
+      bufcolumn = new int[buffersize];
+    }
+    prevCharIsLF = prevCharIsCR = false;
+    tokenBegin = inBuf = maxNextCharInd = 0;
+    bufpos = -1;
+  }
+
+  public void ReInit(java.io.Reader dstream, int startline,
+                     int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+
+  public void ReInit(java.io.Reader dstream)
+  {
+     ReInit(dstream, 1, 1, 4096);
+  }
+  public CharStreamWithOffset(java.io.InputStream dstream, String encoding, int startline,
+  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+     this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+     this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+     this(dstream, encoding, startline, startcolumn, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, int startline,
+                          int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+     this(dstream, encoding, 1, 1, 4096);
+  }
+
+  public CharStreamWithOffset(java.io.InputStream dstream)
+  {
+     this(dstream, 1, 1, 4096);
+  }
+
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+  }
+
+  public void ReInit(java.io.InputStream dstream, int startline,
+                          int startcolumn, int buffersize)
+  {
+     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+  }
+
+  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(dstream, encoding, 1, 1, 4096);
+  }
+
+  public void ReInit(java.io.InputStream dstream)
+  {
+     ReInit(dstream, 1, 1, 4096);
+  }
+  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                     int startcolumn) throws java.io.UnsupportedEncodingException
+  {
+     ReInit(dstream, encoding, startline, startcolumn, 4096);
+  }
+  public void ReInit(java.io.InputStream dstream, int startline,
+                     int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+  public String GetImage()
+  {
+     if (bufpos >= tokenBegin)
+        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+     else
+        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                              new String(buffer, 0, bufpos + 1);
+  }
+
+  public char[] GetSuffix(int len)
+  {
+     char[] ret = new char[len];
+
+     if ((bufpos + 1) >= len)
+        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+     else
+     {
+        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                          len - bufpos - 1);
+        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+     }
+
+     return ret;
+  }
+
+  public void Done()
+  {
+     buffer = null;
+     bufline = null;
+     bufcolumn = null;
+  }
+
+  /**
+   * Method to adjust line and column numbers for the start of a token.
+   */
+  public void adjustBeginLineColumn(int newLine, int newCol)
+  {
+     int start = tokenBegin;
+     int len;
+
+     if (bufpos >= tokenBegin)
+     {
+        len = bufpos - tokenBegin + inBuf + 1;
+     }
+     else
+     {
+        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+     }
+
+     int i = 0, j = 0, k = 0;
+     int nextColDiff = 0, columnDiff = 0;
+
+     while (i < len &&
+            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+     {
+        bufline[j] = newLine;
+        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+        bufcolumn[j] = newCol + columnDiff;
+        columnDiff = nextColDiff;
+        i++;
+     } 
+
+     if (i < len)
+     {
+        bufline[j] = newLine++;
+        bufcolumn[j] = newCol + columnDiff;
+
+        while (i++ < len)
+        {
+           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+              bufline[j] = newLine++;
+           else
+              bufline[j] = newLine;
+        }
+     }
+
+     line = bufline[j];
+     column = bufcolumn[j];
+  }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ElementWithOffset.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ElementWithOffset.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ElementWithOffset.java	(revision 13)
@@ -0,0 +1,86 @@
+package com.framsticks.framclipse.internal.parser;
+
+import org.eclipse.jface.text.IDocument;
+
+public abstract class ElementWithOffset extends SimpleNode
+{
+
+	private int beginOffset;
+	private int endOffset;
+	
+	public ElementWithOffset(int i) {
+		super(i);
+	}
+	
+
+	public ElementWithOffset(FramclipseNonScriptParser p, int i) {
+		super(p, i);
+	}
+
+
+	public int getBeginOffset() {
+		return beginOffset;
+	}
+
+	public void setBeginOffset(int offset) {
+		this.beginOffset = offset;
+	}
+
+	public int getEndOffset() {
+		return endOffset;
+	}
+
+	public void setEndOffset(int offset) {
+		this.endOffset = offset;
+	}
+	
+	static boolean withinInterval(int val, int loInclusive, int hiInclusive)
+	{
+		if(val >= loInclusive && val <= hiInclusive)
+			return true;
+		return false;
+	}
+	
+	public Node getElementForOffset(int offset)
+	{
+		if(offset < beginOffset || offset > endOffset)
+			return null;
+		
+		if(children != null)
+		{
+			for(int k = 0; k < children.length; ++k)
+			{
+				if(children[k] instanceof ElementWithOffset)
+				{
+					ElementWithOffset child = (ElementWithOffset)children[k];
+					if(withinInterval(offset, child.beginOffset, child.endOffset))
+						return child.getElementForOffset(offset);
+				}
+			}
+		}
+		
+		return this;
+	}
+	
+	public boolean isEquivalent(ElementWithOffset element, IDocument document)
+	{
+		if(!this.getClass().toString().equals(element.getClass().toString()))
+			return false;
+		
+		if(jjtGetNumChildren() != element.jjtGetNumChildren())
+			return false;
+		
+		if(getEndOffset() - getBeginOffset() != element.getEndOffset() - element.getBeginOffset())
+			return false;
+		
+		if(children != null)
+			for(int k = 0; k < children.length; ++k)
+				if(children[k] instanceof ElementWithOffset)
+					if(!(element.children[k] instanceof ElementWithOffset) || 
+							!((ElementWithOffset)children[k]).isEquivalent((ElementWithOffset)element.children[k], document))
+							return false;
+		
+		return true;
+	}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.java	(revision 13)
@@ -0,0 +1,686 @@
+/* Generated By:JJTree&JavaCC: Do not edit this line. FramclipseNonScriptParser.java */
+package com.framsticks.framclipse.internal.parser;
+
+import java.io.StringReader;
+
+public class FramclipseNonScriptParser/*@bgen(jjtree)*/implements FramclipseNonScriptParserTreeConstants, FramclipseNonScriptParserConstants {/*@bgen(jjtree)*/
+  protected JJTFramclipseNonScriptParserState jjtree = new JJTFramclipseNonScriptParserState();
+  private CharStreamWithOffset charStream = null;
+
+  public java.util.Collection<Exception> exceptions = new java.util.ArrayList<Exception>();
+
+  public FramclipseNonScriptParser(String input)
+  {
+        this(new CharStreamWithOffset(new StringReader(input)));
+  }
+
+  private FramclipseNonScriptParser(CharStreamWithOffset charStream)
+  {
+        this((CharStream)charStream);
+        this.charStream = charStream;
+  }
+
+  public static void main(String args[]) {
+    String s = "expdef: \u005cn name: urnohorl \u005cn id: horla \u005cn code:~ function kupa(a,b) { yeah \u005cn } \u005cn~\u005cn\u005cn\u005cn";
+
+    FramclipseNonScriptParser t = new FramclipseNonScriptParser(s);
+    try {
+      SimpleNode n = t.FramclipseFile();
+      n.dump("");
+      System.out.println("Thank you.");
+    } catch (Exception e) {
+      System.out.println("Oops.");
+      System.out.println(e.getMessage());
+      //e.printStackTrace();
+    }
+  }
+
+  final public ASTFramclipseFile FramclipseFile() throws ParseException {
+                                      /*@bgen(jjtree) FramclipseFile */
+  ASTFramclipseFile jjtn000 = new ASTFramclipseFile(JJTFRAMCLIPSEFILE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      label_1:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENTIFIER:
+        case EOL:
+        case GLOBAL_INCLUDE_KWD:
+          ;
+          break;
+        default:
+          jj_la1[0] = jj_gen;
+          break label_1;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENTIFIER:
+        case GLOBAL_INCLUDE_KWD:
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case IDENTIFIER:
+            FObject();
+            break;
+          case GLOBAL_INCLUDE_KWD:
+            GlobalInclude();
+            break;
+          default:
+            jj_la1[1] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case EOL:
+            jj_consume_token(EOL);
+            break;
+          case 0:
+            jj_consume_token(0);
+            break;
+          default:
+            jj_la1[2] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+          break;
+        case EOL:
+          jj_consume_token(EOL);
+          break;
+        default:
+          jj_la1[3] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+    jjtree.closeNodeScope(jjtn000, true);
+    jjtc000 = false;
+    {if (true) return jjtn000;}
+    } catch (Throwable jjte000) {
+    if (jjtc000) {
+      jjtree.clearNodeScope(jjtn000);
+      jjtc000 = false;
+    } else {
+      jjtree.popNode();
+    }
+    if (jjte000 instanceof RuntimeException) {
+      {if (true) throw (RuntimeException)jjte000;}
+    }
+    if (jjte000 instanceof ParseException) {
+      {if (true) throw (ParseException)jjte000;}
+    }
+    {if (true) throw (Error)jjte000;}
+    } finally {
+    if (jjtc000) {
+      jjtree.closeNodeScope(jjtn000, true);
+    }
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  final public void FObject() throws ParseException {
+                  /*@bgen(jjtree) FObject */
+  ASTFObject jjtn000 = new ASTFObject(JJTFOBJECT);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+    jjtn000.setBeginOffset(charStream.getBeginOffset());
+      jj_consume_token(IDENTIFIER);
+    jjtn000.setClassName(token.image);
+      jj_consume_token(SINGLE_SECT_START);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SINGLE_SECT_END:
+        jj_consume_token(SINGLE_SECT_END);
+        break;
+      case 0:
+        jj_consume_token(0);
+        break;
+      default:
+        jj_la1[4] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+      label_2:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENTIFIER:
+        case CODE_SECTION_START:
+          ;
+          break;
+        default:
+          jj_la1[5] = jj_gen;
+          break label_2;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENTIFIER:
+          Property();
+          break;
+        case CODE_SECTION_START:
+          CodeSection();
+          break;
+        default:
+          jj_la1[6] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+     jjtree.closeNodeScope(jjtn000, true);
+     jjtc000 = false;
+     jjtn000.setEndOffset(charStream.getBeginOffset() - 1);
+    } catch (Throwable jjte000) {
+     if (jjtc000) {
+       jjtree.clearNodeScope(jjtn000);
+       jjtc000 = false;
+     } else {
+       jjtree.popNode();
+     }
+     if (jjte000 instanceof RuntimeException) {
+       {if (true) throw (RuntimeException)jjte000;}
+     }
+     if (jjte000 instanceof ParseException) {
+       {if (true) throw (ParseException)jjte000;}
+     }
+     {if (true) throw (Error)jjte000;}
+    } finally {
+     if (jjtc000) {
+       jjtree.closeNodeScope(jjtn000, true);
+     }
+    }
+  }
+
+  final public void CodeSection() throws ParseException {
+                      /*@bgen(jjtree) CodeSection */
+  ASTCodeSection jjtn000 = new ASTCodeSection(JJTCODESECTION);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+          jjtn000.setBeginOffset(charStream.getBeginOffset());
+      jj_consume_token(CODE_SECTION_START);
+      label_3:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case GLOBAL_KWD:
+        case FUNCTION_KWD:
+        case INCLUDE_KWD:
+          ;
+          break;
+        default:
+          jj_la1[7] = jj_gen;
+          break label_3;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case GLOBAL_KWD:
+          GlobalDecl();
+          break;
+        case FUNCTION_KWD:
+          Function();
+          break;
+        case INCLUDE_KWD:
+          IncludeStmt();
+          break;
+        default:
+          jj_la1[8] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+      }
+      jj_consume_token(CODE_SECTION_END);
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+          jjtn000.setEndOffset(charStream.getBeginOffset());
+    } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            {if (true) throw (RuntimeException)jjte000;}
+          }
+          if (jjte000 instanceof ParseException) {
+            {if (true) throw (ParseException)jjte000;}
+          }
+          {if (true) throw (Error)jjte000;}
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void Function() throws ParseException {
+                   /*@bgen(jjtree) Function */
+  ASTFunction jjtn000 = new ASTFunction(JJTFUNCTION);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      try {
+        jj_consume_token(FUNCTION_KWD);
+                         jjtn000.setBeginOffset(charStream.getBeginOffset());
+        IdentList();
+        jj_consume_token(LPAREN);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case IDENT:
+          IdentList();
+          break;
+        default:
+          jj_la1[9] = jj_gen;
+          ;
+        }
+        jj_consume_token(RPAREN);
+        jj_consume_token(LBRACE);
+        label_4:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case NESTED_LBRACE:
+            ;
+            break;
+          default:
+            jj_la1[10] = jj_gen;
+            break label_4;
+          }
+          CodeBlock();
+        }
+        jj_consume_token(RBRACE);
+      } catch (ParseException e) {
+                token_source.SwitchTo(DEFAULT);
+                //error_skipto(new int[] { EOF });
+
+      }
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+          jjtn000.setEndOffset(charStream.getBeginOffset());
+    } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            {if (true) throw (RuntimeException)jjte000;}
+          }
+          if (jjte000 instanceof ParseException) {
+            {if (true) throw (ParseException)jjte000;}
+          }
+          {if (true) throw (Error)jjte000;}
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void GlobalDecl() throws ParseException {
+                     /*@bgen(jjtree) GlobalDecl */
+  ASTGlobalDecl jjtn000 = new ASTGlobalDecl(JJTGLOBALDECL);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+          jjtn000.setBeginOffset(charStream.getBeginOffset());
+      jj_consume_token(GLOBAL_KWD);
+      IdentList();
+      jj_consume_token(SEMICOLON);
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+          jjtn000.setEndOffset(charStream.getBeginOffset());
+    } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            {if (true) throw (RuntimeException)jjte000;}
+          }
+          if (jjte000 instanceof ParseException) {
+            {if (true) throw (ParseException)jjte000;}
+          }
+          {if (true) throw (Error)jjte000;}
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void IncludeStmt() throws ParseException {
+                      /*@bgen(jjtree) IncludeStmt */
+  ASTIncludeStmt jjtn000 = new ASTIncludeStmt(JJTINCLUDESTMT);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+          jjtn000.setBeginOffset(charStream.getBeginOffset());
+      jj_consume_token(INCLUDE_KWD);
+      jj_consume_token(STRING_LITERAL);
+                                          jjtn000.setFileName(token.image);
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+          jjtn000.setEndOffset(charStream.getOffset());
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void GlobalInclude() throws ParseException {
+                        /*@bgen(jjtree) GlobalInclude */
+  ASTGlobalInclude jjtn000 = new ASTGlobalInclude(JJTGLOBALINCLUDE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+          jjtn000.setBeginOffset(charStream.getBeginOffset());
+      jj_consume_token(GLOBAL_INCLUDE_KWD);
+      jj_consume_token(INCLUDE_STRING);
+                                                 jjtn000.setFileName(token.image);
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+          jjtn000.setEndOffset(charStream.getOffset());
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void IdentList() throws ParseException {
+                    /*@bgen(jjtree) IdentList */
+  ASTIdentList jjtn000 = new ASTIdentList(JJTIDENTLIST);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      jj_consume_token(IDENT);
+                  jjtn000.addIdent(token.image);
+      label_5:
+      while (true) {
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case COMMA:
+          ;
+          break;
+        default:
+          jj_la1[11] = jj_gen;
+          break label_5;
+        }
+        jj_consume_token(COMMA);
+        jj_consume_token(IDENT);
+                                                                      jjtn000.addIdent(token.image);
+      }
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void Property() throws ParseException {
+                   /*@bgen(jjtree) Property */
+  ASTProperty jjtn000 = new ASTProperty(JJTPROPERTY);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+          jjtn000.setBeginOffset(charStream.getBeginOffset());
+      jj_consume_token(IDENTIFIER);
+                 jjtn000.setName(token.image);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SINGLE_SECT_START:
+        SingleLinePropertyValue();
+                                jjtree.closeNodeScope(jjtn000, true);
+                                jjtc000 = false;
+                                jjtn000.setEndOffset(charStream.getBeginOffset() - 1);
+        break;
+      case MULTI_SECT_START:
+        MultiLinePropertyValue();
+                                                                                                                      jjtree.closeNodeScope(jjtn000, true);
+                                                                                                                      jjtc000 = false;
+                                                                                                                      jjtn000.setEndOffset(charStream.getBeginOffset());
+        break;
+      default:
+        jj_la1[12] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            {if (true) throw (RuntimeException)jjte000;}
+          }
+          if (jjte000 instanceof ParseException) {
+            {if (true) throw (ParseException)jjte000;}
+          }
+          {if (true) throw (Error)jjte000;}
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void SingleLinePropertyValue() throws ParseException {
+                                    /*@bgen(jjtree) SingleLinePropertyValue */
+  ASTSingleLinePropertyValue jjtn000 = new ASTSingleLinePropertyValue(JJTSINGLELINEPROPERTYVALUE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      jj_consume_token(SINGLE_SECT_START);
+      jj_consume_token(PROP_VALUE);
+                                          jjtn000.setValue(token.image);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SINGLE_SECT_END:
+        jj_consume_token(SINGLE_SECT_END);
+        break;
+      case 0:
+        jj_consume_token(0);
+        break;
+      default:
+        jj_la1[13] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  final public void CodeBlock() throws ParseException {
+    jj_consume_token(NESTED_LBRACE);
+    label_6:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case NESTED_LBRACE:
+        ;
+        break;
+      default:
+        jj_la1[14] = jj_gen;
+        break label_6;
+      }
+      CodeBlock();
+    }
+    jj_consume_token(RBRACE);
+  }
+
+  final public void MultiLinePropertyValue() throws ParseException {
+                                  /*@bgen(jjtree) MultiLinePropertyValue */
+  ASTMultiLinePropertyValue jjtn000 = new ASTMultiLinePropertyValue(JJTMULTILINEPROPERTYVALUE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      jj_consume_token(MULTI_SECT_START);
+      jj_consume_token(MULTILINE_PROP_VALUE);
+      jj_consume_token(MULTI_SECT_END);
+    } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+    }
+  }
+
+  void error_skipto(int[] kinds) throws ParseException {
+  //ParseException e = generateParseException();  // generate the exception object.
+  //System.out.println(e.toString());  // print the error message
+  Token t;
+  if(kinds.length > 0)
+  {
+    java.util.Arrays.sort(kinds);
+
+        do {
+        t = getNextToken();
+        } while (java.util.Arrays.binarySearch(kinds, t.kind) < 0);
+
+  }
+  }
+
+  /** Generated Token Manager. */
+  public FramclipseNonScriptParserTokenManager token_source;
+  /** Current token. */
+  public Token token;
+  /** Next token. */
+  public Token jj_nt;
+  private int jj_ntk;
+  private int jj_gen;
+  final private int[] jj_la1 = new int[15];
+  static private int[] jj_la1_0;
+  static private int[] jj_la1_1;
+  static {
+      jj_la1_init_0();
+      jj_la1_init_1();
+   }
+   private static void jj_la1_init_0() {
+      jj_la1_0 = new int[] {0x22400,0x20400,0x2001,0x22400,0x1,0x4400,0x4400,0xe000000,0xe000000,0x0,0x0,0x0,0x18000,0x1,0x0,};
+   }
+   private static void jj_la1_init_1() {
+      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x20,0x40,0x8,0x0,0x200,0x40,};
+   }
+
+  /** Constructor with user supplied CharStream. */
+  public FramclipseNonScriptParser(CharStream stream) {
+    token_source = new FramclipseNonScriptParserTokenManager(stream);
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 15; i++) jj_la1[i] = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(CharStream stream) {
+    token_source.ReInit(stream);
+    token = new Token();
+    jj_ntk = -1;
+    jjtree.reset();
+    jj_gen = 0;
+    for (int i = 0; i < 15; i++) jj_la1[i] = -1;
+  }
+
+  /** Constructor with generated Token Manager. */
+  public FramclipseNonScriptParser(FramclipseNonScriptParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jj_gen = 0;
+    for (int i = 0; i < 15; i++) jj_la1[i] = -1;
+  }
+
+  /** Reinitialise. */
+  public void ReInit(FramclipseNonScriptParserTokenManager tm) {
+    token_source = tm;
+    token = new Token();
+    jj_ntk = -1;
+    jjtree.reset();
+    jj_gen = 0;
+    for (int i = 0; i < 15; i++) jj_la1[i] = -1;
+  }
+
+  private Token jj_consume_token(int kind) throws ParseException {
+    Token oldToken;
+    if ((oldToken = token).next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    if (token.kind == kind) {
+      jj_gen++;
+      return token;
+    }
+    token = oldToken;
+    jj_kind = kind;
+    throw generateParseException();
+  }
+
+
+/** Get the next Token. */
+  final public Token getNextToken() {
+    if (token.next != null) token = token.next;
+    else token = token.next = token_source.getNextToken();
+    jj_ntk = -1;
+    jj_gen++;
+    return token;
+  }
+
+/** Get the specific Token. */
+  final public Token getToken(int index) {
+    Token t = token;
+    for (int i = 0; i < index; i++) {
+      if (t.next != null) t = t.next;
+      else t = t.next = token_source.getNextToken();
+    }
+    return t;
+  }
+
+  private int jj_ntk() {
+    if ((jj_nt=token.next) == null)
+      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+    else
+      return (jj_ntk = jj_nt.kind);
+  }
+
+  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+  private int[] jj_expentry;
+  private int jj_kind = -1;
+
+  /** Generate ParseException. */
+  public ParseException generateParseException() {
+    jj_expentries.clear();
+    boolean[] la1tokens = new boolean[43];
+    if (jj_kind >= 0) {
+      la1tokens[jj_kind] = true;
+      jj_kind = -1;
+    }
+    for (int i = 0; i < 15; i++) {
+      if (jj_la1[i] == jj_gen) {
+        for (int j = 0; j < 32; j++) {
+          if ((jj_la1_0[i] & (1<<j)) != 0) {
+            la1tokens[j] = true;
+          }
+          if ((jj_la1_1[i] & (1<<j)) != 0) {
+            la1tokens[32+j] = true;
+          }
+        }
+      }
+    }
+    for (int i = 0; i < 43; i++) {
+      if (la1tokens[i]) {
+        jj_expentry = new int[1];
+        jj_expentry[0] = i;
+        jj_expentries.add(jj_expentry);
+      }
+    }
+    int[][] exptokseq = new int[jj_expentries.size()][];
+    for (int i = 0; i < jj_expentries.size(); i++) {
+      exptokseq[i] = jj_expentries.get(i);
+    }
+    return new ParseException(token, exptokseq, tokenImage);
+  }
+
+  /** Enable tracing. */
+  final public void enable_tracing() {
+  }
+
+  /** Disable tracing. */
+  final public void disable_tracing() {
+  }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.jj
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.jj	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.jj	(revision 13)
@@ -0,0 +1,616 @@
+/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. FramclipseNonScriptParser.jj */
+/*@egen*/options {
+	JDK_VERSION = "1.5";
+	USER_CHAR_STREAM = true;
+	STATIC = false;
+	             
+}
+
+PARSER_BEGIN(FramclipseNonScriptParser)
+
+package com.framsticks.framclipse.internal.parser;
+
+import java.io.StringReader;
+
+public class FramclipseNonScriptParser/*@bgen(jjtree)*/implements FramclipseNonScriptParserTreeConstants/*@egen*/ {/*@bgen(jjtree)*/
+  protected JJTFramclipseNonScriptParserState jjtree = new JJTFramclipseNonScriptParserState();
+
+/*@egen*/
+
+  private CharStreamWithOffset charStream = null;
+  
+  public java.util.Collection<Exception> exceptions = new java.util.ArrayList<Exception>();
+  
+  public FramclipseNonScriptParser(String input) 
+  {
+	this(new CharStreamWithOffset(new StringReader(input)));
+  }
+	
+  private FramclipseNonScriptParser(CharStreamWithOffset charStream)
+  {
+	this((CharStream)charStream);
+	this.charStream = charStream;
+  }
+  
+  public static void main(String args[]) {
+    String s = "expdef: \n name: urnohorl \n id: horla \n code:~ function kupa(a,b) { yeah \n } \n~\n\n\n";
+    
+    FramclipseNonScriptParser t = new FramclipseNonScriptParser(s);
+    try {
+      SimpleNode n = t.FramclipseFile();
+      n.dump("");
+      System.out.println("Thank you.");
+    } catch (Exception e) {
+      System.out.println("Oops.");
+      System.out.println(e.getMessage());
+      //e.printStackTrace();
+    }
+  }
+}
+
+PARSER_END(FramclipseNonScriptParser)
+
+TOKEN_MGR_DECLS : {
+
+    int blockNestingDepth ; 
+
+}
+
+<CodeSection, Block> SKIP :
+{  
+< "/*"(~["*"])* "*"(~["/"] (~["*"])* "*")* "/" >
+| <"//"(~["\r","\n"])*["\r"]"\n">
+}
+
+<CodeSection, GlobalInclude> SKIP : /* WHITE SPACE */
+{
+  " "
+| "\t"
+| "\r"
+| "\n"
+| "\f"
+} 
+
+<DEFAULT,SingleSect, MultiSect> SKIP : /* WHITE SPACE */
+{
+  " "
+| "\t"
+} 
+
+<DEFAULT> TOKEN : /* IDENTIFIERS */
+{
+  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+|
+  < #LETTER: ["_","a"-"z","A"-"Z"] >
+|
+  < #DIGIT: ["0"-"9"] >
+}
+
+<DEFAULT> TOKEN :
+{
+  < EOL: ("\r")?"\n" >
+}
+
+ 
+
+<DEFAULT> TOKEN : { <CODE_SECTION_START : "code:~" > : CodeSection }
+
+<DEFAULT> TOKEN : { < MULTI_SECT_START : ":~" >  : MultiSect }
+
+<DEFAULT> TOKEN : { <SINGLE_SECT_START : ":" > : SingleSect }
+
+<DEFAULT> TOKEN : { <GLOBAL_INCLUDE_KWD : "#include" > : GlobalInclude }
+ 
+<DEFAULT> SKIP :
+{
+ <"# "(~["\r","\n"])*["\r"]"\n">
+}
+
+
+<GlobalInclude> TOKEN : 
+{
+		< INCLUDE_STRING:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\"","_"]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\"" 
+  > : DEFAULT
+}
+
+<MultiSect> TOKEN : { <
+ MULTI_SECT_END : "~" (" ")* ("\r")?"\n" > : DEFAULT }
+
+<MultiSect> TOKEN : 
+{
+  <MULTILINE_PROP_VALUE : (~["~"] | "\\~")* > 
+}
+
+<CodeSection> TOKEN : 
+{
+	< STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\"","_"]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\""
+  >
+|
+  < UNTERM_STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\"","_"]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )* ["\r"] "\n"
+  >
+  
+} 
+
+<CodeSection> TOKEN : { < CODE_SECTION_END : "~" (" ")* ("\r")?"\n" > : DEFAULT }
+
+<CodeSection> TOKEN : 
+{ 
+  <GLOBAL_KWD : "global" >
+  |
+  <FUNCTION_KWD : "function" >
+  |
+  <INCLUDE_KWD : "@include" >  
+  
+ /*
+  |
+  <FOR_KWD : "for" >
+  |
+  <WHILE_KWD : "while" >
+  |
+  <VAR_KWD : "VAR" >
+  |
+  <TYPEOF_KWD : "typeof" >
+  |
+  <DO_KWD : "do" >
+  |
+  <BREAK_KWD : "break" >
+  |
+  <SWITCH_KWD : "switch" >
+  |
+  <CASE_KWD : "case" >
+  |
+  <GOTO_KWD : "goto" >
+  |
+  <DEFAULT_KWD : "default" >
+  |
+  <RETURN_KWD : "return" >
+  |
+  <ASM_KWD : "asm" >
+  */
+}
+
+<CodeSection> TOKEN : /* SEPARATORS */
+{
+  < LPAREN: "(" >
+| < RPAREN: ")" >
+| < LBRACE : "{" > { blockNestingDepth = 1 ; } : Block  
+| "}" 
+| < LBRACKET: "[" >
+| < RBRACKET: "]" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < DOT: "." >
+}
+
+<CodeSection> TOKEN : /* IDENTIFIERS */
+{
+  < IDENT: <LETTER> (<LETTER>|<DIGIT>)* >
+}
+
+<Block> TOKEN : 
+{
+	< NESTED_LBRACE : "{" > { blockNestingDepth += 1 ; }
+	|
+	< RBRACE : "}" > { 
+    	blockNestingDepth --;
+    	SwitchTo( blockNestingDepth==0 ? CodeSection : Block ) ; 
+    }
+}
+
+<Block> SKIP : 
+{
+    <~[]> 
+}
+
+<SingleSect> TOKEN :
+{
+	< SINGLE_SECT_END : ("\r")?"\n" > : DEFAULT 
+} 
+
+<SingleSect> TOKEN : 
+{
+  < PROP_VALUE : (~["\r","\n"])* >
+}
+
+ASTFramclipseFile FramclipseFile() : {/*@bgen(jjtree) FramclipseFile */
+  ASTFramclipseFile jjtn000 = new ASTFramclipseFile(JJTFRAMCLIPSEFILE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) FramclipseFile */
+  try {
+/*@egen*/
+   /* FObject() (LOOKAHEAD ((<EOL>)+ FObject()) (<EOL>)+ FObject())* (<EOL>)* */  
+  (((FObject()|GlobalInclude()) (<EOL>|<EOF>))|<EOL>)*/*@bgen(jjtree)*/
+  {
+    jjtree.closeNodeScope(jjtn000, true);
+    jjtc000 = false;
+  }
+/*@egen*/  
+  
+  { return jjtn000; }/*@bgen(jjtree)*/
+  } catch (Throwable jjte000) {
+    if (jjtc000) {
+      jjtree.clearNodeScope(jjtn000);
+      jjtc000 = false;
+    } else {
+      jjtree.popNode();
+    }
+    if (jjte000 instanceof RuntimeException) {
+      throw (RuntimeException)jjte000;
+    }
+    if (jjte000 instanceof ParseException) {
+      throw (ParseException)jjte000;
+    }
+    throw (Error)jjte000;
+  } finally {
+    if (jjtc000) {
+      jjtree.closeNodeScope(jjtn000, true);
+    }
+  }
+/*@egen*/
+} 
+
+void FObject() : {/*@bgen(jjtree) FObject */
+  ASTFObject jjtn000 = new ASTFObject(JJTFOBJECT);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/ }
+{/*@bgen(jjtree) FObject */
+   try {
+/*@egen*/
+   {jjtn000.setBeginOffset(charStream.getBeginOffset());}
+   
+   <IDENTIFIER> {
+    jjtn000.setClassName(token.image);
+  }  
+   <SINGLE_SECT_START> (<SINGLE_SECT_END>|<EOF>)
+   
+   	(Property() | CodeSection() )*/*@bgen(jjtree)*/
+   {
+     jjtree.closeNodeScope(jjtn000, true);
+     jjtc000 = false;
+   }
+/*@egen*/
+   
+   { jjtn000.setEndOffset(charStream.getBeginOffset() - 1); }/*@bgen(jjtree)*/
+   } catch (Throwable jjte000) {
+     if (jjtc000) {
+       jjtree.clearNodeScope(jjtn000);
+       jjtc000 = false;
+     } else {
+       jjtree.popNode();
+     }
+     if (jjte000 instanceof RuntimeException) {
+       throw (RuntimeException)jjte000;
+     }
+     if (jjte000 instanceof ParseException) {
+       throw (ParseException)jjte000;
+     }
+     throw (Error)jjte000;
+   } finally {
+     if (jjtc000) {
+       jjtree.closeNodeScope(jjtn000, true);
+     }
+   }
+/*@egen*/
+}
+
+void CodeSection() : {/*@bgen(jjtree) CodeSection */
+  ASTCodeSection jjtn000 = new ASTCodeSection(JJTCODESECTION);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) CodeSection */
+        try {
+/*@egen*/
+	{ jjtn000.setBeginOffset(charStream.getBeginOffset()); }
+	<CODE_SECTION_START> (GlobalDecl() | Function() | IncludeStmt())* <CODE_SECTION_END>/*@bgen(jjtree)*/
+        {
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+        }
+/*@egen*/
+	
+	{ jjtn000.setEndOffset(charStream.getBeginOffset()); }/*@bgen(jjtree)*/
+        } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            throw (RuntimeException)jjte000;
+          }
+          if (jjte000 instanceof ParseException) {
+            throw (ParseException)jjte000;
+          }
+          throw (Error)jjte000;
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/
+}
+
+void Function() : {/*@bgen(jjtree) Function */
+  ASTFunction jjtn000 = new ASTFunction(JJTFUNCTION);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) Function */
+        try {
+/*@egen*/
+	
+	try{
+	<FUNCTION_KWD> { jjtn000.setBeginOffset(charStream.getBeginOffset()); } IdentList() 
+	<LPAREN> [ IdentList() ] <RPAREN> <LBRACE> (CodeBlock())* <RBRACE>
+	}
+	catch(ParseException e)
+	{
+		token_source.SwitchTo(DEFAULT);
+		//error_skipto(new int[] { EOF });
+	}/*@bgen(jjtree)*/
+        {
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+        }
+/*@egen*/ 
+	
+	{ jjtn000.setEndOffset(charStream.getBeginOffset()); }/*@bgen(jjtree)*/
+        } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            throw (RuntimeException)jjte000;
+          }
+          if (jjte000 instanceof ParseException) {
+            throw (ParseException)jjte000;
+          }
+          throw (Error)jjte000;
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/
+}
+
+void GlobalDecl() : {/*@bgen(jjtree) GlobalDecl */
+  ASTGlobalDecl jjtn000 = new ASTGlobalDecl(JJTGLOBALDECL);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) GlobalDecl */
+        try {
+/*@egen*/
+	{ jjtn000.setBeginOffset(charStream.getBeginOffset()); }
+	<GLOBAL_KWD> IdentList() <SEMICOLON>/*@bgen(jjtree)*/
+        {
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+        }
+/*@egen*/
+	{ jjtn000.setEndOffset(charStream.getBeginOffset()); }/*@bgen(jjtree)*/
+        } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            throw (RuntimeException)jjte000;
+          }
+          if (jjte000 instanceof ParseException) {
+            throw (ParseException)jjte000;
+          }
+          throw (Error)jjte000;
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/
+}
+
+void IncludeStmt() : {/*@bgen(jjtree) IncludeStmt */
+  ASTIncludeStmt jjtn000 = new ASTIncludeStmt(JJTINCLUDESTMT);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) IncludeStmt */
+        try {
+/*@egen*/
+	{ jjtn000.setBeginOffset(charStream.getBeginOffset()); }
+	<INCLUDE_KWD>  <STRING_LITERAL> { jjtn000.setFileName(token.image); }/*@bgen(jjtree)*/
+        {
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+        }
+/*@egen*/
+	{ jjtn000.setEndOffset(charStream.getOffset()); }/*@bgen(jjtree)*/
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/ 
+}
+
+void GlobalInclude() : {/*@bgen(jjtree) GlobalInclude */
+  ASTGlobalInclude jjtn000 = new ASTGlobalInclude(JJTGLOBALINCLUDE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) GlobalInclude */
+        try {
+/*@egen*/
+	{ jjtn000.setBeginOffset(charStream.getBeginOffset()); }
+	<GLOBAL_INCLUDE_KWD>  <INCLUDE_STRING> { jjtn000.setFileName(token.image); }/*@bgen(jjtree)*/
+        {
+          jjtree.closeNodeScope(jjtn000, true);
+          jjtc000 = false;
+        }
+/*@egen*/
+	{ jjtn000.setEndOffset(charStream.getOffset()); }/*@bgen(jjtree)*/
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/ 
+}
+
+void IdentList() : {/*@bgen(jjtree) IdentList */
+  ASTIdentList jjtn000 = new ASTIdentList(JJTIDENTLIST);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) IdentList */
+        try {
+/*@egen*/
+	<IDENT> { jjtn000.addIdent(token.image); } (<COMMA> <IDENT> { jjtn000.addIdent(token.image); } )*/*@bgen(jjtree)*/
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/ 
+}
+
+void Property() : {/*@bgen(jjtree) Property */
+  ASTProperty jjtn000 = new ASTProperty(JJTPROPERTY);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) Property */
+        try {
+/*@egen*/
+	{ jjtn000.setBeginOffset(charStream.getBeginOffset()); }
+	
+  <IDENTIFIER> { jjtn000.setName(token.image); }
+    
+  ( SingleLinePropertyValue()/*@bgen(jjtree)*/
+                              {
+                                jjtree.closeNodeScope(jjtn000, true);
+                                jjtc000 = false;
+                              }
+/*@egen*/ { jjtn000.setEndOffset(charStream.getBeginOffset() - 1); } | MultiLinePropertyValue()/*@bgen(jjtree)*/
+                                                                                                                    {
+                                                                                                                      jjtree.closeNodeScope(jjtn000, true);
+                                                                                                                      jjtc000 = false;
+                                                                                                                    }
+/*@egen*/ { jjtn000.setEndOffset(charStream.getBeginOffset()); } )/*@bgen(jjtree)*/
+        } catch (Throwable jjte000) {
+          if (jjtc000) {
+            jjtree.clearNodeScope(jjtn000);
+            jjtc000 = false;
+          } else {
+            jjtree.popNode();
+          }
+          if (jjte000 instanceof RuntimeException) {
+            throw (RuntimeException)jjte000;
+          }
+          if (jjte000 instanceof ParseException) {
+            throw (ParseException)jjte000;
+          }
+          throw (Error)jjte000;
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/
+  
+}
+
+void SingleLinePropertyValue()   : {/*@bgen(jjtree) SingleLinePropertyValue */
+  ASTSingleLinePropertyValue jjtn000 = new ASTSingleLinePropertyValue(JJTSINGLELINEPROPERTYVALUE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) SingleLinePropertyValue */
+        try {
+/*@egen*/
+	<SINGLE_SECT_START> <PROP_VALUE>{ jjtn000.setValue(token.image); } (<SINGLE_SECT_END>| <EOF>)/*@bgen(jjtree)*/
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/
+}
+
+void CodeBlock()       : {}
+{
+	<NESTED_LBRACE> (CodeBlock())* <RBRACE> 
+}
+
+void MultiLinePropertyValue()  : {/*@bgen(jjtree) MultiLinePropertyValue */
+  ASTMultiLinePropertyValue jjtn000 = new ASTMultiLinePropertyValue(JJTMULTILINEPROPERTYVALUE);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+/*@egen*/}
+{/*@bgen(jjtree) MultiLinePropertyValue */
+        try {
+/*@egen*/
+	<MULTI_SECT_START> <MULTILINE_PROP_VALUE> <MULTI_SECT_END>/*@bgen(jjtree)*/
+        } finally {
+          if (jjtc000) {
+            jjtree.closeNodeScope(jjtn000, true);
+          }
+        }
+/*@egen*/
+}
+
+JAVACODE
+void error_skipto(int[] kinds)       {
+  //ParseException e = generateParseException();  // generate the exception object.
+  //System.out.println(e.toString());  // print the error message
+  Token t;
+  if(kinds.length > 0)
+  {
+    java.util.Arrays.sort(kinds);
+    
+  	do {
+    	t = getNextToken();
+  	} while (java.util.Arrays.binarySearch(kinds, t.kind) < 0);
+   
+  }
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.jjt
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.jjt	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParser.jjt	(revision 13)
@@ -0,0 +1,351 @@
+options {
+	JDK_VERSION = "1.5";
+	USER_CHAR_STREAM = true;
+	STATIC = false;
+	MULTI = true;
+}
+
+PARSER_BEGIN(FramclipseNonScriptParser)
+
+package com.framsticks.framclipse.internal.parser;
+
+import java.io.StringReader;
+
+public class FramclipseNonScriptParser {
+
+  private CharStreamWithOffset charStream = null;
+  
+  public java.util.Collection<Exception> exceptions = new java.util.ArrayList<Exception>();
+  
+  public FramclipseNonScriptParser(String input) 
+  {
+	this(new CharStreamWithOffset(new StringReader(input)));
+  }
+	
+  private FramclipseNonScriptParser(CharStreamWithOffset charStream)
+  {
+	this((CharStream)charStream);
+	this.charStream = charStream;
+  }
+  
+  public static void main(String args[]) {
+    String s = "expdef: \n name: urnohorl \n id: horla \n code:~ function kupa(a,b) { yeah \n } \n~\n\n\n";
+    
+    FramclipseNonScriptParser t = new FramclipseNonScriptParser(s);
+    try {
+      SimpleNode n = t.FramclipseFile();
+      n.dump("");
+      System.out.println("Thank you.");
+    } catch (Exception e) {
+      System.out.println("Oops.");
+      System.out.println(e.getMessage());
+      //e.printStackTrace();
+    }
+  }
+}
+
+PARSER_END(FramclipseNonScriptParser)
+
+TOKEN_MGR_DECLS : {
+
+    int blockNestingDepth ; 
+
+}
+
+<CodeSection, Block> SKIP :
+{  
+< "/*"(~["*"])* "*"(~["/"] (~["*"])* "*")* "/" >
+| <"//"(~["\r","\n"])*["\r"]"\n">
+}
+
+<CodeSection, GlobalInclude> SKIP : /* WHITE SPACE */
+{
+  " "
+| "\t"
+| "\r"
+| "\n"
+| "\f"
+} 
+
+<DEFAULT,SingleSect, MultiSect> SKIP : /* WHITE SPACE */
+{
+  " "
+| "\t"
+} 
+
+<DEFAULT> TOKEN : /* IDENTIFIERS */
+{
+  < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>)* >
+|
+  < #LETTER: ["_","a"-"z","A"-"Z"] >
+|
+  < #DIGIT: ["0"-"9"] >
+}
+
+<DEFAULT> TOKEN :
+{
+  < EOL: ("\r")?"\n" >
+}
+
+ 
+
+<DEFAULT> TOKEN : { <CODE_SECTION_START : "code:~" > : CodeSection }
+
+<DEFAULT> TOKEN : { < MULTI_SECT_START : ":~" >  : MultiSect }
+
+<DEFAULT> TOKEN : { <SINGLE_SECT_START : ":" > : SingleSect }
+
+<DEFAULT> TOKEN : { <GLOBAL_INCLUDE_KWD : "#include" > : GlobalInclude }
+ 
+<DEFAULT> SKIP :
+{
+ <"# "(~["\r","\n"])*["\r"]"\n">
+}
+
+
+<GlobalInclude> TOKEN : 
+{
+		< INCLUDE_STRING:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\"","_"]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\"" 
+  > : DEFAULT
+}
+
+<MultiSect> TOKEN : { <
+ MULTI_SECT_END : "~" (" ")* ("\r")?"\n" > : DEFAULT }
+
+<MultiSect> TOKEN : 
+{
+  <MULTILINE_PROP_VALUE : (~["~"] | "\\~")* > 
+}
+
+<CodeSection> TOKEN : 
+{
+	< STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\"","_"]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )*
+      "\""
+  >
+|
+  < UNTERM_STRING_LITERAL:
+      "\""
+      (   (~["\"","\\","\n","\r"])
+        | ("\\"
+            ( ["n","t","b","r","f","\\","'","\"","_"]
+            | ["0"-"7"] ( ["0"-"7"] )?
+            | ["0"-"3"] ["0"-"7"] ["0"-"7"]
+            )
+          )
+      )* ["\r"] "\n"
+  >
+  
+} 
+
+<CodeSection> TOKEN : { < CODE_SECTION_END : "~" (" ")* ("\r")?"\n" > : DEFAULT }
+
+<CodeSection> TOKEN : 
+{ 
+  <GLOBAL_KWD : "global" >
+  |
+  <FUNCTION_KWD : "function" >
+  |
+  <INCLUDE_KWD : "@include" >  
+  
+ /*
+  |
+  <FOR_KWD : "for" >
+  |
+  <WHILE_KWD : "while" >
+  |
+  <VAR_KWD : "VAR" >
+  |
+  <TYPEOF_KWD : "typeof" >
+  |
+  <DO_KWD : "do" >
+  |
+  <BREAK_KWD : "break" >
+  |
+  <SWITCH_KWD : "switch" >
+  |
+  <CASE_KWD : "case" >
+  |
+  <GOTO_KWD : "goto" >
+  |
+  <DEFAULT_KWD : "default" >
+  |
+  <RETURN_KWD : "return" >
+  |
+  <ASM_KWD : "asm" >
+  */
+}
+
+<CodeSection> TOKEN : /* SEPARATORS */
+{
+  < LPAREN: "(" >
+| < RPAREN: ")" >
+| < LBRACE : "{" > { blockNestingDepth = 1 ; } : Block  
+| "}" 
+| < LBRACKET: "[" >
+| < RBRACKET: "]" >
+| < SEMICOLON: ";" >
+| < COMMA: "," >
+| < DOT: "." >
+}
+
+<CodeSection> TOKEN : /* IDENTIFIERS */
+{
+  < IDENT: <LETTER> (<LETTER>|<DIGIT>)* >
+}
+
+<Block> TOKEN : 
+{
+	< NESTED_LBRACE : "{" > { blockNestingDepth += 1 ; }
+	|
+	< RBRACE : "}" > { 
+    	blockNestingDepth --;
+    	SwitchTo( blockNestingDepth==0 ? CodeSection : Block ) ; 
+    }
+}
+
+<Block> SKIP : 
+{
+    <~[]> 
+}
+
+<SingleSect> TOKEN :
+{
+	< SINGLE_SECT_END : ("\r")?"\n" > : DEFAULT 
+} 
+
+<SingleSect> TOKEN : 
+{
+  < PROP_VALUE : (~["\r","\n"])* >
+}
+
+ASTFramclipseFile FramclipseFile() : {}
+{
+   /* FObject() (LOOKAHEAD ((<EOL>)+ FObject()) (<EOL>)+ FObject())* (<EOL>)* */  
+  (((FObject()|GlobalInclude()) (<EOL>|<EOF>))|<EOL>)*  
+  
+  { return jjtThis; }
+} 
+
+void FObject() : { }
+{
+   {jjtThis.setBeginOffset(charStream.getBeginOffset());}
+   
+   <IDENTIFIER> {
+    jjtThis.setClassName(token.image);
+  }  
+   <SINGLE_SECT_START> (<SINGLE_SECT_END>|<EOF>)
+   
+   	(Property() | CodeSection() )*
+   
+   { jjtThis.setEndOffset(charStream.getBeginOffset() - 1); }
+}
+
+void CodeSection() : {}
+{
+	{ jjtThis.setBeginOffset(charStream.getBeginOffset()); }
+	<CODE_SECTION_START> (GlobalDecl() | Function() | IncludeStmt())* <CODE_SECTION_END>
+	
+	{ jjtThis.setEndOffset(charStream.getBeginOffset()); }
+}
+
+void Function() : {}
+{
+	
+	try{
+	<FUNCTION_KWD> { jjtThis.setBeginOffset(charStream.getBeginOffset()); } IdentList() 
+	<LPAREN> [ IdentList() ] <RPAREN> <LBRACE> (CodeBlock())* <RBRACE>
+	}
+	catch(ParseException e)
+	{
+		token_source.SwitchTo(DEFAULT);
+		//error_skipto(new int[] { EOF });
+	} 
+	
+	{ jjtThis.setEndOffset(charStream.getBeginOffset()); }
+}
+
+void GlobalDecl() : {}
+{
+	{ jjtThis.setBeginOffset(charStream.getBeginOffset()); }
+	<GLOBAL_KWD> IdentList() <SEMICOLON>
+	{ jjtThis.setEndOffset(charStream.getBeginOffset()); }
+}
+
+void IncludeStmt() : {}
+{
+	{ jjtThis.setBeginOffset(charStream.getBeginOffset()); }
+	<INCLUDE_KWD>  <STRING_LITERAL> { jjtThis.setFileName(token.image); }
+	{ jjtThis.setEndOffset(charStream.getOffset()); } 
+}
+
+void GlobalInclude() : {}
+{
+	{ jjtThis.setBeginOffset(charStream.getBeginOffset()); }
+	<GLOBAL_INCLUDE_KWD>  <INCLUDE_STRING> { jjtThis.setFileName(token.image); }
+	{ jjtThis.setEndOffset(charStream.getOffset()); } 
+}
+
+void IdentList() : {}
+{
+	<IDENT> { jjtThis.addIdent(token.image); } (<COMMA> <IDENT> { jjtThis.addIdent(token.image); } )* 
+}
+
+void Property() : {}
+{
+	{ jjtThis.setBeginOffset(charStream.getBeginOffset()); }
+	
+  <IDENTIFIER> { jjtThis.setName(token.image); }
+    
+  ( SingleLinePropertyValue() { jjtThis.setEndOffset(charStream.getBeginOffset() - 1); } | MultiLinePropertyValue() { jjtThis.setEndOffset(charStream.getBeginOffset()); } )
+  
+}
+
+void SingleLinePropertyValue()   : {}
+{
+	<SINGLE_SECT_START> <PROP_VALUE>{ jjtThis.setValue(token.image); } (<SINGLE_SECT_END>| <EOF>)
+}
+
+void CodeBlock() #void : {}
+{
+	<NESTED_LBRACE> (CodeBlock())* <RBRACE> 
+}
+
+void MultiLinePropertyValue()  : {}
+{
+	<MULTI_SECT_START> <MULTILINE_PROP_VALUE> <MULTI_SECT_END>
+}
+
+JAVACODE
+void error_skipto(int[] kinds) #void {
+  //ParseException e = generateParseException();  // generate the exception object.
+  //System.out.println(e.toString());  // print the error message
+  Token t;
+  if(kinds.length > 0)
+  {
+    java.util.Arrays.sort(kinds);
+    
+  	do {
+    	t = getNextToken();
+  	} while (java.util.Arrays.binarySearch(kinds, t.kind) < 0);
+   
+  }
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserConstants.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserConstants.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserConstants.java	(revision 13)
@@ -0,0 +1,134 @@
+/* Generated By:JJTree&JavaCC: Do not edit this line. FramclipseNonScriptParserConstants.java */
+package com.framsticks.framclipse.internal.parser;
+
+
+/**
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
+ */
+public interface FramclipseNonScriptParserConstants {
+
+  /** End of File. */
+  int EOF = 0;
+  /** RegularExpression Id. */
+  int IDENTIFIER = 10;
+  /** RegularExpression Id. */
+  int LETTER = 11;
+  /** RegularExpression Id. */
+  int DIGIT = 12;
+  /** RegularExpression Id. */
+  int EOL = 13;
+  /** RegularExpression Id. */
+  int CODE_SECTION_START = 14;
+  /** RegularExpression Id. */
+  int MULTI_SECT_START = 15;
+  /** RegularExpression Id. */
+  int SINGLE_SECT_START = 16;
+  /** RegularExpression Id. */
+  int GLOBAL_INCLUDE_KWD = 17;
+  /** RegularExpression Id. */
+  int INCLUDE_STRING = 19;
+  /** RegularExpression Id. */
+  int MULTI_SECT_END = 20;
+  /** RegularExpression Id. */
+  int MULTILINE_PROP_VALUE = 21;
+  /** RegularExpression Id. */
+  int STRING_LITERAL = 22;
+  /** RegularExpression Id. */
+  int UNTERM_STRING_LITERAL = 23;
+  /** RegularExpression Id. */
+  int CODE_SECTION_END = 24;
+  /** RegularExpression Id. */
+  int GLOBAL_KWD = 25;
+  /** RegularExpression Id. */
+  int FUNCTION_KWD = 26;
+  /** RegularExpression Id. */
+  int INCLUDE_KWD = 27;
+  /** RegularExpression Id. */
+  int LPAREN = 28;
+  /** RegularExpression Id. */
+  int RPAREN = 29;
+  /** RegularExpression Id. */
+  int LBRACE = 30;
+  /** RegularExpression Id. */
+  int LBRACKET = 32;
+  /** RegularExpression Id. */
+  int RBRACKET = 33;
+  /** RegularExpression Id. */
+  int SEMICOLON = 34;
+  /** RegularExpression Id. */
+  int COMMA = 35;
+  /** RegularExpression Id. */
+  int DOT = 36;
+  /** RegularExpression Id. */
+  int IDENT = 37;
+  /** RegularExpression Id. */
+  int NESTED_LBRACE = 38;
+  /** RegularExpression Id. */
+  int RBRACE = 39;
+  /** RegularExpression Id. */
+  int SINGLE_SECT_END = 41;
+  /** RegularExpression Id. */
+  int PROP_VALUE = 42;
+
+  /** Lexical state. */
+  int CodeSection = 0;
+  /** Lexical state. */
+  int Block = 1;
+  /** Lexical state. */
+  int GlobalInclude = 2;
+  /** Lexical state. */
+  int DEFAULT = 3;
+  /** Lexical state. */
+  int SingleSect = 4;
+  /** Lexical state. */
+  int MultiSect = 5;
+
+  /** Literal token values. */
+  String[] tokenImage = {
+    "<EOF>",
+    "<token of kind 1>",
+    "<token of kind 2>",
+    "\" \"",
+    "\"\\t\"",
+    "\"\\r\"",
+    "\"\\n\"",
+    "\"\\f\"",
+    "\" \"",
+    "\"\\t\"",
+    "<IDENTIFIER>",
+    "<LETTER>",
+    "<DIGIT>",
+    "<EOL>",
+    "\"code:~\"",
+    "\":~\"",
+    "\":\"",
+    "\"#include\"",
+    "<token of kind 18>",
+    "<INCLUDE_STRING>",
+    "<MULTI_SECT_END>",
+    "<MULTILINE_PROP_VALUE>",
+    "<STRING_LITERAL>",
+    "<UNTERM_STRING_LITERAL>",
+    "<CODE_SECTION_END>",
+    "\"global\"",
+    "\"function\"",
+    "\"@include\"",
+    "\"(\"",
+    "\")\"",
+    "\"{\"",
+    "\"}\"",
+    "\"[\"",
+    "\"]\"",
+    "\";\"",
+    "\",\"",
+    "\".\"",
+    "<IDENT>",
+    "\"{\"",
+    "\"}\"",
+    "<token of kind 40>",
+    "<SINGLE_SECT_END>",
+    "<PROP_VALUE>",
+  };
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserTokenManager.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserTokenManager.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserTokenManager.java	(revision 13)
@@ -0,0 +1,1793 @@
+/* Generated By:JJTree&JavaCC: Do not edit this line. FramclipseNonScriptParserTokenManager.java */
+package com.framsticks.framclipse.internal.parser;
+import java.io.StringReader;
+
+/** Token Manager. */
+public class FramclipseNonScriptParserTokenManager implements FramclipseNonScriptParserConstants
+{
+    int blockNestingDepth ;
+
+  /** Debug output. */
+  public  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
+  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_3(int pos, long active0)
+{
+   switch (pos)
+   {
+      case 0:
+         if ((active0 & 0x20000L) != 0L)
+            return 4;
+         if ((active0 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 10;
+            return 1;
+         }
+         return -1;
+      case 1:
+         if ((active0 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 10;
+            jjmatchedPos = 1;
+            return 1;
+         }
+         return -1;
+      case 2:
+         if ((active0 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 10;
+            jjmatchedPos = 2;
+            return 1;
+         }
+         return -1;
+      case 3:
+         if ((active0 & 0x4000L) != 0L)
+         {
+            jjmatchedKind = 10;
+            jjmatchedPos = 3;
+            return 1;
+         }
+         return -1;
+      case 4:
+         if ((active0 & 0x4000L) != 0L)
+         {
+            if (jjmatchedPos < 3)
+            {
+               jjmatchedKind = 10;
+               jjmatchedPos = 3;
+            }
+            return -1;
+         }
+         return -1;
+      case 5:
+         if ((active0 & 0x4000L) != 0L)
+         {
+            if (jjmatchedPos < 3)
+            {
+               jjmatchedKind = 10;
+               jjmatchedPos = 3;
+            }
+            return -1;
+         }
+         return -1;
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_3(int pos, long active0)
+{
+   return jjMoveNfa_3(jjStopStringLiteralDfa_3(pos, active0), pos + 1);
+}
+private int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_3()
+{
+   switch(curChar)
+   {
+      case 35:
+         return jjMoveStringLiteralDfa1_3(0x20000L);
+      case 58:
+         jjmatchedKind = 16;
+         return jjMoveStringLiteralDfa1_3(0x8000L);
+      case 99:
+         return jjMoveStringLiteralDfa1_3(0x4000L);
+      default :
+         return jjMoveNfa_3(0, 0);
+   }
+}
+private int jjMoveStringLiteralDfa1_3(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(0, active0);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 105:
+         return jjMoveStringLiteralDfa2_3(active0, 0x20000L);
+      case 111:
+         return jjMoveStringLiteralDfa2_3(active0, 0x4000L);
+      case 126:
+         if ((active0 & 0x8000L) != 0L)
+            return jjStopAtPos(1, 15);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_3(0, active0);
+}
+private int jjMoveStringLiteralDfa2_3(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_3(0, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(1, active0);
+      return 2;
+   }
+   switch(curChar)
+   {
+      case 100:
+         return jjMoveStringLiteralDfa3_3(active0, 0x4000L);
+      case 110:
+         return jjMoveStringLiteralDfa3_3(active0, 0x20000L);
+      default :
+         break;
+   }
+   return jjStartNfa_3(1, active0);
+}
+private int jjMoveStringLiteralDfa3_3(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_3(1, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(2, active0);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 99:
+         return jjMoveStringLiteralDfa4_3(active0, 0x20000L);
+      case 101:
+         return jjMoveStringLiteralDfa4_3(active0, 0x4000L);
+      default :
+         break;
+   }
+   return jjStartNfa_3(2, active0);
+}
+private int jjMoveStringLiteralDfa4_3(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_3(2, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(3, active0);
+      return 4;
+   }
+   switch(curChar)
+   {
+      case 58:
+         return jjMoveStringLiteralDfa5_3(active0, 0x4000L);
+      case 108:
+         return jjMoveStringLiteralDfa5_3(active0, 0x20000L);
+      default :
+         break;
+   }
+   return jjStartNfa_3(3, active0);
+}
+private int jjMoveStringLiteralDfa5_3(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_3(3, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(4, active0);
+      return 5;
+   }
+   switch(curChar)
+   {
+      case 117:
+         return jjMoveStringLiteralDfa6_3(active0, 0x20000L);
+      case 126:
+         if ((active0 & 0x4000L) != 0L)
+            return jjStopAtPos(5, 14);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_3(4, active0);
+}
+private int jjMoveStringLiteralDfa6_3(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_3(4, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(5, active0);
+      return 6;
+   }
+   switch(curChar)
+   {
+      case 100:
+         return jjMoveStringLiteralDfa7_3(active0, 0x20000L);
+      default :
+         break;
+   }
+   return jjStartNfa_3(5, active0);
+}
+private int jjMoveStringLiteralDfa7_3(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_3(5, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(6, active0);
+      return 7;
+   }
+   switch(curChar)
+   {
+      case 101:
+         if ((active0 & 0x20000L) != 0L)
+            return jjStopAtPos(7, 17);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_3(6, active0);
+}
+static final long[] jjbitVec0 = {
+   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private int jjMoveNfa_3(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 9;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if (curChar == 35)
+                     jjstateSet[jjnewStateCnt++] = 4;
+                  else if (curChar == 10)
+                  {
+                     if (kind > 13)
+                        kind = 13;
+                  }
+                  else if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 3;
+                  break;
+               case 1:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 10)
+                     kind = 10;
+                  jjstateSet[jjnewStateCnt++] = 1;
+                  break;
+               case 2:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 3;
+                  break;
+               case 3:
+                  if (curChar == 10 && kind > 13)
+                     kind = 13;
+                  break;
+               case 4:
+                  if (curChar == 32)
+                     jjCheckNAddTwoStates(5, 6);
+                  break;
+               case 5:
+                  if ((0xffffffffffffdbffL & l) != 0L)
+                     jjCheckNAddTwoStates(5, 6);
+                  break;
+               case 6:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 7;
+                  break;
+               case 7:
+                  if (curChar == 10 && kind > 18)
+                     kind = 18;
+                  break;
+               case 8:
+                  if (curChar == 35)
+                     jjstateSet[jjnewStateCnt++] = 4;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+               case 1:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 10)
+                     kind = 10;
+                  jjCheckNAdd(1);
+                  break;
+               case 5:
+                  jjAddStates(0, 1);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 5:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(0, 1);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 9 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private final int jjStopStringLiteralDfa_1(int pos, long active0)
+{
+   switch (pos)
+   {
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_1(int pos, long active0)
+{
+   return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
+}
+private int jjMoveStringLiteralDfa0_1()
+{
+   switch(curChar)
+   {
+      case 123:
+         return jjStopAtPos(0, 38);
+      case 125:
+         return jjStopAtPos(0, 39);
+      default :
+         return jjMoveNfa_1(0, 0);
+   }
+}
+private int jjMoveNfa_1(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 11;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if (curChar == 47)
+                     jjAddStates(2, 3);
+                  break;
+               case 1:
+                  if (curChar == 42)
+                     jjCheckNAddTwoStates(2, 3);
+                  break;
+               case 2:
+                  if ((0xfffffbffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(2, 3);
+                  break;
+               case 3:
+                  if (curChar == 42)
+                     jjAddStates(4, 5);
+                  break;
+               case 4:
+                  if ((0xffff7fffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(5, 3);
+                  break;
+               case 5:
+                  if ((0xfffffbffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(5, 3);
+                  break;
+               case 6:
+                  if (curChar == 47 && kind > 1)
+                     kind = 1;
+                  break;
+               case 7:
+                  if (curChar == 47)
+                     jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 8:
+                  if ((0xffffffffffffdbffL & l) != 0L)
+                     jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 9:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 10;
+                  break;
+               case 10:
+                  if (curChar == 10 && kind > 2)
+                     kind = 2;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 2:
+                  jjCheckNAddTwoStates(2, 3);
+                  break;
+               case 4:
+               case 5:
+                  jjCheckNAddTwoStates(5, 3);
+                  break;
+               case 8:
+                  jjAddStates(6, 7);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 2:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddTwoStates(2, 3);
+                  break;
+               case 4:
+               case 5:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddTwoStates(5, 3);
+                  break;
+               case 8:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(6, 7);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 11 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private final int jjStopStringLiteralDfa_0(int pos, long active0)
+{
+   switch (pos)
+   {
+      case 0:
+         if ((active0 & 0x6000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            return 5;
+         }
+         return -1;
+      case 1:
+         if ((active0 & 0x6000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            jjmatchedPos = 1;
+            return 5;
+         }
+         return -1;
+      case 2:
+         if ((active0 & 0x6000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            jjmatchedPos = 2;
+            return 5;
+         }
+         return -1;
+      case 3:
+         if ((active0 & 0x6000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            jjmatchedPos = 3;
+            return 5;
+         }
+         return -1;
+      case 4:
+         if ((active0 & 0x6000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            jjmatchedPos = 4;
+            return 5;
+         }
+         return -1;
+      case 5:
+         if ((active0 & 0x2000000L) != 0L)
+            return 5;
+         if ((active0 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            jjmatchedPos = 5;
+            return 5;
+         }
+         return -1;
+      case 6:
+         if ((active0 & 0x4000000L) != 0L)
+         {
+            jjmatchedKind = 37;
+            jjmatchedPos = 6;
+            return 5;
+         }
+         return -1;
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_0(int pos, long active0)
+{
+   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+}
+private int jjMoveStringLiteralDfa0_0()
+{
+   switch(curChar)
+   {
+      case 40:
+         return jjStopAtPos(0, 28);
+      case 41:
+         return jjStopAtPos(0, 29);
+      case 44:
+         return jjStopAtPos(0, 35);
+      case 46:
+         return jjStopAtPos(0, 36);
+      case 59:
+         return jjStopAtPos(0, 34);
+      case 64:
+         return jjMoveStringLiteralDfa1_0(0x8000000L);
+      case 91:
+         return jjStopAtPos(0, 32);
+      case 93:
+         return jjStopAtPos(0, 33);
+      case 102:
+         return jjMoveStringLiteralDfa1_0(0x4000000L);
+      case 103:
+         return jjMoveStringLiteralDfa1_0(0x2000000L);
+      case 123:
+         return jjStopAtPos(0, 30);
+      case 125:
+         return jjStopAtPos(0, 31);
+      default :
+         return jjMoveNfa_0(0, 0);
+   }
+}
+private int jjMoveStringLiteralDfa1_0(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(0, active0);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 105:
+         return jjMoveStringLiteralDfa2_0(active0, 0x8000000L);
+      case 108:
+         return jjMoveStringLiteralDfa2_0(active0, 0x2000000L);
+      case 117:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(0, active0);
+}
+private int jjMoveStringLiteralDfa2_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(0, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(1, active0);
+      return 2;
+   }
+   switch(curChar)
+   {
+      case 110:
+         return jjMoveStringLiteralDfa3_0(active0, 0xc000000L);
+      case 111:
+         return jjMoveStringLiteralDfa3_0(active0, 0x2000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(1, active0);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(1, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(2, active0);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 98:
+         return jjMoveStringLiteralDfa4_0(active0, 0x2000000L);
+      case 99:
+         return jjMoveStringLiteralDfa4_0(active0, 0xc000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(2, active0);
+}
+private int jjMoveStringLiteralDfa4_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(2, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(3, active0);
+      return 4;
+   }
+   switch(curChar)
+   {
+      case 97:
+         return jjMoveStringLiteralDfa5_0(active0, 0x2000000L);
+      case 108:
+         return jjMoveStringLiteralDfa5_0(active0, 0x8000000L);
+      case 116:
+         return jjMoveStringLiteralDfa5_0(active0, 0x4000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(3, active0);
+}
+private int jjMoveStringLiteralDfa5_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(3, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(4, active0);
+      return 5;
+   }
+   switch(curChar)
+   {
+      case 105:
+         return jjMoveStringLiteralDfa6_0(active0, 0x4000000L);
+      case 108:
+         if ((active0 & 0x2000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 25, 5);
+         break;
+      case 117:
+         return jjMoveStringLiteralDfa6_0(active0, 0x8000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(4, active0);
+}
+private int jjMoveStringLiteralDfa6_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(4, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(5, active0);
+      return 6;
+   }
+   switch(curChar)
+   {
+      case 100:
+         return jjMoveStringLiteralDfa7_0(active0, 0x8000000L);
+      case 111:
+         return jjMoveStringLiteralDfa7_0(active0, 0x4000000L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(5, active0);
+}
+private int jjMoveStringLiteralDfa7_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(5, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(6, active0);
+      return 7;
+   }
+   switch(curChar)
+   {
+      case 101:
+         if ((active0 & 0x8000000L) != 0L)
+            return jjStopAtPos(7, 27);
+         break;
+      case 110:
+         if ((active0 & 0x4000000L) != 0L)
+            return jjStartNfaWithStates_0(7, 26, 5);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(6, active0);
+}
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
+}
+private int jjMoveNfa_0(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 35;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if (curChar == 34)
+                     jjCheckNAddStates(8, 13);
+                  else if (curChar == 47)
+                     jjAddStates(14, 15);
+                  break;
+               case 1:
+                  if (curChar == 32)
+                     jjCheckNAddStates(16, 18);
+                  break;
+               case 2:
+                  if (curChar == 13)
+                     jjCheckNAdd(3);
+                  break;
+               case 3:
+                  if (curChar == 10 && kind > 24)
+                     kind = 24;
+                  break;
+               case 5:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 37)
+                     kind = 37;
+                  jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 6:
+                  if (curChar == 47)
+                     jjAddStates(14, 15);
+                  break;
+               case 7:
+                  if (curChar == 42)
+                     jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 8:
+                  if ((0xfffffbffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 9:
+                  if (curChar == 42)
+                     jjAddStates(19, 20);
+                  break;
+               case 10:
+                  if ((0xffff7fffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(11, 9);
+                  break;
+               case 11:
+                  if ((0xfffffbffffffffffL & l) != 0L)
+                     jjCheckNAddTwoStates(11, 9);
+                  break;
+               case 12:
+                  if (curChar == 47 && kind > 1)
+                     kind = 1;
+                  break;
+               case 13:
+                  if (curChar == 47)
+                     jjCheckNAddTwoStates(14, 15);
+                  break;
+               case 14:
+                  if ((0xffffffffffffdbffL & l) != 0L)
+                     jjCheckNAddTwoStates(14, 15);
+                  break;
+               case 15:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 16;
+                  break;
+               case 16:
+                  if (curChar == 10 && kind > 2)
+                     kind = 2;
+                  break;
+               case 17:
+                  if (curChar == 34)
+                     jjCheckNAddStates(8, 13);
+                  break;
+               case 18:
+                  if ((0xfffffffbffffdbffL & l) != 0L)
+                     jjCheckNAddStates(21, 23);
+                  break;
+               case 20:
+                  if ((0x8400000000L & l) != 0L)
+                     jjCheckNAddStates(21, 23);
+                  break;
+               case 21:
+                  if (curChar == 34 && kind > 22)
+                     kind = 22;
+                  break;
+               case 22:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAddStates(24, 27);
+                  break;
+               case 23:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAddStates(21, 23);
+                  break;
+               case 24:
+                  if ((0xf000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 25;
+                  break;
+               case 25:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAdd(23);
+                  break;
+               case 26:
+                  if ((0xfffffffbffffdbffL & l) != 0L)
+                     jjCheckNAddStates(28, 30);
+                  break;
+               case 28:
+                  if ((0x8400000000L & l) != 0L)
+                     jjCheckNAddStates(28, 30);
+                  break;
+               case 29:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 30;
+                  break;
+               case 30:
+                  if (curChar == 10 && kind > 23)
+                     kind = 23;
+                  break;
+               case 31:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAddStates(31, 34);
+                  break;
+               case 32:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAddStates(28, 30);
+                  break;
+               case 33:
+                  if ((0xf000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 34;
+                  break;
+               case 34:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAdd(32);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 37)
+                        kind = 37;
+                     jjCheckNAdd(5);
+                  }
+                  else if (curChar == 126)
+                     jjAddStates(16, 18);
+                  break;
+               case 4:
+               case 5:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 37)
+                     kind = 37;
+                  jjCheckNAdd(5);
+                  break;
+               case 8:
+                  jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 10:
+               case 11:
+                  jjCheckNAddTwoStates(11, 9);
+                  break;
+               case 14:
+                  jjAddStates(35, 36);
+                  break;
+               case 18:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     jjCheckNAddStates(21, 23);
+                  break;
+               case 19:
+                  if (curChar == 92)
+                     jjAddStates(37, 39);
+                  break;
+               case 20:
+                  if ((0x14404490000000L & l) != 0L)
+                     jjCheckNAddStates(21, 23);
+                  break;
+               case 26:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     jjCheckNAddStates(28, 30);
+                  break;
+               case 27:
+                  if (curChar == 92)
+                     jjAddStates(40, 42);
+                  break;
+               case 28:
+                  if ((0x14404490000000L & l) != 0L)
+                     jjCheckNAddStates(28, 30);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 8:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 10:
+               case 11:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddTwoStates(11, 9);
+                  break;
+               case 14:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(35, 36);
+                  break;
+               case 18:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(21, 23);
+                  break;
+               case 26:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(28, 30);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 35 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private final int jjStopStringLiteralDfa_4(int pos, long active0)
+{
+   switch (pos)
+   {
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_4(int pos, long active0)
+{
+   return jjMoveNfa_4(jjStopStringLiteralDfa_4(pos, active0), pos + 1);
+}
+private int jjMoveStringLiteralDfa0_4()
+{
+   switch(curChar)
+   {
+      case 9:
+         return jjStartNfaWithStates_4(0, 9, 2);
+      case 32:
+         return jjStartNfaWithStates_4(0, 8, 2);
+      default :
+         return jjMoveNfa_4(0, 0);
+   }
+}
+private int jjStartNfaWithStates_4(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_4(state, pos + 1);
+}
+private int jjMoveNfa_4(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 3;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0xffffffffffffdbffL & l) != 0L)
+                  {
+                     if (kind > 42)
+                        kind = 42;
+                     jjCheckNAdd(2);
+                  }
+                  else if (curChar == 10)
+                  {
+                     if (kind > 41)
+                        kind = 41;
+                  }
+                  else if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 1;
+                  break;
+               case 1:
+                  if (curChar == 10)
+                     kind = 41;
+                  break;
+               case 2:
+                  if ((0xffffffffffffdbffL & l) == 0L)
+                     break;
+                  kind = 42;
+                  jjCheckNAdd(2);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+               case 2:
+                  kind = 42;
+                  jjCheckNAdd(2);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+               case 2:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 42)
+                     kind = 42;
+                  jjCheckNAdd(2);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private final int jjStopStringLiteralDfa_2(int pos, long active0)
+{
+   switch (pos)
+   {
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_2(int pos, long active0)
+{
+   return jjMoveNfa_2(jjStopStringLiteralDfa_2(pos, active0), pos + 1);
+}
+private int jjMoveStringLiteralDfa0_2()
+{
+   switch(curChar)
+   {
+      default :
+         return jjMoveNfa_2(0, 0);
+   }
+}
+private int jjMoveNfa_2(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 9;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if (curChar == 34)
+                     jjCheckNAddStates(43, 45);
+                  break;
+               case 1:
+                  if ((0xfffffffbffffdbffL & l) != 0L)
+                     jjCheckNAddStates(43, 45);
+                  break;
+               case 3:
+                  if ((0x8400000000L & l) != 0L)
+                     jjCheckNAddStates(43, 45);
+                  break;
+               case 4:
+                  if (curChar == 34 && kind > 19)
+                     kind = 19;
+                  break;
+               case 5:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAddStates(46, 49);
+                  break;
+               case 6:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAddStates(43, 45);
+                  break;
+               case 7:
+                  if ((0xf000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 8;
+                  break;
+               case 8:
+                  if ((0xff000000000000L & l) != 0L)
+                     jjCheckNAdd(6);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 1:
+                  if ((0xffffffffefffffffL & l) != 0L)
+                     jjCheckNAddStates(43, 45);
+                  break;
+               case 2:
+                  if (curChar == 92)
+                     jjAddStates(50, 52);
+                  break;
+               case 3:
+                  if ((0x14404490000000L & l) != 0L)
+                     jjCheckNAddStates(43, 45);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 1:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjAddStates(43, 45);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 9 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private final int jjStopStringLiteralDfa_5(int pos, long active0)
+{
+   switch (pos)
+   {
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_5(int pos, long active0)
+{
+   return jjMoveNfa_5(jjStopStringLiteralDfa_5(pos, active0), pos + 1);
+}
+private int jjMoveStringLiteralDfa0_5()
+{
+   switch(curChar)
+   {
+      case 9:
+         return jjStartNfaWithStates_5(0, 9, 7);
+      case 32:
+         return jjStartNfaWithStates_5(0, 8, 7);
+      default :
+         return jjMoveNfa_5(0, 0);
+   }
+}
+private int jjStartNfaWithStates_5(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_5(state, pos + 1);
+}
+private int jjMoveNfa_5(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 7;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+               case 4:
+                  if (kind > 21)
+                     kind = 21;
+                  jjCheckNAddTwoStates(4, 6);
+                  break;
+               case 7:
+                  if (kind > 21)
+                     kind = 21;
+                  jjCheckNAddTwoStates(4, 6);
+                  break;
+               case 1:
+                  if (curChar == 32)
+                     jjCheckNAddStates(16, 18);
+                  break;
+               case 2:
+                  if (curChar == 13)
+                     jjCheckNAdd(3);
+                  break;
+               case 3:
+                  if (curChar == 10 && kind > 20)
+                     kind = 20;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+                  if ((0xbfffffffffffffffL & l) != 0L)
+                  {
+                     if (kind > 21)
+                        kind = 21;
+                     jjCheckNAddTwoStates(4, 6);
+                  }
+                  else if (curChar == 126)
+                     jjAddStates(16, 18);
+                  if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 7:
+                  if ((0xbfffffffffffffffL & l) != 0L)
+                  {
+                     if (kind > 21)
+                        kind = 21;
+                     jjCheckNAddTwoStates(4, 6);
+                  }
+                  if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 4:
+                  if ((0xbfffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 21)
+                     kind = 21;
+                  jjCheckNAddTwoStates(4, 6);
+                  break;
+               case 5:
+                  if (curChar != 126)
+                     break;
+                  if (kind > 21)
+                     kind = 21;
+                  jjCheckNAddTwoStates(4, 6);
+                  break;
+               case 6:
+                  if (curChar == 92)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 0:
+               case 4:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 21)
+                     kind = 21;
+                  jjCheckNAddTwoStates(4, 6);
+                  break;
+               case 7:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 21)
+                     kind = 21;
+                  jjCheckNAddTwoStates(4, 6);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 7 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+static final int[] jjnextStates = {
+   5, 6, 1, 7, 4, 6, 8, 9, 18, 19, 21, 26, 27, 29, 7, 13, 
+   1, 2, 3, 10, 12, 18, 19, 21, 18, 19, 23, 21, 26, 27, 29, 26, 
+   27, 32, 29, 14, 15, 20, 22, 24, 28, 31, 33, 1, 2, 4, 1, 2, 
+   6, 4, 3, 5, 7, 
+};
+
+/** Token literal values. */
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, null, null, null, null, null, 
+null, "\143\157\144\145\72\176", "\72\176", "\72", 
+"\43\151\156\143\154\165\144\145", null, null, null, null, null, null, null, "\147\154\157\142\141\154", 
+"\146\165\156\143\164\151\157\156", "\100\151\156\143\154\165\144\145", "\50", "\51", "\173", "\175", "\133", 
+"\135", "\73", "\54", "\56", null, "\173", "\175", null, null, null, };
+
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+   "CodeSection",
+   "Block",
+   "GlobalInclude",
+   "DEFAULT",
+   "SingleSect",
+   "MultiSect",
+};
+
+/** Lex State array. */
+public static final int[] jjnewLexState = {
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 5, 4, 2, -1, 3, 3, -1, -1, -1, 3, 
+   -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1, 
+};
+static final long[] jjtoToken = {
+   0x6fffffbe401L, 
+};
+static final long[] jjtoSkip = {
+   0x100000403feL, 
+};
+protected CharStream input_stream;
+private final int[] jjrounds = new int[35];
+private final int[] jjstateSet = new int[70];
+private final StringBuilder jjimage = new StringBuilder();
+private StringBuilder image = jjimage;
+private int jjimageLen;
+private int lengthOfMatch;
+protected char curChar;
+/** Constructor. */
+public FramclipseNonScriptParserTokenManager(CharStream stream){
+   input_stream = stream;
+}
+
+/** Constructor. */
+public FramclipseNonScriptParserTokenManager(CharStream stream, int lexState){
+   this(stream);
+   SwitchTo(lexState);
+}
+
+/** Reinitialise parser. */
+public void ReInit(CharStream stream)
+{
+   jjmatchedPos = jjnewStateCnt = 0;
+   curLexState = defaultLexState;
+   input_stream = stream;
+   ReInitRounds();
+}
+private void ReInitRounds()
+{
+   int i;
+   jjround = 0x80000001;
+   for (i = 35; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+}
+
+/** Reinitialise parser. */
+public void ReInit(CharStream stream, int lexState)
+{
+   ReInit(stream);
+   SwitchTo(lexState);
+}
+
+/** Switch to specified lex state. */
+public void SwitchTo(int lexState)
+{
+   if (lexState >= 6 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+   else
+      curLexState = lexState;
+}
+
+protected Token jjFillToken()
+{
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
+   if (jjmatchedPos < 0)
+   {
+      if (image == null)
+         curTokenImage = "";
+      else
+         curTokenImage = image.toString();
+      beginLine = endLine = input_stream.getBeginLine();
+      beginColumn = endColumn = input_stream.getBeginColumn();
+   }
+   else
+   {
+      String im = jjstrLiteralImages[jjmatchedKind];
+      curTokenImage = (im == null) ? input_stream.GetImage() : im;
+      beginLine = input_stream.getBeginLine();
+      beginColumn = input_stream.getBeginColumn();
+      endLine = input_stream.getEndLine();
+      endColumn = input_stream.getEndColumn();
+   }
+   t = Token.newToken(jjmatchedKind);
+   t.kind = jjmatchedKind;
+   t.image = curTokenImage;
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
+   return t;
+}
+
+int curLexState = 3;
+int defaultLexState = 3;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+/** Get the next Token. */
+public Token getNextToken() 
+{
+  Token matchedToken;
+  int curPos = 0;
+
+  EOFLoop :
+  for (;;)
+  {
+   try
+   {
+      curChar = input_stream.BeginToken();
+   }
+   catch(java.io.IOException e)
+   {
+      jjmatchedKind = 0;
+      matchedToken = jjFillToken();
+      return matchedToken;
+   }
+   image = jjimage;
+   image.setLength(0);
+   jjimageLen = 0;
+
+   switch(curLexState)
+   {
+     case 0:
+       try { input_stream.backup(0);
+          while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L)
+             curChar = input_stream.BeginToken();
+       }
+       catch (java.io.IOException e1) { continue EOFLoop; }
+       jjmatchedKind = 0x7fffffff;
+       jjmatchedPos = 0;
+       curPos = jjMoveStringLiteralDfa0_0();
+       break;
+     case 1:
+       jjmatchedKind = 0x7fffffff;
+       jjmatchedPos = 0;
+       curPos = jjMoveStringLiteralDfa0_1();
+       if (jjmatchedPos == 0 && jjmatchedKind > 40)
+       {
+          jjmatchedKind = 40;
+       }
+       break;
+     case 2:
+       try { input_stream.backup(0);
+          while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L)
+             curChar = input_stream.BeginToken();
+       }
+       catch (java.io.IOException e1) { continue EOFLoop; }
+       jjmatchedKind = 0x7fffffff;
+       jjmatchedPos = 0;
+       curPos = jjMoveStringLiteralDfa0_2();
+       break;
+     case 3:
+       try { input_stream.backup(0);
+          while (curChar <= 32 && (0x100000200L & (1L << curChar)) != 0L)
+             curChar = input_stream.BeginToken();
+       }
+       catch (java.io.IOException e1) { continue EOFLoop; }
+       jjmatchedKind = 0x7fffffff;
+       jjmatchedPos = 0;
+       curPos = jjMoveStringLiteralDfa0_3();
+       break;
+     case 4:
+       jjmatchedKind = 42;
+       jjmatchedPos = -1;
+       curPos = 0;
+       curPos = jjMoveStringLiteralDfa0_4();
+       break;
+     case 5:
+       jjmatchedKind = 21;
+       jjmatchedPos = -1;
+       curPos = 0;
+       curPos = jjMoveStringLiteralDfa0_5();
+       break;
+   }
+     if (jjmatchedKind != 0x7fffffff)
+     {
+        if (jjmatchedPos + 1 < curPos)
+           input_stream.backup(curPos - jjmatchedPos - 1);
+        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+        {
+           matchedToken = jjFillToken();
+           TokenLexicalActions(matchedToken);
+       if (jjnewLexState[jjmatchedKind] != -1)
+         curLexState = jjnewLexState[jjmatchedKind];
+           return matchedToken;
+        }
+        else
+        {
+         if (jjnewLexState[jjmatchedKind] != -1)
+           curLexState = jjnewLexState[jjmatchedKind];
+           continue EOFLoop;
+        }
+     }
+     int error_line = input_stream.getEndLine();
+     int error_column = input_stream.getEndColumn();
+     String error_after = null;
+     boolean EOFSeen = false;
+     try { input_stream.readChar(); input_stream.backup(1); }
+     catch (java.io.IOException e1) {
+        EOFSeen = true;
+        error_after = curPos <= 1 ? "" : input_stream.GetImage();
+        if (curChar == '\n' || curChar == '\r') {
+           error_line++;
+           error_column = 0;
+        }
+        else
+           error_column++;
+     }
+     if (!EOFSeen) {
+        input_stream.backup(1);
+        error_after = curPos <= 1 ? "" : input_stream.GetImage();
+     }
+     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+  }
+}
+
+int[] jjemptyLineNo = new int[6];
+int[] jjemptyColNo = new int[6];
+boolean[] jjbeenHere = new boolean[6];
+void TokenLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      case 20 :
+         break;
+      case 21 :
+         if (jjmatchedPos == -1)
+         {
+            if (jjbeenHere[5] &&
+                jjemptyLineNo[5] == input_stream.getBeginLine() &&
+                jjemptyColNo[5] == input_stream.getBeginColumn())
+               throw new TokenMgrError(("Error: Bailing out of infinite loop caused by repeated empty string matches at line " + input_stream.getBeginLine() + ", column " + input_stream.getBeginColumn() + "."), TokenMgrError.LOOP_DETECTED);
+            jjemptyLineNo[5] = input_stream.getBeginLine();
+            jjemptyColNo[5] = input_stream.getBeginColumn();
+            jjbeenHere[5] = true;
+         }
+         break;
+      case 30 :
+        image.append(jjstrLiteralImages[30]);
+        lengthOfMatch = jjstrLiteralImages[30].length();
+                     blockNestingDepth = 1 ;
+         break;
+      case 38 :
+        image.append(jjstrLiteralImages[38]);
+        lengthOfMatch = jjstrLiteralImages[38].length();
+                                  blockNestingDepth += 1 ;
+         break;
+      case 39 :
+        image.append(jjstrLiteralImages[39]);
+        lengthOfMatch = jjstrLiteralImages[39].length();
+        blockNestingDepth --;
+        SwitchTo( blockNestingDepth==0 ? CodeSection : Block ) ;
+         break;
+      case 41 :
+         break;
+      case 42 :
+         if (jjmatchedPos == -1)
+         {
+            if (jjbeenHere[4] &&
+                jjemptyLineNo[4] == input_stream.getBeginLine() &&
+                jjemptyColNo[4] == input_stream.getBeginColumn())
+               throw new TokenMgrError(("Error: Bailing out of infinite loop caused by repeated empty string matches at line " + input_stream.getBeginLine() + ", column " + input_stream.getBeginColumn() + "."), TokenMgrError.LOOP_DETECTED);
+            jjemptyLineNo[4] = input_stream.getBeginLine();
+            jjemptyColNo[4] = input_stream.getBeginColumn();
+            jjbeenHere[4] = true;
+         }
+         break;
+      default :
+         break;
+   }
+}
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserTreeConstants.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserTreeConstants.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseNonScriptParserTreeConstants.java	(revision 13)
@@ -0,0 +1,35 @@
+/* Generated By:JavaCC: Do not edit this line. FramclipseNonScriptParserTreeConstants.java Version 4.2 */
+package com.framsticks.framclipse.internal.parser;
+
+public interface FramclipseNonScriptParserTreeConstants
+{
+  public int JJTFRAMCLIPSEFILE = 0;
+  public int JJTFOBJECT = 1;
+  public int JJTCODESECTION = 2;
+  public int JJTFUNCTION = 3;
+  public int JJTGLOBALDECL = 4;
+  public int JJTINCLUDESTMT = 5;
+  public int JJTGLOBALINCLUDE = 6;
+  public int JJTIDENTLIST = 7;
+  public int JJTPROPERTY = 8;
+  public int JJTSINGLELINEPROPERTYVALUE = 9;
+  public int JJTVOID = 10;
+  public int JJTMULTILINEPROPERTYVALUE = 11;
+
+
+  public String[] jjtNodeName = {
+    "FramclipseFile",
+    "FObject",
+    "CodeSection",
+    "Function",
+    "GlobalDecl",
+    "IncludeStmt",
+    "GlobalInclude",
+    "IdentList",
+    "Property",
+    "SingleLinePropertyValue",
+    "void",
+    "MultiLinePropertyValue",
+  };
+}
+/* JavaCC - OriginalChecksum=d4e20cec85b7d957a56106b805797bba (do not edit this line) */
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseParser.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseParser.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/FramclipseParser.java	(revision 13)
@@ -0,0 +1,87 @@
+package com.framsticks.framclipse.internal.parser;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.net.URL;
+
+import com.framsticks.framclipse.editors.EditorType;
+
+
+public class FramclipseParser {
+
+	public final static void recursiveSetOffset(Node root,int begin,int end){
+		final int modelNumChild = root.jjtGetNumChildren();
+		for (int i = 0; i < modelNumChild; ++i) {
+			final Node child = root.jjtGetChild(i);
+			if (child instanceof ElementWithOffset) {
+				final ElementWithOffset ewo = (ElementWithOffset) child;
+				ewo.setBeginOffset(begin);
+				ewo.setEndOffset(end);
+			}
+			recursiveSetOffset(child, begin, end);
+		}
+		
+	}
+	
+	public Node parse(String content, EditorType editorType, URL url) {
+		if (editorType.equals(EditorType.FRAMSCRIPT)) {
+
+		} else {
+			try {
+				FramclipseNonScriptParser parser = new FramclipseNonScriptParser(
+						content);
+				ElementWithOffset model = parser.FramclipseFile();
+				model.setBeginOffset(0);
+				model.setEndOffset(content.length() - 1);
+				if (url == null) return model;
+				String path = url.toString();
+				path = path.substring(0, path.lastIndexOf('/') + 1);
+				// if (File.separatorChar != '/')
+				// path = path.replace('/', File.separatorChar);
+
+				final int modelNumChild = model.jjtGetNumChildren();
+				for (int i = 0; i < modelNumChild; ++i) {
+					final Node child = model.jjtGetChild(i);
+					if (child instanceof ASTGlobalInclude) {
+						final ASTGlobalInclude inc = (ASTGlobalInclude) child;
+						final String fname = inc.getFileName();
+						if (!"N/A".equals(fname)) {
+							try {
+								final URL incurl = new URL(path + fname);
+								final InputStream stream = incurl.openStream();
+								final CharStreamWithOffset cs = new CharStreamWithOffset(stream);
+								final FramclipseNonScriptParser parser2 = new FramclipseNonScriptParser(
+										cs);
+								final Field fld = FramclipseNonScriptParser.class.getDeclaredField("charStream");
+								fld.setAccessible(true);
+								fld.set(parser2, cs);								
+								final ASTFramclipseFile include = parser2
+										.FramclipseFile();
+								for (int j = 0; j < include.jjtGetNumChildren(); ++j) {
+									final Node ic = include.jjtGetChild(j);
+									inc.jjtAddChild(ic, j);
+									ic.jjtSetParent(inc);
+								} 
+								recursiveSetOffset(inc, inc.getBeginOffset(), inc.getEndOffset());
+							} catch (Throwable e) {
+								inc.setValid(false); 
+								System.err.println("In "+path+fname);
+								e.printStackTrace();
+							}
+						}
+					}
+				}
+				return model;
+			} catch (Exception e) {
+				e.printStackTrace();
+			} catch (TokenMgrError err) {
+				err.printStackTrace();
+			}
+		}
+
+		return null;
+
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/JJTFramclipseNonScriptParserState.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/JJTFramclipseNonScriptParserState.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/JJTFramclipseNonScriptParserState.java	(revision 13)
@@ -0,0 +1,123 @@
+/* Generated By:JavaCC: Do not edit this line. JJTFramclipseNonScriptParserState.java Version 4.2 */
+package com.framsticks.framclipse.internal.parser;
+
+public class JJTFramclipseNonScriptParserState {
+  private java.util.List nodes;
+  private java.util.List marks;
+
+  private int sp;        // number of nodes on stack
+  private int mk;        // current mark
+  private boolean node_created;
+
+  public JJTFramclipseNonScriptParserState() {
+    nodes = new java.util.ArrayList();
+    marks = new java.util.ArrayList();
+    sp = 0;
+    mk = 0;
+  }
+
+  /* Determines whether the current node was actually closed and
+     pushed.  This should only be called in the final user action of a
+     node scope.  */
+  public boolean nodeCreated() {
+    return node_created;
+  }
+
+  /* Call this to reinitialize the node stack.  It is called
+     automatically by the parser's ReInit() method. */
+  public void reset() {
+    nodes.clear();
+    marks.clear();
+    sp = 0;
+    mk = 0;
+  }
+
+  /* Returns the root node of the AST.  It only makes sense to call
+     this after a successful parse. */
+  public Node rootNode() {
+    return (Node)nodes.get(0);
+  }
+
+  /* Pushes a node on to the stack. */
+  public void pushNode(Node n) {
+    nodes.add(n);
+    ++sp;
+  }
+
+  /* Returns the node on the top of the stack, and remove it from the
+     stack.  */
+  public Node popNode() {
+    if (--sp < mk) {
+      mk = ((Integer)marks.remove(marks.size()-1)).intValue();
+    }
+    return (Node)nodes.remove(nodes.size()-1);
+  }
+
+  /* Returns the node currently on the top of the stack. */
+  public Node peekNode() {
+    return (Node)nodes.get(nodes.size()-1);
+  }
+
+  /* Returns the number of children on the stack in the current node
+     scope. */
+  public int nodeArity() {
+    return sp - mk;
+  }
+
+
+  public void clearNodeScope(Node n) {
+    while (sp > mk) {
+      popNode();
+    }
+    mk = ((Integer)marks.remove(marks.size()-1)).intValue();
+  }
+
+
+  public void openNodeScope(Node n) {
+    marks.add(new Integer(mk));
+    mk = sp;
+    n.jjtOpen();
+  }
+
+
+  /* A definite node is constructed from a specified number of
+     children.  That number of nodes are popped from the stack and
+     made the children of the definite node.  Then the definite node
+     is pushed on to the stack. */
+  public void closeNodeScope(Node n, int num) {
+    mk = ((Integer)marks.remove(marks.size()-1)).intValue();
+    while (num-- > 0) {
+      Node c = popNode();
+      c.jjtSetParent(n);
+      n.jjtAddChild(c, num);
+    }
+    n.jjtClose();
+    pushNode(n);
+    node_created = true;
+  }
+
+
+  /* A conditional node is constructed if its condition is true.  All
+     the nodes that have been pushed since the node was opened are
+     made children of the conditional node, which is then pushed
+     on to the stack.  If the condition is false the node is not
+     constructed and they are left on the stack. */
+  public void closeNodeScope(Node n, boolean condition) {
+    if (condition) {
+      int a = nodeArity();
+      mk = ((Integer)marks.remove(marks.size()-1)).intValue();
+      while (a-- > 0) {
+        Node c = popNode();
+        c.jjtSetParent(n);
+        n.jjtAddChild(c, a);
+      }
+      n.jjtClose();
+      pushNode(n);
+      node_created = true;
+    } else {
+      mk = ((Integer)marks.remove(marks.size()-1)).intValue();
+      node_created = false;
+    }
+  }
+}
+/* JavaCC - OriginalChecksum=ed2f6ddf30a55603bf51a90fa2bd55b9 (do not edit this line) */
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/Node.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/Node.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/Node.java	(revision 13)
@@ -0,0 +1,34 @@
+/* Generated By:JJTree: Do not edit this line. Node.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+/* All AST nodes must implement this interface.  It provides basic
+   machinery for constructing the parent and child relationships
+   between nodes. */
+
+public interface Node {
+
+  /** This method is called after the node has been made the current
+    node.  It indicates that child nodes can now be added to it. */
+  public void jjtOpen();
+
+  /** This method is called after all the child nodes have been
+    added. */
+  public void jjtClose();
+
+  /** This pair of methods are used to inform the node of its
+    parent. */
+  public void jjtSetParent(Node n);
+  public Node jjtGetParent();
+
+  /** This method tells the node to add its argument to the node's
+    list of children.  */
+  public void jjtAddChild(Node n, int i);
+
+  /** This method returns a child node.  The children are numbered
+     from zero, left to right. */
+  public Node jjtGetChild(int i);
+
+  /** Return the number of children the node has. */
+  public int jjtGetNumChildren();
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ParseException.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ParseException.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/ParseException.java	(revision 13)
@@ -0,0 +1,192 @@
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */
+package com.framsticks.framclipse.internal.parser;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ *
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
+public class ParseException extends Exception {
+
+  /**
+   * This constructor is used by the method "generateParseException"
+   * in the generated parser.  Calling this constructor generates
+   * a new object of this type with the fields "currentToken",
+   * "expectedTokenSequences", and "tokenImage" set.  The boolean
+   * flag "specialConstructor" is also set to true to indicate that
+   * this constructor was used to create this object.
+   * This constructor calls its super class with the empty string
+   * to force the "toString" method of parent class "Throwable" to
+   * print the error message in the form:
+   *     ParseException: <result of getMessage>
+   */
+  public ParseException(Token currentTokenVal,
+                        int[][] expectedTokenSequencesVal,
+                        String[] tokenImageVal
+                       )
+  {
+    super("");
+    specialConstructor = true;
+    currentToken = currentTokenVal;
+    expectedTokenSequences = expectedTokenSequencesVal;
+    tokenImage = tokenImageVal;
+  }
+
+  /**
+   * The following constructors are for use by you for whatever
+   * purpose you can think of.  Constructing the exception in this
+   * manner makes the exception behave in the normal way - i.e., as
+   * documented in the class "Throwable".  The fields "errorToken",
+   * "expectedTokenSequences", and "tokenImage" do not contain
+   * relevant information.  The JavaCC generated code does not use
+   * these constructors.
+   */
+
+  public ParseException() {
+    super();
+    specialConstructor = false;
+  }
+
+  public ParseException(String message) {
+    super(message);
+    specialConstructor = false;
+  }
+
+  /**
+   * This variable determines which constructor was used to create
+   * this object and thereby affects the semantics of the
+   * "getMessage" method (see below).
+   */
+  protected boolean specialConstructor;
+
+  /**
+   * This is the last token that has been consumed successfully.  If
+   * this object has been created due to a parse error, the token
+   * followng this token will (therefore) be the first error token.
+   */
+  public Token currentToken;
+
+  /**
+   * Each entry in this array is an array of integers.  Each array
+   * of integers represents a sequence of tokens (by their ordinal
+   * values) that is expected at this point of the parse.
+   */
+  public int[][] expectedTokenSequences;
+
+  /**
+   * This is a reference to the "tokenImage" array of the generated
+   * parser within which the parse error occurred.  This array is
+   * defined in the generated ...Constants interface.
+   */
+  public String[] tokenImage;
+
+  /**
+   * This method has the standard behavior when this object has been
+   * created using the standard constructors.  Otherwise, it uses
+   * "currentToken" and "expectedTokenSequences" to generate a parse
+   * error message and returns it.  If this object has been created
+   * due to a parse error, and you do not catch it (it gets thrown
+   * from the parser), then this method is called during the printing
+   * of the final stack trace, and hence the correct error message
+   * gets displayed.
+   */
+  public String getMessage() {
+    if (!specialConstructor) {
+      return super.getMessage();
+    }
+    StringBuffer expected = new StringBuffer();
+    int maxSize = 0;
+    for (int i = 0; i < expectedTokenSequences.length; i++) {
+      if (maxSize < expectedTokenSequences[i].length) {
+        maxSize = expectedTokenSequences[i].length;
+      }
+      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(" ");
+      }
+      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+        expected.append("...");
+      }
+      expected.append(eol).append("    ");
+    }
+    String retval = "Encountered \"";
+    Token tok = currentToken.next;
+    for (int i = 0; i < maxSize; i++) {
+      if (i != 0) retval += " ";
+      if (tok.kind == 0) {
+        retval += tokenImage[0];
+        break;
+      }
+      retval += add_escapes(tok.image);
+      tok = tok.next; 
+    }
+    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+    retval += "." + eol;
+    if (expectedTokenSequences.length == 1) {
+      retval += "Was expecting:" + eol + "    ";
+    } else {
+      retval += "Was expecting one of:" + eol + "    ";
+    }
+    retval += expected.toString();
+    return retval;
+  }
+
+  /**
+   * The end of line string for this machine.
+   */
+  protected String eol = System.getProperty("line.separator", "\n");
+ 
+  /**
+   * Used to convert raw characters to their escaped version
+   * when these raw version cannot be used as part of an ASCII
+   * string literal.
+   */
+  protected String add_escapes(String str) {
+      StringBuffer retval = new StringBuffer();
+      char ch;
+      for (int i = 0; i < str.length(); i++) {
+        switch (str.charAt(i))
+        {
+           case 0 :
+              continue;
+           case '\b':
+              retval.append("\\b");
+              continue;
+           case '\t':
+              retval.append("\\t");
+              continue;
+           case '\n':
+              retval.append("\\n");
+              continue;
+           case '\f':
+              retval.append("\\f");
+              continue;
+           case '\r':
+              retval.append("\\r");
+              continue;
+           case '\"':
+              retval.append("\\\"");
+              continue;
+           case '\'':
+              retval.append("\\\'");
+              continue;
+           case '\\':
+              retval.append("\\\\");
+              continue;
+           default:
+              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                 String s = "0000" + Integer.toString(ch, 16);
+                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+              } else {
+                 retval.append(ch);
+              }
+              continue;
+        }
+      }
+      return retval.toString();
+   }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/SimpleNode.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/SimpleNode.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/SimpleNode.java	(revision 13)
@@ -0,0 +1,72 @@
+/* Generated By:JJTree: Do not edit this line. SimpleNode.java */
+
+package com.framsticks.framclipse.internal.parser;
+
+public class SimpleNode implements Node {
+  protected Node parent;
+  protected Node[] children;
+  protected int id;
+  protected FramclipseNonScriptParser parser;
+
+  public SimpleNode(int i) {
+    id = i;
+  }
+
+  public SimpleNode(FramclipseNonScriptParser p, int i) {
+    this(i);
+    parser = p;
+  }
+
+  public void jjtOpen() {
+  }
+
+  public void jjtClose() {
+  }
+  
+  public void jjtSetParent(Node n) { parent = n; }
+  public Node jjtGetParent() { return parent; }
+
+  public void jjtAddChild(Node n, int i) {
+    if (children == null) {
+      children = new Node[i + 1];
+    } else if (i >= children.length) {
+      Node c[] = new Node[i + 1];
+      System.arraycopy(children, 0, c, 0, children.length);
+      children = c;
+    }
+    children[i] = n;
+  }
+
+  public Node jjtGetChild(int i) {
+    return children[i];
+  }
+
+  public int jjtGetNumChildren() {
+    return (children == null) ? 0 : children.length;
+  }
+
+  /* You can override these two methods in subclasses of SimpleNode to
+     customize the way the node appears when the tree is dumped.  If
+     your output uses more than one line you should override
+     toString(String), otherwise overriding toString() is probably all
+     you need to do. */
+
+  public String toString() { return FramclipseNonScriptParserTreeConstants.jjtNodeName[id]; }
+  public String toString(String prefix) { return prefix + toString(); }
+
+  /* Override this method if you want to customize how the node dumps
+     out its children. */
+
+  public void dump(String prefix) {
+    System.out.println(toString(prefix));
+    if (children != null) {
+      for (int i = 0; i < children.length; ++i) {
+	SimpleNode n = (SimpleNode)children[i];
+	if (n != null) {
+	  n.dump(prefix + " ");
+	}
+      }
+    }
+  }
+}
+
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/Token.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/Token.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/Token.java	(revision 13)
@@ -0,0 +1,81 @@
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */
+package com.framsticks.framclipse.internal.parser;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token {
+
+  /**
+   * An integer that describes the kind of this token.  This numbering
+   * system is determined by JavaCCParser, and a table of these numbers is
+   * stored in the file ...Constants.java.
+   */
+  public int kind;
+
+  /**
+   * beginLine and beginColumn describe the position of the first character
+   * of this token; endLine and endColumn describe the position of the
+   * last character of this token.
+   */
+  public int beginLine, beginColumn, endLine, endColumn;
+
+  /**
+   * The string image of the token.
+   */
+  public String image;
+
+  /**
+   * A reference to the next regular (non-special) token from the input
+   * stream.  If this is the last token from the input stream, or if the
+   * token manager has not read tokens beyond this one, this field is
+   * set to null.  This is true only if this token is also a regular
+   * token.  Otherwise, see below for a description of the contents of
+   * this field.
+   */
+  public Token next;
+
+  /**
+   * This field is used to access special tokens that occur prior to this
+   * token, but after the immediately preceding regular (non-special) token.
+   * If there are no such special tokens, this field is set to null.
+   * When there are more than one such special token, this field refers
+   * to the last of these special tokens, which in turn refers to the next
+   * previous special token through its specialToken field, and so on
+   * until the first special token (whose specialToken field is null).
+   * The next fields of special tokens refer to other special tokens that
+   * immediately follow it (without an intervening regular token).  If there
+   * is no such token, this field is null.
+   */
+  public Token specialToken;
+
+  /**
+   * Returns the image.
+   */
+  public String toString()
+  {
+     return image;
+  }
+
+  /**
+   * Returns a new Token object, by default. However, if you want, you
+   * can create and return subclass objects based on the value of ofKind.
+   * Simply add the cases to the switch for all those special cases.
+   * For example, if you have a subclass of Token called IDToken that
+   * you want to create if ofKind is ID, simlpy add something like :
+   *
+   *    case MyParserConstants.ID : return new IDToken();
+   *
+   * to the following switch statement. Then you can cast matchedToken
+   * variable to the appropriate type and use it in your lexical actions.
+   */
+  public static final Token newToken(int ofKind)
+  {
+     switch(ofKind)
+     {
+       default : return new Token();
+     }
+  }
+
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/TokenMgrError.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/TokenMgrError.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/TokenMgrError.java	(revision 13)
@@ -0,0 +1,133 @@
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */
+package com.framsticks.framclipse.internal.parser;
+
+public class TokenMgrError extends Error
+{
+   /*
+    * Ordinals for various reasons why an Error of this type can be thrown.
+    */
+
+   /**
+    * Lexical error occured.
+    */
+   static final int LEXICAL_ERROR = 0;
+
+   /**
+    * An attempt wass made to create a second instance of a static token manager.
+    */
+   static final int STATIC_LEXER_ERROR = 1;
+
+   /**
+    * Tried to change to an invalid lexical state.
+    */
+   static final int INVALID_LEXICAL_STATE = 2;
+
+   /**
+    * Detected (and bailed out of) an infinite loop in the token manager.
+    */
+   static final int LOOP_DETECTED = 3;
+
+   /**
+    * Indicates the reason why the exception is thrown. It will have
+    * one of the above 4 values.
+    */
+   int errorCode;
+
+   /**
+    * Replaces unprintable characters by their espaced (or unicode escaped)
+    * equivalents in the given string
+    */
+   protected static final String addEscapes(String str) {
+      StringBuffer retval = new StringBuffer();
+      char ch;
+      for (int i = 0; i < str.length(); i++) {
+        switch (str.charAt(i))
+        {
+           case 0 :
+              continue;
+           case '\b':
+              retval.append("\\b");
+              continue;
+           case '\t':
+              retval.append("\\t");
+              continue;
+           case '\n':
+              retval.append("\\n");
+              continue;
+           case '\f':
+              retval.append("\\f");
+              continue;
+           case '\r':
+              retval.append("\\r");
+              continue;
+           case '\"':
+              retval.append("\\\"");
+              continue;
+           case '\'':
+              retval.append("\\\'");
+              continue;
+           case '\\':
+              retval.append("\\\\");
+              continue;
+           default:
+              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                 String s = "0000" + Integer.toString(ch, 16);
+                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+              } else {
+                 retval.append(ch);
+              }
+              continue;
+        }
+      }
+      return retval.toString();
+   }
+
+   /**
+    * Returns a detailed message for the Error when it is thrown by the
+    * token manager to indicate a lexical error.
+    * Parameters : 
+    *    EOFSeen     : indicates if EOF caused the lexicl error
+    *    curLexState : lexical state in which this error occured
+    *    errorLine   : line number when the error occured
+    *    errorColumn : column number when the error occured
+    *    errorAfter  : prefix that was seen before this error occured
+    *    curchar     : the offending character
+    * Note: You can customize the lexical error message by modifying this method.
+    */
+   protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+      return("Lexical error at line " +
+           errorLine + ", column " +
+           errorColumn + ".  Encountered: " +
+           (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+           "after : \"" + addEscapes(errorAfter) + "\"");
+   }
+
+   /**
+    * You can also modify the body of this method to customize your error messages.
+    * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+    * of end-users concern, so you can return something like : 
+    *
+    *     "Internal Error : Please file a bug report .... "
+    *
+    * from this method for such cases in the release version of your parser.
+    */
+   public String getMessage() {
+      return super.getMessage();
+   }
+
+   /*
+    * Constructors of various flavors follow.
+    */
+
+   public TokenMgrError() {
+   }
+
+   public TokenMgrError(String message, int reason) {
+      super(message);
+      errorCode = reason;
+   }
+
+   public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+      this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+   }
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/rebuild.bat
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/rebuild.bat	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/internal/parser/rebuild.bat	(revision 13)
@@ -0,0 +1,5 @@
+del *.jj
+rem del *.java
+call jjtree %1.jjt
+call javacc %1.jj
+rem copy CharStreamWithOffset.tmp CharStreamWithOffset.java
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/ColorManager.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/ColorManager.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/ColorManager.java	(revision 13)
@@ -0,0 +1,31 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+@SuppressWarnings("unchecked")
+public class ColorManager {
+
+	protected Map fColorTable = new HashMap(10);
+
+	public void dispose() {
+		Iterator e = fColorTable.values().iterator();
+		while (e.hasNext()) {
+			((Color) e.next()).dispose();
+		}
+	}
+
+	public Color getColor(RGB rgb) {
+		Color color = (Color) fColorTable.get(rgb);
+		if (color == null) {
+			color = new Color(Display.getCurrent(), rgb);
+			fColorTable.put(rgb, color);
+		}
+		return color;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramclipseColors.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramclipseColors.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramclipseColors.java	(revision 13)
@@ -0,0 +1,16 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import org.eclipse.swt.graphics.RGB;
+
+public interface FramclipseColors {
+	RGB CODE = new RGB(0, 0, 0);
+	RGB COMMENT = new RGB(63, 127, 95);
+	RGB DEFAULT = new RGB(0, 0, 0);
+	RGB DESCRIPTION = new RGB(127, 127, 127);
+	RGB KEYWORD = new RGB(127, 0, 85);
+	RGB OPERATOR = new RGB(0, 0, 0);
+	RGB NUMBER = new RGB(0, 0, 0);
+	RGB STRING = new RGB(42, 0, 255);
+
+	RGB ERROR = new RGB(255, 0, 0);
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramclipseCommentScanner.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramclipseCommentScanner.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramclipseCommentScanner.java	(revision 13)
@@ -0,0 +1,40 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.EndOfLineRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.SingleLineRule;
+import org.eclipse.jface.text.rules.Token;
+
+import com.framsticks.framclipse.Framclipse;
+
+
+public class FramclipseCommentScanner extends RuleBasedScanner 
+{
+	public FramclipseCommentScanner()
+	{
+		ColorManager colorManager = Framclipse.getDefault().getColorManager();
+		
+		IToken string = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.STRING)));
+		IToken def = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.COMMENT)));
+		
+
+		List<IRule> rules = new ArrayList<IRule>();
+		rules.add(new SingleLineRule("\"", "\"", string, '\\'));
+		rules.add(new SingleLineRule("\'", "\'", string, '\\'));
+		
+		setDefaultReturnToken(def);
+
+		IRule[] result = new IRule[rules.size()];
+		result = rules.toArray(result);
+		setRules(result);
+
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptCodeScanner.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptCodeScanner.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptCodeScanner.java	(revision 13)
@@ -0,0 +1,68 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.EndOfLineRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.MultiLineRule;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.SingleLineRule;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.rules.WordRule;
+import org.eclipse.swt.SWT;
+
+import com.framsticks.framclipse.Framclipse;
+
+
+public class FramscriptCodeScanner extends RuleBasedScanner {
+
+	public final static String[] keywords = { "asm", "break", "call", "case", "continue",
+			"default", "do", "else", "for", "function", "global", "goto", "if", "return", "switch",
+			"typeof", "var", "while", };
+
+	public final static String[] operators = { "(", ")", "[", "]", "{", "}", "}", "=", "<", ">",
+			"*", "/", "+", "-", "!", ";", "." };
+
+	public FramscriptCodeScanner() {
+		ColorManager colorManager = Framclipse.getDefault().getColorManager();
+		IToken keyword = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.KEYWORD), null, SWT.BOLD));
+		IToken comment = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.COMMENT)));
+		IToken string = new Token(new TextAttribute(colorManager.getColor(FramclipseColors.STRING)));
+		IToken number = new Token(new TextAttribute(colorManager.getColor(FramclipseColors.NUMBER)));
+		IToken code = new Token(new TextAttribute(colorManager.getColor(FramclipseColors.CODE)));
+		IToken operator = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.OPERATOR)));
+
+		List<IRule> rules = new ArrayList<IRule>();
+		rules.add(new EndOfLineRule("//", comment));
+		rules.add(new MultiLineRule("/*", "*/", comment));
+		rules.add(new SingleLineRule("\"", "\"", string, '\\'));
+		rules.add(new SingleLineRule("\'", "\'", string, '\\'));
+
+		WordRule numberRule = new WordRule(new FramscriptNumberDetector(), number);
+		rules.add(numberRule);
+
+		WordRule operatorRule = new WordRule(new FramscriptOperatorDetector(), code);
+		for (int i = 0; i < operators.length; i++) {
+			operatorRule.addWord(operators[i], operator);
+		}
+		rules.add(operatorRule);
+
+		WordRule keywordRule = new WordRule(new FramscriptWordDetector(), code);
+		for (int i = 0; i < keywords.length; i++) {
+			keywordRule.addWord(keywords[i], keyword);
+		}
+		rules.add(keywordRule);
+
+		setDefaultReturnToken(code);
+
+		IRule[] result = new IRule[rules.size()];
+		result = rules.toArray(result);
+		setRules(result);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptNumberDetector.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptNumberDetector.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptNumberDetector.java	(revision 13)
@@ -0,0 +1,23 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import org.eclipse.jface.text.rules.IWordDetector;
+
+/**
+ * A Framscript aware number detector.
+ */
+public class FramscriptNumberDetector implements IWordDetector {
+
+	/*
+	 * (non-Javadoc) Method declared on IWordDetector.
+	 */
+	public boolean isWordPart(char character) {
+		return Character.isDigit(character);
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IWordDetector.
+	 */
+	public boolean isWordStart(char character) {
+		return Character.isDigit(character);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptOperatorDetector.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptOperatorDetector.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptOperatorDetector.java	(revision 13)
@@ -0,0 +1,35 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import org.eclipse.jface.text.rules.IWordDetector;
+
+/**
+ * A Framscript aware word detector.
+ */
+public class FramscriptOperatorDetector implements IWordDetector {
+
+	/*
+	 * (non-Javadoc) Method declared on IWordDetector.
+	 */
+	public boolean isWordPart(char character) {
+		for (String s : FramscriptCodeScanner.operators) {
+			if (s.indexOf(character) >= 0) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IWordDetector.
+	 */
+	public boolean isWordStart(char character) {
+		for (String s : FramscriptCodeScanner.operators) {
+			if (s.indexOf(character) >= 0) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptPropertyCodeScanner.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptPropertyCodeScanner.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptPropertyCodeScanner.java	(revision 13)
@@ -0,0 +1,66 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.EndOfLineRule;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.SingleLineRule;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.rules.WordRule;
+import org.eclipse.swt.SWT;
+
+import com.framsticks.framclipse.Framclipse;
+
+
+public class FramscriptPropertyCodeScanner extends RuleBasedScanner {
+
+	public final static String[] keywords = { "asm", "break", "call", "case", "continue",
+			"default", "do", "else", "for", "function", "global", "goto", "if", "return", "switch",
+			"typeof", "var", "while", };
+
+	public final static String[] operators = { "(", ")", "[", "]", "{", "}", "}", "=", "<", ">",
+			"*", "/", "+", "-", "!", ";", "." };
+
+	public FramscriptPropertyCodeScanner() {
+		ColorManager colorManager = Framclipse.getDefault().getColorManager();
+		IToken keyword = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.KEYWORD), null, SWT.BOLD));
+		IToken comment = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.COMMENT)));
+		IToken string = new Token(new TextAttribute(colorManager.getColor(FramclipseColors.STRING)));
+		IToken number = new Token(new TextAttribute(colorManager.getColor(FramclipseColors.NUMBER)));
+		IToken code = new Token(new TextAttribute(colorManager.getColor(FramclipseColors.CODE)));
+		IToken operator = new Token(new TextAttribute(colorManager
+				.getColor(FramclipseColors.OPERATOR)));
+
+		List<IRule> rules = new ArrayList<IRule>();
+		rules.add(new EndOfLineRule("//", comment));
+		rules.add(new SingleLineRule("\"", "\"", string, '\\'));
+		rules.add(new SingleLineRule("\'", "\'", string, '\\'));
+
+		WordRule numberRule = new WordRule(new FramscriptNumberDetector(), number);
+		rules.add(numberRule);
+
+		WordRule operatorRule = new WordRule(new FramscriptOperatorDetector(), code);
+		for (int i = 0; i < operators.length; i++) {
+			operatorRule.addWord(operators[i], operator);
+		}
+		rules.add(operatorRule);
+
+		WordRule keywordRule = new WordRule(new FramscriptWordDetector(), code);
+		for (int i = 0; i < keywords.length; i++) {
+			keywordRule.addWord(keywords[i], keyword);
+		}
+		rules.add(keywordRule);
+
+		setDefaultReturnToken(code);
+
+		IRule[] result = new IRule[rules.size()];
+		result = rules.toArray(result);
+		setRules(result);
+	}
+}
Index: /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptWordDetector.java
===================================================================
--- /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptWordDetector.java	(revision 13)
+++ /java/FramclipsePlugin/src/main/java/com/framsticks/framclipse/syntaxColoring/FramscriptWordDetector.java	(revision 13)
@@ -0,0 +1,23 @@
+package com.framsticks.framclipse.syntaxColoring;
+
+import org.eclipse.jface.text.rules.IWordDetector;
+
+/**
+ * A Framscript aware word detector.
+ */
+public class FramscriptWordDetector implements IWordDetector {
+
+	/*
+	 * (non-Javadoc) Method declared on IWordDetector.
+	 */
+	public boolean isWordPart(char character) {
+		return Character.isJavaIdentifierPart(character);
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IWordDetector.
+	 */
+	public boolean isWordStart(char character) {
+		return Character.isJavaIdentifierStart(character);
+	}
+}
Index: /java/FramclipsePlugin/src/main/resources/framscontext.dtd
===================================================================
--- /java/FramclipsePlugin/src/main/resources/framscontext.dtd	(revision 13)
+++ /java/FramclipsePlugin/src/main/resources/framscontext.dtd	(revision 13)
@@ -0,0 +1,35 @@
+<!ELEMENT framscontext (file*)>
+
+<!ELEMENT file (objects*,code*,script*,properties*)>
+<!ATTLIST file pattern CDATA #REQUIRED>
+<!ATTLIST file label CDATA #IMPLIED>
+
+<!--
+ framsticks files can reference scripting objects in 3 ways
+ as described by the 3 tags of the framscontext.xml file:
+
+ - <objects> framsticks objects are stored in the file in the framsticks format
+ - <code> a field in the file (using the framsticks format) contains a script
+         that uses some objects
+ - <script> plain text file containing a script
+
+<script> excludes the two following tags.
+<code> implies that the framsticks format is used for the file so the <objects> tags will be also used to declare which objects can be present in the file.
+-->
+
+<!ELEMENT objects (#PCDATA)>
+<!ATTLIST objects context CDATA #REQUIRED>
+
+<!ELEMENT code (context*)>
+<!ATTLIST code object CDATA #REQUIRED>
+<!ATTLIST code member CDATA #REQUIRED>
+
+<!ELEMENT context (#PCDATA)>
+<!ATTLIST context name CDATA #REQUIRED>
+
+<!ELEMENT script (#PCDATA)>
+<!ATTLIST script context CDATA #REQUIRED>
+
+<!ELEMENT properties (#PCDATA)>
+<!ATTLIST properties from CDATA #REQUIRED>
+<!ATTLIST properties to CDATA #REQUIRED>
Index: /java/FramclipsePlugin/src/main/resources/framscontext.xml
===================================================================
--- /java/FramclipsePlugin/src/main/resources/framscontext.xml	(revision 13)
+++ /java/FramclipsePlugin/src/main/resources/framscontext.xml	(revision 13)
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<!DOCTYPE framscontext SYSTEM "framscontext.dtd">
+<?xml-stylesheet type="text/xsl" href="framscontext.xsl"?>
+
+<framscontext>
+
+  <file pattern="*.expdef" label="Experiment definition">
+    <objects context="expdef file"/>
+    <objects context="properties file"/>
+    <objects context="state file"/>
+    <code object="expdef" member="code">
+      <context name="Experiment definition"/>
+      <context name="Global context"/>
+    </code>
+    <properties from="prop" to="ExpParams"/>
+    <properties from="stat" to="ExpState"/>
+  </file>
+
+  <file pattern="*.neuro" label="Scripting neuron definition">
+    <objects context="neuro file"/>
+    <objects context="properties file"/>
+    <code object="class" member="code">
+      <context name="Neuron definitions"/>
+      <context name="Experiment definition"/>
+      <context name="Global context"/>
+    </code>
+    <properties from="prop" to="Fields"/>
+  </file>
+
+  <file pattern="*.style" label="Visual style definition">
+    <objects context="style file"/>
+    <objects context="properties file"/>
+    <code object="style" member="code">
+      <context name="Visual style definition"/>
+      <context name="Experiment definition"/>
+      <context name="Global context"/>
+    </code>
+    <properties from="prop" to="VisParams"/>
+  </file>
+
+  <file pattern="*.show" label="Framsticks Theater show">
+    <objects context="show file"/>
+    <objects context="properties file"/>
+    <code object="show" member="code">
+      <context name="Command line interface"/>
+      <context name="Experiment definition"/>
+      <context name="Global context"/>
+    </code>
+    <properties from="prop" to="ShowParams"/>
+  </file>
+
+  <file pattern="*.script" label="User script">
+    <objects context="script file"/>
+    <code object="script" member="code">
+      <context name="Experiment definition"/>
+      <context name="Global context"/>
+    </code>
+  </file>
+
+  <file pattern="*.ini" label="Framsticks startup scripts">
+    <script context="Command line interface"/>
+    <script context="Global context"/>
+  </file>
+
+</framscontext>
Index: /java/FramclipsePlugin/src/main/resources/framscontext.xsl
===================================================================
--- /java/FramclipsePlugin/src/main/resources/framscontext.xsl	(revision 13)
+++ /java/FramclipsePlugin/src/main/resources/framscontext.xsl	(revision 13)
@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:template match="/">
+  <html><body>
+    <xsl:apply-templates select="framscontext"/>
+  </body></html>
+</xsl:template>
+
+<xsl:template match="framscontext">
+  <h1>Framscript Context Configuration</h1>
+<i>Note:
+  <xsl:choose><xsl:when test="count(document('framscript.xml')/framscript)=0">
+	This formatting sheet would also use <a href="framscript.xml">framscript.xml</a> to show object names if that file was available</xsl:when>
+<xsl:otherwise>This formatting sheet also includes object names extracted from <a href="framscript.xml">framscript.xml</a></xsl:otherwise>
+	</xsl:choose>
+</i>
+
+  <table border="1">
+  <th>File types</th><th>Contents</th><th>Examples</th>
+  <xsl:apply-templates select="file"/>
+  </table>
+</xsl:template>
+
+<xsl:template match="file">
+  <tr valign="top">
+   <td><b><xsl:value-of select="@label"/></b><br/><xsl:value-of select="@pattern"/></td>
+   <td>
+	<xsl:if test="count(code)!=0">
+	<p title="Defined by &lt;objects&gt;">
+	Objects defined in the following contexts can be stored directly in the file: (using the standard framsticks format)<ul><xsl:apply-templates select="objects"/></ul>
+	</p>
+	<xsl:apply-templates select="code"/>
+	</xsl:if>
+	<xsl:if test="count(script)!=0">
+	<p title="Defined by &lt;script&gt;">
+	Contains the script (plain text format) accessing objects defined in the following contexts:<ul><xsl:apply-templates select="script"/></ul>
+	</p>
+	</xsl:if>
+	<xsl:if test="count(properties)!=0">
+	<p title="Defined by &lt;properties&gt;">
+	Special objects properties are created according to property definitions in the file:<ul><xsl:apply-templates select="properties"/></ul>
+	</p>
+	</xsl:if>
+	</td>
+   <td><i>sample <xsl:value-of select="@pattern"/> file</i><br/>
+	<pre style="background:#eeeeee;">
+<xsl:if test="count(code)!=0">
+# object defined in "<xsl:value-of select="objects[1]/@context"/>"
+object:
+field_1:...
+field_2:...
+</xsl:if>
+
+<xsl:if test="count(code)!=0">
+# sample object that contains the script:
+<xsl:value-of select="code[1]/@object"/>:
+field_1:...
+field_2:...
+<xsl:value-of select="code[1]/@member"/>:~
+function fun()
+{
+// using some objects from "<xsl:value-of select="code[1]/context[1]/@name"/>"
+}
+~
+</xsl:if>
+<xsl:if test="count(properties)!=0">
+# this property will be visible as "<xsl:value-of select="properties[1]/@to"/>.field"
+<xsl:value-of select="properties[1]/@from"/>:
+id:field
+name:My property
+...
+</xsl:if>
+
+<xsl:if test="count(script)!=0">
+// script directly in the file
+function fun()
+{
+// using some objects from <xsl:value-of select="script[1]/@context"/>
+}
+</xsl:if>
+
+</pre>
+   </td>
+  </tr>
+</xsl:template>
+
+<xsl:template match="objects">
+  <li><b><xsl:value-of select="@context"/></b>
+	<xsl:variable name="context" select="@context"/>
+      	<xsl:call-template name="extobjects"><xsl:with-param name="objs" select="document('framscript.xml')/framscript/type[@context=$context]"/></xsl:call-template>
+  </li>
+</xsl:template>
+
+<xsl:template match="script">
+  <li><b><xsl:value-of select="@context"/></b>
+	<xsl:variable name="context" select="@context"/>
+      	<xsl:call-template name="extobjects"><xsl:with-param name="objs" select="document('framscript.xml')/framscript/type[@context=$context]"/></xsl:call-template>
+  </li>
+</xsl:template>
+
+<xsl:template name="extobjects">
+  <xsl:param name="objs"/>
+  <xsl:if test="count($objs)!=0">
+  (
+  <xsl:for-each select="$objs">
+	<xsl:value-of select="@name"/>,
+  </xsl:for-each>
+  )
+  </xsl:if>
+</xsl:template>
+
+<xsl:template match="context">
+  <li><b><xsl:value-of select="@name"/></b>
+	<xsl:variable name="context" select="@name"/>
+      	<xsl:call-template name="extobjects"><xsl:with-param name="objs" select="document('framscript.xml')/framscript/type[@context=$context]"/></xsl:call-template>
+  </li>
+</xsl:template>
+
+<xsl:template match="code">
+  <p title="Defined by &lt;code&gt;">
+  "<xsl:value-of select="@member"/>:" field of "<xsl:value-of select="@object"/>:" contains a script that can access objects defined in the following contexts:<ul><xsl:apply-templates select="context"/></ul>
+  </p>
+</xsl:template>
+
+<xsl:template match="properties">
+  <li>
+  <b><xsl:value-of select="@to"/></b> is defined by "<xsl:value-of select="@from"/>" objects
+  </li>
+</xsl:template>
+
+</xsl:stylesheet>
Index: /java/FramclipsePlugin/src/main/resources/framscript.dtd
===================================================================
--- /java/FramclipsePlugin/src/main/resources/framscript.dtd	(revision 13)
+++ /java/FramclipsePlugin/src/main/resources/framscript.dtd	(revision 13)
@@ -0,0 +1,32 @@
+<!ELEMENT framscript (type*)>
+
+<!ELEMENT type (description?,element*)>
+<!ATTLIST type name CDATA #REQUIRED>
+<!ATTLIST type context CDATA #REQUIRED>
+
+<!ELEMENT description (#PCDATA)>
+
+<!ELEMENT element (description?,arguments?)>
+<!ATTLIST element name CDATA #REQUIRED>
+
+<!-- "type" attribute in element:
+     - framscript scalar datatypes: "integer", "float", "string"
+     - object of unknown type: "Object"
+     - value of unknown type: "untyped" (this can be object or not)
+     - other names refer to object classes (as defined in <type> tags)
+-->
+
+<!ATTLIST element type CDATA #IMPLIED>
+
+<!ATTLIST element min CDATA #IMPLIED>
+<!ATTLIST element max CDATA #IMPLIED>
+<!ATTLIST element function (false|true) "false">
+<!ATTLIST element default CDATA #IMPLIED>
+
+<!-- important difference: no <arguments> tag means the argument number is not known
+                           empty <arguments> means the function does not accept arguments -->
+<!ELEMENT arguments (argument*)>
+
+<!ELEMENT argument (#PCDATA)>
+<!ATTLIST argument name CDATA #IMPLIED>
+<!ATTLIST argument type CDATA #IMPLIED>
Index: /java/FramclipsePlugin/src/main/resources/framscript.xml
===================================================================
--- /java/FramclipsePlugin/src/main/resources/framscript.xml	(revision 13)
+++ /java/FramclipsePlugin/src/main/resources/framscript.xml	(revision 13)
@@ -0,0 +1,5575 @@
+<?xml version="1.0"?>
+<!DOCTYPE framscript SYSTEM "framscript.dtd">
+<?xml-stylesheet type="text/xsl" href="framscript.xsl"?>
+<framscript>
+	<type name="expdef" context="expdef file">
+		<element name="code" type="string"/>
+		<element name="info" type="string"/>
+		<element name="name" type="string"/>
+		<element name="neurons" type="string"/>
+	</type>
+	<type name="prop" context="properties file">
+		<element name="flags" type="integer"/>
+		<element name="group" type="string"/>
+		<element name="help" type="string"/>
+		<element name="id" type="string"/>
+		<element name="name" type="string"/>
+		<element name="type" type="string"/>
+	</type>
+	<type name="stat" context="state file">
+		<element name="flags" type="integer"/>
+		<element name="group" type="string"/>
+		<element name="help" type="string"/>
+		<element name="id" type="string"/>
+		<element name="name" type="string"/>
+		<element name="type" type="string"/>
+	</type>
+	<type name="style" context="style file">
+<description><![CDATA[General visual style properties.]]></description>
+		<element name="code" type="string"/>
+		<element name="info" type="string"/>
+		<element name="name" type="string"/>
+		<element name="neurons" type="integer" min="0" max="1"/>
+		<element name="smooth" type="integer" min="0" max="1"/>
+		<element name="style" type="string"/>
+		<element name="tex" type="integer" min="0" max="2"/>
+		<element name="rebuild" function="true"/>
+		<element name="streload" function="true"/>
+	</type>
+	<type name="show" context="show file">
+<description><![CDATA[Show properties for the Framsticks Theater (from the *.show file).]]></description>
+		<element name="code" type="string"/>
+		<element name="dispinfo" type="integer" min="0" max="2"/>
+		<element name="expdef" type="string"/>
+		<element name="info" type="string"/>
+		<element name="mode" type="integer" min="0" max="2"/>
+		<element name="name" type="string"/>
+		<element name="regname" type="string"/>
+		<element name="show" type="string"/>
+		<element name="showlog" type="integer" min="0" max="1"/>
+		<element name="switchmode" type="integer" min="0" max="2"/>
+		<element name="switchshows" type="string">
+			<description><![CDATA[names of the shows participating in automatic switching (comma separated). Use * as a wildcard.]]></description>
+		</element>
+		<element name="switchtime" type="integer" min="0" max="9999">
+			<description><![CDATA[time between switching (seconds)]]></description>
+		</element>
+		<element name="userspeed" type="integer" min="0" max="5" default="3"/>
+		<element name="about" function="true"/>
+		<element name="dummy" function="true">
+			<description><![CDATA[This is the empty item in the Theater's menu]]></description>
+		</element>
+		<element name="reload" function="true"/>
+	</type>
+	<type name="class" context="neuro file">
+		<element name="code" type="string"/>
+		<element name="description" type="string"/>
+		<element name="icon" type="string"/>
+		<element name="longname" type="string"/>
+		<element name="name" type="string"/>
+		<element name="prefinputs" type="integer"/>
+		<element name="preflocation" type="integer" min="0" max="2"/>
+		<element name="prefoutput" type="integer" min="0" max="1"/>
+		<element name="vhints" type="integer"/>
+	</type>
+	<type name="script" context="script file">
+		<element name="code" type="string"/>
+		<element name="group" type="string"/>
+		<element name="help" type="string"/>
+		<element name="name" type="string"/>
+	</type>
+	<type name="Collision" context="Global context">
+<description><![CDATA[Used in collision handlers (On___Collision). Contains the detailed information about the colliding parts (Part1,Part2 and their associated MechParts and Creatures). See the onFoodCollision() function in standard.expdef]]></description>
+		<element name="Creature1" type="Object"/>
+		<element name="Creature2" type="Object"/>
+		<element name="MechPart1" type="Object"/>
+		<element name="MechPart2" type="Object"/>
+		<element name="Part1" type="Object"/>
+		<element name="Part2" type="Object"/>
+	</type>
+	<type name="CrCollision" context="Global context">
+<description><![CDATA[Used in creature collision handlers (On___CrCollision).]]></description>
+		<element name="Creature1" type="Object"/>
+		<element name="Creature2" type="Object"/>
+	</type>
+	<type name="Creature" context="Global context">
+<description><![CDATA[The object inside the simulated world, including its physical structure, neural network and performance data. Food pieces, obstacles and other movable objects can be implemented as Creatures even though the are not "alive". See also: Population.]]></description>
+		<element name="bodysim" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[(Physical) body simulation can be disabled for individual objects which makes them immovable. Disabled objects can still participate in collisions depending on their collisions masks.
+
+Bugs: the standard collision handler does not work for disabled objects when ODE simulation is used. It means that these objects won't physically interact with other objects. The custom (scripting) handlers work as expected.]]></description>
+		</element>
+		<element name="buildproblems" type="integer"/>
+		<element name="c_velocity" type="float"/>
+		<element name="c_vertpos" type="float"/>
+		<element name="c_vertvelocity" type="float"/>
+		<element name="center_x" type="float">
+			<description><![CDATA[Center of gravity]]></description>
+		</element>
+		<element name="center_y" type="float">
+			<description><![CDATA[Center of gravity]]></description>
+		</element>
+		<element name="center_z" type="float">
+			<description><![CDATA[Center of gravity]]></description>
+		</element>
+		<element name="distance" type="float"/>
+		<element name="drive" type="XYZ">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="energ0" type="float"/>
+		<element name="energy" type="float"/>
+		<element name="energy_b" type="float"/>
+		<element name="energy_m" type="float"/>
+		<element name="energy_p" type="float"/>
+		<element name="geno" type="Geno">
+			<description><![CDATA[Source genotype for this creature]]></description>
+		</element>
+		<element name="genotype" type="string"/>
+		<element name="gnum" type="integer"/>
+		<element name="group" type="untyped"/>
+		<element name="idleen" type="float"/>
+		<element name="index" type="integer">
+			<description><![CDATA[Index of this Creature in its Population.]]></description>
+		</element>
+		<element name="info" type="string">
+			<description><![CDATA[Additional info or comments]]></description>
+		</element>
+		<element name="lifespan" type="integer"/>
+		<element name="liveModel" type="Model">
+			<description><![CDATA[A Model object that is a copy of the current (temporary) geometry of this creature]]></description>
+		</element>
+		<element name="localDrive" type="XYZ">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="model" type="Model">
+			<description><![CDATA[Source Model for this creature]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="nnenabled" type="integer" min="0" max="1"/>
+		<element name="numjoints" type="integer"/>
+		<element name="numneurons" type="integer"/>
+		<element name="numparts" type="integer"/>
+		<element name="orient" type="Orient">
+			<description><![CDATA[by convention the creature orientation is equal to its first part orientation]]></description>
+		</element>
+		<element name="othermask" type="integer" min="0" max="2147483647" default="0"/>
+		<element name="perf" type="integer" min="0" max="2">
+			<description><![CDATA[Initial value of this property is taken from Population.enableperf]]></description>
+		</element>
+		<element name="pos_x" type="float">
+			<description><![CDATA[(pos_x,pos_y,pos_z) is the point of minimal coordinates ("bottom left corner") of the creature, including imaginary Part sizes (Part.s, usually 1.0). See also: Creature.moveAbs]]></description>
+		</element>
+		<element name="pos_y" type="float">
+			<description><![CDATA[See Creature.pos_x]]></description>
+		</element>
+		<element name="pos_z" type="float">
+			<description><![CDATA[See Creature.pos_x]]></description>
+		</element>
+		<element name="selfcol" type="integer" min="0" max="1">
+			<description><![CDATA[Enable/disable detection of self-collisions (within a creature body). They can only occur when using the ODE simulation engine. If enabled, the creature will have its sticks collide during lifespan.]]></description>
+		</element>
+		<element name="selfcolstate" type="integer" min="0" max="1">
+			<description><![CDATA[Current self-collision state]]></description>
+		</element>
+		<element name="selfmask" type="integer" min="0" max="2147483647" default="0"/>
+		<element name="signals" type="CreatureSignals"/>
+		<element name="size_x" type="float">
+			<description><![CDATA[(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including the imaginary part sizes (Part.s, usually 1.0). A creature consisting of a single default part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).
+See also: Creature.moveAbs]]></description>
+		</element>
+		<element name="size_y" type="float">
+			<description><![CDATA[See Creature.size_x]]></description>
+		</element>
+		<element name="size_z" type="float">
+			<description><![CDATA[See Creature.size_x]]></description>
+		</element>
+		<element name="uid" type="string"/>
+		<element name="user1" type="untyped"/>
+		<element name="user2" type="untyped"/>
+		<element name="user3" type="untyped"/>
+		<element name="velocity" type="float"/>
+		<element name="vertpos" type="float"/>
+		<element name="vertvel" type="float"/>
+		<element name="currentGeometryAsF0" function="true" type="string"><arguments/></element>
+		<element name="getJoint" function="true" type="Joint">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getMechJoint" function="true" type="MechJoint">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getMechPart" function="true" type="MechPart">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getNeuro" function="true" type="Neuro">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getNeuroDef" function="true" type="NeuroDef">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getPart" function="true" type="Part">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="localToWorld" function="true" type="XYZ">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="move" function="true" type="void">
+			<description><![CDATA[Shift the creature by a given vector.]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="moveAbs" function="true" type="void">
+			<description><![CDATA[Moves the creature so that its origin (pos_x,pos_y,pos_z) is placed at the given location. The origin is the point of minimal coordinates ("bottom left corner"), including imaginary part sizes (Part.s, usually 1.0).
+Assuming a simple single-stick creature "X" having parts at (0,0,0) and (1,0,0),
+
+origin (pos_x,pos_y,pos_z) = (-1,-1,-1)
+size (size_x,size_y,size_z) = (2,1,1)
+
+The following example places the bottom of a creature at a given location (x,y,z):
+Creature.moveAbs(x-(Creature.size_x/2),y-(Creature.size_y/2),z-1.0)
+(assuming that the part size is 1.0)]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="moveLocal" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="rotate" function="true" type="void">
+			<description><![CDATA[Rotate the creature around X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise the further simulation could be disturbed.]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="rotateLocal" function="true" type="void">
+			<description><![CDATA[Rotate the creature around (local) X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise the further simulation could be disturbed.]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="worldToLocal" function="true" type="XYZ">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="CreaturesGroup" context="Global context">
+<description><![CDATA[A set of Creature objects, sharing some high level simulation properties (performance calculation, NN simulation, collision detection, event handling). The groups usually have different roles in the experiment (Creatures groups and Food group in standard.expdef)]]></description>
+		<element name="bodysim" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Enable/disable physical body simulation. This is the initial value of Creature.bodysim for all objects created in this group. For details, see the documentation of Creature.bodysim.]]></description>
+		</element>
+		<element name="colmask" type="integer" min="0" max="65535" default="0">
+			<description><![CDATA[DEPRECATED. You should use selfmask and othermask (these masks are also much easier to understand than the old colmask field).]]></description>
+		</element>
+		<element name="death" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Do creatures die when no energy?]]></description>
+		</element>
+		<element name="em_dyn" type="float" min="0" max="1" default="0">
+			<description><![CDATA[Energy requirements for a muscle
+moving a stick]]></description>
+		</element>
+		<element name="em_stat" type="float" min="0" max="1" default="0">
+			<description><![CDATA[Energy requirements for a muscle
+resisting an external force]]></description>
+		</element>
+		<element name="en_assim" type="float" min="0" max="1" default="0">
+			<description><![CDATA[Maximal energy gain produced by a vertical specialized stick.
+Horizontal specialized sticks get half of this value.]]></description>
+		</element>
+		<element name="enableperf" type="integer" min="0" max="2" default="1">
+			<description><![CDATA[Stabilization means no significant movement during a specified period of time.]]></description>
+		</element>
+		<element name="energy" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[If turned off, creature's energy will be constant]]></description>
+		</element>
+		<element name="index" type="integer"/>
+		<element name="killnostable" type="integer" min="0" max="10000000" default="1000000">
+			<description><![CDATA[Creatures that fail to stabilize after the specified waiting period (e.g. because they are continuously rolling) will be killed. 0 disables this feature.]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="nnsim" type="integer" min="0" max="2" default="1">
+			<description><![CDATA[Stabilization means no significant movement during a specified period of time.]]></description>
+		</element>
+		<element name="othermask" type="integer" min="0" max="2147483647" default="0">
+			<description><![CDATA[See selfmask.]]></description>
+		</element>
+		<element name="perfperiod" type="integer" min="0" max="1000000" default="100">
+			<description><![CDATA[Defines how often onUpdate() events are called. Also used to compute partial performance of creatures (distance, speed, etc.) and to determine stabilization.]]></description>
+		</element>
+		<element name="selfcol" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Detect collisions within creature bodies (only applicable for the ODE simulation engine). This is the initial value of Creature.selfcol for all objects created in this group. If enabled, creatures with self-colliding genotypes are not born, and others will have their sticks collide during lifespan.]]></description>
+		</element>
+		<element name="selfmask" type="integer" min="0" max="2147483647" default="0">
+			<description><![CDATA[Collisions between objects can be handled in two ways:
+ - standard 'mechanical' collision (simple 'rebound' effect)
+ - special script handler (On[GROUPNAME]Collision function)
+
+In the script handler function, use the Collision object to access the two colliding parts of two creatures.
+The first part in the Collision object (i.e. Collision.Creature1) always concerns the creature that belongs to [GROUPNAME].
+The handler is called once for each creature that collides with the creature from [GROUPNAME].
+
+Collision masks determine which one will be used (none and both are also possible). On each collision, selfmask and othermask of the colliding objects are logically ANDed. 16 lower bits (0xffff) enable the standard handler. 16 higher bits (0xffff0000) enable the custom handler. 
+Examples:
+
+1.With one group, all possible combinations of the collision handlers are as follows:
+  - ignore collisions (e.g. selfmask=othermask=0)
+  - use standard handling (e.g. selfmask=othermask=1)
+  - use custom handling (e.g. selfmask=othermask=0x10000)
+  - use standard and custom handling (e.g. selfmask=othermask=0x10001)
+
+2.Two groups yield more interesting cases. Let us consider the 'standard.expdef' setting:
+  Creatures: selfmask=0x10001, othermask=0x20001
+  Food colmask = selfmask=0x20002, othermask=0x10002
+There are three possible scenarios:
+- creature and creature: collision value = 0x10001 & 0x20001 = 1 -> Standard handling will be used (1 is one of the lower 16 bits)
+- food and food: collision value = 0x20002 & 0x10002 = 2 -> As above.
+- creature and food: collision value = (0x10001 & 0x10002) or (0x20002 & 0x20001) = 0x10000 or 0x20000 -> Custom handling will be used (higher 16 bits).
+]]></description>
+		</element>
+		<element name="size" type="integer"/>
+		<element name="stabilperiod" type="integer" min="0" max="1000000" default="100">
+			<description><![CDATA["Performance sampling period" for the stabilization phase.]]></description>
+		</element>
+		<element name="stabledist" type="float" min="0" max="1" default="0.01">
+			<description><![CDATA[A creature is considered stabilized when its center of gravity stays within the specified distance after the "Sampling period while waiting" has elapsed.]]></description>
+		</element>
+		<element name="createFromGeno" function="true" type="Creature">
+			<description><![CDATA[uses the supplied Geno object]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="createFromGenotype" function="true" type="Creature">
+			<description><![CDATA[uses the selected Genotype object]]></description>
+<arguments/></element>
+		<element name="createFromString" function="true" type="Creature">
+			<description><![CDATA[uses the supplied string argument]]></description>
+			<arguments>
+				<argument name="genotype" type="string"/>
+			</arguments>
+		</element>
+		<element name="delete" function="true" type="void">
+			<description><![CDATA[delete creature]]></description>
+			<arguments>
+				<argument name="creature index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="findCreatureAt" function="true" type="Creature">
+			<arguments>
+				<argument name="point" type="Vector"/>
+				<argument name="vector" type="Vector"/>
+			</arguments>
+		</element>
+		<element name="findUID" function="true" type="integer">
+			<arguments>
+				<argument name="uid" type="string"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="Creature">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="kill" function="true" type="void">
+			<description><![CDATA[kill creature]]></description>
+			<arguments>
+				<argument name="creature index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="senseCreaturesProperty" function="true" type="float">
+			<description><![CDATA[arguments:
+ - x,y,z (sensor position)
+ - property (name, name[index] or Class:id). name[index] can be used for Vector objects inside the user fields, eg "user2[10]"
+ - exclude (creature object)
+works like a smell sensor for a given property (for all creatures in this group except "exclude").
+The following function reproduces the "classic" framsticks "S" sensor:
+function smellReceptorValue(x,y,z,exclude)
+{
+var i,s=0; for(i=0;i<Populations.size;i++)
+	s+=Populations[0].senseCreaturesProperty(x,y,z,"energy",exclude);
+return s;
+}]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+				<argument name="propertyname" type="string"/>
+				<argument name="exclude" type="Creature"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="CreatureSignals" context="Global context">
+<description><![CDATA[Signal sources associated with the creature. See also: Signal, WorldSignals, NeuroSignals]]></description>
+		<element name="size" type="integer">
+			<description><![CDATA[Number of signals in this set]]></description>
+		</element>
+		<element name="add" function="true" type="Signal">
+			<description><![CDATA[Create a new signal]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+			</arguments>
+		</element>
+		<element name="addProperty" function="true" type="Signal">
+			<description><![CDATA[Create a signal that automatically reflects one of the creature's properties (i.e. its power is equal to the property value).
+Example:
+Creature.signals.addProperty("energy","energy"); //then, Neuro.signals.receive("energy") in custom neuron would work similarly to the built-in smell sensor]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="property" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void">
+			<description><![CDATA[Delete all signals]]></description>
+<arguments/></element>
+		<element name="get" function="true" type="Signal">
+			<description><![CDATA[Access individual signals (index=0 .. size-1)]]></description>
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="receive" function="true" type="float">
+			<description><![CDATA[Receive the aggregated signal power in a given channel.]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+			</arguments>
+		</element>
+		<element name="receiveFilter" function="true" type="float">
+			<description><![CDATA[Receive the aggregated signal power in a given channel.
+
+Additional filtering options:
+- Max distance only receives the neighbor signals (based on their physical location)
+- Flavor filtering: only signals having the flavor close to the specified one will be received. The filter value is the maximum allowed difference.]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+				<argument name="flavor" type="float"/>
+				<argument name="filter" type="float"/>
+			</arguments>
+		</element>
+		<element name="receiveSet" function="true" type="Vector">
+			<description><![CDATA[Get all signals in the specified range. Returns a readonly vector object containing Signal objects (individual signals can be accessed as result[0], .., result[result.size-1]).]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+		<element name="receiveSingle" function="true" type="Signal">
+			<description><![CDATA[Find the signal source having the highest signal power (including the distance)]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Dictionary" context="Global context">
+<description><![CDATA[Dictionary associates stored values with string keys ("key" is the first argument in get/set/remove functions). Integer "key" can be used to enumerate all elements.
+Example: var d=Dictionary.new(); d.set("name","John"); d.set("age",44);
+var i,element; for(i=0;i<d.size;i++) element=d.get(i);]]></description>
+		<element name="size" type="integer"/>
+		<element name="toString" type="string"/>
+		<element name="clear" function="true" type="void"><arguments/></element>
+		<element name="find" function="true" type="string">
+			<description><![CDATA[returns the element key or null if not found]]></description>
+			<arguments>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="untyped">
+			<arguments>
+				<argument name="key" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="Dictionary"><arguments/></element>
+		<element name="remove" function="true" type="void">
+			<arguments>
+				<argument name="key" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="set" function="true" type="void">
+			<arguments>
+				<argument name="key" type="untyped"/>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="File" context="Global context">
+<description><![CDATA[Provides read/write access to the filesystem. Used in the experiment definition to save the experiment state (onExpSave). Other (general purpose) use of this class is rather limited. Files are created in the "scripts_output" subdirectory of the directory where the Framsticks executable is located.]]></description>
+		<element name="EOF" type="integer" min="0" max="1"/>
+		<element name="info" type="string"/>
+		<element name="name" type="string"/>
+		<element name="path" type="string"/>
+		<element name="pathseparator" type="string"/>
+		<element name="append" function="true" type="File ">
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="description" type="string"/>
+			</arguments>
+		</element>
+		<element name="appendDirect" function="true" type="File ">
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="description" type="string"/>
+			</arguments>
+		</element>
+		<element name="close" function="true" type="string">
+			<description><![CDATA[returns file contents if it has been buffered]]></description>
+<arguments/></element>
+		<element name="create" function="true" type="File">
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="description" type="string"/>
+			</arguments>
+		</element>
+		<element name="createDirect" function="true" type="File">
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="description" type="string"/>
+			</arguments>
+		</element>
+		<element name="exists" function="true" type="integer" min="0" max="1">
+			<description><![CDATA[Sample:
+File.exists("default.sim") -> return 0 or 1]]></description>
+<arguments/></element>
+		<element name="flush" function="true" type="void">
+			<description><![CDATA[useful for unbuffered disk files only (openDirect, appendDirect)]]></description>
+<arguments/></element>
+		<element name="new" function="true" type="File "><arguments/></element>
+		<element name="newFromString" function="true" type="File ">
+			<arguments>
+				<argument name="text" type="string"/>
+			</arguments>
+		</element>
+		<element name="open" function="true" type="File ">
+			<arguments>
+				<argument name="filename" type="string"/>
+			</arguments>
+		</element>
+		<element name="readLine" function="true" type="string"><arguments/></element>
+		<element name="readObject" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="readUntilEOF" function="true" type="string"><arguments/></element>
+		<element name="writeComment" function="true" type="void">
+			<arguments>
+				<argument name="anything" type="string"/>
+			</arguments>
+		</element>
+		<element name="writeNameObject" function="true" type="void">
+			<arguments>
+				<argument name="name" type="string"/>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="writeObject" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="writeObjectBegin" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="writeObjectEnd" function="true" type="void"><arguments/></element>
+		<element name="writeObjectField" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+				<argument name="field index or name" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="writeObjectFieldForce" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+				<argument name="field index or name" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="writeObjectFields" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="writeObjectFieldsForce" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="writeString" function="true" type="void">
+			<arguments>
+				<argument name="anything" type="untyped"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="GenePool" context="Global context">
+<description><![CDATA[The static GenePool object refers to the "selected group" as described in GenePools]]></description>
+		<element name="fitfun" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Enable fitness scaling]]></description>
+		</element>
+		<element name="fitm" type="float" min="0" max="10" default="2">
+			<description><![CDATA[Lower threshold: how many standard deviations below average?
+(avg - n * stddev) - used for fitness shifting]]></description>
+		</element>
+		<element name="fitma" type="float" min="1" max="10" default="2">
+			<description><![CDATA[The best genotype is as many times
+better than the average one]]></description>
+		</element>
+		<element name="fitness" type="string">
+			<description><![CDATA[(intended for advanced users)]]></description>
+		</element>
+		<element name="index" type="integer"/>
+		<element name="name" type="string"/>
+		<element name="size" type="integer">
+			<description><![CDATA[In standard.expdef, this is equivalent to the number of unique genotypes. Standard experiment definition uses the Genotype.popsiz field to indicate that some genotypes exist in multiple instances despite having only one item in the group. Other experiment definitions may create multiple copies of the same genotype.]]></description>
+		</element>
+		<element name="totalpop" type="integer">
+			<description><![CDATA[Takes into account the Genotype.popsiz field (which may give the total number of instances depending on the experiment definition)]]></description>
+		</element>
+		<element name="addGeno" function="true" type="Genotype">
+			<description><![CDATA[create new Genotype from the supplied Geno object.
+returns the created Genotype.]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="delete" function="true" type="void">
+			<description><![CDATA[delete genotype]]></description>
+			<arguments>
+				<argument name="genotype index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="findGeno" function="true" type="integer">
+			<description><![CDATA[find Genotype matching the supplied Geno object.
+returns genotype index or -1 if not found]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="findUID" function="true" type="integer">
+			<arguments>
+				<argument name="uid" type="string"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="Genotype">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="GenePools" context="Global context">
+<description><![CDATA[Manages all genotypes in the experiment, organized in one or more groups. Some functions refer to the "selected genotype" i.e. the genotype number "GenePools.genotype" in the pool number "GenePools.group". For example to access the first genoype in the first group you could do:
+GenePools.group=0; GenePools.genotype=0; var name=Genotype.name;
+However, the preferred way doesn't refer to the static Genotype object:
+ var name=GenePools[0][0].name;
+
+Apart from the Genotypes in the group, there is also one temporary Genotype object used by genetic operators and some functions from GenePools. Genotype points to that object when "GenePools.genotype"=-1. The following code accesses that object before adding it to the genotype group:
+GenePools.newGenotype("X");
+ //makes the temporary object from the "X" genotype, GenePools.genotype is now -1
+GenePools.mutateSelected();
+ //the temporary object is mutated
+Genotype.info="my favorite genotype";
+ //modify the temporary object
+GenePools.copySelected(0);
+ //copy the current, i.e. temporary genotype to the genotype group #0]]></description>
+		<element name="genotype" type="integer">
+			<description><![CDATA[index of the currently selected genotype or -1 if no genotype is selected]]></description>
+		</element>
+		<element name="group" type="integer">
+			<description><![CDATA[index of the currently selected group (gene pool)]]></description>
+		</element>
+		<element name="size" type="integer"/>
+		<element name="addGroup" function="true" type="void">
+			<description><![CDATA[add genotype group]]></description>
+			<arguments>
+				<argument name="name" type="string"/>
+			</arguments>
+		</element>
+		<element name="addPerformanceFromCreature" function="true" type="void">
+			<description><![CDATA[Updates the current Genotype's performance values merging them with the current Creture's performance. It assumes the Genotype.popsiz has a reasonable value and performs the proper weighting. Use your own function instead if these conditions are not met in your experiment.]]></description>
+<arguments/></element>
+		<element name="clear" function="true" type="void">
+			<description><![CDATA[remove all groups except the first one]]></description>
+<arguments/></element>
+		<element name="clearGroup" function="true" type="void">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="copySelected" function="true" type="void">
+			<description><![CDATA[copy selected genotype to another group]]></description>
+			<arguments>
+				<argument name="groupindex" type="integer"/>
+			</arguments>
+		</element>
+		<element name="crossoverSelected" function="true" type="void">
+			<description><![CDATA[Crossover selected genotype with another one (from the genotype group). The resulting genotype is stored in the static Genotype object detached from the genotype group. After calling this function GenePools.genotype is -1 indicating that no genotype from the group is selected.]]></description>
+			<arguments>
+				<argument name="other index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="deleteGroup" function="true" type="void">
+			<description><![CDATA[remove genotype group]]></description>
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="deleteOne" function="true" type="void">
+			<description><![CDATA[delete one individual from the gene pool = decrease popsiz and delete the genotype if the popsiz goes to 0]]></description>
+			<arguments>
+				<argument name="genotype index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="deleteSelected" function="true" type="void">
+			<description><![CDATA[delete selected genotype from the gene pool (uses the selected genotype object)]]></description>
+<arguments/></element>
+		<element name="findGenotype" function="true" type="integer">
+			<description><![CDATA[find a genotype matching the current genotype. It only makes sense when the current genotype is a result of the genetic operator.]]></description>
+<arguments/></element>
+		<element name="findGenotypeForCreature" function="true" type="integer">
+			<description><![CDATA[find a genotype matching the selected creature]]></description>
+<arguments/></element>
+		<element name="get" function="true" type="GenePool">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getFromCreature" function="true" type="void">
+			<description><![CDATA[Copy a genotype from the selected creature. The resulting genotype is stored in the static Genotype object detached from the genotype group.]]></description>
+<arguments/></element>
+		<element name="getFromCreatureObject" function="true" type="void">
+			<description><![CDATA[Copy a genotype from the creature object passed in argument. The resulting genotype is stored in the static Genotype object detached from the genotype group.]]></description>
+			<arguments>
+				<argument type="Creature"/>
+			</arguments>
+		</element>
+		<element name="likeThisRoulette" function="true" type="integer">
+			<description><![CDATA[get random genotype similar to the selected one, fitness proportional]]></description>
+			<arguments>
+				<argument name="minimum similarity" type="float"/>
+			</arguments>
+		</element>
+		<element name="mutateSelected" function="true" type="void">
+			<description><![CDATA[Mutate selected genotype. The resulting genotype is stored in the static Genotype object detached from the genotype group. After calling this function GenePools.genotype is -1 indicating that no genotype from the group is selected.]]></description>
+<arguments/></element>
+		<element name="newGenotype" function="true" type="void">
+			<description><![CDATA[Make the new genotype from the supplied string and select the genotype. The resulting genotype is stored in the static Genotype object detached from the genotype group. After calling this function GenePools.genotype is -1 indicating that no genotype from the group is selected. (call "copySelected" if you want to add this gentype to the genotype group)]]></description>
+			<arguments>
+				<argument name="genotype" type="string"/>
+			</arguments>
+		</element>
+		<element name="random" function="true" type="integer">
+			<description><![CDATA[get random genotype]]></description>
+<arguments/></element>
+		<element name="randomLikeThis" function="true" type="integer">
+			<description><![CDATA[get random genotype similar to the selected one]]></description>
+			<arguments>
+				<argument name="minimum similarity" type="float"/>
+			</arguments>
+		</element>
+		<element name="revroulette" function="true" type="integer">
+			<description><![CDATA[get reverse fitness proportional genotype]]></description>
+<arguments/></element>
+		<element name="roulette" function="true" type="integer">
+			<description><![CDATA[get fitness proportional genotype]]></description>
+<arguments/></element>
+		<element name="tournament" function="true" type="integer">
+			<description><![CDATA[get tournament winner genotype]]></description>
+			<arguments>
+				<argument name="genotypes in tournament" type="integer"/>
+			</arguments>
+		</element>
+		<element name="worst" function="true" type="integer">
+			<description><![CDATA[get worst genotype]]></description>
+<arguments/></element>
+	</type>
+	<type name="GenMan" context="Global context">
+<description><![CDATA[Manages various genetic operations, using appropriate operators for the argument genotype format.]]></description>
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="f0_c_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_c_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_c_wei" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_rsf" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_stf" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_stm" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_n_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_n_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_n_prp" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_nodel_tag" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[You can tag elements using their 'i' field and the i="mi=d" tag.
+Mutations will not delete such elements.
+The i="mi=dm" combination is allowed.]]></description>
+		</element>
+		<element name="f0_nomod_tag" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[You can tag elements using their 'i' field and the i="mi=m" tag.
+Mutations will not modify properties of such elements.
+The i="mi=md" combination is allowed.]]></description>
+		</element>
+		<element name="f0_p_asm" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_frc" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_ing" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_mas" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_pos" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_swp" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0Fuzzy_maxRules" type="integer" min="0" max="999">
+			<description><![CDATA[Maximum number of fuzzy rules]]></description>
+		</element>
+		<element name="f0Fuzzy_maxSets" type="integer" min="0" max="999">
+			<description><![CDATA[Maximum number of fuzzy sets]]></description>
+		</element>
+		<element name="f0Fuzzy_prob0" type="float" min="0" max="1">
+			<description><![CDATA[Probability of adding new fuzzy set with simple rule, which uses this set (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob1" type="float" min="0" max="1">
+			<description><![CDATA[Probability of removing fuzzy set (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob2" type="float" min="0" max="1">
+			<description><![CDATA[Probability of adding new rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob3" type="float" min="0" max="1">
+			<description><![CDATA[Probability of removing rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob4" type="float" min="0" max="1">
+			<description><![CDATA[Probability of adding new input or output to exisitng rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob5" type="float" min="0" max="1">
+			<description><![CDATA[Probability of removing input or output from exisitng rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f1_mut_exmod" type="string">
+			<description><![CDATA[Modifiers that will not be added nor deleted during mutation
+(all: RrLlAaCcFfMmSsIiQqWwEe)]]></description>
+		</element>
+		<element name="f1_nmConn" type="float" min="0" max="100" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f1_nmNeu" type="float" min="0" max="100" default="0.05">
+			<description><![CDATA[Adds a (connected) neuron or removes a neuron]]></description>
+		</element>
+		<element name="f1_nmProp" type="float" min="0" max="100" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f1_nmVal" type="float" min="0" max="100" default="0.05"/>
+		<element name="f1_nmWei" type="float" min="0" max="100" default="1"/>
+		<element name="f1_smComma" type="float" min="0" max="100" default="0.02"/>
+		<element name="f1_smJunct" type="float" min="0" max="100" default="0.02"/>
+		<element name="f1_smModif" type="float" min="0" max="100" default="0.1">
+			<description><![CDATA[Modifiers: RrLlAaCcFfMmSsIiQqWwEe]]></description>
+		</element>
+		<element name="f1_smX" type="float" min="0" max="100" default="0.05"/>
+		<element name="f1_xo_propor" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Cross over (exchange) corresponding segments of the two parent genotypes?
+
+f1 uses a two-point crossing over.
+If this option is turned on, cut points will be selected proportionally to neural genes.
+Thus, if both parents have the same number of neurons, then this will be preserved in their children.]]></description>
+		</element>
+		<element name="f2_mutAddOper" type="float" min="0" max="1" default="0.4">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutConnElem" type="float" min="0" max="1" default="0.33">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutDelOper" type="float" min="0" max="1" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutHandleOper" type="float" min="0" max="1" default="0.3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutJointElem" type="float" min="0" max="1" default="0.33">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutNeuroElem" type="float" min="0" max="1" default="0.33">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutPropOper" type="float" min="0" max="1" default="0.2">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDelIns" type="float" min="0" max="1" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDelInsLength" type="integer" min="1" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDelInsPerChar" type="float" min="0" max="1" default="0.05">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDuplication" type="float" min="0" max="1" default="0.05">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutSubstitution" type="float" min="0" max="1" default="0.6">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutSubstPerChar" type="float" min="0" max="1" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutTranslocation" type="float" min="0" max="1" default="0.15">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_xovCrossingOver" type="float" min="0" max="1" default="0.2">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_xovGeneTransfer" type="float" min="0" max="1" default="0.8">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f4_mut_add" type="float" min="0" max="100" default="50">
+			<description><![CDATA[mutation: probability of adding a node]]></description>
+		</element>
+		<element name="f4_mut_add_conn" type="float" min="0" max="100" default="15">
+			<description><![CDATA[add node mutation: probability of adding a neural connection]]></description>
+		</element>
+		<element name="f4_mut_add_div" type="float" min="0" max="100" default="20">
+			<description><![CDATA[add node mutation: probability of adding a division]]></description>
+		</element>
+		<element name="f4_mut_add_neupar" type="float" min="0" max="100" default="5">
+			<description><![CDATA[add node mutation: probability of adding a neuron property/modifier]]></description>
+		</element>
+		<element name="f4_mut_add_rep" type="float" min="0" max="100" default="10">
+			<description><![CDATA[add node mutation: probability of adding a repetition]]></description>
+		</element>
+		<element name="f4_mut_add_simp" type="float" min="0" max="100" default="50">
+			<description><![CDATA[add node mutation: probability of adding a random, simple gene]]></description>
+		</element>
+		<element name="f4_mut_del" type="float" min="0" max="100" default="20">
+			<description><![CDATA[mutation: probability of deleting a node]]></description>
+		</element>
+		<element name="f4_mut_mod" type="float" min="0" max="100" default="30">
+			<description><![CDATA[mutation: probability of changing a node]]></description>
+		</element>
+		<element name="gen_extmutinfo" type="integer" min="0" max="2" default="0">
+			<description><![CDATA[If active, information about employed mutation method will be stored in the 'info' field of each mutated genotype.]]></description>
+		</element>
+		<element name="gen_hilite" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Use colors for genes?
+(slows down viewing/editing of huge genotypes)]]></description>
+		</element>
+		<element name="gen_hist" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Required for phylogenetic analysis]]></description>
+		</element>
+		<element name="genoper_f0" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f1" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f2" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f3" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f4" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="neuadd_N" type="integer" min="0" max="1">
+			<description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1
+   Force (fo) float 0..999
+   Sigmoid (si) float -99999..99999
+   State (s) float -1..1]]></description>
+		</element>
+		<element name="neuadd_Nu" type="integer" min="0" max="1">
+			<description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1
+   Force (fo) float 0..999
+   Sigmoid (si) float -99999..99999
+   State (s) float -1..1]]></description>
+		</element>
+		<element name="neuadd_G" type="integer" min="0" max="1">
+			<description><![CDATA[Equilibrium sensor.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+		</element>
+		<element name="neuadd_T" type="integer" min="0" max="1">
+			<description><![CDATA[Touch sensor.
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1]]></description>
+		</element>
+		<element name="neuadd_S" type="integer" min="0" max="1">
+			<description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="neuadd_*" type="integer" min="0" max="1">
+			<description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_|" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1
+   bending range (r) float 0..1]]></description>
+		</element>
+		<element name="neuadd_@" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1]]></description>
+		</element>
+		<element name="neuadd_D" type="integer" min="0" max="1">
+			<description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_Fuzzy" type="integer" min="0" max="1">
+			<description><![CDATA[Refer to publications to learn about this neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string
+   fuzzy rules (fr) string]]></description>
+		</element>
+		<element name="neuadd_VEye" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string
+   perspective (p) float 0.1..10
+   scale (s) float 0.1..100
+   show hidden lines (h) integer 0..1
+   output lines count (each line needs four channels) (o) integer 0..99
+   debug (d) integer 0..1]]></description>
+		</element>
+		<element name="neuadd_VMotor" type="integer" min="0" max="1">
+			<description><![CDATA[Must be connected to the VEye and properly set up.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+		</element>
+		<element name="neuadd_Sti" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="neuadd_LMu" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1]]></description>
+		</element>
+		<element name="neuadd_Water" type="integer" min="0" max="1">
+			<description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="neuadd_Energy" type="integer" min="0" max="1">
+			<description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_Ch" type="integer" min="0" max="1">
+			<description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_ChMux" type="integer" min="0" max="1">
+			<description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_ChSel" type="integer" min="0" max="1">
+			<description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+		</element>
+		<element name="neuadd_Rnd" type="integer" min="0" max="1">
+			<description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_Sin" type="integer" min="0" max="1">
+			<description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1
+   time (t) float 0..6.28319]]></description>
+		</element>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="crossOver" function="true" type="Geno">
+			<description><![CDATA[returns crossed over genotype]]></description>
+			<arguments>
+				<argument type="Geno"/>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="getSimplest" function="true" type="Geno">
+			<description><![CDATA[returns the simplest genotype for a given encoding (format). 0 means f0, 4 means f4, etc.]]></description>
+			<arguments>
+				<argument name="format" type="integer"/>
+			</arguments>
+		</element>
+		<element name="mutate" function="true" type="Geno">
+			<description><![CDATA[returns mutated Geno object from supplied Geno]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="operReport" function="true" type="void">
+			<description><![CDATA[Show available genetic operators]]></description>
+<arguments/></element>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+		<element name="toHTML" function="true" type="string">
+			<description><![CDATA[returns genotype expressed as colored HTML]]></description>
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="toHTMLshort" function="true" type="string">
+			<description><![CDATA[returns genotype (abbreviated if needed) expressed as colored HTML]]></description>
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="validate" function="true" type="Geno">
+			<description><![CDATA[returns validated (if possible) Geno object from supplied Geno]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="GenManStats" context="Global context">
+<description><![CDATA[Statistics for genetic operations.]]></description>
+		<element name="gen_count" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_mfailed" type="integer">
+			<description><![CDATA[couldn't be performed]]></description>
+		</element>
+		<element name="gen_minvalid" type="integer">
+			<description><![CDATA[couldn't be repaired]]></description>
+		</element>
+		<element name="gen_mutimpr" type="float">
+			<description><![CDATA[total cumulative mutation change]]></description>
+		</element>
+		<element name="gen_mvalid" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_mvalidated" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_xofailed" type="integer">
+			<description><![CDATA[couldn't be performed]]></description>
+		</element>
+		<element name="gen_xoimpr" type="float">
+			<description><![CDATA[total cumulative crossover change]]></description>
+		</element>
+		<element name="gen_xoinvalid" type="integer">
+			<description><![CDATA[couldn't be repaired]]></description>
+		</element>
+		<element name="gen_xovalid" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_xovalidated" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="clrstats" function="true" type="void">
+			<description><![CDATA[]]></description>
+<arguments/></element>
+	</type>
+	<type name="Geno" context="Global context">
+<description><![CDATA[All information about a single genotype.
+This is a genetics-only object which does not contain any performance data. See also: Genotype class]]></description>
+		<element name="autoname" type="string"/>
+		<element name="f0genotype" type="string">
+			<description><![CDATA[converted to f0 genotype]]></description>
+		</element>
+		<element name="format" type="integer">
+			<description><![CDATA[Genotype format]]></description>
+		</element>
+		<element name="genotype" type="string"/>
+		<element name="info" type="string">
+			<description><![CDATA[Additional information or comments]]></description>
+		</element>
+		<element name="isValid" type="integer" min="0" max="1"/>
+		<element name="name" type="string"/>
+		<element name="rawgenotype" type="string">
+			<description><![CDATA[Genotype, excluding the format specifier]]></description>
+		</element>
+		<element name="getConverted" function="true" type="Geno">
+			<arguments>
+				<argument name="format" type="integer"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="Geno"><arguments/></element>
+		<element name="newFrom" function="true" type="Geno">
+			<arguments>
+				<argument name="genotype" type="string"/>
+				<argument name="format" type="integer"/>
+				<argument name="name" type="string"/>
+				<argument name="description" type="string"/>
+			</arguments>
+		</element>
+		<element name="newFromString" function="true" type="Geno">
+			<arguments>
+				<argument name="genotype" type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Genotype" context="Global context">
+<description><![CDATA[A Genotype with the associated performance information. All but one Genotype objects are placed in Genotype Groups. There is also a single static Genotype object not associated with a group, which is used as a temporary storage by genetic operators and some functions from GenePools.]]></description>
+		<element name="convtrace1" type="string"/>
+		<element name="distance" type="float"/>
+		<element name="energ0" type="float"/>
+		<element name="f0genotype" type="string">
+			<description><![CDATA[converted to f0 genotype]]></description>
+		</element>
+		<element name="fit" type="float"/>
+		<element name="fit2" type="float">
+			<description><![CDATA[Fitnes shifted by (avg-n*stddev)]]></description>
+		</element>
+		<element name="geno" type="Geno">
+			<description><![CDATA[Geno object for this Genotype]]></description>
+		</element>
+		<element name="genotype" type="string"/>
+		<element name="gnum" type="integer"/>
+		<element name="info" type="string">
+			<description><![CDATA[Additional information or comments]]></description>
+		</element>
+		<element name="instances" type="integer"/>
+		<element name="isValid" type="integer" min="0" max="1"/>
+		<element name="lifespan" type="float">
+			<description><![CDATA[Average life span]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="nncon" type="float">
+			<description><![CDATA[(deprecated) old name for numconnections]]></description>
+		</element>
+		<element name="nnsiz" type="float">
+			<description><![CDATA[(deprecated) old name for numneurons]]></description>
+		</element>
+		<element name="num" type="integer"/>
+		<element name="numconnections" type="float"/>
+		<element name="numjoints" type="float"/>
+		<element name="numneurons" type="float"/>
+		<element name="numparts" type="float"/>
+		<element name="popsiz" type="integer">
+			<description><![CDATA[(deprecated) old name for instances]]></description>
+		</element>
+		<element name="simi" type="float"/>
+		<element name="strjoints" type="float">
+			<description><![CDATA[(deprecated) old name for numjoints]]></description>
+		</element>
+		<element name="strsiz" type="float">
+			<description><![CDATA[(deprecated) old name for numparts]]></description>
+		</element>
+		<element name="uid" type="string">
+			<description><![CDATA[Unique identifier]]></description>
+		</element>
+		<element name="user1" type="untyped"/>
+		<element name="user2" type="untyped"/>
+		<element name="user3" type="untyped"/>
+		<element name="velocity" type="float">
+			<description><![CDATA[Average velocity]]></description>
+		</element>
+		<element name="vertpos" type="float"/>
+		<element name="vertvel" type="float"/>
+		<element name="getModel" function="true" type="Model"><arguments/></element>
+		<element name="getNormalized" function="true" type="float">
+			<arguments>
+				<argument name="property name or index" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="mutate" function="true" type="void"><arguments/></element>
+	</type>
+	<type name="GenotypeGroup" context="Global context">
+<description><![CDATA[The static GenePool object refers to the "selected group" as described in GenePools]]></description>
+		<element name="fitfun" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Enable fitness scaling]]></description>
+		</element>
+		<element name="fitm" type="float" min="0" max="10" default="2">
+			<description><![CDATA[Lower threshold: how many standard deviations below average?
+(avg - n * stddev) - used for fitness shifting]]></description>
+		</element>
+		<element name="fitma" type="float" min="1" max="10" default="2">
+			<description><![CDATA[The best genotype is as many times
+better than the average one]]></description>
+		</element>
+		<element name="fitness" type="string">
+			<description><![CDATA[(intended for advanced users)]]></description>
+		</element>
+		<element name="index" type="integer"/>
+		<element name="name" type="string"/>
+		<element name="size" type="integer">
+			<description><![CDATA[In standard.expdef, this is equivalent to the number of unique genotypes. Standard experiment definition uses the Genotype.popsiz field to indicate that some genotypes exist in multiple instances despite having only one item in the group. Other experiment definitions may create multiple copies of the same genotype.]]></description>
+		</element>
+		<element name="totalpop" type="integer">
+			<description><![CDATA[Takes into account the Genotype.popsiz field (which may give the total number of instances depending on the experiment definition)]]></description>
+		</element>
+		<element name="addGeno" function="true" type="Genotype">
+			<description><![CDATA[create new Genotype from the supplied Geno object.
+returns the created Genotype.]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="delete" function="true" type="void">
+			<description><![CDATA[delete genotype]]></description>
+			<arguments>
+				<argument name="genotype index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="findGeno" function="true" type="integer">
+			<description><![CDATA[find Genotype matching the supplied Geno object.
+returns genotype index or -1 if not found]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="findUID" function="true" type="integer">
+			<arguments>
+				<argument name="uid" type="string"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="Genotype">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Interface" context="Global context">
+<description><![CDATA[Used to query for object member descriptions. Example:
+var iface=Interface.makeFrom(someobject); var description="this object has "+iface.properties+" properties, first property is "+iface.getId(0);]]></description>
+		<element name="groups" type="integer"/>
+		<element name="name" type="string"/>
+		<element name="properties" type="integer"/>
+		<element name="findGroupId" function="true" type="integer">
+			<arguments>
+				<argument name="name" type="string"/>
+			</arguments>
+		</element>
+		<element name="findId" function="true" type="integer">
+			<arguments>
+				<argument name="name" type="string"/>
+			</arguments>
+		</element>
+		<element name="findIdInGroup" function="true" type="integer">
+			<arguments>
+				<argument name="name" type="string"/>
+				<argument name="group name or index" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="untyped">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getFlags" function="true" type="integer">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getGroup" function="true" type="integer">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getGroupName" function="true" type="string">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getHelp" function="true" type="string">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getId" function="true" type="string">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getName" function="true" type="string">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getType" function="true" type="string">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="invoke" function="true" type="void">
+			<arguments>
+				<argument name="function name or index" type="untyped"/>
+				<argument name="arguments" type="Vector"/>
+			</arguments>
+		</element>
+		<element name="makeFrom" function="true" type="Interface">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="set" function="true" type="void">
+			<arguments>
+				<argument name="index" type="integer"/>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="setAllDefault" function="true" type="void"><arguments/></element>
+		<element name="setDefault" function="true" type="void">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Joint" context="Global context">
+		<element name="dx" type="float" min="-2" max="2" default="0"/>
+		<element name="dy" type="float" min="-2" max="2" default="0"/>
+		<element name="dz" type="float" min="-2" max="2" default="0"/>
+		<element name="i" type="string"/>
+		<element name="p1" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="p2" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="rotstif" type="float" min="0" max="1" default="1"/>
+		<element name="rx" type="float"/>
+		<element name="ry" type="float"/>
+		<element name="rz" type="float"/>
+		<element name="stam" type="float" min="0" max="1" default="0.25"/>
+		<element name="stif" type="float" min="0" max="1" default="1"/>
+		<element name="Vstyle" type="string"/>
+	</type>
+	<type name="Loader" context="Global context">
+<description><![CDATA[Support for loading files in the Framsticks format. Used in the experiment definition to retrieve experiment state (see OnExpLoad function in standard.expdef). Registered objects (addClass) are handled automaticaly. Loader can call user functions defined by setBreakLabel.]]></description>
+		<element name="AfterObject" type="integer"/>
+		<element name="BeforeObject" type="integer"/>
+		<element name="BeforeUnknown" type="integer"/>
+		<element name="comment" type="string"/>
+		<element name="currentObject" type="Object"/>
+		<element name="firstComment" type="integer" min="0" max="1"/>
+		<element name="objectName" type="string"/>
+		<element name="OnComment" type="integer"/>
+		<element name="OnError" type="integer"/>
+		<element name="status" type="integer"/>
+		<element name="abort" function="true" type="void"><arguments/></element>
+		<element name="addClass" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="clearClasses" function="true" type="void"><arguments/></element>
+		<element name="go" function="true" type="integer"><arguments/></element>
+		<element name="loadObject" function="true" type="void"><arguments/></element>
+		<element name="removeClass" function="true" type="void">
+			<arguments>
+				<argument type="Object"/>
+			</arguments>
+		</element>
+		<element name="run" function="true" type="integer"><arguments/></element>
+		<element name="setBreak" function="true" type="void">
+			<arguments>
+				<argument name="break conditions" type="integer"/>
+			</arguments>
+		</element>
+		<element name="setBreakLabel" function="true" type="void">
+			<arguments>
+				<argument name="break condition" type="integer"/>
+				<argument name="label" type="string"/>
+			</arguments>
+		</element>
+		<element name="skipObject" function="true" type="void"><arguments/></element>
+	</type>
+	<type name="Math" context="Global context">
+<description><![CDATA[Mathematical functions library.]]></description>
+		<element name="pi" type="float"/>
+		<element name="pi2" type="float"/>
+		<element name="pi4" type="float"/>
+		<element name="rnd01" type="float"/>
+		<element name="rndGaussStd" type="float"/>
+		<element name="seed" type="integer">
+			<description><![CDATA[Random number generator seed.
+Note: Math.seed influences all future random activity in the simulator, not only Math.rnd01 results.]]></description>
+		</element>
+		<element name="time" type="float">
+			<description><![CDATA[Number of seconds since the Epoch (00:00:00 UTC/GMT, January 1, 1970)]]></description>
+		</element>
+		<element name="twopi" type="float"/>
+		<element name="abs" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="acos" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="asin" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="atan" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="atan2" function="true" type="float">
+			<arguments>
+				<argument name="y" type="float"/>
+				<argument name="x" type="float"/>
+			</arguments>
+		</element>
+		<element name="cos" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="exp" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="log" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="max" function="true" type="untyped">
+			<arguments>
+				<argument type="untyped"/>
+				<argument type="untyped"/>
+			</arguments>
+		</element>
+		<element name="min" function="true" type="untyped">
+			<arguments>
+				<argument type="untyped"/>
+				<argument type="untyped"/>
+			</arguments>
+		</element>
+		<element name="pow" function="true" type="float">
+			<arguments>
+				<argument name="a" type="float"/>
+				<argument name="b" type="float"/>
+			</arguments>
+		</element>
+		<element name="random" function="true" type="integer">
+			<description><![CDATA[0..num-1]]></description>
+			<arguments>
+				<argument name="num" type="integer"/>
+			</arguments>
+		</element>
+		<element name="rndCustom" function="true" type="float">
+			<description><![CDATA[the parameter describes the desired random distribution, being a sum of uniform distributions, eg. rndCustom([-10,-1, -1,1, 1,10]) defines 3 uniform distribution intervals [-1,10) [-1,1), [1,10)]]></description>
+			<arguments>
+				<argument type="Vector"/>
+			</arguments>
+		</element>
+		<element name="rndGauss" function="true" type="float">
+			<description><![CDATA[rndGaussStd is rndGauss(0,1)]]></description>
+			<arguments>
+				<argument name="center" type="float"/>
+				<argument name="stdandard deviation" type="float"/>
+			</arguments>
+		</element>
+		<element name="rndUni" function="true" type="float">
+			<description><![CDATA[[begin..end)]]></description>
+			<arguments>
+				<argument name="begin" type="float"/>
+				<argument name="end" type="float"/>
+			</arguments>
+		</element>
+		<element name="sigmoid" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="sign" function="true" type="integer">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="sin" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="sqrt" function="true" type="float">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="MechJoint" context="Global context">
+		<element name="dx" type="float"/>
+		<element name="dy" type="float"/>
+		<element name="dz" type="float"/>
+		<element name="part1" type="MechPart"/>
+		<element name="part2" type="MechPart"/>
+		<element name="rotstif" type="float"/>
+		<element name="rotstress" type="float"/>
+		<element name="rx" type="float"/>
+		<element name="ry" type="float"/>
+		<element name="rz" type="float"/>
+		<element name="stif" type="float"/>
+		<element name="stress" type="float"/>
+	</type>
+	<type name="MechPart" context="Global context">
+		<element name="fr" type="float"/>
+		<element name="m" type="float"/>
+		<element name="orient" type="Orient"/>
+		<element name="oxx" type="float"/>
+		<element name="oxy" type="float"/>
+		<element name="oxz" type="float"/>
+		<element name="oyx" type="float"/>
+		<element name="oyy" type="float"/>
+		<element name="oyz" type="float"/>
+		<element name="ozx" type="float"/>
+		<element name="ozy" type="float"/>
+		<element name="ozz" type="float"/>
+		<element name="pos" type="XYZ"/>
+		<element name="s" type="float"/>
+		<element name="v" type="XYZ"/>
+		<element name="vol" type="float"/>
+		<element name="vx" type="float"/>
+		<element name="vy" type="float"/>
+		<element name="vz" type="float"/>
+		<element name="x" type="float"/>
+		<element name="y" type="float"/>
+		<element name="z" type="float"/>
+		<element name="applyForce" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Model" context="Global context">
+		<element name="geno" type="Geno"/>
+		<element name="numconnections" type="integer"/>
+		<element name="numjoints" type="integer"/>
+		<element name="numneurons" type="integer"/>
+		<element name="numparts" type="integer"/>
+		<element name="se" type="float"/>
+		<element name="size_x" type="float">
+			<description><![CDATA[(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including imaginary Part sizes (Part.s, usually 1.0). A creature consisting of a single default part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).
+See also: Creature.moveAbs]]></description>
+		</element>
+		<element name="size_y" type="float">
+			<description><![CDATA[See Model.size_x]]></description>
+		</element>
+		<element name="size_z" type="float">
+			<description><![CDATA[See Model.size_x]]></description>
+		</element>
+		<element name="Vstyle" type="string"/>
+		<element name="getJoint" function="true" type="Joint">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getNeuroDef" function="true" type="NeuroDef">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getPart" function="true" type="Part">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="newFromGeno" function="true" type="Model">
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="newFromString" function="true" type="Model">
+			<arguments>
+				<argument name="genotype" type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Neuro" context="Global context">
+<description><![CDATA[Live Neuron object.]]></description>
+		<element name="channelCount" type="integer"/>
+		<element name="creature" type="Creature"/>
+		<element name="currState" type="float">
+			<description><![CDATA[the only difference from the "state" field is that currState, when written, changes the internal neuron state immediately (which disturbs the regular synchronous NN operation). This feature should only be used while controlling the neuron 'from outside' (like a neuro probe) and not in the neuron definition.]]></description>
+		</element>
+		<element name="def" type="NeuroDef"/>
+		<element name="fields" type="Fields">
+			<description><![CDATA[Neurons can have different fields depending on their class. Script neurons have their fields defined using the "prop:" syntax. If you develop a custom neuron script you should use the Fields object for accessing your own neuron fields. The Neuro.fields property is meant for accessing the neuron fields from the outside script.
+Examples:
+var c=Populations.createFromString("X[N]");
+Simulator.print("standard neuron inertia="+c.getNeuro(0).fields.in);
+c=Populations.createFromString("X[Nn,e:0.1]");
+Simulator.print("noisy neuron error rate="+c.getNeuro(0).fields.e);
+
+The Interface object can be used to discover which fields are available for a certain neuron object:
+c=Populations.createFromString("X[N]");
+var iobj=Interface.makeFrom(c.getNeuro(0).fields);
+var i;
+for(i=0;i<iobj.properties;i++)
+ Simulator.print(iobj.getId(i)+" ("+iobj.getName(i)+")");]]></description>
+		</element>
+		<element name="getInputCount" type="integer"/>
+		<element name="hold" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="inputSum" type="float"/>
+		<element name="joint" type="MechJoint"/>
+		<element name="part" type="MechPart"/>
+		<element name="position_x" type="float"/>
+		<element name="position_y" type="float"/>
+		<element name="position_z" type="float"/>
+		<element name="signals" type="NeuroSignals"/>
+		<element name="state" type="float">
+			<description><![CDATA[when read, returns the current neuron state.
+When written, sets the next neuron state (for use in the neuron definition)]]></description>
+		</element>
+		<element name="weightedInputSum" type="float"/>
+		<element name="getInputChannelCount" function="true" type="integer">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputState" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputStateChannel" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+				<argument name="channel" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputSum" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputWeight" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getStateChannel" function="true" type="float">
+			<arguments>
+				<argument name="channel" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getWeightedInputState" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getWeightedInputStateChannel" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+				<argument name="channel" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getWeightedInputSum" function="true" type="float">
+			<description><![CDATA[uses any number of inputs starting with the specified input. getWeightedInputSum(0)=weightedInputSum]]></description>
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="setCurrStateChannel" function="true" type="void">
+			<description><![CDATA[like "currState"]]></description>
+			<arguments>
+				<argument name="channel" type="integer"/>
+				<argument name="value" type="float"/>
+			</arguments>
+		</element>
+		<element name="setStateChannel" function="true" type="void">
+			<arguments>
+				<argument name="channel" type="integer"/>
+				<argument name="value" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="NeuroClass" context="Global context">
+<description><![CDATA[The static NeuroClass object refers to class selected in the NeuroClassLibrary.]]></description>
+		<element name="description" type="string"/>
+		<element name="glyph" type="string"/>
+		<element name="longname" type="string"/>
+		<element name="name" type="string"/>
+		<element name="prefinputs" type="integer"/>
+		<element name="preflocation" type="integer" min="0" max="2"/>
+		<element name="prefoutput" type="integer" min="0" max="1"/>
+		<element name="properties" type="Interface"/>
+		<element name="summary" type="string">
+			<description><![CDATA[Textual summary of all features]]></description>
+		</element>
+		<element name="visualhints" type="integer"/>
+	</type>
+	<type name="NeuroClassLibrary" context="Global context">
+<description><![CDATA[Set of Neuron classes. You can access the selected class in the static NeuroClass object.]]></description>
+		<element name="class" type="integer">
+			<description><![CDATA[0 ... count-1]]></description>
+		</element>
+		<element name="count" type="integer"/>
+		<element name="findClass" function="true" type="void">
+			<arguments>
+				<argument name="class name" type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="NeuroDef" context="Global context">
+		<element name="d" type="string"/>
+		<element name="getInputCount" type="integer"/>
+		<element name="i" type="string"/>
+		<element name="j" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="p" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="Vstyle" type="string"/>
+		<element name="getInputNeuroDef" function="true" type="NeuroDef">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputNeuroIndex" function="true" type="integer">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputWeight" function="true" type="float">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="NeuroSignals" context="Global context">
+<description><![CDATA[Signals attached to the neuron.
+See also: Signal, WorldSignals, CreatureSignals.
+scripts/light.neuro and scripts/seelight.neuro are simple custom neuron examples demonstrating how to send/receive signals between creatures.]]></description>
+		<element name="size" type="integer"/>
+		<element name="add" function="true" type="void">
+			<description><![CDATA[Create a new signal]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void"><arguments/></element>
+		<element name="get" function="true" type="Signal">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="receive" function="true" type="float">
+			<description><![CDATA[Receive the aggregated signal power in a given channel.]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+			</arguments>
+		</element>
+		<element name="receiveFilter" function="true" type="float">
+			<description><![CDATA[Receive the aggregated signal power in a given channel.
+
+Additional filtering options:
+- Max distance only receives the neighbor signals (based on their physical location)
+- Flavor filtering: only signals having the flavor close to the specified one will be received. The filter value is the maximum allowed difference.]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+				<argument name="flavor" type="float"/>
+				<argument name="filter" type="float"/>
+			</arguments>
+		</element>
+		<element name="receiveSet" function="true" type="Vector">
+			<description><![CDATA[Get all signals in the specified range. Returns a readonly vector object containing Signal objects (individual signals can be accessed as result[0] throught result[result.size-1]).]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+		<element name="receiveSingle" function="true" type="Signal">
+			<description><![CDATA[Find the signal source having the highest signal power (including the distance)]]></description>
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="range" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="ODE" context="Global context">
+<description><![CDATA[ODE Parameters.]]></description>
+		<element name="odeairdrag" type="float" min="0" max="0.5" default="0.01">
+			<description><![CDATA[A drag force ("air drag") proportional to the velocity of mass centers of moving parts]]></description>
+		</element>
+		<element name="odecol2bounce" type="float" min="0" max="1" default="0.1"/>
+		<element name="odecol2bouncevel" type="float" min="0" max="1" default="0.01"/>
+		<element name="odecol2mumax" type="float" min="0" max="10" default="1">
+			<description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+		</element>
+		<element name="odecol2mumin" type="float" min="0" max="10" default="0.1">
+			<description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+		</element>
+		<element name="odecol2softcfm" type="float" min="0" max="1" default="0"/>
+		<element name="odecolbounce" type="float" min="0" max="1" default="0.1"/>
+		<element name="odecolbouncevel" type="float" min="0" max="1" default="0.01"/>
+		<element name="odecolmumax" type="float" min="0" max="10" default="5">
+			<description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+		</element>
+		<element name="odecolmumin" type="float" min="0" max="10" default="0.1">
+			<description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+		</element>
+		<element name="odecolsoftcfm" type="float" min="0" max="1" default="0"/>
+		<element name="odemusclemax" type="float" min="0" max="100" default="10">
+			<description><![CDATA[i.e. "MMMMM" if f1]]></description>
+		</element>
+		<element name="odemusclemin" type="float" min="0" max="100" default="0">
+			<description><![CDATA[i.e. "mmmmm" in f1]]></description>
+		</element>
+		<element name="odemusclespeed" type="float" min="0" max="10" default="1">
+			<description><![CDATA[Muscle state cannot change faster than the supplied value]]></description>
+		</element>
+		<element name="odeseed" type="integer" min="0" max="2">
+			<description><![CDATA[Affects collisions.
+- 'Truly random' is closest to the standard ODE operation. Use Math.seed to influence randomness in ODE collisions
+- 'Deterministic' automatically calculates random seed in each step based on the current simulation (world) state, which makes the simulation repeatable but more random than 'Fixed'
+- 'Fixed' is completely deterministic and does not depend on Math.seed. This might negatively affect ODE accuracy
+]]></description>
+		</element>
+		<element name="odeshape" type="integer" min="0" max="1"/>
+		<element name="odestep" type="float" min="0.001" max="1" default="0.05"/>
+		<element name="odewaterbuoy" type="float" min="0" max="2" default="1"/>
+		<element name="odewaterdrag" type="float" min="0.001" max="1" default="0.5"/>
+		<element name="rayIntersection" function="true" type="float">
+			<arguments>
+				<argument name="position x" type="float"/>
+				<argument name="position y" type="float"/>
+				<argument name="position z" type="float"/>
+				<argument name="direction x" type="float"/>
+				<argument name="direction y" type="float"/>
+				<argument name="direction z" type="float"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Orient" context="Global context">
+<description><![CDATA[3D orientation, stored as 3x3 matrix.]]></description>
+		<element name="x" type="XYZ"/>
+		<element name="xx" type="float"/>
+		<element name="xy" type="float"/>
+		<element name="xz" type="float"/>
+		<element name="y" type="XYZ"/>
+		<element name="yx" type="float"/>
+		<element name="yy" type="float"/>
+		<element name="yz" type="float"/>
+		<element name="z" type="XYZ"/>
+		<element name="zx" type="float"/>
+		<element name="zy" type="float"/>
+		<element name="zz" type="float"/>
+		<element name="between2" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+				<argument type="Orient"/>
+				<argument name="amount" type="float"/>
+			</arguments>
+		</element>
+		<element name="betweenOV" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+				<argument type="XYZ"/>
+				<argument name="amount" type="float"/>
+			</arguments>
+		</element>
+		<element name="clone" function="true" type="Orient"><arguments/></element>
+		<element name="localToWorld" function="true">
+			<arguments>
+				<argument name="point" type="XYZ"/>
+				<argument name="center" type="XYZ"/>
+			</arguments>
+		</element>
+		<element name="lookAt" function="true" type="void">
+			<arguments>
+				<argument name="direction" type="XYZ"/>
+				<argument name="up" type="XYZ"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="Orient">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="normalize" function="true" type="void"><arguments/></element>
+		<element name="reset" function="true" type="void"><arguments/></element>
+		<element name="revRotate" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+			</arguments>
+		</element>
+		<element name="rotate" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+			</arguments>
+		</element>
+		<element name="rotate3" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="set" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+			</arguments>
+		</element>
+		<element name="worldToLocal" function="true">
+			<arguments>
+				<argument name="point" type="XYZ"/>
+				<argument name="center" type="XYZ"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Part" context="Global context">
+		<element name="as" type="float" min="0" max="1" default="0.25"/>
+		<element name="dn" type="float" min="0.2" max="5" default="1"/>
+		<element name="fr" type="float" min="0" max="4" default="0.4"/>
+		<element name="i" type="string"/>
+		<element name="ing" type="float" min="0" max="1" default="0.25"/>
+		<element name="m" type="float" min="0.1" max="999" default="1"/>
+		<element name="rx" type="float"/>
+		<element name="ry" type="float"/>
+		<element name="rz" type="float"/>
+		<element name="s" type="float" min="0.1" max="10" default="1"/>
+		<element name="Vstyle" type="string"/>
+		<element name="x" type="float"/>
+		<element name="y" type="float"/>
+		<element name="z" type="float"/>
+	</type>
+	<type name="Population" context="Global context">
+<description><![CDATA[A set of Creature objects, sharing some high level simulation properties (performance calculation, NN simulation, collision detection, event handling). The groups usually have different roles in the experiment (Creatures groups and Food group in standard.expdef)]]></description>
+		<element name="bodysim" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Enable/disable physical body simulation. This is the initial value of Creature.bodysim for all objects created in this group. For details, see the documentation of Creature.bodysim.]]></description>
+		</element>
+		<element name="colmask" type="integer" min="0" max="65535" default="0">
+			<description><![CDATA[DEPRECATED. You should use selfmask and othermask (these masks are also much easier to understand than the old colmask field).]]></description>
+		</element>
+		<element name="death" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Do creatures die when no energy?]]></description>
+		</element>
+		<element name="em_dyn" type="float" min="0" max="1" default="0">
+			<description><![CDATA[Energy requirements for a muscle
+moving a stick]]></description>
+		</element>
+		<element name="em_stat" type="float" min="0" max="1" default="0">
+			<description><![CDATA[Energy requirements for a muscle
+resisting an external force]]></description>
+		</element>
+		<element name="en_assim" type="float" min="0" max="1" default="0">
+			<description><![CDATA[Maximal energy gain produced by a vertical specialized stick.
+Horizontal specialized sticks get half of this value.]]></description>
+		</element>
+		<element name="enableperf" type="integer" min="0" max="2" default="1">
+			<description><![CDATA[Stabilization means no significant movement during a specified period of time.]]></description>
+		</element>
+		<element name="energy" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[If turned off, creature's energy will be constant]]></description>
+		</element>
+		<element name="index" type="integer"/>
+		<element name="killnostable" type="integer" min="0" max="10000000" default="1000000">
+			<description><![CDATA[Creatures that fail to stabilize after the specified waiting period (e.g. because they are continuously rolling) will be killed. 0 disables this feature.]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="nnsim" type="integer" min="0" max="2" default="1">
+			<description><![CDATA[Stabilization means no significant movement during a specified period of time.]]></description>
+		</element>
+		<element name="othermask" type="integer" min="0" max="2147483647" default="0">
+			<description><![CDATA[See selfmask.]]></description>
+		</element>
+		<element name="perfperiod" type="integer" min="0" max="1000000" default="100">
+			<description><![CDATA[Defines how often onUpdate() events are called. Also used to compute partial performance of creatures (distance, speed, etc.) and to determine stabilization.]]></description>
+		</element>
+		<element name="selfcol" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Detect collisions within creature bodies (only applicable for the ODE simulation engine). This is the initial value of Creature.selfcol for all objects created in this group. If enabled, creatures with self-colliding genotypes are not born, and others will have their sticks collide during lifespan.]]></description>
+		</element>
+		<element name="selfmask" type="integer" min="0" max="2147483647" default="0">
+			<description><![CDATA[Collisions between objects can be handled in two ways:
+ - standard 'mechanical' collision (simple 'rebound' effect)
+ - special script handler (On[GROUPNAME]Collision function)
+
+In the script handler function, use the Collision object to access the two colliding parts of two creatures.
+The first part in the Collision object (i.e. Collision.Creature1) always concerns the creature that belongs to [GROUPNAME].
+The handler is called once for each creature that collides with the creature from [GROUPNAME].
+
+Collision masks determine which one will be used (none and both are also possible). On each collision, selfmask and othermask of the colliding objects are logically ANDed. 16 lower bits (0xffff) enable the standard handler. 16 higher bits (0xffff0000) enable the custom handler. 
+Examples:
+
+1.With one group, all possible combinations of the collision handlers are as follows:
+  - ignore collisions (e.g. selfmask=othermask=0)
+  - use standard handling (e.g. selfmask=othermask=1)
+  - use custom handling (e.g. selfmask=othermask=0x10000)
+  - use standard and custom handling (e.g. selfmask=othermask=0x10001)
+
+2.Two groups yield more interesting cases. Let us consider the 'standard.expdef' setting:
+  Creatures: selfmask=0x10001, othermask=0x20001
+  Food colmask = selfmask=0x20002, othermask=0x10002
+There are three possible scenarios:
+- creature and creature: collision value = 0x10001 & 0x20001 = 1 -> Standard handling will be used (1 is one of the lower 16 bits)
+- food and food: collision value = 0x20002 & 0x10002 = 2 -> As above.
+- creature and food: collision value = (0x10001 & 0x10002) or (0x20002 & 0x20001) = 0x10000 or 0x20000 -> Custom handling will be used (higher 16 bits).
+]]></description>
+		</element>
+		<element name="size" type="integer"/>
+		<element name="stabilperiod" type="integer" min="0" max="1000000" default="100">
+			<description><![CDATA["Performance sampling period" for the stabilization phase.]]></description>
+		</element>
+		<element name="stabledist" type="float" min="0" max="1" default="0.01">
+			<description><![CDATA[A creature is considered stabilized when its center of gravity stays within the specified distance after the "Sampling period while waiting" has elapsed.]]></description>
+		</element>
+		<element name="createFromGeno" function="true" type="Creature">
+			<description><![CDATA[uses the supplied Geno object]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="createFromGenotype" function="true" type="Creature">
+			<description><![CDATA[uses the selected Genotype object]]></description>
+<arguments/></element>
+		<element name="createFromString" function="true" type="Creature">
+			<description><![CDATA[uses the supplied string argument]]></description>
+			<arguments>
+				<argument name="genotype" type="string"/>
+			</arguments>
+		</element>
+		<element name="delete" function="true" type="void">
+			<description><![CDATA[delete creature]]></description>
+			<arguments>
+				<argument name="creature index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="findCreatureAt" function="true" type="Creature">
+			<arguments>
+				<argument name="point" type="Vector"/>
+				<argument name="vector" type="Vector"/>
+			</arguments>
+		</element>
+		<element name="findUID" function="true" type="integer">
+			<arguments>
+				<argument name="uid" type="string"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="Creature">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="kill" function="true" type="void">
+			<description><![CDATA[kill creature]]></description>
+			<arguments>
+				<argument name="creature index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="senseCreaturesProperty" function="true" type="float">
+			<description><![CDATA[arguments:
+ - x,y,z (sensor position)
+ - property (name, name[index] or Class:id). name[index] can be used for Vector objects inside the user fields, eg "user2[10]"
+ - exclude (creature object)
+works like a smell sensor for a given property (for all creatures in this group except "exclude").
+The following function reproduces the "classic" framsticks "S" sensor:
+function smellReceptorValue(x,y,z,exclude)
+{
+var i,s=0; for(i=0;i<Populations.size;i++)
+	s+=Populations[0].senseCreaturesProperty(x,y,z,"energy",exclude);
+return s;
+}]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+				<argument name="propertyname" type="string"/>
+				<argument name="exclude" type="Creature"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Populations" context="Global context">
+<description><![CDATA[Manages all Creature objects in the experiment, organized in one or more groups. See also: Creature, Population]]></description>
+		<element name="creature" type="integer"/>
+		<element name="group" type="integer"/>
+		<element name="size" type="integer"/>
+		<element name="addGroup" function="true" type="void">
+			<description><![CDATA[add population]]></description>
+			<arguments>
+				<argument name="name" type="string"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void">
+			<description><![CDATA[remove all populations except the first one]]></description>
+<arguments/></element>
+		<element name="clearGroup" function="true" type="void">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="creatBBCollisions" function="true" type="integer">
+			<description><![CDATA[Checks approximate collisions for the selected creature.
+Returns the collision mask calculated as in the regular simulation. The argument is the collision mask substituted for the selected creature (defaults to group colmask for 0)]]></description>
+			<arguments>
+				<argument name="mask" type="integer"/>
+			</arguments>
+		</element>
+		<element name="createFromGenotype" function="true" type="Creature">
+			<description><![CDATA[uses the selected Genotype object]]></description>
+<arguments/></element>
+		<element name="createFromString" function="true" type="Creature">
+			<description><![CDATA[uses the supplied string argument]]></description>
+			<arguments>
+				<argument name="genotype" type="string"/>
+			</arguments>
+		</element>
+		<element name="deleteGroup" function="true" type="void">
+			<description><![CDATA[remove population]]></description>
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="deleteSelected" function="true" type="void">
+			<description><![CDATA[applies to the selected Creature]]></description>
+<arguments/></element>
+		<element name="findCreatureAt" function="true" type="Creature">
+			<arguments>
+				<argument name="point" type="Vector"/>
+				<argument name="vector" type="Vector"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="Population">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="killSelected" function="true" type="void">
+			<description><![CDATA[applies to the selected Creature]]></description>
+<arguments/></element>
+	</type>
+	<type name="Ref" context="Global context">
+<description><![CDATA[Reference objects. Useful for returning things from functions.
+
+Example:
+var x=111;
+square(&x);// '&' creates the Reference object
+Simulator.print(x);//x is now 12321
+
+function square(r)
+{r.value=r.value*r.value;}
+//square receives the Reference objects and changes its 'value' field]]></description>
+		<element name="toString" type="string"/>
+		<element name="value" type="untyped"/>
+		<element name="copyFrom" function="true" type="void">
+			<description><![CDATA[make the reference point to the same target,]]></description>
+			<arguments>
+				<argument type="Ref"/>
+			</arguments>
+		</element>
+		<element name="newO" function="true">
+			<description><![CDATA[(for internal use only) use &variablename to create Ref objects.]]></description>
+		</element>
+		<element name="newS" function="true">
+			<description><![CDATA[(for internal use only) use &variablename to create Ref objects.]]></description>
+		</element>
+	</type>
+	<type name="Shapes" context="Global context">
+<description><![CDATA[This object defines appearance of the elements of creatures (applies to the 'wireframe' display mode). Default shape definitions make food's "p:" look like a sphere, and manipulator's "p:" look like a robot hand. The model's Vstyle property is the name of the shape. Developers of experiment definitions can introduce new Vstyle(s) for their expdef and provide appropriate shape definitions by calling Shapes.set(...) in the onExpDefLoad() function.]]></description>
+		<element name="clear" function="true" type="void"><arguments/></element>
+		<element name="set" function="true" type="void">
+			<description><![CDATA[Arguments:
+
+- "id" - can be
+  "1p_STYLENAME": affects a single-Part creature (without Joints)
+  "p_STYLENAME": affects all normal Parts
+  "j_STYLENAME": affects Joints
+     (STYLENAME corresponds to the Model.Vstyle value, and it can be empty).
+
+- "definition" is a genotype describing the object shape
+
+- "color" can be 0xRRGGBB or one of the special values: -3 = default creature color, -4 = default food color, -5 = default manipulator color
+
+Examples:
+Shapes.set("j_predator","X",0xff0000);//make all predators (i.e. creatures with Vstyle=predator) red
+Shapes.set("1p_food","...some...genotype...",-4);//change food appearance
+Shapes.set("p_","//0\np:0,0,0\np:-0.1,0,0\np:0.1,0,0\np:0,-0.1,0\np:0,0.1,0\np:0,0,-0.1\np:0,0,0.1\nj:0,1\nj:0,2\nj:0,3\nj:0,4\nj:0,5\nj:0,6\n",0);//make Parts' orientation axes visible]]></description>
+			<arguments>
+				<argument name="id" type="string"/>
+				<argument name="definition" type="string"/>
+				<argument name="color" type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Signal" context="Global context">
+<description><![CDATA[Signals broadcast information in a channel (being an abstract communication medium that could be imagined as sound, smell, vision or anything else). There are no sender-receiver associations, although the receiving party can filter out signals (two standard filtering methods are: physical neighborhood and one-dimensional attribute called flavor). Signals attached to neurons and creatures (created in Creature.signals and Neuro.signals) automatically follow the owner's location. Environmental signals (in World.signals) are stationary.
+
+Receiving: 
+There are 2 kinds of data you can receive:
+1. aggregating functions (receive and receiveFilter) calculate the overall power of the received signal (based on the distance and the source power).
+2.receiveSet and receiveSingle fetch the individual Signal object(s) so it is possible to transmit something else than just a single number (by using Signal.value) and do more sophisticated processing.
+
+Creating: Use "add" in Creature.signals, Neuro.signals, or World.signals.]]></description>
+		<element name="channel" type="string">
+			<description><![CDATA[Channel name, readonly.]]></description>
+		</element>
+		<element name="flavor" type="float">
+			<description><![CDATA[Signal flavor is can be used to differentiate between signals in a single channel. ]]></description>
+		</element>
+		<element name="pos" type="XYZ">
+			<description><![CDATA[Signal position, readonly.]]></description>
+		</element>
+		<element name="power" type="float">
+			<description><![CDATA[Signal power affects the aggregated signal value returned from receive() and receiveFilter().]]></description>
+		</element>
+		<element name="value" type="untyped">
+			<description><![CDATA[Signal value can be any type. On the receiver side it is only available by accessing the individual Signal objects, i.e. after calling receiveSet() or receiveSingle(). The aggregating function receive() and receiveFilter() ignore this attribute.]]></description>
+		</element>
+		<element name="remove" function="true">
+			<description><![CDATA[Deletes the signal]]></description>
+		</element>
+	</type>
+	<type name="sim_params" context="Global context">
+<description><![CDATA[This object groups all simulator parameters so they can be loaded or saved with a single call (see scripts/standard_loadsave.inc). For other purposes please use specific objects, like Simulator, World, Populations, etc.]]></description>
+		<element name="autosaveperiod" type="integer" min="0" max="100000">
+			<description><![CDATA[Save simulation state once every n-th event
+(events are defined by the script. For 'standard.expdef' it is after each death).
+Save EXPT file first to initialize name for autosave files.]]></description>
+		</element>
+		<element name="bnoise_struct" type="float" min="0" max="10" default="0">
+			<description><![CDATA[When >0, body constructs of creatures (position of Parts) will be randomly disturbed when they are created.]]></description>
+		</element>
+		<element name="bnoise_vel" type="float" min="0" max="10" default="0">
+			<description><![CDATA[Random velocities will be applied to all body Parts (in MechaStick) or rigid segments (in ODE) of newly created creatures.]]></description>
+		</element>
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="createrr" type="integer" min="0" max="2" default="1"/>
+		<element name="creatwarnfail" type="integer" min="0" max="1">
+			<description><![CDATA[Creatures grown with warnings will not be simulated.]]></description>
+		</element>
+		<element name="expdef" type="string">
+			<description><![CDATA[Choose the experiment framework
+(in Windows GUI, confirm by pressing 'Apply')
+
+Stop the simulation before selecting another experiment definition.
+It is a good practice to initialize the experiment before running the simulation.]]></description>
+		</element>
+		<element name="expdef_info" type="string"/>
+		<element name="expdef_title" type="string"/>
+		<element name="f0_c_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_c_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_c_wei" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_rsf" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_stf" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_j_stm" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_n_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_n_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_n_prp" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_nodel_tag" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[You can tag elements using their 'i' field and the i="mi=d" tag.
+Mutations will not delete such elements.
+The i="mi=dm" combination is allowed.]]></description>
+		</element>
+		<element name="f0_nomod_tag" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[You can tag elements using their 'i' field and the i="mi=m" tag.
+Mutations will not modify properties of such elements.
+The i="mi=md" combination is allowed.]]></description>
+		</element>
+		<element name="f0_p_asm" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_del" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_frc" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_ing" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_mas" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_new" type="float" min="0" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_pos" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0_p_swp" type="float" min="0" max="100" default="10">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f0Fuzzy_maxRules" type="integer" min="0" max="999">
+			<description><![CDATA[Maximum number of fuzzy rules]]></description>
+		</element>
+		<element name="f0Fuzzy_maxSets" type="integer" min="0" max="999">
+			<description><![CDATA[Maximum number of fuzzy sets]]></description>
+		</element>
+		<element name="f0Fuzzy_prob0" type="float" min="0" max="1">
+			<description><![CDATA[Probability of adding new fuzzy set with simple rule, which uses this set (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob1" type="float" min="0" max="1">
+			<description><![CDATA[Probability of removing fuzzy set (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob2" type="float" min="0" max="1">
+			<description><![CDATA[Probability of adding new rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob3" type="float" min="0" max="1">
+			<description><![CDATA[Probability of removing rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob4" type="float" min="0" max="1">
+			<description><![CDATA[Probability of adding new input or output to exisitng rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f0Fuzzy_prob5" type="float" min="0" max="1">
+			<description><![CDATA[Probability of removing input or output from exisitng rule (1=proceed on all genes, 0.1=proceed on ten percent)]]></description>
+		</element>
+		<element name="f1_mut_exmod" type="string">
+			<description><![CDATA[Modifiers that will not be added nor deleted during mutation
+(all: RrLlAaCcFfMmSsIiQqWwEe)]]></description>
+		</element>
+		<element name="f1_nmConn" type="float" min="0" max="100" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f1_nmNeu" type="float" min="0" max="100" default="0.05">
+			<description><![CDATA[Adds a (connected) neuron or removes a neuron]]></description>
+		</element>
+		<element name="f1_nmProp" type="float" min="0" max="100" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f1_nmVal" type="float" min="0" max="100" default="0.05"/>
+		<element name="f1_nmWei" type="float" min="0" max="100" default="1"/>
+		<element name="f1_smComma" type="float" min="0" max="100" default="0.02"/>
+		<element name="f1_smJunct" type="float" min="0" max="100" default="0.02"/>
+		<element name="f1_smModif" type="float" min="0" max="100" default="0.1">
+			<description><![CDATA[Modifiers: RrLlAaCcFfMmSsIiQqWwEe]]></description>
+		</element>
+		<element name="f1_smX" type="float" min="0" max="100" default="0.05"/>
+		<element name="f1_xo_propor" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Cross over (exchange) corresponding segments of the two parent genotypes?
+
+f1 uses a two-point crossing over.
+If this option is turned on, cut points will be selected proportionally to neural genes.
+Thus, if both parents have the same number of neurons, then this will be preserved in their children.]]></description>
+		</element>
+		<element name="f2_mutAddOper" type="float" min="0" max="1" default="0.4">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutConnElem" type="float" min="0" max="1" default="0.33">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutDelOper" type="float" min="0" max="1" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutHandleOper" type="float" min="0" max="1" default="0.3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutJointElem" type="float" min="0" max="1" default="0.33">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutNeuroElem" type="float" min="0" max="1" default="0.33">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f2_mutPropOper" type="float" min="0" max="1" default="0.2">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDelIns" type="float" min="0" max="1" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDelInsLength" type="integer" min="1" max="100" default="5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDelInsPerChar" type="float" min="0" max="1" default="0.05">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutDuplication" type="float" min="0" max="1" default="0.05">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutSubstitution" type="float" min="0" max="1" default="0.6">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutSubstPerChar" type="float" min="0" max="1" default="0.1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_mutTranslocation" type="float" min="0" max="1" default="0.15">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_xovCrossingOver" type="float" min="0" max="1" default="0.2">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f3_xovGeneTransfer" type="float" min="0" max="1" default="0.8">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="f4_mut_add" type="float" min="0" max="100" default="50">
+			<description><![CDATA[mutation: probability of adding a node]]></description>
+		</element>
+		<element name="f4_mut_add_conn" type="float" min="0" max="100" default="15">
+			<description><![CDATA[add node mutation: probability of adding a neural connection]]></description>
+		</element>
+		<element name="f4_mut_add_div" type="float" min="0" max="100" default="20">
+			<description><![CDATA[add node mutation: probability of adding a division]]></description>
+		</element>
+		<element name="f4_mut_add_neupar" type="float" min="0" max="100" default="5">
+			<description><![CDATA[add node mutation: probability of adding a neuron property/modifier]]></description>
+		</element>
+		<element name="f4_mut_add_rep" type="float" min="0" max="100" default="10">
+			<description><![CDATA[add node mutation: probability of adding a repetition]]></description>
+		</element>
+		<element name="f4_mut_add_simp" type="float" min="0" max="100" default="50">
+			<description><![CDATA[add node mutation: probability of adding a random, simple gene]]></description>
+		</element>
+		<element name="f4_mut_del" type="float" min="0" max="100" default="20">
+			<description><![CDATA[mutation: probability of deleting a node]]></description>
+		</element>
+		<element name="f4_mut_mod" type="float" min="0" max="100" default="30">
+			<description><![CDATA[mutation: probability of changing a node]]></description>
+		</element>
+		<element name="filecomm" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Display comments encountered in opened files]]></description>
+		</element>
+		<element name="gen_extmutinfo" type="integer" min="0" max="2" default="0">
+			<description><![CDATA[If active, information about employed mutation method will be stored in the 'info' field of each mutated genotype.]]></description>
+		</element>
+		<element name="gen_hilite" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Use colors for genes?
+(slows down viewing/editing of huge genotypes)]]></description>
+		</element>
+		<element name="gen_hist" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Required for phylogenetic analysis]]></description>
+		</element>
+		<element name="genkonw0" type="integer" min="0" max="1">
+			<description><![CDATA[Original Framsticks genotype format]]></description>
+		</element>
+		<element name="genkonw1" type="integer" min="0" max="1">
+			<description><![CDATA[Similarity encoding]]></description>
+		</element>
+		<element name="genkonw2" type="integer" min="0" max="1">
+			<description><![CDATA[Biological encoding]]></description>
+		</element>
+		<element name="genkonw3" type="integer" min="0" max="1">
+			<description><![CDATA[Developmental encoding]]></description>
+		</element>
+		<element name="genolib" type="GenePools"/>
+		<element name="genoper_f0" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f1" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f2" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f3" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="genoper_f4" type="integer" min="0" max="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="groupchk" type="integer" min="0" max="1"/>
+		<element name="importchk" type="integer" min="0" max="1"/>
+		<element name="livelib" type="Populations"/>
+		<element name="loadchk" type="integer" min="0" max="1"/>
+		<element name="maxjoint" type="float" min="0" max="100" default="2"/>
+		<element name="minjoint" type="float" min="0" max="100" default="0"/>
+		<element name="neuadd_N" type="integer" min="0" max="1">
+			<description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1
+   Force (fo) float 0..999
+   Sigmoid (si) float -99999..99999
+   State (s) float -1..1]]></description>
+		</element>
+		<element name="neuadd_Nu" type="integer" min="0" max="1">
+			<description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1
+   Force (fo) float 0..999
+   Sigmoid (si) float -99999..99999
+   State (s) float -1..1]]></description>
+		</element>
+		<element name="neuadd_G" type="integer" min="0" max="1">
+			<description><![CDATA[Equilibrium sensor.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+		</element>
+		<element name="neuadd_T" type="integer" min="0" max="1">
+			<description><![CDATA[Touch sensor.
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1]]></description>
+		</element>
+		<element name="neuadd_S" type="integer" min="0" max="1">
+			<description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="neuadd_*" type="integer" min="0" max="1">
+			<description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_|" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1
+   bending range (r) float 0..1]]></description>
+		</element>
+		<element name="neuadd_@" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1]]></description>
+		</element>
+		<element name="neuadd_D" type="integer" min="0" max="1">
+			<description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_Fuzzy" type="integer" min="0" max="1">
+			<description><![CDATA[Refer to publications to learn about this neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string
+   fuzzy rules (fr) string]]></description>
+		</element>
+		<element name="neuadd_VEye" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string
+   perspective (p) float 0.1..10
+   scale (s) float 0.1..100
+   show hidden lines (h) integer 0..1
+   output lines count (each line needs four channels) (o) integer 0..99
+   debug (d) integer 0..1]]></description>
+		</element>
+		<element name="neuadd_VMotor" type="integer" min="0" max="1">
+			<description><![CDATA[Must be connected to the VEye and properly set up.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+		</element>
+		<element name="neuadd_Sti" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="neuadd_LMu" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1]]></description>
+		</element>
+		<element name="neuadd_Water" type="integer" min="0" max="1">
+			<description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="neuadd_Energy" type="integer" min="0" max="1">
+			<description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_Ch" type="integer" min="0" max="1">
+			<description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_ChMux" type="integer" min="0" max="1">
+			<description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_ChSel" type="integer" min="0" max="1">
+			<description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+		</element>
+		<element name="neuadd_Rnd" type="integer" min="0" max="1">
+			<description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="neuadd_Sin" type="integer" min="0" max="1">
+			<description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1
+   time (t) float 0..6.28319]]></description>
+		</element>
+		<element name="ncl_N" type="integer" min="0" max="1">
+			<description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1
+   Force (fo) float 0..999
+   Sigmoid (si) float -99999..99999
+   State (s) float -1..1]]></description>
+		</element>
+		<element name="ncl_Nu" type="integer" min="0" max="1">
+			<description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1
+   Force (fo) float 0..999
+   Sigmoid (si) float -99999..99999
+   State (s) float -1..1]]></description>
+		</element>
+		<element name="ncl_G" type="integer" min="0" max="1">
+			<description><![CDATA[Equilibrium sensor.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+		</element>
+		<element name="ncl_T" type="integer" min="0" max="1">
+			<description><![CDATA[Touch sensor.
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1]]></description>
+		</element>
+		<element name="ncl_S" type="integer" min="0" max="1">
+			<description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="ncl_*" type="integer" min="0" max="1">
+			<description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="ncl_|" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1
+   bending range (r) float 0..1]]></description>
+		</element>
+		<element name="ncl_@" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1]]></description>
+		</element>
+		<element name="ncl_D" type="integer" min="0" max="1">
+			<description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="ncl_Fuzzy" type="integer" min="0" max="1">
+			<description><![CDATA[Refer to publications to learn about this neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string
+   fuzzy rules (fr) string]]></description>
+		</element>
+		<element name="ncl_VEye" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string
+   perspective (p) float 0.1..10
+   scale (s) float 0.1..100
+   show hidden lines (h) integer 0..1
+   output lines count (each line needs four channels) (o) integer 0..99
+   debug (d) integer 0..1]]></description>
+		</element>
+		<element name="ncl_VMotor" type="integer" min="0" max="1">
+			<description><![CDATA[Must be connected to the VEye and properly set up.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+		</element>
+		<element name="ncl_Sti" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="ncl_LMu" type="integer" min="0" max="1">
+			<description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1]]></description>
+		</element>
+		<element name="ncl_Water" type="integer" min="0" max="1">
+			<description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+		</element>
+		<element name="ncl_Energy" type="integer" min="0" max="1">
+			<description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="ncl_Ch" type="integer" min="0" max="1">
+			<description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="ncl_ChMux" type="integer" min="0" max="1">
+			<description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="ncl_ChSel" type="integer" min="0" max="1">
+			<description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+		</element>
+		<element name="ncl_Rnd" type="integer" min="0" max="1">
+			<description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+		</element>
+		<element name="ncl_Sin" type="integer" min="0" max="1">
+			<description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1
+   time (t) float 0..6.28319]]></description>
+		</element>
+		<element name="nnspeed" type="float" min="0" max="1000" default="1">
+			<description><![CDATA[Number of neural network simulation steps in each physics simulation step]]></description>
+		</element>
+		<element name="odeairdrag" type="float" min="0" max="0.5" default="0.01">
+			<description><![CDATA[A drag force ("air drag") proportional to the velocity of mass centers of moving parts]]></description>
+		</element>
+		<element name="odecol2bounce" type="float" min="0" max="1" default="0.1"/>
+		<element name="odecol2bouncevel" type="float" min="0" max="1" default="0.01"/>
+		<element name="odecol2mumax" type="float" min="0" max="10" default="1">
+			<description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+		</element>
+		<element name="odecol2mumin" type="float" min="0" max="10" default="0.1">
+			<description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+		</element>
+		<element name="odecol2softcfm" type="float" min="0" max="1" default="0"/>
+		<element name="odecolbounce" type="float" min="0" max="1" default="0.1"/>
+		<element name="odecolbouncevel" type="float" min="0" max="1" default="0.01"/>
+		<element name="odecolmumax" type="float" min="0" max="10" default="5">
+			<description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+		</element>
+		<element name="odecolmumin" type="float" min="0" max="10" default="0.1">
+			<description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+		</element>
+		<element name="odecolsoftcfm" type="float" min="0" max="1" default="0"/>
+		<element name="odemusclemax" type="float" min="0" max="100" default="10">
+			<description><![CDATA[i.e. "MMMMM" if f1]]></description>
+		</element>
+		<element name="odemusclemin" type="float" min="0" max="100" default="0">
+			<description><![CDATA[i.e. "mmmmm" in f1]]></description>
+		</element>
+		<element name="odemusclespeed" type="float" min="0" max="10" default="1">
+			<description><![CDATA[Muscle state cannot change faster than the supplied value]]></description>
+		</element>
+		<element name="odeseed" type="integer" min="0" max="2">
+			<description><![CDATA[Affects collisions.
+- 'Truly random' is closest to the standard ODE operation. Use Math.seed to influence randomness in ODE collisions
+- 'Deterministic' automatically calculates random seed in each step based on the current simulation (world) state, which makes the simulation repeatable but more random than 'Fixed'
+- 'Fixed' is completely deterministic and does not depend on Math.seed. This might negatively affect ODE accuracy
+]]></description>
+		</element>
+		<element name="odeshape" type="integer" min="0" max="1"/>
+		<element name="odestep" type="float" min="0.001" max="1" default="0.05"/>
+		<element name="odewaterbuoy" type="float" min="0" max="2" default="1"/>
+		<element name="odewaterdrag" type="float" min="0.001" max="1" default="0.5"/>
+		<element name="overwrite" type="integer" min="0" max="1">
+			<description><![CDATA[Overwite existing files or create their backups]]></description>
+		</element>
+		<element name="randinit" type="float" min="0" max="10" default="0.01">
+			<description><![CDATA[Initialize all neuron states with uniform distribution random numbers]]></description>
+		</element>
+		<element name="resetonexpdef" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[If turned on: when a new experiment definition is selected, default values are loaded for most of the simulator parameters, and gene pools and populations are cleared.
+When turned off: parameters from previous experiment definition will remain.]]></description>
+		</element>
+		<element name="running" type="integer" min="0" max="1">
+			<description><![CDATA[for synchronizing the user interface state]]></description>
+		</element>
+		<element name="signals" type="WorldSignals"/>
+		<element name="simil_method" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="simil_neuro" type="float" min="0" max="100" default="0.5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="simil_partdeg" type="float" min="0" max="100" default="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="simil_parts" type="float" min="0" max="100" default="0">
+			<description><![CDATA[Differing number of parts is also handled by the 'part degree' similarity component.]]></description>
+		</element>
+		<element name="simspeed" type="integer">
+			<description><![CDATA[steps/second]]></description>
+		</element>
+		<element name="simtype" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[MechaStick is a fast and simple primary Framsticks simulation engine.
+ODE is Open Dynamics Engine by Russel Smith et al.
+
+NOTE: switching between simulation engines causes removal of all objects in the world (e.g. creatures).]]></description>
+		</element>
+		<element name="symAlphaSteps" type="integer" min="2" max="50" default="20">
+			<description><![CDATA[Default number of samples per full angle (#1)]]></description>
+		</element>
+		<element name="symBetaSteps" type="integer" min="2" max="50" default="20">
+			<description><![CDATA[Default number of samples per full angle (#2)]]></description>
+		</element>
+		<element name="symPosSteps" type="integer" min="2" max="50" default="10">
+			<description><![CDATA[Default number of samples per stick length]]></description>
+		</element>
+		<element name="symResultA" type="float"/>
+		<element name="symResultB" type="float"/>
+		<element name="symResultC" type="float"/>
+		<element name="symResultD" type="float"/>
+		<element name="time" type="integer"/>
+		<element name="touchrange" type="float" min="0" max="100" default="1"/>
+		<element name="usercode" type="string">
+			<description><![CDATA[This script overrides the experiment definition]]></description>
+		</element>
+		<element name="vmdebug" type="integer" min="0" max="1"/>
+		<element name="world" type="World"/>
+		<element name="wrldbnd" type="integer" min="0" max="2" default="1"/>
+		<element name="wrldg" type="float" min="0" max="10" default="1">
+			<description><![CDATA[You can adjust gravity for your experiments.
+The "official" setting used to evaluate and compare creatures is 1.]]></description>
+		</element>
+		<element name="wrldmap" type="string">
+			<description><![CDATA[Description of the world (Type: Blocks or Heighfield). Enter
+   r <sizex> <sizey> [seed]
+to generate a random landscape, or
+   m <sizex> <sizey> digits
+   M <sizex> <sizey> numbers
+to provide height values.
+
+See also the WorldMap object.]]></description>
+		</element>
+		<element name="wrldsiz" type="float" min="10" max="1000" default="20">
+			<description><![CDATA[Side length of the world]]></description>
+		</element>
+		<element name="wrldtyp" type="integer" min="0" max="2" default="0"/>
+		<element name="wrldwat" type="float" min="-20" max="30" default="-1"/>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="beep" function="true" type="void">
+			<description><![CDATA[Plays a default system sound]]></description>
+<arguments/></element>
+		<element name="calculateSymmetry" function="true" type="float">
+			<description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using default precision parameters (symPosSteps,symAlphaSteps,symBetaSteps). Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+			<arguments>
+				<argument name="model" type="Model"/>
+			</arguments>
+		</element>
+		<element name="calculateSymmetry2" function="true" type="float">
+			<description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using specified precision parameters. Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+			<arguments>
+				<argument name="model" type="Model"/>
+				<argument name="posSteps" type="integer"/>
+				<argument name="alphaSteps" type="integer"/>
+				<argument name="betaSteps" type="integer"/>
+			</arguments>
+		</element>
+		<element name="calculateSymmetryForPlane" function="true" type="float">
+			<description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model and given a specific plane defined by coefficients A, B, C, D.]]></description>
+			<arguments>
+				<argument name="model" type="Model"/>
+				<argument name="A" type="float"/>
+				<argument name="B" type="float"/>
+				<argument name="C" type="float"/>
+				<argument name="D" type="float"/>
+			</arguments>
+		</element>
+		<element name="checkpoint" function="true" type="void">
+			<description><![CDATA[This function was previously called "autosave".]]></description>
+<arguments/></element>
+		<element name="clear" function="true"/>
+		<element name="crossOver" function="true" type="Geno">
+			<description><![CDATA[returns crossed over genotype]]></description>
+			<arguments>
+				<argument type="Geno"/>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="eval" function="true" type="void">
+			<arguments>
+				<argument name="script expression" type="string"/>
+			</arguments>
+		</element>
+		<element name="evaluateDistance" function="true" type="float">
+			<description><![CDATA[calculate dissimilarity between two models created from Geno objects]]></description>
+			<arguments>
+				<argument type="Geno"/>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="export" function="true" type="void">
+			<description><![CDATA[Save some data to file. arguments:
+- filename
+- flags: composed of the following bit values:
+   1 - experiment (works like "save" and all other bits are ignored)
+   2 - genotypes
+   4 - simulator parameters
+   8 - simulator stats
+   16 - genepool settings
+   32 - population settings
+   64 - do autosave
+- selected genepool
+- selected population]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="options" type="integer"/>
+				<argument name="genepool" type="integer"/>
+				<argument name="population" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getSimplest" function="true" type="Geno">
+			<description><![CDATA[returns the simplest genotype for a given encoding (format). 0 means f0, 4 means f4, etc.]]></description>
+			<arguments>
+				<argument name="format" type="integer"/>
+			</arguments>
+		</element>
+		<element name="import" function="true" type="void">
+			<description><![CDATA[Load some data from file. The second optional argument selects what section(s) will be imported:
+ 1 - experiment (works like "load" and can reset the simulator state!)
+ 2 - genotypes
+ 4 - simulator parameters
+ 8 - genepool settings
+ 16 - population settings
+ 32 - new groups will be created for imported genepools and populations
+64 - allow switching to a different expdef while importing parameters (4)
+
+The standard behavior (without the second argument) is to import genotypes, parameters, and genepool and population settings (2+4+8+16). Note that "64" is not included by default, because the expdef change resets all simulator parameters, which contradicts the usual meaning of "import" in Framsticks ("add data", as opposed to "load" meaning "replace data"). Moreover, using the "64" option in scripts can be dengerous, especially all expdef and show scripts should always declare the proper expdef name in their header rather than change the expdef directly. Without the "64" option, it is always safe to "import" any file in a script regardless of the current simulator state.]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="options" type="integer"/>
+			</arguments>
+		</element>
+		<element name="init" function="true" type="void">
+			<description><![CDATA[Performs initialization procedures, like resetting counters, states, gene pools, etc.]]></description>
+<arguments/></element>
+		<element name="load" function="true" type="void">
+			<description><![CDATA[Load experiment file (calls onExpLoad() in the current experiment definition). This function is intended to replace the simulator state; the old state is cleared by automatically calling "resetToDefaults()" (only if "resetonexpdef" is enabled). Use "import" if you don't want to loose the old simulator state.]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+			</arguments>
+		</element>
+		<element name="loadexpdef" function="true" type="void"><arguments/></element>
+		<element name="loadNeurons" function="true" type="void">
+			<arguments>
+				<argument name="directory path" type="string"/>
+			</arguments>
+		</element>
+		<element name="message" function="true" type="void">
+			<description><![CDATA[The second argument can be:
+ -1 = debugging message
+ 0 = information
+ 1 = warning
+ 2 = error
+ 3 = critical error]]></description>
+			<arguments>
+				<argument name="text" type="string"/>
+				<argument name="level" type="integer"/>
+			</arguments>
+		</element>
+		<element name="mutate" function="true" type="Geno">
+			<description><![CDATA[returns mutated Geno object from supplied Geno]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="Simulator"><arguments/></element>
+		<element name="operReport" function="true" type="void">
+			<description><![CDATA[Show available genetic operators]]></description>
+<arguments/></element>
+		<element name="print" function="true" type="void">
+			<description><![CDATA[One argument: message to be printed]]></description>
+			<arguments>
+				<argument name="text" type="string"/>
+			</arguments>
+		</element>
+		<element name="rayIntersection" function="true" type="float">
+			<arguments>
+				<argument name="position x" type="float"/>
+				<argument name="position y" type="float"/>
+				<argument name="position z" type="float"/>
+				<argument name="direction x" type="float"/>
+				<argument name="direction y" type="float"/>
+				<argument name="direction z" type="float"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+		<element name="resetToDefaults" function="true" type="void">
+			<description><![CDATA[Clears groups and loads default values for simulator parameters, then calls onExpDefLoad() of the current experiment definition.]]></description>
+<arguments/></element>
+		<element name="save" function="true" type="void">
+			<description><![CDATA[Save experiment file (calls onExpSave() in the current experiment definition)]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+			</arguments>
+		</element>
+		<element name="sleep" function="true" type="void">
+			<description><![CDATA[Suspends the execution for a specified interval]]></description>
+			<arguments>
+				<argument name="milliseconds" type="integer"/>
+			</arguments>
+		</element>
+		<element name="sound" function="true" type="void">
+			<description><![CDATA[Generates a simple tone on the speaker]]></description>
+			<arguments>
+				<argument name="freqency in Hz" type="integer"/>
+				<argument name="length in milliseconds" type="integer"/>
+			</arguments>
+		</element>
+		<element name="start" function="true" type="void">
+			<description><![CDATA[called by the user interface]]></description>
+<arguments/></element>
+		<element name="step" function="true" type="void"><arguments/></element>
+		<element name="stop" function="true" type="void">
+			<description><![CDATA[the expdef script calls this to stop simulation]]></description>
+<arguments/></element>
+		<element name="toHTML" function="true" type="string">
+			<description><![CDATA[returns genotype expressed as colored HTML]]></description>
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="toHTMLshort" function="true" type="string">
+			<description><![CDATA[returns genotype (abbreviated if needed) expressed as colored HTML]]></description>
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="validate" function="true" type="Geno">
+			<description><![CDATA[returns validated (if possible) Geno object from supplied Geno]]></description>
+			<arguments>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+		<element name="wrldchg" function="true" type="void"><arguments/></element>
+	</type>
+	<type name="Similarity" context="Global context">
+		<element name="simil_method" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="simil_neuro" type="float" min="0" max="100" default="0.5">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="simil_partdeg" type="float" min="0" max="100" default="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="simil_parts" type="float" min="0" max="100" default="0">
+			<description><![CDATA[Differing number of parts is also handled by the 'part degree' similarity component.]]></description>
+		</element>
+		<element name="evaluateDistance" function="true" type="float">
+			<description><![CDATA[calculate dissimilarity between two models created from Geno objects]]></description>
+			<arguments>
+				<argument type="Geno"/>
+				<argument type="Geno"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Simulator" context="Global context">
+<description><![CDATA[The Framsticks simulator.]]></description>
+		<element name="autosaveperiod" type="integer" min="0" max="100000">
+			<description><![CDATA[Save simulation state once every n-th event
+(events are defined by the script. For 'standard.expdef' it is after each death).
+Save EXPT file first to initialize name for autosave files.]]></description>
+		</element>
+		<element name="createrr" type="integer" min="0" max="2" default="1"/>
+		<element name="creatwarnfail" type="integer" min="0" max="1">
+			<description><![CDATA[Creatures grown with warnings will not be simulated.]]></description>
+		</element>
+		<element name="expdef" type="string">
+			<description><![CDATA[Choose the experiment framework
+(in Windows GUI, confirm by pressing 'Apply')
+
+Stop the simulation before selecting another experiment definition.
+It is a good practice to initialize the experiment before running the simulation.]]></description>
+		</element>
+		<element name="expdef_info" type="string"/>
+		<element name="expdef_title" type="string"/>
+		<element name="filecomm" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[Display comments encountered in opened files]]></description>
+		</element>
+		<element name="genolib" type="GenePools"/>
+		<element name="groupchk" type="integer" min="0" max="1"/>
+		<element name="importchk" type="integer" min="0" max="1"/>
+		<element name="livelib" type="Populations"/>
+		<element name="loadchk" type="integer" min="0" max="1"/>
+		<element name="maxjoint" type="float" min="0" max="100" default="2"/>
+		<element name="minjoint" type="float" min="0" max="100" default="0"/>
+		<element name="overwrite" type="integer" min="0" max="1">
+			<description><![CDATA[Overwite existing files or create their backups]]></description>
+		</element>
+		<element name="resetonexpdef" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[If turned on: when a new experiment definition is selected, default values are loaded for most of the simulator parameters, and gene pools and populations are cleared.
+When turned off: parameters from previous experiment definition will remain.]]></description>
+		</element>
+		<element name="running" type="integer" min="0" max="1">
+			<description><![CDATA[for synchronizing the user interface state]]></description>
+		</element>
+		<element name="simspeed" type="integer">
+			<description><![CDATA[steps/second]]></description>
+		</element>
+		<element name="time" type="integer"/>
+		<element name="usercode" type="string">
+			<description><![CDATA[This script overrides the experiment definition]]></description>
+		</element>
+		<element name="vmdebug" type="integer" min="0" max="1"/>
+		<element name="world" type="World"/>
+		<element name="beep" function="true" type="void">
+			<description><![CDATA[Plays a default system sound]]></description>
+<arguments/></element>
+		<element name="checkpoint" function="true" type="void">
+			<description><![CDATA[This function was previously called "autosave".]]></description>
+<arguments/></element>
+		<element name="eval" function="true" type="void">
+			<arguments>
+				<argument name="script expression" type="string"/>
+			</arguments>
+		</element>
+		<element name="export" function="true" type="void">
+			<description><![CDATA[Save some data to file. arguments:
+- filename
+- flags: composed of the following bit values:
+   1 - experiment (works like "save" and all other bits are ignored)
+   2 - genotypes
+   4 - simulator parameters
+   8 - simulator stats
+   16 - genepool settings
+   32 - population settings
+   64 - do autosave
+- selected genepool
+- selected population]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="options" type="integer"/>
+				<argument name="genepool" type="integer"/>
+				<argument name="population" type="integer"/>
+			</arguments>
+		</element>
+		<element name="import" function="true" type="void">
+			<description><![CDATA[Load some data from file. The second optional argument selects what section(s) will be imported:
+ 1 - experiment (works like "load" and can reset the simulator state!)
+ 2 - genotypes
+ 4 - simulator parameters
+ 8 - genepool settings
+ 16 - population settings
+ 32 - new groups will be created for imported genepools and populations
+64 - allow switching to a different expdef while importing parameters (4)
+
+The standard behavior (without the second argument) is to import genotypes, parameters, and genepool and population settings (2+4+8+16). Note that "64" is not included by default, because the expdef change resets all simulator parameters, which contradicts the usual meaning of "import" in Framsticks ("add data", as opposed to "load" meaning "replace data"). Moreover, using the "64" option in scripts can be dengerous, especially all expdef and show scripts should always declare the proper expdef name in their header rather than change the expdef directly. Without the "64" option, it is always safe to "import" any file in a script regardless of the current simulator state.]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+				<argument name="options" type="integer"/>
+			</arguments>
+		</element>
+		<element name="init" function="true" type="void">
+			<description><![CDATA[Performs initialization procedures, like resetting counters, states, gene pools, etc.]]></description>
+<arguments/></element>
+		<element name="load" function="true" type="void">
+			<description><![CDATA[Load experiment file (calls onExpLoad() in the current experiment definition). This function is intended to replace the simulator state; the old state is cleared by automatically calling "resetToDefaults()" (only if "resetonexpdef" is enabled). Use "import" if you don't want to loose the old simulator state.]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+			</arguments>
+		</element>
+		<element name="loadexpdef" function="true" type="void"><arguments/></element>
+		<element name="loadNeurons" function="true" type="void">
+			<arguments>
+				<argument name="directory path" type="string"/>
+			</arguments>
+		</element>
+		<element name="message" function="true" type="void">
+			<description><![CDATA[The second argument can be:
+ -1 = debugging message
+ 0 = information
+ 1 = warning
+ 2 = error
+ 3 = critical error]]></description>
+			<arguments>
+				<argument name="text" type="string"/>
+				<argument name="level" type="integer"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="Simulator"><arguments/></element>
+		<element name="print" function="true" type="void">
+			<description><![CDATA[One argument: message to be printed]]></description>
+			<arguments>
+				<argument name="text" type="string"/>
+			</arguments>
+		</element>
+		<element name="resetToDefaults" function="true" type="void">
+			<description><![CDATA[Clears groups and loads default values for simulator parameters, then calls onExpDefLoad() of the current experiment definition.]]></description>
+<arguments/></element>
+		<element name="save" function="true" type="void">
+			<description><![CDATA[Save experiment file (calls onExpSave() in the current experiment definition)]]></description>
+			<arguments>
+				<argument name="filename" type="string"/>
+			</arguments>
+		</element>
+		<element name="sleep" function="true" type="void">
+			<description><![CDATA[Suspends the execution for a specified interval]]></description>
+			<arguments>
+				<argument name="milliseconds" type="integer"/>
+			</arguments>
+		</element>
+		<element name="sound" function="true" type="void">
+			<description><![CDATA[Generates a simple tone on the speaker]]></description>
+			<arguments>
+				<argument name="freqency in Hz" type="integer"/>
+				<argument name="length in milliseconds" type="integer"/>
+			</arguments>
+		</element>
+		<element name="start" function="true" type="void">
+			<description><![CDATA[called by the user interface]]></description>
+<arguments/></element>
+		<element name="step" function="true" type="void"><arguments/></element>
+		<element name="stop" function="true" type="void">
+			<description><![CDATA[the expdef script calls this to stop simulation]]></description>
+<arguments/></element>
+	</type>
+	<type name="stats" context="Global context">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="gen_count" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_mfailed" type="integer">
+			<description><![CDATA[couldn't be performed]]></description>
+		</element>
+		<element name="gen_minvalid" type="integer">
+			<description><![CDATA[couldn't be repaired]]></description>
+		</element>
+		<element name="gen_mutimpr" type="float">
+			<description><![CDATA[total cumulative mutation change]]></description>
+		</element>
+		<element name="gen_mvalid" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_mvalidated" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_xofailed" type="integer">
+			<description><![CDATA[couldn't be performed]]></description>
+		</element>
+		<element name="gen_xoimpr" type="float">
+			<description><![CDATA[total cumulative crossover change]]></description>
+		</element>
+		<element name="gen_xoinvalid" type="integer">
+			<description><![CDATA[couldn't be repaired]]></description>
+		</element>
+		<element name="gen_xovalid" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="gen_xovalidated" type="integer">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="st_avg_c_velocity" type="float"/>
+		<element name="st_avg_c_vertpos" type="float"/>
+		<element name="st_avg_c_vertvelocity" type="float"/>
+		<element name="st_avg_center_x" type="float"/>
+		<element name="st_avg_center_y" type="float"/>
+		<element name="st_avg_center_z" type="float"/>
+		<element name="st_avg_distance" type="float"/>
+		<element name="st_avg_fit" type="float"/>
+		<element name="st_avg_fit2" type="float"/>
+		<element name="st_avg_gnum" type="float"/>
+		<element name="st_avg_instances" type="float"/>
+		<element name="st_avg_lifespan" type="float"/>
+		<element name="st_avg_num" type="float"/>
+		<element name="st_avg_numconnections" type="float"/>
+		<element name="st_avg_numjoints" type="float"/>
+		<element name="st_avg_numneurons" type="float"/>
+		<element name="st_avg_numparts" type="float"/>
+		<element name="st_avg_pos_x" type="float"/>
+		<element name="st_avg_pos_y" type="float"/>
+		<element name="st_avg_pos_z" type="float"/>
+		<element name="st_avg_size_x" type="float"/>
+		<element name="st_avg_size_y" type="float"/>
+		<element name="st_avg_size_z" type="float"/>
+		<element name="st_avg_velocity" type="float"/>
+		<element name="st_avg_vertpos" type="float"/>
+		<element name="st_avg_vertvel" type="float"/>
+		<element name="st_count" type="integer"/>
+		<element name="st_max_c_velocity" type="float"/>
+		<element name="st_max_c_vertpos" type="float"/>
+		<element name="st_max_c_vertvelocity" type="float"/>
+		<element name="st_max_center_x" type="float"/>
+		<element name="st_max_center_y" type="float"/>
+		<element name="st_max_center_z" type="float"/>
+		<element name="st_max_distance" type="float"/>
+		<element name="st_max_fit" type="float"/>
+		<element name="st_max_fit2" type="float"/>
+		<element name="st_max_gnum" type="float"/>
+		<element name="st_max_instances" type="float"/>
+		<element name="st_max_lifespan" type="float"/>
+		<element name="st_max_num" type="float"/>
+		<element name="st_max_numconnections" type="float"/>
+		<element name="st_max_numjoints" type="float"/>
+		<element name="st_max_numneurons" type="float"/>
+		<element name="st_max_numparts" type="float"/>
+		<element name="st_max_pos_x" type="float"/>
+		<element name="st_max_pos_y" type="float"/>
+		<element name="st_max_pos_z" type="float"/>
+		<element name="st_max_size_x" type="float"/>
+		<element name="st_max_size_y" type="float"/>
+		<element name="st_max_size_z" type="float"/>
+		<element name="st_max_velocity" type="float"/>
+		<element name="st_max_vertpos" type="float"/>
+		<element name="st_max_vertvel" type="float"/>
+		<element name="st_min_c_velocity" type="float"/>
+		<element name="st_min_c_vertpos" type="float"/>
+		<element name="st_min_c_vertvelocity" type="float"/>
+		<element name="st_min_center_x" type="float"/>
+		<element name="st_min_center_y" type="float"/>
+		<element name="st_min_center_z" type="float"/>
+		<element name="st_min_distance" type="float"/>
+		<element name="st_min_fit" type="float"/>
+		<element name="st_min_fit2" type="float"/>
+		<element name="st_min_gnum" type="float"/>
+		<element name="st_min_instances" type="float"/>
+		<element name="st_min_lifespan" type="float"/>
+		<element name="st_min_num" type="float"/>
+		<element name="st_min_numconnections" type="float"/>
+		<element name="st_min_numjoints" type="float"/>
+		<element name="st_min_numneurons" type="float"/>
+		<element name="st_min_numparts" type="float"/>
+		<element name="st_min_pos_x" type="float"/>
+		<element name="st_min_pos_y" type="float"/>
+		<element name="st_min_pos_z" type="float"/>
+		<element name="st_min_size_x" type="float"/>
+		<element name="st_min_size_y" type="float"/>
+		<element name="st_min_size_z" type="float"/>
+		<element name="st_min_velocity" type="float"/>
+		<element name="st_min_vertpos" type="float"/>
+		<element name="st_min_vertvel" type="float"/>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="clrstats" function="true" type="void">
+			<description><![CDATA[]]></description>
+<arguments/></element>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+	</type>
+	<type name="String" context="Global context">
+<description><![CDATA[String functions library.]]></description>
+		<element name="char" function="true" type="string">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="code" function="true" type="integer">
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="format" function="true" type="string">
+			<description><![CDATA[Works like the standard C library "sprintf()" but only one %-argument is accepted.
+Format string: %[-][+][0][width[.precision]]type
+ -: left adjust (default is right adjust)
+ +: place a sign (+ or -) before a number
+ 0: the value should be zero padded
+ width: minimum field width
+ precision: minimum number of decimal digits
+ type: d=decimal integer, x/X=hexadecimal integer, f/g=floating point number, e="scientific" style floating point, t=time
+Examples:
+ String.format("|%07.2f|",Math.pi) -> ="|0003.14|"
+ String.format("|%04x|",255) -> ="|00ff|"
+ String.format("|%7s|","text") -> ="|   text|"
+ String.format("|%-7d|",12345) -> ="|12345  |"
+ String.format("%t",Math.time) -> ="Sun Apr 29 19:22:02 2007"
+ String.format("%T",Math.time) -> ="2007-05-29 19:22:02"
+]]></description>
+			<arguments>
+				<argument name="format" type="string"/>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="indexOf" function="true" type="integer">
+			<description><![CDATA[String.indexOf("abcdef","cd") -> 2
+String.indexOf("abcdef","dc") -> -1
+]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="substring" type="string"/>
+			</arguments>
+		</element>
+		<element name="indexOfStart" function="true" type="integer">
+			<description><![CDATA[String.indexOfStart("abcdef","cd",1) -> 2
+String.indexOfStart("abcdef","cd",3) -> -1
+]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="substring" type="string"/>
+				<argument name="start index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="left" function="true" type="string">
+			<description><![CDATA[String.left("abcdef",3) -> ="abc"]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="number of characters" type="integer"/>
+			</arguments>
+		</element>
+		<element name="len" function="true" type="integer">
+			<description><![CDATA[String.len("abcdef") -> 6]]></description>
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="parseFloat" function="true" type="float">
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="parseInt" function="true" type="integer">
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="replace" function="true" type="string">
+			<description><![CDATA[String.replace("abcdef","cd","X") -> "abXef"]]></description>
+			<arguments>
+				<argument name="search" type="string"/>
+				<argument name="substitute" type="string"/>
+			</arguments>
+		</element>
+		<element name="right" function="true" type="string">
+			<description><![CDATA[String.right("abcdef",3) -> ="def"]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="number of characters" type="integer"/>
+			</arguments>
+		</element>
+		<element name="split" function="true" type="Vector">
+			<description><![CDATA[return the vector of substrings, cut at separator positions.
+subsequent separators give empty words: split("word1---word2-word3","-") -> ["word1","","","word2","word3"]]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="word separator" type="string"/>
+			</arguments>
+		</element>
+		<element name="split2" function="true" type="Vector">
+			<description><![CDATA[return the vector of substrings, cut at separator positions.
+subsequent separators are treated as one: split2("word1---word2-word3","-") -> ["word1","word2","word3"]]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="word separator" type="string"/>
+			</arguments>
+		</element>
+		<element name="substr" function="true" type="string">
+			<description><![CDATA[String.substr("abcdef",3,2) -> ="de"]]></description>
+			<arguments>
+				<argument type="string"/>
+				<argument name="first character" type="integer"/>
+				<argument name="number of characters" type="integer"/>
+			</arguments>
+		</element>
+		<element name="toLower" function="true" type="string">
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+		<element name="toUpper" function="true" type="string">
+			<arguments>
+				<argument type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Symmetry" context="Global context">
+		<element name="symAlphaSteps" type="integer" min="2" max="50" default="20">
+			<description><![CDATA[Default number of samples per full angle (#1)]]></description>
+		</element>
+		<element name="symBetaSteps" type="integer" min="2" max="50" default="20">
+			<description><![CDATA[Default number of samples per full angle (#2)]]></description>
+		</element>
+		<element name="symPosSteps" type="integer" min="2" max="50" default="10">
+			<description><![CDATA[Default number of samples per stick length]]></description>
+		</element>
+		<element name="symResultA" type="float"/>
+		<element name="symResultB" type="float"/>
+		<element name="symResultC" type="float"/>
+		<element name="symResultD" type="float"/>
+		<element name="calculateSymmetry" function="true" type="float">
+			<description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using default precision parameters (symPosSteps,symAlphaSteps,symBetaSteps). Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+			<arguments>
+				<argument name="model" type="Model"/>
+			</arguments>
+		</element>
+		<element name="calculateSymmetry2" function="true" type="float">
+			<description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using specified precision parameters. Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+			<arguments>
+				<argument name="model" type="Model"/>
+				<argument name="posSteps" type="integer"/>
+				<argument name="alphaSteps" type="integer"/>
+				<argument name="betaSteps" type="integer"/>
+			</arguments>
+		</element>
+		<element name="calculateSymmetryForPlane" function="true" type="float">
+			<description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model and given a specific plane defined by coefficients A, B, C, D.]]></description>
+			<arguments>
+				<argument name="model" type="Model"/>
+				<argument name="A" type="float"/>
+				<argument name="B" type="float"/>
+				<argument name="C" type="float"/>
+				<argument name="D" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Vector" context="Global context">
+<description><![CDATA[Vector is 1-dimensional array, indexed by integer value (starting from 0). Multidimensional arrays can be simulated by putting other Vector objects into the Vector.
+Example:
+var v=Vector.new();
+v.add(123); v.add("string");]]></description>
+		<element name="avg" type="float"/>
+		<element name="size" type="integer"/>
+		<element name="stdev" type="float">
+			<description><![CDATA[=sqrt(sum((element[i]-avg)^2)/(size-1)) which is estimated population std.dev. from sample std.dev.]]></description>
+		</element>
+		<element name="toString" type="string"/>
+		<element name="add" function="true" type="void">
+			<arguments>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void"><arguments/></element>
+		<element name="find" function="true" type="integer">
+			<description><![CDATA[returns the element index or -1 if not found]]></description>
+			<arguments>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="get" function="true" type="untyped">
+			<arguments>
+				<argument name="position" type="integer"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="Vector"><arguments/></element>
+		<element name="remove" function="true" type="void">
+			<arguments>
+				<argument name="position" type="integer"/>
+			</arguments>
+		</element>
+		<element name="set" function="true" type="void">
+			<arguments>
+				<argument name="position" type="integer"/>
+				<argument name="value" type="untyped"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="World" context="Global context">
+<description><![CDATA[Environment properties.]]></description>
+		<element name="nnspeed" type="float" min="0" max="1000" default="1">
+			<description><![CDATA[Number of neural network simulation steps in each physics simulation step]]></description>
+		</element>
+		<element name="signals" type="WorldSignals"/>
+		<element name="simtype" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[MechaStick is a fast and simple primary Framsticks simulation engine.
+ODE is Open Dynamics Engine by Russel Smith et al.
+
+NOTE: switching between simulation engines causes removal of all objects in the world (e.g. creatures).]]></description>
+		</element>
+		<element name="wrldbnd" type="integer" min="0" max="2" default="1"/>
+		<element name="wrldg" type="float" min="0" max="10" default="1">
+			<description><![CDATA[You can adjust gravity for your experiments.
+The "official" setting used to evaluate and compare creatures is 1.]]></description>
+		</element>
+		<element name="wrldmap" type="string">
+			<description><![CDATA[Description of the world (Type: Blocks or Heighfield). Enter
+   r <sizex> <sizey> [seed]
+to generate a random landscape, or
+   m <sizex> <sizey> digits
+   M <sizex> <sizey> numbers
+to provide height values.
+
+See also the WorldMap object.]]></description>
+		</element>
+		<element name="wrldsiz" type="float" min="10" max="1000" default="20">
+			<description><![CDATA[Side length of the world]]></description>
+		</element>
+		<element name="wrldtyp" type="integer" min="0" max="2" default="0"/>
+		<element name="wrldwat" type="float" min="-20" max="30" default="-1"/>
+		<element name="wrldchg" function="true" type="void"><arguments/></element>
+	</type>
+	<type name="WorldMap" context="Global context">
+<description><![CDATA[Environment details for "Blocks" and "Heightfield" world type. The most important concept is a "Map", which is the array of Map elements. Internally, Maps have more elements than could be deduced from the user-supplied World.wrldsiz, as additional rows of element are added to provide smooth transitions to the flat surroundings.
+
+Blocks: x/ysize=World.wrldsiz+4 rows of blocks (from which only 2+World.wrldsiz rows are placed within the world boundaries)
+
+Smooth: x/ysize=World.wrldsiz+2 rows of vertices (creating World.wrldsiz+1 rows of triangles, everything within the world boundaries)
+]]></description>
+		<element name="xsize" type="integer"/>
+		<element name="ysize" type="integer"/>
+		<element name="getHeight" function="true" type="float">
+			<description><![CDATA[Height at any 2d coordinate]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+			</arguments>
+		</element>
+		<element name="getMap" function="true" type="Object">
+			<description><![CDATA[retrieve map cell object]]></description>
+			<arguments>
+				<argument name="x" type="integer"/>
+				<argument name="y" type="integer"/>
+			</arguments>
+		</element>
+		<element name="intersect" function="true" type="Vector">
+			<description><![CDATA[Calculate the intersection point between the world surface and the ray projected from "3d point" towards the given direction. 3D points are actually 3-elements Vector objects. The resulting vector contains the additional fourth element - the intersection point distance. The function returns null if there is no intersection.
+
+See "standard_events.inc" file, which uses "intersect" for calculating the world coordinates corresponding to the user-clicked screen location.
+Bugs: This function does not currently handle the heightfield environment correctly (works as if it was flat)]]></description>
+			<arguments>
+				<argument name="3d point" type="Vector"/>
+				<argument name="3d direction" type="Vector"/>
+				<argument name="range" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="WorldSignals" context="Global context">
+<description><![CDATA[Use this object to create stationary signals, not associated with any moving object and receive signals from any location in the world. There are Creature and Neuro-based variants of this object that automatically operate from the creature's or neuron's position.
+
+See also: Signal]]></description>
+		<element name="size" type="integer">
+			<description><![CDATA[Number of signals in this set.]]></description>
+		</element>
+		<element name="add" function="true" type="Signal">
+			<description><![CDATA[Create a new signal]]></description>
+			<arguments>
+				<argument name="position" type="XYZ"/>
+				<argument name="channel" type="string"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void">
+			<description><![CDATA[Delete all signals]]></description>
+<arguments/></element>
+		<element name="get" function="true" type="Signal">
+			<description><![CDATA[Access individual signals (index=0 .. size-1)]]></description>
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="receive" function="true" type="float">
+			<description><![CDATA[Receive the aggregated signal power in a given channel.]]></description>
+			<arguments>
+				<argument name="position" type="XYZ"/>
+				<argument name="channel" type="string"/>
+			</arguments>
+		</element>
+		<element name="receiveFilter" function="true" type="float">
+			<description><![CDATA[Receive the aggregated signal power in a given channel.
+
+Additional filtering options:
+- Max distance only receives the neighbor signals (based on their physical location)
+- Flavor filtering: only signals having the flavor close to the specified one will be received. The filter value is the maximum allowed difference.]]></description>
+			<arguments>
+				<argument name="position" type="XYZ"/>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+				<argument name="flavor" type="float"/>
+				<argument name="filter" type="float"/>
+			</arguments>
+		</element>
+		<element name="receiveSet" function="true" type="Vector">
+			<description><![CDATA[Get all signals in the specified range. Returns a readonly vector object containing Signal objects (individual signals can be accessed as result[0] throught result[result.size-1]).]]></description>
+			<arguments>
+				<argument name="position" type="XYZ"/>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+		<element name="receiveSingle" function="true" type="Signal">
+			<description><![CDATA[Find the signal source having the highest signal power (including the distance)]]></description>
+			<arguments>
+				<argument name="position" type="XYZ"/>
+				<argument name="channel" type="string"/>
+				<argument name="max distance" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="XYZ" context="Global context">
+<description><![CDATA[3D vector]]></description>
+		<element name="length" type="float"/>
+		<element name="toString" type="string"/>
+		<element name="x" type="float"/>
+		<element name="y" type="float"/>
+		<element name="z" type="float"/>
+		<element name="add" function="true" type="void">
+			<description><![CDATA[Note: it does not return a new object, just modifies the existing one]]></description>
+			<arguments>
+				<argument type="XYZ"/>
+			</arguments>
+		</element>
+		<element name="clone" function="true" type="XYZ">
+			<description><![CDATA[Note: copying object references does not create new objects. Use clone() if a new object is needed.
+
+Example:
+var o1=(1,2,3), o2=o1, o3=o1.clone();
+o1.y=9999;
+//o2 is now (1,9999,3) but o3 is still (1,2,3)]]></description>
+<arguments/></element>
+		<element name="get" function="true" type="float">
+			<description><![CDATA[this function makes the XYZ objects "indexable" (so you can use [] for accessing subsequent fields, like in Vector)]]></description>
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="new" function="true" type="XYZ">
+			<description><![CDATA[3D vectors objects can be also created using the (x,y,z) notation, i.e. var v=(1,2,3) is the same as var v=XYZ.new(1,2,3);]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="normalize" function="true" type="void">
+			<description><![CDATA[scales the vector length to 1.0]]></description>
+<arguments/></element>
+		<element name="revRotate" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+			</arguments>
+		</element>
+		<element name="rotate" function="true" type="void">
+			<arguments>
+				<argument type="Orient"/>
+			</arguments>
+		</element>
+		<element name="scale" function="true" type="void">
+			<arguments>
+				<argument type="float"/>
+			</arguments>
+		</element>
+		<element name="set" function="true" type="void">
+			<arguments>
+				<argument type="XYZ"/>
+			</arguments>
+		</element>
+		<element name="set3" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="sub" function="true" type="void">
+			<description><![CDATA[Note: it does not return a new object, just modifies the existing one]]></description>
+			<arguments>
+				<argument type="XYZ"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="ExpParams" context="Experiment definition">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+	</type>
+	<type name="ExpState" context="Experiment definition">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+	</type>
+	<type name="n" context="Neuron definitions">
+		<element name="d" type="string"/>
+		<element name="getInputCount" type="integer"/>
+		<element name="i" type="string"/>
+		<element name="j" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="p" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="Vstyle" type="string"/>
+		<element name="getInputNeuroDef" function="true" type="NeuroDef">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputNeuroIndex" function="true" type="integer">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputWeight" function="true" type="float">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Neuro" context="Neuron definitions">
+<description><![CDATA[Live Neuron object.]]></description>
+		<element name="channelCount" type="integer"/>
+		<element name="creature" type="Creature"/>
+		<element name="currState" type="float">
+			<description><![CDATA[the only difference from the "state" field is that currState, when written, changes the internal neuron state immediately (which disturbs the regular synchronous NN operation). This feature should only be used while controlling the neuron 'from outside' (like a neuro probe) and not in the neuron definition.]]></description>
+		</element>
+		<element name="def" type="NeuroDef"/>
+		<element name="fields" type="Fields">
+			<description><![CDATA[Neurons can have different fields depending on their class. Script neurons have their fields defined using the "prop:" syntax. If you develop a custom neuron script you should use the Fields object for accessing your own neuron fields. The Neuro.fields property is meant for accessing the neuron fields from the outside script.
+Examples:
+var c=Populations.createFromString("X[N]");
+Simulator.print("standard neuron inertia="+c.getNeuro(0).fields.in);
+c=Populations.createFromString("X[Nn,e:0.1]");
+Simulator.print("noisy neuron error rate="+c.getNeuro(0).fields.e);
+
+The Interface object can be used to discover which fields are available for a certain neuron object:
+c=Populations.createFromString("X[N]");
+var iobj=Interface.makeFrom(c.getNeuro(0).fields);
+var i;
+for(i=0;i<iobj.properties;i++)
+ Simulator.print(iobj.getId(i)+" ("+iobj.getName(i)+")");]]></description>
+		</element>
+		<element name="getInputCount" type="integer"/>
+		<element name="hold" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="inputSum" type="float"/>
+		<element name="joint" type="MechJoint"/>
+		<element name="part" type="MechPart"/>
+		<element name="position_x" type="float"/>
+		<element name="position_y" type="float"/>
+		<element name="position_z" type="float"/>
+		<element name="signals" type="NeuroSignals"/>
+		<element name="state" type="float">
+			<description><![CDATA[when read, returns the current neuron state.
+When written, sets the next neuron state (for use in the neuron definition)]]></description>
+		</element>
+		<element name="weightedInputSum" type="float"/>
+		<element name="getInputChannelCount" function="true" type="integer">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputState" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputStateChannel" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+				<argument name="channel" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputSum" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputWeight" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getStateChannel" function="true" type="float">
+			<arguments>
+				<argument name="channel" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getWeightedInputState" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getWeightedInputStateChannel" function="true" type="float">
+			<arguments>
+				<argument name="input" type="integer"/>
+				<argument name="channel" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getWeightedInputSum" function="true" type="float">
+			<description><![CDATA[uses any number of inputs starting with the specified input. getWeightedInputSum(0)=weightedInputSum]]></description>
+			<arguments>
+				<argument name="input" type="integer"/>
+			</arguments>
+		</element>
+		<element name="setCurrStateChannel" function="true" type="void">
+			<description><![CDATA[like "currState"]]></description>
+			<arguments>
+				<argument name="channel" type="integer"/>
+				<argument name="value" type="float"/>
+			</arguments>
+		</element>
+		<element name="setStateChannel" function="true" type="void">
+			<arguments>
+				<argument name="channel" type="integer"/>
+				<argument name="value" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="this" context="Fitness formula">
+<description><![CDATA[A Genotype with the associated performance information. All but one Genotype objects are placed in Genotype Groups. There is also a single static Genotype object not associated with a group, which is used as a temporary storage by genetic operators and some functions from GenePools.]]></description>
+		<element name="convtrace1" type="string"/>
+		<element name="distance" type="float"/>
+		<element name="energ0" type="float"/>
+		<element name="f0genotype" type="string">
+			<description><![CDATA[converted to f0 genotype]]></description>
+		</element>
+		<element name="fit" type="float"/>
+		<element name="fit2" type="float">
+			<description><![CDATA[Fitnes shifted by (avg-n*stddev)]]></description>
+		</element>
+		<element name="geno" type="Geno">
+			<description><![CDATA[Geno object for this Genotype]]></description>
+		</element>
+		<element name="genotype" type="string"/>
+		<element name="gnum" type="integer"/>
+		<element name="info" type="string">
+			<description><![CDATA[Additional information or comments]]></description>
+		</element>
+		<element name="instances" type="integer"/>
+		<element name="isValid" type="integer" min="0" max="1"/>
+		<element name="lifespan" type="float">
+			<description><![CDATA[Average life span]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="nncon" type="float">
+			<description><![CDATA[(deprecated) old name for numconnections]]></description>
+		</element>
+		<element name="nnsiz" type="float">
+			<description><![CDATA[(deprecated) old name for numneurons]]></description>
+		</element>
+		<element name="num" type="integer"/>
+		<element name="numconnections" type="float"/>
+		<element name="numjoints" type="float"/>
+		<element name="numneurons" type="float"/>
+		<element name="numparts" type="float"/>
+		<element name="popsiz" type="integer">
+			<description><![CDATA[(deprecated) old name for instances]]></description>
+		</element>
+		<element name="simi" type="float"/>
+		<element name="strjoints" type="float">
+			<description><![CDATA[(deprecated) old name for numjoints]]></description>
+		</element>
+		<element name="strsiz" type="float">
+			<description><![CDATA[(deprecated) old name for numparts]]></description>
+		</element>
+		<element name="uid" type="string">
+			<description><![CDATA[Unique identifier]]></description>
+		</element>
+		<element name="user1" type="untyped"/>
+		<element name="user2" type="untyped"/>
+		<element name="user3" type="untyped"/>
+		<element name="velocity" type="float">
+			<description><![CDATA[Average velocity]]></description>
+		</element>
+		<element name="vertpos" type="float"/>
+		<element name="vertvel" type="float"/>
+		<element name="getModel" function="true" type="Model"><arguments/></element>
+		<element name="getNormalized" function="true" type="float">
+			<arguments>
+				<argument name="property name or index" type="untyped"/>
+			</arguments>
+		</element>
+		<element name="mutate" function="true" type="void"><arguments/></element>
+	</type>
+	<type name="Creature" context="Visual style definition">
+<description><![CDATA[The object inside the simulated world, including its physical structure, neural network and performance data. Food pieces, obstacles and other movable objects can be implemented as Creatures even though the are not "alive". See also: Population.]]></description>
+		<element name="bodysim" type="integer" min="0" max="1" default="1">
+			<description><![CDATA[(Physical) body simulation can be disabled for individual objects which makes them immovable. Disabled objects can still participate in collisions depending on their collisions masks.
+
+Bugs: the standard collision handler does not work for disabled objects when ODE simulation is used. It means that these objects won't physically interact with other objects. The custom (scripting) handlers work as expected.]]></description>
+		</element>
+		<element name="buildproblems" type="integer"/>
+		<element name="c_velocity" type="float"/>
+		<element name="c_vertpos" type="float"/>
+		<element name="c_vertvelocity" type="float"/>
+		<element name="center_x" type="float">
+			<description><![CDATA[Center of gravity]]></description>
+		</element>
+		<element name="center_y" type="float">
+			<description><![CDATA[Center of gravity]]></description>
+		</element>
+		<element name="center_z" type="float">
+			<description><![CDATA[Center of gravity]]></description>
+		</element>
+		<element name="distance" type="float"/>
+		<element name="drive" type="XYZ">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="energ0" type="float"/>
+		<element name="energy" type="float"/>
+		<element name="energy_b" type="float"/>
+		<element name="energy_m" type="float"/>
+		<element name="energy_p" type="float"/>
+		<element name="geno" type="Geno">
+			<description><![CDATA[Source genotype for this creature]]></description>
+		</element>
+		<element name="genotype" type="string"/>
+		<element name="gnum" type="integer"/>
+		<element name="group" type="untyped"/>
+		<element name="idleen" type="float"/>
+		<element name="index" type="integer">
+			<description><![CDATA[Index of this Creature in its Population.]]></description>
+		</element>
+		<element name="info" type="string">
+			<description><![CDATA[Additional info or comments]]></description>
+		</element>
+		<element name="lifespan" type="integer"/>
+		<element name="liveModel" type="Model">
+			<description><![CDATA[A Model object that is a copy of the current (temporary) geometry of this creature]]></description>
+		</element>
+		<element name="localDrive" type="XYZ">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="model" type="Model">
+			<description><![CDATA[Source Model for this creature]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="nnenabled" type="integer" min="0" max="1"/>
+		<element name="numjoints" type="integer"/>
+		<element name="numneurons" type="integer"/>
+		<element name="numparts" type="integer"/>
+		<element name="orient" type="Orient">
+			<description><![CDATA[by convention the creature orientation is equal to its first part orientation]]></description>
+		</element>
+		<element name="othermask" type="integer" min="0" max="2147483647" default="0"/>
+		<element name="perf" type="integer" min="0" max="2">
+			<description><![CDATA[Initial value of this property is taken from Population.enableperf]]></description>
+		</element>
+		<element name="pos_x" type="float">
+			<description><![CDATA[(pos_x,pos_y,pos_z) is the point of minimal coordinates ("bottom left corner") of the creature, including imaginary Part sizes (Part.s, usually 1.0). See also: Creature.moveAbs]]></description>
+		</element>
+		<element name="pos_y" type="float">
+			<description><![CDATA[See Creature.pos_x]]></description>
+		</element>
+		<element name="pos_z" type="float">
+			<description><![CDATA[See Creature.pos_x]]></description>
+		</element>
+		<element name="selfcol" type="integer" min="0" max="1">
+			<description><![CDATA[Enable/disable detection of self-collisions (within a creature body). They can only occur when using the ODE simulation engine. If enabled, the creature will have its sticks collide during lifespan.]]></description>
+		</element>
+		<element name="selfcolstate" type="integer" min="0" max="1">
+			<description><![CDATA[Current self-collision state]]></description>
+		</element>
+		<element name="selfmask" type="integer" min="0" max="2147483647" default="0"/>
+		<element name="signals" type="CreatureSignals"/>
+		<element name="size_x" type="float">
+			<description><![CDATA[(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including the imaginary part sizes (Part.s, usually 1.0). A creature consisting of a single default part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).
+See also: Creature.moveAbs]]></description>
+		</element>
+		<element name="size_y" type="float">
+			<description><![CDATA[See Creature.size_x]]></description>
+		</element>
+		<element name="size_z" type="float">
+			<description><![CDATA[See Creature.size_x]]></description>
+		</element>
+		<element name="uid" type="string"/>
+		<element name="user1" type="untyped"/>
+		<element name="user2" type="untyped"/>
+		<element name="user3" type="untyped"/>
+		<element name="velocity" type="float"/>
+		<element name="vertpos" type="float"/>
+		<element name="vertvel" type="float"/>
+		<element name="currentGeometryAsF0" function="true" type="string"><arguments/></element>
+		<element name="getJoint" function="true" type="Joint">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getMechJoint" function="true" type="MechJoint">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getMechPart" function="true" type="MechPart">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getNeuro" function="true" type="Neuro">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getNeuroDef" function="true" type="NeuroDef">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getPart" function="true" type="Part">
+			<arguments>
+				<argument name="index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="localToWorld" function="true" type="XYZ">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="move" function="true" type="void">
+			<description><![CDATA[Shift the creature by a given vector.]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="moveAbs" function="true" type="void">
+			<description><![CDATA[Moves the creature so that its origin (pos_x,pos_y,pos_z) is placed at the given location. The origin is the point of minimal coordinates ("bottom left corner"), including imaginary part sizes (Part.s, usually 1.0).
+Assuming a simple single-stick creature "X" having parts at (0,0,0) and (1,0,0),
+
+origin (pos_x,pos_y,pos_z) = (-1,-1,-1)
+size (size_x,size_y,size_z) = (2,1,1)
+
+The following example places the bottom of a creature at a given location (x,y,z):
+Creature.moveAbs(x-(Creature.size_x/2),y-(Creature.size_y/2),z-1.0)
+(assuming that the part size is 1.0)]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="moveLocal" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="rotate" function="true" type="void">
+			<description><![CDATA[Rotate the creature around X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise the further simulation could be disturbed.]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="rotateLocal" function="true" type="void">
+			<description><![CDATA[Rotate the creature around (local) X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise the further simulation could be disturbed.]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="worldToLocal" function="true" type="XYZ">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Element" context="Visual style definition">
+<description><![CDATA[Information about current visual element: Part, Joint or Neuro. To be used in _build() or _update() functions.
+
+This is a link between a creature's element (part/joint/neuron) and the geometry object (Element.node).
+Calling Element.useXXX() functions connects the static object references (Creature, Model, Part, Joint, Neuro, MechPart, MechJoint) to the proper creature elements. All these objects are invalid before doing that! E.g. you have to call "Element.useCreature()" before referring to "Creature.energy" in your _build() and _update() functions.]]></description>
+		<element name="node" type="integer"/>
+		<element name="useCreature" function="true"/>
+		<element name="useJoint" function="true"/>
+		<element name="useJointPart1" function="true"/>
+		<element name="useJointPart2" function="true"/>
+		<element name="useMechJoint" function="true"/>
+		<element name="useMechJointPart1" function="true"/>
+		<element name="useMechJointPart2" function="true"/>
+		<element name="useMechPart" function="true"/>
+		<element name="useModel" function="true"/>
+		<element name="useNeuro" function="true"/>
+		<element name="useNeuroJoint" function="true"/>
+		<element name="useNeuroPart" function="true"/>
+		<element name="usePart" function="true"/>
+	</type>
+	<type name="GeomBuilder" context="Visual style definition">
+<description><![CDATA[Scene graph access (build and manipulate the 3d object tree)]]></description>
+		<element name="code" type="string"/>
+		<element name="currentNode" type="integer"/>
+		<element name="defaultStyle" type="string"/>
+		<element name="matrix00" type="float"/>
+		<element name="matrix01" type="float"/>
+		<element name="matrix02" type="float"/>
+		<element name="matrix03" type="float"/>
+		<element name="matrix10" type="float"/>
+		<element name="matrix11" type="float"/>
+		<element name="matrix12" type="float"/>
+		<element name="matrix13" type="float"/>
+		<element name="matrix20" type="float"/>
+		<element name="matrix21" type="float"/>
+		<element name="matrix22" type="float"/>
+		<element name="matrix23" type="float"/>
+		<element name="matrix30" type="float"/>
+		<element name="matrix31" type="float"/>
+		<element name="matrix32" type="float"/>
+		<element name="matrix33" type="float"/>
+		<element name="rootNode" type="integer"/>
+		<element name="updatingNode" type="integer"/>
+		<element name="add" function="true" type="void">
+			<description><![CDATA[add a child node to the current node]]></description>
+			<arguments>
+				<argument name="node" type="integer"/>
+			</arguments>
+		</element>
+		<element name="addBranch" function="true">
+			<description><![CDATA[create the branch node as a child of the current node and make it the new current node]]></description>
+		</element>
+		<element name="addTransform" function="true">
+			<description><![CDATA[create the transform node as a child of the current node and make it the new current node.]]></description>
+		</element>
+		<element name="dump" function="true" type="void">
+			<arguments>
+				<argument name="node" type="integer"/>
+				<argument name="level" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getBranch" function="true" type="integer">
+			<arguments>
+				<argument name="branch node" type="integer"/>
+				<argument name="branch index" type="integer"/>
+			</arguments>
+		</element>
+		<element name="matrixMove" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="matrixMove1" function="true" type="void">
+			<description><![CDATA[MechPart.pos can be used here]]></description>
+			<arguments>
+				<argument name="xyz" type="integer"/>
+			</arguments>
+		</element>
+		<element name="matrixOrient" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="matrixOrient1" function="true" type="void">
+			<description><![CDATA[MechPart.orient can be used here]]></description>
+			<arguments>
+				<argument name="xyz" type="integer"/>
+			</arguments>
+		</element>
+		<element name="matrixReset" function="true"/>
+		<element name="matrixRotate" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="matrixRotate1" function="true" type="void">
+			<arguments>
+				<argument name="xyz" type="integer"/>
+			</arguments>
+		</element>
+		<element name="matrixScale" function="true" type="void">
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+				<argument name="z" type="float"/>
+			</arguments>
+		</element>
+		<element name="setMatrix" function="true" type="void">
+			<description><![CDATA[copy current matrix into specified node]]></description>
+			<arguments>
+				<argument name="transform node" type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="GL" context="Visual style definition">
+<description><![CDATA[OpenGL constants used in GeomBuilder and Material functions.]]></description>
+		<element name="ALPHA_TEST" type="integer"/>
+		<element name="AMBIENT" type="integer"/>
+		<element name="AMBIENT_AND_DIFFUSE" type="integer"/>
+		<element name="BLEND" type="integer"/>
+		<element name="COLOR_MATERIAL" type="integer"/>
+		<element name="CULL_FACE" type="integer"/>
+		<element name="DIFFUSE" type="integer"/>
+		<element name="EMISSION" type="integer"/>
+		<element name="LIGHTING" type="integer"/>
+		<element name="LINE_LOOP" type="integer"/>
+		<element name="LINE_STRIP" type="integer"/>
+		<element name="LINES" type="integer"/>
+		<element name="POINTS" type="integer"/>
+		<element name="QUAD_STRIP" type="integer"/>
+		<element name="QUADS" type="integer"/>
+		<element name="SPECULAR" type="integer"/>
+		<element name="TEXTURE_2D" type="integer"/>
+		<element name="TRIANGLE_FAN" type="integer"/>
+		<element name="TRIANGLE_STRIP" type="integer"/>
+		<element name="TRIANGLES" type="integer"/>
+	</type>
+	<type name="j" context="Visual style definition">
+		<element name="dx" type="float" min="-2" max="2" default="0"/>
+		<element name="dy" type="float" min="-2" max="2" default="0"/>
+		<element name="dz" type="float" min="-2" max="2" default="0"/>
+		<element name="i" type="string"/>
+		<element name="p1" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="p2" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="rotstif" type="float" min="0" max="1" default="1"/>
+		<element name="rx" type="float"/>
+		<element name="ry" type="float"/>
+		<element name="rz" type="float"/>
+		<element name="stam" type="float" min="0" max="1" default="0.25"/>
+		<element name="stif" type="float" min="0" max="1" default="1"/>
+		<element name="Vstyle" type="string"/>
+	</type>
+	<type name="Loader" context="Visual style definition">
+<description><![CDATA[Loads 3d objects files.
+Visual styles placed in subdirectories (like "matrix") automatically access the parent directory if the file is not found in their subdirectory.]]></description>
+		<element name="loaded" type="integer"/>
+		<element name="load" function="true"/>
+	</type>
+	<type name="m" context="Visual style definition">
+		<element name="se" type="float"/>
+		<element name="Vstyle" type="string"/>
+	</type>
+	<type name="Material" context="Visual style definition">
+<description><![CDATA[Manipulate 3d objects surface properties (Material objects can be associated with geometry nodes).]]></description>
+		<element name="ambient" type="integer"/>
+		<element name="colormat" type="integer"/>
+		<element name="diffuse" type="integer"/>
+		<element name="emission" type="integer"/>
+		<element name="object" type="Object"/>
+		<element name="shininess" type="float"/>
+		<element name="specular" type="integer"/>
+		<element name="texture" type="string"/>
+		<element name="translucent" type="integer"/>
+		<element name="care" function="true"/>
+		<element name="disable" function="true"/>
+		<element name="dontcare" function="true"/>
+		<element name="enable" function="true"/>
+		<element name="new" function="true"/>
+		<element name="setFlat" function="true"/>
+		<element name="setSmooth" function="true"/>
+	</type>
+	<type name="MechJoint" context="Visual style definition">
+<description><![CDATA[Current joint properties during the simulation]]></description>
+		<element name="absorient" type="integer"/>
+		<element name="calcorient" type="integer"/>
+		<element name="dx" type="float"/>
+		<element name="dy" type="float"/>
+		<element name="dz" type="float"/>
+		<element name="length" type="float"/>
+		<element name="orient" type="integer"/>
+		<element name="rotstif" type="float"/>
+		<element name="rotstress" type="float"/>
+		<element name="rx" type="float"/>
+		<element name="ry" type="float"/>
+		<element name="rz" type="float"/>
+		<element name="stif" type="float"/>
+		<element name="stress" type="float"/>
+	</type>
+	<type name="MechPart" context="Visual style definition">
+<description><![CDATA[Current part properties during the simulation]]></description>
+		<element name="fr" type="float"/>
+		<element name="m" type="float"/>
+		<element name="orient" type="integer"/>
+		<element name="pos" type="integer"/>
+		<element name="s" type="float"/>
+		<element name="vol" type="float"/>
+		<element name="x" type="float"/>
+		<element name="y" type="float"/>
+		<element name="z" type="float"/>
+	</type>
+	<type name="n" context="Visual style definition">
+		<element name="class" type="string"/>
+		<element name="d" type="string"/>
+		<element name="getInputCount" type="integer"/>
+		<element name="i" type="string"/>
+		<element name="j" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="p" type="integer" min="-1" max="999999" default="-1"/>
+		<element name="state" type="float"/>
+		<element name="Vstyle" type="string"/>
+		<element name="getInputNeuroDef" function="true" type="NeuroDef">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputNeuroIndex" function="true" type="integer">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+		<element name="getInputWeight" function="true" type="float">
+			<arguments>
+				<argument type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="p" context="Visual style definition">
+		<element name="as" type="float" min="0" max="1" default="0.25"/>
+		<element name="dn" type="float" min="0.2" max="5" default="1"/>
+		<element name="fr" type="float" min="0" max="4" default="0.4"/>
+		<element name="i" type="string"/>
+		<element name="ing" type="float" min="0" max="1" default="0.25"/>
+		<element name="m" type="float" min="0.1" max="999" default="1"/>
+		<element name="rx" type="float"/>
+		<element name="ry" type="float"/>
+		<element name="rz" type="float"/>
+		<element name="s" type="float" min="0.1" max="10" default="1"/>
+		<element name="Vstyle" type="string"/>
+		<element name="x" type="float"/>
+		<element name="y" type="float"/>
+		<element name="z" type="float"/>
+	</type>
+	<type name="Scene" context="Visual style definition">
+<description><![CDATA[Additional properties to be used in the current view, currently only the background settings]]></description>
+		<element name="backcolor" type="integer"/>
+		<element name="worldtexture" type="string"/>
+	</type>
+	<type name="VertexBuilder" context="Visual style definition">
+		<element name="material" type="Object"/>
+		<element name="node" type="integer">
+			<description><![CDATA[This field returns the geometry node for use in GeomBuilder. You have to set all relevant geometry properties before using this field. The usual sequence:
+1. newXXX - selects the geometry type (see your OpenGL manual for explanation)
+2. Set all properties (add vertices, normals, colors, texture coordinates, material). All unspecified properties are assumed to have default values.
+3. Use the resulting node ( GeomBuilder.add(VertexBuilder.node) )]]></description>
+		</element>
+		<element name="twosided" type="integer" min="0" max="1"/>
+		<element name="addCalculatedNormal" function="true">
+			<description><![CDATA[calculate the normal vector from 3 coordinates. integer arguments are the vertices' indices. 0,1,2... = first, second, third vertex, -1,-2,-3,... = last, last-1, last-2 vertex]]></description>
+		</element>
+		<element name="addColor" function="true"/>
+		<element name="addNormal" function="true"/>
+		<element name="addNormal_1" function="true">
+			<description><![CDATA[use addNormal instead of this function]]></description>
+		</element>
+		<element name="addTexCoord" function="true"/>
+		<element name="addVertex" function="true"/>
+		<element name="genTexCoords" function="true"/>
+		<element name="genTexCoordsXY" function="true"/>
+		<element name="genTexCoordsXZ" function="true"/>
+		<element name="genTexCoordsYZ" function="true"/>
+		<element name="new" function="true" type="void">
+			<arguments>
+				<argument name="type" type="integer"/>
+			</arguments>
+		</element>
+		<element name="newLineLoop" function="true"/>
+		<element name="newLines" function="true"/>
+		<element name="newLineStrip" function="true"/>
+		<element name="newPoints" function="true"/>
+		<element name="newPolygon" function="true"/>
+		<element name="newQuads" function="true"/>
+		<element name="newQuadStrip" function="true"/>
+		<element name="newTriangleFan" function="true"/>
+		<element name="newTriangles" function="true"/>
+		<element name="newTriangleStrip" function="true"/>
+	</type>
+	<type name="VisParams" context="Visual style definition">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="modelpan" type="integer" min="0" max="3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="shownames" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="worldpan" type="integer" min="0" max="3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+	</type>
+	<type name="VisualModel" context="Visual style definition">
+<description><![CDATA[Visual representation of the Creature object.]]></description>
+		<element name="args" type="string">
+			<description><![CDATA[style parameters: Vstyle=name(args)]]></description>
+		</element>
+		<element name="color" type="integer">
+			<description><![CDATA[0xBBGGRR, 0x808080=normal, 0x000000=black, 0xffffff=extra bright]]></description>
+		</element>
+		<element name="jointshadow" type="float"/>
+		<element name="partshadow" type="float"/>
+		<element name="rootNode" type="integer"/>
+		<element name="style" type="string">
+			<description><![CDATA[visual style applied to this object]]></description>
+		</element>
+		<element name="getArg" function="true" type="string">
+			<description><![CDATA[retrieve single style argument, as in:
+Vstyle=name(a=1,b=3)
+VisualModel.getArg("a") returns 1]]></description>
+			<arguments>
+				<argument name="name" type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="VisualStyle" context="Visual style definition">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="code" type="string"/>
+		<element name="info" type="string"/>
+		<element name="modelpan" type="integer" min="0" max="3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="neurons" type="integer" min="0" max="1"/>
+		<element name="shownames" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="smooth" type="integer" min="0" max="1"/>
+		<element name="style" type="string"/>
+		<element name="tex" type="integer" min="0" max="2"/>
+		<element name="worldpan" type="integer" min="0" max="3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="rebuild" function="true"/>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+		<element name="streload" function="true"/>
+	</type>
+	<type name="World" context="Visual style definition">
+<description><![CDATA[Environment properties.]]></description>
+		<element name="nnspeed" type="float" min="0" max="1000" default="1">
+			<description><![CDATA[Number of neural network simulation steps in each physics simulation step]]></description>
+		</element>
+		<element name="signals" type="WorldSignals"/>
+		<element name="simtype" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[MechaStick is a fast and simple primary Framsticks simulation engine.
+ODE is Open Dynamics Engine by Russel Smith et al.
+
+NOTE: switching between simulation engines causes removal of all objects in the world (e.g. creatures).]]></description>
+		</element>
+		<element name="wrldbnd" type="integer" min="0" max="2" default="1"/>
+		<element name="wrldg" type="float" min="0" max="10" default="1">
+			<description><![CDATA[You can adjust gravity for your experiments.
+The "official" setting used to evaluate and compare creatures is 1.]]></description>
+		</element>
+		<element name="wrldmap" type="string">
+			<description><![CDATA[Description of the world (Type: Blocks or Heighfield). Enter
+   r <sizex> <sizey> [seed]
+to generate a random landscape, or
+   m <sizex> <sizey> digits
+   M <sizex> <sizey> numbers
+to provide height values.
+
+See also the WorldMap object.]]></description>
+		</element>
+		<element name="wrldsiz" type="float" min="10" max="1000" default="20">
+			<description><![CDATA[Side length of the world]]></description>
+		</element>
+		<element name="wrldtyp" type="integer" min="0" max="2" default="0"/>
+		<element name="wrldwat" type="float" min="-20" max="30" default="-1"/>
+		<element name="wrldchg" function="true" type="void"><arguments/></element>
+	</type>
+	<type name="WorldMap" context="Visual style definition">
+<description><![CDATA[Environment details for "Blocks" and "Heightfield" world type. The most important concept is a "Map", which is the array of Map elements. Internally, Maps have more elements than could be deduced from the user-supplied World.wrldsiz, as additional rows of element are added to provide smooth transitions to the flat surroundings.
+
+Blocks: x/ysize=World.wrldsiz+4 rows of blocks (from which only 2+World.wrldsiz rows are placed within the world boundaries)
+
+Smooth: x/ysize=World.wrldsiz+2 rows of vertices (creating World.wrldsiz+1 rows of triangles, everything within the world boundaries)
+]]></description>
+		<element name="xsize" type="integer"/>
+		<element name="ysize" type="integer"/>
+		<element name="getHeight" function="true" type="float">
+			<description><![CDATA[Height at any 2d coordinate]]></description>
+			<arguments>
+				<argument name="x" type="float"/>
+				<argument name="y" type="float"/>
+			</arguments>
+		</element>
+		<element name="getMap" function="true" type="Object">
+			<description><![CDATA[retrieve map cell object]]></description>
+			<arguments>
+				<argument name="x" type="integer"/>
+				<argument name="y" type="integer"/>
+			</arguments>
+		</element>
+		<element name="intersect" function="true" type="Vector">
+			<description><![CDATA[Calculate the intersection point between the world surface and the ray projected from "3d point" towards the given direction. 3D points are actually 3-elements Vector objects. The resulting vector contains the additional fourth element - the intersection point distance. The function returns null if there is no intersection.
+
+See "standard_events.inc" file, which uses "intersect" for calculating the world coordinates corresponding to the user-clicked screen location.
+Bugs: This function does not currently handle the heightfield environment correctly (works as if it was flat)]]></description>
+			<arguments>
+				<argument name="3d point" type="Vector"/>
+				<argument name="3d direction" type="Vector"/>
+				<argument name="range" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="Signal" context="Signal label formula">
+<description><![CDATA[Signals broadcast information in a channel (being an abstract communication medium that could be imagined as sound, smell, vision or anything else). There are no sender-receiver associations, although the receiving party can filter out signals (two standard filtering methods are: physical neighborhood and one-dimensional attribute called flavor). Signals attached to neurons and creatures (created in Creature.signals and Neuro.signals) automatically follow the owner's location. Environmental signals (in World.signals) are stationary.
+
+Receiving: 
+There are 2 kinds of data you can receive:
+1. aggregating functions (receive and receiveFilter) calculate the overall power of the received signal (based on the distance and the source power).
+2.receiveSet and receiveSingle fetch the individual Signal object(s) so it is possible to transmit something else than just a single number (by using Signal.value) and do more sophisticated processing.
+
+Creating: Use "add" in Creature.signals, Neuro.signals, or World.signals.]]></description>
+		<element name="channel" type="string">
+			<description><![CDATA[Channel name, readonly.]]></description>
+		</element>
+		<element name="flavor" type="float">
+			<description><![CDATA[Signal flavor is can be used to differentiate between signals in a single channel. ]]></description>
+		</element>
+		<element name="pos" type="XYZ">
+			<description><![CDATA[Signal position, readonly.]]></description>
+		</element>
+		<element name="power" type="float">
+			<description><![CDATA[Signal power affects the aggregated signal value returned from receive() and receiveFilter().]]></description>
+		</element>
+		<element name="value" type="untyped">
+			<description><![CDATA[Signal value can be any type. On the receiver side it is only available by accessing the individual Signal objects, i.e. after calling receiveSet() or receiveSingle(). The aggregating function receive() and receiveFilter() ignore this attribute.]]></description>
+		</element>
+		<element name="remove" function="true">
+			<description><![CDATA[Deletes the signal]]></description>
+		</element>
+	</type>
+	<type name="ClassBrowser" context="Command line interface">
+<description><![CDATA[Object reference, can be used to provide online hints.]]></description>
+		<element name="resultCount" type="integer"/>
+		<element name="getLabel" function="true" type="string">
+			<description><![CDATA[Short texual label of the search result.]]></description>
+			<arguments>
+				<argument name="item" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getText" function="true" type="string">
+			<description><![CDATA[Complete result text.]]></description>
+			<arguments>
+				<argument name="item" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getType" function="true" type="integer">
+			<description><![CDATA[0 = Unknown
+1 = Context
+2 = Class
+3 = Member
+4 = Integer field
+5 = Float field
+6 = String field
+7 = Object field
+8 = Function]]></description>
+			<arguments>
+				<argument name="item" type="integer"/>
+			</arguments>
+		</element>
+		<element name="getTypeName" function="true" type="string">
+			<arguments>
+				<argument name="item" type="integer"/>
+			</arguments>
+		</element>
+		<element name="search" function="true" type="integer">
+			<description><![CDATA[Searches the class reference and returns the number of  hits (results). getXXX(item) function can be used to retrieve the results.]]></description>
+			<arguments>
+				<argument name="Text" type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="CLI" context="Command line interface">
+<description><![CDATA[Commandline support functions.]]></description>
+		<element name="cmdhandler" type="string"/>
+		<element name="msgtype" type="integer" min="0" max="1"/>
+		<element name="script" type="string"/>
+		<element name="stdin" type="Object"/>
+		<element name="stdout" type="Object"/>
+		<element name="addMacro" function="true" type="void">
+			<arguments>
+				<argument name="name" type="string"/>
+				<argument name="numargs" type="integer"/>
+				<argument name="definition" type="string"/>
+				<argument name="helptext" type="string"/>
+			</arguments>
+		</element>
+		<element name="execute" function="true" type="void">
+			<arguments>
+				<argument name="command" type="string"/>
+			</arguments>
+		</element>
+		<element name="listMacros" function="true" type="void"><arguments/></element>
+		<element name="print" function="true" type="void">
+			<arguments>
+				<argument name="text" type="string"/>
+			</arguments>
+		</element>
+		<element name="println" function="true" type="void">
+			<arguments>
+				<argument name="text" type="string"/>
+			</arguments>
+		</element>
+		<element name="quit" function="true"/>
+		<element name="removeMacro" function="true" type="void">
+			<description><![CDATA[(numargs==-2) means remove all macros matching the name, otherwise only one definition is removed]]></description>
+			<arguments>
+				<argument name="name" type="string"/>
+				<argument name="numargs" type="integer"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="CreatureCharts" context="Command line interface">
+<description><![CDATA[Manages charts for monitoring creatures performance.
+This class has no corresponding static object. If you want to use it, you have to create an object or get a reference to the existing object.]]></description>
+		<element name="creature" type="untyped"/>
+		<element name="selected" type="integer"/>
+		<element name="add" function="true">
+			<description><![CDATA[return the new Window object with chart as its client
+arguments: property to be tracked]]></description>
+		</element>
+		<element name="addSelected" function="true">
+			<description><![CDATA[Add the chart for currenly selected property]]></description>
+		</element>
+		<element name="createChart" function="true">
+			<description><![CDATA[return the new chart object (can be client for Window)
+arguments: property to be tracked]]></description>
+		</element>
+		<element name="removeAll" function="true"/>
+		<element name="resetAll" function="true">
+			<description><![CDATA[Removes all data from the chart windows.]]></description>
+		</element>
+	</type>
+	<type name="CreatureSelection" context="Command line interface">
+		<element name="count" type="integer"/>
+		<element name="add" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="get" function="true"/>
+		<element name="remove" function="true"/>
+	</type>
+	<type name="DynaChart" context="Command line interface">
+<description><![CDATA[Line chart (visual object). Can be used as the client object in the Window.]]></description>
+		<element name="xscale" type="integer" min="1" max="20"/>
+		<element name="add" function="true">
+			<description><![CDATA[add new value]]></description>
+		</element>
+		<element name="clear" function="true" type="void"><arguments/></element>
+		<element name="new" function="true" type="DynaChart"><arguments/></element>
+	</type>
+	<type name="DynaChart2D" context="Command line interface">
+<description><![CDATA[2D Line chart (visual object). Can be used as the client object in the Window.]]></description>
+		<element name="memory" type="integer" min="1" max="1000" default="100">
+			<description><![CDATA[maximum number of (x,y) pairs drawn in the graph.]]></description>
+		</element>
+		<element name="add" function="true" type="void">
+			<description><![CDATA[add (x,y) values for the next graph point]]></description>
+			<arguments>
+				<argument name="x coordinate" type="float"/>
+				<argument name="y coordinate" type="float"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void"><arguments/></element>
+		<element name="new" function="true" type="DynaChart2D"><arguments/></element>
+	</type>
+	<type name="GLDisplay" context="Command line interface">
+<description><![CDATA[OpenGL display for the Framsticks Theater application.]]></description>
+		<element name="active" type="integer" min="0" max="1"/>
+		<element name="banner" type="string"/>
+		<element name="desiredsimspeed" type="float" min="0" max="999999" default="0">
+			<description><![CDATA[Desired simulation speed in steps/second. 0 = simulation is disabled.]]></description>
+		</element>
+		<element name="fps" type="float">
+			<description><![CDATA[Frames Per Second (measured)]]></description>
+		</element>
+		<element name="fpsvisible" type="integer" min="0" max="1"/>
+		<element name="maxfps" type="integer" min="1" max="100" default="30"/>
+		<element name="messagesVisible" type="integer" min="0" max="1"/>
+		<element name="messagesWindow" type="Object">
+			<description><![CDATA[get window object (class Window)]]></description>
+		</element>
+		<element name="minfps" type="integer" min="1" max="100" default="5"/>
+		<element name="simsteps" type="integer" min="0" max="999999" default="0">
+			<description><![CDATA[0 = simulation is disabled. In most cases you should use desiredsimspeed as it ensures automatic throttle control.]]></description>
+		</element>
+		<element name="size_x" type="integer"/>
+		<element name="size_y" type="integer"/>
+		<element name="userspeed" type="float" min="0" max="100" default="1">
+			<description><![CDATA[User interface sets this property to adjust simulation speed.]]></description>
+		</element>
+		<element name="clearMessages" function="true"/>
+		<element name="createWindow" function="true" type="Window">
+			<description><![CDATA[create and return the new window object.]]></description>
+			<arguments>
+				<argument name="style" type="integer"/>
+				<argument name="title" type="string"/>
+				<argument name="client" type="Object"/>
+			</arguments>
+		</element>
+		<element name="deleteWindow" function="true" type="void">
+			<arguments>
+				<argument type="Window"/>
+			</arguments>
+		</element>
+		<element name="draw" function="true"/>
+		<element name="newCreatureCharts" function="true"/>
+		<element name="newSimStatsCharts" function="true"/>
+		<element name="quit" function="true"/>
+		<element name="resume" function="true"/>
+		<element name="stop" function="true"/>
+	</type>
+	<type name="NeuroDiagram" context="Command line interface">
+<description><![CDATA[Can be used as the client object in the Window.]]></description>
+		<element name="hide" function="true" type="void"><arguments/></element>
+		<element name="new" function="true"/>
+		<element name="showCreature" function="true" type="void">
+			<arguments>
+				<argument type="Creature"/>
+			</arguments>
+		</element>
+		<element name="showModel" function="true" type="void">
+			<arguments>
+				<argument type="Model"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="RowFormat" context="Command line interface">
+<description><![CDATA[Used for creating simple listings of objects (in command line applications). There is only one shared RowFormat object. In order to use RowFormat you should first configure it, by adding column definitions (prepare or addColumn), i.e. defining column names and widths. Then, the "format" method can be invoked on a number of objects (of the same class) returning the formatted rows of the table.
+
+Example:
+RowFormat.clear();
+RowFormat.prepare(Genotype.*,"name/20,strsiz/5,nnsiz/5,fit/6");
+CLI.println(RowFormat.format(Genotype.*));]]></description>
+		<element name="fieldsep" type="string">
+			<description><![CDATA[The character used for separating columns]]></description>
+		</element>
+		<element name="fillchar" type="string">
+			<description><![CDATA[The characted used for padding the columns contents]]></description>
+		</element>
+		<element name="header" type="string">
+			<description><![CDATA[Contains the field names with the same formatting applied (i.e. with fill and separators)]]></description>
+		</element>
+		<element name="addColumn" function="true" type="void">
+			<description><![CDATA[Low level call, adds a single column. "prepare" is better.]]></description>
+			<arguments>
+				<argument name="Field#" type="integer"/>
+				<argument name="Column width" type="integer"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true" type="void">
+			<description><![CDATA[Remove all existing column definitions.]]></description>
+<arguments/></element>
+		<element name="format" function="true" type="string">
+			<description><![CDATA[Returns the formatted string taking data from the supplied object.]]></description>
+			<arguments>
+				<argument name="Object" type="Object"/>
+			</arguments>
+		</element>
+		<element name="prepare" function="true" type="void">
+			<description><![CDATA[Adds a number of columns, described as FIELD_NAME/WIDTH, columns are separated by "," (comma). Existing column definitions are not removed. Usually you will need to call "clear()" before "prepare".]]></description>
+			<arguments>
+				<argument name="Object" type="Object"/>
+				<argument name="Column Descriptions" type="string"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="ShowManager" context="Command line interface">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="code" type="string"/>
+		<element name="dispinfo" type="integer" min="0" max="2"/>
+		<element name="expdef" type="string"/>
+		<element name="info" type="string"/>
+		<element name="mode" type="integer" min="0" max="2"/>
+		<element name="name" type="string"/>
+		<element name="regname" type="string"/>
+		<element name="show" type="string"/>
+		<element name="showlog" type="integer" min="0" max="1"/>
+		<element name="switchmode" type="integer" min="0" max="2"/>
+		<element name="switchshows" type="string">
+			<description><![CDATA[names of the shows participating in automatic switching (comma separated). Use * as a wildcard.]]></description>
+		</element>
+		<element name="switchtime" type="integer" min="0" max="9999">
+			<description><![CDATA[time between switching (seconds)]]></description>
+		</element>
+		<element name="userspeed" type="integer" min="0" max="5" default="3"/>
+		<element name="about" function="true"/>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="dummy" function="true">
+			<description><![CDATA[This is the empty item in the Theater's menu]]></description>
+		</element>
+		<element name="reload" function="true"/>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+	</type>
+	<type name="SignalView" context="Command line interface">
+		<element name="labels" type="string">
+			<description><![CDATA[The label formula should return a text to be displayed over the signal source, presumably by reading some values from the supplied Signal object. It is especially useful for more sophisticated signal usage scenarios with Signal.value holding object references (the default signal label only shows <XXX Object at xxxxx> in such cases)]]></description>
+		</element>
+		<element name="mode" type="integer" min="0" max="2"/>
+		<element name="addMap" function="true" type="void">
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="color" type="integer"/>
+			</arguments>
+		</element>
+		<element name="addSignals" function="true" type="void">
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="color" type="integer"/>
+				<argument name="angle_x" type="integer"/>
+				<argument name="angle_y" type="integer"/>
+				<argument name="angle_z" type="integer"/>
+			</arguments>
+		</element>
+		<element name="addSignalsFilter" function="true" type="void">
+			<arguments>
+				<argument name="channel" type="string"/>
+				<argument name="color" type="integer"/>
+				<argument name="angle_x" type="integer"/>
+				<argument name="angle_y" type="integer"/>
+				<argument name="angle_z" type="integer"/>
+				<argument name="flavor" type="integer"/>
+				<argument name="filter" type="integer"/>
+			</arguments>
+		</element>
+		<element name="clear" function="true"/>
+	</type>
+	<type name="SimStatsCharts" context="Command line interface">
+<description><![CDATA[Manages charts for monitoring simulator statistics.
+This class has no corresponding static object. If you want to use it, you have to create an object or get a reference to the existing object.]]></description>
+		<element name="selected" type="integer"/>
+		<element name="add" function="true"/>
+		<element name="createChart" function="true"/>
+		<element name="removeAll" function="true"/>
+		<element name="resetAll" function="true">
+			<description><![CDATA[Removes all data from the chart windows.]]></description>
+		</element>
+		<element name="sscAddSelected" function="true"/>
+	</type>
+	<type name="TrackingCam" context="Command line interface">
+<description><![CDATA[Camera object with the automatic target tracking ability.]]></description>
+		<element name="cam_change" type="integer" min="0" max="5" default="3"/>
+		<element name="cam_chspeed" type="float" min="0.1" max="10" default="1"/>
+		<element name="cam_dir" type="float" min="0" max="360" default="30"/>
+		<element name="cam_distrac" type="integer" min="0" max="1" default="0">
+			<description><![CDATA[Suspend automatic tracking when the camera is moved manually]]></description>
+		</element>
+		<element name="cam_h" type="float" min="0" max="360" default="45">
+			<description><![CDATA[0=side view, 90=top view]]></description>
+		</element>
+		<element name="cam_restrac" type="integer" min="0" max="100" default="10">
+			<description><![CDATA[Restore automatic tracking after some period of time
+(0 to never restore automatic tracking)]]></description>
+		</element>
+		<element name="cam_tracking" type="integer" min="0" max="3" default="1"/>
+		<element name="cam_trspeed" type="float" min="0.1" max="10" default="5"/>
+		<element name="cam_zoom" type="float" min="0.2" max="3" default="0.8"/>
+		<element name="cam_restore" function="true" type="void">
+			<description><![CDATA[Update camera position and restore automatic tracking]]></description>
+<arguments/></element>
+		<element name="moveTarget" function="true" type="void">
+			<description><![CDATA[notify about the target location/size change]]></description>
+			<arguments>
+				<argument name="location x" type="float"/>
+				<argument name="location y" type="float"/>
+				<argument name="location z" type="float"/>
+				<argument name="target size" type="float"/>
+			</arguments>
+		</element>
+		<element name="setTarget" function="true" type="void">
+			<description><![CDATA[select a new target for the camera]]></description>
+			<arguments>
+				<argument name="location x" type="float"/>
+				<argument name="location y" type="float"/>
+				<argument name="location z" type="float"/>
+				<argument name="target size" type="float"/>
+			</arguments>
+		</element>
+		<element name="setViewDir" function="true" type="void">
+			<description><![CDATA[heading: 0..360, height: -90..+90]]></description>
+			<arguments>
+				<argument name="heading angle" type="float"/>
+				<argument name="height angle" type="float"/>
+			</arguments>
+		</element>
+	</type>
+	<type name="VisualStyle" context="Command line interface">
+		<element name="changedProperty" type="integer"/>
+		<element name="changedPropertyId" type="string"/>
+		<element name="code" type="string"/>
+		<element name="info" type="string"/>
+		<element name="modelpan" type="integer" min="0" max="3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="name" type="string"/>
+		<element name="neurons" type="integer" min="0" max="1"/>
+		<element name="shownames" type="integer" min="0" max="1">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="smooth" type="integer" min="0" max="1"/>
+		<element name="style" type="string"/>
+		<element name="tex" type="integer" min="0" max="2"/>
+		<element name="worldpan" type="integer" min="0" max="3">
+			<description><![CDATA[]]></description>
+		</element>
+		<element name="add" function="true"/>
+		<element name="addGroup" function="true"/>
+		<element name="clear" function="true"/>
+		<element name="rebuild" function="true"/>
+		<element name="remove" function="true"/>
+		<element name="removeGroup" function="true"/>
+		<element name="streload" function="true"/>
+	</type>
+	<type name="Window" context="Command line interface">
+<description><![CDATA[Window object, used in the Framsticks Theater application.
+This class has no corresponding static object. If you want to use it, you have to create an object or get a reference to the existing object.
+ See also: GLDisplay]]></description>
+		<element name="backcolor" type="integer">
+			<description><![CDATA[format: 0xAABBGGRR (alpha,blue,green,red)]]></description>
+		</element>
+		<element name="client" type="Object">
+			<description><![CDATA[what is displayed in the window]]></description>
+		</element>
+		<element name="pos_x" type="integer"/>
+		<element name="pos_y" type="integer"/>
+		<element name="size_x" type="integer"/>
+		<element name="size_y" type="integer"/>
+		<element name="style" type="integer">
+			<description><![CDATA[bitfield:
+1 - border
+2 - title
+4 - Opaque background
+8 - Close button
+16 - resizable]]></description>
+		</element>
+		<element name="title" type="string"/>
+	</type>
+</framscript>
Index: /java/FramclipsePlugin/src/main/resources/framscript.xsl
===================================================================
--- /java/FramclipsePlugin/src/main/resources/framscript.xsl	(revision 13)
+++ /java/FramclipsePlugin/src/main/resources/framscript.xsl	(revision 13)
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:template match="/">
+  <html><body>
+      <xsl:apply-templates select="//framscript"/>
+  </body></html>
+</xsl:template>
+
+<xsl:template match="framscript">
+  <h1>Framscript Objects</h1>
+  <xsl:apply-templates select="//framscript/type"/>
+</xsl:template>
+
+<xsl:template match="type">
+  <hr/>
+  <table width="100%"><tr><td width="50%" valign="top">
+  <h2><xsl:value-of select="@name"/></h2>
+  <i>defined in <xsl:value-of select="@context"/></i><br/><br/>
+  <xsl:value-of select="description/."/>
+  </td><td valign="top">
+  <ul><xsl:apply-templates select="element"/></ul>
+  </td></tr></table>
+</xsl:template>
+
+<xsl:template match="element">
+  <li><b><xsl:value-of select="@name"/></b> - 
+   <xsl:if test="@function='true'">
+    function <xsl:if test="@type!=''">returning <xsl:value-of select="@type"/></xsl:if>
+    <br/><xsl:value-of select="description/."/>
+    
+    <xsl:if test="count(arguments)!='0'">
+     <ul><xsl:if test="count(arguments/argument)='0'"><u>No arguments</u></xsl:if>
+        <xsl:if test="count(arguments/argument)!='0'"><u>Arguments:</u><xsl:apply-templates select="arguments/argument"/></xsl:if></ul></xsl:if>
+    </xsl:if>
+   <xsl:if test="not(@function='true')">
+    <xsl:value-of select="@type"/> field
+    <xsl:if test="description/. != ''"><br/><xsl:value-of select="description/."/></xsl:if>
+   </xsl:if>
+  </li>
+</xsl:template>
+
+<xsl:template match="argument">
+  <li><b><xsl:value-of select="@name"/></b> - <xsl:value-of select="@type"/></li>
+</xsl:template>
+
+</xsl:stylesheet>
