- Allow the debugger client to attach arbitrary data to the Breakpoint, that it will get back with the suspension event. This could be the source java.io.File for example.

- DebugBreak doesn't extract the template name from the Breakpoint anymore, but uses the actual template name (they should b the same anyway). This is how it was earlier too.
diff --git a/src/main/java/freemarker/core/DebugBreak.java b/src/main/java/freemarker/core/DebugBreak.java
index c1c22b7..1de26f5 100644
--- a/src/main/java/freemarker/core/DebugBreak.java
+++ b/src/main/java/freemarker/core/DebugBreak.java
@@ -53,8 +53,8 @@
 package freemarker.core;
 
 import java.io.IOException;
+import java.io.Serializable;
 
-import freemarker.debug.Breakpoint;
 import freemarker.debug.DebuggerService;
 import freemarker.template.TemplateException;
 
@@ -64,21 +64,20 @@
 public class DebugBreak extends TemplateElement
 {
     private final DebuggerService debuggerService;    
-    private final String templateName;
+    private final Serializable data;
     
-    public DebugBreak(TemplateElement nestedBlock, DebuggerService debuggerService, Breakpoint breakpoint)
+    public DebugBreak(TemplateElement nestedBlock, DebuggerService debuggerService, Serializable data)
     {
         this.nestedBlock = nestedBlock;
         nestedBlock.parent = this;
         copyLocationFrom(nestedBlock);
         this.debuggerService = debuggerService;
-
-        this.templateName = breakpoint.getTemplateName();
+        this.data = data;   
     }
     
     protected void accept(Environment env) throws TemplateException, IOException
     {
-        if(!debuggerService.suspendEnvironment(env, templateName, nestedBlock.getBeginLine()))
+        if(!debuggerService.suspendEnvironment(env, getTemplate().getName(), nestedBlock.getBeginLine(), data))
         {
             nestedBlock.accept(env);
         }
diff --git a/src/main/java/freemarker/debug/Breakpoint.java b/src/main/java/freemarker/debug/Breakpoint.java
index d54e910..d12c7cc 100644
--- a/src/main/java/freemarker/debug/Breakpoint.java
+++ b/src/main/java/freemarker/debug/Breakpoint.java
@@ -64,16 +64,28 @@
 
     private final String templateName;
     private final int line;
+    private final Serializable data;
+
+    public Breakpoint(String templateName, int line) {
+        this(templateName, line, null);
+    }
     
     /**
      * Creates a new breakpoint.
      * @param templateName the name of the template
      * @param line the line number in the template where to put the breakpoint
+     * @param data arbitrary data attached to this breakpoint, that the debugger client will get back with the
+     *        suspension event. As this data will travel back and forth between the client and server, <b>it has to be
+     *        de-serializable on the server</b>. Also, it shouldn't be very big serialized, as it will be possibly sent
+     *        through network. So if the data is big or might not be de-serializable on another JVM (missing classes), 
+     *        the client should just use an identifier as data (like a {@link Long}) with which later it can get
+     *        the actual data that's only stored on the client.
      */
-    public Breakpoint(String templateName, int line)
+    public Breakpoint(String templateName, int line, Serializable data)
     {
         this.templateName = templateName;
         this.line = line;
+        this.data = data;
     }
 
     /**
@@ -83,6 +95,7 @@
     {
         return line;
     }
+    
     /**
      * Returns the template name of the breakpoint
      */
@@ -91,6 +104,14 @@
         return templateName;
     }
 
+    /**
+     * Returns the arbitrary data attached to this breakpoint.
+     */
+    public Serializable getData()
+    {
+        return data;
+    }
+    
     public int hashCode()
     {
         return templateName.hashCode() + 31 * line;
diff --git a/src/main/java/freemarker/debug/DebuggerService.java b/src/main/java/freemarker/debug/DebuggerService.java
index 0236f18..dd9a344 100644
--- a/src/main/java/freemarker/debug/DebuggerService.java
+++ b/src/main/java/freemarker/debug/DebuggerService.java
@@ -52,6 +52,7 @@
 
 package freemarker.debug;
 
+import java.io.Serializable;
 import java.rmi.RemoteException;
 
 import freemarker.core.Environment;
@@ -71,7 +72,7 @@
 
     void removeBreakpoint(Breakpoint breakpoint);
 
-    boolean suspendEnvironment(Environment env, String templateName, int line) throws
+    boolean suspendEnvironment(Environment env, String templateName, int line, Serializable data) throws
     RemoteException;
     
     void registerTemplate(Template template);
diff --git a/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java b/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
index 360bb66..b9bc2cc 100644
--- a/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
+++ b/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
@@ -1,5 +1,6 @@
 package freemarker.debug;
 
+import java.io.Serializable;
 import java.util.EventObject;
 
 /**
@@ -13,13 +14,15 @@
 
     private final String name;
     private final int line;
+    private final Serializable data;
     private final DebuggedEnvironment env;
 
-    public EnvironmentSuspendedEvent(Object source, String templateName, int line, DebuggedEnvironment env)
+    public EnvironmentSuspendedEvent(Object source, String templateName, int line, Serializable data, DebuggedEnvironment env)
     {
         super(source);
         this.name = templateName;
         this.line = line;
+        this.data = data;
         this.env = env;
     }
 
@@ -42,6 +45,14 @@
     {
         return line;
     }
+    
+    /**
+     * Returns the arbitrary data that the debugger clients has attached to the {@link Breakpoint};
+     * possibly {@code null}.
+     */
+    public Serializable getData() {
+        return data;
+    }
 
     /**
      * The environment that was suspended
diff --git a/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java b/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java
index c16dd98..0c55cb4 100644
--- a/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java
+++ b/src/main/java/freemarker/debug/impl/AbstractDebuggerService.java
@@ -52,6 +52,7 @@
 
 package freemarker.debug.impl;
 
+import java.io.Serializable;
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.WeakReference;
 import java.rmi.RemoteException;
@@ -110,7 +111,7 @@
         return sumlist;
     }
 
-    public boolean suspendEnvironment(Environment env, String templateName, int line)
+    public boolean suspendEnvironment(Environment env, String templateName, int line, Serializable data)
     throws
         RemoteException
     {
@@ -125,7 +126,7 @@
         try
         {
             EnvironmentSuspendedEvent breakpointEvent = 
-                new EnvironmentSuspendedEvent(this, templateName, line, denv);
+                new EnvironmentSuspendedEvent(this, templateName, line, data, denv);
     
             synchronized(listeners)
             {
@@ -235,7 +236,7 @@
             return;
         }
         TemplateElement parent = (TemplateElement)te.getParent();
-        DebugBreak db = new DebugBreak(te, this, breakpoint);   
+        DebugBreak db = new DebugBreak(te, this, breakpoint.getData());   
         // TODO: Ensure there always is a parent by making sure
         // that the root element in the template is always a MixedContent
         // Also make sure it doesn't conflict with anyone's code.