*** empty log message ***
diff --git a/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF
index 0754c03..3e176df 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.xsl.xalan/META-INF/MANIFEST.MF
@@ -6,4 +6,4 @@
 Require-Bundle: org.eclipse.wst.xsl.debug
 Bundle-ClassPath: xalan2.7.0.jar,
  xalan-debugger.jar
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/bundles/org.eclipse.wst.xsl.xalan/plugin.xml b/bundles/org.eclipse.wst.xsl.xalan/plugin.xml
index 73fe33a..4ed7a8f 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/plugin.xml
+++ b/bundles/org.eclipse.wst.xsl.xalan/plugin.xml
@@ -17,13 +17,21 @@
             className="org.eclipse.wst.xsl.xalan.debugger.XalanDebugger"
             classpath="xalan-debugger.jar"
             id="org.eclipse.wst.xsl.xalan.debugger"
-            name="Xalan Debugger"
+            name="Xalan 2.5.1 or greater"
             processorTypeId="org.eclipse.wst.xsl.xalan.processorType">
       </debugger>
    </extension>
    <extension
          point="org.eclipse.wst.xsl.launching.processor">
       <processor
+            classpath="xalan2.5.1.jar"
+            debuggerId="org.eclipse.wst.xsl.xalan.debugger"
+            id="org.eclipse.wst.xsl.launching.xalan.2_5_1"
+            label="Xalan 2.5.1"
+            processorTypeId="org.eclipse.wst.xsl.xalan.processorType"
+            supports="1.0">
+      </processor>
+      <processor
             classpath="xalan2.7.0.jar;serializer2.7.0.jar"
             id="org.eclipse.wst.xsl.launching.xalan.2_7_0"
             label="Xalan 2.7.0"
diff --git a/bundles/org.eclipse.wst.xsl.xalan/source2.5.1.zip b/bundles/org.eclipse.wst.xsl.xalan/source2.5.1.zip
new file mode 100644
index 0000000..d2b15a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.xalan/source2.5.1.zip
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java
index 7f73cfa..373ee08 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanDebugger.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.xsl.xalan.debugger;
 
+import java.util.Map;
 import java.util.TooManyListenersException;
 
 import javax.xml.transform.Transformer;
@@ -29,12 +30,18 @@
 		tfi.setAttribute(TransformerFactoryImpl.FEATURE_OPTIMIZE, Boolean.FALSE);
 	}
 
-	public void addTransformer(Transformer transformer)
+	public void addTransformer(Transformer transformer, Map locations)
 	{
 		TransformerImpl transformerImpl = (TransformerImpl) transformer;
 		TraceManager trMgr = transformerImpl.getTraceManager();
 		try
 		{
+//			XalanPrintTraceListener printer = new XalanPrintTraceListener(new PrintWriter(System.err));
+//			printer.m_traceElements = true;
+//			printer.m_traceSelection = true;
+//			printer.m_traceTemplates = true;
+//			trMgr.addTraceListener(printer);
+			
 			XalanTraceListener traceListener = new XalanTraceListener(transformerImpl.getXPathContext().getVarStack(), this);
 			trMgr.addTraceListener(traceListener);
 		}
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanPrintTraceListener.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanPrintTraceListener.java
new file mode 100644
index 0000000..3d6c07d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanPrintTraceListener.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
+ * 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:
+ *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsl.xalan.debugger;
+
+import java.io.PrintWriter;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.xalan.templates.Constants;
+import org.apache.xalan.templates.ElemTemplate;
+import org.apache.xalan.templates.ElemTextLiteral;
+import org.apache.xalan.trace.EndSelectionEvent;
+import org.apache.xalan.trace.PrintTraceListener;
+import org.apache.xalan.trace.SelectionEvent;
+import org.apache.xalan.trace.TracerEvent;
+
+public class XalanPrintTraceListener extends PrintTraceListener
+{
+	private final PrintWriter writer;
+
+	public XalanPrintTraceListener(PrintWriter pw)
+	{
+		super(pw);
+		this.writer = pw;
+	}
+
+	public void _trace(TracerEvent ev)
+	{
+		switch (ev.m_styleNode.getXSLToken())
+		{
+			case Constants.ELEMNAME_TEXTLITERALRESULT:
+				if (m_traceElements)
+				{
+					writer.print(ev.m_styleNode.getSystemId() + " Line #" + ev.m_styleNode.getLineNumber() + ", " + "Column #" + ev.m_styleNode.getColumnNumber() + " -- " + ev.m_styleNode.getNodeName()
+							+ ": ");
+
+					ElemTextLiteral etl = (ElemTextLiteral) ev.m_styleNode;
+					String chars = new String(etl.getChars(), 0, etl.getChars().length);
+
+					writer.println("    " + chars.trim());
+				}
+				break;
+			case Constants.ELEMNAME_TEMPLATE:
+				if (m_traceTemplates || m_traceElements)
+				{
+					ElemTemplate et = (ElemTemplate) ev.m_styleNode;
+
+					writer.print(et.getSystemId() + " Line #" + et.getLineNumber() + ", " + "Column #" + et.getColumnNumber() + ": " + et.getNodeName() + " ");
+
+					if (null != et.getMatch())
+					{
+						writer.print("match='" + et.getMatch().getPatternString() + "' ");
+					}
+
+					if (null != et.getName())
+					{
+						writer.print("name='" + et.getName() + "' ");
+					}
+
+					writer.println();
+				}
+				break;
+			default:
+				if (m_traceElements)
+				{
+					writer
+							.println(ev.m_styleNode.getSystemId() + " Line #" + ev.m_styleNode.getLineNumber() + ", " + "Column #" + ev.m_styleNode.getColumnNumber() + ": "
+									+ ev.m_styleNode.getNodeName());
+				}
+		}
+	}
+
+	public void selected(SelectionEvent ev) throws TransformerException
+	{
+		writer.print("selected: ");
+		super.selected(ev);
+	}
+	
+	public void selectEnd(EndSelectionEvent ev) throws TransformerException
+	{
+		writer.print("selectEnd: ");
+		super.selectEnd(ev);
+	}
+	
+	public void trace(TracerEvent ev)
+	{
+		writer.print("trace: ");
+		super.trace(ev);
+	}
+	
+	public void traceEnd(TracerEvent ev)
+	{
+		writer.print("traceEnd: ");
+		_trace(ev);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java
index f4af450..2d1f9b2 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanRootStyleFrame.java
@@ -14,15 +14,14 @@
 
 import org.apache.xalan.templates.ElemTemplateElement;
 import org.apache.xpath.VariableStack;
-import org.eclipse.wst.xsl.debugger.StyleFrame;
 
 public class XalanRootStyleFrame extends XalanStyleFrame
 {
 	private final List globals;
 
-	public XalanRootStyleFrame(StyleFrame parent, ElemTemplateElement element, VariableStack varStack, List globals)
+	public XalanRootStyleFrame(ElemTemplateElement element, VariableStack varStack, List globals)
 	{
-		super(parent, element, varStack);
+		super(null, element, varStack);
 		this.globals = globals;
 	}
 
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java
index 47b6a06..a4655f0 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanStyleFrame.java
@@ -12,7 +12,10 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Stack;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.xalan.templates.ElemCallTemplate;
 import org.apache.xalan.templates.ElemTemplate;
 import org.apache.xalan.templates.ElemTemplateElement;
@@ -25,36 +28,27 @@
 
 public class XalanStyleFrame extends StyleFrame
 {
+	private static final Log log = LogFactory.getLog(XalanStyleFrame.class);
+	
 	private final List localVariables = new ArrayList();
 	private final ElemTemplateElement element;
 	private final VariableStack varStack;
+	private final Stack elementStack = new Stack();
+	private int currentLine;
 
 	public XalanStyleFrame(StyleFrame parent, ElemTemplateElement element, VariableStack varStack)
 	{
 		super(parent);
 		this.element = element;
 		this.varStack = varStack;
+		pushElement(element);
 	}
-
-	
-	public int getColumn()
-	{
-		return element.getColumnNumber();
-	}
-
 	
 	public String getFilename()
 	{
-		return element.getSystemId();
+		return element.getStylesheet().getSystemId();
 	}
 
-	
-	public int getLine()
-	{
-		return element.getLineNumber();
-	}
-
-	
 	public String getName()
 	{
 		String name = element.getNodeName();
@@ -83,7 +77,6 @@
 		}
 		return name;
 	}
-
 	
 	public List getVariableStack()
 	{
@@ -92,7 +85,6 @@
 		fillWithGlobals(vars);
 		return vars;
 	}
-
 	
 	public Variable getVariable(String scope, int slotNumber)
 	{
@@ -110,7 +102,39 @@
 		Variable xvar = new XalanVariable(varStack, scope, localVariables.size(), variable);
 		localVariables.add(xvar);
 	}
+	
+	public Object getTemplate()
+	{
+		return element.getOwnerXSLTemplate();
+	}
+	
+	public int getCurrentLine()
+	{
+		return currentLine;
+	}
+	
+	public void pushElement(ElemTemplateElement e)
+	{
+		currentLine = e.getLineNumber();
+		elementStack.push(e);
+		log.debug("Pushed element "+e);
+	}
 
+	public ElemTemplateElement popElement()
+	{
+		ElemTemplateElement e = (ElemTemplateElement)elementStack.pop();
+		log.debug("Popped element "+e);
+		currentLine = e.getEndLineNumber();
+		return e;
+	}
+
+	public ElemTemplateElement peekElement()
+	{
+		if (elementStack.isEmpty())
+			return null;
+		return (ElemTemplateElement)elementStack.peek();
+	}
+	
 	private void fillWithLocals(List vars)
 	{
 		XalanStyleFrame frame = this;
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java
index 492b959..cb15c9a 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanTraceListener.java
@@ -11,9 +11,7 @@
 package org.eclipse.wst.xsl.xalan.debugger;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Vector;
 
 import javax.xml.transform.TransformerException;
 
@@ -21,133 +19,112 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.xalan.templates.Constants;
 import org.apache.xalan.templates.ElemTemplateElement;
-import org.apache.xalan.templates.ElemVariable;
-import org.apache.xalan.templates.StylesheetRoot;
 import org.apache.xalan.trace.EndSelectionEvent;
+import org.apache.xalan.trace.ExtensionEvent;
 import org.apache.xalan.trace.GenerateEvent;
 import org.apache.xalan.trace.SelectionEvent;
 import org.apache.xalan.trace.TraceListenerEx2;
 import org.apache.xalan.trace.TracerEvent;
 import org.apache.xpath.VariableStack;
 import org.eclipse.wst.xsl.debugger.BreakPoint;
-import org.eclipse.wst.xsl.debugger.StyleFrame;
-import org.eclipse.wst.xsl.debugger.Variable;
 
-public class XalanTraceListener implements TraceListenerEx2
+public class XalanTraceListener implements TraceListenerEx2 //TraceListenerEx3
 {
 	private static final Log log = LogFactory.getLog(XalanTraceListener.class);
 
 	private final XalanDebugger debugger;
 	private final VariableStack varStack;
 	private boolean started;
-
-	public XalanTraceListener(VariableStack stack, XalanDebugger debugger)
+	
+	public XalanTraceListener(VariableStack varStack, XalanDebugger debugger)
 	{
 		this.debugger = debugger;
-		varStack = stack;
-	}
-
-	public void generated(GenerateEvent ev)
-	{
-		// TODO here we could build up the output tree into a string, and return to the UI if requested?
-	}
-
-	// These events are thrown when hitting xsl:when or xsl:if
-	public void selected(SelectionEvent ev) throws TransformerException
-	{
-	}
-
-	public void selectEnd(EndSelectionEvent ev) throws TransformerException
-	{
+		this.varStack = varStack;
 	}
 
 	public void trace(TracerEvent ev)
 	{
-		// log.debug("trace: "+ev);
-		// There is one XalanTraceListener for each stylesheet in the pipeline.
-		// So if this is the first trace event, we clear down the debugger's
-		// state from the previous transformation.
+		XalanStyleFrame styleFrame = null;
 		if (!started)
-		{
+		{// this is the root of the stack
 			started = true;
 			debugger.debuggerTransformStarted();
+			List globals = new ArrayList(); 
+			// TODO put back in
+			// List globals = getGlobals(el.getStylesheetRoot());
+			styleFrame = new XalanRootStyleFrame(ev.m_styleNode, varStack, globals);
+			debugger.pushStyleFrame(styleFrame);
 		}
-		StyleFrame styleFrame = pushStyleFrame(ev);
-		if (styleFrame == null)
-			return;
-		debugger.checkStopped();
-		BreakPoint breakpoint = new BreakPoint(styleFrame.getFilename(), styleFrame.getLine());
-		debugger.checkSuspended(styleFrame, breakpoint);
+		else if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
+		{// this is an xsl:template, so add to template stack
+			styleFrame = new XalanStyleFrame(debugger.peekStyleFrame(), ev.m_styleNode, varStack);
+			debugger.pushStyleFrame(styleFrame);
+		}
+		else if (ev.m_styleNode.getXSLToken() != Constants.ELEMNAME_TEXTLITERALRESULT)
+		{// add to current template element stack
+			styleFrame = (XalanStyleFrame) debugger.peekStyleFrame();
+			styleFrame.pushElement(ev.m_styleNode);
+		}
+		else
+		{
+			log.error(ev.m_styleNode.getLocalName());
+		}
+		check(styleFrame);
 	}
 
 	public void traceEnd(TracerEvent ev)
 	{
-		// log.debug("traceEnd: "+ev);
-		XalanStyleFrame styleFrame = popStyleFrame(ev);
-		debugger.checkStopped();
-		BreakPoint breakpoint = new BreakPoint(styleFrame.getFilename(), styleFrame.getEndLine());
-		debugger.checkSuspended(styleFrame, breakpoint);
-		// consistency check
-		log.debug(styleFrame.getFilename() + " " + styleFrame.getName() + " " + styleFrame.getLine() + " " + styleFrame.getEndLine());
-	}
-
-	private XalanStyleFrame pushStyleFrame(TracerEvent ev)
-	{
-		StyleFrame parent = debugger.peekStyleFrame();
-		XalanStyleFrame styleFrame;
-		if (parent == null)
-		{
-			List globals = getGlobals(ev.m_styleNode.getStylesheetRoot());
-			styleFrame = new XalanRootStyleFrame(parent, ev.m_styleNode, varStack, globals);
+		XalanStyleFrame styleFrame = (XalanStyleFrame) debugger.peekStyleFrame();
+		ElemTemplateElement tel = null;
+		if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
+		{// end of template, so remove from stack
+			tel = styleFrame.popElement();
+		}
+		else if (ev.m_styleNode.getXSLToken() != Constants.ELEMNAME_TEXTLITERALRESULT)
+		{// remove from current templates element stack
+			tel = styleFrame.popElement();
+		}
+		check(styleFrame);
+		if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
+		{// end of template, so remove from stack
+			debugger.popStyleFrame();
 		}
 		else
-			styleFrame = new XalanStyleFrame(parent, ev.m_styleNode, varStack);
-		debugger.pushStyleFrame(styleFrame);
-		return styleFrame;
-	}
-
-	private List getGlobals(StylesheetRoot root)
-	{
-		List vars = new ArrayList();
-		Vector composedVars = root.getVariablesAndParamsComposed();
-		int i = 0;
-		for (Iterator iter = composedVars.iterator(); iter.hasNext();)
-		{
-			ElemVariable variable = (ElemVariable) iter.next();
-			int token = variable.getXSLToken();
-			if ((token == Constants.ELEMNAME_PARAMVARIABLE || token == Constants.ELEMNAME_VARIABLE) && variable.getIsTopLevel())
+		{// because we don't get selectEnd events, we need to do this check
+			tel = styleFrame.peekElement();
+			// if the parent is a choose, move on to it
+			switch (tel.getXSLToken())
 			{
-				vars.add(new XalanVariable(varStack, Variable.GLOBAL_SCOPE, i, variable));
-				++i;
+				case Constants.ELEMNAME_CHOOSE:
+					styleFrame.popElement();
+					check(styleFrame);
 			}
 		}
-		return vars;
 	}
-
-	private XalanStyleFrame popStyleFrame(TracerEvent ev)
+	
+	private void check(XalanStyleFrame styleFrame)
 	{
-		ElemTemplateElement element = ev.m_styleNode;
-		String filename = element.getSystemId();
-		int line = element.getLineNumber();
-
-		// why the while loop? Because Xalan doesn't report xsl:when or xsl:if
-		// as TracerEvents
-		// ...so it is a workaround to make sure we get to the right frame
-		XalanStyleFrame styleFrame;
-		while ((styleFrame = (XalanStyleFrame) debugger.popStyleFrame()) != null)
+		debugger.checkStopped();
+		if (styleFrame!=null)
 		{
-			if (styleFrame.getFilename().equals(filename) && styleFrame.getLine() == line)
-			{
-				String name = element.getNodeName();
-				if (name.equals("param") || name.equals("variable"))
-				{
-					XalanStyleFrame parent = (XalanStyleFrame) styleFrame.getParent();
-					parent.addVariable((ElemVariable) element);
-				}
-				styleFrame.setEndLine(line);
-				return styleFrame;
-			}
+			BreakPoint breakpoint = new BreakPoint(styleFrame.getFilename(), styleFrame.getCurrentLine());
+			debugger.checkSuspended(styleFrame, breakpoint);
 		}
-		return null;
 	}
+
+	public void selected(SelectionEvent ev) throws TransformerException
+	{}
+
+	public void selectEnd(EndSelectionEvent ev) throws TransformerException
+	{}
+
+	public void generated(GenerateEvent ev)
+	{}
+
+	public void extension(ExtensionEvent ee)
+	{}
+
+	public void extensionEnd(ExtensionEvent ee)
+	{}
+
 }
diff --git a/bundles/org.eclipse.wst.xsl.xalan/xalan2.5.1.jar b/bundles/org.eclipse.wst.xsl.xalan/xalan2.5.1.jar
new file mode 100644
index 0000000..44d4d09
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.xalan/xalan2.5.1.jar
Binary files differ