diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages.properties b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages.properties
index 16fb8ef..789ef56 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages.properties
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages.properties
@@ -31,6 +31,9 @@
 BackgroundImage = (If background image is turned off, the contrast ratio might not be enough.)
 FixedSizeFontWarning = Font size might be fixed. \uff08unsupported font-size definitions, etc. This message is also shown in the case where font-size is unspecified.\uff09
 FixedSmallFontWarning = This text is too small and its font size might be fixed. \uff08unsupported font-size definitions, etc.\uff09
+FontAlphaWarning = Font color is defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.
+BackgroundAlphaWarning = Background color is defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.
+BothAlphaWarning = Font color and background color are defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.
 #
 # lowvision.ScoreUtil
 #
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages_ja.properties b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages_ja.properties
index 73445ef..6adbb76 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages_ja.properties
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/messages_ja.properties
@@ -31,6 +31,9 @@
 BackgroundImage = (\u3082\u3057\u80cc\u666f\u753b\u50cf\u304c\u975e\u8868\u793a\u306b\u3055\u308c\u305f\u5834\u5408\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u6bd4\u306b\u554f\u984c\u304c\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002)
 FixedSizeFontWarning = \u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059 \uff08\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba\u6307\u5b9a\u3084\u3001\u672a\u6307\u5b9a\u306e\u5834\u5408\u3082\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\uff09
 FixedSmallFontWarning = \u3053\u306e\u6587\u5b57\u306f\u5c0f\u3055\u3059\u304e\u307e\u3059\u3002\u3055\u3089\u306b\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059 \uff08\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba\u6307\u5b9a\u306e\u5834\u5408\u3082\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\uff09
+FontAlphaWarning = \u6587\u5b57\u8272\u304c alpha (\u900f\u660e\u5ea6)\u3092\u7528\u3044\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30ab\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306a\u3069\u3092\u7528\u3044\u3066\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u7d44\u307f\u5408\u308f\u305b\u306b\u554f\u984c\u304c\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+BackgroundAlphaWarning = \u80cc\u666f\u8272\u304c alpha (\u900f\u660e\u5ea6)\u3092\u7528\u3044\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30ab\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306a\u3069\u3092\u7528\u3044\u3066\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u7d44\u307f\u5408\u308f\u305b\u306b\u554f\u984c\u304c\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+BothAlphaWarning = \u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u304c alpha (\u900f\u660e\u5ea6)\u3092\u7528\u3044\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30ab\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306a\u3069\u3092\u7528\u3044\u3066\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u7d44\u307f\u5408\u308f\u305b\u306b\u554f\u984c\u304c\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
 #
 # lowvision.ScoreUtil
 #
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/LowVisionProblemConverter.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/LowVisionProblemConverter.java
index a270658..70f2023 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/LowVisionProblemConverter.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/LowVisionProblemConverter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2011 IBM Corporation and Others
+ * Copyright (c) 2005, 2020 IBM Corporation and Others
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -17,14 +17,15 @@
 import org.eclipse.actf.visualization.eval.problem.ILowvisionProblemSubtype;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ColorProblem;
+import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ColorWarning;
+import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.LowVisionProblem;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.LowVisionProblemGroup;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ProblemItemLV;
 
 public class LowVisionProblemConverter {
 
-	public static List<IProblemItem> convert(LowVisionProblemGroup[] target,
-			String urlS, int frameId) {
+	public static List<IProblemItem> convert(LowVisionProblemGroup[] target, String urlS, int frameId) {
 
 		ArrayList<IProblemItem> result = new ArrayList<IProblemItem>();
 
@@ -32,15 +33,19 @@
 			int type = target[i].getLowVisionProblemType();
 			ProblemItemLV tmp;
 			ColorProblem cp;
-			if (type == LowVisionProblem.LOWVISION_COLOR_PROBLEM) {
+			switch (type) {
+			case ILowVisionProblem.LOWVISION_COLOR_PROBLEM:
 				cp = (ColorProblem) target[i].getRepresentative();
-				tmp = new ProblemItemLV(
-						"L_"	+ target[i].getLowVisionProblemType() + "." + cp.getLevel()); //$NON-NLS-1$
+				tmp = new ProblemItemLV("L_" + target[i].getLowVisionProblemType() + "." + cp.getLevel()); //$NON-NLS-1$
 				tmp.setTargetNode(cp.getElement());
 				tmp.setTargetString(cp.getAdditionalDescription());
-			} else {
-				tmp = new ProblemItemLV(
-						"L_" + target[i].getLowVisionProblemType()); //$NON-NLS-1$
+				break;
+			case ILowVisionProblem.LOWVISION_COLOR_WITH_ALPHA_WARNING:
+				ColorWarning cw = (ColorWarning) target[i].getRepresentative();
+				tmp = new ProblemItemLV("L_" + target[i].getLowVisionProblemType() + "." + cw.getWarningType()); //$NON-NLS-1$
+				break;
+			default:
+				tmp = new ProblemItemLV("L_" + target[i].getLowVisionProblemType()); //$NON-NLS-1$
 			}
 			tmp.setSubType(type);
 			try {
@@ -55,8 +60,7 @@
 				default:
 					tmp.setDescription(target[i].getDescription());
 					if (target[i].getRepresentative() != null)
-						tmp.setTargetNode(target[i].getRepresentative()
-								.getElement());
+						tmp.setTargetNode(target[i].getRepresentative().getElement());
 				}
 			} catch (Exception e) {
 				tmp.setDescription("unknown"); //$NON-NLS-1$
@@ -82,8 +86,7 @@
 		return (result);
 	}
 
-	private static String getLVProblemColorString(
-			LowVisionProblemGroup problem, boolean isFore) {
+	private static String getLVProblemColorString(LowVisionProblemGroup problem, boolean isFore) {
 		int probType;
 		int origAll;
 		int origR;
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/Messages.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/Messages.java
index d481095..b0ad518 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/Messages.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/Messages.java
@@ -45,6 +45,9 @@
 	public static String BackgroundImage;
 	public static String FixedSizeFontWarning;
 	public static String FixedSmallFontWarning;
+	public static String FontAlphaWarning;
+	public static String BackgroundAlphaWarning;
+	public static String BothAlphaWarning;
 
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/PageElement.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/PageElement.java
index bc13a1f..3268587 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/PageElement.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/PageElement.java
@@ -18,6 +18,7 @@
 import java.util.Vector;
 
 import org.eclipse.actf.model.ui.editor.browser.ICurrentStyles;
+import org.eclipse.actf.util.logging.DebugPrintUtil;
 import org.eclipse.actf.visualization.engines.lowvision.LowVisionException;
 import org.eclipse.actf.visualization.engines.lowvision.LowVisionType;
 import org.eclipse.actf.visualization.engines.lowvision.image.ImageException;
@@ -27,6 +28,7 @@
 import org.eclipse.actf.visualization.internal.engines.lowvision.color.ColorException;
 import org.eclipse.actf.visualization.internal.engines.lowvision.color.ColorIRGB;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ColorProblem;
+import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ColorWarning;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.FixedSizeFontProblem;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem;
 import org.eclipse.actf.visualization.internal.engines.lowvision.problem.LowVisionProblem;
@@ -90,17 +92,17 @@
 
 	// position in the image
 	private int x = UNSET_POSITION;
-
 	private int y = UNSET_POSITION;
-
 	private int width = UNSET_POSITION;
-
 	private int height = UNSET_POSITION;
 
 	private int foregroundColor = UNSET_COLOR;
-
 	private int backgroundColor = UNSET_COLOR;
 
+	private boolean bForegroundAlpha = false;
+	private boolean bBackgroundAlpha = false;
+	private boolean bOpacity = false;
+
 	public PageElement(String _key, ICurrentStyles _cs) throws ImageException {
 		id = _key;
 		style = _cs;
@@ -126,14 +128,36 @@
 
 		String fgStr = style.getComputedColor();
 		String bgStr = style.getComputedBackgroundColor();
+		String opacityStr = style.getOpacity();
+
+		try {
+			double opacity = Double.parseDouble(opacityStr);
+			if (opacity < 1) {
+				bOpacity = true;
+			}
+		} catch (NumberFormatException e1) {
+			DebugPrintUtil.devOrDebugPrintStackTrace(e1);
+		}
+
+		//System.out.println(style.getXPath() + ":\t" + fgStr + " / " + bgStr + " / " + opacityStr);
 
 		try {
 			foregroundColor = (new ColorCSS(fgStr)).toInt();
-			backgroundColor = (new ColorCSS(bgStr)).toInt();
-
 		} catch (ColorException e) {
-			e.printStackTrace();
-			throw new ImageException("Could not interpret colors."); //$NON-NLS-1$
+			if (ColorException.ALPHA_EXISTS.equals(e.getMessage())) {
+				bForegroundAlpha = true;
+			} else {
+				throw new ImageException("Could not interpret colors."); //$NON-NLS-1$
+			}
+		}
+		try {
+			backgroundColor = (new ColorCSS(bgStr)).toInt();
+		} catch (ColorException e) {
+			if (ColorException.ALPHA_EXISTS.equals(e.getMessage())) {
+				bBackgroundAlpha = true;
+			} else {
+				throw new ImageException("Could not interpret colors."); //$NON-NLS-1$
+			}
 		}
 	}
 
@@ -174,15 +198,13 @@
 			return (new LowVisionProblem[0]);
 		}
 
-		List<ColorProblem> cp = new ArrayList<ColorProblem>();
 		try {
-			cp = checkColors(_lvType);
+			problemVec.addAll(checkColors(_lvType));
 		} catch (LowVisionException e) {
 			DebugUtil.errMsg(this, "Error occurred in checking colors: id = " //$NON-NLS-1$
 					+ this.id);
 			e.printStackTrace();
 		}
-		problemVec.addAll(cp);
 
 		FixedSizeFontProblem fsfp = null;
 		try {
@@ -246,14 +268,14 @@
 		ProhibitedForegroundColorProblem pfcp = null;
 		ProhibitedBackgroundColorProblem pbcp = null;
 
-		if (allowedFgColors != null && allowedFgColors.length > 0) {
+		if (allowedFgColors != null && allowedFgColors.length > 0 && !bForegroundAlpha) {
 			try {
 				pfcp = checkAllowedForegroundColors(_lvType, allowedFgColors);
 			} catch (LowVisionException lve) {
 				lve.printStackTrace();
 			}
 		}
-		if (allowedBgColors != null && allowedBgColors.length > 0) {
+		if (allowedBgColors != null && allowedBgColors.length > 0 && !bBackgroundAlpha) {
 			try {
 				pbcp = checkAllowedBackgroundColors(_lvType, allowedBgColors);
 			} catch (LowVisionException lve) {
@@ -283,9 +305,9 @@
 		return (problemArray);
 	}
 
-	private List<ColorProblem> checkColors(LowVisionType _lvType) throws LowVisionException {
+	private List<ILowVisionProblem> checkColors(LowVisionType _lvType) throws LowVisionException {
 
-		List<ColorProblem> result = new ArrayList<ColorProblem>();
+		List<ILowVisionProblem> result = new ArrayList<ILowVisionProblem>();
 
 		if (!isTextTag()) {
 			return (result);
@@ -307,6 +329,27 @@
 			boolean hasBgImage = (style.getComputedBackgroundImage() != null
 					&& !style.getComputedBackgroundImage().equalsIgnoreCase("none"));
 
+			ColorWarning cw;
+			if (bOpacity) {
+				cw = new ColorWarning(ColorWarning.OPACITY, this, _lvType);
+				result.add(cw);
+				return (result);
+			} else if (bForegroundAlpha) {
+				if (bBackgroundAlpha) {
+					cw = new ColorWarning(ColorWarning.BOTH, this, _lvType);
+				} else {
+					cw = new ColorWarning(ColorWarning.FONT, this, _lvType);
+				}
+				cw.setElement(style.getElement());
+				result.add(cw);
+				return (result);
+			} else if (bBackgroundAlpha) {
+				cw = new ColorWarning(ColorWarning.BACKGROUND, this, _lvType);
+				cw.setElement(style.getElement());
+				result.add(cw);
+				return (result);
+			}
+
 			ColorIRGB fgOrg = new ColorIRGB(foregroundColor);
 			ColorIRGB bgOrg = new ColorIRGB(backgroundColor);
 
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorCSS.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorCSS.java
index bd9caef..25fd23d 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorCSS.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorCSS.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and Others
+ * Copyright (c) 2003, 2020 IBM Corporation and Others
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,15 @@
  *
  * Contributors:
  *    Junji MAEDA - initial API and implementation
+ *    IBM Corporation - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.actf.visualization.internal.engines.lowvision.color;
 
 import java.util.StringTokenizer;
 
+import org.eclipse.actf.util.logging.DebugPrintUtil;
+
 /*
  * colors in CSS
  * RGB(256)
@@ -23,49 +26,154 @@
  *  rgb(R,G,B)
  *  rgb(R%,G%,B%)
  *  pre-defined colors(16) (see ColorUtil.java)
+ *  
+ *  //2020-01
+ *  hsl(h,s%,l%) *  
+ *  rgba/hsla -> try to calculate if a=1. if a!=1 then throws exception
  */
 @SuppressWarnings("nls")
-public class ColorCSS extends ColorIRGB{
+public class ColorCSS extends ColorIRGB {
 	private static final String DELIM = "/";
 
 	// default values
 	static final int TRANSPARENT_R = 0xff; // "transparent"
 	static final int TRANSPARENT_G = 0xff; // "transparent"
 	static final int TRANSPARENT_B = 0xff; // "transparent"
-	public static final int TRANSPARENT = ((TRANSPARENT_R&0xff)<<16) | ((TRANSPARENT_G&0xff)<<8) | (TRANSPARENT_B&0xff); 
+	public static final int TRANSPARENT = ((TRANSPARENT_R & 0xff) << 16) | ((TRANSPARENT_G & 0xff) << 8)
+			| (TRANSPARENT_B & 0xff);
 	public static final int DEFAULT_BACKGROUND_COLOR_INT = TRANSPARENT;
 	public static final int DEFAULT_COLOR_INT = 0;
 
-	String originalString = "";
+	private static ColorIRGB parseHSL(String hsl) {
+		// assume (h, s%, l%) format
+		String target = hsl.replaceAll("[^0-9\\.,]", "");
+		// System.out.println(hsl + ":\t" + target);
+		StringTokenizer st = new StringTokenizer(target, ",", false);
+		double h, s, l, max, min;
+		double r, g, b;
+		int ri, gi, bi;
+		if (st.countTokens() == 3) {
+			try {
+				h = Float.parseFloat(st.nextToken());
+				s = Float.parseFloat(st.nextToken());
+				l = Float.parseFloat(st.nextToken());
 
-	public ColorCSS( String _s ) throws ColorException{
-		this( _s, true );
+				// assume valid data
+				// TODO validation if needed
+
+				if (l >= 50) {
+					max = 2.55 * (l + (100 - l) * (s / 100));
+					min = 2.55 * (l - (100 - l) * (s / 100));
+				} else {
+					max = 2.55 * (l + l * (s / 100));
+					min = 2.55 * (l - l * (s / 100));
+				}
+
+				if (0 <= h && h < 60) {
+					r = max;
+					g = (h / 60) * (max - min) + min;
+					b = min;
+				} else if (60 <= h && h < 120) {
+					r = ((120 - h) / 60) * (max - min) + min;
+					g = max;
+					b = min;
+				} else if (120 <= h && h < 180) {
+					r = min;
+					g = max;
+					b = ((h - 120) / 60) * (max - min) + min;
+				} else if (180 <= h && h < 240) {
+					r = min;
+					g = ((240 - h) / 60) * (max - min) + min;
+					b = max;
+				} else if (240 <= h && h < 300) {
+					r = ((h - 240) / 60) * (max - min) + min;
+					g = min;
+					b = max;
+				} else if (300 <= h && h < 360) {
+					r = max;
+					g = min;
+					b = ((360 - h) / 60) * (max - min) + min;
+				} else {
+					// error
+					return null;
+				}
+
+				ri = (int) Math.round(r);
+				gi = (int) Math.round(g);
+				bi = (int) Math.round(b);
+
+				ColorIRGB ci = new ColorIRGB(ri, gi, bi);
+				return ci;
+				// System.out.println(target + ":\t" + ri + ", " + gi + ", " +
+				// bi);
+
+			} catch (Exception e) {
+				DebugPrintUtil.debugPrintStackTrace(e);
+			}
+		}
+		return null;
 	}
 
-	public ColorCSS( String _s, boolean _check ) throws ColorException{
-		if( !(_s.endsWith(DELIM)) ){
+	private String originalString = "";
+	private boolean hasAlpha = false;
+
+	public ColorCSS(String _s) throws ColorException {
+		this(_s, true);
+	}
+
+	public ColorCSS(String _s, boolean _check) throws ColorException {
+
+		_s = _s.replaceAll("\\p{Space}", "").toLowerCase();
+
+		if (!(_s.endsWith(DELIM))) {
 			originalString = _s;
-		}else{
-			originalString = _s.substring( 0, _s.length()-1 );
+		} else {
+			originalString = _s.substring(0, _s.length() - 1);
+		}
+
+		if (originalString.startsWith("rgba") || originalString.startsWith("hsla")) {
+			hasAlpha = true;
+
+			// if alpha = 1 then try to convert value into RGB
+			if (originalString.endsWith(",1)")) {
+				originalString = originalString.substring(0, 3)
+						+ originalString.substring(4, originalString.length() - 3) + ")";
+			} else {
+				throw new ColorException(ColorException.ALPHA_EXISTS);
+			}
 		}
 
 		// foreground color
-		if( originalString.indexOf(DELIM) == -1 ){			
-			ColorIRGB ci = new ColorIRGB( originalString );
-			R = ci.getR();
-			G = ci.getG();
-			B = ci.getB();
-		}
-		else{ // background-color -> need to consider ancestor
+		if (originalString.indexOf(DELIM) == -1) {
+			if (originalString.startsWith("hsl")) {
+				ColorIRGB ci = parseHSL(originalString);
+				if (ci != null) {
+					R = ci.getR();
+					G = ci.getG();
+					B = ci.getB();
+				}
+			} else {
+				try {
+					ColorIRGB ci = new ColorIRGB(originalString);
+					R = ci.getR();
+					G = ci.getG();
+					B = ci.getB();
+				} catch (ColorException e) {
+					if (hasAlpha) {
+						throw new ColorException(ColorException.ALPHA_EXISTS);
+					}
+				}
+			}
+		} else { // background-color -> need to consider ancestor
 
-			StringTokenizer st = new StringTokenizer( originalString.toLowerCase(), DELIM );
+			StringTokenizer st = new StringTokenizer(originalString.toLowerCase(), DELIM);
 			boolean success = false;
-			while( st.hasMoreTokens() ){
+			while (st.hasMoreTokens()) {
 				String tmpStr = st.nextToken();
-								
-				if( !(tmpStr.equals( "transparent" )) ){
+
+				if (!(tmpStr.equals("transparent"))) {
 					// ColorIRGB ci = interpret( tmpStr );
-					ColorIRGB ci = new ColorIRGB( tmpStr );
+					ColorIRGB ci = new ColorIRGB(tmpStr);
 					R = ci.getR();
 					G = ci.getG();
 					B = ci.getB();
@@ -73,51 +181,64 @@
 					break;
 				}
 			}
-			if( !success ){
+			if (!success) {
 				R = TRANSPARENT_R;
 				G = TRANSPARENT_G;
 				B = TRANSPARENT_B;
 			}
 		}
 
-		if( _check ){ rangeCheck(); }
-		else{ rangeAdjust(); }
+		if (_check) {
+			rangeCheck();
+		} else {
+			rangeAdjust();
+		}
 	}
 
-	public ColorCSS() throws ColorException{
-		throw new ColorException( "Constructor in wrong format." );
-	}
-	public ColorCSS( int _i ) throws ColorException{
-		throw new ColorException( "Constructor in wrong format." );
-	}
-	public ColorCSS( int _i1, int _i2, int _i3 ) throws ColorException{
-		throw new ColorException( "Constructor in wrong format." );
-	}
-	public ColorCSS( int _i1, int _i2, int _i3, boolean _b ) throws ColorException{
-		throw new ColorException( "Constructor in wrong format." );
+	public ColorCSS() throws ColorException {
+		throw new ColorException("Constructor in wrong format.");
 	}
 
-	private void rangeCheck() throws ColorException{
-		if( R<0 || R>255){
-			throw new ColorException( "R is out of range: " + R + ", inputString = " + originalString );
+	public ColorCSS(int _i) throws ColorException {
+		throw new ColorException("Constructor in wrong format.");
+	}
+
+	public ColorCSS(int _i1, int _i2, int _i3) throws ColorException {
+		throw new ColorException("Constructor in wrong format.");
+	}
+
+	public ColorCSS(int _i1, int _i2, int _i3, boolean _b) throws ColorException {
+		throw new ColorException("Constructor in wrong format.");
+	}
+
+	private void rangeCheck() throws ColorException {
+		if (R < 0 || R > 255) {
+			throw new ColorException("R is out of range: " + R + ", inputString = " + originalString);
 		}
-		if( G<0 || G>255){
-			throw new ColorException( "G is out of range: " + G + ", inputString = " + originalString );
+		if (G < 0 || G > 255) {
+			throw new ColorException("G is out of range: " + G + ", inputString = " + originalString);
 		}
-		if( B<0 || B>255){
-			throw new ColorException( "B is out of range: " + B + ", inputString = " + originalString );
+		if (B < 0 || B > 255) {
+			throw new ColorException("B is out of range: " + B + ", inputString = " + originalString);
 		}
 	}
-	private void rangeAdjust(){
-		if( R<0 ) R = 0;
-		else if( R>255 ) R = 255;
-		if( G<0 ) G = 0;
-		else if( G>255 ) G = 255;
-		if( B<0 ) B = 0;
-		else if( B>255 ) B = 255;
+
+	private void rangeAdjust() {
+		if (R < 0)
+			R = 0;
+		else if (R > 255)
+			R = 255;
+		if (G < 0)
+			G = 0;
+		else if (G > 255)
+			G = 255;
+		if (B < 0)
+			B = 0;
+		else if (B > 255)
+			B = 255;
 	}
-	
-	public String getOriginalString(){
-		return( originalString );
+
+	public String getOriginalString() {
+		return (originalString);
 	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorException.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorException.java
index 904a4f7..d033215 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorException.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorException.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and Others
+ * Copyright (c) 2003, 2020 IBM Corporation and Others
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,10 +7,14 @@
  *
  * Contributors:
  *    Junji MAEDA - initial API and implementation
+ *    IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.actf.visualization.internal.engines.lowvision.color;
 
 public class ColorException extends Exception{
+	
+	public static final String ALPHA_EXISTS = "Alpha value exists.";
+	
     /**
 	 * 
 	 */
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorIRGB.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorIRGB.java
index 287a434..531b953 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorIRGB.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorIRGB.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and Others
+ * Copyright (c) 2003, 2020 IBM Corporation and Others
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *    Junji MAEDA - initial API and implementation
+ *    IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.actf.visualization.internal.engines.lowvision.color;
 
@@ -40,8 +41,7 @@
 		setB(_b);
 	}
 
-	public ColorIRGB(int _r, int _g, int _b, boolean _check)
-			throws ColorException {
+	public ColorIRGB(int _r, int _g, int _b, boolean _check) throws ColorException {
 		setR(_r, _check);
 		setG(_g, _check);
 		setB(_b, _check);
@@ -57,9 +57,7 @@
 		Pattern patRemoveSpace = Pattern.compile("^\\s*(\\S.+\\S)\\s*$");
 		Matcher matRemoveSpace = patRemoveSpace.matcher(_str.toLowerCase());
 		if (!(matRemoveSpace.find())) {
-			throw new ColorException(
-					"There no color spacifications. Input string is \"" + _str
-							+ "\"");
+			throw new ColorException("There no color spacifications. Input string is \"" + _str + "\"");
 		}
 		String spec = matRemoveSpace.group(1);
 
@@ -80,8 +78,7 @@
 					B = Integer.parseInt(bStr, 16);
 				} catch (NumberFormatException e) {
 					e.printStackTrace();
-					throw new ColorException("Bad color specification(1): #"
-							+ spec);
+					throw new ColorException("Bad color specification(1): #" + spec);
 				}
 			} else if (spec.length() == 3) {
 				String rStr = spec.substring(0, 1);
@@ -93,8 +90,7 @@
 					B = Integer.parseInt(bStr + bStr, 16);
 				} catch (NumberFormatException e) {
 					e.printStackTrace();
-					throw new ColorException("Bad color specification(2): #"
-							+ spec);
+					throw new ColorException("Bad color specification(2): #" + spec);
 				}
 			} else {
 				throw new ColorException("Bad color specification(3): #" + spec);
@@ -107,8 +103,7 @@
 						.compile("^\\s*([\\+\\-]?\\d+)\\s*\\,\\s*([\\+\\-]?\\d+)\\s*\\,\\s*([\\+\\-]?\\d+)\\s*$");
 				Matcher matRGB = patRGB.matcher(spec);
 				if (!(matRGB.find())) {
-					throw new ColorException("Bad color specification(4): rgb("
-							+ spec + ")");
+					throw new ColorException("Bad color specification(4): rgb(" + spec + ")");
 				}
 				try {
 					setR(Integer.parseInt(matRGB.group(1)), false);
@@ -116,31 +111,22 @@
 					setB(Integer.parseInt(matRGB.group(3)), false);
 				} catch (NumberFormatException e) {
 					e.printStackTrace();
-					throw new ColorException("Bad color specification(5): rgb("
-							+ spec + ")");
+					throw new ColorException("Bad color specification(5): rgb(" + spec + ")");
 				}
 			} else { // float value
-				Pattern patRGB = Pattern
-						.compile("^\\s*([\\+\\-]?\\d+(\\.\\d+)*)\\%\\s*\\,\\s*([\\+\\-]?\\d+(\\.\\d+)*)\\%\\s*\\,\\s*([\\+\\-]?\\d+(\\.\\d+)*)\\%\\s*$");
+				Pattern patRGB = Pattern.compile(
+						"^\\s*([\\+\\-]?\\d+(\\.\\d+)*)\\%\\s*\\,\\s*([\\+\\-]?\\d+(\\.\\d+)*)\\%\\s*\\,\\s*([\\+\\-]?\\d+(\\.\\d+)*)\\%\\s*$");
 				Matcher matRGB = patRGB.matcher(spec);
 				if (!(matRGB.find())) {
-					throw new ColorException("Bad color specification(6): rgb("
-							+ spec + ")");
+					throw new ColorException("Bad color specification(6): rgb(" + spec + ")");
 				}
 				try {
-					setR(
-							(int) ((Float.parseFloat(matRGB.group(1))) / 100.0f * 255.0f),
-							false);
-					setG(
-							(int) ((Float.parseFloat(matRGB.group(3))) / 100.0f * 255.0f),
-							false);
-					setB(
-							(int) ((Float.parseFloat(matRGB.group(5))) / 100.0f * 255.0f),
-							false);
+					setR((int) ((Float.parseFloat(matRGB.group(1))) / 100.0f * 255.0f), false);
+					setG((int) ((Float.parseFloat(matRGB.group(3))) / 100.0f * 255.0f), false);
+					setB((int) ((Float.parseFloat(matRGB.group(5))) / 100.0f * 255.0f), false);
 				} catch (Exception e) {
 					e.printStackTrace();
-					throw new ColorException("Bad color specification(7): rgb("
-							+ spec + ")");
+					throw new ColorException("Bad color specification(7): rgb(" + spec + ")");
 				}
 			}
 		} else if (spec.equals("transparent")) {
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorUtil.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorUtil.java
index e3ef942..ce7c192 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorUtil.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/color/ColorUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2008 IBM Corporation and Others
+ * Copyright (c) 2003, 2020 IBM Corporation and Others
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,86 +7,126 @@
  *
  * Contributors:
  *    Junji MAEDA - initial API and implementation
+ *    IBM Corporation - initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.actf.visualization.internal.engines.lowvision.color;
 
 import java.io.PrintStream;
 import java.io.PrintWriter;
+import java.util.HashMap;
 
 public class ColorUtil {
-	// pre-defined 16 colors (HTML4.0, XHTML1.0, CSS2)
+	// pre-defined 16 colors (HTML4.0, XHTML1.0, CSS2) -> CSS3 extended
+	// colors(X11 colors)
+	/*
+	 * @SuppressWarnings("nls")
+	 * 
+	 * private static final String predefinedColors[] = { "black", "#000000",
+	 * "silver", "#c0c0c0", "gray", "#808080", "grey", "#808080", "white",
+	 * "#ffffff", "maroon", "#800000", "red", "#ff0000", "purple", "#800080",
+	 * "fuchsia", "#ff00ff", "green", "#008000", "lime", "#00ff00", "olive",
+	 * "#808000", "yellow", "#ffff00", "navy", "#000080", "blue", "#0000ff",
+	 * "teal", "#008080", "aqua", "#00ffff" };
+	 */
 	@SuppressWarnings("nls")
-	private static final String predefinedColors[] = {
-		"black", "#000000", "silver", "#c0c0c0",
-		"gray", "#808080", "grey", "#808080", "white", "#ffffff",
-		"maroon", "#800000", "red", "#ff0000",
-		"purple", "#800080", "fuchsia", "#ff00ff",
-		"green", "#008000", "lime", "#00ff00",
-		"olive", "#808000", "yellow", "#ffff00",
-		"navy", "#000080", "blue", "#0000ff",
-		"teal", "#008080", "aqua", "#00ffff"
-	};
-	private static final int numPredefinedColors = predefinedColors.length/2;
+	private static final String predefinedColors[][] = { { "aliceblue", "#f0f8ff" }, { "antiquewhite", "#faebd7" },
+			{ "aqua", "#00ffff" }, { "aquamarine", "#7fffd4" }, { "azure", "#f0ffff" }, { "beige", "#f5f5dc" },
+			{ "bisque", "#ffe4c4" }, { "black", "#000000" }, { "blanchedalmond", "#ffebcd" }, { "blue", "#0000ff" },
+			{ "blueviolet", "#8a2be2" }, { "brown", "#a52a2a" }, { "burlywood", "#deb887" }, { "cadetblue", "#5f9ea0" },
+			{ "chartreuse", "#7fff00" }, { "chocolate", "#d2691e" }, { "coral", "#ff7f50" },
+			{ "cornflowerblue", "#6495ed" }, { "cornsilk", "#fff8dc" }, { "crimson", "#dc143c" }, { "cyan", "#00ffff" },
+			{ "darkblue", "#00008b" }, { "darkcyan", "#008b8b" }, { "darkgoldenrod", "#b8860b" },
+			{ "darkgray", "#a9a9a9" }, { "darkgreen", "#006400" }, { "darkgrey", "#a9a9a9" },
+			{ "darkkhaki", "#bdb76b" }, { "darkmagenta", "#8b008b" }, { "darkolivegreen", "#556b2f" },
+			{ "darkorange", "#ff8c00" }, { "darkorchid", "#9932cc" }, { "darkred", "#8b0000" },
+			{ "darksalmon", "#e9967a" }, { "darkseagreen", "#8fbc8f" }, { "darkslateblue", "#483d8b" },
+			{ "darkslategray", "#2f4f4f" }, { "darkslategrey", "#2f4f4f" }, { "darkturquoise", "#00ced1" },
+			{ "darkviolet", "#9400d3" }, { "deeppink", "#ff1493" }, { "deepskyblue", "#00bfff" },
+			{ "dimgray", "#696969" }, { "dimgrey", "#696969" }, { "dodgerblue", "#1e90ff" }, { "firebrick", "#b22222" },
+			{ "floralwhite", "#fffaf0" }, { "forestgreen", "#228b22" }, { "fuchsia", "#ff00ff" },
+			{ "gainsboro", "#dcdcdc" }, { "ghostwhite", "#f8f8ff" }, { "gold", "#ffd700" }, { "goldenrod", "#daa520" },
+			{ "gray", "#808080" }, { "green", "#008000" }, { "greenyellow", "#adff2f" }, { "grey", "#808080" },
+			{ "honeydew", "#f0fff0" }, { "hotpink", "#ff69b4" }, { "indianred", "#cd5c5c" }, { "indigo", "#4b0082" },
+			{ "ivory", "#fffff0" }, { "khaki", "#f0e68c" }, { "lavender", "#e6e6fa" }, { "lavenderblush", "#fff0f5" },
+			{ "lawngreen", "#7cfc00" }, { "lemonchiffon", "#fffacd" }, { "lightblue", "#add8e6" },
+			{ "lightcoral", "#f08080" }, { "lightcyan", "#e0ffff" }, { "lightgoldenrodyellow", "#fafad2" },
+			{ "lightgray", "#d3d3d3" }, { "lightgreen", "#90ee90" }, { "lightgrey", "#d3d3d3" },
+			{ "lightpink", "#ffb6c1" }, { "lightsalmon", "#ffa07a" }, { "lightseagreen", "#20b2aa" },
+			{ "lightskyblue", "#87cefa" }, { "lightslategray", "#778899" }, { "lightslategrey", "#778899" },
+			{ "lightsteelblue", "#b0c4de" }, { "lightyellow", "#ffffe0" }, { "lime", "#00ff00" },
+			{ "limegreen", "#32cd32" }, { "linen", "#faf0e6" }, { "magenta", "#ff00ff" }, { "maroon", "#800000" },
+			{ "mediumaquamarine", "#66cdaa" }, { "mediumblue", "#0000cd" }, { "mediumorchid", "#ba55d3" },
+			{ "mediumpurple", "#9370db" }, { "mediumseagreen", "#3cb371" }, { "mediumslateblue", "#7b68ee" },
+			{ "mediumspringgreen", "#00fa9a" }, { "mediumturquoise", "#48d1cc" }, { "mediumvioletred", "#c71585" },
+			{ "midnightblue", "#191970" }, { "mintcream", "#f5fffa" }, { "mistyrose", "#ffe4e1" },
+			{ "moccasin", "#ffe4b5" }, { "navajowhite", "#ffdead" }, { "navy", "#000080" }, { "oldlace", "#fdf5e6" },
+			{ "olive", "#808000" }, { "olivedrab", "#6b8e23" }, { "orange", "#ffa500" }, { "orangered", "#ff4500" },
+			{ "orchid", "#da70d6" }, { "palegoldenrod", "#eee8aa" }, { "palegreen", "#98fb98" },
+			{ "paleturquoise", "#afeeee" }, { "palevioletred", "#db7093" }, { "papayawhip", "#ffefd5" },
+			{ "peachpuff", "#ffdab9" }, { "peru", "#cd853f" }, { "pink", "#ffc0cb" }, { "plum", "#dda0dd" },
+			{ "powderblue", "#b0e0e6" }, { "purple", "#800080" }, { "red", "#ff0000" }, { "rosybrown", "#bc8f8f" },
+			{ "royalblue", "#4169e1" }, { "saddlebrown", "#8b4513" }, { "salmon", "#fa8072" },
+			{ "sandybrown", "#f4a460" }, { "seagreen", "#2e8b57" }, { "seashell", "#fff5ee" }, { "sienna", "#a0522d" },
+			{ "silver", "#c0c0c0" }, { "skyblue", "#87ceeb" }, { "slateblue", "#6a5acd" }, { "slategray", "#708090" },
+			{ "slategrey", "#708090" }, { "snow", "#fffafa" }, { "springgreen", "#00ff7f" }, { "steelblue", "#4682b4" },
+			{ "tan", "#d2b48c" }, { "teal", "#008080" }, { "thistle", "#d8bfd8" }, { "tomato", "#ff6347" },
+			{ "turquoise", "#40e0d0" }, { "violet", "#ee82ee" }, { "wheat", "#f5deb3" }, { "white", "#ffffff" },
+			{ "whitesmoke", "#f5f5f5" }, { "yellow", "#ffff00" }, { "yellowgreen", "#9acd32" } };
 
-	public static boolean isPredefinedColor( String _s ){
-		String s = _s.toLowerCase();
-		for( int i=0; i<numPredefinedColors; i++ ){
-			if( predefinedColors[i*2].equals(s) ){
-				return( true );
-			}
+	private static final HashMap<String, String> predefinedColorMap = new HashMap<String, String>();
+	static {
+		for (int i = 0; i < predefinedColors.length; i++) {
+			predefinedColorMap.put(predefinedColors[i][0], predefinedColors[i][1]);
 		}
-		return( false );
 	}
 
-	public static String predefinedColor2Pound( String _s ){
-		String s = _s.toLowerCase();
-		for( int i=0; i<numPredefinedColors; i++ ){
-			if( predefinedColors[i*2].equals(s) ){
-				return( predefinedColors[i*2+1] );
-			}
-		}
-		return( null );
+	public static boolean isPredefinedColor(String _s) {
+		return predefinedColorMap.containsKey(_s.toLowerCase());
+	}
+
+	public static String predefinedColor2Pound(String _s) {
+		return predefinedColorMap.get(_s.toLowerCase());
 	}
 
 	// TYPE_INT_RGB <--> R,G,B
-	public static int[] intToRGB( int _i ){
+	public static int[] intToRGB(int _i) {
 		int[] rgb = new int[3];
-		rgb[0] = (_i>>16) & 0xff;
-		rgb[1] = (_i>>8) & 0xff;
+		rgb[0] = (_i >> 16) & 0xff;
+		rgb[1] = (_i >> 8) & 0xff;
 		rgb[2] = _i & 0xff;
-		return( rgb );
+		return (rgb);
 	}
-	public static int RGBToInt( int _r, int _g, int _b ){
-		return( (_r&0xff)<<16 | (_g&0xff)<<8 | (_b&0xff) );
+
+	public static int RGBToInt(int _r, int _g, int _b) {
+		return ((_r & 0xff) << 16 | (_g & 0xff) << 8 | (_b & 0xff));
 	}
-	
-	public static void dumpColor( PrintStream _ps, int _i ){
+
+	public static void dumpColor(PrintStream _ps, int _i) {
 		(new ColorIRGB(_i)).dump(_ps);
 	}
 
-	public static void dumpColor( PrintWriter _pw, int _i ){
+	public static void dumpColor(PrintWriter _pw, int _i) {
 		(new ColorIRGB(_i)).dump(_pw);
 	}
-	
+
 	/*
 	 * assign distinguishable colors for sequential IDs
 	 * 
 	 */
-	public static int distinguishableColor( int _id ){
+	public static int distinguishableColor(int _id) {
 		int r = 0;
 		int g = 0;
 		int b = 0;
-		if( _id == 0 ){
-			return( 0x00ffffff );
-		}
-		else{
-			for( int l=0; l<8; l++ ){
-				r += ((_id>>(l*3))&1)<<(7-l);
-				g += ((_id>>(l*3+1))&1)<<(7-l);
-				b += ((_id>>(l*3+2))&1)<<(7-l);
+		if (_id == 0) {
+			return (0x00ffffff);
+		} else {
+			for (int l = 0; l < 8; l++) {
+				r += ((_id >> (l * 3)) & 1) << (7 - l);
+				g += ((_id >> (l * 3 + 1)) & 1) << (7 - l);
+				b += ((_id >> (l * 3 + 2)) & 1) << (7 - l);
 			}
-			return( (r<<16) | (g<<8) | b );
+			return ((r << 16) | (g << 8) | b);
 		}
 	}
 }
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ColorWarning.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ColorWarning.java
new file mode 100644
index 0000000..e6cedbb
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ColorWarning.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2020 IBM Corporation and Others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Junji MAEDA - initial API and implementation
+ *    IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.actf.visualization.internal.engines.lowvision.problem;
+
+import org.eclipse.actf.visualization.engines.lowvision.LowVisionType;
+import org.eclipse.actf.visualization.internal.engines.lowvision.Messages;
+import org.eclipse.actf.visualization.internal.engines.lowvision.PageElement;
+import org.eclipse.actf.visualization.internal.engines.lowvision.image.PageComponent;
+
+public class ColorWarning extends LowVisionProblem {
+	public static final int FONT = 0;
+	public static final int BACKGROUND = 1;
+	public static final int BOTH = 2;
+	public static final int OPACITY = 3;
+
+	private static String getDescriptionFromType(int type) {
+		switch (type) {
+		case FONT:
+			return Messages.FontAlphaWarning;
+		case BACKGROUND:
+			return Messages.BackgroundAlphaWarning;
+		case BOTH:
+			return Messages.BothAlphaWarning;
+		case OPACITY:
+			return Messages.BothAlphaWarning + " (opacity)";
+		}
+		return "";
+	}
+
+	int warningType = BOTH;
+
+	public ColorWarning(int _warningType, PageComponent _pc, LowVisionType _lvType) throws LowVisionProblemException {
+		super(LOWVISION_COLOR_WITH_ALPHA_WARNING, _lvType, getDescriptionFromType(_warningType), _pc, 0);
+		warningType = _warningType;
+		setRecommendations();
+	}
+
+	public ColorWarning(int _warningType, PageElement _pe, LowVisionType _lvType) throws LowVisionProblemException {
+		super(LOWVISION_COLOR_WITH_ALPHA_WARNING, _lvType, getDescriptionFromType(_warningType), _pe, 0);
+		warningType = _warningType;
+		setRecommendations();
+	}
+
+	protected void setRecommendations() throws LowVisionProblemException {
+		recommendations = new LowVisionRecommendation[0];
+	}
+
+	public int getWarningType() {
+		if(warningType == OPACITY){
+			//use message/errorId for BothAlphaWarning
+			return BOTH;
+		}
+		return warningType;
+	}
+}
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ILowVisionProblem.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ILowVisionProblem.java
index 7065acb..8b90e74 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ILowVisionProblem.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/ILowVisionProblem.java
@@ -17,12 +17,13 @@
 
 import org.eclipse.actf.visualization.engines.lowvision.LowVisionType;
 import org.eclipse.actf.visualization.engines.lowvision.image.IPageImage;
+import org.eclipse.actf.visualization.eval.problem.ILowvisionProblemSubtype;
 import org.eclipse.actf.visualization.internal.engines.lowvision.PageElement;
 import org.eclipse.actf.visualization.internal.engines.lowvision.image.Int2D;
 import org.eclipse.actf.visualization.internal.engines.lowvision.image.PageComponent;
 import org.w3c.dom.Element;
 
-public interface ILowVisionProblem {
+public interface ILowVisionProblem extends ILowvisionProblemSubtype{
 
 	int UNSET_POSITION = -1;
 	int DEFAULT_PRIORITY = 0;
diff --git a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/LowVisionProblem.java b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/LowVisionProblem.java
index 7c652a7..a1865e1 100644
--- a/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/LowVisionProblem.java
+++ b/plugins/org.eclipse.actf.visualization.engines.lowvision/src/org/eclipse/actf/visualization/internal/engines/lowvision/problem/LowVisionProblem.java
@@ -17,40 +17,39 @@
 
 import org.eclipse.actf.visualization.engines.lowvision.LowVisionType;
 import org.eclipse.actf.visualization.engines.lowvision.image.IPageImage;
-import org.eclipse.actf.visualization.eval.problem.ILowvisionProblemSubtype;
 import org.eclipse.actf.visualization.internal.engines.lowvision.PageElement;
 import org.eclipse.actf.visualization.internal.engines.lowvision.image.ConnectedComponent;
 import org.eclipse.actf.visualization.internal.engines.lowvision.image.Int2D;
 import org.eclipse.actf.visualization.internal.engines.lowvision.image.PageComponent;
 import org.w3c.dom.Element;
 
-
-public abstract class LowVisionProblem implements ILowvisionProblemSubtype, ILowVisionProblem{
-	IPageImage pageImage = null; 
+public abstract class LowVisionProblem implements ILowVisionProblem {
+	IPageImage pageImage = null;
 	LowVisionType lowVisionType = null;
-	int problemType; 
-	short componentType = PageComponent.UNDEFINED_TYPE; 
-	PageComponent pageComponent = null; 
-	PageElement pageElement = null; 
-	String description; 
+	int problemType;
+	short componentType = PageComponent.UNDEFINED_TYPE;
+	PageComponent pageComponent = null;
+	PageElement pageElement = null;
+	String description;
 	int left = UNSET_POSITION;
 	int top = UNSET_POSITION;
 	int width = 0;
 	int height = 0;
-	int priority; 
+	int priority;
 
-	double probability = 0.0; // 
+	double probability = 0.0; //
 	double characterScore = 0.0; //
-	//int numRecommendations = 0; // recommendations.length;
+	// int numRecommendations = 0; // recommendations.length;
 	LowVisionRecommendation[] recommendations = null;
 	boolean isGroupFlag = false; // is LowVisionProblemGroup?
-	
+
 	Element element;
-	
-	protected LowVisionProblem(){
+
+	protected LowVisionProblem() {
 	}
-	
-	public LowVisionProblem( int _type, LowVisionType _lvType, String _description, PageComponent _com, double _proba ) throws LowVisionProblemException{
+
+	public LowVisionProblem(int _type, LowVisionType _lvType, String _description, PageComponent _com, double _proba)
+			throws LowVisionProblemException {
 		problemType = _type;
 		lowVisionType = _lvType;
 		description = _description;
@@ -58,7 +57,7 @@
 		componentType = pageComponent.getType();
 		pageImage = pageComponent.getPageImage();
 		ConnectedComponent cc = pageComponent.getConnectedComponent();
-		if( cc != null ){
+		if (cc != null) {
 			left = cc.getLeft();
 			top = cc.getTop();
 			width = cc.getWidth();
@@ -66,15 +65,15 @@
 		}
 		setPriority();
 		probability = _proba;
-		characterScore = probability * width * height; 
+		characterScore = probability * width * height;
 	}
 
-	public LowVisionProblem( int _type, LowVisionType _lvType, String _description, PageElement _pe, double _proba ){
+	public LowVisionProblem(int _type, LowVisionType _lvType, String _description, PageElement _pe, double _proba) {
 		problemType = _type;
 		lowVisionType = _lvType;
 		description = _description;
 		pageElement = _pe;
-		if( pageElement != null ){
+		if (pageElement != null) {
 			left = pageElement.getX();
 			top = pageElement.getY();
 			width = pageElement.getWidth();
@@ -83,281 +82,355 @@
 		setPriority();
 		probability = _proba;
 	}
-	
-	private void setPriority(){
-		if( left == UNSET_POSITION || top == UNSET_POSITION ){
+
+	private void setPriority() {
+		if (left == UNSET_POSITION || top == UNSET_POSITION) {
 			priority = DEFAULT_PRIORITY;
-		}else{
+		} else {
 			priority = 0x7fffffff - top * 0xffff - left;
 		}
 		/*
-		PageImage pi = component.getPageImage();
-		if( pi != null ){
-			int pageWidth = pi.getWidth();
-			int pageHeight = pi.getHeight();
-			priority = pageWidth*pageHeight - top*pageWidth - left;
-		}
-		else{
-			priority = DEFAULT_PRIORITY;
-		}
-		*/
+		 * PageImage pi = component.getPageImage(); if( pi != null ){ int
+		 * pageWidth = pi.getWidth(); int pageHeight = pi.getHeight(); priority
+		 * = pageWidth*pageHeight - top*pageWidth - left; } else{ priority =
+		 * DEFAULT_PRIORITY; }
+		 */
 	}
 
 	protected abstract void setRecommendations() throws LowVisionProblemException;
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getType()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getType()
 	 */
 	@Override
 	public short getType() {
-		return( LOWVISION_PROBLEM );
+		return (LOWVISION_PROBLEM);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getLowVisionType()
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getLowVisionType()
 	 */
 	@Override
-	public LowVisionType getLowVisionType(){
-		return( lowVisionType );
+	public LowVisionType getLowVisionType() {
+		return (lowVisionType);
 	}
 
 	// LowVision Error type (Color, Blur, etc.)
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getLowVisionProblemType()
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getLowVisionProblemType()
 	 */
 	@Override
-	public int getLowVisionProblemType(){
-		return( problemType );
+	public int getLowVisionProblemType() {
+		return (problemType);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getDescription()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getDescription()
 	 */
 	@Override
-	public String getDescription() throws LowVisionProblemException{
-		return( description );
+	public String getDescription() throws LowVisionProblemException {
+		return (description);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPageImage()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getPageImage()
 	 */
 	@Override
-	public IPageImage getPageImage(){
-		return( pageImage );
+	public IPageImage getPageImage() {
+		return (pageImage);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getX()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getX()
 	 */
 	@Override
-	public int getX(){
-		return( left );
+	public int getX() {
+		return (left);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getY()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getY()
 	 */
 	@Override
-	public int getY(){
-		return( top );
+	public int getY() {
+		return (top);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getWidth()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getWidth()
 	 */
 	@Override
-	public int getWidth(){
-		return( width );
+	public int getWidth() {
+		return (width);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getHeight()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getHeight()
 	 */
 	@Override
-	public int getHeight(){
-		return( height );
+	public int getHeight() {
+		return (height);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPriority()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getPriority()
 	 */
 	@Override
-	public int getPriority(){
-		return( priority );
+	public int getPriority() {
+		return (priority);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getProbability()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getProbability()
 	 */
 	@Override
-	public double getProbability(){
-		return( probability );
+	public double getProbability() {
+		return (probability);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getIntProbability()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getIntProbability()
 	 */
 	@Override
-	public int getIntProbability(){
-		return( (int)(Math.rint(probability*100.0)) );
+	public int getIntProbability() {
+		return ((int) (Math.rint(probability * 100.0)));
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getCharacterScore()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getCharacterScore()
 	 */
 	@Override
-	public double getCharacterScore(){
-		return( characterScore );
+	public double getCharacterScore() {
+		return (characterScore);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getRecommendations()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getRecommendations()
 	 */
 	@Override
-	public LowVisionRecommendation[] getRecommendations(){
-		return( recommendations );
+	public LowVisionRecommendation[] getRecommendations() {
+		return (recommendations);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#isGroup()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#isGroup()
 	 */
 	@Override
-	public boolean isGroup(){
-		return( isGroupFlag );
+	public boolean isGroup() {
+		return (isGroupFlag);
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getComponentType()
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getComponentType()
 	 */
 	@Override
-	public short getComponentType() throws LowVisionProblemException{
-		if( !isGroupFlag ){
-			return( componentType );
-		}
-		else{
-			throw new LowVisionProblemException( "componentType cannot be gotten from a ProblemGroup." ); //$NON-NLS-1$
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPageComponent()
-	 */
-	@Override
-	public PageComponent getPageComponent() throws LowVisionProblemException{
-		if( !isGroupFlag ){
-			return( pageComponent );
-		}
-		else{
-			throw new LowVisionProblemException( "component cannot be gotten from a ProblemGroup." ); //$NON-NLS-1$
+	public short getComponentType() throws LowVisionProblemException {
+		if (!isGroupFlag) {
+			return (componentType);
+		} else {
+			throw new LowVisionProblemException("componentType cannot be gotten from a ProblemGroup."); //$NON-NLS-1$
 		}
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getPageElement()
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getPageComponent()
 	 */
 	@Override
-	public PageElement getPageElement(){
-		return( pageElement );
+	public PageComponent getPageComponent() throws LowVisionProblemException {
+		if (!isGroupFlag) {
+			return (pageComponent);
+		} else {
+			throw new LowVisionProblemException("component cannot be gotten from a ProblemGroup."); //$NON-NLS-1$
+		}
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#toString()
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getPageElement()
+	 */
+	@Override
+	public PageElement getPageElement() {
+		return (pageElement);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#toString()
 	 */
 	@Override
 	@SuppressWarnings("nls")
-	public String toString(){
+	public String toString() {
 		String compTypeString = null;
-		if( componentType == PageComponent.SS_CHARACTER_TYPE ){
+		if (componentType == PageComponent.SS_CHARACTER_TYPE) {
 			compTypeString = "(SS)";
-		}
-		else if( componentType == PageComponent.MS_CHARACTER_TYPE ){
+		} else if (componentType == PageComponent.MS_CHARACTER_TYPE) {
 			compTypeString = "(MS)";
-		}
-		else if( componentType == PageComponent.SM_CHARACTER_TYPE ){
+		} else if (componentType == PageComponent.SM_CHARACTER_TYPE) {
 			compTypeString = "(SM)";
-		}
-		else{
-			compTypeString = ""+componentType;
+		} else {
+			compTypeString = "" + componentType;
 		}
 		StringBuffer sb = new StringBuffer();
-		sb.append( "Description=" + description );
-		sb.append( compTypeString );
-		sb.append( ", " );
-		sb.append( "(x,y)=(" + left + "," + top + ")" );
-		sb.append( ", " );
-		sb.append( "[WIDTH x HEIGHT]=[" + width + " x " + height + "]" );
-		sb.append( ", " );
-		sb.append( "Probability=" + (int)(Math.rint(probability*100.0)) );
-		sb.append( ", " );
-		sb.append( "#Recommendations=" + recommendations.length );
-		return( sb.toString() );
+		sb.append("Description=" + description);
+		sb.append(compTypeString);
+		sb.append(", ");
+		sb.append("(x,y)=(" + left + "," + top + ")");
+		sb.append(", ");
+		sb.append("[WIDTH x HEIGHT]=[" + width + " x " + height + "]");
+		sb.append(", ");
+		sb.append("Probability=" + (int) (Math.rint(probability * 100.0)));
+		sb.append(", ");
+		sb.append("#Recommendations=" + recommendations.length);
+		return (sb.toString());
 	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#dump(java.io.PrintStream, boolean)
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#dump(java.io.PrintStream, boolean)
 	 */
 	@Override
-	public void dump( PrintStream _ps, boolean _doRecommendations ) throws LowVisionProblemException{
-		PrintWriter pw = new PrintWriter( _ps, true );
-		dump( pw, _doRecommendations );
+	public void dump(PrintStream _ps, boolean _doRecommendations) throws LowVisionProblemException {
+		PrintWriter pw = new PrintWriter(_ps, true);
+		dump(pw, _doRecommendations);
 	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#dump(java.io.PrintWriter, boolean)
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#dump(java.io.PrintWriter, boolean)
 	 */
 	@Override
 	@SuppressWarnings("nls")
-	public void dump( PrintWriter _pw, boolean _doRecommendations ) throws LowVisionProblemException{
-		_pw.println( "----------" );
-		_pw.println( "dumping a problem");
-		_pw.println( "problemType = " + problemType );
-		_pw.println( "componentType = " + componentType );
-		_pw.println( "description = " + getDescription() );
-		_pw.println( "(x,y) = ( " + getX() + ", " + getY() + ")" );
-		_pw.println( "width, height = " + getWidth() + ", " + getHeight() );
-		_pw.println( "priority = " + getPriority() );
+	public void dump(PrintWriter _pw, boolean _doRecommendations) throws LowVisionProblemException {
+		_pw.println("----------");
+		_pw.println("dumping a problem");
+		_pw.println("problemType = " + problemType);
+		_pw.println("componentType = " + componentType);
+		_pw.println("description = " + getDescription());
+		_pw.println("(x,y) = ( " + getX() + ", " + getY() + ")");
+		_pw.println("width, height = " + getWidth() + ", " + getHeight());
+		_pw.println("priority = " + getPriority());
 		LowVisionRecommendation[] recs = getRecommendations();
-		if( recs != null ){
-			_pw.println( "# of Recommendations = " + recs.length );
+		if (recs != null) {
+			_pw.println("# of Recommendations = " + recs.length);
+		} else {
+			_pw.println("Recommendations are null.");
 		}
-		else{
-			_pw.println( "Recommendations are null." );
-		}
-		if( _doRecommendations && recs != null ){
-			for( int i=0; i<recs.length; i++ ){
-				_pw.println( "Recommendation #" + i );
+		if (_doRecommendations && recs != null) {
+			for (int i = 0; i < recs.length; i++) {
+				_pw.println("Recommendation #" + i);
 				recs[i].dump(_pw);
 			}
 		}
-		_pw.println( "----------" );
+		_pw.println("----------");
 	}
 
-	private static final int[] PROBLEM_COLORS = {
-		0x00ffffff, 0x00ff0000, 0x0000ff00
-	};
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#drawSurroundingBox(org.eclipse.actf.visualization.internal.engines.lowvision.image.Int2D)
+	private static final int[] PROBLEM_COLORS = { 0x00ffffff, 0x00ff0000, 0x0000ff00 };
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#drawSurroundingBox(org.eclipse.actf.visualization.
+	 * internal.engines.lowvision.image.Int2D)
 	 */
 	@Override
-	public void drawSurroundingBox( Int2D _img ){
+	public void drawSurroundingBox(Int2D _img) {
 		int x0 = getX();
 		int y0 = getY();
-		int x1 = x0+getWidth();
-		int y1 = y0+getHeight();
+		int x1 = x0 + getWidth();
+		int y1 = y0 + getHeight();
 		int color = PROBLEM_COLORS[problemType];
-		for( int i=x0; i<x1; i++ ){
+		for (int i = x0; i < x1; i++) {
 			_img.getData()[y0][i] = color;
-			_img.getData()[y1-1][i] = color;
+			_img.getData()[y1 - 1][i] = color;
 		}
-		for( int j=y0; j<y1; j++ ){
+		for (int j = y0; j < y1; j++) {
 			_img.getData()[j][x0] = color;
-			_img.getData()[j][x1-1] = color;
-		}
-	}
-	
-	public static void drawAllSurroundingBoxes( ILowVisionProblem[] _problems, Int2D _img ){
-		for( int k=0; k<_problems.length; k++ ){
-			_problems[k].drawSurroundingBox( _img );
+			_img.getData()[j][x1 - 1] = color;
 		}
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#getElement()
+	public static void drawAllSurroundingBoxes(ILowVisionProblem[] _problems, Int2D _img) {
+		for (int k = 0; k < _problems.length; k++) {
+			_problems[k].drawSurroundingBox(_img);
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#getElement()
 	 */
 	@Override
 	public Element getElement() {
 		return element;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.ILowVisionProblem#setElement(org.w3c.dom.Element)
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.actf.visualization.internal.engines.lowvision.problem.
+	 * ILowVisionProblem#setElement(org.w3c.dom.Element)
 	 */
 	@Override
 	public void setElement(Element element) {
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml b/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
index b3c39ad..1178d46 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
@@ -755,6 +755,51 @@
             <desc>This text is too small and its font size might be fixed. （unsupported font-size definitions, etc.）</desc>
         </description>
     </checkitem>
+    <checkitem type="user" id="L_13.0">
+        <guideline>
+            <gItem id="2.2" name="WCAG"/>
+            <gItem techniques="G18,G145" id="1.4.3" name="JIS"/>
+            <gItem techniques="G17,G18" id="1.4.6" name="JIS"/>
+            <gItem techniques="G18,G145" id="1.4.3" name="WCAG 2.0"/>
+            <gItem techniques="G17,G18" id="1.4.6" name="WCAG 2.0"/>
+        </guideline>
+        <metrics>
+            <mItem name="Perceivable"/>
+        </metrics>
+        <description>
+            <desc>Font color is defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.</desc>
+        </description>
+    </checkitem>
+    <checkitem type="user" id="L_13.1">
+        <guideline>
+            <gItem id="2.2" name="WCAG"/>
+            <gItem techniques="G18,G145" id="1.4.3" name="JIS"/>
+            <gItem techniques="G17,G18" id="1.4.6" name="JIS"/>
+            <gItem techniques="G18,G145" id="1.4.3" name="WCAG 2.0"/>
+            <gItem techniques="G17,G18" id="1.4.6" name="WCAG 2.0"/>
+        </guideline>
+        <metrics>
+            <mItem name="Perceivable"/>
+        </metrics>
+        <description>
+            <desc>Background color is defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.</desc>
+        </description>
+    </checkitem>
+    <checkitem type="user" id="L_13.2">
+        <guideline>
+            <gItem id="2.2" name="WCAG"/>
+            <gItem techniques="G18,G145" id="1.4.3" name="JIS"/>
+            <gItem techniques="G17,G18" id="1.4.6" name="JIS"/>
+            <gItem techniques="G18,G145" id="1.4.3" name="WCAG 2.0"/>
+            <gItem techniques="G17,G18" id="1.4.6" name="WCAG 2.0"/>
+        </guideline>
+        <metrics>
+            <mItem name="Perceivable"/>
+        </metrics>
+        <description>
+            <desc>Font color and background color are defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.</desc>
+        </description>
+    </checkitem>
     <checkitem type="error" id="B_38">
         <guideline>
             <gItem id="1.1" name="WCAG"/>
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/description.properties b/plugins/org.eclipse.actf.visualization.eval/resources/description.properties
index 9d20b4f..d3df3f5 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/description.properties
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/description.properties
@@ -62,4 +62,7 @@
 L_6 = This text is too small and its font size is fixed.  
 L_10 = This area has background image. Please confirm the contrast between text and background, and confirm important information is not provided only by background image. .{0}
 L_11 = Font size might be fixed. \uff08unsupported font-size definitions, etc. This message is also shown in the case where font-size is unspecified.\uff09
-L_12 = This text is too small and its font size might be fixed. \uff08unsupported font-size definitions, etc.\uff09
\ No newline at end of file
+L_12 = This text is too small and its font size might be fixed. \uff08unsupported font-size definitions, etc.\uff09
+L_13.0 = Font color is defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.
+L_13.1 = Background color is defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.
+L_13.2 = Font color and background color are defined by using alpha (opacity). Please confirm color combination by using color check tool, etc.
\ No newline at end of file
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties b/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties
index 3ffb69f..f67e871 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/description_ja.properties
@@ -62,4 +62,7 @@
 L_6 = \u3053\u306e\u6587\u5b57\u306f\u5c0f\u3055\u3059\u304e\u307e\u3059\u3002\u3055\u3089\u306b\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u307e\u3059\u3002
 L_10 = \u30b9\u30bf\u30a4\u30eb\u30b7\u30fc\u30c8\u3067\u80cc\u666f\u753b\u50cf\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u9593\u306e\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u6bd4\u304c\u5341\u5206\u304b\u3001\u80cc\u666f\u753b\u50cf\u306e\u307f\u306b\u3088\u3063\u3066\u91cd\u8981\u306a\u60c5\u5831\u3092\u4f1d\u3048\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002{0}
 L_11 = \u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059 \uff08\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba\u6307\u5b9a\u3084\u3001\u672a\u6307\u5b9a\u306e\u5834\u5408\u3082\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\uff09
-L_12 = \u3053\u306e\u6587\u5b57\u306f\u5c0f\u3055\u3059\u304e\u307e\u3059\u3002\u3055\u3089\u306b\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059 \uff08\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba\u6307\u5b9a\u306e\u5834\u5408\u3082\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\uff09
\ No newline at end of file
+L_12 = \u3053\u306e\u6587\u5b57\u306f\u5c0f\u3055\u3059\u304e\u307e\u3059\u3002\u3055\u3089\u306b\u56fa\u5b9a\u30b5\u30a4\u30ba\u306e\u30d5\u30a9\u30f3\u30c8\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059 \uff08\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a9\u30f3\u30c8\u30b5\u30a4\u30ba\u6307\u5b9a\u306e\u5834\u5408\u3082\u3053\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\uff09
+L_13.0 = \u6587\u5b57\u8272\u304c alpha (\u900f\u660e\u5ea6)\u3092\u7528\u3044\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30ab\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306a\u3069\u3092\u7528\u3044\u3066\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u7d44\u307f\u5408\u308f\u305b\u306b\u554f\u984c\u304c\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+L_13.1 = \u80cc\u666f\u8272\u304c alpha (\u900f\u660e\u5ea6)\u3092\u7528\u3044\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30ab\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306a\u3069\u3092\u7528\u3044\u3066\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u7d44\u307f\u5408\u308f\u305b\u306b\u554f\u984c\u304c\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+L_13.2 = \u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u304c alpha (\u900f\u660e\u5ea6)\u3092\u7528\u3044\u3066\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30ab\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306a\u3069\u3092\u7528\u3044\u3066\u3001\u6587\u5b57\u8272\u3068\u80cc\u666f\u8272\u306e\u7d44\u307f\u5408\u308f\u305b\u306b\u554f\u984c\u304c\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
\ No newline at end of file
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ILowvisionProblemSubtype.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ILowvisionProblemSubtype.java
index ae3b3e1..ac623d0 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ILowvisionProblemSubtype.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/problem/ILowvisionProblemSubtype.java
@@ -27,4 +27,5 @@
 	public static final int LOWVISION_BACKGROUND_IMAGE_WARNING = 10;
 	public static final int LOWVISION_FIXED_SIZE_FONT_WARNING = 11;	//for pt
 	public static final int LOWVISION_FIXED_SMALL_FONT_WARNIG =12;	//for pt
+	public static final int LOWVISION_COLOR_WITH_ALPHA_WARNING = 13;
 }
diff --git a/plugins/org.eclipse.actf.visualization.lowvision/src/org/eclipse/actf/visualization/lowvision/eval/SummaryEvaluationLV.java b/plugins/org.eclipse.actf.visualization.lowvision/src/org/eclipse/actf/visualization/lowvision/eval/SummaryEvaluationLV.java
index 53936f2..fb7c2a2 100644
--- a/plugins/org.eclipse.actf.visualization.lowvision/src/org/eclipse/actf/visualization/lowvision/eval/SummaryEvaluationLV.java
+++ b/plugins/org.eclipse.actf.visualization.lowvision/src/org/eclipse/actf/visualization/lowvision/eval/SummaryEvaluationLV.java
@@ -72,8 +72,8 @@
 	public String getOverview() {
 		StringBuffer tmpSB = new StringBuffer(512);
 
-		int problemCount[] = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-		int severeCount[] = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+		int problemCount[] = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+		int severeCount[] = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
 		for (int i = 0; i < _problems.length; i++) {
 			IProblemItemImage curProblem = _problems[i];
