diff --git a/common/source/java/ch/systemsx/cisd/common/image/MixColors.java b/common/source/java/ch/systemsx/cisd/common/image/MixColors.java
index 551a311c3bda3b3167eff92a4e3684133ac2757e..68bfc57747ef9588559ec6cc7812dae0017ce67e 100644
--- a/common/source/java/ch/systemsx/cisd/common/image/MixColors.java
+++ b/common/source/java/ch/systemsx/cisd/common/image/MixColors.java
@@ -18,7 +18,6 @@ package ch.systemsx.cisd.common.image;
 
 import java.awt.Color;
 import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
 
 import org.apache.log4j.Logger;
 
@@ -274,14 +273,51 @@ public class MixColors
 
         int width = images[0].getWidth();
         int height = images[0].getHeight();
-        final BufferedImage mixed = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 
-        for (int y = 0; y < images[0].getHeight(); ++y)
+        final Color[][] notNormalizedPixels = new Color[width][height];
+        float whitePointSumIntencity = 0f;
+        Color whitePointColor = new Color(0);
+        final float[] mixedComponents = new float[4];
+
+        // store the colours and calculate white point
+        for (int y = 0; y < height; ++y)
         {
-            for (int x = 0; x < images[0].getWidth(); ++x)
+            for (int x = 0; x < width; ++x)
             {
                 Color mixColor = mergeColorsAlgorithm.merge(colors, x, y, images);
-                mixed.setRGB(x, y, mixColor.getRGB());
+                notNormalizedPixels[x][y] = mixColor;
+
+                mixColor.getRGBColorComponents(mixedComponents);
+                float sumIntencity = 0f;
+                for (int i = 0; i < mixedComponents.length; i++)
+                {
+                    sumIntencity += mixedComponents[i];
+                }
+
+                if (whitePointSumIntencity < sumIntencity)
+                {
+                    whitePointColor = mixColor;
+                    whitePointSumIntencity = sumIntencity;
+                }
+            }
+        }
+
+        final float whitePointFactor = 255f / getMaxComponent(whitePointColor.getRed(), whitePointColor.getGreen(), whitePointColor.getBlue());
+
+        final BufferedImage mixed = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        // apply white point adjustments to the final image
+        for (int y = 0; y < height; ++y)
+        {
+            for (int x = 0; x < width; ++x)
+            {
+                notNormalizedPixels[x][y].getRGBColorComponents(mixedComponents);
+                for (int i = 0; i < mixedComponents.length; i++)
+                {
+                    mixedComponents[i] *= whitePointFactor;
+                }
+
+                mixed.setRGB(x, y, new Color(images[0].getColorModel().getColorSpace(), mixedComponents, 1).getRGB());
             }
         }
         return mixed;
@@ -326,20 +362,6 @@ public class MixColors
         for (int i = 0; i < numberOfImages; ++i)
         {
             isGrayscale = isGrayscale && images[i].getColorModel().getNumColorComponents() == 1;
-            ColorModel colorModel = images[i].getColorModel();
-            int componentSize;
-            try
-            {
-                componentSize = colorModel.getComponentSize(0);
-            } catch (NullPointerException e)
-            {
-                operationLog.info("Could not determine the componentSize of an image. Potentially using non 8-bit image in merging");
-                continue;
-            }
-            if (componentSize != 8)
-            {
-                throw new IllegalArgumentException("Only 8-bit images can be merged.");
-            }
         }
         return createColorMergingAlgorithm(quadratic, saturationEnhancementFactor, isGrayscale,
                 numberOfImages);