Index: src/PHPT/Case.php
===================================================================
--- src/PHPT/Case.php	(revision 691)
+++ src/PHPT/Case.php	(working copy)
@@ -28,17 +28,14 @@
     {
         $reporter->onCaseStart($this);
         try {
-            if ($this->sections->filterByInterface('RunnableBefore')->valid()) {
-                foreach ($this->sections as $section) {
-                    $section->run($this);
-                }
+            $runnable_before = $this->sections->filterByInterface('RunnableBefore');
+            foreach ($runnable_before as $section) {
+                $section->run($this);
             }
-            $this->sections->filterByInterface();
             $this->sections->FILE->run($this);
-            if ($this->sections->filterByInterface('RunnableAfter')->valid()) {
-                foreach ($this->sections as $section) {
-                    $section->run($this);
-                }
+            $runnable_after = $this->sections->filterByInterface('RunnableAfter');
+            foreach ($runnable_after as $section) {
+                $section->run($this);
             }
             $reporter->onCasePass($this);
         } catch (PHPT_Case_VetoException $veto) {
@@ -46,7 +43,6 @@
         } catch (PHPT_Case_FailureException $failure) {
             $reporter->onCaseFail($this, $failure);
         }
-        $this->sections->filterByInterface();
         $reporter->onCaseEnd($this);
     }
     
Index: src/PHPT/Case/Validator/CgiRequired.php
===================================================================
--- src/PHPT/Case/Validator/CgiRequired.php	(revision 691)
+++ src/PHPT/Case/Validator/CgiRequired.php	(working copy)
@@ -17,7 +17,6 @@
     public function is(PHPT_Case $case)
     {
         $return = $case->sections->filterByInterface('CgiExecutable')->valid();
-        $case->sections->filterByInterface();
         return $return;
     }
 }
Index: src/PHPT/CodeRunner/CommandLine.php
===================================================================
--- src/PHPT/CodeRunner/CommandLine.php	(revision 691)
+++ src/PHPT/CodeRunner/CommandLine.php	(working copy)
@@ -13,7 +13,7 @@
         $this->_filename = $runner->filename;
         $this->_ini = (string)$runner->ini;
         $this->_args = (string)$runner->args;
-        $this->_executable = str_replace(' ', '\ ', (string)$runner->executable);
+        $this->_executable = $runner->executable;
         $this->_post_filename = (string)$runner->post_filename;
     }
     
Index: src/PHPT/CodeRunner/Driver/WScriptShell.php
===================================================================
--- src/PHPT/CodeRunner/Driver/WScriptShell.php	(revision 691)
+++ src/PHPT/CodeRunner/Driver/WScriptShell.php	(working copy)
@@ -23,9 +23,9 @@
             }
         }
         if ($found == false) {
-            throw new PHPT_CodeRunner_InvalidExecutableException(
-                'unable to locate PHP executable: ' . $this->executable
-            );
+            //throw new PHPT_CodeRunner_InvalidExecutableException(
+            //    'unable to locate PHP executable: ' . $this->executable
+            //);
         }
     }
 
@@ -69,7 +69,7 @@
 
         $error = $this->_process->StdErr->ReadAll();
         if (!empty($error)) {
-            throw new PHPT_CodeRunner_ExecutionException($error);
+            throw new PHPT_CodeRunner_ExecutionException($error, $this->_commandFactory());
         }
 
         return $this->_process->StdOut->ReadAll();
@@ -93,6 +93,7 @@
     {
         $return = '';
         foreach ($this->environment as $key => $value) {
+            $value = str_replace('&', '^&', $value);
             $return .= "set {$key}={$value} & ";
         }
         return $return;
Index: src/PHPT/CodeRunner/Factory.php
===================================================================
--- src/PHPT/CodeRunner/Factory.php	(revision 691)
+++ src/PHPT/CodeRunner/Factory.php	(working copy)
@@ -33,7 +33,13 @@
                 'php-cgi';
         }
 
-        if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
+        if (
+            strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' &&
+            (
+                $runner->executable == 'php' ||
+                $runner->executable == 'php-cgi'
+            )
+        ) {
             $runner->executable = $runner->executable . '.exe';
         }
         try {
Index: src/PHPT/Section/ModifiableAbstract.php
===================================================================
--- src/PHPT/Section/ModifiableAbstract.php	(revision 691)
+++ src/PHPT/Section/ModifiableAbstract.php	(working copy)
@@ -15,12 +15,10 @@
     
     public function run(PHPT_Case $case)
     {
-        $sections = clone $case->sections;
-        if ($sections->filterByInterface($this->_modifier_name . 'Modifier')->valid()) {
-            $modifyMethod = 'modify' . $this->_modifier_name;
-            foreach ($sections as $section) {
-                $section->$modifyMethod($this);
-            }
+        $modifiers = $case->sections->filterByInterface($this->_modifier_name . 'Modifier');
+        $modifyMethod = 'modify' . $this->_modifier_name;
+        foreach ($modifiers as $section) {
+            $section->$modifyMethod($this);
         }
     }
     
Index: src/PHPT/Section/SKIPIF.php
===================================================================
--- src/PHPT/Section/SKIPIF.php	(revision 691)
+++ src/PHPT/Section/SKIPIF.php	(working copy)
@@ -3,10 +3,12 @@
 class PHPT_Section_SKIPIF implements PHPT_Section_RunnableBefore
 {
     private $_data = null;
+    private $_runner_factory = null;
     
     public function __construct($data)
     {
         $this->_data = $data;
+        $this->_runner_factory = new PHPT_CodeRunner_Factory();
     }
     
     public function run(PHPT_Case $case)
@@ -16,9 +18,7 @@
         
         // @todo refactor to PHPT_CodeRunner
         file_put_contents($filename, $this->_data);
-        $response = array();
-        exec('php -f ' . $filename, $response);
-        $response = implode("\n", $response);
+        $response = $this->_runner_factory->factory($case)->run($filename)->output;
         unlink($filename);
         
         if (preg_match('/^skip( - (.*))?/', $response, $matches)) {
Index: src/PHPT/SectionList.php
===================================================================
--- src/PHPT/SectionList.php	(revision 691)
+++ src/PHPT/SectionList.php	(working copy)
@@ -2,7 +2,6 @@
 
 class PHPT_SectionList implements Iterator
 {
-    private $_raw_sections = array();
     private $_sections = array();
     private $_section_map = array();
     private $_key_map = array();
@@ -15,14 +14,12 @@
             }
             $name = strtoupper(str_replace('PHPT_Section_', '', get_class($section)));
             $key = $section instanceof PHPT_Section_Runnable ? $section->getPriority() . '.' . $name : $name;
-            $this->_raw_sections[$key] = $section;
+            $this->_sections[$key] = $section;
             $this->_section_map[$name] = $key;
             $this->_key_map[$key] = $name;
         }
         
-        ksort($this->_raw_sections);
-        
-        $this->_sections = $this->_raw_sections;
+        ksort($this->_sections);
     }
     
     public function current()
@@ -52,21 +49,23 @@
     
     public function filterByInterface($interface = null)
     {
+        $ret = new PHPT_SectionList();
+        
         if (is_null($interface)) {
-            $this->_sections = $this->_raw_sections;
-            return $this;
+            $ret->_sections = $this->_sections;
+            return $ret;
         }
         
         $full_interface = 'PHPT_Section_' . $interface;
-        $this->_sections = array();
-        foreach ($this->_raw_sections as $name => $section) {
+        $ret->_sections = array();
+        foreach ($this->_sections as $name => $section) {
             if (!$section instanceof $full_interface) {
                 continue;
             }
-            $this->_sections[$name] = $section;
+            $ret->_sections[$name] = $section;
         }
         
-        return $this;
+        return $ret;
     }
     
     public function has($name)
@@ -74,11 +73,11 @@
         if (!isset($this->_section_map[$name])) {
             return false;
         }
-        return isset($this->_raw_sections[$this->_section_map[$name]]);
+        return isset($this->_sections[$this->_section_map[$name]]);
     }
     
     public function __get($key)
     {
-        return $this->_raw_sections[$this->_section_map[$key]];
+        return $this->_sections[$this->_section_map[$key]];
     }
 }
Index: tests/CodeRunner/Driver/WScriptShell/injects-ini-settings.phpt
===================================================================
--- tests/CodeRunner/Driver/WScriptShell/injects-ini-settings.phpt	(revision 691)
+++ tests/CodeRunner/Driver/WScriptShell/injects-ini-settings.phpt	(working copy)
@@ -17,9 +17,9 @@
 
 // sanity check
 $obj = new FoobarIni();
-assert('(string)$obj == " -d display_errors=1 "');
+assert('(string)$obj == " -d \"display_errors=1\" "');
 $obj->display_errors = 0;
-assert('(string)$obj == " -d display_errors=0 "');
+assert('(string)$obj == " -d \"display_errors=0\" "');
 unset($obj);
 
 
Index: tests/Section/File/restores-case-sections.phpt
===================================================================
--- tests/Section/File/restores-case-sections.phpt	(revision 691)
+++ tests/Section/File/restores-case-sections.phpt	(working copy)
@@ -1,24 +0,0 @@
---TEST--
-After PHPT_Section_FILE::run(), the sections property of the provide $case object
-is restored to its unfiltered state
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../../_setup.inc';
-require_once dirname(__FILE__) . '/../_simple-test-case.inc';
-require_once dirname(__FILE__) . '/_simple-file-modifier.inc';
-
-$case = new PHPT_SimpleTestCase();
-$case->sections = new PHPT_SectionList(array(
-    new PHPT_Section_ARGS('foo=bar'),
-));
-
-$section = new PHPT_Section_FILE('hello world');
-$section->run($case);
-
-assert('$case->sections->valid()');
-
-?>
-===DONE===
---EXPECT--
-===DONE===
Index: tests/SectionList/filter-by-interface.phpt
===================================================================
--- tests/SectionList/filter-by-interface.phpt	(revision 691)
+++ tests/SectionList/filter-by-interface.phpt	(working copy)
@@ -17,10 +17,10 @@
 
 $data = array_merge($runnable, $non_runnable);
 $list = new PHPT_SectionList($data);
-$list->filterByInterface('Runnable');
-assert('$list->valid()');
-$list->filterByInterface('EnvModifier');
-assert('$list->valid() == false');
+$runnable = $list->filterByInterface('Runnable');
+assert('$runnable->valid()');
+$env_modifier = $list->filterByInterface('EnvModifier');
+assert('$env_modifier->valid() == false');
 
 ?>
 ===DONE===
Index: tests/SectionList/filter-resets-with-null.phpt
===================================================================
--- tests/SectionList/filter-resets-with-null.phpt	(revision 691)
+++ tests/SectionList/filter-resets-with-null.phpt	(working copy)
@@ -1,36 +0,0 @@
---TEST--
-If you call filterByInterface() with null or no-value, the full dataset is restored
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../_setup.inc';
-
-$runnable = array(
-    'ENV' => new PHPT_Section_ENV(''),
-    'CLEAN' => new PHPT_Section_CLEAN(''),
-);
-
-class PHPT_Section_FOO implements PHPT_Section { }
-$non_runnable = array(
-    'FOO' => new PHPT_Section_FOO(), 
-);
-
-$data = array_merge($runnable, $non_runnable);
-$list = new PHPT_SectionList($data);
-$list->filterByInterface('Runnable');
-
-// sanity check
-foreach ($list as $key => $value) {
-    assert('$runnable[$key] == $value');
-}
-
-$list->filterByInterface();
-
-foreach ($list as $key => $value) {
-    assert('$data[$key] == $value');
-}
-
-?>
-===DONE===
---EXPECT--
-===DONE===
Index: tests/Util/Code/runAsFile-executes-in-file.phpt
===================================================================
--- tests/Util/Code/runAsFile-executes-in-file.phpt	(revision 691)
+++ tests/Util/Code/runAsFile-executes-in-file.phpt	(working copy)
@@ -10,7 +10,7 @@
 
 $util = new PHPT_Util_Code($code);
 
-$file = dirname(__FILE__) . '/foobar.php';
+$file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'foobar.php';
 $result = $util->runAsFile($file);
 
 assert('$result == $file');
Index: tests/Util/Code/runAsFile-returns-output-if-no-return.phpt
===================================================================
--- tests/Util/Code/runAsFile-returns-output-if-no-return.phpt	(revision 691)
+++ tests/Util/Code/runAsFile-returns-output-if-no-return.phpt	(working copy)
@@ -9,7 +9,7 @@
 
 $util = new PHPT_Util_Code($code);
 
-$file = dirname(__FILE__) . '/foobar.php';
+$file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'foobar.php';
 $result = $util->runAsFile($file);
 
 assert('$result == $file');