You are viewing a plain text version of this content. The canonical link for it is here.
Posted to devnull@infra.apache.org by vl...@apache.org on 2019/06/08 18:41:56 UTC

[jmeter] annotated tag v2_1_1 created (now 5d24b3f)

This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a change to annotated tag v2_1_1
in repository https://gitbox.apache.org/repos/asf/jmeter.git.


      at 5d24b3f  (tag)
 tagging 63fd729433c2fd806473242c3c6e0d4d1f34c981 (commit)
      by Sebastian Bazley
      on Tue Nov 1 21:24:22 2011 +0000

- Log -----------------------------------------------------------------
v2_1_1
-----------------------------------------------------------------------

This annotated tag includes the following new commits:

     new 7e06299  This commit was manufactured by cvs2svn to create tag 'v2_1_1'.
     new 63fd729  JMeter TLP move

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[jmeter] 01/02: This commit was manufactured by cvs2svn to create tag 'v2_1_1'.

Posted by vl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to annotated tag v2_1_1
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit 7e06299f3e745d6fcb278f36f2556e8bb028416c
Author: No Author <de...@apache.org>
AuthorDate: Sun Oct 2 01:12:31 2005 +0000

    This commit was manufactured by cvs2svn to create tag 'v2_1_1'.
    
    git-svn-id: https://svn.apache.org/repos/asf/jakarta/jmeter/tags/v2_1_1@325810 13f79535-47bb-0310-9956-ffa450edef68
    
    Former-commit-id: f80b1a47a17d0b709d988d9cbbe9d35c1fdf89ad
---
 INSTALLING                                         |   16 -
 KEYS.txt                                           |   17 +
 NOTICE                                             |    2 +
 bin/jmeter.properties                              |    6 +-
 bin/testfiles/.cvsignore                           |    1 +
 bin/testfiles/GuiTest203.jmx                       | 1266 ++++++++++++++++++++
 bin/upgrade.properties                             |   45 +-
 build.xml                                          |  112 +-
 eclipse.classpath                                  |    5 +-
 legacy/LICENSE(jdom).txt                           |   56 +
 lib/LICENSE(jCharts).txt                           |   44 +
 lib/jar_usage.txt                                  |    6 +-
 .../org/apache/jmeter/config/CSVDataSet.java       |    2 +-
 .../apache/jmeter/control/IncludeController.java   |  128 ++
 .../apache/jmeter/control/ModuleController.java    |   21 +-
 .../jmeter/control/gui/IncludeControllerGui.java   |  145 +++
 .../org/apache/jmeter/visualizers/AxisGraph.java   |  142 +++
 .../org/apache/jmeter/visualizers/Graph.java       |    8 +-
 .../jmeter/visualizers/StatGraphVisualizer.java    |  360 ++++++
 src/core/org/apache/jmeter/DynamicClassLoader.java |   65 +
 src/core/org/apache/jmeter/JMeter.java             |   33 +-
 src/core/org/apache/jmeter/NewDriver.java          |   22 +-
 src/core/org/apache/jmeter/config/Argument.java    |    3 +
 src/core/org/apache/jmeter/config/Arguments.java   |    3 +
 .../jmeter/control/ReplaceableController.java      |   10 +-
 .../org/apache/jmeter/control/gui/TestPlanGui.java |   13 +-
 src/core/org/apache/jmeter/engine/PreCompiler.java |   20 +-
 .../apache/jmeter/engine/StandardJMeterEngine.java |   23 +-
 .../apache/jmeter/engine/util/ValueReplacer.java   |    4 +-
 src/core/org/apache/jmeter/gui/GuiPackage.java     |    6 +
 .../org/apache/jmeter/gui/SavePropertyDialog.java  |    2 +-
 .../apache/jmeter/gui/action/AbstractAction.java   |   12 +-
 .../org/apache/jmeter/gui/util/FileListPanel.java  |  217 ++++
 .../org/apache/jmeter/gui/util/MenuFactory.java    |    5 +-
 src/core/org/apache/jmeter/junit/JMeterTest.java   |   15 +-
 .../apache/jmeter/reporters/ResultCollector.java   |    2 +-
 .../org/apache/jmeter/reporters/Summariser.java    |   37 +-
 .../apache/jmeter/resources/messages.properties    |   37 +-
 .../jmeter/samplers/SampleSaveConfiguration.java   |   10 +
 .../org/apache/jmeter/save/OldSaveService.java     |  105 +-
 src/core/org/apache/jmeter/save/SaveService.java   |   22 +-
 .../org/apache/jmeter/services/FileServer.java     |    6 +-
 .../apache/jmeter/testbeans/gui/PackageTest.java   |    8 +-
 .../apache/jmeter/testbeans/gui/TestBeanGUI.java   |   27 +-
 .../org/apache/jmeter/testelement/TestPlan.java    |   67 +-
 .../apache/jmeter/testelement/ThreadListener.java  |   43 +
 .../testelement/property/FunctionProperty.java     |    5 +-
 .../apache/jmeter/threads/gui/ThreadGroupGui.java  |    2 +-
 src/core/org/apache/jmeter/util/JMeterVersion.java |    2 +-
 src/core/org/apache/jmeter/util/NameUpdater.java   |   18 +
 .../jmeter/util/keystore/PKCS12KeyStore.java       |  135 ---
 .../jmeter/visualizers/SamplingStatCalculator.java |   72 +-
 .../jorphan/collections/ConfigurationTree.java     |    8 +-
 .../org/apache/jorphan/gui/ObjectTableModel.java   |    8 +-
 src/jorphan/org/apache/jorphan/util/Converter.java |    9 +-
 .../org/apache/jorphan/util/JOrphanUtils.java      |   74 +-
 .../protocol/java/control/gui/ClassFilter.java     |   80 ++
 .../java/control/gui/JUnitTestSamplerGui.java      |  388 ++++++
 .../jmeter/protocol/java/sampler/JUnitSampler.java |  506 ++++++++
 .../http/control/gui/HttpTestSampleGui2.java       |    7 +-
 .../http/control/gui/WebServiceSamplerGui.java     |    9 +-
 .../protocol/http/parser/HtmlParserHTMLParser.java |    9 +-
 .../protocol/http/parser/JTidyHTMLParser.java      |    2 +-
 .../protocol/http/sampler/AccessLogSampler.java    |   23 +-
 .../jmeter/protocol/http/sampler/HTTPSampler2.java |    4 +-
 .../protocol/http/sampler/WebServiceSampler.java   |   31 +-
 .../protocol/http/util/accesslog/Filter.java       |    4 +-
 .../protocol/http/util/accesslog/LogFilter.java    |   13 +-
 .../util/accesslog/OrderPreservingLogParser.java   |   27 +
 .../http/util/accesslog/SessionFilter.java         |  130 +-
 .../http/util/accesslog/SharedTCLogParser.java     |   93 ++
 .../protocol/http/util/accesslog/TCLogParser.java  |    2 +-
 .../protocol/java/control/gui/BSFSamplerGui.java   |    2 +
 .../protocol/jdbc/config/DataSourceElement.java    |    3 +
 .../jmeter/protocol/jdbc/sampler/JDBCSampler.java  |   18 +-
 .../protocol/jdbc/sampler/JDBCSamplerBeanInfo.java |    8 +-
 .../jdbc/sampler/JDBCSamplerResources.properties   |    4 +-
 .../sampler/JDBCSamplerResources_es.properties     |    4 +-
 .../jmeter/protocol/tcp/sampler/TCPSampler.java    |  119 +-
 .../org/apache/jmeter/save/TestSaveService.java    |   14 +-
 .../org/apache/jorphan/util/TestJorphanUtils.java  |   81 ++
 xdocs/changes.xml                                  |   27 +-
 xdocs/stylesheets/project.xml                      |    6 +
 xdocs/usermanual/build-monitor-test-plan.xml       |    2 +-
 xdocs/usermanual/build-ws-test-plan.xml            |    2 +-
 xdocs/usermanual/component_reference.xml           |  160 ++-
 xdocs/usermanual/functions.xml                     |   48 +-
 xdocs/usermanual/get-started.xml                   |   13 +-
 .../jmeter_distributed_testing_step_by_step.sxw    |  Bin 39165 -> 49185 bytes
 xdocs/usermanual/junitsampler_tutorial.sxw         |  Bin 0 -> 20262 bytes
 90 files changed, 4734 insertions(+), 637 deletions(-)

diff --git a/INSTALLING b/INSTALLING
deleted file mode 100644
index 81fad0d..0000000
--- a/INSTALLING
+++ /dev/null
@@ -1,16 +0,0 @@
-Installing Apache JMeter
-
-JMeter is distributed as a set of zip (or tar or tar-gz) archive files.
-
-The files are called:
-
-jakarta-jmeter-<version>_bin.zip - JMeter binaries
-jakarta-jmeter-<version>_lib.zip - 3rd party jar files
-jakarta-jmeter-<version>_src.zip - JMeter source
-jakarta-jmeter-<version>_api.zip - JMeter Javadoc
-
-Installing JMeter runtime:
-Download the _bin and _lib files
-Unpack the archives into the same directory structure
-
-The other archives are not needed to run JMeter.
\ No newline at end of file
diff --git a/KEYS.txt b/KEYS.txt
index a2d7bea..f188ea3 100644
--- a/KEYS.txt
+++ b/KEYS.txt
@@ -113,3 +113,20 @@ LY8FCQXcYNsACgkQP+DBYbypc6yBbwCeOvnv0jFl9vF0s8xhSAoL//sVh+AAni2E
 MqhkiC8tJZdEK9EAd9T0HkeT
 =Y6NQ
 -----END PGP PUBLIC KEY BLOCK-----
+
+key for: Peter Lin <wo...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (MingW32)
+
+mIsEQvwEgAEEALtlIFI5TYGenY7iQhhoU26lca2z7PTIGlCZ3eAPxjQNek/oCEPR
+nl39NtNKjEo4V2eJPrZz4nlA2pUxwkzVWGe9yULQT73mB0pkQxr40iH2vIdpkW3y
+CV3NymyH77XrvELhQrnLpK1pbzMdPTnpr04Wq4BCysEcGzJJT7mlIDiBAAYptDtQ
+ZXRlciBMaW4gKFBldGVyIExpbiBKTWV0ZXIgY29tbWl0dGVyKSA8d29vbGZlbEBh
+cGFjaGUub3JnPoi8BBMBAgAmBQJC/ASAAhsDBQkDwmcABgsJCAcDAgQVAggDBBYC
+AwECHgECF4AACgkQlell0l24rA970wP/WhOKLRrpF8IrjgpZsJ4X7CpdOhRQRfXd
+8u7TxhdxTRom6XFW14LyUH9i7teRB3RC8F809jFwfmR2oa4fhNhv36QkXQI9npmS
+gebbL9RMq3mjdXwtpDYbcA4r2pbz+Wf2m+BV38Gz8k+WOm5X8QW3sRbZ1QnxUjTu
+NGHyeqz14hs=
+=rMW+
+-----END PGP PUBLIC KEY BLOCK-----
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
index 9a7202d..1fbae00 100644
--- a/NOTICE
+++ b/NOTICE
@@ -37,3 +37,5 @@ Derrick Oswald is the current lead developer and was kind
 enough to assist JMeter.
 ===============
 
+This product includes software developed by the jCharts Project.
+See http://jcharts.sourceforge.net/
\ No newline at end of file
diff --git a/bin/jmeter.properties b/bin/jmeter.properties
index 16fdbb5..defb5a8 100644
--- a/bin/jmeter.properties
+++ b/bin/jmeter.properties
@@ -356,4 +356,8 @@ upgrade_properties=/bin/upgrade.properties
 #jmeterthread.startearlier=false
 
 # Change default port used by server (need to start rmiregistry with same port)
-#server.rmi.port=1099
\ No newline at end of file
+#server.rmi.port=1099
+
+# Users can define additional classpath items by setting the property below
+# Paths with spaces may cause problems for the JVM
+#user.classpath=../classes;../jars/jar1.jar
\ No newline at end of file
diff --git a/bin/testfiles/.cvsignore b/bin/testfiles/.cvsignore
index 13eedd7..22d6884 100644
--- a/bin/testfiles/.cvsignore
+++ b/bin/testfiles/.cvsignore
@@ -1 +1,2 @@
 configurationTest.xml
+*.jmx.out
diff --git a/bin/testfiles/GuiTest203.jmx b/bin/testfiles/GuiTest203.jmx
new file mode 100644
index 0000000..73e0970
--- /dev/null
+++ b/bin/testfiles/GuiTest203.jmx
@@ -0,0 +1,1266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node>
+<testelement class="org.apache.jmeter.testelement.TestPlan">
+<collection class="java.util.LinkedList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="TestPlan.thread_groups"/>
+<testelement class="org.apache.jmeter.config.Arguments" name="TestPlan.user_defined_variables">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.ArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.config.Argument" name="server">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">jakarta.apache.org</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">server</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="server">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">jakarta.apache.org</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">server</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">User Defined Variables</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.TestPlanGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestPlan.serialize_threadgroups">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.testelement.TestPlan</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Test Plan</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestPlan.functional_mode">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestPlan.comments"/>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Main</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Assertions</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.assertions.ResponseAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.AssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.ResponseAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Response Assertion</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Asserion.test_strings">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="PAT1">PAT1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="PAT2">PAT2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="PAT3">PAT3</property>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Assertion.test_field">Assertion.response_data</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Assertion.assume_success">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="Assertion.test_type">2</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.BeanShellAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BeanShellAssertion.filename">bsh.bsh</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.BeanShellAssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.BeanShellAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BeanShellAssertion.parameters">bsh1 bhs2 bsh3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">BeanShell Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BeanShellAssertion.query">// Script</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.DurationAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.DurationAssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.DurationAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Duration Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="DurationAssertion.duration">1234</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.HTMLAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="html_assertion_filename">HTMLAssert.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.HTMLAssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.HTMLAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTML Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="html_assertion_warning_threshold">3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="html_assertion_errorsonly">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="html_assertion_error_threshold">5</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="html_assertion_doctype">omit</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="html_assertion_format">0</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.MD5HexAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.MD5HexAssertionGUI</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.MD5HexAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">MD5Hex Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MD5HexAssertion.size">0011223344556677889900aabbccddeeff</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.SizeAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.SizeAssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="SizeAssertion.operator">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.SizeAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Size Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="SizeAssertion.size">123</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.XMLAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.XMLAssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.XMLAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">XML Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.assertions.XPathAssertion">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="XPath.validate">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="XPath.whitespace">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.assertions.gui.XPathAssertionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="XPath.tolerant">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="XPath.xpath">/</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.assertions.XPathAssertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="XPath.negate">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">XPath Assertion</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="XPath.namespace">true</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Controllers</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.control.InterleaveControl">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.InterleaveControlGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.InterleaveControl</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Interleave Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="InterleaveControl.style">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.ModuleController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.ModuleControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.ModuleController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">ModuleController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<collection class="java.util.Vector" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="ModuleController.node_path">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WorkBench">WorkBench</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Test Plan">Test Plan</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Main">Main</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Assertions">Assertions</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Assertions">Assertions</property>
+</collection>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.OnceOnlyController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.OnceOnlyControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.OnceOnlyController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Once Only Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.RandomController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.RandomControlGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.RandomController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Random Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="InterleaveControl.style">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.ThroughputController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.ThroughputControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="ThroughputController.style">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.ThroughputController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Throughput Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.FloatProperty" name="ThroughputController.percentThroughput">100.0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThroughputController.perThread">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="ThroughputController.maxThroughput">1</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.IfController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="IfController.condition">${__threadNum()} == 3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.IfControllerPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.IfController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">If Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.ForeachController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ForeachController.inputVal">ForIn</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.ForeachControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ForeachController.returnVal">ForOut</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.ForeachController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">ForEach Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ForeachController.useSeparator">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.LoopController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="LoopController.loops">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.RandomOrderController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.RandomOrderControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.RandomOrderController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Random Order Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.RunTime">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.RunTimeGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.RunTime</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Runtime Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RunTime.seconds">1</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.SwitchController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.SwitchControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.SwitchController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Switch Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="InterleaveControl.style">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="SwitchController.value">${switch}</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.TransactionController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.TransactionControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.TransactionController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Transaction Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.WhileController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.WhileControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.WhileController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">While Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WhileController.condition">LAST</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.control.RecordingController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.control.gui.RecordController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.control.RecordingController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Recording Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Post Processors</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.extractor.RegexExtractor">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RegexExtractor.default">DEFAULT</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.extractor.gui.RegexExtractorGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.extractor.RegexExtractor</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RegexExtractor.regex">REGEX</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Regular Expression Extractor</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RegexExtractor.useHeaders">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RegexExtractor.template">TEMPLATE</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RegexExtractor.match_number">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RegexExtractor.refname">REREF</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultAction">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.reporters.gui.ResultActionGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultAction</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Result Status Action Handler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="OnError.action">1</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultSaver">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="FileSaver.filename">SaveResponse</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.reporters.gui.ResultSaverGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultSaver</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Save Responses to a file</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="FileSaver.errorsonly">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.Summariser">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.reporters.gui.SummariserGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.Summariser</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Generate Summary Results</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Pre Processors</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.modifiers.CounterConfig">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.modifiers.gui.CounterConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="CounterConfig.start">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="CounterConfig.incr">2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.modifiers.CounterConfig</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="CounterConfig.name">COUNTER</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Counter Config</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="CounterConfig.per_user">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="CounterConfig.end">3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.modifiers.UserParameters">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.modifiers.gui.UserParametersGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.modifiers.UserParameters</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">User Parameters</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="UserParameters.names">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="username">username</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="password">password</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="category">category</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="color">color</property>
+</collection>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="UserParameters.thread_values">
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="-1599762143">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="user1">user1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="pass1">pass1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="cat1">cat1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="red">red</property>
+</collection>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="2144649063">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="user2">user2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="pass2">pass2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="cat2">cat2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="green">green</property>
+</collection>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="-1601708465">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="user3">user3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="pass3">pass3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="cat3">cat3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name=""/>
+</collection>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="UserParameters.per_iteration">true</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Timers</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.timers.ConstantThroughputTimer">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.testbeans.gui.TestBeanGUI</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.timers.ConstantThroughputTimer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="throughput">60</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Constant Throughput Timer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.timers.ConstantTimer">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.timers.gui.ConstantTimerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.timers.ConstantTimer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Constant Timer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConstantTimer.delay">300</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.timers.GaussianRandomTimer">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.timers.gui.GaussianRandomTimerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.timers.GaussianRandomTimer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Gaussian Random Timer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RandomTimer.range">100.0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConstantTimer.delay">300</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.timers.UniformRandomTimer">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.timers.gui.UniformRandomTimerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.timers.UniformRandomTimer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Uniform Random Timer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="RandomTimer.range">100.0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConstantTimer.delay">300</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Config</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.LoginConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Login Config Element</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.username">User</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.password">Pass</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.SimpleConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Simple Config Element</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.control.GenericController">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LogicControllerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.GenericController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Listeners</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.AssertionVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Assertion Results</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">Assertions.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.GraphAccumVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Graph Full Results</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">GraphFull.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.GraphVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Graph Results</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">GraphResults.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.MonitorHealthVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Monitor Results</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.MailerResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.MailerVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.MailerResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Mailer Visualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">mailer.txt</property>
+<testelement class="org.apache.jmeter.reporters.MailerModel" name="MailerResultCollector.mailer_model">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.addressie">recipient@server.de</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.successSubject">Test succeeded</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.fromAddress">sender@host.com</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.smtpHost">smtphost.co.uk</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.failureSubject">Test failed</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.successLimit">2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="MailerModel.failureLimit">2</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.SimpleDataWriter</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Simple Data Writer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">Simple.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.SplineVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Spline Visualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">Spline.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.StatVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Aggregate Report</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">Aggregate.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.TableVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">View Results in Table</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">ViewTable.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.reporters.ResultCollector">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.visualizers.ViewResultsFullVisualizer</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.reporters.ResultCollector</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">View Results Tree</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="filename">ViewTree.txt</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ResultCollector.error_logging">false</property>
+</testelement>
+</node>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Protocol: FTP</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="FTPSampler.server">C server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.ftp.config.gui.FtpConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">FTP Config</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="FTPSampler.filename">C file</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.ftp.sampler.FTPSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="FTPSampler.server">S server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.ftp.control.gui.FtpTestSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.ftp.sampler.FTPSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">FTP Test Sampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="FTPSampler.filename">S file</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.username">S user</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.password">S pass</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Protocol: HTTP</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.config.gui.HttpDefaultsGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.path">C path</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP Request Defaults</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.domain">C server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.protocol">C protocol</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.port">C port</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="HTTPsampler.Arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.protocol.http.util.HTTPArgument" name="C_name">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">C_value</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPArgument.use_equals">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">C_name</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPArgument.always_encode">false</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Argument List</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.control.AuthManager">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.gui.AuthPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.control.AuthManager</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP Authorization Manager</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="AuthManager.auth_list">
+<testelement class="org.apache.jmeter.protocol.http.control.Authorization" name="">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Authorization.url">C_base</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Authorization.password">C_Pass</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Authorization.username">C_user</property>
+</testelement>
+</collection>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.control.CookieManager">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.gui.CookiePanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.control.CookieManager</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP Cookie Manager</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="CookieManager.clearEachIteration">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="CookieManager.cookies">
+<testelement class="org.apache.jmeter.protocol.http.control.Cookie" name="C_name">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Cookie.path">C_Path</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">C_name</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="Cookie.secure">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Cookie.domain">C_domain</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Cookie.value">C_value</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="Cookie.expires">1111</property>
+</testelement>
+</collection>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.control.HeaderManager">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.gui.HeaderPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.control.HeaderManager</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP Header Manager</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="HeaderManager.headers">
+<testelement class="org.apache.jmeter.protocol.http.control.Header" name="">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Header.value">Header_value</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Header_name</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.modifier.AnchorModifier">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.modifier.gui.AnchorModifierGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.modifier.AnchorModifier</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTML Link Parser</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.modifier.ParamModifier">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.modifier.gui.ParamModifierGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.modifier.ParamModifier</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTML Parameter Mask</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<testelement class="org.apache.jmeter.protocol.http.modifier.ParamMask" name="ParamModifier.mask">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ParamModifier.upper_bound">10</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ParamModifier.prefix">pre</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ParamModifier.lower_bound">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ParamModifier.suffix">suf</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ParamModifier.increment">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ParamModifier.field_name">MASK</property>
+</testelement>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.modifier.URLRewritingModifier">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.modifier.gui.URLRewritingModifierGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="path_extension">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.modifier.URLRewritingModifier</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP URL Re-writing Modifier</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="path_extension_no_questionmark">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="argument_name">SESSIONID</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="path_extension_no_equals">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.modifier.UserParameterModifier">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.modifier.gui.UserParameterModifierGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.modifier.UserParameterModifier</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP User Parameter Modifier</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="UserParameterModifier.xmluri">users.xml</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.sampler.HTTPSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.path">S path</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.sampler.HTTPSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.method">POST</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.use_keepalive">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.protocol">S prot</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.image_parser">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.follow_redirects">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.port">S port</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="HTTPsampler.Arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.LinkedList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.protocol.http.util.HTTPArgument" name="">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">S_V1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPArgument.use_equals">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">S_P1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPArgument.always_encode">false</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Argument List</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.mimetype">S_Mime</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.FILE_FIELD">S_param</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP Request</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.monitor">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.domain">S server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.FILE_NAME">S file</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.auto_redirects">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.sampler.HTTPSampler2">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.path">S_path</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.sampler.HTTPSampler2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.method">GET</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.use_keepalive">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.protocol">S_prot</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.image_parser">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.follow_redirects">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.port">S_port</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="HTTPsampler.Arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.LinkedList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.protocol.http.util.HTTPArgument" name="">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">S_V</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPArgument.use_equals">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">S_N</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPArgument.always_encode">false</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">User Defined Variables</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.mimetype">S_M</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui2</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.FILE_FIELD">S_P</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">HTTP Request HTTPCLient</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.monitor">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.domain">S_IP</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.FILE_NAME">S_F</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.auto_redirects">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.sampler.SoapSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.path">/</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.control.gui.SoapSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.sampler.SoapSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.method">POST</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">SOAP Sampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.domain"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.protocol">http</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSamper.xml_data">S DATA</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="HTTPSampler.port">-1</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="HTTPsampler.Arguments">
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments"/>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="SoapSampler.URL_DATA">S URL</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.sampler.WebServiceSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.path">/</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.sampler.WebServiceSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.method">POST</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.proxy_host">ProxyHost</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.protocol">http</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="HTTPsampler.Arguments">
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments"/>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.proxy_port">ProxyPort</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="HTTPSampler.port">80</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.use_proxy">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Soap.Action">Action</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.control.gui.WebServiceSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.xml_data_file">filename</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.read_response">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.xml_path_loc">message</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="WebServiceSampler.memory_cache">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">WebService (SOAP) Request</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.domain"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSamper.xml_data">data</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.http.sampler.AccessLogSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.http.control.gui.AccessLogSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.http.sampler.AccessLogSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Tomcat Access Log Sampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="HTTPSampler.domain">server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="AccessLogSampler.parser_class_name">org.apache.jmeter.protocol.http.util.accesslog.TCLogParser</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="HTTPSampler.image_parser">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="HTTPSampler.port">80</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="HTTPsampler.Arguments">
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments"/>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="AccessLogSampler.generator_class_name">org.apache.jmeter.protocol.http.util.accesslog.StandardGenerator</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="AccessLogSampler.log_file">tcalog.txt</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Protocol: Java</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.protocol.java.config.JavaConfig">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="classname">org.apache.jmeter.protocol.java.test.SleepTest</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.ArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.config.Argument" name="SleepTime">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">1000</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">SleepTime</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="SleepMask">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">0x3FF</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">SleepMask</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.java.config.gui.JavaConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.java.config.JavaConfig</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Java Config</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.java.sampler.JavaSampler">
+<testelement class="org.apache.jmeter.config.Arguments" name="arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.ArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.config.Argument" name="SleepTime">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">1000</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">SleepTime</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="SleepMask">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">0x3FF</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">SleepMask</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="classname">org.apache.jmeter.protocol.java.test.SleepTest</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.java.control.gui.JavaTestSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.java.sampler.JavaSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Java SleepTest</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.java.sampler.JavaSampler">
+<testelement class="org.apache.jmeter.config.Arguments" name="arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.ArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.config.Argument" name="Sleep_Time">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">100</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">Sleep_Time</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="Sleep_Mask">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">0xFF</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">Sleep_Mask</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="Label">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">JavaTest Label</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">Label</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="ResponseCode">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">200 (or any other number)</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">ResponseCode</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="ResponseMessage">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">OK (or any other text)</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">ResponseMessage</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="Status">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">OK</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">Status</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="SamplerData">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">SamplerData goes here</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">SamplerData</property>
+</testelement>
+<testelement class="org.apache.jmeter.config.Argument" name="ResultData">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">ResultData goes here</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">ResultData</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="classname">org.apache.jmeter.protocol.java.test.JavaTest</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.java.control.gui.JavaTestSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.java.sampler.JavaSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">JavaTest</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.java.sampler.BeanShellSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BeanShellSampler.filename">BeanShell.bsh</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.java.control.gui.BeanShellSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.java.sampler.BeanShellSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">BeanShell Sampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BeanShellSampler.query">ResponseCode=12;
+ResponseMessage="Buckle my shoe";
+IsSuccess=false;
+Label="Sticky";
+// FileName is the Script file name
+// bsh.args[1] == "quick"
+return "This will go into the Response Data field";</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BeanShellSampler.parameters">the quick brown fox</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.java.sampler.BSFSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BSFSampler.parameters">p1 p2 p3</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.java.control.gui.BSFSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.java.sampler.BSFSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">BSF Sampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BSFSampler.query">// Wobbles</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BSFSampler.filename">jelly.script</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="BSFSampler.language">Jelly</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Protocol: JDBC</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.url">JDBC URL</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.jdbc.config.gui.DbConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">JDBC Database Login Defaults</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.driver">Driver Class</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.username">Username</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.password">Password</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.jdbc.config.gui.PoolConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.connections">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">JDBC Database Connection Pool Defaults</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.connPoolClass">org.apache.jmeter.protocol.jdbc.util.JMeter19ConnectionPool</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.maxuse">50</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.jdbc.config.gui.SqlConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">JDBC SQL Query Defaults</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.query">C SQL</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.url">JDBC URL</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.connections">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.jdbc.control.gui.JdbcTestSampleGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">JDBC Request</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.driver">Driver class</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.connPoolClass">org.apache.jmeter.protocol.jdbc.util.JMeter19ConnectionPool</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.query">select count(*) from iitables</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.username">Username</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="JDBCSampler.maxuse">50</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.password">Password</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Protocol: LDAP</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="rootdn">C DN</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.ldap.config.gui.LdapConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">LDAP Request Defaults</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="servername">C server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="port">C port</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="user_defined">false</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.ldap.sampler.LDAPSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="rootdn">DN</property>
+<testelement class="org.apache.jmeter.config.Arguments" name="arguments">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.config.gui.ArgumentsPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.Arguments</property>
+<collection class="java.util.ArrayList" propType="org.apache.jmeter.testelement.property.CollectionProperty" name="Arguments.arguments">
+<testelement class="org.apache.jmeter.config.Argument" name="NAme">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.metadata">=</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.value">Value</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="Argument.name">NAme</property>
+</testelement>
+</collection>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">User Defined Variables</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.ldap.sampler.LDAPSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.username">User</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="port">Port</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="user_defined">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.ldap.control.gui.LdapTestSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">LDAP Request</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="servername">server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="base_entry_dn">Entry</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="test">add</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.password">Pass</property>
+</testelement>
+</node>
+</node>
+<node>
+<testelement class="org.apache.jmeter.threads.ThreadGroup">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.start_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.threads.ThreadGroup</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.delay"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.duration"/>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.num_threads">1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="ThreadGroup.scheduler">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.threads.gui.ThreadGroupGui</property>
+<testelement class="org.apache.jmeter.control.LoopController" name="ThreadGroup.main_controller">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.control.gui.LoopControlPanel</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.IntegerProperty" name="LoopController.loops">-1</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.control.LoopController</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Loop Controller</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="LoopController.continue_forever">false</property>
+</testelement>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">Protocol: TCP</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.LongProperty" name="ThreadGroup.end_time">0</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.on_sample_error">continue</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ThreadGroup.ramp_time">1</property>
+</testelement>
+<node>
+<testelement class="org.apache.jmeter.config.ConfigTestElement">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.tcp.config.gui.TCPConfigGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.config.ConfigTestElement</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.port">port</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.request">Text</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">TCP Sampler Config</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.nodelay">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.server">server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.timeout">999</property>
+</testelement>
+</node>
+<node>
+<testelement class="org.apache.jmeter.protocol.tcp.sampler.TCPSampler">
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.gui_class">org.apache.jmeter.protocol.tcp.control.gui.TCPSamplerGui</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.test_class">org.apache.jmeter.protocol.tcp.sampler.TCPSampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.port">port</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.request">text</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TestElement.name">TCP Sampler</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.username">user</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.nodelay">false</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.BooleanProperty" name="TestElement.enabled">true</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.server">server</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="ConfigTestElement.password">pass</property>
+<property xml:space="preserve" propType="org.apache.jmeter.testelement.property.StringProperty" name="TCPSampler.timeout">999</property>
+</testelement>
+</node>
+</node>
+</node>
diff --git a/bin/upgrade.properties b/bin/upgrade.properties
index 6d69f48..3a6444b 100644
--- a/bin/upgrade.properties
+++ b/bin/upgrade.properties
@@ -19,8 +19,13 @@
 # Format is as follows --
 # for renamed test element & GUI classes:
 # 		old.class.Name=new.class.Name
-# for renamed properties:
-#		old.class.Name/Old.propertyName=newPropertyName
+# 		old.class.Name|guiClassName=new.class.Name
+#		(e.g. for ConfigTestElement)
+#
+# for renamed / deleted properties:
+#		class.Name/Old.propertyName=newPropertyName
+#		if newPropertyName is omitted, then property is deleted
+#
 # for renamed values:
 #		old.class.Name.old.propertyName/oldValue=newValue
 #
@@ -35,5 +40,37 @@ org.apache.jmeter.timers.ConstantThroughputTimer/ConstantThroughputTimer.through
 
 org.apache.jmeter.protocol.jdbc.control.gui.JdbcTestSampleGui=org.apache.jmeter.testbeans.gui.TestBeanGUI
 org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler/JDBCSampler.query=query
-org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.JDBCSampler.dataSource/NULL=
-org.apache.jmeter.protocol.http.control.Header/TestElement.name=Header.name
\ No newline at end of file
+#org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler.JDBCSampler.dataSource/NULL=
+
+# Convert DBconfig
+org.apache.jmeter.protocol.jdbc.config.gui.DbConfigGui=org.apache.jmeter.testbeans.gui.TestBeanGUI
+org.apache.jmeter.config.ConfigTestElement|org.apache.jmeter.protocol.jdbc.config.gui.DbConfigGui=org.apache.jmeter.protocol.jdbc.config.DataSourceElement
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/JDBCSampler.url=dbUrl
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/JDBCSampler.driver=driver
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/JDBCSampler.query=query
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/ConfigTestElement.username=username
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/ConfigTestElement.password=password
+
+# Convert PoolConfig
+org.apache.jmeter.protocol.jdbc.config.gui.PoolConfigGui=org.apache.jmeter.testbeans.gui.TestBeanGUI
+org.apache.jmeter.config.ConfigTestElement|org.apache.jmeter.protocol.jdbc.config.gui.PoolConfigGui=org.apache.jmeter.protocol.jdbc.config.DataSourceElement
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/JDBCSampler.connections=
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/JDBCSampler.connPoolClass=
+org.apache.jmeter.protocol.jdbc.config.DataSourceElement/JDBCSampler.maxuse=poolMax
+
+# SQL Config
+org.apache.jmeter.config.ConfigTestElement/JDBCSampler.query=query
+
+org.apache.jmeter.protocol.http.control.Header/TestElement.name=Header.name
+
+# Upgrade AccessLogSampler
+org.apache.jmeter.protocol.http.control.gui.AccessLogSamplerGui=org.apache.jmeter.testbeans.gui.TestBeanGUI
+org.apache.jmeter.protocol.http.sampler.AccessLogSampler/AccessLogSampler.log_file=logFile
+org.apache.jmeter.protocol.http.sampler.AccessLogSampler/HTTPSampler.port=portString
+#Is the following used now?
+#org.apache.jmeter.protocol.http.sampler.AccessLogSampler/AccessLogSampler.generator_class_name=
+#Looks to be a new field
+#filterClassName
+org.apache.jmeter.protocol.http.sampler.AccessLogSampler/HTTPSampler.domain=domain
+org.apache.jmeter.protocol.http.sampler.AccessLogSampler/AccessLogSampler.parser_class_name=parserClassName
+org.apache.jmeter.protocol.http.sampler.AccessLogSampler/HTTPSampler.image_parser=imageParsing
\ No newline at end of file
diff --git a/build.xml b/build.xml
index 97d8295..eee4910 100644
--- a/build.xml
+++ b/build.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!--
-   Copyright 1999-2004 The Apache Software Foundation
+   Copyright 1999-2005 The Apache Software Foundation
  
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@
     To build all and package up the files for distribution
       ant distribution [ -Djmeter.version=vvvv ]
 
-  	To create tar and tgz of the web-site documentation (docs and api)
+    To create tar and tgz of the web-site documentation (docs and api)
       ant site [ -Djmeter.version=vvvv ]
       
       
@@ -124,6 +124,7 @@
       <sourcePath path="${src.http}" />
       <sourcePath path="${src.ftp}" />
       <sourcePath path="${src.java}" />
+      <sourcePath path="${src.junit}" />
       <sourcePath path="${src.jdbc}" />
       <sourcePath path="${src.ldap}" />
       <sourcePath path="${src.mail}" />
@@ -173,6 +174,7 @@
   <property name="src.test" value="test/src"/>
   <property name="src.jdbc" value="src/protocol/jdbc"/>
   <property name="src.java" value="src/protocol/java"/>
+  <property name="src.junit" value="src/junit"/>
   <property name="src.components" value="src/components"/>
   <property name="src.functions" value="src/functions"/>
   <property name="src.jorphan" value="src/jorphan"/>
@@ -199,6 +201,7 @@
     <pathelement location="${src.ftp}"/>
     <pathelement location="${src.jdbc}"/>
     <pathelement location="${src.java}"/>
+    <pathelement location="${src.junit}"/>
     <pathelement location="${src.jorphan}"/>
     <pathelement location="${src.ldap}"/>
     <pathelement location="${src.htmlparser}"/>
@@ -217,6 +220,7 @@
   <property name="build.ftp" value="build/protocol/ftp"/>
   <property name="build.jdbc" value="build/protocol/jdbc"/>
   <property name="build.java" value="build/protocol/java"/>
+  <property name="build.junit" value="build/junit"/>
   <property name="build.components" value="build/components"/>
   <property name="build.functions" value="build/functions"/>
   <property name="build.jorphan" value="build/jorphan"/>
@@ -262,7 +266,9 @@
 
   <!-- Directory where these 3rd party libraries will live -->
   <property name="lib.dir" value="lib"/>
-	<property name="legacy.dir" location="legacy"/>
+
+  <!-- Currently just for old version of jdom needed for Anakia -->
+  <property name="legacy.dir" value="legacy"/>
   
   <!-- Directory where Optional 3rd party libraries will live -->
   <property name="lib.opt" value="lib/opt"/>
@@ -293,12 +299,13 @@
   <property name="excalibur-i18n.jar" value="${lib.dir}/excalibur-i18n-1.1.jar"/>
   <property name="excalibur-compatibility.jar" value="${lib.dir}/excalibur-compatibility-1.1.jar"/>
   <property name="batik-awt-util.jar" value="${lib.dir}/batik-awt-util.jar"/>
+  <property name="jcharts.jar" value="${lib.dir}/jCharts-0.7.5.jar"/>
   <property name="junit.jar" value="${lib.dir}/junit.jar"/>
   <property name="logkit.jar" value="${lib.dir}/logkit-1.2.jar"/>
   <property name="excalibur-datasource.jar" value="${lib.dir}/excalibur-datasource-1.1.1.jar"/>
   <property name="excalibur-pool.jar" value="${lib.dir}/excalibur-pool-1.2.jar"/>
   <property name="excalibur-instrument.jar" value="${lib.dir}/excalibur-instrument-1.0.jar"/>
-  <property name="xstream.jar" value="${lib.dir}/xstream-1.1-2.jar"/>
+  <property name="xstream.jar" value="${lib.dir}/xstream-1.1.2.jar"/>
   <property name="xpp3.jar" value="${lib.dir}/xpp3_min-1.1.3.4.I.jar"/>
 	  
   <!-- The following 3 jars are probably optional for JDK1.4 -->
@@ -311,11 +318,14 @@
   <property name="soap.jar" value="${lib.dir}/soap.jar"/>
   <property name="tidy.jar" value="${lib.dir}/Tidy.jar"/>
 
+  <!-- The following jars are only needed for source distributions -->
+  <property name="velocity.jar" value="${lib.dir}/velocity-1.4-dev.jar"/>
+
+  <!-- Jars for binary release -->
   <patternset id="external.jars">
     <include name="LICENSE"/>
     <include name="NOTICE"/>
     <include name="README"/>
-    <include name="INSTALL"/>
     <include name="${lib.dir}/*.html"/>
     <include name="${lib.dir}/LICENSE*.*"/>
     <include name="${avalon-framework.jar}"/>
@@ -326,6 +336,7 @@
     <include name="${excalibur-logger.jar}"/>
     <include name="${excalibur-i18n.jar}"/>
     <include name="${excalibur-compatibility.jar}"/>
+    <include name="${jcharts.jar}"/>
     <include name="${junit.jar}"/>
     <include name="${logkit.jar}"/>
     <include name="${xalan.jar}"/>
@@ -381,7 +392,7 @@
   <target name="init-version">
   	<tstamp/>
   	<!-- JMeter version -->
-  <property name="jmeter.version" value="2.1.${DSTAMP}"/>
+  <property name="jmeter.version" value="2.1.1.${DSTAMP}"/>
   </target>
 
   <target name="init" depends="check-libs,report-missing-libs,init-version">
@@ -411,9 +422,6 @@
         <available classname="javax.activation.DataHandler" classpathref="classpath"/>
       </and>
     </condition>
-    <available classname="iaik.protocol.https.Handler" property="isasilk.present">
-      <classpath refid="classpath"/>
-    </available>
     <available classname="bsh.Interpreter" property="beanshell.present">
       <classpath refid="classpath"/>
     </available>
@@ -432,10 +440,6 @@
     <echo message="Classes for SSL not found in classpath"/>
   </target>
 
-  <target name="iaik-message" depends="check-libs" unless="isasilk.present">
-    <echo message="Classes for IAIK iSaSiLk not found in classpath"/>
-  </target>
-
   <target name="mail-message" depends="check-libs" unless="javamail.complete">
     <echo message="Classes for Mail support not found in classpath"/>
   </target>
@@ -453,7 +457,7 @@
   </target>
 
   <target name="report-missing-libs" 
-      depends="ssl-message,iaik-message,mail-message,beanshell-message,bsf-message,jms-message"
+      depends="ssl-message,mail-message,beanshell-message,bsf-message,jms-message"
   />
 
   <!--
@@ -473,7 +477,6 @@
     <javac srcdir="${src.core}" destdir="${build.core}" optimize="${optimize}" source="${src.java.version}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
       <include name="**/*.java"/>
       <exclude name="org/apache/jmeter/util/JsseSSLManager.java" unless="jsse.present"/>
-      <exclude name="org/apache/jmeter/util/keystore/PKCS12KeyStore.java" unless="isasilk.present"/>
       <exclude name="org/apache/jmeter/util/keystore/DefaultKeyStore.java" unless="jsse.present"/>
       <classpath>
         <path refid="classpath"/>
@@ -533,7 +536,7 @@
     </javac>
   </target>
   
-  <target name="compile-tests" depends="compile" description="Compile components specific to HTTP sampling.">
+  <target name="compile-tests" description="Compile test components only">
     <mkdir dir="${build.test}"/>
     <javac srcdir="${src.test}" destdir="${build.test}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
       <classpath>
@@ -623,6 +626,18 @@
     </javac>
   </target>
 
+  <target name="compile-junit" depends="compile-jorphan,compile-core" description="Compile components specific to JUnit sampling.">
+    <mkdir dir="${build.junit}"/>
+    <javac srcdir="${src.junit}" destdir="${build.junit}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
+      <include name="**/*.java"/>
+      <classpath>
+        <path refid="classpath"/>
+        <pathelement location="${build.jorphan}"/>
+        <pathelement location="${build.core}"/>
+      </classpath>
+    </javac>
+  </target>
+
   <target name="compile-tcp" depends="compile-jorphan,compile-core" description="Compile components specific to TCP sampling.">
     <mkdir dir="${build.tcp}"/>
     <javac srcdir="${src.tcp}" destdir="${build.tcp}" source="${src.java.version}" optimize="${optimize}" debug="on" target="${target.java.version}" deprecation="${deprecation}" encoding="${encoding}">
@@ -635,7 +650,7 @@
     </javac>
   </target>
 
-  <target name="compile-protocols" depends="compile-http,compile-ftp,compile-jdbc,compile-java,compile-ldap,compile-mail,compile-tcp,compile-jms" description="Compile all protocol-specific components."/>
+  <target name="compile-protocols" depends="compile-http,compile-ftp,compile-jdbc,compile-java,compile-ldap,compile-mail,compile-tcp" description="Compile all protocol-specific components."/>
 
   <target name="compile-examples" depends="compile-jorphan,compile-core" description="Compile example components.">
     <mkdir dir="${build.examples}"/>
@@ -731,7 +746,8 @@
     </javac>
   </target>
 
-  <target name="compile" depends="compile-core,compile-components,compile-functions,compile-protocols,compile-rmi,compile-htmlparser,compile-monitor"
+  <target name="compile" 
+  depends="compile-core,compile-components,compile-functions,compile-protocols,compile-rmi,compile-htmlparser,compile-monitor,compile-junit,compile-jms"
   description="Compile everything."/>
 
   <target name="package" depends="compile, package-only"
@@ -760,12 +776,12 @@ some of its classes - at present JMeter can only run from jar files.
     - otherwise, change utils to ignore it -->
     
     <!-- JMeter launch jar -->
-    <jar jarfile="${dest.jar.jmeter}/ApacheJMeter.jar" includes="**/NewDriver*" 
+    <jar jarfile="${dest.jar.jmeter}/ApacheJMeter.jar" includes="**/NewDriver*,**/DynamicClassLoader*" 
         manifest="${src.core}/MANIFEST" 
         basedir="${build.core}"/>
 
     <!-- core -->    
-    <jar jarfile="${dest.jar}/ApacheJMeter_core.jar" excludes="**/NewDriver*">
+    <jar jarfile="${dest.jar}/ApacheJMeter_core.jar" excludes="**/NewDriver*,**/DynamicClassLoader*">
       <!-- Only include class files from build tree - see above -->
       <fileset dir="${build.core}" includes="**/*.class"/>
       <fileset dir="${src.core}" includes="org/apache/jmeter/images/**" 
@@ -813,6 +829,12 @@ some of its classes - at present JMeter can only run from jar files.
       <fileset dir="${src.java}" includes="**/*.properties" />
     </jar>
     
+    <!-- junit -->
+    <jar jarfile="${dest.jar}/ApacheJMeter_junit.jar">
+      <fileset dir="${build.junit}" includes="**/*.class" />
+      <fileset dir="${src.junit}" includes="**/*.properties" />
+    </jar>
+
     <!-- ldap -->
     <jar jarfile="${dest.jar}/ApacheJMeter_ldap.jar">
       <fileset dir="${build.ldap}" includes="**/*.class" />
@@ -881,23 +903,26 @@ some of its classes - at present JMeter can only run from jar files.
     <property name="jms.present" value="assume"/>
   </target>
 
-  <!-- list of files needed for a binary distribution -->
+  <!-- list of files needed for a binary distribution (excluding library files) -->
   <patternset id="dist.binaries">
     <include name="LICENSE"/>
     <include name="NOTICE"/>
     <include name="README"/>
-    <include name="INSTALL"/>
     <include name="${dest.jar.jmeter}/ApacheJMeter.jar"/>
+    <include name="${dest.jar.jmeter}/BeanShell*.bshrc"/>
     <include name="${dest.jar.jmeter}/jmeter*"/>
+    <include name="${dest.jar.jmeter}/logkit.xml"/>
     <include name="${dest.jar.jmeter}/upgrade.properties"/>
     <include name="${dest.jar.jmeter}/saveservice.properties"/>
     <include name="${dest.jar.jmeter}/users.*"/>
-    <include name="${dest.jar.jmeter}/testfiles/**"/>
+    <!-- Exclude any files that might be present from testing the release -->
+    <exclude name="${dest.jar.jmeter}/*.log"/>
     <include name="${dest.jar}/"/>
     <include name="${dest.printable_docs}/**"/>
     <include name="${extras.dir}/**"/>
     <include name="${lib.dir}/jorphan.jar"/>
     <include name="${lib.dir}/htmlparser.jar"/>
+    <include name="${lib.dir}/junit/test.jar"/>
   </patternset>
 
   <!--
@@ -910,23 +935,26 @@ some of its classes - at present JMeter can only run from jar files.
     <include name="LICENSE"/>
     <include name="NOTICE"/>
     <include name="README"/>
-    <include name="INSTALL"/>
     <include name="${src.dir}/**"/>
     <include name="${src.docs}/**"/>
-    <include name="build.*"/>
-    <include name="lcp.bat"/>
+    <include name="${src.test}/**"/>
+    <include name="build.xml"/>
     <include name="${dest.jar.jmeter}/jmeter*.bat"/>
     <include name="${dest.jar.jmeter}/jmeter*.properties"/>
     <include name="${dest.jar.jmeter}/log4j.conf"/>
     <include name="${dest.jar.jmeter}/testfiles/**"/>
-    <include name="eclipse.classpath*"/>
+    <exclude name="${dest.jar.jmeter}/testfiles/*.out"/>
+    <include name="eclipse.classpath"/>
+    <include name="eclipse.readme"/>
+    <include name="${lib.dir}/jar_usage.txt"/>
+    <include name="fb-*.x*"/>
+    <include name="KEYS.txt"/>
   </patternset>
   
   	<!-- Files to be included in full download -->
 	<patternset id="dist_bin_files">
   		<patternset refid="dist.binaries"/>
   		<patternset refid="external.jars"/>
-  		<include name="${dest.printable_docs}/**"/>
   		<include name="${dest.docs}/**"/>
   		<exclude name="${dest.docs}/api/**"/>
   	</patternset>
@@ -937,6 +965,8 @@ some of its classes - at present JMeter can only run from jar files.
   		<!--patternset refid="external.jars"/-->
   		<patternset refid="dist.sources"/>
   		<include name="${dest.docs}/api/**"/>
+		<include name="${velocity.jar}"/>
+		<include name="${legacy.dir}/"/>
   	</patternset>
 
 	<!-- Invoke with -Djmeter.version=m.n 
@@ -952,8 +982,8 @@ some of its classes - at present JMeter can only run from jar files.
 	Creates archives for updating web-site
 	-->
 	<target name="distribution" 
-		depends="assume-libs-present,clean,install,docs-all,test,_distribution,site"
-		description="Build JMeter for end-user distribution (includes site)"/>
+		depends="assume-libs-present,clean,install,docs-all,test,_distribution"
+		description="Build JMeter for end-user distribution (excludes site)"/>
 
 	<!-- Internal target -->
 	<target name="_distribution">
@@ -1035,8 +1065,8 @@ some of its classes - at present JMeter can only run from jar files.
 
   <!-- Used by project jakarta-jmeter-test -->
   <target name="gump-test" 
-      depends="_gump_properties,_test"
-      description="Test JMeter">
+      depends="_gump_properties,compile-tests,_test"
+      description="Test JMeter in Gump">
     <!-- Show the log file -->
     <concat>
       <filelist dir="bin" files="jmeter-test.log" />
@@ -1150,8 +1180,13 @@ some of its classes - at present JMeter can only run from jar files.
    <!-- When creating the tars for the web-site, no version prefix directory is added -->
    <target name="pack-site"  depends="init-version">
      <property name="dist.name" value="jakarta-jmeter-${jmeter.version}"/>
-     <antcall target="_pack_site_api"/>
-     <antcall target="_pack_site_doc"/>
+     <!-- Note: define pack.name here so it overrides any existing value -->
+     <antcall target="_pack_site_api">
+        <param name="pack.name" value="${dist.name}_api"/>
+     </antcall>
+     <antcall target="_pack_site_doc">
+        <param name="pack.name" value="${dist.name}_doc"/>
+     </antcall>
    </target>
  
    <target name="_pack_site_doc">
@@ -1258,6 +1293,9 @@ some of its classes - at present JMeter can only run from jar files.
     <copy todir="${dest.docs}/demos">
       <fileset dir="${src.demos}"/>
     </copy>
+  	<copy todir="${dest.docs}/usermanual">
+  	  <fileset file="${src.docs}/usermanual/*.pdf"/>
+    </copy>
   </target>
 
   <target name="docs-printable" depends="init-docs" if="AnakiaTask.present" description="Generate printable HTML documentation.">
@@ -1278,7 +1316,7 @@ some of its classes - at present JMeter can only run from jar files.
   <target name="docs-all" depends="docs-site,docs-printable,docs-api" 
   	description="Generate documentation. (site, printable, api)"/>
 
-  <target name="test" depends="install,compile-tests,_test" description="Run tests"/>
+  <target name="test" depends="compile-tests,_test" description="Run tests"/>
   
   <target name="test-both" depends="test-headless,test-headed"/>
 
@@ -1321,7 +1359,7 @@ some of its classes - at present JMeter can only run from jar files.
    test.headless = ${test.headless}
    user.dir = ${user.dir}
    basedir = ${basedir}
-   test dir = ${build.dir}/test
+   test dir = ${build.test}
    testsaveservice.saveout = ${testsaveservice.saveout}
    </echo>
    <java classname="org.apache.jorphan.test.AllTests" fork="yes" dir="${basedir}/bin">
@@ -1332,7 +1370,7 @@ some of its classes - at present JMeter can only run from jar files.
       </classpath>
       <sysproperty key="java.awt.headless" value="${test.headless}"/>
       <sysproperty key="testsaveservice.saveout" value="${testsaveservice.saveout}" />
-      <arg value="${build.dir}/test,../lib/ext"/>
+      <arg value="${build.test},../lib/ext"/>
       <arg value="./jmetertest.properties"/>
       <arg value="org.apache.jmeter.util.JMeterUtils"/>
     </java>
diff --git a/eclipse.classpath b/eclipse.classpath
index d5e31a0..d961648 100644
--- a/eclipse.classpath
+++ b/eclipse.classpath
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry output="build/jorphan" kind="src" path="src/jorphan"/>
+	<classpathentry output="build/junit" kind="src" path="src/junit"/>
 	<classpathentry output="build/test" kind="src" path="test/src"/>
 	<classpathentry output="build/protocol/jms" kind="src" path="src/protocol/jms"/>
 	<classpathentry output="build/protocol/mail" kind="src" path="src/protocol/mail"/>
-	<classpathentry excluding="org/apache/jmeter/images/|org/apache/jmeter/resources/*.properties|org/apache/jmeter/util/keystore/PKCS12KeyStore.java" output="build/core" kind="src" path="src/core"/>
+	<classpathentry excluding="org/apache/jmeter/images/|org/apache/jmeter/resources/*.properties" output="build/core" kind="src" path="src/core"/>
 	<classpathentry output="build/components" kind="src" path="src/components"/>
 	<classpathentry output="build/functions" kind="src" path="src/functions"/>
 	<classpathentry output="build/protocol/http" kind="src" path="src/protocol/http"/>
@@ -35,7 +36,7 @@
 	<classpathentry kind="lib" path="lib/excalibur-datasource-1.1.1.jar"/>
 	<classpathentry kind="lib" path="lib/excalibur-instrument-1.0.jar"/>
 	<classpathentry kind="lib" path="lib/excalibur-pool-1.2.jar"/>
-	<classpathentry kind="lib" path="lib/xstream-1.1.jar"/>
+	<classpathentry kind="lib" path="lib/xstream-1.1.2.jar"/>
 	<classpathentry kind="lib" path="lib/xpp3_min-1.1.3.4.I.jar"/>
 	<classpathentry kind="lib" path="lib/batik-awt-util.jar"/>
 	<classpathentry kind="output" path=""/>
diff --git a/legacy/LICENSE(jdom).txt b/legacy/LICENSE(jdom).txt
new file mode 100644
index 0000000..81afefe
--- /dev/null
+++ b/legacy/LICENSE(jdom).txt
@@ -0,0 +1,56 @@
+/*-- 
+
+ $Id$
+
+ Copyright (C) 2000-2004 Jason Hunter & Brett McLaughlin.
+ All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions, and the following disclaimer.
+ 
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions, and the disclaimer that follows 
+    these conditions in the documentation and/or other materials 
+    provided with the distribution.
+
+ 3. The name "JDOM" must not be used to endorse or promote products
+    derived from this software without prior written permission.  For
+    written permission, please contact <request_AT_jdom_DOT_org>.
+ 
+ 4. Products derived from this software may not be called "JDOM", nor
+    may "JDOM" appear in their name, without prior written permission
+    from the JDOM Project Management <request_AT_jdom_DOT_org>.
+ 
+ In addition, we request (but do not require) that you include in the 
+ end-user documentation provided with the redistribution and/or in the 
+ software itself an acknowledgement equivalent to the following:
+     "This product includes software developed by the
+      JDOM Project (http://www.jdom.org/)."
+ Alternatively, the acknowledgment may be graphical using the logos 
+ available at http://www.jdom.org/images/logos.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ This software consists of voluntary contributions made by many 
+ individuals on behalf of the JDOM Project and was originally 
+ created by Jason Hunter <jhunter_AT_jdom_DOT_org> and
+ Brett McLaughlin <brett_AT_jdom_DOT_org>.  For more information
+ on the JDOM Project, please see <http://www.jdom.org/>. 
+
+ */
+
diff --git a/lib/LICENSE(jCharts).txt b/lib/LICENSE(jCharts).txt
new file mode 100644
index 0000000..8798029
--- /dev/null
+++ b/lib/LICENSE(jCharts).txt
@@ -0,0 +1,44 @@
+
+jCharts License
+----------------------------------------------------------------------------------------
+
+* Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved.
+*
+* Redistribution and use of this software and associated documentation
+* ("Software"), with or without modification, are permitted provided
+* that the following conditions are met:
+*
+* 1. Redistributions of source code must retain copyright
+*    statements and notices.  Redistributions must also contain a
+*    copy of this document.
+*
+* 2. Redistributions in binary form must reproduce the
+*    above copyright notice, this list of conditions and the
+*    following disclaimer in the documentation and/or other
+*    materials provided with the distribution.
+*
+* 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to
+* 	  endorse or promote products derived from this Software without
+* 	  prior written permission of Nathaniel G. Auvil.  For written
+*    permission, please contact nathaniel_auvil@users.sourceforge.net
+*
+* 4. Products derived from this Software may not be called "jCharts"
+*    nor may "jCharts" appear in their names without prior written
+*    permission of Nathaniel G. Auvil. jCharts is a registered
+*    trademark of Nathaniel G. Auvil.
+*
+* 5. Due credit should be given to the jCharts Project
+*    (http://jcharts.sourceforge.net/).
+*
+* THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS
+* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+* jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+* OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/lib/jar_usage.txt b/lib/jar_usage.txt
index 8d7d7c2..fbcabb0 100644
--- a/lib/jar_usage.txt
+++ b/lib/jar_usage.txt
@@ -72,4 +72,8 @@ xml-apis
 
 xml-batik
 - org.apache.batik.ext.awt.image.codec|org.apache.batik.ext.awt.image.codec.tiff
-The x* jars are used for XML handling (not needed for JDK1.4)
\ No newline at end of file
+The x* jars are used for XML handling (not needed for JDK1.4)
+
+jcharts
+- Aggregate Graph listener
+- new Reporting tool
\ No newline at end of file
diff --git a/src/components/org/apache/jmeter/config/CSVDataSet.java b/src/components/org/apache/jmeter/config/CSVDataSet.java
index aad8092..0895f9c 100644
--- a/src/components/org/apache/jmeter/config/CSVDataSet.java
+++ b/src/components/org/apache/jmeter/config/CSVDataSet.java
@@ -62,7 +62,7 @@ public class CSVDataSet extends ConfigTestElement implements TestBean, LoopItera
 			String delim = getDelimiter();
 			if (delim.equals("\\t"))
 				delim = "\t";// Make it easier to enter a Tab
-			String[] lineValues = JOrphanUtils.split(server.readLine(getFilename()), delim);
+			String[] lineValues = JOrphanUtils.split(server.readLine(getFilename()), delim,false);
 			for (int a = 0; a < vars.length && a < lineValues.length; a++) {
 				this.getThreadContext().getVariables().put(vars[a], lineValues[a]);
 			}
diff --git a/src/components/org/apache/jmeter/control/IncludeController.java b/src/components/org/apache/jmeter/control/IncludeController.java
new file mode 100644
index 0000000..4a6ec1b
--- /dev/null
+++ b/src/components/org/apache/jmeter/control/IncludeController.java
@@ -0,0 +1,128 @@
+// $Header$
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.control;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import org.apache.jmeter.save.SaveService;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.collections.HashTree;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+/**
+ * 
+ * 
+ * @author Peter Lin
+ * @version $Revision$
+ */
+public class IncludeController extends GenericController implements ReplaceableController {
+	private static final Logger log = LoggingManager.getLoggerForClass();
+
+    public static final String INCLUDE_PATH = "IncludeController.includepath";
+
+    private HashTree SUBTREE = null;
+    private TestElement SUB = null;
+
+	/**
+	 * No-arg constructor
+	 * 
+	 * @see java.lang.Object#Object()
+	 */
+	public IncludeController() {
+		super();
+	}
+
+	public Object clone() {
+        this.loadIncludedElements();
+		IncludeController clone = (IncludeController) super.clone();
+        clone.setIncludePath(this.getIncludePath());
+        if (this.SUBTREE != null) {
+            if (this.SUBTREE.keySet().size() == 1) {
+                Iterator itr = this.SUBTREE.keySet().iterator();
+                while (itr.hasNext()) {
+                    this.SUB = (TestElement)itr.next();
+                }
+            }
+            clone.SUBTREE = (HashTree)this.SUBTREE.clone();
+            clone.SUB = (TestElement)this.SUB.clone();
+        }
+		return clone;
+	}
+
+    /**
+     * In the event an user wants to include an external JMX test plan
+     * the GUI would call this.
+     * @param jmxfile
+     */
+    public void setIncludePath(String jmxfile) {
+        this.setProperty(INCLUDE_PATH,jmxfile);
+    }
+    
+    /**
+     * return the JMX file path.
+     * @return
+     */
+    public String getIncludePath() {
+        return this.getPropertyAsString(INCLUDE_PATH);
+    }
+    
+    /**
+     * The way ReplaceableController works is clone is called first,
+     * followed by replace(HashTree) and finally getReplacement().
+     */
+    public HashTree getReplacementSubTree() {
+        return SUBTREE;
+    }
+
+    /**
+     * load the included elements using SaveService
+     * @param node
+     */
+    protected HashTree loadIncludedElements() {
+        // only try to load the JMX test plan if there is one
+        if (getIncludePath() != null && getIncludePath().length() > 0) {
+            try {
+                log.info("loadIncludedElements -- try to load included module");
+                InputStream reader = new FileInputStream(getIncludePath());
+                this.SUBTREE = SaveService.loadTree(reader);
+                return this.SUBTREE;
+            } catch (NoClassDefFoundError ex) // Allow for missing optional jars
+            {
+                String msg = ex.getMessage();
+                if (msg == null) {
+                    msg = "Missing jar file - see log for details";
+                    log.warn("Missing jar file", ex);
+                }
+                JMeterUtils.reportErrorToUser(msg);
+            } catch (Exception ex) {
+                String msg = ex.getMessage();
+                if (msg == null) {
+                    msg = "Unexpected error - see log for details";
+                    log.warn("Unexpected error", ex);
+                }
+            }
+        }
+        return this.SUBTREE;
+    }
+    
+}
diff --git a/src/components/org/apache/jmeter/control/ModuleController.java b/src/components/org/apache/jmeter/control/ModuleController.java
index bc4e506..637a056 100644
--- a/src/components/org/apache/jmeter/control/ModuleController.java
+++ b/src/components/org/apache/jmeter/control/ModuleController.java
@@ -31,6 +31,7 @@ import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
 import org.apache.jmeter.testelement.property.NullProperty;
 import org.apache.jorphan.collections.HashTree;
+import org.apache.jorphan.collections.ListedHashTree;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
 
@@ -75,21 +76,6 @@ public class ModuleController extends GenericController implements ReplaceableCo
 	}
 
 	/**
-	 * Get the controller which this object is "pointing" to.
-	 * 
-	 * @return the controller which this node points to
-	 * @see org.apache.jmeter.testelement.TestElement
-	 * @see org.apache.jmeter.control.ReplaceableController#getReplacement()
-	 */
-	public TestElement getReplacement() {
-		if (selectedNode != null) {
-			return selectedNode.getTestElement();
-		} else {
-			return this;
-		}
-	}
-
-	/**
 	 * Sets the (@link JMeterTreeNode) which represents the controller which
 	 * this object is pointing to. Used for building the test case upon
 	 * execution.
@@ -167,12 +153,15 @@ public class ModuleController extends GenericController implements ReplaceableCo
 	 * @param tree -
 	 *            The current tree under which the nodes will be added
 	 */
-	public void replace(HashTree tree) {
+	public HashTree getReplacementSubTree() {
 		if (!selectedNode.isEnabled()) {
 			selectedNode = cloneTreeNode(selectedNode);
 			selectedNode.setEnabled(true);
 		}
+		HashTree tree = new ListedHashTree();
+		tree.add(selectedNode);
 		createSubTree(tree, selectedNode);
+		return tree;
 	}
 
 	private void createSubTree(HashTree tree, JMeterTreeNode node) {
diff --git a/src/components/org/apache/jmeter/control/gui/IncludeControllerGui.java b/src/components/org/apache/jmeter/control/gui/IncludeControllerGui.java
new file mode 100644
index 0000000..6226018
--- /dev/null
+++ b/src/components/org/apache/jmeter/control/gui/IncludeControllerGui.java
@@ -0,0 +1,145 @@
+// $Header$
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.control.gui;
+
+import java.awt.FlowLayout;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+
+import org.apache.jmeter.control.IncludeController;
+import org.apache.jmeter.gui.util.FilePanel;
+import org.apache.jmeter.gui.util.MenuFactory;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.layout.VerticalLayout;
+
+/**
+ * 
+ * 
+ * @version $Revision$ on $Date$
+ */
+public class IncludeControllerGui extends AbstractControllerGui
+                                                                /*
+																 * implements
+																 * UnsharedComponent
+																 */
+{
+
+	private JLabel warningLabel;
+
+    private FilePanel includePanel = 
+        new FilePanel(JMeterUtils.getResString("include_path"), ".jmx");
+
+    public static final String CONTROLLER = "Module To Run";
+
+
+	/**
+	 * Initializes the gui panel for the ModuleController instance.
+	 */
+	public IncludeControllerGui() {
+		init();
+	}
+
+	public String getLabelResource() {
+		return "include_controller";
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.jmeter.gui.JMeterGUIComponent#configure(TestElement)
+	 */
+	public void configure(TestElement el) {
+		super.configure(el);
+		IncludeController controller = (IncludeController) el;
+        this.includePanel.setFilename(controller.getIncludePath());
+	}
+
+	private String renderPath(Collection path) {
+		Iterator iter = path.iterator();
+		StringBuffer buf = new StringBuffer();
+		boolean first = true;
+		while (iter.hasNext()) {
+			if (first) {
+				first = false;
+				iter.next();
+				continue;
+			}
+			buf.append(iter.next());
+			if (iter.hasNext())
+				buf.append(" > ");
+		}
+		return buf.toString();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement()
+	 */
+	public TestElement createTestElement() {
+		IncludeController mc = new IncludeController();
+		configureTestElement(mc);
+		return mc;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
+	 */
+	public void modifyTestElement(TestElement element) {
+		configureTestElement(element);
+        IncludeController controller = (IncludeController)element;
+        controller.setIncludePath(this.includePanel.getFilename());
+	}
+
+	public JPopupMenu createPopupMenu() {
+		JPopupMenu menu = new JPopupMenu();
+		JMenu addMenu = MenuFactory.makeMenus(new String[] { MenuFactory.CONFIG_ELEMENTS, MenuFactory.ASSERTIONS,
+				MenuFactory.TIMERS, MenuFactory.LISTENERS, }, JMeterUtils.getResString("Add"), "Add");
+		menu.add(addMenu);
+		MenuFactory.addEditMenu(menu, true);
+		MenuFactory.addFileMenu(menu);
+		return menu;
+	}
+
+	private void init() {
+		setLayout(new VerticalLayout(5, VerticalLayout.LEFT, VerticalLayout.TOP));
+		setBorder(makeBorder());
+		add(makeTitlePanel());
+
+        add(includePanel);
+	}
+
+	private String spaces(int level) {
+		int multi = 4;
+		StringBuffer spaces = new StringBuffer(level * multi);
+		for (int i = 0; i < level * multi; i++) {
+			spaces.append(" ");
+		}
+		return spaces.toString();
+	}
+    
+}
\ No newline at end of file
diff --git a/src/components/org/apache/jmeter/visualizers/AxisGraph.java b/src/components/org/apache/jmeter/visualizers/AxisGraph.java
new file mode 100644
index 0000000..c7ede08
--- /dev/null
+++ b/src/components/org/apache/jmeter/visualizers/AxisGraph.java
@@ -0,0 +1,142 @@
+/*
+ * Created on Sep 9, 2005
+ *
+ * TODO To change the template for this generated file go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+package org.apache.jmeter.visualizers;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.LayoutManager;
+import java.awt.Paint;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+import org.apache.jmeter.gui.action.ActionRouter;
+import org.apache.jmeter.gui.action.SaveGraphics;
+import org.apache.jmeter.util.JMeterUtils;
+import org.jCharts.axisChart.AxisChart;
+import org.jCharts.chartData.AxisChartDataSet;
+import org.jCharts.chartData.DataSeries;
+import org.jCharts.properties.AxisProperties;
+import org.jCharts.properties.BarChartProperties;
+import org.jCharts.properties.ChartProperties;
+import org.jCharts.properties.LegendProperties;
+import org.jCharts.types.ChartType;
+
+/**
+ * @author pete
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class AxisGraph extends JPanel {
+
+    protected double[][] data = null;
+    protected String title, xAxisTitle, yAxisTitle, yAxisLabel;
+    protected String[] xAxisLabels;
+    protected int width, height;
+    
+	/**
+	 * 
+	 */
+	public AxisGraph() {
+		super();
+	}
+
+	/**
+	 * @param layout
+	 */
+	public AxisGraph(LayoutManager layout) {
+		super(layout);
+	}
+
+	/**
+	 * @param layout
+	 * @param isDoubleBuffered
+	 */
+	public AxisGraph(LayoutManager layout, boolean isDoubleBuffered) {
+		super(layout, isDoubleBuffered);
+	}
+    
+    public void setData(double[][] data) {
+        this.data = data;
+    }
+    
+    public void setTitle(String title) {
+        this.title = title;
+    }
+    
+    public void setXAxisTitle(String title) {
+        this.xAxisTitle = title;
+    }
+    
+    public void setYAxisTitle(String title) {
+        this.yAxisTitle = title;
+    }
+    
+    public void setXAxisLabels(String[] labels) {
+        this.xAxisLabels = labels;
+    }
+    
+    public void setYAxisLabels(String label) {
+        this.yAxisLabel = label;
+    }
+    
+    public void setWidth(int w) {
+        this.width = w;
+    }
+    
+    public void setHeight(int h) {
+        this.height = h;
+    }
+    
+    public void paintComponent(Graphics g) {
+        if (data != null && this.title != null && this.xAxisLabels != null &&
+                this.xAxisTitle != null && this.yAxisLabel != null &&
+                this.yAxisTitle != null) {
+            drawSample(this.title,this.xAxisLabels,this.xAxisTitle,
+                    this.yAxisTitle,this.data,this.width,this.height,g);
+        }
+    }
+    
+    private void drawSample(String title, String[] xAxisLabels, String xAxisTitle,
+            String yAxisTitle, double[][] data, int width, int height, Graphics g) {
+        try {
+            if (width == 0) {
+                width = 450;
+            }
+            if (height == 0) {
+                height = 250;
+            }
+            this.setPreferredSize(new Dimension(width,height));
+            DataSeries dataSeries = new DataSeries( xAxisLabels, xAxisTitle, yAxisTitle, title );
+            
+            String[] legendLabels= { yAxisLabel };
+            Paint[] paints= new Paint[]{ Color.blue.darker() };
+            BarChartProperties barChartProperties= new BarChartProperties();
+            AxisChartDataSet axisChartDataSet =
+                new AxisChartDataSet(
+                        data, legendLabels, paints, ChartType.BAR, barChartProperties );
+            dataSeries.addIAxisPlotDataSet( axisChartDataSet );
+
+            ChartProperties chartProperties= new ChartProperties();
+            AxisProperties axisProperties= new AxisProperties();
+            axisProperties.setXAxisLabelsAreVertical(true);
+            LegendProperties legendProperties= new LegendProperties();
+            AxisChart axisChart = new AxisChart( 
+                    dataSeries, chartProperties, axisProperties, 
+                    legendProperties, width, height );
+            axisChart.setGraphics2D((Graphics2D) g);
+            axisChart.render();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    
+}
diff --git a/src/components/org/apache/jmeter/visualizers/Graph.java b/src/components/org/apache/jmeter/visualizers/Graph.java
index c999e0d..15db3d4 100644
--- a/src/components/org/apache/jmeter/visualizers/Graph.java
+++ b/src/components/org/apache/jmeter/visualizers/Graph.java
@@ -1,6 +1,6 @@
 // $Header$
 /*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-2005 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy
@@ -23,6 +23,7 @@ import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Rectangle;
 import java.util.Iterator;
+import java.util.List;
 
 import javax.swing.JComponent;
 import javax.swing.Scrollable;
@@ -188,8 +189,9 @@ public class Graph extends JComponent implements Scrollable, Clearable {
 	public void paintComponent(Graphics g) {
 		super.paintComponent(g);
 
-		synchronized (model.getSamples()) {
-			Iterator e = model.getSamples().iterator();
+        List samples = model.getSamples();
+        synchronized (samples ) {
+			Iterator e = samples.iterator();
 
 			for (int i = 0; e.hasNext(); i++) {
 				Sample s = (Sample) e.next();
diff --git a/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java b/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
new file mode 100644
index 0000000..db19ab1
--- /dev/null
+++ b/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
@@ -0,0 +1,360 @@
+// $Header$
+/*
+ * Copyright 2002-2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy
+ * of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *  
+ */
+
+package org.apache.jmeter.visualizers;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+
+import org.apache.jmeter.gui.action.ActionRouter;
+import org.apache.jmeter.gui.action.SaveGraphics;
+import org.apache.jmeter.gui.util.FileDialoger;
+import org.apache.jmeter.gui.util.HorizontalPanel;
+import org.apache.jmeter.gui.util.VerticalPanel;
+import org.apache.jmeter.samplers.Clearable;
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.save.OldSaveService;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jmeter.visualizers.gui.AbstractVisualizer;
+import org.apache.jorphan.gui.JLabeledChoice;
+import org.apache.jorphan.gui.JLabeledTextField;
+import org.apache.jorphan.gui.ObjectTableModel;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.reflect.Functor;
+import org.apache.log.Logger;
+
+/**
+ * Aggregrate Table-Based Reporting Visualizer for JMeter. Props to the people
+ * who've done the other visualizers ahead of me (Stefano Mazzocchi), who I
+ * borrowed code from to start me off (and much code may still exist). Thank
+ * you!
+ * 
+ * @version $Revision$ on $Date$
+ */
+public class StatGraphVisualizer extends AbstractVisualizer implements Clearable,
+ActionListener {
+    transient private static Logger log = LoggingManager.getLoggerForClass();
+	private final String[] COLUMNS = { JMeterUtils.getResString("URL"),
+			JMeterUtils.getResString("aggregate_report_count"), JMeterUtils.getResString("average"),
+			JMeterUtils.getResString("aggregate_report_median"), JMeterUtils.getResString("aggregate_report_90%_line"),
+			JMeterUtils.getResString("aggregate_report_min"), JMeterUtils.getResString("aggregate_report_max"),
+			JMeterUtils.getResString("aggregate_report_error%"), JMeterUtils.getResString("aggregate_report_rate"),
+			JMeterUtils.getResString("aggregate_report_bandwidth") };
+    
+    private final String[] GRAPH_COLUMNS = {JMeterUtils.getResString("average"),
+            JMeterUtils.getResString("aggregate_report_median"),
+            JMeterUtils.getResString("aggregate_report_90%_line"),
+            JMeterUtils.getResString("aggregate_report_min"),
+            JMeterUtils.getResString("aggregate_report_max")};
+
+	private final String TOTAL_ROW_LABEL = JMeterUtils.getResString("aggregate_report_total_label");
+
+	protected JTable myJTable;
+
+	protected JScrollPane myScrollPane;
+
+	transient private ObjectTableModel model;
+
+	Map tableRows = Collections.synchronizedMap(new HashMap());
+    
+    protected AxisGraph graphPanel = null;
+    
+    protected VerticalPanel graph = null;
+    
+    protected JScrollPane graphScroll = null;
+    
+    protected JSplitPane spane = null;
+    
+    protected JLabeledChoice columns = 
+        new JLabeledChoice(JMeterUtils.getResString("aggregate_graph_column"),GRAPH_COLUMNS);
+    
+    protected double[][] data = null;
+    
+    protected JButton displayButton = 
+        new JButton(JMeterUtils.getResString("aggregate_graph_display"));
+    
+    protected JButton saveGraph = 
+        new JButton(JMeterUtils.getResString("aggregate_graph_save"));
+    
+    protected JButton saveTable = 
+        new JButton(JMeterUtils.getResString("aggregate_graph_save_table"));
+    
+    JLabeledTextField graphTitle = 
+        new JLabeledTextField(JMeterUtils.getResString("aggregate_graph_user_title"));
+    JLabeledTextField graphWidth = 
+        new JLabeledTextField(JMeterUtils.getResString("aggregate_graph_width"));
+    JLabeledTextField graphHeight = 
+        new JLabeledTextField(JMeterUtils.getResString("aggregate_graph_height"));
+    
+    protected String yAxisLabel = JMeterUtils.getResString("aggregate_graph_response_time");
+    
+    protected String yAxisTitle = JMeterUtils.getResString("aggregate_graph_ms");
+    
+    protected boolean saveGraphToFile = false;
+    
+    protected int defaultWidth = 400;
+    
+    protected int defaultHeight = 300;
+
+	public StatGraphVisualizer() {
+		super();
+		model = new ObjectTableModel(COLUMNS, new Functor[] { new Functor("getLabel"), new Functor("getCount"),
+				new Functor("getMeanAsNumber"), new Functor("getMedian"),
+				new Functor("getPercentPoint", new Object[] { new Float(.900) }), new Functor("getMin"),
+				new Functor("getMax"), new Functor("getErrorPercentageString"), new Functor("getRateString"),
+				new Functor("getPageSizeString") }, new Functor[] { null, null, null, null, null, null, null, null,
+				null, null }, new Class[] { String.class, Long.class, Long.class, Long.class, Long.class, Long.class,
+				Long.class, String.class, String.class, String.class });
+		clear();
+		init();
+	}
+
+	public String getLabelResource() {
+		return "aggregate_graph_title";
+	}
+
+	public void add(SampleResult res) {
+		SamplingStatCalculator row = null;
+		synchronized (tableRows) {
+			row = (SamplingStatCalculator) tableRows.get(res.getSampleLabel());
+			if (row == null) {
+				row = new SamplingStatCalculator(res.getSampleLabel());
+				tableRows.put(row.getLabel(), row);
+				model.insertRow(row, model.getRowCount() - 1);
+			}
+		}
+		row.addSample(res);
+		((SamplingStatCalculator) tableRows.get(TOTAL_ROW_LABEL)).addSample(res);
+		model.fireTableDataChanged();
+	}
+
+	/**
+	 * Clears this visualizer and its model, and forces a repaint of the table.
+	 */
+	public void clear() {
+		model.clearData();
+		tableRows.clear();
+		tableRows.put(TOTAL_ROW_LABEL, new SamplingStatCalculator(TOTAL_ROW_LABEL));
+		model.addRow(tableRows.get(TOTAL_ROW_LABEL));
+	}
+
+	// overrides AbstractVisualizer
+	// forces GUI update after sample file has been read
+	public TestElement createTestElement() {
+		TestElement t = super.createTestElement();
+
+		// sleepTill = 0;
+		return t;
+	}
+
+	/**
+	 * Main visualizer setup.
+	 */
+	private void init() {
+		this.setLayout(new BorderLayout());
+
+		// MAIN PANEL
+		JPanel mainPanel = new JPanel();
+		Border margin = new EmptyBorder(10, 10, 5, 10);
+        Border margin2 = new EmptyBorder(10, 10, 5, 10);
+        
+		mainPanel.setBorder(margin);
+		mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
+		mainPanel.add(makeTitlePanel());
+
+		myJTable = new JTable(model);
+		myJTable.setPreferredScrollableViewportSize(new Dimension(500, 80));
+		myScrollPane = new JScrollPane(myJTable);
+        
+        graph = new VerticalPanel();
+        graph.setBorder(margin2);
+
+
+        JLabel graphLabel = new JLabel(JMeterUtils.getResString("aggregate_graph"));
+        graphPanel = new AxisGraph();
+        graphPanel.setPreferredSize(new Dimension(defaultWidth,defaultHeight));
+
+        // horizontal panel for the buttons
+        HorizontalPanel buttonpanel = new HorizontalPanel();
+        buttonpanel.add(columns);
+        buttonpanel.add(displayButton);
+        buttonpanel.add(saveGraph);
+        buttonpanel.add(saveTable);
+        
+        graph.add(graphLabel);
+        graph.add(graphTitle);
+        graph.add(graphWidth);
+        graph.add(graphHeight);
+        graph.add(buttonpanel);
+        graph.add(graphPanel);
+
+        displayButton.addActionListener(this);
+        saveGraph.addActionListener(this);
+        saveTable.addActionListener(this);
+        graphScroll = new JScrollPane(graph);
+        graphScroll.setAutoscrolls(true);
+
+        spane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
+        spane.setLeftComponent(myScrollPane);
+        spane.setRightComponent(graphScroll);
+        spane.setResizeWeight(.2);
+        spane.setContinuousLayout(true);
+
+        this.add(mainPanel, BorderLayout.NORTH);
+        this.add(spane,BorderLayout.CENTER);
+	}
+    
+    public void makeGraph() {
+        String wstr = graphWidth.getText();
+        String hstr = graphHeight.getText();
+        if (wstr.length() == 0) {
+            wstr = "450";
+        }
+        if (hstr.length() == 0) {
+            hstr = "250";
+        }
+        int width = Integer.parseInt(wstr);
+        int height = Integer.parseInt(hstr);
+
+        graphPanel.setData(this.getData());
+        graphPanel.setHeight(height);
+        graphPanel.setWidth(width);
+        graphPanel.setTitle(graphTitle.getText());
+        graphPanel.setXAxisLabels(getAxisLabels());
+        graphPanel.setXAxisTitle(columns.getText());
+        graphPanel.setYAxisLabels(this.yAxisLabel);
+        graphPanel.setYAxisTitle(this.yAxisTitle);
+
+        graphPanel.setPreferredSize(new Dimension(width,height));
+        graph.resize(new Dimension(graph.getWidth(), height + 120));
+        spane.repaint();
+    }
+    
+    public double[][] getData() {
+        if (model.getRowCount() > 1) {
+            int count = model.getRowCount() -1;
+            int col = model.findColumn(columns.getText());
+            double[][] data = new double[1][count];
+            for (int idx=0; idx < count; idx++) {
+                data[0][idx] = ((Number)model.getValueAt(idx,col)).doubleValue();
+            }
+            return data;
+        } else {
+            return new double[][]{ { 250, 45, 36, 66, 145, 80, 55  } };
+        }
+    }
+    
+    public String[] getAxisLabels() {
+        if (model.getRowCount() > 1) {
+            int count = model.getRowCount() -1;
+            String[] labels = new String[count];
+            for (int idx=0; idx < count; idx++) {
+                labels[idx] = (String)model.getValueAt(idx,0);
+            }
+            return labels;
+        } else {
+            return new String[]{ "/", "/samples", "/jsp-samples", "/manager", "/manager/status", "/hello", "/world" };
+        }
+    }
+    
+    /**
+     * We use this method to get the data, since we are using
+     * ObjectTableModel, so the calling getDataVector doesn't 
+     * work as expected.
+     * @return
+     */
+    public Vector getAllTableData() {
+        Vector data = new Vector();
+        if (model.getRowCount() > 0) {
+            for (int rw=0; rw < model.getRowCount(); rw++) {
+                int cols = model.getColumnCount();
+                Vector column = new Vector();
+                data.add(column);
+                for (int idx=0; idx < cols; idx++) {
+                    Object val = model.getValueAt(rw,idx);
+                    column.add(val);
+                }
+            }
+        }
+        return data;
+    }
+    
+    public void actionPerformed(ActionEvent event) {
+        if (event.getSource() == displayButton) {
+            makeGraph();
+        } else if (event.getSource() == saveGraph) {
+            saveGraphToFile = true;
+            try {
+                ActionRouter.getInstance().getAction(
+                        SaveGraphics.SAVE_GRAPHICS,SaveGraphics.class.getName()).doAction(
+                                new ActionEvent(this,1,SaveGraphics.SAVE_GRAPHICS));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        } else if (event.getSource() == saveTable) {
+            JFileChooser chooser = FileDialoger.promptToSaveFile(
+                    "statistics.csv");
+            File output = chooser.getSelectedFile();
+            FileWriter writer = null;
+            try {
+                writer = new FileWriter(output);
+                Vector data = this.getAllTableData();
+                OldSaveService.saveCSVStats(data,writer);
+                writer.close();
+            } catch (FileNotFoundException e) {
+                log.warn(e.getMessage());
+            } catch (IOException e) {
+                log.warn(e.getMessage());
+            }
+        }
+    }
+    
+    public JComponent getPrintableComponent() {
+        if (saveGraphToFile == true) {
+            saveGraphToFile = false;
+            graphPanel.setBounds(graphPanel.getLocation().x,graphPanel.getLocation().y,
+                    graphPanel.width,graphPanel.height);
+            return graphPanel;
+        } else {
+            return this;
+        }
+    }
+}
diff --git a/src/core/org/apache/jmeter/DynamicClassLoader.java b/src/core/org/apache/jmeter/DynamicClassLoader.java
new file mode 100644
index 0000000..b248736
--- /dev/null
+++ b/src/core/org/apache/jmeter/DynamicClassLoader.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+package org.apache.jmeter;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLStreamHandlerFactory;
+
+/**
+ * @author pete
+ *
+ * This is a basic URL classloader for loading new resources
+ * dynamically.
+ * 
+ * It allows public access to the addURL() method.
+ * 
+ * It also adds a convenience method to update the current thread classloader
+ *
+ */
+public class DynamicClassLoader extends URLClassLoader {
+
+	public DynamicClassLoader(URL[] urls) {
+		super(urls);
+	}
+
+	public DynamicClassLoader(URL[] urls, ClassLoader parent) {
+		super(urls, parent);
+	}
+
+	public DynamicClassLoader(URL[] urls, ClassLoader parent,
+			URLStreamHandlerFactory factory) {
+		super(urls, parent, factory);
+	}
+
+    // Make the addURL method visible
+    public void addURL(URL url) {
+        super.addURL(url);
+    }
+
+    /**
+     * 
+     * @param urls - list of URLs to add to the thread's classloader
+     */
+    public static void updateLoader(URL [] urls) {
+        DynamicClassLoader loader 
+            = (DynamicClassLoader) Thread.currentThread().getContextClassLoader();
+        for(int i=0;i<urls.length;i++) {
+            loader.addURL(urls[i]);
+        }
+    }
+}
diff --git a/src/core/org/apache/jmeter/JMeter.java b/src/core/org/apache/jmeter/JMeter.java
index bcdc63d..007970c 100644
--- a/src/core/org/apache/jmeter/JMeter.java
+++ b/src/core/org/apache/jmeter/JMeter.java
@@ -23,11 +23,15 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.Authenticator;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
 import java.util.Properties;
+import java.util.StringTokenizer;
 
 import org.apache.commons.cli.avalon.CLArgsParser;
 import org.apache.commons.cli.avalon.CLOption;
@@ -227,7 +231,10 @@ public class JMeter implements JMeterPlugin {
 			setProxy(parser);
 			log.info("Version " + JMeterUtils.getJMeterVersion());
 			log.info("java.version=" + System.getProperty("java.version"));
+			log.info("Locale=" + Locale.getDefault().getDisplayName());
 			log.info(JMeterUtils.getJMeterCopyright());
+            
+            updateClassLoader();
 			if (parser.getArgumentById(VERSION_OPT) != null) {
 				System.out.println(JMeterUtils.getJMeterCopyright());
 				System.out.println("Version " + JMeterUtils.getJMeterVersion());
@@ -255,7 +262,31 @@ public class JMeter implements JMeterPlugin {
 		}
 	}
 
-	/**
+    // Update classloader if necessary
+	private void updateClassLoader() {
+        String userpath= JMeterUtils.getPropDefault("user.classpath","");
+        if (userpath.length()> 0){
+            log.info("user.classpath="+userpath);
+            StringTokenizer tok = new StringTokenizer(userpath, File.pathSeparator);
+            while(tok.hasMoreTokens()) {
+                String path=tok.nextToken();
+                File f=new File(path);
+                if (!f.canRead() && !f.isDirectory()) {
+                    log.warn("Can't read "+path);   
+                } else {
+                    URL url;
+                    try {
+                        url = new URL("file","",path);
+                        NewDriver.addURL(url);
+                    } catch (MalformedURLException e) {
+                        log.warn("Can't create URL for "+path+" "+e);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
 	 * 
 	 */
 	private void startBSH() {
diff --git a/src/core/org/apache/jmeter/NewDriver.java b/src/core/org/apache/jmeter/NewDriver.java
index 9f94683..219c680 100644
--- a/src/core/org/apache/jmeter/NewDriver.java
+++ b/src/core/org/apache/jmeter/NewDriver.java
@@ -24,7 +24,6 @@ import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.StringTokenizer;
@@ -35,7 +34,7 @@ import java.util.StringTokenizer;
  */
 public final class NewDriver {
 	/** The class loader to use for loading JMeter classes. */
-	private static URLClassLoader loader;
+	private static DynamicClassLoader loader;
 
 	/** The directory JMeter is installed in. */
 	private static String jmDir;
@@ -65,7 +64,8 @@ public final class NewDriver {
 
 		StringBuffer classpath = new StringBuffer();
 		File[] libDirs = new File[] { new File(jmDir + File.separator + "lib"),
-				new File(jmDir + File.separator + "lib" + File.separator + "ext") };
+				new File(jmDir + File.separator + "lib" + File.separator + "ext"),
+                new File(jmDir + File.separator + "lib" + File.separator + "junit")};
 		for (int a = 0; a < libDirs.length; a++) {
 			File[] libJars = libDirs[a].listFiles(new FilenameFilter() {
 				public boolean accept(File dir, String name) {
@@ -99,8 +99,7 @@ public final class NewDriver {
 		}
 
 		System.setProperty("java.class.path", System.getProperty("java.class.path") + classpath.toString());
-		loader = new URLClassLoader((URL[]) jars.toArray(new URL[0]));
-
+		loader = new DynamicClassLoader((URL[]) jars.toArray(new URL[0]));
 	}
 
 	/**
@@ -109,6 +108,19 @@ public final class NewDriver {
 	private NewDriver() {
 	}
 
+    public static void addURL(String url) {
+        File furl = new File(url);
+        try {
+            loader.addURL(furl.toURL());
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        }
+    }
+    
+    public static void addURL(URL url) {
+        loader.addURL(url);
+    }
+    
 	/**
 	 * Get the directory where JMeter is installed. This is the absolute path
 	 * name.
diff --git a/src/core/org/apache/jmeter/config/Argument.java b/src/core/org/apache/jmeter/config/Argument.java
index d45706a..02190d2 100644
--- a/src/core/org/apache/jmeter/config/Argument.java
+++ b/src/core/org/apache/jmeter/config/Argument.java
@@ -22,6 +22,8 @@ import java.io.Serializable;
 
 import org.apache.jmeter.testelement.AbstractTestElement;
 import org.apache.jmeter.testelement.property.StringProperty;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
 
 // Mark Walsh, 2002-08-03, add metadata attribute
 // add constructor Argument(String name, Object value, Object metadata)
@@ -36,6 +38,7 @@ import org.apache.jmeter.testelement.property.StringProperty;
  * @version $Revision$
  */
 public class Argument extends AbstractTestElement implements Serializable {
+    private static Logger log = LoggingManager.getLoggerForClass();
 	/** Name used to store the argument's name. */
 	public static final String ARG_NAME = "Argument.name";
 
diff --git a/src/core/org/apache/jmeter/config/Arguments.java b/src/core/org/apache/jmeter/config/Arguments.java
index 94044d8..fac807e 100644
--- a/src/core/org/apache/jmeter/config/Arguments.java
+++ b/src/core/org/apache/jmeter/config/Arguments.java
@@ -27,6 +27,8 @@ import java.util.Map;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.PropertyIterator;
 import org.apache.jmeter.testelement.property.TestElementProperty;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
 
 // Mark Walsh, 2002-08-03 add method:
 // addArgument(String name, Object value, Object metadata)
@@ -41,6 +43,7 @@ import org.apache.jmeter.testelement.property.TestElementProperty;
  * @version $Revision$
  */
 public class Arguments extends ConfigTestElement implements Serializable {
+    private static Logger log = LoggingManager.getLoggerForClass();
 	/** The name of the property used to store the arguments. */
 	public static final String ARGUMENTS = "Arguments.arguments";
 
diff --git a/src/core/org/apache/jmeter/control/ReplaceableController.java b/src/core/org/apache/jmeter/control/ReplaceableController.java
index b9cdd85..00d34d8 100644
--- a/src/core/org/apache/jmeter/control/ReplaceableController.java
+++ b/src/core/org/apache/jmeter/control/ReplaceableController.java
@@ -31,14 +31,6 @@ import org.apache.jorphan.collections.HashTree;
  * @version $Revision$
  */
 public interface ReplaceableController {
-	/**
-	 * Returns the TestElement that should replace the current
-	 * ReplaceableCoroller.
-	 * 
-	 * @return TestElement
-	 * @see org.apache.jmeter.testelement.TestElement
-	 */
-	public TestElement getReplacement();
 
 	/**
 	 * Used to replace the test execution tree (usually by adding the
@@ -50,5 +42,5 @@ public interface ReplaceableController {
 	 * @see org.apache.jorphan.collections.HashTree
 	 * @see org.apache.jmeter.gui.action.AbstractAction#convertSubTree
 	 */
-	public void replace(HashTree tree);
+	public HashTree getReplacementSubTree();
 }
diff --git a/src/core/org/apache/jmeter/control/gui/TestPlanGui.java b/src/core/org/apache/jmeter/control/gui/TestPlanGui.java
index 9fa38b9..9264362 100644
--- a/src/core/org/apache/jmeter/control/gui/TestPlanGui.java
+++ b/src/core/org/apache/jmeter/control/gui/TestPlanGui.java
@@ -32,6 +32,7 @@ import javax.swing.JTextArea;
 import org.apache.jmeter.config.Arguments;
 import org.apache.jmeter.config.gui.ArgumentsPanel;
 import org.apache.jmeter.gui.AbstractJMeterGuiComponent;
+import org.apache.jmeter.gui.util.FileListPanel;
 import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.gui.util.VerticalPanel;
 import org.apache.jmeter.testelement.AbstractTestElement;
@@ -62,7 +63,9 @@ public class TestPlanGui extends AbstractJMeterGuiComponent {
 	/** A panel to contain comments on the test plan. */
 	private JTextArea commentPanel;
 
-	/**
+    FileListPanel browseJar = null;
+
+    /**
 	 * Create a new TestPlanGui.
 	 */
 	public TestPlanGui() {
@@ -113,6 +116,7 @@ public class TestPlanGui extends AbstractJMeterGuiComponent {
 			tp.setSerialized(serializedMode.isSelected());
 			tp.setUserDefinedVariables((Arguments) argsPanel.createTestElement());
 			tp.setProperty(TestPlan.COMMENTS, commentPanel.getText());
+            tp.setTestPlanClasspathArray(browseJar.getFiles());
 		}
 	}
 
@@ -151,6 +155,7 @@ public class TestPlanGui extends AbstractJMeterGuiComponent {
 			argsPanel.configure((Arguments) el.getProperty(TestPlan.USER_DEFINED_VARIABLES).getObjectValue());
 		}
 		commentPanel.setText(el.getPropertyAsString(TestPlan.COMMENTS));
+        browseJar.setFiles( ((TestPlan)el).getTestPlanClasspathArray() );
 	}
 
 	/**
@@ -173,6 +178,11 @@ public class TestPlanGui extends AbstractJMeterGuiComponent {
 		panel.add(commentPanel);
 		return panel;
 	}
+    
+    protected Container createClassPathPanel() {
+        browseJar = new FileListPanel(JMeterUtils.getResString("test_plan_classpath_browse"), ".jar");
+        return browseJar;
+    }
 
 	/**
 	 * Initialize the components and layout of this component.
@@ -194,6 +204,7 @@ public class TestPlanGui extends AbstractJMeterGuiComponent {
 		explain.setEditable(false);
 		explain.setBackground(this.getBackground());
 		southPanel.add(explain);
+        southPanel.add(createClassPathPanel());
 
 		add(southPanel, BorderLayout.SOUTH);
 	}
diff --git a/src/core/org/apache/jmeter/engine/PreCompiler.java b/src/core/org/apache/jmeter/engine/PreCompiler.java
index a7af742..7eba7eb 100644
--- a/src/core/org/apache/jmeter/engine/PreCompiler.java
+++ b/src/core/org/apache/jmeter/engine/PreCompiler.java
@@ -52,21 +52,25 @@ public class PreCompiler implements HashTreeTraverser {
 	 * @see HashTreeTraverser#addNode(Object, HashTree)
 	 */
 	public void addNode(Object node, HashTree subTree) {
+        if(node instanceof TestElement)
+        {
+            try {
+                replacer.replaceValues((TestElement) node);
+            } catch (InvalidVariableException e) {
+                log.error("invalid variables", e);
+            }
+        }
 		if (node instanceof TestPlan) {
-			Map args = ((TestPlan) node).getUserDefinedVariables();
+            ((TestPlan)node).prepareForPreCompile(); //A hack to make user-defined variables in the testplan element more dynamic
+            Map args = ((TestPlan) node).getUserDefinedVariables();
 			replacer.setUserDefinedVariables(args);
 			JMeterVariables vars = new JMeterVariables();
 			vars.putAll(args);
 			JMeterContextService.getContext().setVariables(vars);
-		} else if (node instanceof TestElement) {
-			try {
-				replacer.replaceValues((TestElement) node);
-			} catch (InvalidVariableException e) {
-				log.error("invalid variables", e);
-			}
-		}
+		} 
 
 		if (node instanceof Arguments) {
+            ((Arguments)node).setRunningVersion(true);
 			Map args = ((Arguments) node).getArgumentsAsMap();
 			replacer.addVariables(args);
 			JMeterContextService.getContext().getVariables().putAll(args);
diff --git a/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java b/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
index 9b61f5f..929a93e 100644
--- a/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
+++ b/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
@@ -204,6 +204,7 @@ public class StandardJMeterEngine implements JMeterEngine, JMeterThreadMonitor,
 	}
 
 	protected void notifyTestListenersOfEnd() {
+        log.info("Notifying test listeners of end of test");
 		Iterator iter = testListeners.getSearchResults().iterator();
 		while (iter.hasNext()) {
 			TestListener tl = (TestListener) iter.next();
@@ -231,12 +232,16 @@ public class StandardJMeterEngine implements JMeterEngine, JMeterThreadMonitor,
 	}
 
 	public synchronized void threadFinished(JMeterThread thread) {
-		allThreads.remove(thread);
-		log.info("Ending thread " + thread.getThreadNum());
-		if (!serialized && allThreads.size() == 0 && !schcdule_run) {
-			log.info("Stopping test");
-			stopTest();
-		}
+		try {
+            allThreads.remove(thread);
+            log.info("Ending thread " + thread.getThreadNum());
+            if (!serialized && allThreads.size() == 0 && !schcdule_run) {
+            	log.info("Stopping test");
+            	stopTest();
+            }
+        } catch (Throwable e) {
+            log.fatalError("Call to threadFinished should never throw an exception - this can deadlock JMeter",e);
+        }
 	}
 
 	public synchronized void stopTest() {
@@ -296,7 +301,7 @@ public class StandardJMeterEngine implements JMeterEngine, JMeterThreadMonitor,
 		if (((TestPlan) plan[0]).isSerialized()) {
 			serialized = true;
 		}
-		JMeterContextService.startTest();
+        JMeterContextService.startTest();
 		compileTree();
 		/**
 		 * Notification of test listeners needs to happen after function
@@ -354,9 +359,9 @@ public class StandardJMeterEngine implements JMeterEngine, JMeterThreadMonitor,
 				log.info("Continue on error");
 			}
 
+            ListedHashTree threadGroupTree = (ListedHashTree) searcher.getSubTree(group);
+            threadGroupTree.add(group, testLevelElements);
 			for (int i = 0; running && i < threads.length; i++) {
-				ListedHashTree threadGroupTree = (ListedHashTree) searcher.getSubTree(group);
-				threadGroupTree.add(group, testLevelElements);
 				threads[i] = new JMeterThread(cloneTree(threadGroupTree), this, notifier);
 				threads[i].setThreadNum(i);
 				threads[i].setThreadGroup(group);
diff --git a/src/core/org/apache/jmeter/engine/util/ValueReplacer.java b/src/core/org/apache/jmeter/engine/util/ValueReplacer.java
index 33d20f7..e43affa 100644
--- a/src/core/org/apache/jmeter/engine/util/ValueReplacer.java
+++ b/src/core/org/apache/jmeter/engine/util/ValueReplacer.java
@@ -120,8 +120,8 @@ public class ValueReplacer {
 			}
 			if (val instanceof StringProperty) {
 				// Must not convert TestElement.gui_class etc
-				// TODO but perhaps we want to convert TestElement.name ?
-				if (!val.getName().startsWith("TestElement.")) {
+				if (!val.getName().equals(TestElement.GUI_CLASS) &&
+                        !val.getName().equals(TestElement.TEST_CLASS)) {
 					val = transform.transformValue(val);
 					if (log.isDebugEnabled()) {
 						log.debug("Replacement result: " + val);
diff --git a/src/core/org/apache/jmeter/gui/GuiPackage.java b/src/core/org/apache/jmeter/gui/GuiPackage.java
index cc2a5ae..6abe345 100644
--- a/src/core/org/apache/jmeter/gui/GuiPackage.java
+++ b/src/core/org/apache/jmeter/gui/GuiPackage.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.swing.JOptionPane;
 import javax.swing.JPopupMenu;
 
 import org.apache.jmeter.engine.util.ValueReplacer;
@@ -306,6 +307,11 @@ public final class GuiPackage implements LocaleChangeListener {
 			return node;
 		} catch (NoClassDefFoundError e) {
 			log.error("Problem retrieving gui for " + objClass, e);
+            String msg="Cannot find class: "+e.getMessage();
+            JOptionPane.showMessageDialog(null,
+                    msg,
+                    "Missing jar? See log file." , 
+                    JOptionPane.ERROR_MESSAGE);
 			throw new RuntimeException(e.toString()); // Probably a missing
 														// jar
 		} catch (ClassNotFoundException e) {
diff --git a/src/core/org/apache/jmeter/gui/SavePropertyDialog.java b/src/core/org/apache/jmeter/gui/SavePropertyDialog.java
index b6ca369..cb9ecfe 100644
--- a/src/core/org/apache/jmeter/gui/SavePropertyDialog.java
+++ b/src/core/org/apache/jmeter/gui/SavePropertyDialog.java
@@ -92,7 +92,7 @@ public class SavePropertyDialog extends JDialog implements ActionListener {
 			JPanel checkPanel = new JPanel(new GridLayout(x, 3));
 			for (int i = 0; i < methods.length; i++) {
 				String name = methods[i].getName();
-				if (name.startsWith("save")) {
+				if (name.startsWith("save") && methods[i].getParameterTypes().length == 0) {
 					try {
 						name = name.substring(4);
 						JCheckBox check = new JCheckBox(JMeterUtils.getResString("save " + name), ((Boolean) methods[i]
diff --git a/src/core/org/apache/jmeter/gui/action/AbstractAction.java b/src/core/org/apache/jmeter/gui/action/AbstractAction.java
index 7d082db..c13586f 100644
--- a/src/core/org/apache/jmeter/gui/action/AbstractAction.java
+++ b/src/core/org/apache/jmeter/gui/action/AbstractAction.java
@@ -55,16 +55,20 @@ public abstract class AbstractAction implements Command {
 	protected void convertSubTree(HashTree tree) {
 		Iterator iter = new LinkedList(tree.list()).iterator();
 		while (iter.hasNext()) {
-			JMeterTreeNode item = (JMeterTreeNode) iter.next();
+			Object o = iter.next();
+			if(o instanceof TestElement)
+				continue; //hey, no need to convert
+			JMeterTreeNode item = (JMeterTreeNode) o;
 			if (item.isEnabled()) {
 				if (item.getUserObject() instanceof ReplaceableController) {
 					ReplaceableController rc = (ReplaceableController) item.getTestElement();
 					HashTree subTree = tree.getTree(item);
 
 					if (subTree != null) {
-						rc.replace(subTree);
-						convertSubTree(subTree);
-						tree.replace(item, rc.getReplacement());
+						HashTree replacementTree = rc.getReplacementSubTree();
+						convertSubTree(replacementTree);
+						tree.replace(item,rc);
+						tree.set(rc,replacementTree);
 					}
 				} else {
 					convertSubTree(tree.getTree(item));
diff --git a/src/core/org/apache/jmeter/gui/util/FileListPanel.java b/src/core/org/apache/jmeter/gui/util/FileListPanel.java
new file mode 100644
index 0000000..571b53a
--- /dev/null
+++ b/src/core/org/apache/jmeter/gui/util/FileListPanel.java
@@ -0,0 +1,217 @@
+// $Header$
+/*
+ * Copyright 2002-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.gui.util;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.apache.jmeter.gui.GuiPackage;
+import org.apache.jmeter.gui.JMeterFileFilter;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.ObjectTableModel;
+import org.apache.jorphan.reflect.Functor;
+
+/**
+ * @author Peter Lin 
+ * @version $Revision$ Last updated: $Date$
+ */
+public class FileListPanel extends JPanel implements ActionListener {
+	protected JTable files = null;
+
+    protected transient ObjectTableModel tableModel = null;
+    
+	JButton browse = new JButton(JMeterUtils.getResString("browse"));
+
+    JButton clear = new JButton(JMeterUtils.getResString("clear"));
+
+    private JButton delete = new JButton(JMeterUtils.getResString("delete"));
+
+    List listeners = new LinkedList();
+
+	String title;
+
+	String filetype;
+
+	/**
+	 * Constructor for the FilePanel object.
+	 */
+	public FileListPanel() {
+		title = "";
+		init();
+	}
+
+	public FileListPanel(String title) {
+		this.title = title;
+		init();
+	}
+
+	public FileListPanel(String title, String filetype) {
+		this(title);
+		this.filetype = filetype;
+        init();
+	}
+
+	/**
+	 * Constructor for the FilePanel object.
+	 */
+	public FileListPanel(ChangeListener l, String title) {
+		this.title = title;
+		init();
+		listeners.add(l);
+	}
+
+	public void addChangeListener(ChangeListener l) {
+		listeners.add(l);
+	}
+
+	private void init() {
+        this.setLayout(new BorderLayout(0, 5));
+        setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 5));
+        JLabel jtitle = new JLabel(title);
+
+        HorizontalPanel buttons = new HorizontalPanel();
+        buttons.add(jtitle);
+        buttons.add(browse);
+        buttons.add(delete);
+        buttons.add(clear);
+        add(buttons,BorderLayout.NORTH);
+
+        this.initializeTableModel();
+        files = new JTable(tableModel);
+        files.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+        files.revalidate();
+
+        JScrollPane scrollpane = new JScrollPane(files);
+        scrollpane.setPreferredSize(new Dimension(400,140));
+        add(scrollpane,BorderLayout.CENTER);
+
+		browse.setActionCommand("browse");
+		browse.addActionListener(this);
+        clear.addActionListener(this);
+        delete.addActionListener(this);
+        this.setPreferredSize(new Dimension(400,230));
+	}
+
+	/**
+	 * If the gui needs to enable/disable the FilePanel, call the method.
+	 * 
+	 * @param enable
+	 */
+	public void enableFile(boolean enable) {
+		browse.setEnabled(enable);
+        files.setEnabled(false);
+	}
+
+    /**
+     * Add a single file to the table
+     * @param f
+     */
+    public void addFilename(String f) {
+        tableModel.addRow(f);
+    }
+    
+    /**
+     * clear the files from the table
+     */
+    public void clearFiles() {
+        tableModel.clearData();
+    }
+
+    public void setFiles(String[] files) {
+        this.clearFiles();
+        for (int idx=0; idx < files.length; idx++) {
+            addFilename(files[idx]);
+        }
+    }
+    
+    public String[] getFiles() {
+        String[] files = new String[tableModel.getRowCount()];
+        for (int idx=0; idx < files.length; idx++) {
+            files[idx] = (String)tableModel.getValueAt(idx,0);
+        }
+        return files;
+    }
+    
+    protected void deleteFile() {
+        // If a table cell is being edited, we must cancel the editing before
+        // deleting the row
+
+        int rowSelected = files.getSelectedRow();
+        if (rowSelected >= 0) {
+            tableModel.removeRow(rowSelected);
+			tableModel.fireTableDataChanged();
+
+        }
+    }
+    
+	private void fireFileChanged() {
+		Iterator iter = listeners.iterator();
+		while (iter.hasNext()) {
+			((ChangeListener) iter.next()).stateChanged(new ChangeEvent(this));
+		}
+	}
+
+    protected void initializeTableModel() {
+        tableModel = new ObjectTableModel(new String[] { "Library" }, new Functor[0],
+                new Functor[0],
+                new Class[] { String.class });
+    }
+    
+	public void actionPerformed(ActionEvent e) {
+        if (e.getSource() == clear) {
+            this.clearFiles();
+        } else if (e.getActionCommand().equals("browse")) {
+			JFileChooser chooser = new JFileChooser();
+            String start = JMeterUtils.getPropDefault("user.dir", "");
+            chooser.setCurrentDirectory(new File(start));
+            chooser.setFileFilter(new JMeterFileFilter(new String[] { filetype }));
+            chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
+            chooser.setMultiSelectionEnabled(true);
+            chooser.showOpenDialog(GuiPackage.getInstance().getMainFrame());
+            File[] cfiles = chooser.getSelectedFiles();
+			if (chooser != null && cfiles != null) {
+                for (int idx=0; idx < cfiles.length; idx++) {
+                    this.addFilename(cfiles[idx].getPath());
+                }
+				fireFileChanged();
+			}
+        } else if (e.getSource() == delete) {
+            this.deleteFile();
+		} else {
+			fireFileChanged();
+		}
+	}
+}
diff --git a/src/core/org/apache/jmeter/gui/util/MenuFactory.java b/src/core/org/apache/jmeter/gui/util/MenuFactory.java
index 31513aa..6a6f9e1 100644
--- a/src/core/org/apache/jmeter/gui/util/MenuFactory.java
+++ b/src/core/org/apache/jmeter/gui/util/MenuFactory.java
@@ -81,7 +81,7 @@ public final class MenuFactory {
 	// MENU_ADD_xxx - controls which items are in the ADD menu
 	// MENU_PARENT_xxx - controls which items are in the Insert Parent menu
 	private static final String[] MENU_ADD_CONTROLLER = new String[] { MenuFactory.CONTROLLERS, MenuFactory.SAMPLERS,
-			MenuFactory.CONFIG_ELEMENTS, MenuFactory.TIMERS, MenuFactory.LISTENERS, MenuFactory.PRE_PROCESSORS,
+			MenuFactory.ASSERTIONS, MenuFactory.CONFIG_ELEMENTS, MenuFactory.TIMERS, MenuFactory.LISTENERS, MenuFactory.PRE_PROCESSORS,
 			MenuFactory.POST_PROCESSORS };
 
 	private static final String[] MENU_PARENT_CONTROLLER = new String[] { MenuFactory.CONTROLLERS };
@@ -146,7 +146,8 @@ public final class MenuFactory {
 	public static void addFileMenu(JPopupMenu menu) {
 		addSeparator(menu);
 		menu.add(makeMenuItem(JMeterUtils.getResString("open"), "Open", "open"));
-		menu.add(makeMenuItem(JMeterUtils.getResString("save_as"), "Save As", "save_as"));
+        menu.add(makeMenuItem(JMeterUtils.getResString("menu_merge"), "Merge", "merge"));
+        menu.add(makeMenuItem(JMeterUtils.getResString("save_as"), "Save As", "save_as"));
 		JMenuItem savePicture = makeMenuItem(JMeterUtils.getResString("save_as_image"), "Save Image", "save_graphics",
 				KeyStroke.getKeyStroke(KeyEvent.VK_G, KeyEvent.CTRL_MASK));
 		menu.add(savePicture);
diff --git a/src/core/org/apache/jmeter/junit/JMeterTest.java b/src/core/org/apache/jmeter/junit/JMeterTest.java
index ff042f1..3e0b1ec 100644
--- a/src/core/org/apache/jmeter/junit/JMeterTest.java
+++ b/src/core/org/apache/jmeter/junit/JMeterTest.java
@@ -173,11 +173,14 @@ public class JMeterTest extends JMeterTestCase {
 			List components = ((Element) sections.get(i)).getChildren("component");
 			for (int j = 0; j < components.size(); j++) {
 				Element comp = (Element) components.get(j);
-				guiTitles.put(comp.getAttributeValue("name"), Boolean.FALSE);
+                String nm=comp.getAttributeValue("name");
+                if (!nm.equals("SSL Manager")){// Not a true GUI component
+				    guiTitles.put(nm.replace(' ','_'), Boolean.FALSE);
+                }
 			}
 		}
 		// Add titles that don't need to be documented
-		guiTitles.put("Root", Boolean.FALSE);
+		//guiTitles.put("Root", Boolean.FALSE);
 		guiTitles.put("Example Sampler", Boolean.FALSE);
 	}
 
@@ -235,10 +238,6 @@ public class JMeterTest extends JMeterTestCase {
 		while (i.hasNext()) {
 			Object key = i.next();
 			if (!m.get(key).equals(Boolean.TRUE)) {
-				if (key.equals("SSL Manager"))// Not a true GUI component
-				{
-					continue;
-				}
 				if (unseen == 0)// first time
 				{
 					System.out.println("\nNames remaining in " + t + " Map:");
@@ -332,13 +331,13 @@ public class JMeterTest extends JMeterTestCase {
 	 */
 	public void runGUITitle() throws Exception {
 		if (guiTitles.size() > 0) {
-			String title = guiItem.getStaticLabel();
+			String title = guiItem.getDocAnchor();
 			boolean ct = guiTitles.containsKey(title);
 			if (ct)
 				guiTitles.put(title, Boolean.TRUE);// So we can detect extra
 													// entries
 			if (// Is this a work in progress or an internal GUI component?
-			(title.length() > 0) // Will be "" for internal components
+			(title != null && title.length() > 0) // Will be "" for internal components
 					&& (title.toUpperCase().indexOf("(ALPHA") == -1) && (title.toUpperCase().indexOf("(BETA") == -1)
 					&& (!title.equals("Example1")) // Skip the example samplers
 													// ...
diff --git a/src/core/org/apache/jmeter/reporters/ResultCollector.java b/src/core/org/apache/jmeter/reporters/ResultCollector.java
index 740be6b..c7b58f5 100644
--- a/src/core/org/apache/jmeter/reporters/ResultCollector.java
+++ b/src/core/org/apache/jmeter/reporters/ResultCollector.java
@@ -215,7 +215,7 @@ public class ResultCollector extends AbstractListenerElement implements SampleLi
 			writer.println(XML_HEADER);
 			writer.println(TESTRESULTS_START_V1_1);
 		} else if (saveConfig.saveFieldNames()) {
-			writer.println(OldSaveService.printableFieldNamesToString());
+			writer.println(OldSaveService.printableFieldNamesToString(saveConfig));
 		}
 	}
 
diff --git a/src/core/org/apache/jmeter/reporters/Summariser.java b/src/core/org/apache/jmeter/reporters/Summariser.java
index 56f30d3..f6da04e 100644
--- a/src/core/org/apache/jmeter/reporters/Summariser.java
+++ b/src/core/org/apache/jmeter/reporters/Summariser.java
@@ -29,7 +29,7 @@ import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.testelement.AbstractTestElement;
 import org.apache.jmeter.testelement.TestListener;
 import org.apache.jmeter.util.JMeterUtils;
-import org.apache.jmeter.visualizers.SamplingStatCalculator;
+import org.apache.jmeter.visualizers.RunningSample;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.jorphan.util.JOrphanUtils;
 import org.apache.log.Logger;
@@ -124,9 +124,9 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 		private long last = 0;// set to -1 by TestEnded to prevent double
 								// reporting
 
-		private SamplingStatCalculator delta = new SamplingStatCalculator("DELTA");
+		private RunningSample delta = new RunningSample("DELTA",0);
 
-		private SamplingStatCalculator total = new SamplingStatCalculator("TOTAL");
+		private RunningSample total = new RunningSample("TOTAL",0);
 
 		private void clear() {
 			delta.clear();
@@ -138,14 +138,15 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 		 * Add the delta values to the total values and clear the delta
 		 */
 		private synchronized void moveDelta() {
-			total.addSamples(delta);
+			total.addSample(delta);
 			delta.clear();
 		}
 	}
 
 	/**
-	 * Cached copy of Totals for this instance These do not need to be
-	 * synchronised, as they are not shared between threads
+	 * Cached copy of Totals for this instance.
+     * These do not need to be synchronised,
+     * as they are not shared between threads
 	 */
 	transient private Totals myTotals = null;
 
@@ -182,8 +183,8 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 
 		long now = System.currentTimeMillis() / 1000;// in seconds
 
-		SamplingStatCalculator myDelta = null;
-		SamplingStatCalculator myTotal = null;
+		RunningSample myDelta = null;
+		RunningSample myTotal = null;
 		boolean reportNow = false;
 
 		/*
@@ -194,14 +195,14 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 		synchronized (myTotals) {
 			if ((now > myTotals.last + INTERVAL_WINDOW) && (now % INTERVAL <= INTERVAL_WINDOW)) {
 				reportNow = true;
-				myDelta = new SamplingStatCalculator(myTotals.delta);// copy
+				myDelta = new RunningSample(myTotals.delta);// copy
 																		// the
 																		// data
 																		// to
 																		// minimise
 																		// ...
 				myTotals.moveDelta();
-				myTotal = new SamplingStatCalculator(myTotals.total);// ...
+				myTotal = new RunningSample(myTotals.total);// ...
 																		// the
 																		// synch
 																		// time
@@ -216,8 +217,8 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 			if (TOOUT)
 				System.out.println(str);
 
-			if (myTotal.getCount() != myDelta.getCount()) {// Only if we have
-															// updated them
+			// Only if we have updated them
+			if (myTotal.getNumSamples() != myDelta.getNumSamples()) {
 				str = format(myTotal, "=");
 				if (TOLOG)
 					log.info(str);
@@ -248,14 +249,14 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 	 * @param string
 	 * @return
 	 */
-	private String format(SamplingStatCalculator s, String type) {
+	private String format(RunningSample s, String type) {
 		StringBuffer tmp = new StringBuffer(20); // for intermediate use
 		StringBuffer sb = new StringBuffer(100); // output line buffer
 		sb.append(myName);
 		sb.append(" ");
 		sb.append(type);
 		sb.append(" ");
-		sb.append(longToSb(tmp, s.getCount(), 5));
+		sb.append(longToSb(tmp, s.getNumSamples(), 5));
 		sb.append(" in ");
 		long elapsed = s.getElapsed();
 		sb.append(doubleToSb(tmp, elapsed / 1000.0, 5, 1));
@@ -266,11 +267,11 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 			sb.append("******");// Rate is effectively infinite
 		}
 		sb.append("/s Avg: ");
-		sb.append(longToSb(tmp, (long) s.getMean(), 5));
+		sb.append(longToSb(tmp, s.getAverage(), 5));
 		sb.append(" Min: ");
-		sb.append(longToSb(tmp, s.getMin().longValue(), 5));
+		sb.append(longToSb(tmp, s.getMin(), 5));
 		sb.append(" Max: ");
-		sb.append(longToSb(tmp, s.getMax().longValue(), 5));
+		sb.append(longToSb(tmp, s.getMax(), 5));
 		sb.append(" Err: ");
 		sb.append(longToSb(tmp, s.getErrorCount(), 5));
 		sb.append(" (");
@@ -339,7 +340,7 @@ public class Summariser extends AbstractTestElement implements Serializable, Sam
 			Totals t = (Totals) accumulators.get(myName);
 			if (t.last != -1) {
 				String str;
-				if (t.total.getCount() != 0) {// Only print delta if different
+				if (t.total.getNumSamples() != 0) {// Only print delta if different
 												// from total
 					str = format(t.delta, "+");
 					if (TOLOG)
diff --git a/src/core/org/apache/jmeter/resources/messages.properties b/src/core/org/apache/jmeter/resources/messages.properties
index b306c22..adcf8e0 100644
--- a/src/core/org/apache/jmeter/resources/messages.properties
+++ b/src/core/org/apache/jmeter/resources/messages.properties
@@ -11,6 +11,17 @@ add_test=Add Test
 add_user=Add User
 add_value=Add Value
 addtest=Add test
+aggregate_graph=Statistical Graphs
+aggregate_graph_column=Column
+aggregate_graph_display=Display Graph
+aggregate_graph_height=Height
+aggregate_graph_ms=Milliseconds
+aggregate_graph_response_time=Response Time
+aggregate_graph_save=Save Graph
+aggregate_graph_save_table=Save Table Data
+aggregate_graph_title=Aggregate Graph
+aggregate_graph_user_title=Title for Graph
+aggregate_graph_width=Width
 aggregate_report=Aggregate Report
 aggregate_report_90%_line=90% Line
 aggregate_report_bandwidth=KB/sec
@@ -229,7 +240,9 @@ id_suffix=ID Suffix
 if_controller_label=Condition
 if_controller_title=If Controller
 ignore_subcontrollers=Ignore sub-controller blocks
+include_controller=Include Controller
 include_equals=Include Equals?
+include_path=Include Test Plan
 increment=Increment
 infinite=Forever
 initial_context_factory=Initial Context Factory
@@ -245,6 +258,7 @@ invalid_mail_address=One or more invalid e-mail addresses detected
 invalid_mail_server=Problem contacting the e-mail server (see JMeter log file)
 iteration_counter_arg_1=TRUE, for each user to have own counter, FALSE for a global counter
 iterator_num=Loop Count\:
+jar_file=Jar Files
 java_request=Java Request
 java_request_defaults=Java Request Defaults
 jms_auth_not_required=Not Required
@@ -310,6 +324,26 @@ jndi_method_title=Remote Method Configuration
 jndi_testing_title=JNDI Request
 jndi_url_jndi_props=JNDI Properties
 jp=Japanese
+junit_constructor_string=Constructor String Label
+junit_constructor_error=Unable to create an instance of the class
+junit_do_setup_teardown=Do not call setUp and tearDown
+junit_error_code=Error Code
+junit_error_default_code=9999
+junit_error_msg=Error Message
+junit_error_default_msg=An unexpected error occured
+junit_failure_code=Failure Code
+junit_failure_default_code=0001
+junit_failure_msg=Failure Message
+junit_failure_default_msg=Test failed
+junit_pkg_filter=Package Filter
+junit_request=JUnit Request
+junit_request_defaults=JUnit Request Defaults
+junit_success_code=Success Code
+junit_success_default_code=1000
+junit_success_msg=Success Message
+junit_success_default_msg=Test successful
+junit_test_method=Test Method
+junit_test_config=JUnit Test Parameters
 ldap_argument_list=LDAPArgument List
 ldap_sample_title=LDAP Request Defaults
 ldap_testing_title=LDAP Request
@@ -519,7 +553,7 @@ save_samplerdata=Save Sampler Data
 save_subresults=Save Sub Results
 save_success=Save Success
 save_threadname=Save Thread Name
-save_time=Save Time
+save_time=Save Elapsed Time
 save_timestamp=Save Time Stamp
 sbind=Single bind/unbind
 scheduler=Scheduler
@@ -608,6 +642,7 @@ test_action_target_thread=Current Thread
 test_action_title=Test Action
 test_configuration=Test Configuration
 test_plan=Test Plan
+test_plan_classpath_browse=Add directory or jar to classpath
 testplan.serialized=Run each Thread Group separately (i.e. run one group before starting the next)
 testplan_comments=Comments\:
 testt=Test
diff --git a/src/core/org/apache/jmeter/samplers/SampleSaveConfiguration.java b/src/core/org/apache/jmeter/samplers/SampleSaveConfiguration.java
index 9c15ab5..2fddfb8 100644
--- a/src/core/org/apache/jmeter/samplers/SampleSaveConfiguration.java
+++ b/src/core/org/apache/jmeter/samplers/SampleSaveConfiguration.java
@@ -476,6 +476,11 @@ public class SampleSaveConfiguration implements Cloneable, Serializable {
 	public boolean saveResponseData(SampleResult res) {
 		return responseData || TestPlan.getFunctionalMode() || (responseDataOnError && !res.isSuccessful());
 	}
+    
+    public boolean saveResponseData()
+    {
+        return responseData;
+    }
 
 	/**
 	 * @param responseData
@@ -492,6 +497,11 @@ public class SampleSaveConfiguration implements Cloneable, Serializable {
 		return samplerData || TestPlan.getFunctionalMode() // as per 2.0 branch
 				|| (responseDataOnError && !res.isSuccessful());
 	}
+    
+    public boolean saveSamplerData()
+    {
+        return samplerData;
+    }
 
 	/**
 	 * @param samplerData
diff --git a/src/core/org/apache/jmeter/save/OldSaveService.java b/src/core/org/apache/jmeter/save/OldSaveService.java
index 42d6cb8..875fef2 100644
--- a/src/core/org/apache/jmeter/save/OldSaveService.java
+++ b/src/core/org/apache/jmeter/save/OldSaveService.java
@@ -18,6 +18,7 @@
 
 package org.apache.jmeter.save;
 
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -30,6 +31,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
+import java.util.Vector;
 
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -146,56 +148,65 @@ public final class OldSaveService implements SaveServiceConstants {
 		return result;
 	}
 
+    /**
+     * Generates the field names for the output file
+     * 
+     * @return the field names as a string
+     */
+    public static String printableFieldNamesToString() {
+        return printableFieldNamesToString(_saveConfig);
+    }
+    
 	/**
 	 * Generates the field names for the output file
 	 * 
 	 * @return the field names as a string
 	 */
-	public static String printableFieldNamesToString() {
+	public static String printableFieldNamesToString(SampleSaveConfiguration saveConfig) {
 		StringBuffer text = new StringBuffer();
-		String delim = _saveConfig.getDelimiter();
+		String delim = saveConfig.getDelimiter();
 
-		if (_saveConfig.printMilliseconds() || (_saveConfig.formatter() != null)) {
+		if (saveConfig.saveTimestamp() || (saveConfig.formatter() != null)) {
 			text.append(SaveServiceConstants.TIME_STAMP);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveTime()) {
+		if (saveConfig.saveTime()) {
 			text.append(SaveServiceConstants.TIME);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveLabel()) {
+		if (saveConfig.saveLabel()) {
 			text.append(SaveServiceConstants.LABEL);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveCode()) {
+		if (saveConfig.saveCode()) {
 			text.append(SaveServiceConstants.RESPONSE_CODE);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveMessage()) {
+		if (saveConfig.saveMessage()) {
 			text.append(SaveServiceConstants.RESPONSE_MESSAGE);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveThreadName()) {
+		if (saveConfig.saveThreadName()) {
 			text.append(SaveServiceConstants.THREAD_NAME);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveDataType()) {
+		if (saveConfig.saveDataType()) {
 			text.append(SaveServiceConstants.DATA_TYPE);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveSuccess()) {
+		if (saveConfig.saveSuccess()) {
 			text.append(SaveServiceConstants.SUCCESSFUL);
 			text.append(delim);
 		}
 
-		if (_saveConfig.saveAssertionResultsFailureMessage()) {
+		if (saveConfig.saveAssertionResultsFailureMessage()) {
 			text.append(SaveServiceConstants.FAILURE_MESSAGE);
 			text.append(delim);
 		}
@@ -226,6 +237,29 @@ public final class OldSaveService implements SaveServiceConstants {
 			throw new IOException("Problem using Avalon Configuration tools");
 		}
 	}
+    
+    /**
+     * Method will save aggregate statistics as CSV. For now I put it here.
+     * Not sure if it should go in the newer SaveService instead of here.
+     * if we ever decide to get rid of this class, we'll need to move this
+     * method to the new save service.
+     * @param data
+     * @param writer
+     * @throws IOException
+     */
+    public static void saveCSVStats(Vector data, FileWriter writer) throws IOException {
+        for (int idx=0; idx < data.size(); idx++) {
+            Vector row = (Vector)data.elementAt(idx);
+            for (int idy=0; idy < row.size(); idy++) {
+                if (idy > 0) {
+                    writer.write(",");
+                }
+                Object item = row.elementAt(idy);
+                writer.write( String.valueOf(item) );
+            }
+            writer.write(System.getProperty("line.separator"));
+        }
+    }
 
 	public static SampleResult getSampleResult(Configuration config) {
 		SampleResult result = new SampleResult(config.getAttributeAsLong(TIME_STAMP, 0L), config.getAttributeAsLong(
@@ -574,13 +608,26 @@ public final class OldSaveService implements SaveServiceConstants {
 		TestElement element = null;
 
 		String testClass = config.getAttribute("class");
-		element = (TestElement) Class.forName(NameUpdater.getCurrentName(testClass)).newInstance();
+		
+        String gui_class="";
 		Configuration[] children = config.getChildren();
-
-		for (int i = 0; i < children.length; i++) {
+        for (int i = 0; i < children.length; i++) {
+            if (children[i].getName().equals("property")) {
+                if (children[i].getAttribute("name").equals(TestElement.GUI_CLASS)){
+                    gui_class=children[i].getValue();
+                }
+            }  
+        }
+        
+        String newClass = NameUpdater.getCurrentTestName(testClass,gui_class);
+
+        element = (TestElement) Class.forName(newClass).newInstance();
+
+        for (int i = 0; i < children.length; i++) {
 			if (children[i].getName().equals("property")) {
 				try {
-					element.setProperty(createProperty(children[i], testClass));
+                    JMeterProperty prop = createProperty(children[i], newClass);
+					if (prop!=null) element.setProperty(prop);
 				} catch (Exception ex) {
 					log.error("Problem loading property", ex);
 					element.setProperty(children[i].getAttribute("name"), "");
@@ -589,11 +636,11 @@ public final class OldSaveService implements SaveServiceConstants {
 				element.setProperty(new TestElementProperty(children[i].getAttribute("name", ""),
 						createTestElement(children[i])));
 			} else if (children[i].getName().equals("collection")) {
-				element.setProperty(new CollectionProperty(children[i].getAttribute("name", ""), createCollection(
-						children[i], testClass)));
+				element.setProperty(new CollectionProperty(children[i].getAttribute("name", ""),
+                        createCollection(children[i], newClass)));
 			} else if (children[i].getName().equals("map")) {
-				element.setProperty(new MapProperty(children[i].getAttribute("name", ""), createMap(children[i],
-						testClass)));
+				element.setProperty(new MapProperty(children[i].getAttribute("name", ""),
+                        createMap(children[i],newClass)));
 			}
 		}
 		return element;
@@ -606,14 +653,16 @@ public final class OldSaveService implements SaveServiceConstants {
 
 		for (int i = 0; i < items.length; i++) {
 			if (items[i].getName().equals("property")) {
-				coll.add(createProperty(items[i], testClass));
+                JMeterProperty prop = createProperty(items[i], testClass);
+				if (prop!=null) coll.add(prop);
 			} else if (items[i].getName().equals("testelement")) {
 				coll.add(new TestElementProperty(items[i].getAttribute("name", ""), createTestElement(items[i])));
 			} else if (items[i].getName().equals("collection")) {
 				coll.add(new CollectionProperty(items[i].getAttribute("name", ""),
 						createCollection(items[i], testClass)));
 			} else if (items[i].getName().equals("string")) {
-				coll.add(createProperty(items[i], testClass));
+                JMeterProperty prop = createProperty(items[i], testClass);
+				if (prop!=null) coll.add(prop);
 			} else if (items[i].getName().equals("map")) {
 				coll.add(new MapProperty(items[i].getAttribute("name", ""), createMap(items[i], testClass)));
 			}
@@ -625,17 +674,25 @@ public final class OldSaveService implements SaveServiceConstants {
 			ClassNotFoundException, InstantiationException {
 		String value = config.getValue("");
 		String name = config.getAttribute("name", value);
+        String oname = name;
 		String type = config.getAttribute("propType", StringProperty.class.getName());
 
 		// Do upgrade translation:
 		name = NameUpdater.getCurrentName(name, testClass);
-		if (TestElement.GUI_CLASS.equals(name) || TestElement.TEST_CLASS.equals(name)) {
+		if (TestElement.GUI_CLASS.equals(name)) {
 			value = NameUpdater.getCurrentName(value);
+        } else if (TestElement.TEST_CLASS.equals(name)) {
+            value=testClass; // must always agree
 		} else {
 			value = NameUpdater.getCurrentName(value, name, testClass);
 		}
 
-		// Create the property:
+        // Delete any properties whose name converts to the empty string
+        if (oname.length() != 0 && name.length()==0) {
+            return null;
+        }
+
+        // Create the property:
 		JMeterProperty prop = (JMeterProperty) Class.forName(type).newInstance();
 		prop.setName(name);
 		prop.setObjectValue(value);
@@ -651,7 +708,7 @@ public final class OldSaveService implements SaveServiceConstants {
 		for (int i = 0; i < items.length; i++) {
 			if (items[i].getName().equals("property")) {
 				JMeterProperty prop = createProperty(items[i], testClass);
-				map.put(prop.getName(), prop);
+				if (prop!=null) map.put(prop.getName(), prop);
 			} else if (items[i].getName().equals("testelement")) {
 				map.put(items[i].getAttribute("name", ""), new TestElementProperty(items[i].getAttribute("name", ""),
 						createTestElement(items[i])));
diff --git a/src/core/org/apache/jmeter/save/SaveService.java b/src/core/org/apache/jmeter/save/SaveService.java
index fb3cbb2..0caf7ea 100644
--- a/src/core/org/apache/jmeter/save/SaveService.java
+++ b/src/core/org/apache/jmeter/save/SaveService.java
@@ -220,23 +220,23 @@ public class SaveService {
 
 	private static void checkVersions() {
 		versionsOK = true;
-		checkVersion(BooleanPropertyConverter.class, "1.4");
-		checkVersion(HashTreeConverter.class, "1.2");
-		checkVersion(IntegerPropertyConverter.class, "1.3");
-		checkVersion(LongPropertyConverter.class, "1.3");
-		checkVersion(MultiPropertyConverter.class, "1.3");
-		checkVersion(SampleResultConverter.class, "1.8");
+		checkVersion(BooleanPropertyConverter.class, "1.5");
+		checkVersion(HashTreeConverter.class, "1.3");
+		checkVersion(IntegerPropertyConverter.class, "1.4");
+		checkVersion(LongPropertyConverter.class, "1.4");
+		checkVersion(MultiPropertyConverter.class, "1.4");
+		checkVersion(SampleResultConverter.class, "1.9");
 		/*
 		 * Should check this, but tricky to do, because not built until later.
 		 * 
 		 * checkVersion(HTTPResultConverter.class, "1.6");
 		 * 
 		 */
-		checkVersion(StringPropertyConverter.class, "1.6");
-		checkVersion(TestElementConverter.class, "1.3");
-		checkVersion(TestElementPropertyConverter.class, "1.6");
-		checkVersion(ScriptWrapperConverter.class, "1.5");
-		checkVersion(TestResultWrapperConverter.class, "1.4");
+		checkVersion(StringPropertyConverter.class, "1.7");
+		checkVersion(TestElementConverter.class, "1.4");
+		checkVersion(TestElementPropertyConverter.class, "1.7");
+		checkVersion(ScriptWrapperConverter.class, "1.6");
+		checkVersion(TestResultWrapperConverter.class, "1.5");
 		if (!PROPVERSION.equalsIgnoreCase(propertiesVersion)) {
 			log.warn("Property file - expected " + PROPVERSION + ", found " + propertiesVersion);
 		}
diff --git a/src/core/org/apache/jmeter/services/FileServer.java b/src/core/org/apache/jmeter/services/FileServer.java
index a18d0d5..a8e6a06 100644
--- a/src/core/org/apache/jmeter/services/FileServer.java
+++ b/src/core/org/apache/jmeter/services/FileServer.java
@@ -72,7 +72,6 @@ public class FileServer {
 	}
 
 	public void setBasedir(String basedir) throws IOException {
-		log.info("Setting basedir to: " + basedir);
 		if (filesOpen()) {
 			throw new IOException("Files are still open, cannot change base directory");
 		}
@@ -90,7 +89,6 @@ public class FileServer {
 	}
 
 	public synchronized void reserveFile(String filename) {
-		log.info("filename = " + filename + " base = " + base);
 		if (!files.containsKey(filename)) {
 			Object[] file = new Object[] { new File(base, filename), null };
 			files.put(filename, file);
@@ -151,7 +149,7 @@ public class FileServer {
 	 */
 	public synchronized void closeFile(String name) throws IOException {
 		Object[] file = (Object[]) files.get(name);
-		if (file[1] != null) {
+		if (file != null && file.length == 2 && file[1] != null) {
 			((Reader) file[1]).close();
 			file[1] = null;
 		}
@@ -171,6 +169,8 @@ public class FileServer {
 
 	/**
 	 * Method will get a random file in a base directory
+     * TODO hey, not sure this method belongs here.  FileServer is for threadsafe
+     * File access relative to current test's base directory.  
 	 * 
 	 * @param basedir
 	 * @return
diff --git a/src/core/org/apache/jmeter/testbeans/gui/PackageTest.java b/src/core/org/apache/jmeter/testbeans/gui/PackageTest.java
index 95f1825..547b982 100644
--- a/src/core/org/apache/jmeter/testbeans/gui/PackageTest.java
+++ b/src/core/org/apache/jmeter/testbeans/gui/PackageTest.java
@@ -55,15 +55,15 @@ public class PackageTest extends JMeterTestCase {
 
 	// ResourceBundle i18nEdit=
 	// ResourceBundle.getBundle("org.apache.jmeter.resources.i18nedit");
-	private static final Locale defaultLocale = new Locale("en"); // i18nEdit.getString("locale.default");
+	private static final Locale defaultLocale = new Locale("en",""); // i18nEdit.getString("locale.default");
 
 	// TODO: find a clean way to get these from i18nedit.properties
 
 	private static final Locale[] locales = new Locale[] {
 	// new Locale("de"), // No resources yet
-			new Locale("ja"),
-			// new Locale("no"), // No resources yet
-			// new Locale("fr"), // No resources yet
+			new Locale("ja",""),
+			// new Locale("no",""), // No resources yet
+			// new Locale("fr",""), // No resources yet
 			// new Locale("zh","CN"), //No resources yet
 			new Locale("zh", "TW") };
 
diff --git a/src/core/org/apache/jmeter/testbeans/gui/TestBeanGUI.java b/src/core/org/apache/jmeter/testbeans/gui/TestBeanGUI.java
index a57b820..616b9a2 100644
--- a/src/core/org/apache/jmeter/testbeans/gui/TestBeanGUI.java
+++ b/src/core/org/apache/jmeter/testbeans/gui/TestBeanGUI.java
@@ -38,6 +38,7 @@ import org.apache.commons.collections.LRUMap;
 import org.apache.jmeter.assertions.Assertion;
 import org.apache.jmeter.assertions.gui.AbstractAssertionGui;
 import org.apache.jmeter.config.ConfigElement;
+import org.apache.jmeter.config.ConfigTestElement;
 import org.apache.jmeter.config.gui.AbstractConfigGui;
 import org.apache.jmeter.control.Controller;
 import org.apache.jmeter.control.gui.AbstractControllerGui;
@@ -48,6 +49,7 @@ import org.apache.jmeter.processor.PostProcessor;
 import org.apache.jmeter.processor.PreProcessor;
 import org.apache.jmeter.processor.gui.AbstractPostProcessorGui;
 import org.apache.jmeter.processor.gui.AbstractPreProcessorGui;
+import org.apache.jmeter.reporters.AbstractListenerElement;
 import org.apache.jmeter.samplers.Sampler;
 import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
 import org.apache.jmeter.testbeans.BeanInfoSupport;
@@ -134,7 +136,7 @@ public class TestBeanGUI extends AbstractJMeterGuiComponent implements JMeterGUI
 	}
 
 	// Dummy for JUnit test
-	public TestBeanGUI() {
+	TestBeanGUI() {
 		log.warn("Only for use in testing");
 	}
 
@@ -267,7 +269,28 @@ public class TestBeanGUI extends AbstractJMeterGuiComponent implements JMeterGUI
 		{
 			return MenuFactory.getDefaultTimerMenu();
 		}
-		return MenuFactory.getDefaultControllerMenu();
+        else if(Sampler.class.isAssignableFrom(testBeanClass))
+        {
+            return MenuFactory.getDefaultSamplerMenu();
+        }
+        else if(ConfigTestElement.class.isAssignableFrom(testBeanClass))
+        {
+            return MenuFactory.getDefaultConfigElementMenu();
+        }
+        else if(Assertion.class.isAssignableFrom(testBeanClass))
+        {
+            return MenuFactory.getDefaultAssertionMenu();
+        }
+        else if(PostProcessor.class.isAssignableFrom(testBeanClass) || 
+                PreProcessor.class.isAssignableFrom(testBeanClass))
+        {
+            return MenuFactory.getDefaultExtractorMenu();
+        }
+        else if(AbstractListenerElement.class.isAssignableFrom(testBeanClass))
+        {
+            return MenuFactory.getDefaultVisualizerMenu();
+        }
+        else return MenuFactory.getDefaultControllerMenu();
 	}
 
 	/*
diff --git a/src/core/org/apache/jmeter/testelement/TestPlan.java b/src/core/org/apache/jmeter/testelement/TestPlan.java
index 5bf023d..a94de38 100644
--- a/src/core/org/apache/jmeter/testelement/TestPlan.java
+++ b/src/core/org/apache/jmeter/testelement/TestPlan.java
@@ -25,6 +25,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.jmeter.NewDriver;
 import org.apache.jmeter.config.Arguments;
 import org.apache.jmeter.config.ConfigElement;
 import org.apache.jmeter.engine.event.LoopIterationEvent;
@@ -36,6 +37,7 @@ import org.apache.jmeter.testelement.property.TestElementProperty;
 import org.apache.jmeter.threads.ThreadGroup;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
 import org.apache.log.Logger;
 
 /**
@@ -45,6 +47,7 @@ import org.apache.log.Logger;
 public class TestPlan extends AbstractTestElement implements Serializable, TestListener {
 	private static Logger log = LoggingManager.getLoggerForClass();
 
+    // Does not appear to be needed
 	public final static String THREAD_GROUPS = "TestPlan.thread_groups";
 
 	public final static String FUNCTIONAL_MODE = "TestPlan.functional_mode";
@@ -53,16 +56,24 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 
 	public final static String SERIALIZE_THREADGROUPS = "TestPlan.serialize_threadgroups";
 
+    public final static String CLASSPATHS = "TestPlan.user_define_classpath";
+    private static final String CLASSPATH_SEPARATOR = ",";
+    
 	public final static String COMMENTS = "TestPlan.comments";
 
+    // Does not appear to be needed
 	public final static String BASEDIR = "basedir";
 
+    // Does not appear to be needed
 	private transient List threadGroups = new LinkedList();
 
+    // Does not appear to be needed
 	private transient List configs = new LinkedList();
 
+    // Does not appear to be needed
 	private static List itemsCanAdd = new LinkedList();
 
+    // Does not appear to be needed
 	private static TestPlan plan;
 
 	// There's only 1 test plan, so can cache the mode here
@@ -73,6 +84,8 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 		// returned in org.apache.jmeter.threads.ThreadGroup.getClassLabel()
 		// method. If it's not you will not be able to add a Thread Group
 		// element to a Test Plan.
+
+        // Does not appear to be needed
 		itemsCanAdd.add(JMeterUtils.getResString("threadgroup"));
 	}
 
@@ -86,8 +99,15 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 		setName(name);
 		// setFunctionalMode(false);
 		// setSerialized(false);
-		setProperty(new CollectionProperty(THREAD_GROUPS, threadGroups));
+
+        // Does not appear to be needed
+        setProperty(new CollectionProperty(THREAD_GROUPS, threadGroups));
 	}
+    
+    public void prepareForPreCompile()
+    {
+        getVariables().setRunningVersion(true);
+    }
 
 	/**
 	 * Fetches the functional mode property
@@ -102,10 +122,12 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 		setProperty(new TestElementProperty(USER_DEFINED_VARIABLES, vars));
 	}
 
+    // Does not appear to be needed
 	public String getBasedir() {
 		return getPropertyAsString(BASEDIR);
 	}
 
+    // Does not appear to be needed
 	public void setBasedir(String b) {
 		setProperty(BASEDIR, b);
 	}
@@ -141,6 +163,37 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 	public void setSerialized(boolean serializeTGs) {
 		setProperty(new BooleanProperty(SERIALIZE_THREADGROUPS, serializeTGs));
 	}
+    
+    /**
+     * Set the classpath for the test plan
+     * @param text
+     */
+    public void setTestPlanClasspath(String text) {
+        setProperty(CLASSPATHS,text);
+    }
+    
+    public void setTestPlanClasspathArray(String[] text) {
+        StringBuffer cat = new StringBuffer();
+        for (int idx=0; idx < text.length; idx++) {
+            if (idx > 0) {
+                cat.append(CLASSPATH_SEPARATOR);
+            }
+            cat.append(text[idx]);
+        }
+        this.setTestPlanClasspath(cat.toString());
+    }
+    
+    public String[] getTestPlanClasspathArray() {
+        return JOrphanUtils.split(this.getTestPlanClasspath(),CLASSPATH_SEPARATOR);
+    }
+    
+    /**
+     * Returns a string in CSV format
+     * @return
+     */
+    public String getTestPlanClasspath() {
+        return getPropertyAsString(CLASSPATHS);
+    }
 
 	/**
 	 * Fetch the serialize threadgroups property
@@ -155,6 +208,7 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 		getVariables().addArgument(name, value);
 	}
 
+    // Does not appear to be needed
 	public static TestPlan createTestPlan(String name) {
 		if (plan == null) {
 			if (name == null) {
@@ -174,6 +228,7 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 		}
 	}
 
+    // Does not appear to be needed
 	public void addJMeterComponent(TestElement child) {
 		if (child instanceof ThreadGroup) {
 			addThreadGroup((ThreadGroup) child);
@@ -185,6 +240,7 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 	 * 
 	 * @return the ThreadGroups value
 	 */
+    // Does not appear to be needed
 	public Collection getThreadGroups() {
 		return threadGroups;
 	}
@@ -195,6 +251,7 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 	 * @param c
 	 *            the feature to be added to the ConfigElement attribute
 	 */
+    // Does not appear to be needed
 	public void addConfigElement(ConfigElement c) {
 		configs.add(c);
 	}
@@ -205,6 +262,7 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 	 * @param group
 	 *            the feature to be added to the ThreadGroup attribute
 	 */
+    // Does not appear to be needed
 	public void addThreadGroup(ThreadGroup group) {
 		threadGroups.add(group);
 	}
@@ -253,6 +311,12 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 				log.error("Failed to set file server base dir with " + getBasedir(), e);
 			}
 		}
+        // we set the classpath
+        String[] paths = this.getTestPlanClasspathArray();
+        for (int idx=0; idx < paths.length; idx++) {
+            NewDriver.addURL(paths[idx]);
+            log.info("add " + paths[idx] + " to classpath");
+        }
 	}
 
 	/*
@@ -263,4 +327,5 @@ public class TestPlan extends AbstractTestElement implements Serializable, TestL
 	public void testStarted(String host) {
 		testStarted();
 	}
+    
 }
diff --git a/src/core/org/apache/jmeter/testelement/ThreadListener.java b/src/core/org/apache/jmeter/testelement/ThreadListener.java
new file mode 100644
index 0000000..6965589
--- /dev/null
+++ b/src/core/org/apache/jmeter/testelement/ThreadListener.java
@@ -0,0 +1,43 @@
+// $Header$
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.testelement;
+
+/**
+ * Allow threads to perform startup and closedown if necessary
+ * 
+ * @version $Revision$ on $Date$
+ */
+public interface ThreadListener {
+	/**
+	 * Called just before the start of the thread 
+     * 
+     * @see org.apache.jmeter.threads.JMeterThread#threadStarted()
+	 * 
+	 */
+	public void threadStarted();
+
+	/**
+	 * Called once for each thread at the end of a test
+	 * 
+	 * @see org.apache.jmeter.threads.JMeterThread#threadFinished()
+	 * 
+	 */
+	public void threadFinished();
+
+}
\ No newline at end of file
diff --git a/src/core/org/apache/jmeter/testelement/property/FunctionProperty.java b/src/core/org/apache/jmeter/testelement/property/FunctionProperty.java
index 2b567e7..391ba24 100644
--- a/src/core/org/apache/jmeter/testelement/property/FunctionProperty.java
+++ b/src/core/org/apache/jmeter/testelement/property/FunctionProperty.java
@@ -70,12 +70,13 @@ public class FunctionProperty extends AbstractProperty {
 		JMeterContext ctx = JMeterContextService.getContext();// Expensive, so
 																// do
 		// once
-		if (!isRunningVersion() || !ctx.isSamplingStarted()) {
+		if (!isRunningVersion() /*|| !ctx.isSamplingStarted()*/) {
 			log.debug("Not running version, return raw function string");
 			return function.getRawParameters();
 		} else {
+            if(!ctx.isSamplingStarted()) return function.execute();
 			log.debug("Running version, executing function");
-			int iter = ctx.getVariables().getIteration();
+			int iter = ctx.getVariables() != null ? ctx.getVariables().getIteration() : -1;
 			if (iter < testIteration) {
 				testIteration = -1;
 			}
diff --git a/src/core/org/apache/jmeter/threads/gui/ThreadGroupGui.java b/src/core/org/apache/jmeter/threads/gui/ThreadGroupGui.java
index 348298e..ec4964e 100644
--- a/src/core/org/apache/jmeter/threads/gui/ThreadGroupGui.java
+++ b/src/core/org/apache/jmeter/threads/gui/ThreadGroupGui.java
@@ -180,7 +180,7 @@ public class ThreadGroupGui extends AbstractJMeterGuiComponent implements ItemLi
 	public JPopupMenu createPopupMenu() {
 		JPopupMenu pop = new JPopupMenu();
 		pop.add(MenuFactory.makeMenus(new String[] { MenuFactory.CONTROLLERS, MenuFactory.LISTENERS,
-				MenuFactory.SAMPLERS, MenuFactory.TIMERS, MenuFactory.CONFIG_ELEMENTS, MenuFactory.PRE_PROCESSORS,
+				MenuFactory.SAMPLERS, MenuFactory.ASSERTIONS,MenuFactory.TIMERS, MenuFactory.CONFIG_ELEMENTS, MenuFactory.PRE_PROCESSORS,
 				MenuFactory.POST_PROCESSORS }, JMeterUtils.getResString("Add"), "Add"));
 		MenuFactory.addEditMenu(pop, true);
 		MenuFactory.addFileMenu(pop);
diff --git a/src/core/org/apache/jmeter/util/JMeterVersion.java b/src/core/org/apache/jmeter/util/JMeterVersion.java
index 9319062..8c2b25f 100644
--- a/src/core/org/apache/jmeter/util/JMeterVersion.java
+++ b/src/core/org/apache/jmeter/util/JMeterVersion.java
@@ -41,7 +41,7 @@ public class JMeterVersion {
 	 * JMeterUtils This ensures that JMeterUtils always gets the correct
 	 * version, even if it is not re-compiled during the build.
 	 */
-	private static final String VERSION = "2.1.20050630";
+	private static final String VERSION = "2.1.1";
 
 	static final String COPYRIGHT = "Copyright (c) 1998-2005 The Apache Software Foundation";
 
diff --git a/src/core/org/apache/jmeter/util/NameUpdater.java b/src/core/org/apache/jmeter/util/NameUpdater.java
index 16af12c..79c970e 100644
--- a/src/core/org/apache/jmeter/util/NameUpdater.java
+++ b/src/core/org/apache/jmeter/util/NameUpdater.java
@@ -54,6 +54,24 @@ public final class NameUpdater {
 		}
 		return className;
 	}
+    /**
+     * Looks up test element / gui class combination; if that
+     * does not exist in the map, then defaults to getCurrentName.
+     * 
+     * @param testClassName - test element class name
+     * @param guiClassName - associated gui class name
+     * @return new test class name
+     */
+
+    public static String getCurrentTestName(String testClassName, String guiClassName) {
+        String key = testClassName + "|" + guiClassName;
+        if (nameMap.containsKey(key)) {
+            String newName = nameMap.getProperty(key);
+            log.info("Upgrading " + key + " to " + newName);
+            return newName;
+        }
+        return getCurrentName(testClassName);
+    }
 
 	public static String getCurrentName(String propertyName, String className) {
 		String key = className + "/" + propertyName;
diff --git a/src/core/org/apache/jmeter/util/keystore/PKCS12KeyStore.java b/src/core/org/apache/jmeter/util/keystore/PKCS12KeyStore.java
deleted file mode 100644
index 8d0e723..0000000
--- a/src/core/org/apache/jmeter/util/keystore/PKCS12KeyStore.java
+++ /dev/null
@@ -1,135 +0,0 @@
-// $Header$
-/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * 
-*/
-
-package org.apache.jmeter.util.keystore;
-
-import iaik.pkcs.pkcs12.PKCS12;
-import iaik.pkcs.pkcs12.KeyBag;
-import iaik.pkcs.pkcs12.CertificateBag;
-import iaik.pkcs.PKCSParsingException;
-import iaik.pkcs.PKCSException;
-import iaik.x509.ChainVerifier;
-import iaik.utils.Util;
-
-import java.security.cert.X509Certificate;
-import java.security.cert.CertificateException;
-import java.security.PrivateKey;
-import java.io.InputStream;
-import java.io.IOException;
-import java.util.Arrays;
-
-/**
- * Use this Keystore for iSaSiLk SSL Managers.
- *
- * @author <a href="bloritsch@apache.org">Berin Loritsch</a>
- * @version CVS $Revision$ $Date$
- */
-public class PKCS12KeyStore extends JmeterKeyStore
-{
-    /** The Certificate chain */
-    private X509Certificate[] certChain;
-
-    /** The private key */
-    private PrivateKey key;
-
-    /** The alias */
-    private String alias;
-
-    public PKCS12KeyStore(String type) throws Exception
-    {
-        if (!"PKCS12".equalsIgnoreCase(type))
-        {
-            throw new Exception("Invalid keystore type");
-        }
-    }
-
-    public final String getAlias()
-    {
-        return this.alias;
-    }
-
-    /**
-     * Process PKCS12 input stream into the private key and certificate chain.
-     */
-    public void load(InputStream is, String pword)
-        throws IOException, PKCSException, CertificateException
-    {
-        PKCS12 p12 = new PKCS12(is);
-        is.close();
-
-        p12.decrypt(pword.toCharArray());
-
-        KeyBag keyBag = p12.getKeyBag();
-
-        if (null == keyBag)
-        {
-            throw new PKCSException("No private key found");
-        }
-
-        byte[] keyBagLocalKeyId = keyBag.getLocalKeyID();
-
-        this.key = keyBag.getPrivateKey();
-
-        CertificateBag[] certBags = p12.getCertificateBags();
-        if ((null == certBags) || (certBags.length == 0))
-        {
-            throw new PKCSException("No certificates found");
-        }
-
-        this.alias = new String(keyBagLocalKeyId);
-        X509Certificate myCert = null;
-
-        for (int i = 0; i < certBags.length; i++)
-        {
-            byte[] certBagLocalKeyId = certBags[i].getLocalKeyID();
-            if ((null != keyBagLocalKeyId) && (null != certBagLocalKeyId))
-            {
-                if (Arrays.equals(certBagLocalKeyId, keyBagLocalKeyId))
-                {
-                    myCert = certBags[i].getCertificate();
-                    break;
-                }
-            }
-        }
-
-        if (null == myCert)
-        {
-            throw new PKCSException("No owner certificate found");
-        }
-
-        iaik.x509.X509Certificate[] certChain =
-            CertificateBag.getCertificates(certBags);
-        this.certChain = Util.arrangeCertificateChain(certChain, false);
-    }
-
-    /**
-     * Get the ordered certificate chain.
-     */
-    public final X509Certificate[] getCertificateChain()
-    {
-        return this.certChain;
-    }
-
-    /**
-     * Return the private Key
-     */
-    public final PrivateKey getPrivateKey()
-    {
-        return this.key;
-    }
-}
\ No newline at end of file
diff --git a/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java b/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
index 9c1570b..aa10c8a 100644
--- a/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
+++ b/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
@@ -1,6 +1,6 @@
 // $Header$
 /*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-2005 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@ package org.apache.jmeter.visualizers;
 
 import java.io.Serializable;
 import java.text.DecimalFormat;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Vector;
 
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jorphan.logging.LoggingManager;
@@ -47,9 +47,9 @@ public class SamplingStatCalculator implements Serializable {
 
 	private static DecimalFormat kbFormatter = new DecimalFormat("#0.00");
 
-	private StatCalculator calculator = new StatCalculator();
+	private final StatCalculator calculator = new StatCalculator();
 
-	private ArrayList storedValues = new ArrayList();
+	private final List storedValues = new Vector();
 
 	private double maxThroughput;
 
@@ -89,9 +89,12 @@ public class SamplingStatCalculator implements Serializable {
 
 	public void addSamples(SamplingStatCalculator ssc) {
 		calculator.addAll(ssc.calculator);
-		storedValues.addAll(ssc.storedValues);
-		Collections.sort(storedValues);
-		if (firstTime > ssc.firstTime) {
+        synchronized( storedValues )
+        {
+            storedValues.addAll(ssc.storedValues);
+            Collections.sort(storedValues);
+        }
+        if (firstTime > ssc.firstTime) {
 			firstTime = ssc.firstTime;
 		}
 	}
@@ -105,10 +108,13 @@ public class SamplingStatCalculator implements Serializable {
 	}
 
 	public Sample getCurrentSample() {
-		if (storedValues.size() == 0) {
-			return new Sample();
-		}
-		return (Sample) storedValues.get(storedValues.size() - 1);
+        synchronized( storedValues )
+        {
+            if (storedValues.size() == 0) {
+                return new Sample();
+            }
+            return (Sample) storedValues.get(storedValues.size() - 1);
+        }
 	}
 
 	/**
@@ -206,8 +212,10 @@ public class SamplingStatCalculator implements Serializable {
 	 * 
 	 */
 	public Sample addSample(SampleResult res) {
-		Sample s = null;
-		synchronized (calculator) {
+        long rtime, cmean, cstdv, cmedian, cpercent, eCount, endTime;
+        double throughput;
+        boolean rbool;
+        synchronized (calculator) {
 			long byteslength = 0;
 			// in case the sampler doesn't return the contents
 			// we see if the bytes was set
@@ -230,26 +238,32 @@ public class SamplingStatCalculator implements Serializable {
 				calculator.addBytes(byteslength);
 			}
 			setStartTime(res);
-			long eCount = getCurrentSample().errorCount;
+			eCount = getCurrentSample().errorCount;
 			if (!res.isSuccessful()) {
 				eCount++;
 			}
-			long endTime = getEndTime(res);
+			endTime = getEndTime(res);
 			long howLongRunning = endTime - firstTime;
-			double throughput = 0;
-			if (howLongRunning <= 0) {
-				throughput = Double.MAX_VALUE;
-			}
 			throughput = ((double) calculator.getCount() / (double) howLongRunning) * 1000.0;
 			if (throughput > maxThroughput) {
 				maxThroughput = throughput;
 			}
-			s = new Sample(null, res.getTime(), (long) calculator.getMean(), (long) calculator.getStandardDeviation(),
-					calculator.getMedian().longValue(), calculator.getPercentPoint(0.500).longValue(), throughput,
-					eCount, res.isSuccessful(), storedValues.size() + 1, endTime);
-			storedValues.add(s);
-		}
-		return s;
+
+            rtime = res.getTime();
+            cmean = (long)calculator.getMean();
+            cstdv = (long)calculator.getStandardDeviation();
+            cmedian = calculator.getMedian().longValue();
+            cpercent = calculator.getPercentPoint( 0.500 ).longValue();
+            rbool = res.isSuccessful();
+        }
+
+        synchronized( storedValues ){
+            int count = storedValues.size() + 1;
+            Sample s =
+                new Sample( null, rtime, cmean, cstdv, cmedian, cpercent, throughput, eCount, rbool, count, endTime );
+            storedValues.add( s );
+            return s;
+        }
 	}
 
 	public List getSamples() {
@@ -257,10 +271,12 @@ public class SamplingStatCalculator implements Serializable {
 	}
 
 	public Sample getSample(int index) {
-		if (index < storedValues.size()) {
-			return (Sample) storedValues.get(index);
-		}
+        synchronized( storedValues ){
+            if (index < storedValues.size()) {
+                return (Sample) storedValues.get(index);
+            }
 		return null;
+        }
 	}
 
 	private long getEndTime(SampleResult res) {
diff --git a/src/jorphan/org/apache/jorphan/collections/ConfigurationTree.java b/src/jorphan/org/apache/jorphan/collections/ConfigurationTree.java
index 8942fce..44c204c 100644
--- a/src/jorphan/org/apache/jorphan/collections/ConfigurationTree.java
+++ b/src/jorphan/org/apache/jorphan/collections/ConfigurationTree.java
@@ -31,6 +31,8 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.jorphan.util.JOrphanUtils;
+
 /**
  * @author mike
  * 
@@ -258,7 +260,8 @@ public class ConfigurationTree implements Serializable, Cloneable {
 
 	protected String[] getPath(String key) {
 		if (key != null) {
-			String[] keys = key.split("/");
+            //JDK 1.4 String[] keys = key.split("/");
+			String[] keys = JOrphanUtils.split(key,"/");
 			return keys;
 		}
 		return new String[0];
@@ -447,7 +450,8 @@ public class ConfigurationTree implements Serializable, Cloneable {
 	 * @return
 	 */
 	public String remove(String key) {
-		String[] keys = key.split("/");
+		//JDK 1.4 String[] keys = key.split("/");
+        String[] keys = JOrphanUtils.split(key,"/");
 		String prop = null;
 		HashTree tree = propTree;
 		for (int i = 0; i < keys.length && tree != null; i++) {
diff --git a/src/jorphan/org/apache/jorphan/gui/ObjectTableModel.java b/src/jorphan/org/apache/jorphan/gui/ObjectTableModel.java
index 35fec20..ef5bd91 100644
--- a/src/jorphan/org/apache/jorphan/gui/ObjectTableModel.java
+++ b/src/jorphan/org/apache/jorphan/gui/ObjectTableModel.java
@@ -105,8 +105,10 @@ public class ObjectTableModel extends DefaultTableModel {
 	public Object getValueAt(int row, int col) {
 		log.debug("Getting row value");
 		Object value = objects.get(row);
+		if(headers.size() == 1 && col >= readFunctors.size())
+			return value;
 		Functor getMethod = (Functor) readFunctors.get(col);
-		if (getMethod != null) {
+		if (getMethod != null && value != null) {
 			return getMethod.invoke(value);
 		}
 		return null;
@@ -152,6 +154,10 @@ public class ObjectTableModel extends DefaultTableModel {
 					super.fireTableDataChanged();
 				}
 			}
+			else if(headers.size() == 1)
+			{
+				objects.set(row,cellValue);
+			}
 		}
 	}
 
diff --git a/src/jorphan/org/apache/jorphan/util/Converter.java b/src/jorphan/org/apache/jorphan/util/Converter.java
index 222370d..8ee82ca 100755
--- a/src/jorphan/org/apache/jorphan/util/Converter.java
+++ b/src/jorphan/org/apache/jorphan/util/Converter.java
@@ -373,10 +373,11 @@ public class Converter {
 			return replacement.toString();
 		}
 	}
-
-	public static String insertSpaceBreaks(String v, String insertion) {
-		return v.trim().replaceAll("\\s+", insertion);
-	}
+// Does not appear to be used.
+// Remove as replaceAll() requires 1.4
+//	public static String insertSpaceBreaks(String v, String insertion) {
+//		return v.trim().replaceAll("\\s+", insertion);
+//	}
 
 	/**
 	 * Converts object to a String, defaults to empty string if object is null.
diff --git a/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java b/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
index 68e6d53..3759d53 100644
--- a/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
+++ b/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
@@ -61,15 +61,18 @@ public final class JOrphanUtils {
 	 *            Character to split the string on
 	 * @return Array of all the tokens.
 	 */
-	public static String[] split(String splittee, String splitChar) {
+	public static String[] split(String splittee, String splitChar,boolean truncate) {
 		if (splittee == null || splitChar == null) {
 			return new String[0];
 		}
 		int spot;
-		while ((spot = splittee.indexOf(splitChar + splitChar)) != -1) {
-			splittee = splittee.substring(0, spot + splitChar.length())
-					+ splittee.substring(spot + 2 * splitChar.length(), splittee.length());
-		}
+        if(truncate) {
+    		while ((spot = splittee.indexOf(splitChar + splitChar)) != -1) {
+    			splittee = splittee.substring(0, spot + splitChar.length())
+    					+ splittee.substring(spot + 2 * splitChar.length(), splittee.length());
+    		}
+            if(splittee.startsWith(splitChar)) splittee = splittee.substring(splitChar.length());
+        }
 		Vector returns = new Vector();
 		int start = 0;
 		int length = splittee.length();
@@ -78,6 +81,10 @@ public final class JOrphanUtils {
 			if (spot > 0) {
 				returns.addElement(splittee.substring(start, spot));
 			}
+            else
+            {
+                returns.addElement("");
+            }
 			start = spot + splitChar.length();
 		}
 		if (start < length) {
@@ -87,6 +94,11 @@ public final class JOrphanUtils {
 		returns.copyInto(values);
 		return values;
 	}
+    
+    public static String[] split(String splittee,String splitChar)
+    {
+        return split(splittee,splitChar,true);
+    }
 
 	private static final String SPACES = "                                 ";
 
@@ -280,56 +292,4 @@ public final class JOrphanUtils {
 
 		return slice;
 	}
-
-	public static class Test extends TestCase {
-		public void testReplace1() {
-			assertEquals("xyzdef", replaceFirst("abcdef", "abc", "xyz"));
-		}
-
-		public void testReplace2() {
-			assertEquals("axyzdef", replaceFirst("abcdef", "bc", "xyz"));
-		}
-
-		public void testReplace3() {
-			assertEquals("abcxyz", replaceFirst("abcdef", "def", "xyz"));
-		}
-
-		public void testReplace4() {
-			assertEquals("abcdef", replaceFirst("abcdef", "bce", "xyz"));
-		}
-
-		public void testReplace5() {
-			assertEquals("abcdef", replaceFirst("abcdef", "alt=\"\" ", ""));
-		}
-
-		public void testReplace6() {
-			assertEquals("abcdef", replaceFirst("abcdef", "alt=\"\" ", ""));
-		}
-
-		public void testReplace7() {
-			assertEquals("alt=\"\"", replaceFirst("alt=\"\"", "alt=\"\" ", ""));
-		}
-
-		public void testReplace8() {
-			assertEquals("img src=xyz ", replaceFirst("img src=xyz alt=\"\" ", "alt=\"\" ", ""));
-		}
-
-		public void testSplit1() {
-			String in = "a,bc,,"; // Test ignore trailing split characters
-			String out[] = split(in, ",");
-			assertEquals(2, out.length);
-			assertEquals("a", out[0]);
-			assertEquals("bc", out[1]);
-		}
-
-		public void testSplit2() {
-			String in = ",,a,bc"; // Test leading split characters
-			String out[] = split(in, ",");
-			assertEquals("Should detect the leading split chars; ", 2, out.length - 2);
-			assertEquals("", out[0]);
-			assertEquals("", out[1]);
-			assertEquals("a", out[2]);
-			assertEquals("bc", out[3]);
-		}
-	}
 }
diff --git a/src/junit/org/apache/jmeter/protocol/java/control/gui/ClassFilter.java b/src/junit/org/apache/jmeter/protocol/java/control/gui/ClassFilter.java
new file mode 100644
index 0000000..8b0fc0e
--- /dev/null
+++ b/src/junit/org/apache/jmeter/protocol/java/control/gui/ClassFilter.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2001-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+package org.apache.jmeter.protocol.java.control.gui;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author pete
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ClassFilter {
+
+    protected String[] pkgs = new String[0];
+	/**
+	 * 
+	 */
+	public ClassFilter() {
+		super();
+	}
+    
+    public void setPackges(String[] pk) {
+        this.pkgs = pk;
+    }
+    
+    public void addPackage(String pkg) {
+        String[] newpkg = new String[pkgs.length + 1];
+        System.arraycopy(pkgs,0,newpkg,0,pkgs.length);
+        newpkg[pkgs.length] = pkg;
+        pkgs = newpkg;
+    }
+    
+    public boolean include(String text) {
+        boolean inc = false;
+        for (int idx=0; idx < pkgs.length; idx++) {
+            if (text.startsWith(pkgs[idx])){
+                inc = true;
+                break;
+            }
+        }
+        return inc;
+    }
+    
+    public Object[] filterArray(List items) {
+        Iterator itr = items.iterator();
+        ArrayList newlist = new ArrayList();
+        while (itr.hasNext()) {
+            Object item = itr.next();
+            if (include((String)item)) {
+                newlist.add(item);
+            }
+        }
+        if (newlist.size() > 0) {
+            return newlist.toArray();
+        } else {
+            return new Object[0];
+        }
+    }
+
+    public int size(){
+        return pkgs.length;
+    }
+}
diff --git a/src/junit/org/apache/jmeter/protocol/java/control/gui/JUnitTestSamplerGui.java b/src/junit/org/apache/jmeter/protocol/java/control/gui/JUnitTestSamplerGui.java
new file mode 100644
index 0000000..9b4995d
--- /dev/null
+++ b/src/junit/org/apache/jmeter/protocol/java/control/gui/JUnitTestSamplerGui.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+*/
+
+package org.apache.jmeter.protocol.java.control.gui;
+
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import junit.framework.TestCase;
+
+import org.apache.jmeter.gui.util.VerticalPanel;
+import org.apache.jmeter.protocol.java.sampler.JUnitSampler;
+import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.JLabeledTextField;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.reflect.ClassFinder;
+import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.log.Logger;
+
+/**
+ * The <code>JUnitTestSamplerGui</code> class provides the user interface
+ * for the {@link JUnitTestSampler}.
+ * 
+ * @version $Revision$ on $Date$
+ */
+public class JUnitTestSamplerGui extends AbstractSamplerGui 
+implements ChangeListener, ActionListener
+{
+
+    /** The name of the classnameCombo JComboBox */
+    private static final String CLASSNAMECOMBO = "classnamecombo";
+    private static final String METHODCOMBO = "methodcombo";
+    private static final String PREFIX = "test";
+    public static final String ONETIMESETUP = "oneTimeSetUp";
+    public static final String ONETIMETEARDOWN = "oneTimeTearDown";
+    public static final String SUITE = "suite";
+    private static final String[] SPATHS = new String[] {
+            JMeterUtils.getJMeterHome() + "/lib/junit/",
+    };
+
+    JLabeledTextField constructorLabel =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_constructor_string"));
+
+    JLabel methodLabel =
+        new JLabel(
+            JMeterUtils.getResString("junit_test_method"));
+
+    JLabeledTextField successMsg =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_success_msg"));
+
+    JLabeledTextField failureMsg =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_failure_msg"));
+    
+    JLabeledTextField errorMsg =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_error_msg"));
+
+    JLabeledTextField successCode =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_success_code"));
+
+    JLabeledTextField failureCode =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_failure_code"));
+
+    JLabeledTextField errorCode =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_error_code"));
+
+    JLabeledTextField filterpkg =
+        new JLabeledTextField(
+            JMeterUtils.getResString("junit_pkg_filter"));
+
+    JCheckBox doSetup = new JCheckBox(JMeterUtils.getResString("junit_do_setup_teardown"));
+    
+    /** A combo box allowing the user to choose a test class. */
+    private JComboBox classnameCombo;
+    private JComboBox methodName;
+    private TestCase TESTCLASS = null;
+    private List METHODLIST = null;
+    protected ClassFilter FILTER = new ClassFilter();
+    protected List CLASSLIST = null;
+    
+    private static transient Logger log = LoggingManager.getLoggerForClass();
+
+    /**
+     * Constructor for JUnitTestSamplerGui
+     */
+    public JUnitTestSamplerGui()
+    {
+        super();
+        init();
+    }
+
+    public String getLabelResource()
+    {
+        return "junit_request";
+    }
+
+    public String getDocAnchor() {
+        return "JUnit_Sampler";
+    }
+
+    /**
+     * Initialize the GUI components and layout.
+     */
+    private void init()
+    {
+        setLayout(new BorderLayout(0, 5));
+        setBorder(makeBorder());
+        
+        add(makeTitlePanel(), BorderLayout.NORTH);
+
+
+        add(createClassPanel(), BorderLayout.CENTER);
+    }
+    
+    private JPanel createClassPanel()
+    {
+        METHODLIST = new java.util.ArrayList();
+
+        try
+        {
+            // Find all the classes which extend junit.framework.TestCase
+            CLASSLIST =
+                ClassFinder.findClassesThatExtend(
+                    SPATHS,
+                    new Class[] { TestCase.class });
+        }
+        catch (IOException e)
+        {
+            log.error("Exception getting interfaces.", e);
+        } 
+        catch (ClassNotFoundException e) {
+            log.error("Exception getting interfaces.", e);
+        }
+
+        JLabel label =
+            new JLabel(JMeterUtils.getResString("protocol_java_classname"));
+
+        classnameCombo = new JComboBox(CLASSLIST.toArray());
+        classnameCombo.addActionListener(this);
+        classnameCombo.setName(CLASSNAMECOMBO);
+        classnameCombo.setEditable(false);
+        label.setLabelFor(classnameCombo);
+        
+        if (FILTER != null && FILTER.size() > 0) {
+            methodName = new JComboBox(FILTER.filterArray(METHODLIST));
+        } else {
+            methodName = new JComboBox(METHODLIST.toArray());
+        }
+        methodName.addActionListener(this);
+        methodName.setName(METHODCOMBO);
+        methodLabel.setLabelFor(methodName);
+        
+        VerticalPanel panel = new VerticalPanel();
+        panel.add(filterpkg);
+        panel.add(label);
+        filterpkg.addChangeListener(this);
+
+        if (classnameCombo != null){
+            panel.add(classnameCombo);
+        }
+        constructorLabel.setText("");
+        panel.add(constructorLabel);
+        panel.add(methodLabel);
+        if (methodName != null){
+            panel.add(methodName);
+        }
+        panel.add(successMsg);
+        panel.add(successCode);
+        panel.add(failureMsg);
+        panel.add(failureCode);
+        panel.add(errorMsg);
+        panel.add(errorCode);
+        panel.add(doSetup);
+        return panel;
+    }
+
+    
+    /* Implements JMeterGuiComponent.createTestElement() */ 
+    public TestElement createTestElement()
+    {
+        JUnitSampler sampler = new JUnitSampler();
+        modifyTestElement(sampler);
+        return sampler;
+    }
+
+    /* Implements JMeterGuiComponent.modifyTestElement(TestElement) */
+    public void modifyTestElement(TestElement el)
+    {
+        JUnitSampler sampler = (JUnitSampler)el;
+        configureTestElement(sampler);
+        if (classnameCombo.getSelectedItem() != null && 
+                classnameCombo.getSelectedItem() instanceof String) {
+            sampler.setClassname((String)classnameCombo.getSelectedItem());
+        }
+        sampler.setConstructorString(constructorLabel.getText());
+        if (methodName.getSelectedItem() != null) {
+            Object mobj = methodName.getSelectedItem();
+            sampler.setMethod((String)mobj);
+        }
+        sampler.setFilterString(filterpkg.getText());
+        sampler.setSuccess(successMsg.getText());
+        sampler.setSuccessCode(successCode.getText());
+        sampler.setFailure(failureMsg.getText());
+        sampler.setFailureCode(failureCode.getText());
+        sampler.setDoNotSetUpTearDown(doSetup.isSelected());
+    }
+
+    /* Overrides AbstractJMeterGuiComponent.configure(TestElement) */
+    public void configure(TestElement el)
+    {
+        super.configure(el);
+        JUnitSampler sampler = (JUnitSampler)el;
+        classnameCombo.setSelectedItem(sampler.getClassname());
+        instantiateClass();
+        methodName.setSelectedItem(sampler.getMethod());
+        filterpkg.setText(sampler.getFilterString());
+        constructorLabel.setText(sampler.getConstructorString());
+        if (sampler.getSuccessCode().length() > 0) {
+            successCode.setText(sampler.getSuccessCode());
+        } else {
+            successCode.setText(JMeterUtils.getResString("junit_success_default_code"));
+        }
+        if (sampler.getSuccess().length() > 0) {
+            successMsg.setText(sampler.getSuccess());
+        } else {
+            successMsg.setText(JMeterUtils.getResString("junit_success_default_msg"));
+        }
+        if (sampler.getFailureCode().length() > 0) {
+            failureCode.setText(sampler.getFailureCode());
+        } else {
+            failureCode.setText(JMeterUtils.getResString("junit_failure_default_code"));
+        }
+        if (sampler.getFailure().length() > 0) {
+            failureMsg.setText(sampler.getFailure());
+        } else {
+            failureMsg.setText(JMeterUtils.getResString("junit_failure_default_msg"));
+        }
+        if (sampler.getError().length() > 0) {
+            errorMsg.setText(sampler.getError());
+        } else {
+            errorMsg.setText(JMeterUtils.getResString("junit_error_default_msg"));
+        }
+        if (sampler.getErrorCode().length() > 0) {
+            errorCode.setText(sampler.getErrorCode());
+        } else {
+            errorCode.setText(JMeterUtils.getResString("junit_error_default_code"));
+        }
+        doSetup.setSelected(sampler.getDoNotSetUpTearDown());
+    }
+    
+    public void instantiateClass(){
+        String className =
+            ((String) classnameCombo.getSelectedItem());
+        if (className != null) {
+            TESTCLASS = (TestCase)JUnitSampler.getClassInstance(className,
+                    constructorLabel.getText());
+            if (TESTCLASS == null) {
+                clearMethodCombo();
+            }
+            configureMethodCombo();
+        }
+    }
+
+    public void showErrorDialog() {
+        JOptionPane.showConfirmDialog(this, 
+                JMeterUtils.getResString("junit_constructor_error"), "Warning",
+                JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE);
+    }
+    
+    public void configureMethodCombo(){
+        if (TESTCLASS != null) {
+            clearMethodCombo();
+            String [] names = getMethodNames(getMethods(TESTCLASS,METHODLIST));
+            for (int idx=0; idx < names.length; idx++){
+                methodName.addItem(names[idx]);
+                METHODLIST.add(names[idx]);
+            }
+            methodName.repaint();
+        }
+    }
+    
+    public void clearMethodCombo(){
+        methodName.removeAllItems();
+        METHODLIST.clear();
+    }
+    
+    public Method[] getMethods(Object obj, List list)
+    {
+        Method[] meths = obj.getClass().getMethods();
+        for (int idx=0; idx < meths.length; idx++){
+            if (meths[idx].getName().startsWith(PREFIX) ||
+                    meths[idx].getName().equals(ONETIMESETUP) ||
+                    meths[idx].getName().equals(ONETIMETEARDOWN) ||
+                    meths[idx].getName().equals(SUITE)) {
+                list.add(meths[idx]);
+            }
+        }
+        if (list.size() > 0){
+            Method[] rmeth = new Method[list.size()];
+            return (Method[])list.toArray(rmeth);
+        } else {
+            return new Method[0];
+        }
+    }
+    
+    public String[] getMethodNames(Method[] meths)
+    {
+        String[] names = new String[meths.length];
+        for (int idx=0; idx < meths.length; idx++){
+            names[idx] = meths[idx].getName();
+        }
+        return names;
+    }
+    
+    public Class[] filterClasses(Class[] clz) {
+        if (clz != null && clz.length > 0){
+            Class[] nclz = null;
+            return nclz;
+        } else {
+            return clz;
+        }
+    }
+  
+    /**
+     * Handle action events for this component.  This method currently handles
+     * events for the classname combo box.
+     * 
+     * @param evt  the ActionEvent to be handled
+     */
+    public void actionPerformed(ActionEvent evt)
+    {
+        if (evt.getSource() == classnameCombo)
+        {
+            instantiateClass();
+        }
+    }
+    
+    /**
+     * the current implementation checks to see if the source
+     * of the event is the filterpkg field.
+     */
+    public void stateChanged(ChangeEvent event) {
+        if ( event.getSource() == filterpkg) {
+            FILTER.setPackges(JOrphanUtils.split(filterpkg.getText(),","));
+            classnameCombo.removeAllItems();
+            // change the classname drop down
+            Object[] clist = FILTER.filterArray(CLASSLIST);
+            for (int idx=0; idx < clist.length; idx++) {
+                classnameCombo.addItem(clist[idx]);
+            }
+        }
+    }
+}
+
diff --git a/src/junit/org/apache/jmeter/protocol/java/sampler/JUnitSampler.java b/src/junit/org/apache/jmeter/protocol/java/sampler/JUnitSampler.java
new file mode 100644
index 0000000..c03d608
--- /dev/null
+++ b/src/junit/org/apache/jmeter/protocol/java/sampler/JUnitSampler.java
@@ -0,0 +1,506 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+package org.apache.jmeter.protocol.java.sampler;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Enumeration;
+
+import junit.framework.ComparisonFailure;
+import junit.framework.Protectable;
+import junit.framework.TestCase;
+import junit.framework.TestFailure;
+import junit.framework.TestResult;
+
+import org.apache.jmeter.samplers.AbstractSampler;
+import org.apache.jmeter.samplers.Entry;
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+/**
+ * @author pete
+ *
+ * This is a basic implementation that runs a single test method of
+ * a JUnit test case. The current implementation will use the string
+ * constructor first. If the test class does not declare a string
+ * constructor, the sampler will try empty constructor.
+ */
+public class JUnitSampler extends AbstractSampler {
+
+    /**
+     * Property key representing the classname of the JavaSamplerClient to
+     * user.
+     */
+    public static final String CLASSNAME = "junitSampler.classname";
+    public static final String CONSTRUCTORSTRING = "junitsampler.constructorstring";
+    public static final String METHOD = "junitsampler.method";
+    public static final String ERROR = "junitsampler.error";
+    public static final String ERRORCODE = "junitsampler.error.code";
+    public static final String FAILURE = "junitsampler.failure";
+    public static final String FAILURECODE = "junitsampler.failure.code";
+    public static final String SUCCESS = "junitsampler.success";
+    public static final String SUCCESSCODE = "junitsampler.success.code";
+    public static final String FILTER = "junitsampler.pkg.filter";
+    public static final String DOSETUP = "junitsampler.exec.setup";
+    
+    public static final String SETUP = "setUp";
+    public static final String TEARDOWN = "tearDown";
+    public static final String RUNTEST = "run";
+    /// the Method objects for setUp and tearDown methods
+    protected Method SETUP_METHOD = null;
+    protected Method TDOWN_METHOD = null;
+    protected boolean checkStartUpTearDown = false;
+    
+    protected TestCase TEST_INSTANCE = null;
+    
+    /**
+     * Logging
+     */
+    private static transient Logger log = LoggingManager.getLoggerForClass();
+
+    public JUnitSampler(){
+    }
+    
+    /**
+     * Method tries to get the setUp and tearDown method for the class
+     * @param tc
+     */
+    public void initMethodObjects(TestCase tc){
+        if (!this.checkStartUpTearDown && !getDoNotSetUpTearDown()) {
+			if (SETUP_METHOD == null) {
+				SETUP_METHOD = getMethod(tc, SETUP);
+			}
+			if (TDOWN_METHOD == null) {
+				TDOWN_METHOD = getMethod(tc, TEARDOWN);
+			}
+			this.checkStartUpTearDown = true;
+		}
+    }
+    
+    /**
+	 * Sets the Classname attribute of the JavaConfig object
+	 * 
+	 * @param classname
+	 *            the new Classname value
+	 */
+    public void setClassname(String classname)
+    {
+        setProperty(CLASSNAME, classname);
+    }
+
+    /**
+     * Gets the Classname attribute of the JavaConfig object
+     *
+     * @return  the Classname value
+     */
+    public String getClassname()
+    {
+        return getPropertyAsString(CLASSNAME);
+    }
+    
+    /**
+     * Set the string label used to create an instance of the
+     * test with the string constructor.
+     * @param constr
+     */
+    public void setConstructorString(String constr)
+    {
+        setProperty(CONSTRUCTORSTRING,constr);
+    }
+    
+    /**
+     * get the string passed to the string constructor
+     * @return
+     */
+    public String getConstructorString()
+    {
+        return getPropertyAsString(CONSTRUCTORSTRING);
+    }
+    
+    /**
+     * Return the name of the method to test
+     * @return
+     */
+    public String getMethod(){
+        return getPropertyAsString(METHOD);
+    }
+
+    /**
+     * Method should add the JUnit testXXX method to the list at
+     * the end, since the sequence matters.
+     * @param methodName
+     */
+    public void setMethod(String methodName){
+        setProperty(METHOD,methodName);
+    }
+    
+    /**
+     * get the success message
+     * @return
+     */
+    public String getSuccess(){
+        return getPropertyAsString(SUCCESS);
+    }
+    
+    /**
+     * set the success message
+     * @param success
+     */
+    public void setSuccess(String success){
+        setProperty(SUCCESS,success);
+    }
+    
+    /**
+     * get the success code defined by the user
+     * @return
+     */
+    public String getSuccessCode(){
+        return getPropertyAsString(SUCCESSCODE);
+    }
+
+    /**
+     * set the succes code. the success code should
+     * be unique.
+     * @param code
+     */
+    public void setSuccessCode(String code){
+        setProperty(SUCCESSCODE,code);
+    }
+    
+    /**
+     * get the failure message
+     * @return
+     */
+    public String getFailure(){
+        return getPropertyAsString(FAILURE);
+    }
+
+    /**
+     * set the failure message
+     * @param fail
+     */
+    public void setFailure(String fail){
+        setProperty(FAILURE,fail);
+    }
+    
+    /**
+     * The failure code is used by other components
+     * @return
+     */
+    public String getFailureCode(){
+        return getPropertyAsString(FAILURECODE);
+    }
+    
+    /**
+     * Provide some unique code to denote a type of failure
+     * @param code
+     */
+    public void setFailureCode(String code){
+        setProperty(FAILURECODE,code);
+    }
+
+    /**
+     * return the descriptive error for the test
+     * @return
+     */
+    public String getError(){
+        return getPropertyAsString(ERROR);
+    }
+    
+    /**
+     * provide a descriptive error for the test method. For
+     * a description of the difference between failure and
+     * error, please refer to the following url
+     * http://junit.sourceforge.net/doc/faq/faq.htm#tests_9
+     * @param error
+     */
+    public void setError(String error){
+        setProperty(ERROR,error);
+    }
+    
+    /**
+     * return the error code for the test method. it should
+     * be an unique error code.
+     * @return
+     */
+    public String getErrorCode(){
+        return getPropertyAsString(ERRORCODE);
+    }
+    
+    /**
+     * provide an unique error code for when the test
+     * does not pass the assert test.
+     * @param code
+     */
+    public void setErrorCode(String code){
+        setProperty(ERRORCODE,code);
+    }
+    
+    /**
+     * return the comma separated string for the filter
+     * @return
+     */
+    public String getFilterString(){
+        return getPropertyAsString(FILTER);
+    }
+    
+    /**
+     * set the filter string in comman separated format
+     * @param text
+     */
+    public void setFilterString(String text){
+        setProperty(FILTER,text);
+    }
+    
+    public boolean getDoNotSetUpTearDown(){
+        return getPropertyAsBoolean(DOSETUP);
+    }
+    
+    public void setDoNotSetUpTearDown(boolean setup){
+        setProperty(DOSETUP,String.valueOf(setup));
+    }
+    
+    /* (non-Javadoc)
+	 * @see org.apache.jmeter.samplers.Sampler#sample(org.apache.jmeter.samplers.Entry)
+	 */
+	public SampleResult sample(Entry entry) {
+		SampleResult sresult = new SampleResult();
+        String rlabel = null;
+        if (getConstructorString().length() > 0) {
+            rlabel = getConstructorString();
+        } else {
+            rlabel = JUnitSampler.class.getName();
+        }
+        sresult.setSampleLabel(rlabel);
+        sresult.setSamplerData(getClassname() + "." + getMethod());   
+        // check to see if the test class is null. if it is, we create
+        // a new instance. this should only happen at the start of a
+        // test run
+        if (this.TEST_INSTANCE == null) {
+            this.TEST_INSTANCE = (TestCase)getClassInstance(getClassname(),rlabel);
+        }
+        if (this.TEST_INSTANCE != null){
+            initMethodObjects(this.TEST_INSTANCE);
+            // create a new TestResult
+            TestResult tr = new TestResult();
+            this.TEST_INSTANCE.setName(getMethod());
+            try {
+                
+                if (!getDoNotSetUpTearDown() && SETUP_METHOD != null){
+                    SETUP_METHOD.invoke(this.TEST_INSTANCE,new Class[0]);
+                }
+                final Method m = getMethod(this.TEST_INSTANCE,getMethod());
+                final TestCase theClazz = this.TEST_INSTANCE;
+                tr.startTest(this.TEST_INSTANCE);
+                sresult.sampleStart();
+                // Do not use TestCase.run(TestResult) method, since it will
+                // call setUp and tearDown. Doing that will result in calling
+                // the setUp and tearDown method twice and the elapsed time
+                // will include setup and teardown.
+                Protectable p = new Protectable() {
+                    public void protect() throws Throwable {
+                        m.invoke(theClazz,new Class[0]);
+                    }
+                };
+                tr.runProtected(theClazz, p);
+                tr.endTest(this.TEST_INSTANCE);
+                sresult.sampleEnd();
+                
+                if (!getDoNotSetUpTearDown() && TDOWN_METHOD != null){
+                    TDOWN_METHOD.invoke(TEST_INSTANCE,new Class[0]);
+                }
+            } catch (InvocationTargetException e) {
+                // log.warn(e.getMessage());
+                sresult.setResponseCode(getErrorCode());
+                sresult.setResponseMessage(getError());
+                sresult.setResponseData(e.getMessage().getBytes());
+                sresult.setSuccessful(false);
+            } catch (IllegalAccessException e) {
+                // log.warn(e.getMessage());
+                sresult.setResponseCode(getErrorCode());
+                sresult.setResponseMessage(getError());
+                sresult.setResponseData(e.getMessage().getBytes());
+                sresult.setSuccessful(false);
+            } catch (ComparisonFailure e) {
+                sresult.setResponseCode(getErrorCode());
+                sresult.setResponseMessage(getError());
+                sresult.setResponseData(e.getMessage().getBytes());
+                sresult.setSuccessful(false);
+            } catch (IllegalArgumentException e) {
+                sresult.setResponseCode(getErrorCode());
+                sresult.setResponseMessage(getError());
+                sresult.setResponseData(e.getMessage().getBytes());
+                sresult.setSuccessful(false);
+            } catch (Exception e) {
+                sresult.setResponseCode(getErrorCode());
+                sresult.setResponseMessage(getError());
+                sresult.setResponseData(e.getMessage().getBytes());
+                sresult.setSuccessful(false);
+            } catch (Throwable e) {
+                sresult.setResponseCode(getErrorCode());
+                sresult.setResponseMessage(getError());
+                sresult.setResponseData(e.getMessage().getBytes());
+                sresult.setSuccessful(false);
+            }
+            if ( !tr.wasSuccessful() ){
+                sresult.setSuccessful(false);
+                StringBuffer buf = new StringBuffer();
+                buf.append(getFailure() + System.getProperty("line.separator"));
+                Enumeration en = tr.errors();
+                while (en.hasMoreElements()){
+                    Object item = en.nextElement();
+                    if (item instanceof TestFailure) {
+                        buf.append( "Trace -- ");
+                        buf.append( ((TestFailure)item).trace() );
+                        buf.append( "Failure -- ");
+                        buf.append( ((TestFailure)item).toString() );
+                    } else if (item instanceof Throwable) {
+                        buf.append( ((Throwable)item).getMessage() );
+                    }
+                }
+                sresult.setResponseMessage(buf.toString());
+                sresult.setRequestHeaders(buf.toString());
+                sresult.setResponseCode(getFailureCode());
+            } else {
+                // this means there's no failures
+                sresult.setSuccessful(true);
+                sresult.setResponseMessage(getSuccess());
+                sresult.setResponseCode(getSuccessCode());
+                sresult.setResponseData("Not Applicable".getBytes());
+            }
+        } else {
+            // we should log a warning, but allow the test to keep running
+            sresult.setSuccessful(false);
+            // this should be externalized to the properties
+            sresult.setResponseMessage("failed to create an instance of the class");
+        }
+        sresult.setBytes(0);
+        sresult.setContentType("text");
+        sresult.setDataType("Not Applicable");
+        sresult.setRequestHeaders("Not Applicable");
+		return sresult;
+	}
+
+    /**
+     * If the method is not able to create a new instance of the
+     * class, it returns null and logs all the exceptions at
+     * warning level.
+     * @return
+     */
+    public static Object getClassInstance(String className, String label){
+        Object testclass = null;
+        if (className != null){
+            Constructor con = null;
+            Constructor strCon = null;
+            Class theclazz = null;
+            Object[] strParams = null;
+            Object[] params = null;
+            try
+            {
+                theclazz = 
+                    Thread.currentThread().getContextClassLoader().loadClass(className.trim());
+            } catch (ClassNotFoundException e) {
+                log.warn("ClassNotFoundException:: " + e.getMessage());
+            }
+            if (theclazz != null) {
+                // first we see if the class declares a string
+                // constructor. if it is doesn't we look for
+                // empty constructor.
+                try {
+                    strCon = theclazz.getDeclaredConstructor(
+                            new Class[] {String.class});
+                    // we have to check and make sure the constructor is
+                    // accessible. if we didn't it would throw an exception
+                    // and cause a NPE.
+                    if (label == null || label.length() == 0) {
+                        label = className;
+                    }
+                    if (strCon.getModifiers() == Modifier.PUBLIC) {
+                        strParams = new Object[]{label};
+                    } else {
+                        strCon = null;
+                    }
+                } catch (NoSuchMethodException e) {
+                    log.info("String constructor:: " + e.getMessage());
+                }
+                if (con == null ){
+                    try {
+                        con = theclazz.getDeclaredConstructor(new Class[0]);
+                        if (con != null){
+                            params = new Object[]{};
+                        }
+                    } catch (NoSuchMethodException e) {
+                        log.info("Empty constructor:: " + e.getMessage());
+                    }
+                }
+                try {
+                    // if the string constructor is not null, we use it.
+                    // if the string constructor is null, we use the empty
+                    // constructor to get a new instance
+                    if (strCon != null) {
+                        testclass = (TestCase)strCon.newInstance(strParams);
+                    } else if (con != null){
+                        testclass = (TestCase)con.newInstance(params);
+                    }
+                } catch (InvocationTargetException e) {
+                    log.warn(e.getMessage());
+                } catch (InstantiationException e) {
+                    log.info(e.getMessage());
+                } catch (IllegalAccessException e) {
+                    log.info(e.getMessage());
+                }
+            }
+        }
+        return testclass;
+    }
+    
+    /**
+     * 
+     * @param clazz
+     * @param method
+     * @return
+     */
+    public Method getMethod(Object clazz, String method){
+        if (clazz != null && method != null){
+            // log.info("class " + clazz.getClass().getName() +
+            //        " method name is " + method);
+            try {
+                return clazz.getClass().getMethod(method,new Class[0]);
+            } catch (NoSuchMethodException e) {
+                log.warn(e.getMessage());
+            }
+        }
+        return null;
+    }
+    
+    public Method getRunTestMethod(Object clazz){
+        if (clazz != null){
+            // log.info("class " + clazz.getClass().getName() +
+            //        " method name is " + RUNTEST);
+            try {
+                Class[] param = {TestResult.class};
+                return clazz.getClass().getMethod(RUNTEST,param);
+            } catch (NoSuchMethodException e) {
+                log.warn(e.getMessage());
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpTestSampleGui2.java b/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpTestSampleGui2.java
index 7e9ddea..078a1ce 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpTestSampleGui2.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpTestSampleGui2.java
@@ -38,6 +38,11 @@ public class HttpTestSampleGui2 extends HttpTestSampleGui {
 	}
 
 	public String getStaticLabel() {
-		return super.getStaticLabel() + " HTTPCLient (ALPHA)";
+		return super.getStaticLabel() + " HTTPClient";
 	}
+
+    public String getDocAnchor() {
+        return super.getStaticLabel().replace(' ', '_');
+    }
+
 }
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/WebServiceSamplerGui.java b/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/WebServiceSamplerGui.java
index 3e5c42c..5bc6ebd 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/WebServiceSamplerGui.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/WebServiceSamplerGui.java
@@ -170,7 +170,7 @@ public class WebServiceSamplerGui extends AbstractSamplerGui implements java.awt
 		WebServiceSampler sampler = (WebServiceSampler) s;
 		this.configureTestElement(sampler);
 		sampler.setDomain(domain.getText());
-		sampler.setPort(80);
+        sampler.setProperty(HTTPSamplerBase.PORT,port.getText());
 		sampler.setPath(path.getText());
 		sampler.setWsdlURL(wsdlField.getText());
 		sampler.setMethod(HTTPSamplerBase.POST);
@@ -280,12 +280,7 @@ public class WebServiceSamplerGui extends AbstractSamplerGui implements java.awt
 		WebServiceSampler sampler = (WebServiceSampler) el;
 		wsdlField.setText(sampler.getWsdlURL());
 		domain.setText(sampler.getDomain());
-		String portstring = sampler.getPropertyAsString(HTTPSamplerBase.PORT);
-		if (portstring.equals("" + HTTPSamplerBase.UNSPECIFIED_PORT)) {
-			port.setText("");
-		} else {
-			port.setText(portstring);
-		}
+        port.setText(sampler.getPropertyAsString(HTTPSamplerBase.PORT));
 		path.setText(sampler.getPath());
 		soapAction.setText(sampler.getSoapAction());
 		soapXml.setText(sampler.getXmlData());
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java b/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
index 07585d2..86f3ce4 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
@@ -48,6 +48,7 @@ import org.htmlparser.tags.InputTag;
 import org.htmlparser.tags.LinkTag;
 import org.htmlparser.tags.LinkTagTag;
 import org.htmlparser.tags.ScriptTag;
+import org.htmlparser.tags.Tag;
 import org.htmlparser.util.DefaultParserFeedback;
 import org.htmlparser.util.NodeIterator;
 import org.htmlparser.util.ParserException;
@@ -165,7 +166,13 @@ class HtmlParserHTMLParser extends HTMLParser {
 				} else if (node instanceof BgSoundTag) {
 					BgSoundTag script = (BgSoundTag) node;
 					binUrlStr = script.getAttribute("src");
-				}
+                } else if (node instanceof Tag) {
+                    Tag tag = (Tag) node;
+                    String tagname=tag.getTagName();
+                    if (tagname.equalsIgnoreCase("EMBED")){
+                        binUrlStr = tag.getAttribute("src");  
+                    }
+                }
 
 				if (binUrlStr == null) {
 					continue;
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java b/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
index bcfe943..cb8937a 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
@@ -111,7 +111,7 @@ class JTidyHTMLParser extends HTMLParser {
 				break;
 			}
 
-			if (name.equalsIgnoreCase("img")) {
+			if (name.equalsIgnoreCase("img") || name.equalsIgnoreCase("embed")) {
 				urls.addURL(getValue(attrs, "src"), baseUrl);
 				break;
 			}
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/sampler/AccessLogSampler.java b/src/protocol/http/org/apache/jmeter/protocol/http/sampler/AccessLogSampler.java
index d842293..87da4e7 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/sampler/AccessLogSampler.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/sampler/AccessLogSampler.java
@@ -25,6 +25,7 @@ import org.apache.jmeter.samplers.Entry;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.testbeans.TestBean;
 import org.apache.jmeter.testelement.TestCloneable;
+import org.apache.jmeter.testelement.ThreadListener;
 import org.apache.jmeter.threads.JMeterContextService;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.jorphan.util.JMeterException;
@@ -65,7 +66,7 @@ import org.apache.log.Logger;
  * @author Peter Lin
  * @version $Revision$ last updated $Date$
  */
-public class AccessLogSampler extends HTTPSampler implements TestBean {
+public class AccessLogSampler extends HTTPSampler implements TestBean,ThreadListener {
 	private static Logger log = LoggingManager.getLoggerForClass();
 
 	public static final String DEFAULT_CLASS = "org.apache.jmeter.protocol.http.util.accesslog.TCLogParser";
@@ -296,6 +297,15 @@ public class AccessLogSampler extends HTTPSampler implements TestBean {
 						initFilter();
 						s.filter = (Filter) ((TestCloneable) filter).clone();
 					}
+                    if(TestCloneable.class.isAssignableFrom(Class.forName(parserClassName)))
+                    {
+                        instantiateParser();
+                        s.PARSER = (LogParser)((TestCloneable)PARSER).clone();
+                        if(filter != null)
+                        {
+                            s.PARSER.setFilter(s.filter);
+                        }
+                    }
 				} catch (Exception e) {
 					log.warn("Could not clone cloneable filter", e);
 				}
@@ -313,6 +323,7 @@ public class AccessLogSampler extends HTTPSampler implements TestBean {
 		if (PARSER != null) {
 			PARSER.close();
 		}
+        filter = null;
 		started = false;
 		super.testEnded();
 	}
@@ -326,4 +337,14 @@ public class AccessLogSampler extends HTTPSampler implements TestBean {
 		started = true;
 		super.testStarted();
 	}
+
+    /* (non-Javadoc)
+     * @see org.apache.jmeter.testelement.AbstractTestElement#threadFinished()
+     */
+    public void threadFinished() {
+        if(PARSER instanceof ThreadListener)
+            ((ThreadListener)PARSER).threadFinished();
+        if(filter instanceof ThreadListener)
+            ((ThreadListener)filter).threadFinished();
+    }
 }
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampler2.java b/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampler2.java
index e460c5e..07daee1 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampler2.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampler2.java
@@ -536,11 +536,11 @@ public class HTTPSampler2 extends HTTPSamplerBase {
 	}
 
 	public void threadStarted() {
-		log.info("Thread Started");
+		log.debug("Thread Started");
 	}
 
 	public void threadFinished() {
-		log.info("Thread Finished");
+		log.debug("Thread Finished");
 		if (httpConn != null)
 			httpConn.close();
 	}
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java b/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
index 2dc10a1..503d9b1 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/sampler/WebServiceSampler.java
@@ -21,6 +21,7 @@ package org.apache.jmeter.protocol.http.sampler;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.StringReader;
 import java.net.URL;
@@ -33,6 +34,7 @@ import javax.mail.MessagingException;
 import javax.xml.parsers.DocumentBuilder;
 
 import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 import org.apache.jorphan.io.TextFile;
 import org.apache.jorphan.logging.LoggingManager;
@@ -371,7 +373,8 @@ public class WebServiceSampler extends HTTPSamplerBase {
 			if (DOMPool.getDocument(next) != null) {
 				return DOMPool.getDocument(next).getDocumentElement();
 			} else {
-				return openDocument(next).getDocumentElement();
+                Document doc = openDocument(next);
+				return doc == null ? null : doc.getDocumentElement();
 			}
 		} else {
 			Document doc = openDocument(null);
@@ -400,21 +403,29 @@ public class WebServiceSampler extends HTTPSamplerBase {
 		if (getXmlFile().length() > 0 || getXmlPathLoc().length() > 0) {
 			try {
 				doc = XDB.parse(new FileInputStream(retrieveRuntimeXmlData()));
-			} catch (Exception e) {
-				// there should be a file, if not fail silently
-				log.debug(e.getMessage());
-			}
+			} catch (SAXException e) {
+				log.warn("Error processing file data: "+e.getMessage());
+			} catch (FileNotFoundException e) {
+                log.warn(e.getMessage());
+            } catch (IOException e) {
+                log.warn(e.getMessage());
+            }
 		} else {
 			FILE_CONTENTS = getXmlData();
 			if (FILE_CONTENTS != null && FILE_CONTENTS.length() > 0) {
 				try {
 					doc = XDB.parse(new InputSource(new StringReader(FILE_CONTENTS)));
-				} catch (Exception ex) {
-					log.debug(ex.getMessage());
-				}
-			}
+				} catch (SAXException ex) {
+					log.warn("Error processing data: "+ex.getMessage());
+				} catch (IOException ex) {
+                    log.warn(ex.getMessage()); // shouldn't really happen
+                }
+			} else {
+			    log.warn("No post data provided!");
+            }
 		}
-		if (this.getPropertyAsBoolean(MEMORY_CACHE)) {
+        // don't cache null documents ...
+		if (doc != null && this.getPropertyAsBoolean(MEMORY_CACHE)) {
 			DOMPool.putDocument(key, doc);
 		}
 		return doc;
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Filter.java b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Filter.java
index 6659e3b..985b6fa 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Filter.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/Filter.java
@@ -18,6 +18,8 @@
 
 package org.apache.jmeter.protocol.http.util.accesslog;
 
+import org.apache.jmeter.testelement.TestElement;
+
 /**
  * Description:<br>
  * <br>
@@ -82,7 +84,7 @@ public interface Filter {
 	 * @param path
 	 * @return boolean
 	 */
-	public boolean isFiltered(String path);
+	public boolean isFiltered(String path,TestElement sampler);
 
 	/**
 	 * In case the user wants to replace the file extension, log parsers should
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/LogFilter.java b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/LogFilter.java
index e0430cd..1a86f52 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/LogFilter.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/LogFilter.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 
 import org.apache.jmeter.junit.JMeterTestCase;
+import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.oro.text.regex.Pattern;
 import org.apache.oro.text.regex.Perl5Compiler;
@@ -207,7 +208,7 @@ public class LogFilter implements Filter, Serializable {
 	 * @param path
 	 * @return boolean
 	 */
-	public boolean isFiltered(String path) {
+	public boolean isFiltered(String path,TestElement el) {
 		// we do a quick check to see if any
 		// filters are set. If not we just
 		// return false to be efficient.
@@ -474,7 +475,7 @@ public class LogFilter implements Filter, Serializable {
 
 		public void testReplaceExtension() {
 			testf.setReplaceExtension("html", "jsp");
-			testf.isFiltered(TESTSTR);// set the required variables
+			testf.isFiltered(TESTSTR,null);// set the required variables
 			assertEquals(TESTSTROUT, testf.filter(TESTSTR));
 		}
 
@@ -485,7 +486,7 @@ public class LogFilter implements Filter, Serializable {
 				String theFile = td.file;
 				boolean expect = td.exclfile;
 
-				testf.isFiltered(theFile);
+				testf.isFiltered(theFile,null);
 				String line = testf.filter(theFile);
 				if (line != null) {
 					assertTrue("Expect to accept " + theFile, expect);
@@ -502,7 +503,7 @@ public class LogFilter implements Filter, Serializable {
 				String theFile = td.file;
 				boolean expect = td.inclfile;
 
-				testf.isFiltered(theFile);
+				testf.isFiltered(theFile,null);
 				String line = testf.filter(theFile);
 				if (line != null) {
 					assertTrue("Expect to accept " + theFile, expect);
@@ -520,7 +521,7 @@ public class LogFilter implements Filter, Serializable {
 				String theFile = td.file;
 				boolean expect = td.exclpatt;
 
-				assertEquals(!expect, testf.isFiltered(theFile));
+				assertEquals(!expect, testf.isFiltered(theFile,null));
 				String line = testf.filter(theFile);
 				if (line != null) {
 					assertTrue("Expect to accept " + theFile, expect);
@@ -537,7 +538,7 @@ public class LogFilter implements Filter, Serializable {
 				String theFile = td.file;
 				boolean expect = td.inclpatt;
 
-				assertEquals(!expect, testf.isFiltered(theFile));
+				assertEquals(!expect, testf.isFiltered(theFile,null));
 				String line = testf.filter(theFile);
 				if (line != null) {
 					assertTrue("Expect to accept " + theFile, expect);
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/OrderPreservingLogParser.java b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/OrderPreservingLogParser.java
new file mode 100644
index 0000000..4095fbf
--- /dev/null
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/OrderPreservingLogParser.java
@@ -0,0 +1,27 @@
+package org.apache.jmeter.protocol.http.util.accesslog;
+
+import org.apache.jmeter.testelement.TestElement;
+
+public class OrderPreservingLogParser extends SharedTCLogParser {
+
+    public OrderPreservingLogParser() {
+        super();
+    }
+
+    public OrderPreservingLogParser(String source) {
+        super(source);
+    }
+
+    /**
+     * parse a set number of lines from the access log. Keep in mind the number
+     * of lines parsed will depend the filter and number of lines in the log.
+     * The method returns the actual lines parsed.
+     * 
+     * @param count
+     * @return lines parsed
+     */
+    public synchronized int parseAndConfigure(int count, TestElement el) {
+        return this.parse(el, count);
+    }
+
+}
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java
index 7d298fc..932ec13 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SessionFilter.java
@@ -21,11 +21,17 @@
 package org.apache.jmeter.protocol.http.util.accesslog;
 
 import java.io.Serializable;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.jmeter.protocol.http.control.CookieManager;
+import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
 import org.apache.jmeter.testelement.TestCloneable;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.testelement.ThreadListener;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
@@ -37,37 +43,26 @@ import org.apache.oro.text.regex.Perl5Matcher;
  * @author mstover
  * 
  */
-public class SessionFilter implements Filter, Serializable, TestCloneable {
+public class SessionFilter implements Filter, Serializable, TestCloneable,ThreadListener {
+    private static final long serialVersionUID = 1;
 	static Logger log = LoggingManager.getLoggerForClass();
 
 	/**
-	 * This object is static across multiple threads in a test, via clone()
+	 * These objects are static across multiple threads in a test, via clone()
 	 * method.
 	 */
-	protected List excludedIps;
-
-	String ipAddress;
+	protected Map cookieManagers;
+    protected Set managersInUse;
+    
+    protected CookieManager lastUsed;
 
-	/*
+    /*
 	 * (non-Javadoc)
 	 * 
 	 * @see org.apache.jmeter.protocol.http.util.accesslog.LogFilter#excPattern(java.lang.String)
 	 */
 	protected boolean hasExcPattern(String text) {
-		synchronized (excludedIps) {
-			boolean exclude = false;
-			for (Iterator x = excludedIps.iterator(); x.hasNext();) {
-				if (text.indexOf((String) x.next()) > -1) {
-					exclude = true;
-					break;
-				}
-			}
-			if (!exclude) {
-				ipAddress = getIpAddress(text);
-				excludedIps.add(ipAddress);
-			}
-			return exclude;
-		}
+        return false;
 	}
 
 	protected String getIpAddress(String logLine) {
@@ -84,12 +79,21 @@ public class SessionFilter implements Filter, Serializable, TestCloneable {
 	 * @see org.apache.jmeter.protocol.http.util.accesslog.Filter#reset()
 	 */
 	public void reset() {
-		ipAddress = null;
+		cookieManagers.clear();
 	}
 
 	public Object clone() {
+        if(cookieManagers == null)
+        {
+            cookieManagers = Collections.synchronizedMap(new HashMap());
+        }
+        if(managersInUse == null)
+        {
+            managersInUse = Collections.synchronizedSet(new HashSet());
+        }
 		SessionFilter f = new SessionFilter();
-		f.excludedIps = excludedIps;
+        f.cookieManagers = cookieManagers;
+        f.managersInUse = managersInUse;
 		return f;
 	}
 
@@ -97,7 +101,6 @@ public class SessionFilter implements Filter, Serializable, TestCloneable {
 	 * 
 	 */
 	public SessionFilter() {
-		excludedIps = new LinkedList();
 	}
 
 	/*
@@ -146,13 +149,55 @@ public class SessionFilter implements Filter, Serializable, TestCloneable {
 	 * 
 	 * @see org.apache.jmeter.protocol.http.util.accesslog.Filter#isFiltered(java.lang.String)
 	 */
-	public boolean isFiltered(String path) {
-		if (ipAddress != null) {
-			log.debug("looking for ip address: " + ipAddress + " in line: " + path);
-			return !(path.indexOf(ipAddress) > -1);
-		} else
-			return hasExcPattern(path);
+	public boolean isFiltered(String path,TestElement sampler) {
+		String ipAddr = getIpAddress(path);
+        CookieManager cm = getCookieManager(ipAddr);
+        ((HTTPSampler)sampler).setCookieManager(cm);   
+        return false;
 	}
+    
+    protected CookieManager getCookieManager(String ipAddr)
+    {
+        CookieManager cm = null;
+        // First have to release the cookie we were using so other
+        // threads stuck in wait can move on
+        synchronized(managersInUse)
+        {
+            if(lastUsed != null)
+            {
+                managersInUse.remove(lastUsed);
+                managersInUse.notify(); 
+            }
+        }
+        // let notified threads move on and get lock on managersInUse
+        if(lastUsed != null)
+        {
+            Thread.yield();
+        }
+        // here is the core routine to find appropriate cookie manager and
+        // check it's not being used.  If used, wait until whoever's using it gives
+        // it up
+        synchronized(managersInUse)
+        {
+            cm = (CookieManager)cookieManagers.get(ipAddr);
+            if(cm == null)
+            {
+                cm = new CookieManager();
+                cookieManagers.put(ipAddr,cm);
+            } 
+            while(managersInUse.contains(cm))
+            {
+                try {
+                    managersInUse.wait();
+                } catch (InterruptedException e) {
+                    log.info("SessionFilter wait interrupted");
+                }
+            }
+            managersInUse.add(cm);
+            lastUsed = cm;
+        }
+        return cm;
+    }
 
 	/*
 	 * (non-Javadoc)
@@ -162,4 +207,23 @@ public class SessionFilter implements Filter, Serializable, TestCloneable {
 	 */
 	public void setReplaceExtension(String oldextension, String newextension) {
 	}
+
+    /* (non-Javadoc)
+     * @see org.apache.jmeter.testelement.ThreadListener#threadFinished()
+     */
+    public void threadFinished() {
+        synchronized(managersInUse)
+        {
+            managersInUse.remove(lastUsed);
+            managersInUse.notify(); 
+        }        
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.jmeter.testelement.ThreadListener#threadStarted()
+     */
+    public void threadStarted() {
+        // TODO Auto-generated method stub
+        
+    }
 }
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SharedTCLogParser.java b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SharedTCLogParser.java
new file mode 100644
index 0000000..6dc502b
--- /dev/null
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/SharedTCLogParser.java
@@ -0,0 +1,93 @@
+package org.apache.jmeter.protocol.http.util.accesslog;
+
+import java.io.IOException;
+
+import org.apache.jmeter.services.FileServer;
+import org.apache.jmeter.testelement.TestCloneable;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.testelement.ThreadListener;
+
+public class SharedTCLogParser extends TCLogParser implements TestCloneable {
+
+	public SharedTCLogParser() {
+		super();
+	}
+
+	public SharedTCLogParser(String source) {
+		super(source);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.lang.Object#clone()
+	 */
+	public Object clone() {
+		SharedTCLogParser parser = new SharedTCLogParser();
+		parser.FILENAME = FILENAME;
+		parser.FILTER = FILTER;
+		return parser;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.jmeter.protocol.http.util.accesslog.TCLogParser#parse(org.apache.jmeter.testelement.TestElement, int)
+	 */
+	public int parse(TestElement el, int parseCount) {
+		FileServer fileServer = FileServer.getFileServer();
+		fileServer.reserveFile(FILENAME);
+		try {
+			return parse(fileServer, el, parseCount);
+		} catch (Exception exception) {
+			log.error("Problem creating samples", exception);
+		}
+		return -1;// indicate that an error occured
+	}
+
+	/**
+	 * The method is responsible for reading each line, and breaking out of the
+	 * while loop if a set number of lines is given.
+	 * 
+	 * @param breader
+	 */
+	protected int parse(FileServer breader, TestElement el, int parseCount) {
+		int actualCount = 0;
+		String line = null;
+		try {
+			// read one line at a time using
+			// BufferedReader
+			line = breader.readLine(FILENAME);
+			while (line != null) {
+				if (line.length() > 0) {
+					actualCount += this.parseLine(line, el);
+				}
+				// we check the count to see if we have exceeded
+				// the number of lines to parse. There's no way
+				// to know where to stop in the file. Therefore
+				// we use break to escape the while loop when
+				// we've reached the count.
+				if (parseCount != -1 && actualCount >= parseCount) {
+					break;
+				}
+				line = breader.readLine(FILENAME);
+			}
+			if (line == null) {
+				breader.closeFile(FILENAME);
+				// this.READER = new BufferedReader(new
+				// FileReader(this.SOURCE));
+				// parse(this.READER,el);
+			}
+		} catch (IOException ioe) {
+			log.error("Error reading log file", ioe);
+		}
+		return actualCount;
+	}
+
+	public void close() {
+		try {
+			FileServer.getFileServer().closeFile(FILENAME);
+		} catch (IOException e) {
+			// do nothing
+		}
+	}
+	
+	
+
+}
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java
index 1a055e4..dab041e 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/util/accesslog/TCLogParser.java
@@ -244,7 +244,7 @@ public class TCLogParser implements LogParser {
 		el.setProperty(HTTPSamplerBase.METHOD, RMETHOD);
 		if (FILTER != null) {
 			log.debug("filter is not null");
-			if (!FILTER.isFiltered(line)) {
+			if (!FILTER.isFiltered(line,el)) {
 				log.debug("line was not filtered");
 				// increment the current count
 				count++;
diff --git a/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BSFSamplerGui.java b/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BSFSamplerGui.java
index 2b963a5..09527d5 100644
--- a/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BSFSamplerGui.java
+++ b/src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BSFSamplerGui.java
@@ -55,6 +55,8 @@ public class BSFSamplerGui extends AbstractSamplerGui {
 		super.configure(element);
 		scriptField.setText(element.getPropertyAsString(BSFSampler.SCRIPT));
 		langField.setText(element.getPropertyAsString(BSFSampler.LANGUAGE));
+        filename.setText(element.getPropertyAsString(BSFSampler.FILENAME));
+        parameters.setText(element.getPropertyAsString(BSFSampler.PARAMETERS));
 	}
 
 	public TestElement createTestElement() {
diff --git a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/config/DataSourceElement.java b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/config/DataSourceElement.java
index 588312b..c35304f 100644
--- a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/config/DataSourceElement.java
+++ b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/config/DataSourceElement.java
@@ -22,6 +22,7 @@ import org.apache.avalon.framework.logger.LogKitLogger;
 import org.apache.jmeter.config.ConfigElement;
 import org.apache.jmeter.engine.event.LoopIterationEvent;
 import org.apache.jmeter.testbeans.TestBean;
+import org.apache.jmeter.testbeans.TestBeanHelper;
 import org.apache.jmeter.testelement.AbstractTestElement;
 import org.apache.jmeter.testelement.TestListener;
 import org.apache.jorphan.logging.LoggingManager;
@@ -89,6 +90,8 @@ public class DataSourceElement extends AbstractTestElement implements ConfigElem
 	public void testStarted() {
 		if (!started[0]) {
 			try {
+                this.setRunningVersion(true);
+                TestBeanHelper.prepare(this);
 				initPool();
 			} catch (Exception e) {
 				log.error("Unable to start database connection pool.", e);
diff --git a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
index a7d89ee..057739a 100644
--- a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
+++ b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
@@ -44,12 +44,13 @@ public class JDBCSampler extends AbstractSampler implements TestBean {
 	private static Logger log = LoggingManager.getLoggerForClass();
 
 	public static final String QUERY = "query";
+	public static final String SELECT = "Select Statement";
 
 	public String query = "";
 
 	public String dataSource = "";
 
-	public boolean queryOnly = true;
+	public String queryType = SELECT;
 
 	/**
 	 * Creates a JDBCSampler.
@@ -80,7 +81,7 @@ public class JDBCSampler extends AbstractSampler implements TestBean {
 			stmt = conn.createStatement();
 
 			// Based on query return value, get results
-			if (isQueryOnly()) {
+			if (SELECT.equals(getQueryType())) {
 				ResultSet rs = null;
 				try {
 					rs = stmt.executeQuery(getQuery());
@@ -195,17 +196,16 @@ public class JDBCSampler extends AbstractSampler implements TestBean {
 	}
 
 	/**
-	 * @return Returns the queryOnly.
+	 * @return Returns the queryType.
 	 */
-	public boolean isQueryOnly() {
-		return queryOnly;
+	public String getQueryType() {
+		return queryType;
 	}
 
 	/**
-	 * @param queryOnly
-	 *            The queryOnly to set.
+	 * @param queryType The queryType to set.
 	 */
-	public void setQueryOnly(boolean queryOnly) {
-		this.queryOnly = queryOnly;
+	public void setQueryType(String queryType) {
+		this.queryType = queryType;
 	}
 }
diff --git a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
index c5400e6..148f5e6 100644
--- a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
+++ b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
@@ -40,15 +40,17 @@ public class JDBCSamplerBeanInfo extends BeanInfoSupport {
 
 		createPropertyGroup("varName", new String[] { "dataSource" });
 
-		createPropertyGroup("sql", new String[] { "queryOnly", "query" });
+		createPropertyGroup("sql", new String[] { "queryType", "query" });
 
 		PropertyDescriptor p = property("dataSource");
 		p.setValue(NOT_UNDEFINED, Boolean.TRUE);
 		p.setValue(DEFAULT, "");
 
-		p = property("queryOnly");
+		p = property("queryType");
 		p.setValue(NOT_UNDEFINED, Boolean.TRUE);
-		p.setValue(DEFAULT, new Boolean(true));
+		p.setValue(DEFAULT, JDBCSampler.SELECT);
+		p.setValue(NOT_OTHER,Boolean.TRUE);
+		p.setValue(TAGS,new String[]{JDBCSampler.SELECT,"Update Statement"});
 
 		p = property("query");
 		p.setValue(NOT_UNDEFINED, Boolean.TRUE);
diff --git a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources.properties b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources.properties
index 1b90853..6ce8207 100644
--- a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources.properties
+++ b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources.properties
@@ -3,7 +3,7 @@ varName.displayName=Variable Name Bound to Pool
 sql.displayName=SQL Query
 query.displayName=Query
 query.shortDescription=SQL Query to send to database
-queryOnly.displayName=Query Only
-queryOnly.shortDescription=If true, will run as a query and not as an update/insert.  Otherwise, run as update.
+queryType.displayName=Query Type
+queryType.shortDescription=Determines if the SQL statement should be run as a select statement or an update statement.
 dataSource.displayName=Variable Name
 dataSource.shortDescription=Name of the JMeter variable that the connection pool is bound to.
\ No newline at end of file
diff --git a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources_es.properties b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources_es.properties
index 80d1265..f952269 100644
--- a/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources_es.properties
+++ b/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerResources_es.properties
@@ -4,7 +4,7 @@ dataSource.shortDescription=Nombre de la variable JMeter a la cual est\u00E1 lig
 displayName=Petici\u00F3n JDBC
 query.displayName=Query
 query.shortDescription=Query SQL a enviar a la base de datos
-queryOnly.displayName=Solo Query
-queryOnly.shortDescription=is true, se lanzar\u00E1 como una query y no como un update/inser. Si no, se lanza como update.
+queryType.displayName=Solo Query
+queryType.shortDescription=is true, se lanzar\u00E1 como una query y no como un update/inser. Si no, se lanza como update.
 sql.displayName=Query SQL
 varName.displayName=Nombre de Variable Ligada al Pool
diff --git a/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java b/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java
index bf2fa93..df4c0a2 100644
--- a/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java
+++ b/src/protocol/tcp/org/apache/jmeter/protocol/tcp/sampler/TCPSampler.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2004 The Apache Software Foundation.
+ * Copyright 2003-2005 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,19 +26,15 @@ import java.io.OutputStream;
 import java.net.Socket;
 import java.net.UnknownHostException;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 
 import org.apache.jmeter.config.ConfigTestElement;
 import org.apache.jmeter.util.JMeterUtils;
-import org.apache.jmeter.engine.event.LoopIterationEvent;
 import org.apache.jmeter.samplers.AbstractSampler;
 import org.apache.jmeter.samplers.Entry;
 import org.apache.jmeter.samplers.SampleResult;
-import org.apache.jmeter.testelement.TestListener;
+import org.apache.jmeter.testelement.ThreadListener;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
 
@@ -46,7 +42,7 @@ import org.apache.log.Logger;
  * A sampler which understands Tcp requests.
  * 
  */
-public class TCPSampler extends AbstractSampler implements TestListener {
+public class TCPSampler extends AbstractSampler implements ThreadListener {
 	private static final Logger log = LoggingManager.getLoggerForClass();
 
 	public final static String SERVER = "TCPSampler.server"; //$NON-NLS-1$
@@ -67,9 +63,6 @@ public class TCPSampler extends AbstractSampler implements TestListener {
 
 	private final static String ERRKEY = "ERR"; //$NON-NLS-1$ key for HashMap
 
-	private static Set allSockets = new HashSet();// Keep track of connections
-													// to allow close
-
 	// If set, this is the regex that is used to extract the status from the
 	// response
 	// NOT implemented yet private final static String STATUS_REGEX =
@@ -142,7 +135,6 @@ public class TCPSampler extends AbstractSampler implements TestListener {
 			log.debug(this + "  Timeout " + getTimeout() + " NoDelay " + getNoDelay()); //$NON-NLS-1$
 			log.debug("Created new connection " + con); //$NON-NLS-1$
 			cp.put(TCPKEY, con);
-			allSockets.add(con);// Save so can be closed
 		} catch (UnknownHostException e) {
 			log.warn("Unknown host for " + getLabel(), e);//$NON-NLS-1$
 			cp.put(ERRKEY, e.toString());
@@ -302,22 +294,23 @@ public class TCPSampler extends AbstractSampler implements TestListener {
 					}
 				}
 			}
-		} catch (Exception ex) {
+		} catch (IOException ex) {
 			log.debug("", ex);
 			res.setResponseCode("500");
 			res.setResponseMessage(ex.toString());
-		}
-
-		// Calculate response time
-		res.sampleEnd();
-
-		// Set if we were successful or not
-		res.setSuccessful(isSuccessful);
+            closeSocket();
+		} finally {
+    		// Calculate response time
+    		res.sampleEnd();
+    
+    		// Set if we were successful or not
+    		res.setSuccessful(isSuccessful);
+        }
 
 		return res;
 	}
 
-	/**
+    /**
 	 * @param rc
 	 *            response code
 	 * @return whether this represents success or not
@@ -332,69 +325,25 @@ public class TCPSampler extends AbstractSampler implements TestListener {
 		return true;
 	}
 
-	private void disconnectAll() {
-		synchronized (allSockets) {
-			Iterator i = allSockets.iterator();
-			while (i.hasNext()) {
-				Socket socket = (Socket) i.next();
-				try {
-					socket.close();
-				} catch (IOException e) {
-					log.warn("Error closing socket ", e);
-				} finally {
-					i.remove();
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.jmeter.testelement.TestListener#testStarted()
-	 */
-	public void testStarted() // Only called once per class?
-	{
-		log.debug(this + " test started");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.jmeter.testelement.TestListener#testEnded()
-	 */
-	public void testEnded() // Only called once per class?
-	{
-		log.debug(this + " test ended");
-		disconnectAll();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.jmeter.testelement.TestListener#testStarted(java.lang.String)
-	 */
-	public void testStarted(String host) {
-		log.debug(this + " test started on " + host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.jmeter.testelement.TestListener#testEnded(java.lang.String)
-	 */
-	public void testEnded(String host) {
-		log.debug(this + " test ended on " + host);
-		disconnectAll();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.apache.jmeter.testelement.TestListener#testIterationStart(org.apache.jmeter.engine.event.LoopIterationEvent)
-	 */
-	public void testIterationStart(LoopIterationEvent event) {
-		log.debug(this + " test iteration start on " + event.getIteration());
-	}
+    public void threadStarted() {
+        log.debug("Thread Started");
+    }
+
+    private void closeSocket() {
+        Map cp = (Map) tp.get();
+        Socket con = (Socket) cp.remove(TCPKEY);
+        if (con != null) {
+            log.debug(this + " Closing connection " + con); //$NON-NLS-1$
+            try {
+                con.close();
+            } catch (IOException e) {
+                log.warn("Error closing socket "+e);
+            }
+        }
+    }
+
+    public void threadFinished() {
+        log.debug("Thread Finished");
+        closeSocket();
+    }
 }
diff --git a/test/src/org/apache/jmeter/save/TestSaveService.java b/test/src/org/apache/jmeter/save/TestSaveService.java
index d237617..8719343 100644
--- a/test/src/org/apache/jmeter/save/TestSaveService.java
+++ b/test/src/org/apache/jmeter/save/TestSaveService.java
@@ -67,11 +67,21 @@ public class TestSaveService extends JMeterTestCase {
 			// fail, because the order of the properties within each
 			// test element may change. Comparing the lengths should be
 			// enough to detect most problem cases...
-			if (len != out.size()) {
+            int outsz=out.size();
+            // Allow for input in CRLF and output in LF only
+            int lines=0;
+            byte ba[]=out.toByteArray();
+            for(int j=0;j<ba.length;j++) {
+                if (ba[j] == '\n'){
+                    lines++;
+                }
+            }
+			if (len != outsz && len != outsz+lines) {
 				failed = true;
 				System.out.println();
 				System.out.println("Loading file testfiles/" + FILES[i] + " and "
-						+ "saving it back changes its size from " + len + " to " + out.size() + ".");
+						+ "saving it back changes its size from " + len + " to " + outsz + ".");
+                System.out.println("Diff "+(len-outsz)+" lines "+lines);
 				if (saveOut) {
 					String outfile = "testfiles/" + FILES[i] + ".out";
 					System.out.println("Write " + outfile);
diff --git a/test/src/org/apache/jorphan/util/TestJorphanUtils.java b/test/src/org/apache/jorphan/util/TestJorphanUtils.java
new file mode 100644
index 0000000..bbb1e12
--- /dev/null
+++ b/test/src/org/apache/jorphan/util/TestJorphanUtils.java
@@ -0,0 +1,81 @@
+package org.apache.jorphan.util;
+
+import junit.framework.TestCase;
+
+public class TestJorphanUtils extends TestCase {
+
+    public TestJorphanUtils() {
+        super();
+        // TODO Auto-generated constructor stub
+    }
+
+    public TestJorphanUtils(String arg0) {
+        super(arg0);
+        // TODO Auto-generated constructor stub
+    }
+    
+        public void testReplace1() {
+            assertEquals("xyzdef", JOrphanUtils.replaceFirst("abcdef", "abc", "xyz"));
+        }
+
+        public void testReplace2() {
+            assertEquals("axyzdef", JOrphanUtils.replaceFirst("abcdef", "bc", "xyz"));
+        }
+
+        public void testReplace3() {
+            assertEquals("abcxyz", JOrphanUtils.replaceFirst("abcdef", "def", "xyz"));
+        }
+
+        public void testReplace4() {
+            assertEquals("abcdef", JOrphanUtils.replaceFirst("abcdef", "bce", "xyz"));
+        }
+
+        public void testReplace5() {
+            assertEquals("abcdef", JOrphanUtils.replaceFirst("abcdef", "alt=\"\" ", ""));
+        }
+
+        public void testReplace6() {
+            assertEquals("abcdef", JOrphanUtils.replaceFirst("abcdef", "alt=\"\" ", ""));
+        }
+
+        public void testReplace7() {
+            assertEquals("alt=\"\"", JOrphanUtils.replaceFirst("alt=\"\"", "alt=\"\" ", ""));
+        }
+
+        public void testReplace8() {
+            assertEquals("img src=xyz ", JOrphanUtils.replaceFirst("img src=xyz alt=\"\" ", "alt=\"\" ", ""));
+        }
+
+        public void testSplit1() {
+            String in = "a,bc,,"; // Test ignore trailing split characters
+            String out[] = JOrphanUtils.split(in, ",",true);
+            assertEquals(2, out.length);
+            assertEquals("a", out[0]);
+            assertEquals("bc", out[1]);
+        }
+
+        public void testSplit2() {
+            String in = ",,a,bc"; // Test leading split characters
+            String out[] = JOrphanUtils.split(in, ",",true);
+            assertEquals(2, out.length);
+            assertEquals("a", out[0]);
+            assertEquals("bc", out[1]);
+            out = JOrphanUtils.split(in, ",",false);
+            assertEquals("Should detect the leading split chars; ", 4, out.length);
+            assertEquals("", out[0]);
+            assertEquals("", out[1]);
+            assertEquals("a", out[2]);
+            assertEquals("bc", out[3]);
+        }
+        
+        public void testTruncate() throws Exception
+        {
+            String in = "a,b,,,d,e,,f";
+            String[] out = JOrphanUtils.split(in,",",true);
+            assertEquals("d",out[2]);
+            out = JOrphanUtils.split(in,",",false);
+            assertEquals("",out[2]);
+            
+        }
+
+}
diff --git a/xdocs/changes.xml b/xdocs/changes.xml
index 8009e0a..7905839 100644
--- a/xdocs/changes.xml
+++ b/xdocs/changes.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0"?> 
 <!--
    $Header$
-   Copyright 2001-2004 The Apache Software Foundation
+   Copyright 2001-2005 The Apache Software Foundation
  
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -27,6 +27,27 @@
 
 <b>Changes: for more info, contact <a href="mailto:mstover1@apache.org">Michael Stover</a></b>
 
+<h3>Version 2.1.1</h3>
+<h4>New functionality:</h4>
+<ul>
+<li>New Include Controller allows a test plan to reference an external jmx file</li>
+<li>New JUnitSampler added for using JUnit Test classes</li>
+<li>New Aggregate Graph listener is capable of graphing aggregate statistics</li>
+<li>Can provide additional classpath entries using the property user.classpath and on the Test Plan element</li>
+</ul>
+<h4>Bug fixes:</h4>
+<ul>
+<li>AccessLog Sampler and JDBC test elements populated correctly from 2.0 test plans</li>
+<li>BSF Sampler now populates filename and parameters from saved test plan</li>
+<li>Bug 36500 - handle missing data more gracefully in WebServiceSampler</li>
+<li>Bug 35546 - add merge to right-click menu</li>
+<li>Bug 36642 - Summariser stopped working in 2.1</li>
+<li>Bug 36618 - CSV header line did not match saved data</li>
+<li>JMeter should now run under JVM 1.3 (but does not build with 1.3)</li>
+</ul>	
+	
+
+
 <h3>Version 2.1</h3>
 <h4>New functionality:</h4>
 <ul>
@@ -55,6 +76,8 @@
 <li>How-to for JMS samplers</li>
 <li>Bug 35525 - Added Spanish localisation</li>
 <li>Bug 30379 - allow server.rmi.port to be overridden</li>
+<li>enhanced the monitor listener to save the calculated stats</li>
+<li>Functions and variables now work at top level of test plan</li>
 </ul>
 <h4>Bug fixes:</h4>
 <ul>
@@ -81,6 +104,8 @@
 <li>Fixed webservice sampler so it works with user defined variables</li>
 <li>Fixed screen borders for LDAP config GUI elements</li>
 <li>Bug 31184 - make sure encoding is specified in JDBC sampler</li>
+<li>TCP sampler - only share sockets with same host:port details; correct the manual</li>
+<li>Extract src attribute for embed tags in JTidy and Html Parsers</li>
 </ul>	
 	
 <h3>Version 2.0.3</h3>
diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml
index d792332..9c54c35 100644
--- a/xdocs/stylesheets/project.xml
+++ b/xdocs/stylesheets/project.xml
@@ -46,6 +46,12 @@
 	 	<item name="JMeter on IRC"       href="/jmeter_irc.html"/>
 	 	<item name="Developer Notes"     href="http://wiki.apache.org/jakarta-jmeter/JMeterDevelopment"/>
 	 </menu>
+	 <menu name="Tutorials">
+		<item name="Distributed Testing" href="/usermanual/jmeter_distributed_testing_step_by_step.pdf"/>
+		<item name="Recording Tests"	 href="/usermanual/jmeter_proxy_step_by_step.pdf"/>
+		<item name="JUnit Sampler"		 href="/usermanual/junitsampler_tutorial.pdf"/>
+		<item name="Access Log Sampler"	 href="/usermanual/jmeter_accesslog_sampler_step_by_step.pdf"/>
+	 </menu>
 	 <menu name="Community">
 		<item name="Get Involved"        href="/site/getinvolved.html"/>
 		<item name="Mailing Lists"       href="/site/mail.html"/>
diff --git a/xdocs/usermanual/build-monitor-test-plan.xml b/xdocs/usermanual/build-monitor-test-plan.xml
index 03a2081..d5250f8 100644
--- a/xdocs/usermanual/build-monitor-test-plan.xml
+++ b/xdocs/usermanual/build-monitor-test-plan.xml
@@ -146,7 +146,7 @@ reach the maximum memory.</p>
 the right is dead/healthy. If the memory line spikes up and down rapidly, it could
 indicate memory thrashing. In those situations, it is a good idea to profile the
 application with Borland OptimizeIt or JProbe. What you want to see is a regular
-pattern for load, memory and threads. Any irratic behavior usually indicates poor
+pattern for load, memory and threads. Any erratic behavior usually indicates poor
 performance or a bug of some sort.</p>
 
 </section>
diff --git a/xdocs/usermanual/build-ws-test-plan.xml b/xdocs/usermanual/build-ws-test-plan.xml
index 30a48e9..dc6d281 100644
--- a/xdocs/usermanual/build-ws-test-plan.xml
+++ b/xdocs/usermanual/build-ws-test-plan.xml
@@ -159,7 +159,7 @@ test, the box should be checked. When "Read Soap Responses" is unchecked,
 no result will be displayed in view result tree or view results in table.</p>
 
 <p>An important note on the sampler. It will automatically use the proxy host
-and port passed to JMeter from command line, if thoe fields in the sampler are
+and port passed to JMeter from command line, if those fields in the sampler are
 left blank. If a sampler has values in the proxy host and port text field, it
 will use the ones provided by the user. If no host or port are provided and
 JMeter wasn't started with command line options, the sampler will fail
diff --git a/xdocs/usermanual/component_reference.xml b/xdocs/usermanual/component_reference.xml
index 9f699c4..8f6fe32 100644
--- a/xdocs/usermanual/component_reference.xml
+++ b/xdocs/usermanual/component_reference.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!-- 
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-2005 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -80,6 +80,9 @@ JMeter assumes the FTP server is listening on the default port.</property>
         them.  This can save you time if you have a lot of HTTP requests or requests with many
         parameters.</p>
 
+        <p>There are two versions of the sampler
+         - one uses the default Java HTTP implementation, the other uses Commons HttpClient</p>
+         
         <p>If the request requires a login authorization, you will also have to add an
         <complink name="HTTP Authorization Manager"/>
         Configuration Element. And, if the request uses cookies, then you will also need an
@@ -469,7 +472,7 @@ XML.</p>
 
 </component>
 
-<component name="Access Log Sampler" index="&sect-num;.1.8" screenshot="">
+<component name="Access Log Sampler" index="&sect-num;.1.8" screenshot="accesslogsampler.png">
 <center><h2>(Alpha Code)</h2></center>
 <description><p>AccessLogSampler was designed to read access logs and generate http requests.
 For those not familiar with the access log, it is the log the webserver maintains of every
@@ -522,7 +525,7 @@ StandardGenerator and TCLogParser.
 
 </component>
 
-<component name="BeanShell Sampler" index="&sect-num;.1.9" screenshot="">
+<component name="BeanShell Sampler" index="&sect-num;.1.9" screenshot="beanshellsampler.png">
 	<description><p>This sampler allows you to write a sampler using the BeanShell scripting language.		
 </p><p>
 		<b>Please note that the BeanShell jar file is not included with JMeter; it needs to be separately downloaded.
@@ -589,7 +592,7 @@ return "Data from sample with Label "+Label;
 </component>
 
 
-<component name="BSF Sampler" index="&sect-num;.1.10" screenshot="">
+<component name="BSF Sampler" index="&sect-num;.1.10" screenshot="bsfsampler.png">
 <note>This is Alpha code</note>
 	<description><p>This sampler allows you to write a sampler using a BSF scripting language.<br></br>
 		
@@ -608,14 +611,21 @@ return "Data from sample with Label "+Label;
 TBC
 </component>
 
-<component name="TCP Sampler" index="&sect-num;.1.11" screenshot="">
+<component name="TCP Sampler" index="&sect-num;.1.11" screenshot="tcpsampler.png">
 <note>ALPHA CODE</note>
 	<description>
 		<p>
 		The TCP Sampler opens a TCP/IP connection to the specified server.
 		It then sends the text, and waits for a response.
-		Once established, the same connection is re-used by the Sampler that created it.
-		Connections are not shared between Samplers, even in the same thread.
+		<br></br>
+		Connections are shared between Samplers in the same thread, provided that the exact
+		same host name string and port are used.
+		To force a different socket to be used, change the hostname by changing the case
+		of one of the letters, e.g. www.apache.org and wWw.apache.org will use different
+		sockets.
+		<br></br>
+		If an error is detected, the socket is closed. 
+		Another socket will be reopened on the next sample.
 		<br></br>
 		The following properties can be used to control its operation:
 		</p>
@@ -661,7 +671,7 @@ TBC
 </properties>
 </component>
 
-<component name="JMS Publisher" index="&sect-num;.1.12" screenshot="">
+<component name="JMS Publisher" index="&sect-num;.1.12" screenshot="jmspublisher.png">
 <note>ALPHA CODE</note>
 	<description>
 		<p>
@@ -670,6 +680,7 @@ TBC
 		numerous JMS servers on the market and several open source options.
 		</p>
 		<br></br>
+<note>JMeter does not include the JMS jar; this must be downloaded and put in the lib directory</note>
 	</description>
 <properties>
   <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
@@ -686,7 +697,7 @@ TBC
 </properties>
 </component>
 
-<component name="JMS Subscriber" index="&sect-num;.1.13" screenshot="">
+<component name="JMS Subscriber" index="&sect-num;.1.13" screenshot="jmssubscriber.png">
 <note>ALPHA CODE</note>
 	<description>
 		<p>
@@ -695,6 +706,7 @@ TBC
 		numerous JMS servers on the market and several open source options.
 		</p>
 		<br></br>
+<note>JMeter does not include the JMS jar; this must be downloaded and put in the lib directory</note>
 	</description>
 <properties>
   <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
@@ -719,6 +731,7 @@ TBC
         It is different from pub/sub messages and is generally used for handling transactions.
 		</p>
 		<br></br>
+<note>JMeter does not include the JMS jar; this must be downloaded and put in the lib directory</note>
 	</description>
 <properties>
   <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
@@ -766,10 +779,74 @@ TBC
 </component>
 
 <component name="Test Action" index="&sect-num;.1.15" screenshot="test_action.png">
-<description>TBA
+<description>
+The Test Action sampler is a sampler that is intended for use in a conditional controller.
+Rather than generate a sample, the test element pauses or stops the selected target.
+</description>
+<properties>
+  <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
+  <property name="Target" required="Yes">Current Thread / All Threads</property>
+  <property name="Action" required="Yes">Pause / Stop</property>
+  <property name="Duration" required="Yes">How long to pause for (milliseconds)</property>
+</properties>
+</component>
+
+<component name="JUnit Sampler" index="&sect-num;.1.16" screenshot="junit_sampler.png">
+<description>
+The current implementation supports standard Junit convention and extensions. It also
+includes extensions like oneTimeSetUp and oneTimeTea Down. The sampler works like the
+JavaSampler with some differences.
+1. rather than use Jmeter's test interface, it scans the jar files for classes extending junit's TestCase class. That includes any class or subclass.
+2. Junit test jar files should be placed in jmeter/lib/junit instead of /lib directory.
+3. Junit sampler does not use name/value pairs for configuration like the JavaSampler. The sampler assumes setUp and tearDown will configure the test correctly.
+4. The sampler measures the elapsed time only for the test method and does not include setUp and tearDown.
+5. Each time the test method is called, Jmeter will pass the result to the listeners.
+6. Support for oneTimeSetUp and oneTimeTearDown is done as a method. Since Jmeter is multi-threaded, we cannot call oneTimeSetUp/oneTimeTearDown the same way Maven does it.
+7. The sampler reports unexpected exceptions as errors.
+There are some important differences between standard JUnit test runners and JMeter's
+implementation. Rather than make a new instance of the class for each test, JMeter
+creates 1 instance per sampler and reuses it.&lt;br>
+The current implementation of the sampler will try to create an instance using the string constructor first. If the test class does not declare a string constructor, the sampler will look for an empty constructor. Example below:&lt;br>
+&lt;br>
+Empty Constructor:&lt;br>
+public class myTestCase {&lt;br>
+  public myTestCase() {}&lt;br>
+}&lt;br>
+&lt;br>
+String Constructor:&lt;br>
+public class myTestCase {&lt;br>
+  public myTestCase(String text) {&lt;br>
+    super(text);&lt;br>
+  }&lt;br>
+}&lt;br>
+By default, Jmeter will provide some default values for the success/failure code and message. Users should define a set of unique success and failure codes and use them uniformly across all tests.&lt;br>
+General Guidelines&lt;br>
+&lt;br>
+Here are some general guidelines for writing Junit tests so they work well with Jmeter. Since Jmeter runs multi-threaded, it is important to keep certain things in mind.&lt;br>
+&lt;br>
+1. Write the setUp and tearDown methods so they are thread safe. This generally means avoid using static memebers.&lt;br>
+2. Make the test methods discrete units of work and not long sequences of actions. By keeping the test method to a descrete operation, it makes it easier to combine test methods to create new test plans.&lt;br>
+3. Avoid making test methods depend on each other. Since Jmeter allows arbitrary sequencing of test methods, the runtime behavior is different than the default Junit behavior.&lt;br>
+4. If a test method is configurable, be careful about where the properties are stored. Reading the properties from the Jar file is recommended.&lt;br>
+5. Each sampler creates an instance of the test class, so write your test so the setup happens in oneTimeSetUp and oneTimeTearDown.
 </description>
 <properties>
   <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
+  <property name="Package filter" required="">Comma separated list of packages to show. Example, org.apache.jmeter,junit.framework.</property>
+  <property name="Class name" required="">Fully qualified name of the JUnit test class.</property>
+  <property name="Constructor string" required="">String pass to the string constructor. If a string is set, the sampler will use the
+   string constructor instead of the empty constructor.</property>
+  <property name="Test method" required="">The method to test.</property>
+  <property name="Success message" required="">A descriptive message indicating what success means.</property>
+  <property name="Success code" required="">An unique code indicating the test was successful.</property>
+  <property name="Failure message" required="">A descriptive message indicating what failure means.</property>
+  <property name="Failure code" required="">An unique code indicating the test failed.</property>
+  <property name="Error message" required="">A description for errors.</property>
+  <property name="Error code" required="">Some code for errors. Does not need to be unique.</property>
+  <property name="Do not call setUp and tearDown" required="">Set the sampler not to call setUp and tearDown.
+   By default, setUp and tearDown should be called. Not calling those methods could affect the test and make it inaccurate.
+    This option should only be used with calling oneTimeSetUp and oneTimeTearDown. If the selected method is oneTimeSetUp or oneTimeTearDown,
+     this option should be checked.</property>
 </properties>
 </component>
 
@@ -1005,7 +1082,7 @@ setting is reset when a parent Loop Controller restarts.
 </properties>
 
 </component>
-<component name="If Controller" index="&sect-num;.2.9" screenshot="">
+<component name="If Controller" index="&sect-num;.2.9" screenshot="ifcontroller.png">
 	<description>
 		<p>The If Controller allows the user to control whether the test elements below it (its children) are run or not.</p>
 	</description>
@@ -1022,7 +1099,7 @@ setting is reset when a parent Loop Controller restarts.
 	</p>
 </component>
 
-<component name="Random Order Controller" index="&sect-num;.2.10" screenshot="">
+<component name="Random Order Controller" index="&sect-num;.2.10" screenshot="randomordercontroller.png">
 	<description>
 		<p>The Random Order Controller is much like a Simple Controller in that it will execute each child
 		 element at most once, but the order of execution of the nodes will be random.</p>
@@ -1104,7 +1181,7 @@ which clearly won't match. Thus the For 2 Sampler will not be run.
 </example>
 </component>
 
-<component name="Transaction Controller" index="&sect-num;.2.12" screenshot="">
+<component name="Transaction Controller" index="&sect-num;.2.12" screenshot="transactioncontroller.png">
 	<description>
 		<p>The Transaction Controller times how long it takes for all its children to run.
 			It then adds a "sample" entry to the test output with the total elapsed time.
@@ -1116,7 +1193,7 @@ which clearly won't match. Thus the For 2 Sampler will not be run.
 </properties>
 </component>
 
-<component name="Runtime Controller" index="&sect-num;.2.12" screenshot="">
+<component name="Runtime Controller" index="&sect-num;.2.12" screenshot="runtimecontroller.png">
 	<description>
 		<p>The Runtime Controller controls how long its children are allowed to run.
 		</p>
@@ -1126,7 +1203,7 @@ which clearly won't match. Thus the For 2 Sampler will not be run.
 	<property name="Runtime (seconds)" required="Yes">Desired runtime in seconds</property>
 </properties>
 </component>
-<component name="While Controller" index="15.2.13" screenshot="">
+<component name="While Controller" index="15.2.13" screenshot="whilecontroller.png">
 	<description>
 <p>
 The While Controller runs its children until the condition is "false".
@@ -1158,7 +1235,7 @@ For example:
 </properties>
 </component>
 
-<component name="Switch Controller" index="&sect-num;.2.14" screenshot="">
+<component name="Switch Controller" index="&sect-num;.2.14" screenshot="switchcontroller.png">
 	<description>
 <p>
 The Switch Controller acts like the <complink name="Interleave Controller"/> 
@@ -1174,6 +1251,19 @@ which therefore acts as the default.</p>
 </properties>
 </component>
 
+<component name="Include Controller" index="&sect-num;.2.15" screenshot="includecontroller.png">
+	<description>
+<p>
+The include controller is designed to use an external jmx file. To use it, add
+samples to a simple controller, then save the simple controller as a jmx file.
+The file can then be used in a test plan.
+</p>
+</description>
+<properties>
+	<property name="Filename" required="Yes">The file to include.</property>
+</properties>
+</component>
+
 </section>
 
 <section name="&sect-num;.3 Listeners" anchor="listeners">
@@ -1294,7 +1384,7 @@ failed responses from the server.</p></description>
 </properties>
 </component>
 
-<component index="&sect-num;.3.2" name="Graph Full Results" screenshot="">
+<component index="&sect-num;.3.2" name="Graph Full Results" screenshot="graphfullresults.png">
 <description>No Description</description>
 </component>
 
@@ -1370,7 +1460,7 @@ this visualizer uses a lot of memory. The last column shows the number of bytes
 response from the server.</description>
 </component>
 
-<component index="&sect-num;.3.9" name="Simple Data Writer" screenshot="">
+<component index="&sect-num;.3.9" name="Simple Data Writer" screenshot="simpledatawriter.png">
 <description>This listener can record results to a file
 but not to the UI.  It is meant to provide an efficient means of
 recording data by eliminating GUI overhead.</description>
@@ -1417,6 +1507,12 @@ know for sure is to use a profiling tool.</p>
 </description>
 </component>
 
+<component index="&sect-num;.3.12" name="Aggregate Graph" screenshot="aggregate_graph.png">
+<description>The aggregate graph is similar to the aggregate report. The primary
+difference is the aggregate graph provides an easy way to generate bar graphs and save
+the graph as a PNG file. By default, the aggregate graph will generate a bar chart
+450 x 250 pixels.</description>
+</component>
 
 </section>
 
@@ -1798,10 +1894,12 @@ The variables in User Defined Variables components will take precedence over tho
 </properties>
 </component>
 
-<component index="&sect-num;.4.15" name="TCP Sampler Config" screenshot="">
+<component index="&sect-num;.4.15" name="TCP Sampler Config" screenshot="tcpsamplerconfig.png">
 	<note>ALPHA CODE</note>
 <description>
+        <p>
 	The TCP Sampler Config provides default data for the TCP Sampler
+	</p>
 </description>
 <properties>
   <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
@@ -1813,11 +1911,14 @@ The variables in User Defined Variables components will take precedence over tho
 </properties>
 </component>
 
-<component index="&sect-num;.4.16" name="CSV Data Set Config" screenshot="">
+<component index="&sect-num;.4.16" name="CSV Data Set Config" screenshot="csvdatasetconfig.png">
 <description>
+        <p>
 	CSV DataSet Config is used to read lines from a file, and split them into variables.
+	It is easier to use than the __CSVRead() and _StringFromFile() functions.
+	</p>
 	<p>
-	As a special case, the string "\\t" (without quotes) is treated as a Tab.
+	As a special case, the string "\t" (without quotes) is treated as a Tab.
 	</p>
 </description>
 <properties>
@@ -1854,7 +1955,12 @@ The variables in User Defined Variables components will take precedence over tho
 
 <description><p>The response assertion control panel lets you add pattern strings to be compared against various
 	fields of the response.
-	The pattern strings are Perl5-style regular expressions. You can also choose whether the strings will be expected
+	The pattern strings are Perl5-style regular expressions. 
+	</p>
+	<p>
+	A summary of the pattern matching characters can be found at <a href="http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/package-summary.html">http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/package-summary.html</a>
+	</p>
+	<p>You can also choose whether the strings will be expected
 to <b>match</b> the entire response, or if the response is only expected to <b>contain</b> the
 pattern. You can attach multiple assertions to any controller for additional flexibility.</p>
 <p>Note that the pattern string should not include the enclosing delimiters, 
@@ -2309,7 +2415,9 @@ To add a new value to the series, click the 'Add User' button and fill in the de
 <description><p>Allows the user to create a counter that can be referenced anywhere
 in the Thread Group.  The counter config lets the user configure a starting point, a maximum,
 and the increment.  The counter will loop from the start to the max, and then start over
-with the start, continuing on like that until the test is ended.  </p></description>
+with the start, continuing on like that until the test is ended.  </p>
+<p>The counter uses an int to store the value, so the range is from -2^^31 to 2^^31-1, i.e. -2147483648 to 2147483647.</p>
+</description>
 <properties>
         <property name="Name" required="">Descriptive name for this element that is shown in the tree.</property>
         <property name="Start" required="Yes">The starting number for the counter.  The counter will equal this
@@ -2399,7 +2507,7 @@ Generates a summary of the test run so far to the log file and/or
 standard output. Both running and differential totals are shown.
 Output is generated every n seconds (default 3 minutes) on the appropriate
 time boundary, so that multiple test runs on the same time will be
- synchronised.
+ synchronised.The interval is defined by the property "summariser.interval" - see jmeter.properties.
 
 This is mainly intended for batch (non-GUI) runs.
 	</description>
@@ -2415,7 +2523,9 @@ This is mainly intended for batch (non-GUI) runs.
 		<br></br>
 </description>
 <component index="&sect-num;.9.1" name="Test Plan" screenshot="testplan.png">
-<description><p>At the Test Plan level, static variables can be defined that allow users to abstract values that are repeated throughout their tests, such as server names.  Here, one can instruct JMeter to save the maximum sample information to file by selecting "functional testing".  Also, an option exists here to instruct JMeter to run the <complink name="Thread Group"/> serially rather than in parallel.</p></description>
+<description><p>At the Test Plan level, static variables can be defined that allow users to abstract values that are repeated throughout their tests, such as server names.  Here, one can instruct JMeter to save the maximum sample information to file by selecting "functional testing".  Also, an option exists here to instruct JMeter to run the <complink name="Thread Group"/> serially rather than in parallel.</p>
+<p>Test plan now provides an easy way to add classpath setting to a specific test plan. The feature is additive, meaning that you can add jar files or directories, but removing an entry requires restarting JMeter. In the past, users had to copy all the jar files to jmeter/lib/ directory. Now that is not necessary. JMeter properties also provides an entry for loading additional classpaths.</p>
+<p>In jmeter.properties, edit "user.classpath" to include additional libraries. Note that paths with spaces may cause problems for Java.</p></description>
 </component>
 
 <component index="&sect-num;.9.2" name="Thread Group" screenshot="threadgroup.png">
diff --git a/xdocs/usermanual/functions.xml b/xdocs/usermanual/functions.xml
index edaa864..13c20cb 100644
--- a/xdocs/usermanual/functions.xml
+++ b/xdocs/usermanual/functions.xml
@@ -213,6 +213,12 @@ is indistinguishable from thread #1 in another threadgroup, from the point of vi
 	For example when testing a banking application, 100s or 1000s of different account numbers might be required.
 	</p>
 	<p>
+	See also the 
+	<a href="component_reference.html#CSV_Data_Set_Config">CSV Data Set Config test element</a> 
+	which may be easier to use. However, that does not currently support multiple input files.
+	</p>
+
+	<p>
 	Each time it is called it reads the next line from the file.
 	When the end of the file is reached, it will start reading again from the beginning,
 	unless the maximum loop count has been reached.
@@ -246,21 +252,22 @@ A reference name - refName - for reusing the value created by this function. Sto
 	<p>
 <code>
 # - insert the number, with no leading zeros or spaces<br/>
-000 - insert the number packed out to 3 digits with leading zeros if necessary<br/>
+000 - insert the number packed out to 3 digits with leading zeros if necessary
 <p/>
 Examples:<br/>
- pin#.dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat<br/>
- pin000.dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat<br/>
- pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999<br/>
- N.B: pin.dat# -> pin1.0dat, ... pin9.0dat ... pin999.0dat<br/>
+ pin#'.'dat -> pin1.dat, ... pin9.dat, pin10.dat, ... pin9999.dat<br/>
+ pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat<br/>
+ pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999
 </code><p/>
 	If more digits are required than there are formatting characters, the number will be
 	expanded as necessary.<br/>
-	To prevent a formatting character from being interpreted,
-	enclose it in single quotes. Note that the decimal point is a formatting character,
-	and must be enclosed in single quotes (though it works as expected for #. and 000.)
-	N.B. the decimal point varies between locales, but in the UK and US, at least, it is
-	the same character as is used to separate parts of file names.<br/>
+	<b>To prevent a formatting character from being interpreted,
+	enclose it in single quotes. Note that "." is a formatting character,
+	and must be enclosed in single quotes</b>
+	(though #. and 000. work as expected in locales where the decimal point is also ".")
+	<br/>
+	In other locales (e.g. fr), the decimal point is "," - which means that "#."
+	becomes "nnn,".<br/>
 	See the documentation for DecimalFormat for full details.<br/>
 	If the path name does not contain any special formatting characters,
 	the current sequence number will be appended to the name, otherwise
@@ -269,10 +276,12 @@ Examples:<br/>
 	the sequence number is interpreted as a loop count, and the file will be used at most "end" times.
 	In this case the filename is not formatted.
 	<code>
-	
-	${_StringFromFile(PIN#.DAT,,1,2)} - reads PIN1.DAT, PIN2.DAT
-	${_StringFromFile(PIN.DAT,,,2)} - reads PIN.DAT twice
+	<br/>
+	${_StringFromFile(PIN#'.'DAT,,1,2)} - reads PIN1.DAT, PIN2.DAT<br/>
+	${_StringFromFile(PIN.DAT,,,2)} - reads PIN.DAT twice<br/>
 	</code>
+	Note that the "." in PIN.DAT above should <u>not</u> be quoted.
+	In this case the start number is omitted, so the file name is used exactly as is.
 	</p>
 </component>
 
@@ -297,11 +306,13 @@ Examples:<br/>
         			- a random number between 0 and the variable maxRandom</li>
         		<li>${minRandom}+Math.floor(Math.random()*(${maxRandom}-${minRandom}+1))
         			- a random number between the variables minRandom and maxRandom</li>
+        		<li>"${VAR}"=="abcd"</li>
         	</ul>
         	</property>
-        <property name="Name of function" required="Yes">A reference name for reusing the value
+        <property name="Name of function" required="No">A reference name for reusing the value
                 computed by this function.</property>
 </properties>
+<note>Remember to include any necessary quotes for text strings and JMeter variables</note>
 </component>
 
 <component index="19.5.8" name="__Random">
@@ -320,6 +331,9 @@ Examples:<br/>
 	<p>NOTE: versions up to 1.9.1 only supported a single file. 
 		JMeter versions since 1.9.1 support multiple file names.
 	</p>
+	<p><b>In most cases, the newer 
+	<a href="component_reference.html#CSV_Data_Set_Config">CSV Data Set Config element</a>
+	 is easier to use.</b></p>
 	<p>
 	When a filename is first encountered, the file is opened and read into an internal
 	array. If a blank line is detected, this is treated as end of file - this allows
@@ -450,6 +464,11 @@ the second would return 1 and the last would return www.dummy.org
 	The BeanShell function evaluates the script passed to it, and returns the result.
 </p>
 <p>
+<b>Please note that the BeanShell jar file is not included with JMeter; it needs to be separately downloaded.
+<br/>
+For full details on using BeanShell, please see the BeanShell web-site at http://www.beanshell.org/.</b>
+</p>
+<p>
 Note that a different Interpreter is used for each independent occurence of the function
 in a test script, but the same Interpreter is used for subsequent invocations.
 This means that variables persist across calls to the function.
@@ -491,6 +510,7 @@ ${__BeanShell(123*456)} - returns 56088
 ${__BeanShell(source("function.bsh"))} - processes the script in function.bsh
 </pre>
 </p>
+<note>Remember to include any necessary quotes for text strings and JMeter variables</note>
 </component>
 
 <component index="19.5.14" name="__split">
diff --git a/xdocs/usermanual/get-started.xml b/xdocs/usermanual/get-started.xml
index 758b4b2..49b5b77 100644
--- a/xdocs/usermanual/get-started.xml
+++ b/xdocs/usermanual/get-started.xml
@@ -26,9 +26,20 @@
 <section name="2. Getting Started" anchor="get_started">
 <p>The easiest way to begin using JMeter is to first
 <a href="http://jakarta.apache.org/builds/jakarta-jmeter/release/">download the latest production release</a> and install it.
-The release contains all of the files you need to build and run Web, FTP, JDBC, and JNDI tests.  If you want to perform JDBC testing,
+The release contains all of the files you need to build and run Web, FTP, JDBC, and JNDI tests.</p>
+<p>If you want to perform JDBC testing,
 then you will, of course, need the appropriate JDBC driver from your vendor.  JMeter does not come with
 any JDBC drivers.</p>
+<p>
+Other software that you may want to download:
+<ul>
+<li><a href="http://www.beanshell.org/">BeanShell</a></li>
+<li><a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">Java Activation Framework</a> - needed for JavaMail</li>
+<li><a href="http://java.sun.com/products/javamail/index.jsp">Java Mail</a> - needed for mail visualiser and SOAP tests</li>
+<li><a href="http://java.sun.com/products/jms/docs.html">JMS</a> - for JMS samplers</li>
+<li><a href="http://java.sun.com/downloads/">General Java download page</a></li>
+</ul>
+</p>
 <p>Next, start JMeter and go through the <a href="build-test-plan.html">Building a Test Plan</a> section
 of the User Guide to familiarize yourself with JMeter basics (for example, adding and removing elements).</p>
 <p>Finally, go through the appropriate section on how to build a specific type of Test Plan.
diff --git a/xdocs/usermanual/jmeter_distributed_testing_step_by_step.sxw b/xdocs/usermanual/jmeter_distributed_testing_step_by_step.sxw
index 40a3840..755c61c 100644
Binary files a/xdocs/usermanual/jmeter_distributed_testing_step_by_step.sxw and b/xdocs/usermanual/jmeter_distributed_testing_step_by_step.sxw differ
diff --git a/xdocs/usermanual/junitsampler_tutorial.sxw b/xdocs/usermanual/junitsampler_tutorial.sxw
new file mode 100644
index 0000000..a1dc0a7
Binary files /dev/null and b/xdocs/usermanual/junitsampler_tutorial.sxw differ


[jmeter] 02/02: JMeter TLP move

Posted by vl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to annotated tag v2_1_1
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit 63fd729433c2fd806473242c3c6e0d4d1f34c981
Author: Sebastian Bazley <se...@apache.org>
AuthorDate: Tue Nov 1 21:24:22 2011 +0000

    JMeter TLP move
    
    git-svn-id: https://svn.apache.org/repos/asf/jmeter/tags/v2_1_1@1196284 13f79535-47bb-0310-9956-ffa450edef68
    
    Former-commit-id: f0a9da7f0597e9ce30dad90b502354585e9fbedc