diff --git a/applications/test/speed/Make/files b/applications/test/speed/Make/files
deleted file mode 100644
index 84a6d2fa6202cc1e7fb7482bfc9e23dc718b406d..0000000000000000000000000000000000000000
--- a/applications/test/speed/Make/files
+++ /dev/null
@@ -1,3 +0,0 @@
-speedTest.C
-
-EXE = $(FOAM_USER_APPBIN)/speedTest
diff --git a/applications/test/speed/Make/options b/applications/test/speed/Make/options
deleted file mode 100644
index e68056198750cebb50fea02c6fffbf8db9220261..0000000000000000000000000000000000000000
--- a/applications/test/speed/Make/options
+++ /dev/null
@@ -1 +0,0 @@
-EXE_INC = /* -ffast-math -mtune=core2 */
diff --git a/applications/test/speed/scalarSpeedTest/Make/files b/applications/test/speed/scalarSpeedTest/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..dae64db89f8cb8366067016721994cf8b3d09b82
--- /dev/null
+++ b/applications/test/speed/scalarSpeedTest/Make/files
@@ -0,0 +1,3 @@
+scalarSpeedTest.C
+
+EXE = $(FOAM_USER_APPBIN)/scalarSpeedTest
diff --git a/applications/test/speed/scalarSpeedTest/Make/options b/applications/test/speed/scalarSpeedTest/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/applications/test/speed/scalarSpeedTest/scalarSpeedTest.C b/applications/test/speed/scalarSpeedTest/scalarSpeedTest.C
new file mode 100644
index 0000000000000000000000000000000000000000..e1858e2d42bf578d54a747c469019fedbd1a3bdd
--- /dev/null
+++ b/applications/test/speed/scalarSpeedTest/scalarSpeedTest.C
@@ -0,0 +1,192 @@
+#include "primitiveFields.H"
+#include "Random.H"
+#include "cpuTime.H"
+#include "IOstreams.H"
+#include "OFstream.H"
+
+using namespace Foam;
+
+int main()
+{
+    Info<< "Initialising fields" << endl;
+
+    const label nIter = 100;
+    const label size = 10000000;
+    const label rndAddrSkip = 40;
+    const label redFac = 6;
+    const label redSize = size/redFac;
+    Random genAddr(100);
+
+    double* f1 = new double[size];
+    double* f2 = new double[size];
+    double* f3 = new double[size];
+    double* f4 = new double[size];
+    double* fr = new double[redSize];
+    label*  addr = new label[size];
+    label*  redAddr = new label[size];
+    label*  redAddr2 = new label[size];
+
+    for (register label i=0; i<size; i++)
+    {
+        f1[i] = 1.0;
+        f2[i] = 1.0;
+        f3[i] = 1.0;
+        addr[i] = i;
+        redAddr[i] = i/redFac;
+        redAddr2[i] = (size - i - 1)/redFac;
+    }
+
+    for (register label i=0; i<size; i+=rndAddrSkip)
+    {
+        addr[i] = genAddr.integer(0, size-1);
+    }
+
+    for (register label i=0; i<redSize; i++)
+    {
+        fr[i] = 1.0;
+    }
+
+    Info<< "Done\n" <<endl;
+
+    {
+        Info<< "Single loop combined operation (expression templates)"
+            << endl;
+
+        cpuTime executionTime;
+
+        for (int j=0; j<nIter; j++)
+        {
+            for (register label i=0; i<size; i++)
+            {
+                f4[i] = f1[i] + f2[i] - f3[i];
+            }
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< f4[1] << endl << endl;
+    }
+
+    {
+        Info<< "Single loop combined operation with indirect addressing"
+            << endl;
+
+        cpuTime executionTime;
+
+        for (int j=0; j<nIter; j++)
+        {
+            for (register label i=0; i<size; i++)
+            {
+                f4[addr[i]] = f1[addr[i]] + f2[addr[i]] - f3[addr[i]];
+            }
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< f4[1] << endl << endl;
+    }
+
+    {
+        Info<< "Single loop reduction operation"
+            << endl;
+
+        cpuTime executionTime;
+        label redOffset = (size - 1)/redFac;
+
+        for (int j=0; j<nIter; j++)
+        {
+            for (register label i=0; i<size; i++)
+            {
+                label j = i/redFac;
+                fr[j] += f1[i];
+                fr[redOffset - j] -= f2[i];
+            }
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< fr[1] << endl << endl;
+    }
+
+    {
+        Info<< "Single loop reduction operation with indirect addressing"
+            << endl;
+
+        cpuTime executionTime;
+
+        for (int j=0; j<nIter; j++)
+        {
+            for (register label i=0; i<size; i++)
+            {
+                fr[redAddr[i]] += f1[i];
+                fr[redAddr2[i]] -= f2[i];
+            }
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< fr[1] << endl << endl;
+    }
+
+    {
+        Info<< "Separate loops ?= operations" << endl;
+
+        cpuTime executionTime;
+
+        for (int j=0; j<nIter; j++)
+        {
+            for (register label i=0; i<size; i++)
+            {
+                f4[i] = f1[i];
+            }
+            for (register label i=0; i<size; i++)
+            {
+                f4[i] += f2[i];
+            }
+            for (register label i=0; i<size; i++)
+            {
+                f4[i] -= f3[i];
+            }
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< f4[1] << endl << endl;
+    }
+
+    {
+        Info<< "OpenFOAM field algebra" << endl;
+
+        scalarField
+            sf1(size, 1.0),
+            sf2(size, 1.0),
+            sf3(size, 1.0),
+            sf4(size);
+
+        cpuTime executionTime;
+
+        for (int j=0; j<nIter; j++)
+        {
+            //sf4 = sf1 + sf2 - sf3;
+            sf4 = sf1;
+            sf4 += sf2;
+            sf4 -= sf3;
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< sf4[1] << endl << endl;
+    }
+}
diff --git a/applications/test/speed/speedTest.C b/applications/test/speed/speedTest.C
deleted file mode 100644
index 052514359190204cbf8d9cab1fab1470461f9f2d..0000000000000000000000000000000000000000
--- a/applications/test/speed/speedTest.C
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "primitiveFields.H"
-#include "cpuTime.H"
-#include "IOstreams.H"
-
-using namespace Foam;
-
-int main()
-{
-    const label nIter = 10;
-    const label size = 10000000;
-
-    double* f1 = new double[size];
-    double* f2 = new double[size];
-    double* f3 = new double[size];
-    double* f4 = new double[size];
-
-    for (register label i=0; i<size; i++)
-    {
-        f1[i] = 1.0;
-        f2[i] = 1.0;
-        f3[i] = 1.0;
-    }
-
-    cpuTime executionTime1;
-
-    for (int j=0; j<nIter; j++)
-    {
-        for (register label i=0; i<size; i++)
-        {
-            f4[i] = f1[i] + f2[i] - f3[i];
-        }
-    }
-
-    Info<< "ExecutionTime = "
-        << executionTime1.elapsedCpuTime()
-        << " s\n" << endl;
-
-    Info << f4[1] << endl << endl;
-
-
-    scalarField sf1(size, 1.0), sf2(size, 1.0), sf3(size, 1.0), sf4(size);
-
-    cpuTime executionTime2;
-
-    for (register int j=0; j<nIter; j++)
-    {
-        sf4 = sf1 + sf2 - sf3;
-        //sf4 = sf1;
-        //sf4 += sf2;
-        //sf4 -= sf3;
-    }
-
-    Info<< "ExecutionTime = "
-        << executionTime2.elapsedCpuTime()
-        << " s\n" << endl;
-
-    Info << sf4[1] << endl << endl;
-
-
-    vectorField 
-        vf1(size, vector::one),
-        vf2(size, vector::one),
-        vf3(size, vector::one),
-        vf4(size);
-
-    cpuTime executionTime3;
-
-    for (register int j=0; j<nIter; j++)
-    {
-        vf4 = vf1 + vf2 - vf3;
-    }
-
-    Info<< "ExecutionTime = "
-        << executionTime3.elapsedCpuTime()
-        << " s\n" << endl;
-
-    Info << vf4[1] << endl << endl;
-
-    cpuTime executionTime4;
-
-    scalarField sf11(size, 1.0), sf12(size, 1.0), sf13(size, 1.0), sf14(size);
-    scalarField sf21(size, 1.0), sf22(size, 1.0), sf23(size, 1.0), sf24(size);
-    scalarField sf31(size, 1.0), sf32(size, 1.0), sf33(size, 1.0), sf34(size);
-
-    for (register int j=0; j<nIter; j++)
-    {
-        sf14 = sf11 + sf12 - sf13;
-        sf24 = sf21 + sf22 - sf23;
-        sf34 = sf31 + sf32 - sf33;
-    }
-
-    Info<< "ExecutionTime = "
-        << executionTime4.elapsedCpuTime()
-        << " s\n" << endl;
-
-    Info << sf14[1] << sf24[1] << sf34[1] << endl << endl;
-
-
-}
diff --git a/applications/test/speed/vectorSpeedTest/Make/files b/applications/test/speed/vectorSpeedTest/Make/files
new file mode 100644
index 0000000000000000000000000000000000000000..ccb0187615ed49e981498b9ad532c2f7b7b55326
--- /dev/null
+++ b/applications/test/speed/vectorSpeedTest/Make/files
@@ -0,0 +1,3 @@
+vectorSpeedTest.C
+
+EXE = $(FOAM_USER_APPBIN)/vectorSpeedTest
diff --git a/applications/test/speed/vectorSpeedTest/Make/options b/applications/test/speed/vectorSpeedTest/Make/options
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/applications/test/speed/vectorSpeedTest/vectorSpeedTest.C b/applications/test/speed/vectorSpeedTest/vectorSpeedTest.C
new file mode 100644
index 0000000000000000000000000000000000000000..da802bab20e7c39767f97318d484536f127f5a40
--- /dev/null
+++ b/applications/test/speed/vectorSpeedTest/vectorSpeedTest.C
@@ -0,0 +1,39 @@
+#include "primitiveFields.H"
+#include "cpuTime.H"
+#include "IOstreams.H"
+#include "OFstream.H"
+
+using namespace Foam;
+
+int main()
+{
+    const label nIter = 100;
+    const label size = 1000000;
+
+    Info<< "Initialising fields" << endl;
+
+    vectorField
+        vf1(size, vector::one),
+        vf2(size, vector::one),
+        vf3(size, vector::one),
+        vf4(size);
+
+    Info<< "Done\n" << endl;
+
+    {
+        cpuTime executionTime;
+
+        Info<< "vectorField algebra" << endl;
+
+        for (register int j=0; j<nIter; j++)
+        {
+            vf4 = vf1 + vf2 - vf3;
+        }
+
+        Info<< "ExecutionTime = "
+            << executionTime.elapsedCpuTime()
+            << " s\n" << endl;
+
+        Snull<< vf4[1] << endl << endl;
+    }
+}