diff --git a/indra/integration_tests/llimage_libtest/1970colorize.xml b/indra/integration_tests/llimage_libtest/filters/1970colorize.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/1970colorize.xml
rename to indra/integration_tests/llimage_libtest/filters/1970colorize.xml
diff --git a/indra/integration_tests/llimage_libtest/blur.xml b/indra/integration_tests/llimage_libtest/filters/blur.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/blur.xml
rename to indra/integration_tests/llimage_libtest/filters/blur.xml
diff --git a/indra/integration_tests/llimage_libtest/brighten.xml b/indra/integration_tests/llimage_libtest/filters/brighten.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/brighten.xml
rename to indra/integration_tests/llimage_libtest/filters/brighten.xml
diff --git a/indra/integration_tests/llimage_libtest/colorize.xml b/indra/integration_tests/llimage_libtest/filters/colorize.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/colorize.xml
rename to indra/integration_tests/llimage_libtest/filters/colorize.xml
diff --git a/indra/integration_tests/llimage_libtest/contrast.xml b/indra/integration_tests/llimage_libtest/filters/contrast.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/contrast.xml
rename to indra/integration_tests/llimage_libtest/filters/contrast.xml
diff --git a/indra/integration_tests/llimage_libtest/darken.xml b/indra/integration_tests/llimage_libtest/filters/darken.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/darken.xml
rename to indra/integration_tests/llimage_libtest/filters/darken.xml
diff --git a/indra/integration_tests/llimage_libtest/edges.xml b/indra/integration_tests/llimage_libtest/filters/edges.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/edges.xml
rename to indra/integration_tests/llimage_libtest/filters/edges.xml
diff --git a/indra/integration_tests/llimage_libtest/gamma.xml b/indra/integration_tests/llimage_libtest/filters/gamma.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/gamma.xml
rename to indra/integration_tests/llimage_libtest/filters/gamma.xml
diff --git a/indra/integration_tests/llimage_libtest/grayscale.xml b/indra/integration_tests/llimage_libtest/filters/grayscale.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/grayscale.xml
rename to indra/integration_tests/llimage_libtest/filters/grayscale.xml
diff --git a/indra/integration_tests/llimage_libtest/horizontalscreen.xml b/indra/integration_tests/llimage_libtest/filters/horizontalscreen.xml
similarity index 73%
rename from indra/integration_tests/llimage_libtest/horizontalscreen.xml
rename to indra/integration_tests/llimage_libtest/filters/horizontalscreen.xml
index ddff4d19771fe9ef748ee790000cc850171d0ada..21cab70e54aeed1d56d73ae6a368515958e85e44 100644
--- a/indra/integration_tests/llimage_libtest/horizontalscreen.xml
+++ b/indra/integration_tests/llimage_libtest/filters/horizontalscreen.xml
@@ -2,7 +2,7 @@
     <array>
         <array>
             <string>linearize</string>
-            <real>0.1</real>
+            <real>0.0</real>
             <real>1.0</real>
             <real>1.0</real>
             <real>1.0</real>
@@ -10,15 +10,10 @@
         <array>
             <string>grayscale</string>
         </array>
-        <array>
-            <string>blend</string>
-            <real>0.0</real>
-            <real>0.0</real>
-        </array>
         <array>
             <string>screen</string>
             <string>line</string>
-            <real>5.0</real>
+            <real>0.015</real>
             <real>0.0</real>
         </array>
     </array>
diff --git a/indra/integration_tests/llimage_libtest/linearize.xml b/indra/integration_tests/llimage_libtest/filters/linearize.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/linearize.xml
rename to indra/integration_tests/llimage_libtest/filters/linearize.xml
diff --git a/indra/integration_tests/llimage_libtest/newsscreen.xml b/indra/integration_tests/llimage_libtest/filters/newsscreen.xml
similarity index 73%
rename from indra/integration_tests/llimage_libtest/newsscreen.xml
rename to indra/integration_tests/llimage_libtest/filters/newsscreen.xml
index 8247c34500a71eeac728bda7d66fc66bcf8d5496..50ed27c6db555c3fa1c25cb185cd1bf3c4783dfe 100755
--- a/indra/integration_tests/llimage_libtest/newsscreen.xml
+++ b/indra/integration_tests/llimage_libtest/filters/newsscreen.xml
@@ -2,7 +2,7 @@
     <array>
         <array>
             <string>linearize</string>
-            <real>0.1</real>
+            <real>0.0</real>
             <real>1.0</real>
             <real>1.0</real>
             <real>1.0</real>
@@ -10,15 +10,10 @@
         <array>
             <string>grayscale</string>
         </array>
-        <array>
-            <string>blend</string>
-            <real>0.0</real>
-            <real>0.0</real>
-        </array>
         <array>
             <string>screen</string>
             <string>2Dsine</string>
-            <real>5.0</real>
+            <real>0.015</real>
             <real>0.0</real>
         </array>
     </array>
diff --git a/indra/integration_tests/llimage_libtest/posterize.xml b/indra/integration_tests/llimage_libtest/filters/posterize.xml
similarity index 54%
rename from indra/integration_tests/llimage_libtest/posterize.xml
rename to indra/integration_tests/llimage_libtest/filters/posterize.xml
index f026278f9e2013a498942515f22af22af005eb04..4d03df3c6611858d37c73feae4887a87ef78d77b 100755
--- a/indra/integration_tests/llimage_libtest/posterize.xml
+++ b/indra/integration_tests/llimage_libtest/filters/posterize.xml
@@ -1,12 +1,5 @@
 <llsd>
     <array>
-        <array>
-            <string>linearize</string>
-            <real>0.0</real>
-            <real>1.0</real>
-            <real>1.0</real>
-            <real>1.0</real>
-        </array>
         <array>
             <string>posterize</string>
             <real>10.0</real>
diff --git a/indra/integration_tests/llimage_libtest/rotatecolors180.xml b/indra/integration_tests/llimage_libtest/filters/rotatecolors180.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/rotatecolors180.xml
rename to indra/integration_tests/llimage_libtest/filters/rotatecolors180.xml
diff --git a/indra/integration_tests/llimage_libtest/saturate.xml b/indra/integration_tests/llimage_libtest/filters/saturate.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/saturate.xml
rename to indra/integration_tests/llimage_libtest/filters/saturate.xml
diff --git a/indra/integration_tests/llimage_libtest/sepia.xml b/indra/integration_tests/llimage_libtest/filters/sepia.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/sepia.xml
rename to indra/integration_tests/llimage_libtest/filters/sepia.xml
diff --git a/indra/integration_tests/llimage_libtest/sharpen.xml b/indra/integration_tests/llimage_libtest/filters/sharpen.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/sharpen.xml
rename to indra/integration_tests/llimage_libtest/filters/sharpen.xml
diff --git a/indra/integration_tests/llimage_libtest/slantedscreen.xml b/indra/integration_tests/llimage_libtest/filters/slantedscreen.xml
similarity index 73%
rename from indra/integration_tests/llimage_libtest/slantedscreen.xml
rename to indra/integration_tests/llimage_libtest/filters/slantedscreen.xml
index 63ad01d51d539e0063a643763f1725ff0f280c55..6cd1a96185f12a69ba837ad4b0d2e8df10a041df 100644
--- a/indra/integration_tests/llimage_libtest/slantedscreen.xml
+++ b/indra/integration_tests/llimage_libtest/filters/slantedscreen.xml
@@ -2,7 +2,7 @@
     <array>
         <array>
             <string>linearize</string>
-            <real>0.1</real>
+            <real>0.0</real>
             <real>1.0</real>
             <real>1.0</real>
             <real>1.0</real>
@@ -10,15 +10,10 @@
         <array>
             <string>grayscale</string>
         </array>
-        <array>
-            <string>blend</string>
-            <real>0.0</real>
-            <real>0.0</real>
-        </array>
         <array>
             <string>screen</string>
             <string>line</string>
-            <real>5.0</real>
+            <real>0.015</real>
             <real>45.0</real>
         </array>
     </array>
diff --git a/indra/integration_tests/llimage_libtest/spotlight.xml b/indra/integration_tests/llimage_libtest/filters/spotlight.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/spotlight.xml
rename to indra/integration_tests/llimage_libtest/filters/spotlight.xml
diff --git a/indra/integration_tests/llimage_libtest/filters/stencilgradient.xml b/indra/integration_tests/llimage_libtest/filters/stencilgradient.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d22809a9bf2a49f0a919f7301f399272782e8a45
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/filters/stencilgradient.xml
@@ -0,0 +1,24 @@
+<llsd>
+    <array>
+        <array>
+            <string>stencil</string>
+            <string>gradient</string>
+            <string>blend</string>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>-1.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+        </array>
+        <array>
+            <string>colorize</string>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+        </array>
+    </array>
+</llsd>
diff --git a/indra/integration_tests/llimage_libtest/filters/stencilscanlines.xml b/indra/integration_tests/llimage_libtest/filters/stencilscanlines.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3ce428503d17cb3d3d88de3e04810ba37487fdf5
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/filters/stencilscanlines.xml
@@ -0,0 +1,22 @@
+<llsd>
+    <array>
+        <array>
+            <string>stencil</string>
+            <string>scanlines</string>
+            <string>blend</string>
+            <real>0.0</real>
+            <real>0.5</real>
+            <real>0.1</real>
+            <real>45.0</real>
+        </array>
+        <array>
+            <string>colorize</string>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+        </array>
+    </array>
+</llsd>
diff --git a/indra/integration_tests/llimage_libtest/filters/stenciluniform.xml b/indra/integration_tests/llimage_libtest/filters/stenciluniform.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7d72f0ed934c2e442d9a45123a1e9238bd8ebdd2
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/filters/stenciluniform.xml
@@ -0,0 +1,20 @@
+<llsd>
+    <array>
+        <array>
+            <string>stencil</string>
+            <string>uniform</string>
+            <string>blend</string>
+            <real>0.0</real>
+            <real>0.5</real>
+        </array>
+        <array>
+            <string>colorize</string>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+        </array>
+    </array>
+</llsd>
diff --git a/indra/integration_tests/llimage_libtest/filters/stencilvignette.xml b/indra/integration_tests/llimage_libtest/filters/stencilvignette.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d30637fef595d76bc7f0c6e1abe5c9eb3f1d495a
--- /dev/null
+++ b/indra/integration_tests/llimage_libtest/filters/stencilvignette.xml
@@ -0,0 +1,24 @@
+<llsd>
+    <array>
+        <array>
+            <string>stencil</string>
+            <string>vignette</string>
+            <string>blend</string>
+            <real>0.0</real>
+            <real>0.5</real>
+            <real>0.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>10.0</real>
+        </array>
+        <array>
+            <string>colorize</string>
+            <real>1.0</real>
+            <real>0.0</real>
+            <real>0.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+            <real>1.0</real>
+        </array>
+    </array>
+</llsd>
diff --git a/indra/integration_tests/llimage_libtest/verticalscreen.xml b/indra/integration_tests/llimage_libtest/filters/verticalscreen.xml
similarity index 73%
rename from indra/integration_tests/llimage_libtest/verticalscreen.xml
rename to indra/integration_tests/llimage_libtest/filters/verticalscreen.xml
index 71e48df65654b22a914ac2e3a9b3a99a914aea1a..0768d1d7e17a0e77b0c5641775907f5e734a28f1 100644
--- a/indra/integration_tests/llimage_libtest/verticalscreen.xml
+++ b/indra/integration_tests/llimage_libtest/filters/verticalscreen.xml
@@ -2,7 +2,7 @@
     <array>
         <array>
             <string>linearize</string>
-            <real>0.1</real>
+            <real>0.0</real>
             <real>1.0</real>
             <real>1.0</real>
             <real>1.0</real>
@@ -10,15 +10,10 @@
         <array>
             <string>grayscale</string>
         </array>
-        <array>
-            <string>blend</string>
-            <real>0.0</real>
-            <real>0.0</real>
-        </array>
         <array>
             <string>screen</string>
             <string>line</string>
-            <real>5.0</real>
+            <real>0.015</real>
             <real>90.0</real>
         </array>
     </array>
diff --git a/indra/integration_tests/llimage_libtest/video.xml b/indra/integration_tests/llimage_libtest/filters/video.xml
similarity index 100%
rename from indra/integration_tests/llimage_libtest/video.xml
rename to indra/integration_tests/llimage_libtest/filters/video.xml
diff --git a/indra/llimage/llimagefilter.cpp b/indra/llimage/llimagefilter.cpp
index c02679e04fc8750e090e9b2486fb87d87c4e5580..4c6dd2faeeb6b103ec1d4a2b600d81143d266d63 100755
--- a/indra/llimage/llimagefilter.cpp
+++ b/indra/llimage/llimagefilter.cpp
@@ -1,6 +1,6 @@
 /** 
  * @file llimagefilter.cpp
- * @brief Simple Image Filtering.
+ * @brief Simple Image Filtering. See https://wiki.lindenlab.com/wiki/SL_Viewer_Image_Filters for complete documentation.
  *
  * $LicenseInfo:firstyear=2001&license=viewerlgpl$
  * Second Life Viewer Source Code
@@ -75,42 +75,12 @@ LLImageFilter::~LLImageFilter()
 
 /*
  *TODO 
- * Test blend modes
+ * Rename stencil to mask
+ * Test blend modes and name them correctly
+ * Suppress old "blend", "fade" and "lines" stencil definition. Change all xml accordingly.
  * Improve perf: use LUT for alpha blending in uniform case
  * Improve perf: make sure filter is not called more than necessary in viewer (seems to be called 3 times per change)
- * Make filter definition resolution independent (do not use pixel size anywhere)
  * Add gradient coloring as a filter
- 
- params:
- * vignette : center_x, center_y, width, feather
- * scan lines : wavelength, angle
- * uniform
- * gradient : start_x, start_y, end_x, end_y
-
- * Document all the admissible names in the wiki
- 
- "        Apply the filter <name> to the input images using the optional <param> value. Admissible names:\n"
- "        - 'grayscale' converts to grayscale (no param).\n"
- "        - 'sepia' converts to sepia (no param).\n"
- "        - 'saturate' changes color saturation according to <param>: < 1.0 will desaturate, > 1.0 will saturate.\n"
- "        - 'rotate' rotates the color hue according to <param> (in degree, positive value only).\n"
- 
- "        - 'gamma' applies a gamma curve <param> to all channels: > 1.0 will darken, < 1.0 will lighten.\n"
- "        - 'colorize' applies a colored tint <param1, param2, param3> to the image.\n"
- "        - 'contrast' modifies the contrast according to <param> : > 1.0 will enhance the contrast, <1.0 will flatten it.\n"
- "        - 'brighten' adds <param> light to the image (<param> between 0 and 255).\n"
- "        - 'darken' substracts <param> light to the image (<param> between 0 and 255).\n"
- "        - 'linearize' optimizes the contrast using the brightness histogram. <param> is the fraction (between 0.0 and 1.0) of the discarded head and tail of the histogram.\n"
- "        - 'posterize' redistributes the colors between <param> classes per channel (<param> between 2 and 255).\n"
- 
- "        - 'screen' applies a screening filter to the red channel and output to black and white. This filter assumes that the input image has been converted to grayscale or that the red channel is somewhat meaningful. It takes 3 parameters: a mode, a wave length and an angle. Modes are:\n"
- "            - '2Dsine' applies a bidirectional (x,y) sine screen. <angle> has no influence on that mode.\n"
- "            - 'line' applies a linear sine screen. <angle> is the line generator angle with the horizontal.\n"
- "         <wave_length> is size between 2 peaks of the sine function in normalized image coordinates."
-
- "        Apply a circular central vignette <name> to the filter using the optional <feather> and <min> values. Admissible names:\n"
- "        - 'blend' : the filter is applied with full intensity in the center and blends with the image to the periphery.\n"
- "        - 'fade' : the filter is applied with full intensity in the center and fades to black to the periphery.\n"
  */
 
 //============================================================================
@@ -133,25 +103,6 @@ void LLImageFilter::executeFilter(LLPointer<LLImageRaw> raw_image)
         //}
         //std::cout << std::endl;
         
-        // Execute the filter described on this line
-        /*
-        <array>
-        <string>stencil</string> 
-        <string>shape</string> uniform / gradient / vignette / scanlines
-        <string>blend_mode</string> blend /add /dodge / fade
-        <real>min</real> -1.0 to 1.0 (mandatory though ignored for uniform shape)
-        <real>max</real> -1.0 to 1.0 (value for uniform)
-        <real>param1</real>
-        <real>param2</real>
-        <real>param3</real>
-        <real>param4</real>
-        </array>
-         params:
-         * vignette : center_x, center_y, width, feather : positions between in float (0.0 is center, 1.0 is top), width in float in same unit, feather is a float
-         * scan lines : wavelength, angle : wavelength in float assuming (height/2 = 1), angle float in degree
-         * uniform : all parameters ignored
-         * gradient : start_x, start_y, end_x, end_y : position in float (0.0 is center, 1.0 is top)
-         */
         if (filter_name == "stencil")
         {
             // Get the shape of the stencil, that is how the procedural alpha is computed geometrically
@@ -279,7 +230,7 @@ void LLImageFilter::executeFilter(LLPointer<LLImageRaw> raw_image)
             {
                 mode = SCREEN_MODE_LINE;
             }
-            filterScreen(mode,(S32)(mFilterData[i][2].asReal()),(F32)(mFilterData[i][3].asReal()));
+            filterScreen(mode,(F32)(mFilterData[i][2].asReal()),(F32)(mFilterData[i][3].asReal()));
         }
         else if (filter_name == "blur")
         {
@@ -445,7 +396,7 @@ void LLImageFilter::convolve(const LLMatrix3 &kernel, bool normalize, bool abs_v
     // All other lines
     for (S32 j = 1; j < (height-1); j++)
 	{
-        // We need to buffer 2 lines. We flip north and current to avoid moving too much memory around
+        // We need to buffer 2 lines. We flip north and east-west (current) to avoid moving too much memory around
         if (j % 2)
         {
             memcpy( &odd_buffer[0], dst_data, buffer_size );	/* Flawfinder: ignore */
@@ -460,6 +411,7 @@ void LLImageFilter::convolve(const LLMatrix3 &kernel, bool normalize, bool abs_v
         }
         // First pixel : set to 0
         blendStencil(getStencilAlpha(0,j), dst_data, 0, 0, 0);
+        dst_data += components;
         // Set pointers to kernel
         U8* NW = north_data;
         U8* N = NW+components;
@@ -470,7 +422,6 @@ void LLImageFilter::convolve(const LLMatrix3 &kernel, bool normalize, bool abs_v
         U8* SW = south_data;
         U8* S = SW+components;
         U8* SE = S+components;
-        dst_data += components;
         // All other pixels
         for (S32 i = 1; i < (width-1); i++)
         {
@@ -528,7 +479,7 @@ void LLImageFilter::convolve(const LLMatrix3 &kernel, bool normalize, bool abs_v
     }
 }
 
-void LLImageFilter::filterScreen(EScreenMode mode, const S32 wave_length, const F32 angle)
+void LLImageFilter::filterScreen(EScreenMode mode, const F32 wave_length, const F32 angle)
 {
 	const S32 components = mImage->getComponents();
 	llassert( components >= 1 && components <= 4 );
@@ -536,6 +487,7 @@ void LLImageFilter::filterScreen(EScreenMode mode, const S32 wave_length, const
 	S32 width  = mImage->getWidth();
     S32 height = mImage->getHeight();
     
+    F32 wave_length_pixels = wave_length * (F32)(height) / 2.0;
     F32 sin = sinf(angle*DEG_TO_RAD);
     F32 cos = cosf(angle*DEG_TO_RAD);
     
@@ -550,11 +502,11 @@ void LLImageFilter::filterScreen(EScreenMode mode, const S32 wave_length, const
             switch (mode)
             {
                 case SCREEN_MODE_2DSINE:
-                    value = (sinf(2*F_PI*i/wave_length)*sinf(2*F_PI*j/wave_length)+1.0)*255.0/2.0;
+                    value = (sinf(2*F_PI*i/wave_length_pixels)*sinf(2*F_PI*j/wave_length_pixels)+1.0)*255.0/2.0;
                     break;
                 case SCREEN_MODE_LINE:
                     d = sin*i - cos*j;
-                    value = (sinf(2*F_PI*d/wave_length)+1.0)*255.0/2.0;
+                    value = (sinf(2*F_PI*d/wave_length_pixels)+1.0)*255.0/2.0;
                     break;
             }
             U8 dst_value = (dst_data[VRED] >= (U8)(value) ? 255 : 0);
diff --git a/indra/llimage/llimagefilter.h b/indra/llimage/llimagefilter.h
index 3e3be3d88b6e4de9f8d0865cf8ea82f921da8ec8..e392d3215e7b337657d9296b54fd169875d54dd2 100755
--- a/indra/llimage/llimagefilter.h
+++ b/indra/llimage/llimagefilter.h
@@ -1,6 +1,6 @@
 /** 
  * @file llimagefilter.h
- * @brief Simple Image Filtering.
+ * @brief Simple Image Filtering. See https://wiki.lindenlab.com/wiki/SL_Viewer_Image_Filters for complete documentation.
  *
  * $LicenseInfo:firstyear=2000&license=viewerlgpl$
  * Second Life Viewer Source Code
@@ -89,7 +89,7 @@ class LLImageFilter
     // Filter Primitives
     void colorTransform(const LLMatrix3 &transform);
     void colorCorrect(const U8* lut_red, const U8* lut_green, const U8* lut_blue);
-    void filterScreen(EScreenMode mode, const S32 wave_length, const F32 angle);
+    void filterScreen(EScreenMode mode, const F32 wave_length, const F32 angle);
     void blendStencil(F32 alpha, U8* pixel, U8 red, U8 green, U8 blue);
     void convolve(const LLMatrix3 &kernel, bool normalize, bool abs_value);