diff --git a/indra/integration_tests/llimage_libtest/filters/colortransform.xml b/indra/integration_tests/llimage_libtest/filters/colortransform.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de4bebcce2e5b0b6c766c4be2cf661c8ea6df5ec
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/filters/colortransform.xml
@@ -0,0 +1,16 @@
+<llsd>
+    <array>
+        <array>
+            <string>colortransform</string>
+            <real>0.2125</real>
+            <real>0.7154</real>
+            <real>0.0721</real>
+            <real>0.2125</real>
+            <real>0.7154</real>
+            <real>0.0721</real>
+            <real>0.2125</real>
+            <real>0.7154</real>
+            <real>0.0721</real>
+        </array>
+    </array>
+</llsd>
diff --git a/indra/llimage/llimagefilter.cpp b/indra/llimage/llimagefilter.cpp
index 9093e4b59c9f47540add2b92f41bfc72cdaa409f..8f7e340d162e5ac5cde7ae1b90a4f12c1f91d135 100755
--- a/indra/llimage/llimagefilter.cpp
+++ b/indra/llimage/llimagefilter.cpp
@@ -256,6 +256,16 @@ void LLImageFilter::executeFilter(LLPointer<LLImageRaw> raw_image)
                     kernel.mMatrix[k][j] = mFilterData[i][index++].asReal();
             convolve(kernel,normalize,abs_value);
         }
+        else if (filter_name == "colortransform")
+        {
+            LLMatrix3 transform;
+            S32 index = 1;
+            for (S32 k = 0; k < NUM_VALUES_IN_MAT3; k++)
+                for (S32 j = 0; j < NUM_VALUES_IN_MAT3; j++)
+                    transform.mMatrix[k][j] = mFilterData[i][index++].asReal();
+            transform.transpose();
+            colorTransform(transform);
+        }
         else
         {
             llwarns << "Filter unknown, cannot execute filter command : " << filter_name << llendl;