* TImur debugger contributions applied.
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml b/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml
index 4c7507c..db46021 100644
--- a/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml
+++ b/core/plugins/org.eclipse.dltk.debug.ui/plugin.xml
@@ -6,6 +6,7 @@
 	<extension-point id="interpreterInstallTypePage"
 		name="%interpreterInstallTypePage"
 		schema="schema/interpreterInstallTypePage.exsd" />
+ <extension-point id="scriptDetailFormatter" name="scriptDetailFormatter" schema="schema/scriptDetailFormatter.exsd"/>
 
 	<!-- Extensions -->
 
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/schema/scriptDetailFormatter.exsd b/core/plugins/org.eclipse.dltk.debug.ui/schema/scriptDetailFormatter.exsd
new file mode 100644
index 0000000..6cb1669
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/schema/scriptDetailFormatter.exsd
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.dltk.debug.ui">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.dltk.debug.ui" id="scriptDetailFormatter" name="scriptDetailFormatter"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="detailFormatter" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="detailFormatter">
+      <annotation>
+         <appInfo>
+            <meta.element labelAttribute="type"/>
+         </appInfo>
+      </annotation>
+      <complexType>
+         <attribute name="type" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="nature" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="snippet" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java
index 83cba82..dfe4bb3 100644
--- a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptDebugModelPresentation.java
@@ -21,6 +21,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
 import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.model.IDebugElement;
@@ -42,6 +43,7 @@
 import org.eclipse.dltk.debug.core.model.IScriptWatchpoint;
 import org.eclipse.dltk.debug.ui.breakpoints.BreakpointUtils;
 import org.eclipse.dltk.internal.debug.ui.ExternalFileEditorInput;
+import org.eclipse.dltk.internal.debug.ui.ScriptDetailFormattersManager;
 import org.eclipse.dltk.internal.debug.ui.ScriptEvaluationContextManager;
 import org.eclipse.dltk.internal.ui.editor.ExternalStorageEditorInput;
 import org.eclipse.dltk.launching.DebuggingEngineRunner;
@@ -229,11 +231,11 @@
 	public String getVariableText(IScriptVariable variable) {
 		try {
 			String name = variable.getName();
-
-			if (!variable.hasChildren()) {
-				String value = variable.getValueString();
-				if (value != null && value.length() > 0) {
-					return name + " = " + value;
+			IScriptValue value = (IScriptValue) variable.getValue();			
+			if (value != null) {
+				String valueText = getValueText(value);
+				if (valueText != null && valueText.length() > 0) {
+					return name + " = " + valueText;
 				}
 			}
 
@@ -245,6 +247,19 @@
 		return variable.toString();
 	}
 
+	protected String getValueText(IScriptValue value) {
+		try {
+			return value.getValueString();
+		} catch (DebugException e) {
+			DebugPlugin.log(e);
+		}
+		return value.toString();
+	}
+
+	protected String renderUnknownValue(IScriptValue value) throws DebugException {
+		return value.getValueString();
+	}
+
 	protected String getBreakpointText(IScriptBreakpoint breakpoint) {
 		try {
 			StringBuffer sb = new StringBuffer();
@@ -291,21 +306,17 @@
 	protected String getExpressionText(IExpression expression) {
 		final String expressionText = expression.getExpressionText();
 
-		try {
-			if (expression instanceof IErrorReportingExpression) {
-				IErrorReportingExpression errorExpression = (IErrorReportingExpression) expression;
-				if (errorExpression.hasErrors()) {
-					return expressionText;
-				}
+		if (expression instanceof IErrorReportingExpression) {
+			IErrorReportingExpression errorExpression = (IErrorReportingExpression) expression;
+			if (errorExpression.hasErrors()) {
+				return expressionText;
 			}
+		}
 
-			IScriptValue value = (IScriptValue) expression.getValue();
-			if (value != null) {
-				return MessageFormat.format("{0} = {1}", new Object[] {
-						expressionText, value.getValueString() });
-			}
-		} catch (DebugException e) {
-			DLTKDebugUIPlugin.log(e);
+		IScriptValue value = (IScriptValue) expression.getValue();
+		if (value != null) {
+			return MessageFormat.format("{0} = {1}", new Object[] {
+					expressionText, getValueText(value) });
 		}
 
 		return expressionText;
@@ -322,6 +333,8 @@
 			return getStackFrameText((IScriptStackFrame) element);
 		} else if (element instanceof IScriptVariable) {
 			return getVariableText((IScriptVariable) element);
+		} else if (element instanceof IScriptValue) {
+			return getValueText((IScriptValue) element);
 		} else if (element instanceof IExpression) {
 			return getExpressionText((IExpression) element);
 		}
@@ -331,10 +344,13 @@
 
 	// Details
 	public void computeDetail(IValue value, IValueDetailListener listener) {
-		try {
-			listener.detailComputed(value, value.getValueString());
-		} catch (DebugException e) {
-			e.printStackTrace();
+		IScriptDebugTarget target = (IScriptDebugTarget)value.getDebugTarget();
+		IScriptThread thread = getEvaluationThread(target);
+		if (thread == null) {
+			listener.detailComputed(value, getValueText((IScriptValue) value)); 
+		} else {
+			String natureId = target.getLanguageToolkit().getNatureId();
+			ScriptDetailFormattersManager.getDefault(natureId).computeValueDetail((IScriptValue)value, thread, listener);
 		}
 	}
 
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptWatchExpressionFilter.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptWatchExpressionFilter.java
index bd633ec..9e26136 100644
--- a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptWatchExpressionFilter.java
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/ScriptWatchExpressionFilter.java
@@ -3,7 +3,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.model.IVariable;
 import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapterExtension;
-import org.eclipse.dltk.debug.core.model.IScriptVariable;
+import org.eclipse.dltk.debug.core.model.IScriptValue;
 
 public class ScriptWatchExpressionFilter implements
 		IWatchExpressionFactoryAdapterExtension {
@@ -14,7 +14,7 @@
 
 	public String createWatchExpression(IVariable variable)
 			throws CoreException {
-		IScriptVariable v = (IScriptVariable) variable;
+		IScriptValue v = (IScriptValue) variable.getValue();
 		return v.getEvalName();
 	}
 }
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowClassVariablesActionDelegate.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowClassVariablesActionDelegate.java
index 244beea..54bca87 100644
--- a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowClassVariablesActionDelegate.java
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowClassVariablesActionDelegate.java
@@ -24,11 +24,8 @@
 				DebugPreferenceConstants.PREF_DBGP_SHOW_SCOPE_CLASS);
 		getPrefs().setValue(
 				DebugPreferenceConstants.PREF_DBGP_SHOW_SCOPE_CLASS, !value);
-
 	}
 
 	public void selectionChanged(IAction action, ISelection selection) {
-		action.setChecked(getPrefs().getBoolean(
-				DebugPreferenceConstants.PREF_DBGP_SHOW_SCOPE_CLASS));
 	}
 }
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowGlobalVariablesActionDelegate.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowGlobalVariablesActionDelegate.java
index df50576..844ac79 100644
--- a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowGlobalVariablesActionDelegate.java
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/debug/ui/actions/ToggleShowGlobalVariablesActionDelegate.java
@@ -16,7 +16,6 @@
 	}
 
 	public void init(IViewPart view) {
-
 	}
 
 	public void run(IAction action) {
@@ -27,7 +26,5 @@
 	}
 
 	public void selectionChanged(IAction action, ISelection selection) {
-		action.setChecked(!getPrefs().getBoolean(
-				DebugPreferenceConstants.PREF_DBGP_SHOW_SCOPE_GLOBAL));
-	}
+	}	
 }
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DetailFormatter.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DetailFormatter.java
new file mode 100644
index 0000000..de8c904
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/DetailFormatter.java
@@ -0,0 +1,82 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+/**
+ * Information about a detail formatter.
+ */
+public class DetailFormatter implements Comparable {
+	
+	private boolean fEnabled;
+	
+	private String fTypeName;
+	
+	private String fSnippet;
+	
+	public DetailFormatter(String typeName, String snippet, boolean enabled) {
+		fTypeName= typeName;
+		fSnippet= snippet;
+		fEnabled= enabled;
+	}
+	
+	/**
+	 * Indicate if this pretty should be used or not.
+	 * @return boolean
+	 */
+	public boolean isEnabled() {
+		return fEnabled;
+	}
+
+	/**
+	 * Returns the code snippet.
+	 * @return String
+	 */
+	public String getSnippet() {
+		return fSnippet;
+	}
+
+	/**
+	 * Returns the type name.
+	 * @return String
+	 */
+	public String getTypeName() {
+		return fTypeName;
+	}
+
+	/**
+	 * Sets the enabled flag.
+	 * @param enabled the new value of the flag
+	 */
+	public void setEnabled(boolean enabled) {
+		fEnabled= enabled;
+	}
+
+	/**
+	 * Sets the code snippet.
+	 * @param snippet the snippet to set
+	 */
+	public void setSnippet(String snippet) {
+		fSnippet= snippet;
+	}
+
+	/**
+	 * Sets the type name.
+	 * @param typeName the type name to set
+	 */
+	public void setTypeName(String typeName) {
+		fTypeName= typeName;
+	}
+
+	/**
+	 * @see java.lang.Comparable#compareTo(java.lang.Object)
+	 */
+	public int compareTo(Object another) {
+		DetailFormatter detailFormatter= (DetailFormatter)another;
+		if (fTypeName == null) {
+			if (detailFormatter.fTypeName == null) {
+				return 0;
+			}
+			return detailFormatter.fTypeName.compareTo(fTypeName);
+		}
+		return fTypeName.compareTo(detailFormatter.fTypeName);
+	}
+
+}
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugHover.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugHover.java
index 428c7c0..a479d10 100644
--- a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugHover.java
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDebugHover.java
@@ -104,7 +104,7 @@
 						IScriptEvaluationEngine engine = ((IScriptThread) frame
 								.getThread()).getEvaluationEngine();
 						IScriptEvaluationResult result = engine.syncEvaluate(
-								snippet, null);
+								snippet, frame);
 
 						if (result != null) {
 							return getResultText(result);
@@ -192,18 +192,13 @@
 
 	protected String getResultText(IScriptEvaluationResult result)
 			throws DebugException {
-		// TODO: make with string constnants and patterns
 		IScriptValue value = result.getValue();
-
-		String str = value == null ? "Can't evaluate hover" : value
-				.getValueString();
-
+		String str = getModelPresentation().getText(value);
 		return prepareHtml(result.getSnippet() + " = " + str);
 	}
 
 	protected String getVariableText(IVariable variable) throws DebugException {
-		return prepareHtml(variable.getName() + " = "
-				+ variable.getValue().getValueString());
+		return prepareHtml(getModelPresentation().getText(variable));
 	}
 
 	protected String prepareHtml(String text) {
diff --git a/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDetailFormattersManager.java b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDetailFormattersManager.java
new file mode 100644
index 0000000..836e468
--- /dev/null
+++ b/core/plugins/org.eclipse.dltk.debug.ui/src/org/eclipse/dltk/internal/debug/ui/ScriptDetailFormattersManager.java
@@ -0,0 +1,139 @@
+package org.eclipse.dltk.internal.debug.ui;
+
+import java.util.HashMap;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.ui.IValueDetailListener;
+import org.eclipse.dltk.core.SimpleDLTKExtensionManager;
+import org.eclipse.dltk.core.SimpleDLTKExtensionManager.ElementInfo;
+import org.eclipse.dltk.debug.core.eval.IScriptEvaluationCommand;
+import org.eclipse.dltk.debug.core.eval.IScriptEvaluationListener;
+import org.eclipse.dltk.debug.core.eval.IScriptEvaluationResult;
+import org.eclipse.dltk.debug.core.model.IScriptThread;
+import org.eclipse.dltk.debug.core.model.IScriptValue;
+import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
+
+public class ScriptDetailFormattersManager {
+	private static final String DEFAULT_FORMATTER_TYPE = "#DEFAULT#";
+	private static final String ATTR_SNIPPET = "snippet";
+	private static final String ATTR_TYPE = "type";
+	private static final String ATTR_NATURE = "nature";
+	private static final String SCRIPT_DETAIL_FORMATTER_EXTENSION = DLTKDebugUIPlugin.PLUGIN_ID
+			+ ".scriptDetailFormatter";
+
+	private static HashMap managerInstances = new HashMap();
+	private static final String CANNOT_EVALUATE = "Can't evaluate details.";
+	private HashMap formatters = new HashMap();
+	private DetailFormatter defaultFormatter = null;
+
+	/**
+	 * Return the default detail formatters manager.
+	 * 
+	 * @param natureId
+	 * 
+	 * @return default detail formatters manager.
+	 */
+	static public ScriptDetailFormattersManager getDefault(String natureId) {
+		ScriptDetailFormattersManager instance = (ScriptDetailFormattersManager) managerInstances
+				.get(natureId);
+		if (instance == null) {
+			instance = new ScriptDetailFormattersManager(natureId);
+			managerInstances.put(natureId, instance);
+		}
+		return instance;
+	}
+
+	public ScriptDetailFormattersManager(String natureId) {
+		populateDetailFormatters(natureId);
+	}
+
+	private void populateDetailFormatters(String natureId) {
+		SimpleDLTKExtensionManager manager = new SimpleDLTKExtensionManager(
+				SCRIPT_DETAIL_FORMATTER_EXTENSION);
+		ElementInfo[] infos = manager.getElementInfos();
+		for (int i = 0; i < infos.length; i++) {
+			IConfigurationElement config = infos[i].getConfig();
+			String nature = config.getAttribute(ATTR_NATURE);
+			if (natureId.equals(nature)) {
+				String code = config.getAttribute(ATTR_SNIPPET);
+				String type = config.getAttribute(ATTR_TYPE);
+				DetailFormatter formatter = new DetailFormatter(type, code,
+						true);
+				if (DEFAULT_FORMATTER_TYPE.equals(type)) {
+					setDefaultFormatter(formatter);
+				} else {
+					addFormatter(formatter);
+				}
+			}
+		}
+	}
+
+	private String getValueText(IValue value) {
+		try {
+			return value.getValueString();
+		} catch (DebugException e) {
+			return e.getMessage();
+		}
+	}
+
+	public void computeValueDetail(final IScriptValue value,
+			final IScriptThread thread, final IValueDetailListener listener) {
+		Runnable postEventDispatch = new Runnable() {
+			public void run() {
+				DetailFormatter formatter = getDetailFormatter(value);
+				if (thread == null || !thread.isSuspended()
+						|| formatter == null || !formatter.isEnabled()) {
+					listener.detailComputed(value, getValueText(value));
+				} else {
+					final IScriptEvaluationCommand command = value
+							.createEvaluationCommand(formatter.getSnippet(),
+									thread);
+
+					command.asyncEvaluate(new IScriptEvaluationListener() {
+						public void evaluationComplete(
+								IScriptEvaluationResult result) {
+							if (result == null)
+								return;
+
+							IScriptValue resultValue = result.getValue();
+							if (resultValue != null) {
+								listener.detailComputed(value,
+										getValueText(resultValue));
+							} else {
+								listener.detailComputed(value, CANNOT_EVALUATE);
+							}
+						}
+					});
+				}
+			}
+		};
+		DebugPlugin.getDefault().asyncExec(postEventDispatch);
+	}
+
+	protected DetailFormatter getDetailFormatter(IScriptValue value) {
+		DetailFormatter formatter = (DetailFormatter) formatters.get(value
+				.getType().getName());
+		if (formatter == null)
+			formatter = getDefaultFormatter();
+		return formatter;
+	}
+
+	private DetailFormatter getDefaultFormatter() {
+		return defaultFormatter;
+	}
+
+	public void setDefaultFormatter(DetailFormatter formatter) {
+		defaultFormatter = formatter;
+	}
+
+	public void addFormatter(DetailFormatter formatter) {
+		formatters.put(formatter.getTypeName(), formatter);
+	}
+
+	public void removeFormatter(DetailFormatter formatter) {
+		formatters.remove(formatter.getTypeName());
+	}
+}