*** empty log message ***
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 373ee08..89cb2e9 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
@@ -42,7 +42,7 @@
 //			printer.m_traceTemplates = true;
 //			trMgr.addTraceListener(printer);
 			
-			XalanTraceListener traceListener = new XalanTraceListener(transformerImpl.getXPathContext().getVarStack(), this);
+			XalanTraceListener traceListener = new XalanTraceListener(this);
 			trMgr.addTraceListener(traceListener);
 		}
 		catch (TooManyListenersException e)
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 2d1f9b2..cdfd3c2 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
@@ -10,23 +10,42 @@
  *******************************************************************************/
 package org.eclipse.wst.xsl.xalan.debugger;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Vector;
 
-import org.apache.xalan.templates.ElemTemplateElement;
+import org.apache.xalan.templates.ElemVariable;
+import org.apache.xalan.templates.StylesheetRoot;
+import org.apache.xalan.trace.TracerEvent;
 import org.apache.xpath.VariableStack;
+import org.eclipse.wst.xsl.debugger.Variable;
 
 public class XalanRootStyleFrame extends XalanStyleFrame
 {
-	private final List globals;
+	private final List globals = new ArrayList();
 
-	public XalanRootStyleFrame(ElemTemplateElement element, VariableStack varStack, List globals)
+	public XalanRootStyleFrame(TracerEvent event)
 	{
-		super(null, element, varStack);
-		this.globals = globals;
+		super(null, event);
+		fillGlobals(event);
 	}
 
-	public List getGlobals()
+	protected List getGlobals()
 	{
 		return globals;
 	}
+	
+	private void fillGlobals(TracerEvent event)
+	{
+		VariableStack vs = event.m_processor.getXPathContext().getVarStack();
+	    StylesheetRoot sr = event.m_styleNode.getStylesheetRoot();
+	    Vector vars = sr.getVariablesAndParamsComposed();
+	    int i = vars.size();
+	    while (--i >= 0)
+		{
+			ElemVariable variable = (ElemVariable) vars.elementAt(i);
+			XalanVariable xvar = new XalanVariable(vs,Variable.GLOBAL_SCOPE,i,variable);
+			globals.add(xvar);
+		}
+	}
 }
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 a4655f0..0786c0f 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
@@ -11,7 +11,11 @@
 package org.eclipse.wst.xsl.xalan.debugger;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Stack;
 
 import org.apache.commons.logging.Log;
@@ -20,6 +24,7 @@
 import org.apache.xalan.templates.ElemTemplate;
 import org.apache.xalan.templates.ElemTemplateElement;
 import org.apache.xalan.templates.ElemVariable;
+import org.apache.xalan.trace.TracerEvent;
 import org.apache.xml.utils.QName;
 import org.apache.xpath.VariableStack;
 import org.apache.xpath.XPath;
@@ -29,32 +34,34 @@
 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 final Map varNames;
+	private final Stack eventStack = new Stack();
+	final TracerEvent event;
 	private int currentLine;
 
-	public XalanStyleFrame(StyleFrame parent, ElemTemplateElement element, VariableStack varStack)
+	public XalanStyleFrame(StyleFrame parent, TracerEvent event)
 	{
 		super(parent);
-		this.element = element;
-		this.varStack = varStack;
-		pushElement(element);
+		this.event = event;
+		if (parent != null)
+			this.varNames = new HashMap(((XalanStyleFrame)parent).varNames);
+		else
+			this.varNames = new HashMap();
+		pushElement(event);
 	}
-	
+
 	public String getFilename()
 	{
-		return element.getStylesheet().getSystemId();
+		return event.m_styleNode.getStylesheet().getSystemId();
 	}
 
 	public String getName()
 	{
-		String name = element.getNodeName();
-		if (element instanceof ElemTemplate)
+		String name = event.m_styleNode.getNodeName();
+		if (event.m_styleNode instanceof ElemTemplate)
 		{
-			ElemTemplate et = (ElemTemplate) element;
+			ElemTemplate et = (ElemTemplate) event.m_styleNode;
 			QName q = et.getName();
 			if (q != null)
 			{
@@ -66,9 +73,9 @@
 				name += " match=\"" + xp.getPatternString() + "\"";
 			}
 		}
-		else if (element instanceof ElemCallTemplate)
+		else if (event.m_styleNode instanceof ElemCallTemplate)
 		{
-			ElemCallTemplate et = (ElemCallTemplate) element;
+			ElemCallTemplate et = (ElemCallTemplate) event.m_styleNode;
 			QName q = et.getName();
 			if (q != null)
 			{
@@ -77,74 +84,90 @@
 		}
 		return name;
 	}
-	
+
 	public List getVariableStack()
 	{
 		List vars = new ArrayList();
-		fillWithLocals(vars);
-		fillWithGlobals(vars);
+		vars.addAll(getLocals());
+		vars.addAll(getGlobals());
 		return vars;
 	}
-	
+
 	public Variable getVariable(String scope, int slotNumber)
 	{
-		List vars = new ArrayList();
 		if (Variable.GLOBAL_SCOPE.equals(scope))
-			fillWithGlobals(vars);
+		{
+			List vars = getGlobals();
+			for (Iterator iterator = vars.iterator(); iterator.hasNext();)
+			{
+				Variable var = (Variable) iterator.next();
+				if (var.getSlotNumber() == slotNumber)
+					return var;
+			}
+		}
 		else if (Variable.LOCAL_SCOPE.equals(scope))
-			fillWithLocals(vars);
-		return (Variable) vars.get(slotNumber);
+		{
+			List vars = getLocals();
+			for (Iterator iterator = vars.iterator(); iterator.hasNext();)
+			{
+				Variable var = (Variable) iterator.next();
+				if (var.getSlotNumber() == slotNumber)
+					return var;
+			}
+		}
+		return null;
 	}
 
-	public void addVariable(ElemVariable variable)
-	{
-		String scope = variable.getIsTopLevel() ? Variable.GLOBAL_SCOPE : Variable.LOCAL_SCOPE;
-		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)
+
+	public void pushElement(TracerEvent e)
 	{
-		currentLine = e.getLineNumber();
-		elementStack.push(e);
-		log.debug("Pushed element "+e);
+		currentLine = e.m_styleNode.getLineNumber();
+		eventStack.push(e);
+		log.debug("Pushed element " + e);
 	}
 
-	public ElemTemplateElement popElement()
+	public TracerEvent popElement()
 	{
-		ElemTemplateElement e = (ElemTemplateElement)elementStack.pop();
-		log.debug("Popped element "+e);
-		currentLine = e.getEndLineNumber();
+		TracerEvent e = (TracerEvent) eventStack.pop();
+		log.debug("Popped element " + e);
+		currentLine = e.m_styleNode.getEndLineNumber();
+
+		ElemTemplateElement element = e.m_styleNode;
+		String name = element.getNodeName();
+		if (name.equals("param") || name.equals("variable"))
+			addVariable((ElemVariable) e.m_styleNode);
+
 		return e;
 	}
 
-	public ElemTemplateElement peekElement()
+	public TracerEvent peekElement()
 	{
-		if (elementStack.isEmpty())
+		if (eventStack.isEmpty())
 			return null;
-		return (ElemTemplateElement)elementStack.peek();
-	}
-	
-	private void fillWithLocals(List vars)
-	{
-		XalanStyleFrame frame = this;
-		while ((frame = (XalanStyleFrame) frame.getParent()) != null)
-		{
-			vars.addAll(frame.localVariables);
-		}
+		return (TracerEvent) eventStack.peek();
 	}
 
-	private void fillWithGlobals(List vars)
+	private void addVariable(ElemVariable variable)
+	{
+		String scope = variable.getIsTopLevel() ? Variable.GLOBAL_SCOPE : Variable.LOCAL_SCOPE;
+		VariableStack vs = event.m_processor.getXPathContext().getVarStack();
+		Variable xvar = new XalanVariable(vs, scope, variable.getIndex(), variable);
+		varNames.put(variable.getName(),xvar);
+	}
+
+	private List getLocals()
+	{
+		List locals = new ArrayList(varNames.values());
+		// sort by slotNumber
+		Collections.sort(locals);
+		return locals;
+	}
+
+	protected List getGlobals()
 	{
 		XalanStyleFrame frame = this;
 		while ((frame = (XalanStyleFrame) frame.getParent()) != null)
@@ -152,22 +175,9 @@
 			if (frame instanceof XalanRootStyleFrame)
 			{
 				XalanRootStyleFrame root = (XalanRootStyleFrame) frame;
-				vars.addAll(root.getGlobals());
-				break;
+				return root.getGlobals();
 			}
 		}
-
-		// if (template != null)
-		// {
-		// Stylesheet sheet = template.getStylesheet();
-		// for (int i = 0; i < sheet.getVariableOrParamCount(); i++)
-		// {
-		// ElemVariable variable = sheet.getVariableOrParam(i);
-		// Variable var = new
-		// XalanVariable(this,variable.getName().getLocalName(),Variable.GLOBAL_SCOPE,i,variable);
-		// vars.add(var);
-		// }
-		// }
-
+		return null;
 	}
 }
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 cb15c9a..4f6c8b0 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
@@ -10,22 +10,19 @@
  *******************************************************************************/
 package org.eclipse.wst.xsl.xalan.debugger;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.xml.transform.TransformerException;
 
 import org.apache.commons.logging.Log;
 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.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;
 
 public class XalanTraceListener implements TraceListenerEx2 //TraceListenerEx3
@@ -33,13 +30,11 @@
 	private static final Log log = LogFactory.getLog(XalanTraceListener.class);
 
 	private final XalanDebugger debugger;
-	private final VariableStack varStack;
 	private boolean started;
 	
-	public XalanTraceListener(VariableStack varStack, XalanDebugger debugger)
+	public XalanTraceListener(XalanDebugger debugger)
 	{
 		this.debugger = debugger;
-		this.varStack = varStack;
 	}
 
 	public void trace(TracerEvent ev)
@@ -49,25 +44,22 @@
 		{// 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);
+			styleFrame = new XalanRootStyleFrame(ev);
 			debugger.pushStyleFrame(styleFrame);
 		}
 		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);
+			styleFrame = new XalanStyleFrame(debugger.peekStyleFrame(), ev);
 			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);
+			styleFrame.pushElement(ev);
 		}
 		else
 		{
-			log.error(ev.m_styleNode.getLocalName());
+			log.debug("Skipped push for element "+ev.m_styleNode.getLocalName());
 		}
 		check(styleFrame);
 	}
@@ -75,14 +67,17 @@
 	public void traceEnd(TracerEvent ev)
 	{
 		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();
+		{// remove from current template element stack
+			styleFrame.popElement();
 		}
 		else if (ev.m_styleNode.getXSLToken() != Constants.ELEMNAME_TEXTLITERALRESULT)
-		{// remove from current templates element stack
-			tel = styleFrame.popElement();
+		{// remove from current template element stack
+			styleFrame.popElement();
+		}
+		else
+		{
+			log.debug("Skipped pop for element "+ev.m_styleNode.getLocalName());
 		}
 		check(styleFrame);
 		if (ev.m_styleNode.getOwnerXSLTemplate() == ev.m_styleNode)
@@ -91,9 +86,9 @@
 		}
 		else
 		{// because we don't get selectEnd events, we need to do this check
-			tel = styleFrame.peekElement();
+			TracerEvent tel = styleFrame.peekElement();
 			// if the parent is a choose, move on to it
-			switch (tel.getXSLToken())
+			switch (tel.m_styleNode.getXSLToken())
 			{
 				case Constants.ELEMNAME_CHOOSE:
 					styleFrame.popElement();
diff --git a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java
index b7891e8..a8ddf23 100644
--- a/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java
+++ b/bundles/org.eclipse.wst.xsl.xalan/src-debugger/org/eclipse/wst/xsl/xalan/debugger/XalanVariable.java
@@ -20,17 +20,20 @@
 import org.apache.xpath.objects.XObject;
 import org.eclipse.wst.xsl.debugger.Variable;
 
-public class XalanVariable extends Variable
+public class XalanVariable extends Variable implements Comparable
 {
 	private final Log log = LogFactory.getLog(XalanVariable.class);
 	private final ElemVariable elemVariable;
 	private final VariableStack varStack;
+	private int stackFrame;
 
 	public XalanVariable(VariableStack varStack, String scope, int slotNumber, ElemVariable elemVariable)
 	{
-		super(getName(elemVariable), scope, slotNumber);
+		super(getName(elemVariable), scope, slotNumber+varStack.getStackFrame());
 		this.elemVariable = elemVariable;
 		this.varStack = varStack;
+		// get the stack frame at this current point in time
+		this.stackFrame = varStack.getStackFrame();
 	}
 
 	private static String getName(ElemVariable elemVariable)
@@ -51,7 +54,6 @@
 
 	public String getValue()
 	{
-		log.debug("Getting value for " + getName() + " in scope " + getScope() + " with index " + getSlotNumber());
 		String value = "???";
 		try
 		{
@@ -61,18 +63,18 @@
 				int xalanType = xobject.getType();
 				switch (xalanType)
 				{
-					case XObject.CLASS_BOOLEAN:
-					case XObject.CLASS_NUMBER:
-					case XObject.CLASS_STRING:
-					case XObject.CLASS_UNKNOWN:
-						value = xobject.toString();
+					case XObject.CLASS_UNRESOLVEDVARIABLE:
+						value = "";
 						break;
 					case XObject.CLASS_NODESET:
 						value = ((XNodeSet) xobject).xstr().toString();
 						break;
-					case XObject.CLASS_UNRESOLVEDVARIABLE:
+					case XObject.CLASS_BOOLEAN:
+					case XObject.CLASS_NUMBER:
+					case XObject.CLASS_STRING:
+					case XObject.CLASS_UNKNOWN:
 					default:
-						value = "";
+						value = xobject.toString();
 						break;
 				}
 			}
@@ -81,18 +83,27 @@
 		{
 			e.printStackTrace();
 		}
+//		value = getScope()+"."+getSlotNumber()+")"+getName();	
+		log.debug(getScope()+"."+getSlotNumber()+")"+getName() + "=" + value);
 		return value;
 	}
 
 	private XObject getXObject() throws TransformerException
 	{
-		XObject xvalue = null;
-		int index = elemVariable.getIndex();
-		int frame = varStack.getStackFrame();
+		XObject xvalue;
 		if (elemVariable.getIsTopLevel())
-			xvalue = varStack.elementAt(index);
+			xvalue = varStack.elementAt(slotNumber);
 		else
-			xvalue = varStack.getLocalVariable(index, frame);
+			xvalue = varStack.getLocalVariable(elemVariable.getIndex(), stackFrame);
 		return xvalue;
 	}
+
+	public int compareTo(Object arg0)
+	{
+		XalanVariable xvar = (XalanVariable)arg0;
+		int comp = xvar.stackFrame - stackFrame;
+		if (comp == 0)
+			comp = slotNumber - xvar.slotNumber;
+		return comp;
+	}
 }