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/integration_tests/llimage_libtest/filters/convolve.xml b/indra/integration_tests/llimage_libtest/filters/convolve.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6e65b5f88a78c7fa4693502d22bbf7a6c8c40832
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/filters/convolve.xml
@@ -0,0 +1,18 @@
+<llsd>
+    <array>
+        <array>
+            <string>convolve</string>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>4.0</real>
+            <real>1.0</real>
+            <real>4.0</real>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>4.0</real>
+            <real>1.0</real>
+            <real>4.0</real>
+        </array>
+    </array>
+</llsd>
diff --git a/indra/llimage/llimagefilter.cpp b/indra/llimage/llimagefilter.cpp
index e0dae9fab2f62f500bf8c2403db993e30a20df9f..8f7e340d162e5ac5cde7ae1b90a4f12c1f91d135 100755
--- a/indra/llimage/llimagefilter.cpp
+++ b/indra/llimage/llimagefilter.cpp
@@ -134,9 +134,9 @@ void LLImageFilter::executeFilter(LLPointer<LLImageRaw> raw_image)
             {
                 mode = STENCIL_BLEND_MODE_ADD;
             }
-            else if (filter_mode == "dodge")
+            else if (filter_mode == "add_back")
             {
-                mode = STENCIL_BLEND_MODE_DODGE;
+                mode = STENCIL_BLEND_MODE_ABACK;
             }
             else if (filter_mode == "fade")
             {
@@ -230,21 +230,42 @@ void LLImageFilter::executeFilter(LLPointer<LLImageRaw> raw_image)
         else if (filter_name == "sharpen")
         {
             LLMatrix3 kernel;
-            for (S32 i = 0; i < NUM_VALUES_IN_MAT3; i++)
+            for (S32 k = 0; k < NUM_VALUES_IN_MAT3; k++)
                 for (S32 j = 0; j < NUM_VALUES_IN_MAT3; j++)
-                    kernel.mMatrix[i][j] = -1.0;
+                    kernel.mMatrix[k][j] = -1.0;
             kernel.mMatrix[1][1] = 9.0;
             convolve(kernel,false,false);
         }
         else if (filter_name == "gradient")
         {
             LLMatrix3 kernel;
-            for (S32 i = 0; i < NUM_VALUES_IN_MAT3; i++)
+            for (S32 k = 0; k < NUM_VALUES_IN_MAT3; k++)
                 for (S32 j = 0; j < NUM_VALUES_IN_MAT3; j++)
-                    kernel.mMatrix[i][j] = -1.0;
+                    kernel.mMatrix[k][j] = -1.0;
             kernel.mMatrix[1][1] = 8.0;
             convolve(kernel,false,true);
         }
+        else if (filter_name == "convolve")
+        {
+            LLMatrix3 kernel;
+            S32 index = 1;
+            bool normalize = (mFilterData[i][index++].asReal() > 0.0);
+            bool abs_value = (mFilterData[i][index++].asReal() > 0.0);
+            for (S32 k = 0; k < NUM_VALUES_IN_MAT3; k++)
+                for (S32 j = 0; j < NUM_VALUES_IN_MAT3; j++)
+                    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;
@@ -273,8 +294,8 @@ void LLImageFilter::blendStencil(F32 alpha, U8* pixel, U8 red, U8 green, U8 blue
             pixel[VGREEN] = llclampb(pixel[VGREEN] + alpha * green);
             pixel[VBLUE]  = llclampb(pixel[VBLUE]  + alpha * blue);
             break;
-        case STENCIL_BLEND_MODE_DODGE:
-            // Dodge/burn the incoming color onto the background image
+        case STENCIL_BLEND_MODE_ABACK:
+            // Add back background image to the incoming color
             pixel[VRED]   = llclampb(inv_alpha * pixel[VRED]   + red);
             pixel[VGREEN] = llclampb(inv_alpha * pixel[VGREEN] + green);
             pixel[VBLUE]  = llclampb(inv_alpha * pixel[VBLUE]  + blue);
diff --git a/indra/llimage/llimagefilter.h b/indra/llimage/llimagefilter.h
index e392d3215e7b337657d9296b54fd169875d54dd2..d2650c253934320c489a73bddd15e9c5c27b5fb0 100755
--- a/indra/llimage/llimagefilter.h
+++ b/indra/llimage/llimagefilter.h
@@ -38,7 +38,7 @@ typedef enum e_stencil_blend_mode
 {
 	STENCIL_BLEND_MODE_BLEND = 0,
 	STENCIL_BLEND_MODE_ADD   = 1,
-	STENCIL_BLEND_MODE_DODGE = 2,
+	STENCIL_BLEND_MODE_ABACK = 2,
 	STENCIL_BLEND_MODE_FADE  = 3
 } EStencilBlendMode;