diff --git a/core/org.eclipse.tigerstripe.core/src/main/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java b/core/org.eclipse.tigerstripe.core/src/main/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java
index e97ea75..0cc7996 100644
--- a/core/org.eclipse.tigerstripe.core/src/main/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java
+++ b/core/org.eclipse.tigerstripe.core/src/main/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java
@@ -35,6 +35,13 @@
 
         return type;
     }
+    
+    public static String replaceJavaLangString(String type) {
+        if ("String".equals(type))
+            return "java.lang.String";
+
+        return type;
+    }
 
     public static String removeIllegalCharacters(String name) {
         String result = name;
diff --git a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/adapt/TigerstripeURIAdapterFactory.java b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/adapt/TigerstripeURIAdapterFactory.java
index cf67b6d..07cfdfc 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/adapt/TigerstripeURIAdapterFactory.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/adapt/TigerstripeURIAdapterFactory.java
@@ -67,6 +67,12 @@
 public class TigerstripeURIAdapterFactory implements IAdapterFactory {
 
     public static final String SCHEME_TS = "tigerstripe";
+    
+    public static final String ARGUMENT_SEPERATOR = ";;";
+    public static final String COMPONENT_SEPERATOR = "#";
+    public static final String A_END_MARKER = ";aEnd";
+    public static final String Z_END_MARKER = ";aEnd";
+    
 
     @SuppressWarnings("unchecked")
     public Object getAdapter(Object adaptableObject, Class adapterType) {
@@ -299,7 +305,7 @@
             if (fragment != null) {
 
                 // Let's extract the method, and go from there
-                int indexOfSemicolons = fragment.indexOf(";;");
+                int indexOfSemicolons = fragment.indexOf(ARGUMENT_SEPERATOR);
                 if (indexOfSemicolons == -1) {
                     return null;
                 }
@@ -348,7 +354,7 @@
             String fragment = uri.getFragment();
 
             if (fragment != null) {
-                if (fragment.contains(";;")) {
+                if (fragment.contains(ARGUMENT_SEPERATOR)) {
                     // This means we're dealing with a method argument.
                     // Since IArgument is not a IModelComponent yet so it'll get
                     // picked up later
@@ -356,9 +362,9 @@
                 } else if (fragment.contains(";")
                         && artifact instanceof IAssociationArtifact) {
                     IAssociationArtifact assoc = (IAssociationArtifact) artifact;
-                    if (fragment.endsWith(";aEnd"))
+                    if (fragment.endsWith(A_END_MARKER))
                         result = assoc.getAEnd();
-                    else if (fragment.endsWith(";zEnd"))
+                    else if (fragment.endsWith(Z_END_MARKER))
                         result = assoc.getZEnd();
                 } else if (fragment.endsWith(")") && fragment.contains("(")) {
                     Collection<IMethod> methods = artifact.getMethods();
@@ -422,6 +428,7 @@
         return toURI(element, null);
     }
 
+
     public static URI toURI(IArgument argument) throws TigerstripeException {
         IMethod method = argument.getContainingMethod();
         IAbstractArtifact art = getArtifact(method);
@@ -431,7 +438,7 @@
 
         IPath artifactPath = getArtifactPath(art, null);
 
-        String fragment = method.getMethodId() + ";;" + argument.getName();
+        String fragment = method.getMethodId() + ARGUMENT_SEPERATOR + argument.getName();
         return toURI(artifactPath, fragment);
     }
 
@@ -496,7 +503,7 @@
         if (art == null || isArtifactDisposed(art)) {
             return null;
         }
-        String fragment = methodId + ";;" + argumentId;
+        String fragment = methodId + ARGUMENT_SEPERATOR + argumentId;
         return toURI(getArtifactPath(art, null), fragment);
     }
 
diff --git a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/api/patterns/PatternFactory.java b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/api/patterns/PatternFactory.java
index c597ca0..9990291 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/api/patterns/PatternFactory.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/api/patterns/PatternFactory.java
@@ -83,9 +83,9 @@
 	private AbstractContributionFactory artifactPatternToolbarDropDownsAddition;
 	private AbstractContributionFactory projectPatternToolbarAddition;
 	private AbstractContributionFactory projectPatternToolbarDropDownsAddition;
-	private Map<String,IPattern> discoveredPatterns = new HashMap<String,IPattern>();
-	private Map<String,IPattern> registeredPatterns = new LinkedHashMap<String,IPattern>();
-	private Collection<String> disabledPatterns = new ArrayList<String>();
+	private Map<String,IPattern> discoveredPatterns = new HashMap<>();
+	private Map<String,IPattern> registeredPatterns = new LinkedHashMap<>();
+	private Collection<String> disabledPatterns = new ArrayList<>();
 
 	// Important stuff for the XML parsing and Validation
 	private Bundle baseBundle = org.eclipse.core.runtime.Platform.getBundle("org.eclipse.tigerstripe.workbench.base");
diff --git a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/AssociationArtifactAuditor.java b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/AssociationArtifactAuditor.java
index 2b32f87..b7178e3 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/AssociationArtifactAuditor.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/AssociationArtifactAuditor.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.tigerstripe.workbench.internal.builder;
 
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
@@ -26,6 +27,14 @@
 
 public class AssociationArtifactAuditor extends AbstractArtifactAuditor {
 
+    public static final int UNDEFINED_END_VIOLATION = 200;
+    public static final int INVALID_END_VIOLATION = 201;
+
+    
+    public static final int NO_NAVIGABILITY_VIOLATION = 210;
+    public static final int BAD_AGGREGATION_VIOLATION = 211;
+    
+    
     @Override
     public void run(IProject project, IAbstractArtifact artifact, IProgressMonitor monitor) {
 
@@ -36,10 +45,10 @@
         boolean aEndDefined = false;
         if (aEndType == null || aEndType.getFullyQualifiedName().length() == 0) {
             TigerstripeProjectAuditor
-                    .reportError(
+                    .reportProblem(
                             "Undefined " + assocArtifact.getLabel()
                                     + " end (aEnd) in '" + assocArtifact.getFullyQualifiedName() + "'.",
-                            getIResource(project, artifact), 222);
+                            getIResource(project, artifact), UNDEFINED_END_VIOLATION, IMarker.SEVERITY_ERROR, assocArtifact.getAEnd());
         } else {
             aEndDefined = true;
         }
@@ -49,10 +58,10 @@
         boolean zEndDefined = false;
         if (zEndType == null || zEndType.getFullyQualifiedName().length() == 0) {
             TigerstripeProjectAuditor
-                    .reportError(
+                    .reportProblem(
                             "Undefined " + assocArtifact.getLabel()
                                     + " end (zEnd) in '" + assocArtifact.getFullyQualifiedName() + "'.",
-                            getIResource(project, artifact), 222);
+                            getIResource(project, artifact), UNDEFINED_END_VIOLATION,  IMarker.SEVERITY_ERROR, assocArtifact.getZEnd());
         } else {
             zEndDefined = true;
         }
@@ -87,9 +96,9 @@
                 typeLabel = aEndType.getFullyQualifiedName();
             }
 
-            TigerstripeProjectAuditor.reportError(
+            TigerstripeProjectAuditor.reportProblem(
                     "The A End must be of a suitable Type. Association Ends may not be of type '" + typeLabel + "'.",
-                    getIResource(project, artifact), 222);
+                    getIResource(project, artifact), INVALID_END_VIOLATION , IMarker.SEVERITY_ERROR, ((IAssociationArtifact) artifact).getAEnd());
         }
         if (!AssociationEnd.isSuitableType(zEndType)) {
             String typeLabel = "";
@@ -98,9 +107,9 @@
             } else {
                 typeLabel = zEndType.getFullyQualifiedName();
             }
-            TigerstripeProjectAuditor.reportError(
+            TigerstripeProjectAuditor.reportProblem(
                     "The Z End must be of a suitable Type. Association Ends may not be of type '" + typeLabel + "'.",
-                    getIResource(project, artifact), 222);
+                    getIResource(project, artifact), INVALID_END_VIOLATION, IMarker.SEVERITY_ERROR, ((IAssociationArtifact) artifact).getZEnd());
         }
     }
 
@@ -114,19 +123,19 @@
                             "At least one "
                                     + artifact.getLabel()
                                     + " End must be navigable in '" + artifact.getFullyQualifiedName() + "'.",
-                            getIResource(project, artifact), 222);
+                            getIResource(project, artifact), NO_NAVIGABILITY_VIOLATION);
         }
     }
 
     /**
-     * Check that at least one end is navigable
+     * Check that .. 
      */
     private void checkAggregation(IProject project, IAssociationArtifact artifact) {
         if (artifact.getAEnd().getAggregation() != EAggregationEnum.NONE
                 && artifact.getZEnd().getAggregation() != EAggregationEnum.NONE) {
             TigerstripeProjectAuditor.reportError(
                     "Inconsistent Aggregation/Composition in '" + artifact.getFullyQualifiedName() + "'.",
-                    getIResource(project, artifact), 222);
+                    getIResource(project, artifact), BAD_AGGREGATION_VIOLATION);
         }
     }
 
@@ -191,7 +200,7 @@
         for (IStereotypeInstance instance : capable.getStereotypeInstances()) {
             if (instance instanceof UnresolvedStereotypeInstance) {
                 TigerstripeProjectAuditor.reportWarning("Stereotype '" + instance.getName() + "' on " + location
-                        + " not defined in the current profile", getIResource(project, artifact), 222);
+                        + " not defined in the current profile", getIResource(project, artifact), CommonArtifactAuditor.STEREOTYPE_NOT_DEFINED_VIOLATION);
             }
         }
     }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/CommonArtifactAuditor.java b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/CommonArtifactAuditor.java
index 6622817..376f947 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/CommonArtifactAuditor.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/CommonArtifactAuditor.java
@@ -44,6 +44,20 @@
 import org.eclipse.tigerstripe.workbench.profile.stereotype.IStereotypeInstance;
 
 public class CommonArtifactAuditor extends AbstractArtifactAuditor {
+    
+
+    public static final int DEFAULT_VALUE_VIOLATION = 100; // Error
+   
+    public static final int ARGUMENT_DEFAULT_VALUE_VIOLATION = 10; //Error
+    
+    public static final int STEREOTYPE_NOT_DEFINED_VIOLATION = 110; //Warning
+    public static final int STEREOTYPE_OVERRIDE_NOT_ALLOWED_VIOLATION = 111; //Error
+    
+    public static final int IMPLEMENTED_ARTIFACT_VIOLATION = 120; //Error
+    public static final int ABSTRACT_METHOD_ON_CONCRETE_ARTIFACT_VIOLATION = 121; //Error
+    public static final int SUPER_ARTIFACT_NOT_FOUND_VIOLATION = 122; //Error
+    public static final int INVALID_TYPE_HIERARCHY_VIOLATION = 123; //Error
+      
 
     @Override
     public void run(IProject project, IAbstractArtifact artifact, IProgressMonitor monitor) {
@@ -79,13 +93,16 @@
         }
     }
 
+    
+    
+    
     private static void checkAttributeDefaultValue(IAbstractArtifact artifact, IField attribute) {
         IStatus vStatus = isDefaultValueValid(attribute.getType(), attribute.getDefaultValue());
         if (!vStatus.isOK()) {
             TigerstripeProjectAuditor.reportProblem(
                     "Default value of '" + artifact.getFullyQualifiedName() + "." + attribute.getName()
                             + "' attribute is incorrect. " + vStatus.getMessage(),
-                    ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), 222, IMarker.SEVERITY_ERROR,
+                    ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), DEFAULT_VALUE_VIOLATION, IMarker.SEVERITY_ERROR,
                     attribute);
         }
     }
@@ -97,7 +114,7 @@
             TigerstripeProjectAuditor.reportProblem(
                     "Default value of '" + artifact.getFullyQualifiedName() + "." + method.getName()
                             + "' method is incorrect. " + vStatus.getMessage(),
-                    ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), 222, IMarker.SEVERITY_ERROR,
+                    ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), DEFAULT_VALUE_VIOLATION, IMarker.SEVERITY_ERROR,
                     method);
         }
     }
@@ -133,7 +150,7 @@
                                     + "' attribute is incorrect. Referenced enumeration '"
                                     + enumArtifact.getFullyQualifiedName() + "' doesn't contain '"
                                     + field.getDefaultValue() + "' literal.",
-                            ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), 222,
+                            ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), DEFAULT_VALUE_VIOLATION,
                             IMarker.SEVERITY_ERROR, field);
                 }
             }
@@ -159,14 +176,14 @@
                 TigerstripeProjectAuditor.reportProblem(
                         "Stereotype '" + instance.getName() + "' on " + location
                                 + " not defined in the current profile",
-                        getIResource(project, artifact), 222, IMarker.SEVERITY_WARNING, member);
+                        getIResource(project, artifact), STEREOTYPE_NOT_DEFINED_VIOLATION, IMarker.SEVERITY_WARNING, member);
             }
 
             if (instance instanceof IOverridenStereotypeInstance
                     && !instance.getCharacterizingStereotype().canOverride()) {
                 TigerstripeProjectAuditor.reportError("Overrride of stereotype ("
                         + instance.getCharacterizingStereotype().getName() + ") not allowed here ",
-                        getIResource(project, artifact), 222);
+                        getIResource(project, artifact), STEREOTYPE_OVERRIDE_NOT_ALLOWED_VIOLATION);
             }
         }
     }
@@ -184,7 +201,7 @@
                         + "'";
                 TigerstripeProjectAuditor.reportProblem(
                         "Stereotype " + instance.getName() + " on " + location + " not defined in the current profile",
-                        getIResource(project, artifact), 222, IMarker.SEVERITY_WARNING, method);
+                        getIResource(project, artifact), STEREOTYPE_NOT_DEFINED_VIOLATION, IMarker.SEVERITY_WARNING, method);
             }
         }
         for (IArgument argument : method.getArguments()) {
@@ -192,15 +209,15 @@
                 if (instance instanceof UnresolvedStereotypeInstance) {
                     String location = " argument '" + argument.getName() + "' of method '" + method.getName()
                             + "' of artifact '" + artifact.getName() + "'";
-                    TigerstripeProjectAuditor.reportProblem(
+                    TigerstripeProjectAuditor.reportArgumentProblem(
                             "Stereotype '" + instance.getName() + "' on '" + location
                                     + "' not defined in the current profile",
-                            getIResource(project, artifact), 222, IMarker.SEVERITY_WARNING, method);
+                            getIResource(project, artifact), STEREOTYPE_NOT_DEFINED_VIOLATION, IMarker.SEVERITY_WARNING, argument);
                 }
             }
         }
     }
-
+  
     private void checkImplementedArtifacts(IProject project, IAbstractArtifact artifact) {
         for (IAbstractArtifact art : artifact.getImplementedArtifacts()) {
             if (getTSProject(project) != null) {
@@ -209,7 +226,7 @@
                             .getArtifactByFullyQualifiedName(art.getFullyQualifiedName());
                     if (!(s instanceof ISessionArtifact)) {
                         TigerstripeProjectAuditor.reportError("Implemented artifact '" + art.getFullyQualifiedName()
-                                + "' is not a valid ISessionArtifact.", getIResource(project, artifact), 222);
+                                + "' is not a valid ISessionArtifact.", getIResource(project, artifact), IMPLEMENTED_ARTIFACT_VIOLATION);
                     }
                 } catch (TigerstripeException e) {
                     BasePlugin.log(e);
@@ -232,7 +249,7 @@
                 TigerstripeProjectAuditor.reportProblem(
                         "Method " + method.getName() + " is marked Abstract although "
                                 + artifact.getFullyQualifiedName() + " is not marked as Abstract.",
-                        getIResource(project, artifact), 222, IMarker.SEVERITY_ERROR, method);
+                        getIResource(project, artifact), ABSTRACT_METHOD_ON_CONCRETE_ARTIFACT_VIOLATION, IMarker.SEVERITY_ERROR, method);
             }
             checkStereotypes(project, artifact, method,
                     "method '" + method.getName() + "' of artifact '" + artifact.getName() + "'", method);
@@ -253,12 +270,12 @@
     private static void checkArgumentDefaultValue(IAbstractArtifact artifact, IMethod method, IArgument argument) {
         IStatus vStatus = isDefaultValueValid(argument.getType(), argument.getDefaultValue());
         if (!vStatus.isOK()) {
-            TigerstripeProjectAuditor.reportProblem(
+            TigerstripeProjectAuditor.reportArgumentProblem(
                     "Default value of argument '" + argument.getName() + "' in method '"
                             + artifact.getFullyQualifiedName() + "." + method.getName() + "' is incorrect. "
                             + vStatus.getMessage(),
-                    ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), 222, IMarker.SEVERITY_ERROR,
-                    method);
+                    ((IAbstractArtifactInternal) artifact).getAdapter(IResource.class), ARGUMENT_DEFAULT_VALUE_VIOLATION, IMarker.SEVERITY_ERROR,
+                    argument);
         }
     }
 
@@ -278,7 +295,7 @@
                 TigerstripeProjectAuditor.reportError(
                         "Super Artifact '" + superArtifact.getFullyQualifiedName() + "' of '"
                                 + artifact.getFullyQualifiedName() + "' cannot be resolved.",
-                        getIResource(project, artifact), 222);
+                        getIResource(project, artifact), SUPER_ARTIFACT_NOT_FOUND_VIOLATION);
             } else {
                 boolean eligableHierarhy = false;
                 if (Proxy.isProxyClass(superArtifact.getClass())) {
@@ -297,7 +314,7 @@
                     TigerstripeProjectAuditor.reportError(
                             "Invalid Type Hierarchy in '" + artifact.getFullyQualifiedName()
                                     + "'. Super-artifact should be of same type.",
-                            getIResource(project, artifact), 222);
+                            getIResource(project, artifact), INVALID_TYPE_HIERARCHY_VIOLATION);
                 }
             }
         }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/TigerstripeProjectAuditor.java b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/TigerstripeProjectAuditor.java
index 4bb1236..b08f5d1 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/TigerstripeProjectAuditor.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/builder/TigerstripeProjectAuditor.java
@@ -75,6 +75,8 @@
 import org.eclipse.tigerstripe.workbench.internal.preferences.PreferenceConstants;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IArtifactManagerSession;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IAssociationEnd;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IMethod.IArgument;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IModelComponent;
 import org.eclipse.tigerstripe.workbench.project.IModelReference;
 import org.eclipse.tigerstripe.workbench.project.IModifiableTigerstripeModelProject;
@@ -482,7 +484,7 @@
             IModelComponent model) {
         reportProblem(msg, srcFile, violation, severity, BuilderConstants.MARKER_ID, model);
     }
-
+    
     private static void reportProblem(String msg, IResource srcFile, int violation, int severity, String markerType,
             IModelComponent model) {
 
@@ -494,6 +496,7 @@
             IMarker marker = srcFile.createMarker(markerType);
             marker.setAttribute(IMarker.MESSAGE, msg);
             marker.setAttribute(IMarker.SEVERITY, severity);
+            marker.setAttribute("violation", violation);
 
             URI uri = model == null ? null : TigerstripeURIAdapterFactory.toURI(model);
             String location = uri == null ? srcFile.getLocationURI().toString() : uri.toString();
@@ -504,6 +507,34 @@
         }
     }
 
+    public static void reportArgumentProblem(String msg, IResource srcFile, int violation, int severity,
+            IArgument argument) {
+        reportArgumentProblem(msg, srcFile, violation, severity, BuilderConstants.MARKER_ID, argument);
+    }
+    
+    
+    public static void reportArgumentProblem(String msg, IResource srcFile, int violation, int severity, String markerType,
+            IArgument argument) {
+
+        if (srcFile == null) {
+            return;
+        }
+
+        try {
+            IMarker marker = srcFile.createMarker(markerType);
+            marker.setAttribute(IMarker.MESSAGE, msg);
+            marker.setAttribute(IMarker.SEVERITY, severity);
+            marker.setAttribute("violation", violation);
+
+            URI uri = argument == null ? null : TigerstripeURIAdapterFactory.toURI(argument);
+            String location = uri == null ? srcFile.getLocationURI().toString() : uri.toString();
+
+            marker.setAttribute(IMarker.LOCATION, location);
+        } catch (Exception e) {
+            BasePlugin.log(e);
+        }
+    }
+    
     public static boolean isTurnedOffForImport() {
         return turnedOffForImport.get();
     }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java b/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java
deleted file mode 100644
index 73ffee8..0000000
--- a/plugins/org.eclipse.tigerstripe.workbench.base/src/java/org/eclipse/tigerstripe/workbench/internal/core/util/Misc.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007,2018 Cisco Systems, Inc.
- * 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:
- *    E. Dillon (Cisco Systems, Inc.) - reformat for Code Open-Sourcing
- *******************************************************************************/
-package org.eclipse.tigerstripe.workbench.internal.core.util;
-
-/**
- * 
- * @author Eric Dillon
- * @since 1.1
- */
-public class Misc {
-
-	private final static String[] illegalStrings = { " ", ",", ";", ":", "'",
-			"\"", "(", ")", "{", "}", "[", "]", "*", "&", "^", "%", "$", "#",
-			"@", "!", "?", "<", ">", ".", "`", "~", "|", "/", "\\", "+", "=",
-			"-" };
-
-	/**
-	 * Since 1.1 no reference to java.lang.String anymore but rather to String
-	 * only
-	 * 
-	 * @param type
-	 * @return
-	 */
-	public static String removeJavaLangString(String type) {
-		if ("java.lang.String".equals(type))
-			return "String";
-		else
-			return type;
-	}
-
-	public static String removeIllegalCharacters(String name) {
-		String result = name;
-		// remove illegal characters
-		for (int i = 0; i < illegalStrings.length; i++) {
-			result = result.replace(illegalStrings[i], "");
-		}
-		return result;
-	}
-
-}
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributeDetailsPage.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributeDetailsPage.java
index c0385f0..8e0d265 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributeDetailsPage.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributeDetailsPage.java
@@ -12,7 +12,13 @@
 
 
 import java.net.URI;
+import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
@@ -21,16 +27,19 @@
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
 import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IField;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IModelComponent;
 import org.eclipse.tigerstripe.workbench.project.ITigerstripeModelProject;
 import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.undo.TextEditListener.IURIBaseProviderPage;
+import org.eclipse.tigerstripe.workbench.ui.internal.utils.AbstractModelInfoEditComponent;
 import org.eclipse.tigerstripe.workbench.ui.internal.utils.AttributeInfoEditComponent;
 import org.eclipse.ui.forms.IDetailsPage;
 import org.eclipse.ui.forms.IFormPart;
 import org.eclipse.ui.forms.IManagedForm;
 
-public class ArtifactAttributeDetailsPage implements IDetailsPage, IURIBaseProviderPage {
+public class ArtifactAttributeDetailsPage extends ArtifactComponentDetailsPage implements IDetailsPage, IURIBaseProviderPage {
 
     private final ArtifactAttributesSection master;
     private final boolean isReadOnly;
@@ -137,6 +146,7 @@
             }
 
             attributeInfoEditComponent.update();
+            master.updateDecorators();
         }
     }
 
@@ -183,4 +193,16 @@
         }
         return null;
     }
+
+    @Override
+    protected void updateDecorators(Map<String,List<IStatus>> statuses) {
+        attributeInfoEditComponent.updateDecorators(statuses);
+        
+    }
+
+    @Override
+    protected AbstractModelInfoEditComponent getInfoComponent() {
+        return attributeInfoEditComponent;
+    }
+    
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributesSection.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributesSection.java
index d0eca4a..033cafd 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributesSection.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactAttributesSection.java
@@ -13,11 +13,22 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaModelMarker;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
+import org.eclipse.tigerstripe.workbench.internal.builder.CommonArtifactAuditor;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IField;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IMember;
@@ -27,13 +38,15 @@
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.AttributeNameEditDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.IValuedDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormPage;
+import org.eclipse.tigerstripe.workbench.ui.internal.resources.Images;
 import org.eclipse.ui.forms.DetailsPart;
-import org.eclipse.ui.forms.IDetailsPage;
 import org.eclipse.ui.forms.widgets.ExpandableComposite;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 
 public final class ArtifactAttributesSection extends ModelComponentSectionPart
-        implements IArtifactComponentChangeListener {
+implements IArtifactComponentChangeListener {
+
+    private ArtifactAttributeDetailsPage  detailsPage;
 
     public ArtifactAttributesSection(TigerstripeFormPage page, Composite parent, FormToolkit toolkit,
             IArtifactFormLabelProvider labelProvider, IOssjArtifactFormContentProvider contentProvider, int style) {
@@ -84,7 +97,7 @@
 
     @Override
     protected void registerPages(final DetailsPart detailsPart) {
-        IDetailsPage detailsPage = new ArtifactAttributeDetailsPage(this, isReadonly());
+        detailsPage = new ArtifactAttributeDetailsPage(this, isReadonly());
         registerDetailsPage(detailsPart, detailsPage, IField.class);
     }
 
@@ -148,4 +161,26 @@
             return field.getName() + "(" + field.getContainingArtifact().getName() + ")";
         }
     }
+    
+    @Override
+    protected void updateDecorators(IMarker[] markers) {
+
+        // Here we still have markers
+        // The table of items is here.
+
+        setStatuses(getAllStatuses(getMembers(), markers));
+        getViewer().refresh();
+
+        // Here need to add stuff to the Table of items, and the details page.
+
+        // details page will take Statuses not markers.
+        detailsPage.updateDecorators(getStatuses());
+    }
+    
+    @Override
+    protected void updateDecorators() {
+        // assume we already have the statuses set...
+        detailsPage.updateDecorators(getStatuses());
+    } 
+    
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactComponentDetailsPage.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactComponentDetailsPage.java
new file mode 100644
index 0000000..a5fd419
--- /dev/null
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactComponentDetailsPage.java
@@ -0,0 +1,16 @@
+package org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.tigerstripe.workbench.ui.internal.utils.AbstractModelInfoEditComponent;
+
+public abstract class ArtifactComponentDetailsPage {
+
+    protected abstract AbstractModelInfoEditComponent getInfoComponent();
+    
+    protected abstract void updateDecorators(Map<String, List<IStatus>> statuses);
+    
+    
+}
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantDetailsPage.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantDetailsPage.java
index 07a23d0..ce7b1af 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantDetailsPage.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantDetailsPage.java
@@ -12,7 +12,13 @@
 
 
 import java.net.URI;
+import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
@@ -21,16 +27,19 @@
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
 import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.ILiteral;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IModelComponent;
 import org.eclipse.tigerstripe.workbench.project.ITigerstripeModelProject;
 import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.undo.TextEditListener.IURIBaseProviderPage;
+import org.eclipse.tigerstripe.workbench.ui.internal.utils.AbstractModelInfoEditComponent;
 import org.eclipse.tigerstripe.workbench.ui.internal.utils.ConstantInfoEditComponent;
 import org.eclipse.ui.forms.IDetailsPage;
 import org.eclipse.ui.forms.IFormPart;
 import org.eclipse.ui.forms.IManagedForm;
 
-public class ArtifactConstantDetailsPage implements IDetailsPage,
+public class ArtifactConstantDetailsPage extends ArtifactComponentDetailsPage implements IDetailsPage,
 		IURIBaseProviderPage {
 
 	private final ArtifactConstantsSection master;
@@ -179,6 +188,7 @@
 			}
 
 			constantInfoEditComponent.update();
+			master.updateDecorators();
 		}
 	}
 
@@ -190,4 +200,15 @@
 		return form;
 	}
 
+	@Override
+    protected void updateDecorators(Map<String, List<IStatus>> statuses) {
+	    constantInfoEditComponent.updateDecorators(statuses);
+        
+    }
+
+    @Override
+    protected AbstractModelInfoEditComponent getInfoComponent() {
+        return constantInfoEditComponent;
+    }
+	
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantsSection.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantsSection.java
index ce4c761..6c9ad4c 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantsSection.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactConstantsSection.java
@@ -16,9 +16,11 @@
 import java.util.HashSet;
 import java.util.List;
 
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.jface.layout.TableColumnLayout;
 import org.eclipse.jface.viewers.ColumnWeightData;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
@@ -40,140 +42,167 @@
 
 public final class ArtifactConstantsSection extends ModelComponentSectionPart {
 
-	public ArtifactConstantsSection(TigerstripeFormPage page, Composite parent, FormToolkit toolkit,
-			IArtifactFormLabelProvider labelProvider, IOssjArtifactFormContentProvider contentProvider, int style) {
-		super(page, parent, toolkit, labelProvider, contentProvider, ExpandableComposite.TWISTIE | style);
-	}
+    private ArtifactConstantDetailsPage  detailsPage;
 
-	@Override
-	protected String getSectionName() {
-		return "Constants";
-	}
+    public ArtifactConstantsSection(TigerstripeFormPage page, Composite parent, FormToolkit toolkit,
+            IArtifactFormLabelProvider labelProvider, IOssjArtifactFormContentProvider contentProvider, int style) {
+        super(page, parent, toolkit, labelProvider, contentProvider, ExpandableComposite.TWISTIE | style);
+    }
 
-	@Override
-	protected IValuedDialog getNameEditDialog(final IMember member, final IValuedDialog.DialogKind kind) {
-		return new ConstantNameEditDialog(getPage().getPartControl().getShell(), getIArtifact(), (ILiteral) member,
-				getCurrentLiteralValues(new ArrayList<String>(getViewer().getTable().getItems().length)), kind);
-	}
+    @Override
+    protected String getSectionName() {
+        return "Constants";
+    }
 
-	private List<String> getCurrentLiteralValues(List<String> values) {
-		for (TableItem item : getViewer().getTable().getItems()) {
-			values.add(((ILiteral) item.getData()).getValue());
-		}
-		return values;
-	}
+    @Override
+    protected IValuedDialog getNameEditDialog(final IMember member, final IValuedDialog.DialogKind kind) {
+        return new ConstantNameEditDialog(getPage().getPartControl().getShell(), getIArtifact(), (ILiteral) member,
+                getCurrentLiteralValues(new ArrayList<String>(getViewer().getTable().getItems().length)), kind);
+    }
 
-	@Override
-	protected void createMasterPart(final IManagedForm managedForm, Composite parent) {
-		super.createMasterPart(managedForm, parent);
+    private List<String> getCurrentLiteralValues(List<String> values) {
+        for (TableItem item : getViewer().getTable().getItems()) {
+            values.add(((ILiteral) item.getData()).getValue());
+        }
+        return values;
+    }
 
-		TableColumn valueColumn = new TableColumn(getViewer().getTable(), SWT.NULL);
-		valueColumn.setText("Value");
-		valueColumn.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				// determine new sort column and direction
-				TableColumn sortColumn = getViewer().getTable().getSortColumn();
-				TableColumn currentColumn = (TableColumn) e.widget;
-				int dir = getViewer().getTable().getSortDirection();
+    @Override
+    protected void createMasterPart(final IManagedForm managedForm, Composite parent) {
+        super.createMasterPart(managedForm, parent);
 
-				if (sortColumn == currentColumn) {
-					dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
-				} else {
-					getViewer().getTable().setSortColumn(currentColumn);
-					dir = SWT.UP;
-				}
+        TableColumn valueColumn = new TableColumn(getViewer().getTable(), SWT.NULL);
+        valueColumn.setText("Value");
+        valueColumn.addListener(SWT.Selection, new Listener() {
+            public void handleEvent(Event e) {
+                // determine new sort column and direction
+                TableColumn sortColumn = getViewer().getTable().getSortColumn();
+                TableColumn currentColumn = (TableColumn) e.widget;
+                int dir = getViewer().getTable().getSortDirection();
 
-				getViewer().getTable().setSortDirection(dir);
-				getViewer().setSorter(new Sorter(dir, getIArtifact()));
-				TableItem[] allItems = getViewer().getTable().getItems();
+                if (sortColumn == currentColumn) {
+                    dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
+                } else {
+                    getViewer().getTable().setSortColumn(currentColumn);
+                    dir = SWT.UP;
+                }
 
-				List<IMember> newMembers = new ArrayList<IMember>(allItems.length);
-				for (int i = 0; i < allItems.length; i++) {
-					IMember member = (ILiteral) allItems[i].getData();
-					if (membersInModel.contains(member)) {
-						newMembers.add(member);
-					}
-				}
-				setMembers(newMembers);
+                getViewer().getTable().setSortDirection(dir);
+                getViewer().setSorter(new Sorter(dir, getIArtifact()));
+                TableItem[] allItems = getViewer().getTable().getItems();
 
-				refresh();
-				updateMaster();
-				markPageModified();
-			}
-		});
-		((TableColumnLayout) getTableComposite().getLayout()).setColumnData(valueColumn,
-				new ColumnWeightData(50, false));
-	}
+                List<IMember> newMembers = new ArrayList<IMember>(allItems.length);
+                for (int i = 0; i < allItems.length; i++) {
+                    IMember member = (ILiteral) allItems[i].getData();
+                    if (membersInModel.contains(member)) {
+                        newMembers.add(member);
+                    }
+                }
+                setMembers(newMembers);
 
-	@Override
-	protected void registerPages(DetailsPart detailsPart) {
-		IDetailsPage detailsPage = new ArtifactConstantDetailsPage(this, isReadonly());
-		registerDetailsPage(detailsPart, detailsPage, ILiteral.class);
-	}
+                refresh();
+                updateMaster();
+                markPageModified();
+            }
+        });
+        ((TableColumnLayout) getTableComposite().getLayout()).setColumnData(valueColumn,
+                new ColumnWeightData(50, false));
+    }
 
-	@Override
-	protected boolean askAboutRemovingMembers(final int count) {
-		String message = "Do you really want to remove ";
-		message += (count > 1) ? "these " + count + " constants?" : "this constant?";
-		return Ask.aboutMemebersRemovingLiterals(getBody().getShell(), "Remove constant", message);
-	}
+    @Override
+    protected void registerPages(DetailsPart detailsPart) {
+        detailsPage = new ArtifactConstantDetailsPage(this, isReadonly());
+        registerDetailsPage(detailsPart, detailsPage, ILiteral.class);
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	protected void setMembers(List<IMember> members) {
-		getIArtifact().setLiterals((List<ILiteral>) (List<?>) members);
-	}
+    @Override
+    protected boolean askAboutRemovingMembers(final int count) {
+        String message = "Do you really want to remove ";
+        message += (count > 1) ? "these " + count + " constants?" : "this constant?";
+        return Ask.aboutMemebersRemovingLiterals(getBody().getShell(), "Remove constant", message);
+    }
 
-	@Override
-	protected List<IMember> getMembers() {
-		return new ArrayList<IMember>(getIArtifact().getLiterals());
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    protected void setMembers(List<IMember> members) {
+        getIArtifact().setLiterals((List<ILiteral>) (List<?>) members);
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	protected void removeMembers(List<IModelComponent> members) {
-		getIArtifact().removeLiterals((List<ILiteral>) (List<?>) members);
-	}
+    @Override
+    protected List<IMember> getMembers() {
+        return new ArrayList<IMember>(getIArtifact().getLiterals());
+    }
 
-	@Override
-	protected void updateButtons() {
-		updateButtons(new ArrayList<IMember>(getIArtifact().getLiterals()));
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    protected void removeMembers(List<IModelComponent> members) {
+        getIArtifact().removeLiterals((List<ILiteral>) (List<?>) members);
+    }
 
-	@Override
-	protected boolean isListenImplemented() {
-		return false;
-	}
+    @Override
+    protected void updateButtons() {
+        updateButtons(new ArrayList<IMember>(getIArtifact().getLiterals()));
+    }
 
-	@Override
-	protected Object[] getArtifactElements(final Collection<IAbstractArtifact> hierarchy) {
-		List<IMember> members = new ArrayList<IMember>();
-		for (IAbstractArtifact artifact : hierarchy) {
-			members.addAll(artifact.getLiterals());
-		}
-		return members.toArray();
-	}
+    @Override
+    protected boolean isListenImplemented() {
+        return false;
+    }
 
-	@Override
-	protected void initMembersInModel(final IAbstractArtifact artifact) {
-		if (artifact == null) {
-			return;
-		}
-		membersInModel = new HashSet<IMember>(artifact.getLiterals());
-	}
+    @Override
+    protected Object[] getArtifactElements(final Collection<IAbstractArtifact> hierarchy) {
+        List<IMember> members = new ArrayList<IMember>();
+        for (IAbstractArtifact artifact : hierarchy) {
+            members.addAll(artifact.getLiterals());
+        }
+        return members.toArray();
+    }
 
-	@Override
-	protected String getMemberColumnText(final Object obj, final int index) {
-		ILiteral literal = (ILiteral) obj;
-		switch (index) {
-		case 1:
-			return literal.getValue();
-		default:
-			if (membersInModel.contains(literal)) {
-				return literal.getLabelString();
-			} else {
-				return literal.getLabelString() + "(" + literal.getContainingArtifact().getName() + ")";
-			}
-		}
-	}
+    @Override
+    protected void initMembersInModel(final IAbstractArtifact artifact) {
+        if (artifact == null) {
+            return;
+        }
+        membersInModel = new HashSet<IMember>(artifact.getLiterals());
+    }
+
+    @Override
+    protected String getMemberColumnText(final Object obj, final int index) {
+        ILiteral literal = (ILiteral) obj;
+        switch (index) {
+        case 1:
+            return literal.getValue();
+        default:
+            if (membersInModel.contains(literal)) {
+                return literal.getLabelString();
+            } else {
+                return literal.getLabelString() + "(" + literal.getContainingArtifact().getName() + ")";
+            }
+        }
+    }
+
+    @Override
+    protected void updateDecorators(IMarker[] markers) {
+
+        // Here we still have markers
+        // The table of items is here.
+
+        setStatuses(getAllStatuses(getMembers(), markers));
+        getViewer().refresh();
+
+        // Here need to add stuff to the Table of items, and the details page.
+
+        // details page will take Statuses not markers.
+        detailsPage.updateDecorators(getStatuses());
+
+
+    }
+
+    @Override
+    protected void updateDecorators() {
+        // assume we already have the statuses set...
+        detailsPage.updateDecorators(getStatuses());
+    }
+
+
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodDetailsPage.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodDetailsPage.java
index f6ae50a..326c95b 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodDetailsPage.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodDetailsPage.java
@@ -12,7 +12,14 @@
 
 
 import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
@@ -21,11 +28,14 @@
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
 import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
+import org.eclipse.tigerstripe.workbench.internal.core.util.Misc;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IMethod;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IModelComponent;
 import org.eclipse.tigerstripe.workbench.project.ITigerstripeModelProject;
 import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.undo.TextEditListener.IURIBaseProviderPage;
+import org.eclipse.tigerstripe.workbench.ui.internal.utils.AbstractModelInfoEditComponent;
 import org.eclipse.tigerstripe.workbench.ui.internal.utils.IModifyCallback;
 import org.eclipse.tigerstripe.workbench.ui.internal.utils.MethodInfoEditComponent;
 import org.eclipse.ui.forms.IDetailsPage;
@@ -34,7 +44,10 @@
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
-public class ArtifactMethodDetailsPage implements IDetailsPage,
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.Type;
+
+public class ArtifactMethodDetailsPage extends ArtifactComponentDetailsPage implements IDetailsPage,
 		IURIBaseProviderPage {
 
 	private final ArtifactMethodsSection master;
@@ -199,6 +212,7 @@
 			}
 
 			methodInfoEditComponent.update();
+			master.updateDecorators();
 		}
 	}
 
@@ -209,4 +223,16 @@
 	public IManagedForm getForm() {
 		return form;
 	}
+	
+	@Override
+    protected void updateDecorators(Map<String, List<IStatus>> statuses) {
+	    methodInfoEditComponent.updateDecorators(statuses);
+        
+    }
+
+    @Override
+    protected AbstractModelInfoEditComponent getInfoComponent() {
+        return methodInfoEditComponent;
+    }
+    
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodsSection.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodsSection.java
index 6d4a616..2ab48da 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodsSection.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactMethodsSection.java
@@ -11,108 +11,312 @@
  *******************************************************************************/
 package org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts;
 
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaModelMarker;
+import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tigerstripe.workbench.TigerstripeException;
+import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
+import org.eclipse.tigerstripe.workbench.internal.builder.CommonArtifactAuditor;
+import org.eclipse.tigerstripe.workbench.internal.core.util.Misc;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IMember;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IMethod;
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IMethod.IArgument;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IModelComponent;
+import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
 import org.eclipse.tigerstripe.workbench.ui.internal.Ask;
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.IValuedDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.MethodNameEditDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormPage;
+import org.eclipse.tigerstripe.workbench.ui.internal.resources.Images;
 import org.eclipse.ui.forms.DetailsPart;
-import org.eclipse.ui.forms.IDetailsPage;
 import org.eclipse.ui.forms.widgets.ExpandableComposite;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 
+import com.thoughtworks.qdox.model.Type;
+
 public final class ArtifactMethodsSection extends ModelComponentSectionPart {
 
-	public ArtifactMethodsSection(TigerstripeFormPage page, Composite parent, FormToolkit toolkit,
-			IArtifactFormLabelProvider labelProvider, IOssjArtifactFormContentProvider contentProvider, int style) {
-		super(page, parent, toolkit, labelProvider, contentProvider, ExpandableComposite.TWISTIE | style);
-	}
+    private ArtifactMethodDetailsPage detailsPage;
 
-	@Override
-	protected String getSectionName() {
-		return "Methods";
-	}
+    public ArtifactMethodsSection(TigerstripeFormPage page, Composite parent, FormToolkit toolkit,
+            IArtifactFormLabelProvider labelProvider, IOssjArtifactFormContentProvider contentProvider, int style) {
+        super(page, parent, toolkit, labelProvider, contentProvider, ExpandableComposite.TWISTIE | style);
+    }
 
-	@Override
-	protected IValuedDialog getNameEditDialog(final IMember member, final IValuedDialog.DialogKind kind) {
-		return new MethodNameEditDialog(getPage().getPartControl().getShell(), getIArtifact(), (IMethod) member, kind);
-	}
+    @Override
+    protected String getSectionName() {
+        return "Methods";
+    }
 
-	@Override
-	protected void registerPages(DetailsPart detailsPart) {
-		IDetailsPage detailsPage = new ArtifactMethodDetailsPage(this, isReadonly());
-		registerDetailsPage(detailsPart, detailsPage, IMethod.class);
-	}
+    @Override
+    protected IValuedDialog getNameEditDialog(final IMember member, final IValuedDialog.DialogKind kind) {
+        return new MethodNameEditDialog(getPage().getPartControl().getShell(), getIArtifact(), (IMethod) member, kind);
+    }
 
-	@Override
-	protected boolean askAboutRemovingMembers(final int count) {
-		String message = "Do you really want to remove ";
-		message += (count > 1) ? "these " + count + " methods?" : "this method?";
-		return Ask.aboutMemebersRemovingMethods(getBody().getShell(), "Remove method", message);
-	}
+    @Override
+    protected void registerPages(DetailsPart detailsPart) {
+        detailsPage = new ArtifactMethodDetailsPage(this, isReadonly());
+        registerDetailsPage(detailsPart, detailsPage, IMethod.class);
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	protected void setMembers(List<IMember> members) {
-		getIArtifact().setMethods((List<IMethod>) (List<?>) members);
-	}
+    @Override
+    protected boolean askAboutRemovingMembers(final int count) {
+        String message = "Do you really want to remove ";
+        message += (count > 1) ? "these " + count + " methods?" : "this method?";
+        return Ask.aboutMemebersRemovingMethods(getBody().getShell(), "Remove method", message);
+    }
 
-	@Override
-	protected List<IMember> getMembers() {
-		return new ArrayList<IMember>(getIArtifact().getMethods());
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    protected void setMembers(List<IMember> members) {
+        getIArtifact().setMethods((List<IMethod>) (List<?>) members);
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	protected void removeMembers(List<IModelComponent> members) {
-		getIArtifact().removeMethods((List<IMethod>) (List<?>) members);
-	}
+    @Override
+    protected List<IMember> getMembers() {
+        return new ArrayList<IMember>(getIArtifact().getMethods());
+    }
 
-	@Override
-	protected void updateButtons() {
-		updateButtons(new ArrayList<IMember>(getIArtifact().getMethods()));
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    protected void removeMembers(List<IModelComponent> members) {
+        getIArtifact().removeMethods((List<IMethod>) (List<?>) members);
+    }
 
-	@Override
-	protected boolean isListenImplemented() {
-		return true;
-	}
+    @Override
+    protected void updateButtons() {
+        updateButtons(new ArrayList<IMember>(getIArtifact().getMethods()));
+    }
 
-	@Override
-	protected Object[] getArtifactElements(final Collection<IAbstractArtifact> hierarchy) {
-		List<IMember> members = new ArrayList<IMember>();
-		for (IAbstractArtifact artifact : hierarchy) {
-			members.addAll(artifact.getMethods());
-		}
-		return members.toArray();
-	}
+    @Override
+    protected boolean isListenImplemented() {
+        return true;
+    }
 
-	@Override
-	protected void initMembersInModel(final IAbstractArtifact artifact) {
-		if (artifact == null) {
-			return;
-		}
-		membersInModel = new HashSet<IMember>(artifact.getMethods());
-	}
+    @Override
+    protected Object[] getArtifactElements(final Collection<IAbstractArtifact> hierarchy) {
+        List<IMember> members = new ArrayList<IMember>();
+        for (IAbstractArtifact artifact : hierarchy) {
+            members.addAll(artifact.getMethods());
+        }
+        return members.toArray();
+    }
 
-	@Override
-	protected String getMemberColumnText(final Object obj, final int index) {
-		final IMethod method = (IMethod) obj;
-		if (membersInModel.contains(method)) {
-			return method.getLabelString(false);
-		} else {
-			IAbstractArtifact containingArtifact = method.getContainingArtifact();
-			return method.getLabelString(false)
-					+ (containingArtifact == null ? "" : "(" + containingArtifact.getName() + ")");
-		}
-	}
+    @Override
+    protected void initMembersInModel(final IAbstractArtifact artifact) {
+        if (artifact == null) {
+            return;
+        }
+        membersInModel = new HashSet<IMember>(artifact.getMethods());
+    }
+
+    @Override
+    protected String getMemberColumnText(final Object obj, final int index) {
+        final IMethod method = (IMethod) obj;
+        if (membersInModel.contains(method)) {
+            return method.getLabelString(false);
+        } else {
+            IAbstractArtifact containingArtifact = method.getContainingArtifact();
+            return method.getLabelString(false)
+                    + (containingArtifact == null ? "" : "(" + containingArtifact.getName() + ")");
+        }
+    }
+
+    @Override
+    protected Image getErrorIcon(IModelComponent component) {
+
+        // Need to get the highest level problem for this model component.
+        List<IStatus> componenetStatuses;
+        try {
+            componenetStatuses = statuses.get(TigerstripeURIAdapterFactory.toURI((IMethod) component).getFragment());
+
+            IStatus status = getHighestSeverityStatus(componenetStatuses, IStatus.WARNING);
+            if (status != null) {
+                switch (status.getSeverity()) {
+                case IStatus.ERROR :
+                    return Images.get("status_error.gif");
+                case IStatus.WARNING :
+                    return Images.get("status_warning.gif");
+                }
+            }
+            return null;
+        } catch (TigerstripeException e) {
+            return null;
+        }
+    } 
+
+
+    @Override
+    protected void updateDecorators(IMarker[] markers) {
+        // Here we still have markers
+        // The table of items is here.
+
+        setStatuses(getAllStatuses(getMembers(), markers));
+        getViewer().refresh();
+
+        // Here need to add stuff to the Table of items, and the details page.
+
+        // details page will take Statuses not markers.
+        detailsPage.updateDecorators(getStatuses());
+
+
+    }
+
+    @Override
+    protected void updateDecorators() {
+        // assume we already have the statuses set...
+        detailsPage.updateDecorators(getStatuses());
+    }
+
+    @Override
+    public Map<String,List<IStatus>> getAllStatuses(List<IMember> members, IMarker[] markers) {
+        Map<String,List<IStatus>> statuses = new HashMap<>();
+
+        List<URI> memberURIs = new ArrayList<>();
+        for (IMember member : members) {
+            if (member instanceof IMethod) {
+                try {
+                    memberURIs.add(TigerstripeURIAdapterFactory.toURI((IMethod) member));
+                } catch (TigerstripeException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+            }
+        }
+
+
+        for (IMarker marker : markers) {
+            Map<String, Object> attribs;
+            try { 
+                attribs = marker.getAttributes();
+            } catch (CoreException e) {
+                EclipsePlugin.log(e);
+                return statuses;
+            }
+
+            int sev = 0;
+            if (attribs.containsKey(IMarker.SEVERITY)) {
+                sev = (Integer) attribs.get(IMarker.SEVERITY);
+                if ( sev < IMarker.SEVERITY_WARNING) {
+                    // ignore infos
+                    continue;
+                }
+            }
+
+            String location = "";
+            String subLocation = "";
+            // These are TS URIs from the TS auditor
+            if (attribs.containsKey(IMarker.LOCATION)) {
+                location = (String) attribs.get(IMarker.LOCATION);
+
+                if (location.startsWith(TigerstripeURIAdapterFactory.SCHEME_TS) && location.contains(TigerstripeURIAdapterFactory.COMPONENT_SEPERATOR)) {
+                    location = location.substring(location.indexOf(TigerstripeURIAdapterFactory.COMPONENT_SEPERATOR) + 1);
+                    for (URI uri : memberURIs) {
+
+                        String signature = uri.getFragment();
+
+                        String argDetail = StringUtils.EMPTY;
+                        // the fragment MAY have an argument detail at the end.
+                        if (location.contains(TigerstripeURIAdapterFactory.ARGUMENT_SEPERATOR)) {
+                            argDetail = location.substring(location.indexOf(TigerstripeURIAdapterFactory.ARGUMENT_SEPERATOR)+TigerstripeURIAdapterFactory.ARGUMENT_SEPERATOR.length());
+                            location = signature.substring(0,location.indexOf(TigerstripeURIAdapterFactory.ARGUMENT_SEPERATOR));
+                        }
+
+                        if (signature.equals(location)) {
+                            if (! StringUtils.isEmpty(argDetail)) {
+                                subLocation="arg:"+argDetail;
+                            } else if (attribs.containsKey("violation")) {
+                                int violation =  ((Integer) attribs.get("violation")).intValue();
+                                switch (violation) {
+                                case CommonArtifactAuditor.DEFAULT_VALUE_VIOLATION :
+                                    subLocation = "default";
+                                    break;
+
+                                }
+                            }
+
+                            addStatus(statuses,location,new ComponentStatus(sev*2, EclipsePlugin.PLUGIN_ID, marker.getAttribute(IMarker.MESSAGE, ""), subLocation));
+                        } 
+                    }
+
+                }
+            } else {
+
+                // and look for Java Markers
+                for (IMember member : members) {
+                    String subComponent = isMarkerForComponent(marker, (IModelComponent) member);
+                    // Assume anything else is due to a Java type marker.
+                    if (! subComponent.isEmpty()) {
+                        String signature;
+                        try {
+                            signature = TigerstripeURIAdapterFactory.toURI((IMethod) member).getFragment();
+                            addStatus(statuses,signature, new ComponentStatus(sev*2, EclipsePlugin.PLUGIN_ID, marker.getAttribute(IMarker.MESSAGE, ""), subComponent));
+                        } catch (TigerstripeException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        }
+
+                    }
+                }  
+            }
+
+        }
+        return statuses;
+    }
+
+    @Override
+    protected String isMarkerForComponent(IMarker marker, IModelComponent component) {
+        IMethod method = (IMethod) component;
+
+        try {
+            if (marker.getType().equals(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER)) {
+                int markerLineNumber = marker.getAttribute("lineNumber",-1);
+
+                List<Type> argTypes = new ArrayList();
+                for (IArgument arg : method.getArguments()) {
+                    String  fqn = arg.getType().getFullyQualifiedName();
+                    fqn = Misc.replaceJavaLangString(fqn);
+                    argTypes.add( new Type(fqn));
+                }
+
+                int componentLineNumber = ((IAbstractArtifact) component.getContainingModelComponent()).getJavaSource().getClasses()[0].
+                        getMethodBySignature(component.getName(), argTypes.toArray( new Type[0])).getLineNumber();
+
+                if (componentLineNumber == markerLineNumber) {
+                    return "type";
+                }
+
+                // could be for an argument...
+                // Lets assume we WON'T reformat the templates..
+                // args are on lines 1, 4, 7 ...
+                int i=0;
+
+                for (IArgument arg : method.getArguments()) {
+                    int offset = (i*3) + 1;
+                    if (componentLineNumber+offset == markerLineNumber) {
+                        return "arg:"+arg.getName();
+                    }
+                    i++;
+                }
+
+            }
+        } catch (Exception e) {
+            // just return false
+        }
+        return StringUtils.EMPTY;
+    }
+
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactOverviewPage.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactOverviewPage.java
index 97305ca..23956ea 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactOverviewPage.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactOverviewPage.java
@@ -23,6 +23,7 @@
 import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormPage;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeSectionPart;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.association.AssociationSpecificsSection;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.datatype.DatatypeArtifactEditor;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.entity.EntityArtifactEditor;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.enumeration.EnumArtifactEditor;
@@ -46,213 +47,246 @@
 
 public class ArtifactOverviewPage extends TigerstripeFormPage implements IResourceChangeListener {
 
-	private IArtifactFormLabelProvider labelProvider;
+    private IArtifactFormLabelProvider labelProvider;
 
-	private IOssjArtifactFormContentProvider contentProvider;
+    private IOssjArtifactFormContentProvider contentProvider;
 
-	private ArtifactStereotypesSection artifactStereotypesSection;
+    private ArtifactStereotypesSection artifactStereotypesSection;
+    private ArtifactAttributesSection artifactAttributesSection;
+    private ArtifactConstantsSection artifactConstantsSection;
+    private ArtifactMethodsSection artifactMethodsSection;
+    private TigerstripeSectionPart specificsSection;
 
-	private IManagedForm managedForm;
+    private IManagedForm managedForm;
 
-	public static final String PAGE_ID = "ossj.entity.overview"; //$NON-NLS-1$
+    public static final String PAGE_ID = "ossj.entity.overview"; //$NON-NLS-1$
 
 
-	public ArtifactOverviewPage(FormEditor editor,
-			IArtifactFormLabelProvider labelProvider,
-			IOssjArtifactFormContentProvider contentProvider) {
-		super(editor, PAGE_ID, "Overview");
-		this.labelProvider = labelProvider;
-		this.contentProvider = contentProvider;
-	}
+    public ArtifactOverviewPage(FormEditor editor,
+            IArtifactFormLabelProvider labelProvider,
+            IOssjArtifactFormContentProvider contentProvider) {
+        super(editor, PAGE_ID, "Overview");
+        this.labelProvider = labelProvider;
+        this.contentProvider = contentProvider;
+    }
 
-	public ArtifactOverviewPage(FormEditor editor) {
-		super(editor, PAGE_ID, "Overview");
-	}
+    public ArtifactOverviewPage(FormEditor editor) {
+        super(editor, PAGE_ID, "Overview");
+    }
 
-	@Override
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		this.managedForm = managedForm;
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = managedForm.getToolkit();
-		ISelectionProvider selectionProvider = new SelectionProviderIntermediate();
-		getSite().setSelectionProvider(selectionProvider);
+    @Override
+    protected void createFormContent(IManagedForm managedForm) {
+        super.createFormContent(managedForm);
+        this.managedForm = managedForm;
+        ScrolledForm form = managedForm.getForm();
+        FormToolkit toolkit = managedForm.getToolkit();
+        ISelectionProvider selectionProvider = new SelectionProviderIntermediate();
+        getSite().setSelectionProvider(selectionProvider);
 
-		// Navid Mehregani: If there are serious compile issues in the file,  QDOX won't be able to parse it, thus we need to open the 
-		// Java editor instead so user can fix the compile issues.
-		if (contentProvider==null || labelProvider==null) {
-			form.setText("Tigerstripe Artifact Editor");
-			Composite body = form.getBody();
-			body.setLayout(new GridLayout());			
-			FormText rtext = toolkit.createFormText(body, false);
-			rtext.setText("<p>There seems to be an error with this file.  Please try opening it with Java editor:</p>", true, false);
+        // Navid Mehregani: If there are serious compile issues in the file,  QDOX won't be able to parse it, thus we need to open the 
+        // Java editor instead so user can fix the compile issues.
+        if (contentProvider==null || labelProvider==null) {
+            form.setText("Tigerstripe Artifact Editor");
+            Composite body = form.getBody();
+            body.setLayout(new GridLayout());			
+            FormText rtext = toolkit.createFormText(body, false);
+            rtext.setText("<p>There seems to be an error with this file.  Please try opening it with Java editor:</p>", true, false);
 
-		} else {
-			form.setText(contentProvider.getText(IArtifactFormContentProvider.ARTIFACT_OVERVIEW_TITLE));
+        } else {
+            form.setText(contentProvider.getText(IArtifactFormContentProvider.ARTIFACT_OVERVIEW_TITLE));
 
-			// Navid Mehregani: Used for populating the header with error information
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_BUILD);
+            // Navid Mehregani: Used for populating the header with error information
+            ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_BUILD);
 
-			fillBody(managedForm, toolkit);
-		}		
-	}
+            fillBody(managedForm, toolkit);
+        }		
+    }
 
-	@Override
-	public void refresh() {
-		if (managedForm != null) {
-			managedForm.refresh();
-		}
-	}
+    @Override
+    public void refresh() {
+        if (managedForm != null) {
+            managedForm.refresh();
+        }
+    }
 
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-		body.setLayout(TigerstripeLayoutFactory.createClearTableWrapLayout(1,
-				false));
-		body.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+    private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
+        Composite body = managedForm.getForm().getBody();
+        body.setLayout(TigerstripeLayoutFactory.createClearTableWrapLayout(1,
+                false));
+        body.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-		updateErrorMessage();
 
-		Composite composite = toolkit.createComposite(body);
-		composite.setLayout(TigerstripeLayoutFactory.createPageTableWrapLayout(
-				2, true));
-		composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-		TigerstripeSectionPart part = new ArtifactGeneralInfoSection(this,
-				composite, toolkit, labelProvider, contentProvider);
-		managedForm.addPart(part);
+        Composite composite = toolkit.createComposite(body);
+        composite.setLayout(TigerstripeLayoutFactory.createPageTableWrapLayout(
+                2, true));
+        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-		part = new ArtifactContentSection(this, composite, toolkit,
-				labelProvider, contentProvider);
-		managedForm.addPart(part);
+        TigerstripeSectionPart part = new ArtifactGeneralInfoSection(this,
+                composite, toolkit, labelProvider, contentProvider);
+        managedForm.addPart(part);
 
-		composite = toolkit.createComposite(body);
-		composite.setLayout(TigerstripeLayoutFactory.createPageTableWrapLayout(
-				2, false));
-		composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+        part = new ArtifactContentSection(this, composite, toolkit,
+                labelProvider, contentProvider);
+        managedForm.addPart(part);
 
-		artifactStereotypesSection = new ArtifactStereotypesSection(this, composite, toolkit,
-				labelProvider, contentProvider);
-		managedForm.addPart(artifactStereotypesSection);
+        composite = toolkit.createComposite(body);
+        composite.setLayout(TigerstripeLayoutFactory.createPageTableWrapLayout(
+                2, false));
+        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-		composite = toolkit.createComposite(body);
-		composite.setLayout(TigerstripeLayoutFactory.createPageTableWrapLayout(
-				2, false));
-		composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+        artifactStereotypesSection = new ArtifactStereotypesSection(this, composite, toolkit,
+                labelProvider, contentProvider);
+        managedForm.addPart(artifactStereotypesSection);
 
-		if (contentProvider.hasSpecifics()) {
-			part = contentProvider.getSpecifics(this, composite, toolkit);
-			managedForm.addPart(part);
-		}
+        composite = toolkit.createComposite(body);
+        composite.setLayout(TigerstripeLayoutFactory.createPageTableWrapLayout(
+                2, false));
+        composite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-		if (contentProvider.hasAttributes()) {
-			part = new ArtifactAttributesSection(this, composite, toolkit,
-					labelProvider, contentProvider, getAttributesStyle());
-			managedForm.addPart(part);
-		}
+        if (contentProvider.hasSpecifics()) {
+            specificsSection = contentProvider.getSpecifics(this, composite, toolkit);
+            managedForm.addPart(specificsSection);
+        }
 
-		if (contentProvider.hasConstants()) {
-			part = new ArtifactConstantsSection(this, composite, toolkit,
-					labelProvider, contentProvider, getConstantsStyle());
+        if (contentProvider.hasAttributes()) {
+            artifactAttributesSection = new ArtifactAttributesSection(this, composite, toolkit,
+                    labelProvider, contentProvider, getAttributesStyle());
+            managedForm.addPart(artifactAttributesSection);
+        }
 
-			// see bug #77
-			// See #90 no need to set up setForcedType anymore. So #77 is kinda
-			// undone.
+        if (contentProvider.hasConstants()) {
+            artifactConstantsSection = new ArtifactConstantsSection(this, composite, toolkit,
+                    labelProvider, contentProvider, getConstantsStyle());
 
-			managedForm.addPart(part);
-		}
+            // see bug #77
+            // See #90 no need to set up setForcedType anymore. So #77 is kinda
+            // undone.
 
-		if (contentProvider.hasMethods()) {
-			part = new ArtifactMethodsSection(this, composite, toolkit,
-					labelProvider, contentProvider, getMethodsStyle());
-			managedForm.addPart(part);
-		}
-	}
+            managedForm.addPart(artifactConstantsSection);
+        }
 
-	private int getAttributesStyle() {
-		if (getEditor() instanceof EntityArtifactEditor
-				|| getEditor() instanceof DatatypeArtifactEditor
-				|| getEditor() instanceof ExceptionArtifactEditor
-				|| getEditor() instanceof QueryArtifactEditor
-				|| getEditor() instanceof UpdateProcedureArtifactEditor
-				|| getEditor() instanceof EventArtifactEditor) {
-			return ExpandableComposite.EXPANDED;
-		}
-		return ExpandableComposite.COMPACT;
-	}
+        if (contentProvider.hasMethods()) {
+            artifactMethodsSection = new ArtifactMethodsSection(this, composite, toolkit,
+                    labelProvider, contentProvider, getMethodsStyle());
+            managedForm.addPart(artifactMethodsSection);
+        }
 
-	private int getMethodsStyle() {
+        updateErrorMessage();
+    }
 
-		if (getEditor() instanceof SessionArtifactEditor) {
-			return ExpandableComposite.EXPANDED;
-		}
-		return ExpandableComposite.COMPACT;
-	}
+    private int getAttributesStyle() {
+        if (getEditor() instanceof EntityArtifactEditor
+                || getEditor() instanceof DatatypeArtifactEditor
+                || getEditor() instanceof ExceptionArtifactEditor
+                || getEditor() instanceof QueryArtifactEditor
+                || getEditor() instanceof UpdateProcedureArtifactEditor
+                || getEditor() instanceof EventArtifactEditor) {
+            return ExpandableComposite.EXPANDED;
+        }
+        return ExpandableComposite.COMPACT;
+    }
 
-	private int getConstantsStyle() {
-		if (getEditor() instanceof EnumArtifactEditor) {
-			return ExpandableComposite.EXPANDED;
-		}
-		return ExpandableComposite.COMPACT;
-	}
+    private int getMethodsStyle() {
 
-	public void resourceChanged(IResourceChangeEvent event) {
+        if (getEditor() instanceof SessionArtifactEditor) {
+            return ExpandableComposite.EXPANDED;
+        }
+        return ExpandableComposite.COMPACT;
+    }
 
-		if (event.getType() == IResourceChangeEvent.POST_BUILD) {
-		    // TODO - Check resource is in change delta before updating error message.
-			updateErrorMessage();
-		}
-	}
+    private int getConstantsStyle() {
+        if (getEditor() instanceof EnumArtifactEditor) {
+            return ExpandableComposite.EXPANDED;
+        }
+        return ExpandableComposite.COMPACT;
+    }
 
-	private void updateErrorMessage() {
-		IEditorInput editorInput = getEditor().getEditorInput();
-		if (editorInput instanceof IFileEditorInput) {
-			IFile file = ((IFileEditorInput)editorInput).getFile();
+    public void resourceChanged(IResourceChangeEvent event) {
 
-			if ((file != null) && (file.exists())) {
-				try {
-					IMarker[] markers = file.findMarkers(IMarker.PROBLEM, true,	IResource.DEPTH_INFINITE);
+        if (event.getType() == IResourceChangeEvent.POST_BUILD) {
+            // TODO - Check resource is in change delta before updating error message.
+            updateErrorMessage();
+        }
+    }
 
-					boolean errorsDetected = false;
-					if (markers!=null) {
-						for (int i=0; i < markers.length; i++) {
-							if (IMarker.SEVERITY_ERROR == markers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO)) {
-								final Object errorMessage = markers[i].getAttribute(IMarker.MESSAGE);
-								if ((errorMessage instanceof String) && (((String)errorMessage).length()>0)) {
-									PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-										public void run() {
-											if (!managedForm.getForm().isDisposed())
-												managedForm.getForm().setMessage("Error Detected: " + (String)errorMessage, IMessageProvider.ERROR);		
-										}
-									});
+    protected void updateErrorMessage() {
+        IEditorInput editorInput = getEditor().getEditorInput();
+        if (editorInput instanceof IFileEditorInput) {
+            IFile file = ((IFileEditorInput)editorInput).getFile();
 
-									errorsDetected = true;
-									break;
-								}
-							}
-						}
-					}
+            if ((file != null) && (file.exists())) {
+                try {
+                    IMarker[] markers = file.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
 
-					if (!errorsDetected) {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								if (!managedForm.getForm().isDisposed())
-									managedForm.getForm().setMessage("", IMessageProvider.NONE);
-							}
-						});
-					}
+                    boolean errorsDetected = false;
+                    if (markers!=null) {
 
-				} catch (Exception e) {
-					EclipsePlugin.logErrorMessage("Could not update header with error status", e);
-				}
-			}
-		}
-	}
+                        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+                            public void run() {
+                                if (artifactAttributesSection != null && !artifactAttributesSection.isDisposed()) {
+                                    artifactAttributesSection.updateDecorators(markers);
+                                }
+                                if (artifactConstantsSection != null && !artifactConstantsSection.isDisposed()) {
+                                    artifactConstantsSection.updateDecorators(markers);
+                                }
+                                if (artifactMethodsSection != null && !artifactMethodsSection.isDisposed()) {
+                                    artifactMethodsSection.updateDecorators(markers);
+                                }
+                                if (specificsSection != null && specificsSection instanceof AssociationSpecificsSection) {
+                                    AssociationSpecificsSection associationSpecificsSection = (AssociationSpecificsSection) specificsSection;
+                                    if ( ! associationSpecificsSection.isDisposed()) {
+                                        associationSpecificsSection.updateDecorators(markers);
+                                    }
+                                }
+                            }
+                        });
 
-	@Override
-	public void dispose() {
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-		super.dispose();
-	}
+
+
+                        for (int i=0; i < markers.length; i++) {
+                            if (IMarker.SEVERITY_ERROR == markers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO)) {
+                                final Object errorMessage = markers[i].getAttribute(IMarker.MESSAGE);
+                                if ((errorMessage instanceof String) && (((String)errorMessage).length()>0)) {
+                                    PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+                                        public void run() {
+                                            if (!managedForm.getForm().isDisposed())
+                                                managedForm.getForm().setMessage("Error Detected: " + (String)errorMessage, IMessageProvider.ERROR);
+
+                                        }
+                                    });
+
+                                    errorsDetected = true;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+
+                    if (!errorsDetected) {
+                        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+                            public void run() {
+                                if (!managedForm.getForm().isDisposed())
+                                    managedForm.getForm().setMessage("", IMessageProvider.NONE);
+                            }
+                        });
+                    }
+
+
+
+
+                } catch (Exception e) {
+                    EclipsePlugin.logErrorMessage("Could not update header with error status", e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void dispose() {
+        ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+        super.dispose();
+    }
 
 
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactSectionPart.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactSectionPart.java
index f39cc22..a6cdfaf 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactSectionPart.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ArtifactSectionPart.java
@@ -10,30 +10,37 @@
  *******************************************************************************/
 package org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
+import org.apache.commons.lang.WordUtils;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
-import org.eclipse.tigerstripe.workbench.internal.api.model.IArtifactChangeListener;
 import org.eclipse.tigerstripe.workbench.model.HierarchyWalker;
 import org.eclipse.tigerstripe.workbench.model.IContextProjectAware;
 import org.eclipse.tigerstripe.workbench.model.ModelUtils;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IArtifactManagerSession;
-import org.eclipse.tigerstripe.workbench.model.deprecated_.IArtifactManagerSessionInternal;
-import org.eclipse.tigerstripe.workbench.project.ITigerstripeModelProject;
 import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormPage;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeSectionPart;
 import org.eclipse.tigerstripe.workbench.ui.internal.views.explorerview.actions.TSOpenAction;
+import org.eclipse.ui.ISharedImages;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.forms.widgets.ExpandableComposite;
@@ -41,6 +48,8 @@
 
 public abstract class ArtifactSectionPart extends TigerstripeSectionPart {
 
+    public static final int MAX_LINE_LENGTH = 120;
+
     protected final Map<String, IAbstractArtifact> updatedArtifacts = new HashMap<>();
 
 
@@ -195,4 +204,88 @@
         }
     }
 
+
+    public static ControlDecoration decorate(Control control) {
+        return new ControlDecoration(control, SWT.LEFT | SWT.CENTER);
+    }
+
+    /**
+     * For the given control decoration, and status, will update the decorator to
+     * reflect the given status. The decoration icon will be chosen based on the
+     * severity of the status, and the decoration text will be the message of the
+     * status.
+     *
+     * @param decorator - the decorator to update, must not be <code>null</code>.
+     * @param status    - The status to set on the decoration. Can be
+     *                  <code>null</code> or OK Status to hide the decoration.
+     */
+    public static IStatus updateDecoratorStatus(@NonNull ControlDecoration decorator, IStatus status) {
+
+        if (status == null || status.isOK()) {
+            decorator.hide();
+        } else {
+            switch (status.getSeverity()) {
+            case IStatus.INFO:
+            case IStatus.OK:
+                decorator.setImage(
+                        PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_INFO_TSK));
+                break;
+            case IStatus.WARNING:
+                decorator.setImage(
+                        PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEC_FIELD_WARNING));
+                break;
+            default:
+                decorator.setImage(
+                        PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_DEC_FIELD_ERROR));
+            }
+            decorator.setDescriptionText(wrapString(status.getMessage()));
+            decorator.show();
+        }
+        return status == null ? Status.OK_STATUS : status;
+    }
+
+
+    public static void updateDecorator(List<IStatus> statuses, String key, ControlDecoration controlDecoration) {
+
+        if (statuses == null) {
+            // This should clear any existing decorations
+            ArtifactSectionPart.updateDecoratorStatus(controlDecoration, Status.OK_STATUS);
+            return;
+        }
+        List<IStatus> localstatuses = statuses.stream().filter(ComponentStatus.class::isInstance)
+                .map(ComponentStatus.class::cast).filter(st -> st.getSubComponent().equals(key))
+                .collect(Collectors.toList());
+
+        ArtifactSectionPart.updateDecoratorStatus(controlDecoration,
+                ArtifactAttributesSection.getHighestSeverityStatus(localstatuses, 2));
+
+    }
+
+    public static IStatus getHighestSeverityStatus(List<IStatus> statuses, int minimumSeverity) {
+        if (statuses == null) {
+            return Status.OK_STATUS;
+        }
+        IStatus highest = null;
+        int highSeverity = minimumSeverity-1;
+        for (IStatus status : statuses) {
+            if (status.getSeverity() > highSeverity) {
+                highSeverity = status.getSeverity();
+                highest = status;
+            }
+        }
+        
+        return highest;
+    }
+    
+    public static void addStatus(Map<String,List<IStatus>> map, String name, ComponentStatus newStatus) {
+        if (! map.containsKey(name)) {
+            map.put(name, new ArrayList());
+        }
+        map.get(name).add(newStatus);
+    }
+
+    public static String wrapString(String line) {
+        return WordUtils.wrap(line, MAX_LINE_LENGTH);
+    }
+
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ComponentStatus.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ComponentStatus.java
new file mode 100644
index 0000000..1cf0e68
--- /dev/null
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ComponentStatus.java
@@ -0,0 +1,20 @@
+package org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts;
+
+import org.eclipse.core.runtime.Status;
+
+public class ComponentStatus extends Status {
+
+    private String subComponent;
+    
+    public ComponentStatus(int severity, String pluginId, String message, String subComponent) {
+        super(severity, pluginId, message);
+        this.subComponent = subComponent;
+    }
+
+    public String getSubComponent() {
+        return subComponent;
+    }
+
+    
+    
+}
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/EndSection.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/EndSection.java
index cdc726d..7763312 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/EndSection.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/EndSection.java
@@ -17,6 +17,8 @@
 
 public abstract class EndSection extends ArtifactSectionPart {
 
+    private boolean disposed = false;
+    
 	public EndSection(TigerstripeFormPage page, Composite parent,
 			FormToolkit toolkit, IArtifactFormLabelProvider labelProvider,
 			IOssjArtifactFormContentProvider contentProvider, int style) {
@@ -25,4 +27,15 @@
 
 	public abstract void selectEndByEnd(String end);
 
+    @Override
+    public void dispose() {
+        super.dispose();
+        disposed = true;
+    }
+
+    public boolean isDisposed() {
+        return disposed;
+    }
+	
+	
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ModelComponentSectionPart.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ModelComponentSectionPart.java
index 11c8d48..aa5d611 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ModelComponentSectionPart.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/ModelComponentSectionPart.java
@@ -22,10 +22,19 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jface.dialogs.StatusDialog;
 import org.eclipse.jface.layout.TableColumnLayout;
 import org.eclipse.jface.viewers.ColumnWeightData;
@@ -63,6 +72,7 @@
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
 import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
 import org.eclipse.tigerstripe.workbench.internal.api.model.IArtifactChangeListener;
+import org.eclipse.tigerstripe.workbench.internal.builder.CommonArtifactAuditor;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IAbstractArtifact;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IArtifactManagerSession;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IArtifactManagerSessionInternal;
@@ -74,6 +84,7 @@
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormEditor;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormPage;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.undo.ModelUndoableEdit;
+import org.eclipse.tigerstripe.workbench.ui.internal.resources.Images;
 import org.eclipse.tigerstripe.workbench.ui.internal.utils.TigerstripeLayoutFactory;
 import org.eclipse.tigerstripe.workbench.ui.internal.utils.Utils;
 import org.eclipse.ui.IWorkbenchSite;
@@ -103,23 +114,37 @@
     private DetailsPart detailsPart;
     private TableViewer viewer;
     private Composite tableComposite;
+    
+    private boolean disposed = false;
 
     protected Set<IMember> membersInModel = Collections.emptySet();
-    
+    protected Map<String, List<IStatus>> statuses;
 
     public ModelComponentSectionPart(TigerstripeFormPage page, Composite parent, FormToolkit toolkit,
             IArtifactFormLabelProvider labelProvider, IOssjArtifactFormContentProvider contentProvider, int style) {
         super(page, parent, toolkit, labelProvider, contentProvider, style);
         setTitle(getSectionName());
+        statuses = new HashMap<>();
         createContent();
     }
 
+    public Map<String, List<IStatus>> getStatuses() {
+        return statuses;
+    }
+    
+    
+    
+    public void setStatuses(Map<String, List<IStatus>> statuses) {
+        this.statuses = statuses;
+    }
+
     public TableViewer getViewer() {
         return this.viewer;
     }
 
     @Override
     public void dispose() {
+        disposed = true;
         if (listener != null) {
             try {
                 ITigerstripeModelProject project = getIArtifact().getProject();
@@ -133,6 +158,10 @@
         }
     }
 
+    public boolean isDisposed() {
+        return disposed;
+    }
+    
     protected Composite getTableComposite() {
         return this.tableComposite;
     }
@@ -822,6 +851,9 @@
         }
 
         public Image getColumnImage(Object obj, int index) {
+            if (index ==0) {
+                return getErrorIcon((IModelComponent) obj);
+            }
             return null;
         }
 
@@ -841,6 +873,8 @@
         return detailsPart;
     }
 
+    
+
     // ====================================================================
     protected abstract void registerPages(DetailsPart detailsPart);
 
@@ -865,5 +899,112 @@
     protected abstract void initMembersInModel(final IAbstractArtifact artifact);
 
     protected abstract String getMemberColumnText(final Object obj, final int index);
+    
+    protected abstract void updateDecorators(IMarker[] markers);
+    
+    protected abstract void updateDecorators();
     // ====================================================================
+    
+    //override for method
+    protected Image getErrorIcon(IModelComponent component) {
+
+        // Need to get the highest level problem for this model component.
+        List<IStatus> componenetStatuses = statuses.get(component.getName());
+        IStatus status = getHighestSeverityStatus(componenetStatuses, IStatus.WARNING);
+        if (status != null) {
+            switch (status.getSeverity()) {
+            case IStatus.ERROR :
+                return Images.get("status_error.gif");
+            case IStatus.WARNING :
+                return Images.get("status_warning.gif");
+            }
+        }
+        return null;
+    }    
+    
+    /*
+     * This is fine for fields and constants, but must be overridden for methods.
+     */
+    public Map<String,List<IStatus>> getAllStatuses(List<IMember> members, IMarker[] markers) {
+        Map<String,List<IStatus>> statuses = new HashMap<>();
+
+        List<String> memberNames = members.stream().map(IMember::getName).collect(Collectors.toList());
+
+        for (IMarker marker : markers) {
+            Map<String, Object> attribs;
+            try { 
+                attribs = marker.getAttributes();
+            } catch (CoreException e) {
+                EclipsePlugin.log(e);
+                return statuses;
+            }
+
+            int sev = 0;
+            if (attribs.containsKey(IMarker.SEVERITY)) {
+                sev = (Integer) attribs.get(IMarker.SEVERITY);
+                if ( sev < IMarker.SEVERITY_WARNING) {
+                    // ignore infos
+                    continue;
+                }
+            }
+
+            String location = "";
+            String subLocation = "";
+            // These are TS URIs from the TS auditor
+            if (attribs.containsKey(IMarker.LOCATION)) {
+                location = (String) attribs.get(IMarker.LOCATION);
+
+                if (location.startsWith(TigerstripeURIAdapterFactory.SCHEME_TS) && location.contains(TigerstripeURIAdapterFactory.COMPONENT_SEPERATOR)) {
+                    location = location.substring(location.indexOf(TigerstripeURIAdapterFactory.COMPONENT_SEPERATOR) + 1);
+                    if (memberNames.contains(location)) {
+                        if (attribs.containsKey("violation")) {
+                            int violation =  ((Integer) attribs.get("violation")).intValue();
+                            switch (violation) {
+                            case CommonArtifactAuditor.DEFAULT_VALUE_VIOLATION :
+                                subLocation = "default";
+                                break;
+
+                            }
+                        }
+
+                        addStatus(statuses,location,new ComponentStatus(sev*2, EclipsePlugin.PLUGIN_ID, marker.getAttribute(IMarker.MESSAGE, ""), subLocation));
+                    }
+                }
+            } else {
+
+                // and look for Java Markers
+                for (IMember member : members) {
+                    String subComponent = isMarkerForComponent(marker, (IModelComponent) member);
+                    // Assume anything else is due to a Java type marker.
+                    if (! subComponent.isEmpty()) {
+                        addStatus(statuses,member.getName(), new ComponentStatus(sev*2, EclipsePlugin.PLUGIN_ID, marker.getAttribute(IMarker.MESSAGE, ""), subComponent));
+                    }
+                }  
+            }
+
+        }
+        return statuses;
+    }
+
+    /*
+     * This is fine for fields and constants, but must be overridden for methods.
+     */
+    protected String isMarkerForComponent(IMarker marker, IModelComponent component) {
+        try {
+            if (marker.getType().equals(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER)) {
+                int componentLineNumber = ((IAbstractArtifact) component.getContainingModelComponent()).getJavaSource().getClasses()[0].
+                        getFieldByName(component.getName()).getLineNumber();
+                int markerLineNumber = marker.getAttribute("lineNumber",-1);
+
+                if (componentLineNumber == markerLineNumber) {
+                    return "type";
+                }
+
+            }
+        } catch (Exception e) {
+            // just return false
+        }
+        return StringUtils.EMPTY;
+    }
+    
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/AssociationSpecificsSection.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/AssociationSpecificsSection.java
index 76b2325..77bdc56 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/AssociationSpecificsSection.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/AssociationSpecificsSection.java
@@ -14,8 +14,17 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ControlDecoration;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.events.KeyEvent;
@@ -32,6 +41,8 @@
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.tigerstripe.repository.internal.ArtifactMetadataFactory;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
+import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
+import org.eclipse.tigerstripe.workbench.internal.builder.AssociationArtifactAuditor;
 import org.eclipse.tigerstripe.workbench.internal.core.model.AssociationEnd;
 import org.eclipse.tigerstripe.workbench.internal.core.model.IAbstractArtifactInternal;
 import org.eclipse.tigerstripe.workbench.internal.core.model.Type;
@@ -48,6 +59,8 @@
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.BrowseForArtifactDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.TigerstripeFormPage;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactEditorBase;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactSectionPart;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ComponentStatus;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.EndSection;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.IArtifactComponentChangeListener;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.StereotypeSectionManager;
@@ -102,10 +115,14 @@
 
     private Text aEndNameText;
 
+    private ControlDecoration aEndNameDecoration;
+
     private Text aEndCommentText;
 
     private Text aEndTypeText;
 
+    private ControlDecoration aEndTypeDecoration;
+
     private Button aEndTypeBrowseButton;
 
     private CCombo aEndAggregationCombo;
@@ -140,10 +157,14 @@
 
     private Text zEndNameText;
 
+    private ControlDecoration zEndNameDecoration;
+
     private Text zEndCommentText;
 
     private Text zEndTypeText;
 
+    private ControlDecoration zEndTypeDecoration;
+
     private Button zEndTypeBrowseButton;
 
     private CCombo zEndAggregationCombo;
@@ -235,6 +256,8 @@
         aEndNameText.setEnabled(!isReadonly());
         aEndNameText.addModifyListener(listener);
 
+        aEndNameDecoration = ArtifactSectionPart.decorate(aEndNameText);
+
         toolkit.createLabel(aEndClient, "Description:").setEnabled(!isReadonly());
         aEndCommentText = toolkit.createText(aEndClient, "", SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);
         td = new TableWrapData(TableWrapData.FILL_GRAB);
@@ -277,6 +300,8 @@
         aEndTypeBrowseButton.setEnabled(!isReadonly());
         aEndTypeBrowseButton.addSelectionListener(listener);
 
+        aEndTypeDecoration = ArtifactSectionPart.decorate(aEndTypeText);
+
         toolkit.createLabel(aEndClient, "Multiplicity:").setEnabled(!isReadonly());
         aEndMultiplicityCombo = new CCombo(aEndClient, SWT.SINGLE | SWT.READ_ONLY | SWT.FLAT | SWT.BORDER);
         aEndMultiplicityCombo.setItems(mulStrs);
@@ -399,6 +424,8 @@
         zEndNameText.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         zEndNameText.addModifyListener(listener);
 
+        zEndNameDecoration = ArtifactSectionPart.decorate(zEndNameText);
+
         toolkit.createLabel(zEndClient, "Description:").setEnabled(!isReadonly());
         zEndCommentText = toolkit.createText(zEndClient, "", SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);
         td = new TableWrapData(TableWrapData.FILL_GRAB);
@@ -441,6 +468,9 @@
         zEndTypeBrowseButton.setEnabled(!isReadonly());
         zEndTypeBrowseButton.addSelectionListener(listener);
 
+
+        zEndTypeDecoration = ArtifactSectionPart.decorate(zEndTypeText);
+
         toolkit.createLabel(zEndClient, "Multiplicity:").setEnabled(!isReadonly());
         zEndMultiplicityCombo = new CCombo(zEndClient, SWT.SINGLE | SWT.READ_ONLY | SWT.FLAT | SWT.BORDER);
         zEndMultiplicityCombo.setEnabled(!isReadonly());
@@ -872,7 +902,7 @@
         dialog.setIncludePrimitiveTypes(false);
         dialog.setTitle(
                 ArtifactMetadataFactory.INSTANCE.getMetadata(IAssociationArtifact.class.getName()).getLabel(null)
-                        + " End Type");
+                + " End Type");
         dialog.setMessage("Select the type of the "
                 + ArtifactMetadataFactory.INSTANCE.getMetadata(IAssociationArtifact.class.getName()).getLabel(null)
                 + " End.");
@@ -969,4 +999,124 @@
         zStereotypeManager.refresh();
     }
 
+    public void updateDecorators(IMarker[] markers) {
+        IAssociationArtifact artifact = (IAssociationArtifact) getIArtifact();
+
+        IAssociationEnd aEnd = artifact.getAEnd();
+        IAssociationEnd zEnd = artifact.getZEnd();
+
+        Map<String,List<IStatus>> statuses = getAllStatuses(new EndWrapper("aEnd",aEnd), new EndWrapper("zEnd",zEnd), markers);
+
+        List<IStatus> componentStatuses;
+
+        componentStatuses = statuses.get("aEnd");
+        updateDecorator(componentStatuses, "type", aEndTypeDecoration);
+        updateDecorator(componentStatuses, "name", aEndNameDecoration);
+
+        componentStatuses = statuses.get("zEnd");
+        updateDecorator(componentStatuses, "type", zEndTypeDecoration);
+        updateDecorator(componentStatuses, "name", zEndNameDecoration);
+
+
+
+    }
+
+    /*
+     * 
+     */
+    public Map<String,List<IStatus>> getAllStatuses(EndWrapper aEnd, EndWrapper zEnd, IMarker[] markers) {
+        Map<String,List<IStatus>> statuses = new HashMap<>();
+        List<EndWrapper> ends = Arrays.asList(aEnd, zEnd);
+
+        Map<String,String> memberURIs = new HashMap();
+        for (EndWrapper end: ends) {
+            try {
+                memberURIs.put(TigerstripeURIAdapterFactory.toURI(end.getEnd()).toString(), end.getEndLabel());
+            } catch (TigerstripeException e) {
+                EclipsePlugin.logErrorMessage("Failed to get URI of class: " + end.getEnd().getType(), e);
+            }
+        }
+
+
+        for (IMarker marker : markers) {
+            Map<String, Object> attribs;
+            try { 
+                attribs = marker.getAttributes();
+            } catch (CoreException e) {
+                EclipsePlugin.log(e);
+                return statuses;
+            }
+
+            int sev = 0;
+            if (attribs.containsKey(IMarker.SEVERITY)) {
+                sev = (Integer) attribs.get(IMarker.SEVERITY);
+                if ( sev < IMarker.SEVERITY_WARNING) {
+                    // ignore infos
+                    continue;
+                }
+            }
+
+            String location = "";
+            String subLocation = "";
+            // These are TS URIs from the TS auditor
+
+            if (attribs.containsKey(IMarker.LOCATION)) {
+                location = (String) attribs.get(IMarker.LOCATION);
+
+                if (memberURIs.containsKey(location)) {
+                    if (attribs.containsKey("violation")) {
+                        int violation =  ((Integer) attribs.get("violation")).intValue();
+                        switch (violation) {
+                        case AssociationArtifactAuditor.INVALID_END_VIOLATION :
+                        case AssociationArtifactAuditor.UNDEFINED_END_VIOLATION :
+                            subLocation = "type";
+                            break;
+
+                        }
+                    }
+
+                    addStatus(statuses,memberURIs.get(location),new ComponentStatus(sev*2, EclipsePlugin.PLUGIN_ID, marker.getAttribute(IMarker.MESSAGE, ""), subLocation));
+
+                }
+            } else {
+
+                // and look for Java Markers
+                for (EndWrapper end : ends) {
+                    String subComponent = isMarkerForEnd(marker, (EndWrapper) end);
+                    // Assume anything else is due to a Java type marker.
+                    if (! subComponent.isEmpty()) {
+                        addStatus(statuses,end.getEndLabel(), new ComponentStatus(sev*2, EclipsePlugin.PLUGIN_ID, marker.getAttribute(IMarker.MESSAGE, ""), subComponent));
+                    }
+                }  
+            }
+
+        }
+        return statuses;
+    }
+
+
+    protected String isMarkerForEnd(IMarker marker, EndWrapper end) {
+        try {
+            if (marker.getType().equals(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER)) {
+                int componentLineNumber = ((IAbstractArtifact) end.getEnd().getContainingModelComponent()).getJavaSource().getClasses()[0].
+                        getFieldByName(end.getEnd().getName()).getLineNumber();
+                int markerLineNumber = marker.getAttribute("lineNumber",-1);
+
+                if (componentLineNumber == markerLineNumber) {
+                    // Possible to create ends with same name through UI
+                    if (marker.getAttribute(IMarker.MESSAGE, "").startsWith("Duplicate")) {
+                        return "name";
+                    }
+
+                    return "type";
+                }
+
+            }
+        } catch (Exception e) {
+            // just return false
+        }
+        return StringUtils.EMPTY;
+    }
+
+
 }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/EndWrapper.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/EndWrapper.java
new file mode 100644
index 0000000..28e02b8
--- /dev/null
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/editors/artifacts/association/EndWrapper.java
@@ -0,0 +1,25 @@
+package org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.association;
+
+import org.eclipse.tigerstripe.workbench.model.deprecated_.IAssociationEnd;
+
+public class EndWrapper {
+
+    private String endLabel;
+    private IAssociationEnd end;
+    
+    public  EndWrapper(String endLabel, IAssociationEnd end) {
+        super();
+        this.endLabel = endLabel;
+        this.end = end;
+    }
+    
+    public String getEndLabel() {
+        return endLabel;
+    }
+    public IAssociationEnd getEnd() {
+        return end;
+    }
+    
+    
+    
+}
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AbstractModelInfoEditComponent.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AbstractModelInfoEditComponent.java
new file mode 100644
index 0000000..262b335
--- /dev/null
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AbstractModelInfoEditComponent.java
@@ -0,0 +1,15 @@
+package org.eclipse.tigerstripe.workbench.ui.internal.utils;
+
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+
+public abstract  class AbstractModelInfoEditComponent {
+    
+
+    public abstract void updateDecorators(Map<String,List<IStatus>> statuses); 
+
+
+    
+}
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AttributeInfoEditComponent.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AttributeInfoEditComponent.java
index 9905358..8848eaf 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AttributeInfoEditComponent.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/AttributeInfoEditComponent.java
@@ -15,10 +15,15 @@
 import static org.eclipse.jface.layout.GridLayoutFactory.fillDefaults;
 
 import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaModelMarker;
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ControlDecoration;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.events.KeyEvent;
@@ -54,6 +59,7 @@
 import org.eclipse.tigerstripe.workbench.ui.internal.Ask;
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.BrowseForArtifactDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactAttributesSection;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactSectionPart;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.IArtifactComponentChangeListener;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.forms.events.HyperlinkAdapter;
@@ -65,7 +71,7 @@
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
-public class AttributeInfoEditComponent {
+public class AttributeInfoEditComponent extends AbstractModelInfoEditComponent {
 
     private final boolean isReadOnly;
     private final FormToolkit toolkit;
@@ -146,8 +152,12 @@
 
     private Text typeText;
 
+    private ControlDecoration typeControlDecoration;
+
     private CCombo defaultValueText;
 
+    private ControlDecoration defaultValueDecoration;
+
     private Button typeBrowseButton;
 
     private CCombo multiplicityCombo;
@@ -237,6 +247,8 @@
         typeText.addModifyListener(adapter);
         typeText.addKeyListener(adapter);
 
+        typeControlDecoration = ArtifactSectionPart.decorate(typeText);
+
         label = toolkit.createLabel(sectionClient, "Multiplicity: ");
         label.setEnabled(!isReadOnly);
         multiplicityCombo = new CCombo(sectionClient, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
@@ -261,16 +273,20 @@
         visiComposite.setEnabled(!isReadOnly);
         visiComposite.setLayout(layout);
         visiComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-        publicButton = toolkit.createButton(visiComposite, "Public", SWT.RADIO);
+        publicButton = new Button(visiComposite, SWT.RADIO);
+        publicButton.setText("Public");
         publicButton.setEnabled(!isReadOnly);
         publicButton.addSelectionListener(adapter);
-        protectedButton = toolkit.createButton(visiComposite, "Protected", SWT.RADIO);
+        protectedButton = new Button(visiComposite, SWT.RADIO);
+        protectedButton.setText("Protected");
         protectedButton.setEnabled(!isReadOnly);
         protectedButton.addSelectionListener(adapter);
-        privateButton = toolkit.createButton(visiComposite, "Private", SWT.RADIO);
+        privateButton = new Button(visiComposite, SWT.RADIO);
+        privateButton.setText("Private");
         privateButton.setEnabled(!isReadOnly);
         privateButton.addSelectionListener(adapter);
-        packageButton = toolkit.createButton(visiComposite, "Package", SWT.RADIO);
+        packageButton = new Button(visiComposite, SWT.RADIO);
+        packageButton.setText("Package");
         packageButton.setEnabled(!isReadOnly);
         packageButton.addSelectionListener(adapter);
 
@@ -293,13 +309,16 @@
             optionalButton.addSelectionListener(adapter);
         }
 
-        readonlyButton = toolkit.createButton(opComposite, "Readonly", SWT.CHECK);
+        readonlyButton = new Button(opComposite, SWT.CHECK);
+        readonlyButton.setText("Readonly");
         readonlyButton.setEnabled(!isReadOnly);
         readonlyButton.addSelectionListener(adapter);
-        orderedButton = toolkit.createButton(opComposite, "Ordered", SWT.CHECK);
+        orderedButton = new Button(opComposite, SWT.CHECK);
+        orderedButton.setText("Ordered");
         orderedButton.setEnabled(!isReadOnly);
         orderedButton.addSelectionListener(adapter);
-        uniqueButton = toolkit.createButton(opComposite, "Unique", SWT.CHECK);
+        uniqueButton = new Button(opComposite, SWT.CHECK);
+        uniqueButton.setText("Unique");
         uniqueButton.setEnabled(!isReadOnly);
         uniqueButton.addSelectionListener(adapter);
 
@@ -328,6 +347,8 @@
         defaultValueText.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         defaultValueText.addModifyListener(adapter);
 
+        defaultValueDecoration = ArtifactSectionPart.decorate(defaultValueText);
+
         createStereotypes(sectionClient);
 
         section.setClient(sectionClient);
@@ -465,6 +486,19 @@
         setSilentUpdate(false);
     }
 
+    @Override
+    public void updateDecorators(Map<String,List<IStatus>> statuses) {
+        // TODO - add more decorators for anything we actually audit!
+
+        if (field != null) {
+            List<IStatus> componentStatuses = statuses.get(field.getName());
+
+            ArtifactSectionPart.updateDecorator(componentStatuses, "type", getTypeControlDecoration());
+            ArtifactSectionPart.updateDecorator(componentStatuses, "default", getDefaultValueDecoration());
+        }
+    }
+
+
     private void setVisibility(EVisibility visibility) {
         publicButton.setSelection(visibility.equals(EVisibility.PUBLIC));
         protectedButton.setSelection(visibility.equals(EVisibility.PROTECTED));
@@ -507,7 +541,7 @@
         } else if (e.getSource() == multiplicityCombo) {
             IType type = field.getType();
             IModelComponent.EMultiplicity mult = IModelComponent.EMultiplicity.values()[multiplicityCombo
-                    .getSelectionIndex()];
+                                                                                        .getSelectionIndex()];
             if (type.getTypeMultiplicity() == mult) {
                 return;
             }
@@ -700,10 +734,18 @@
         return typeText;
     }
 
+    public ControlDecoration getTypeControlDecoration() {
+        return typeControlDecoration;
+    }
+
     public CCombo getDefaultValueText() {
         return defaultValueText;
     }
 
+    public ControlDecoration getDefaultValueDecoration() {
+        return defaultValueDecoration;
+    }
+
     public Button getTypeBrowseButton() {
         return typeBrowseButton;
     }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/ConstantInfoEditComponent.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/ConstantInfoEditComponent.java
index a4f5630..0d75998 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/ConstantInfoEditComponent.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/ConstantInfoEditComponent.java
@@ -12,6 +12,11 @@
  *******************************************************************************/
 package org.eclipse.tigerstripe.workbench.ui.internal.utils;
 
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.fieldassist.ControlDecoration;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.events.KeyEvent;
@@ -33,6 +38,7 @@
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IModelComponent.EVisibility;
 import org.eclipse.tigerstripe.workbench.model.deprecated_.IType;
 import org.eclipse.tigerstripe.workbench.ui.EclipsePlugin;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactSectionPart;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.IArtifactComponentChangeListener;
 import org.eclipse.ui.forms.widgets.ExpandableComposite;
 import org.eclipse.ui.forms.widgets.FormToolkit;
@@ -40,7 +46,7 @@
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
-public class ConstantInfoEditComponent {
+public class ConstantInfoEditComponent extends AbstractModelInfoEditComponent {
 
     private static final String[] supportedPrimitiveTypes = { "int", "String" };
 
@@ -112,6 +118,8 @@
 
     private CCombo baseTypeCombo;
 
+    private ControlDecoration baseTypeControlDecoration;
+
     private Text commentText;
 
     public void createContents(Composite parent) {
@@ -153,13 +161,16 @@
         visiComposite.setEnabled(!isReadOnly);
         visiComposite.setLayout(layout);
         visiComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-        publicButton = toolkit.createButton(visiComposite, "Public", SWT.RADIO);
+        publicButton = new Button(visiComposite, SWT.RADIO);
+        publicButton.setText("Public");
         publicButton.setEnabled(!isReadOnly);
         publicButton.addSelectionListener(adapter);
-        protectedButton = toolkit.createButton(visiComposite, "Protected", SWT.RADIO);
+        protectedButton = new Button(visiComposite, SWT.RADIO);
+        protectedButton.setText("Protected");
         protectedButton.setEnabled(!isReadOnly);
         protectedButton.addSelectionListener(adapter);
-        privateButton = toolkit.createButton(visiComposite, "Private", SWT.RADIO);
+        privateButton = new Button(visiComposite, SWT.RADIO);
+        privateButton.setText("Private");
         privateButton.setEnabled(!isReadOnly);
         privateButton.addSelectionListener(adapter);
 
@@ -182,6 +193,8 @@
         baseTypeCombo.addSelectionListener(adapter);
         baseTypeCombo.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
+        baseTypeControlDecoration = ArtifactSectionPart.decorate(baseTypeCombo);
+
         createStereotypes(sectionClient);
 
         section.setClient(sectionClient);
@@ -277,6 +290,18 @@
         }
     }
 
+    @Override
+    public void updateDecorators(Map<String,List<IStatus>> statuses) {
+
+        if (literal != null) {
+            // TODO - add more decorators for anything we actually audit!
+
+            List<IStatus> componentStatuses = statuses.get(literal.getName());
+            ArtifactSectionPart.updateDecorator(componentStatuses, "type", getBaseTypeControlDecoration());
+        }
+    }
+
+
     /**
      * An adapter that will listen for changes on the form
      */
@@ -351,6 +376,10 @@
         return baseTypeCombo;
     }
 
+    public ControlDecoration getBaseTypeControlDecoration() {
+        return baseTypeControlDecoration;
+    }
+
     public Text getCommentText() {
         return commentText;
     }
diff --git a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/MethodInfoEditComponent.java b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/MethodInfoEditComponent.java
index 9641304..ce6bf37 100644
--- a/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/MethodInfoEditComponent.java
+++ b/plugins/org.eclipse.tigerstripe.workbench.ui.base/src/java/org/eclipse/tigerstripe/workbench/ui/internal/utils/MethodInfoEditComponent.java
@@ -18,10 +18,14 @@
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.fieldassist.ControlDecoration;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ILabelProvider;
@@ -54,6 +58,7 @@
 import org.eclipse.tigerstripe.repository.internal.ArtifactMetadataFactory;
 import org.eclipse.tigerstripe.workbench.TigerstripeCore;
 import org.eclipse.tigerstripe.workbench.TigerstripeException;
+import org.eclipse.tigerstripe.workbench.internal.adapt.TigerstripeURIAdapterFactory;
 import org.eclipse.tigerstripe.workbench.internal.api.profile.properties.IGlobalSettingsProperty;
 import org.eclipse.tigerstripe.workbench.internal.api.profile.properties.IOssjLegacySettigsProperty;
 import org.eclipse.tigerstripe.workbench.internal.api.profile.properties.IWorkbenchPropertyLabels;
@@ -84,7 +89,10 @@
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.ArgumentEditDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.BrowseForArtifactDialog;
 import org.eclipse.tigerstripe.workbench.ui.internal.dialogs.MethodReturnDetailsEditDialog;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactAttributesSection;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactMethodsSection;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ArtifactSectionPart;
+import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.ComponentStatus;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.IArtifactComponentChangeListener;
 import org.eclipse.tigerstripe.workbench.ui.internal.editors.artifacts.SelectionProviderIntermediateFocusListener;
 import org.eclipse.tigerstripe.workbench.ui.internal.resources.Images;
@@ -99,7 +107,7 @@
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
-public class MethodInfoEditComponent {
+public class MethodInfoEditComponent  extends AbstractModelInfoEditComponent {
 
     private final boolean isReadOnly;
     private final boolean enabledInstanceMethods;
@@ -136,6 +144,8 @@
 
     private CCombo defaultReturnValue;
 
+    private ControlDecoration defaultValueDecoration;
+
     private Text methodReturnNameText;
 
     private Button editReturnStereotypes;
@@ -200,18 +210,21 @@
         layout.topMargin = layout.bottomMargin = 0;
         buttonsClient.setLayout(layout);
 
-        addAnno = toolkit.createButton(buttonsClient, "Add", SWT.PUSH);
+        addAnno = new Button(buttonsClient, SWT.PUSH);
+        addAnno.setText("Add");
         // Support for testing
         addAnno.setData("name", "Add_Stereotype_Attribute");
         addAnno.setEnabled(!isReadOnly);
         addAnno.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-        editAnno = toolkit.createButton(buttonsClient, "Edit", SWT.PUSH);
+        editAnno = new Button(buttonsClient, SWT.PUSH);
+        editAnno.setText("Edit");
         editAnno.setData("name", "Edit_Stereotype_Attribute");
         editAnno.setEnabled(!isReadOnly);
         editAnno.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
 
-        removeAnno = toolkit.createButton(buttonsClient, "Remove", SWT.PUSH);
+        removeAnno = new Button(buttonsClient, SWT.PUSH);
+        removeAnno.setText("Remove");
         // Support for testing
         removeAnno.setData("name", "Remove_Stereotype_Attribute");
         removeAnno.setEnabled(!isReadOnly);
@@ -238,7 +251,7 @@
 
     public void setEnabled(boolean value) {
         if (argViewer != null) {
-            List<Control> toIgnore = new ArrayList<Control>();
+            List<Control> toIgnore = new ArrayList<>();
             collectIntermediateControls(argViewer.getControl(), sectionClient, toIgnore);
             toIgnore.add(argViewer.getControl());
             setEnabledAll(sectionClient, toIgnore, value);
@@ -271,6 +284,8 @@
     // ============================================================
     private Text typeText;
 
+    private ControlDecoration typeControlDecoration;
+
     private Button isVoid;
 
     private Button isInstanceMethodButton;
@@ -324,16 +339,20 @@
         layout.numColumns = 4;
         visiComposite.setLayout(layout);
         visiComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-        publicButton = toolkit.createButton(visiComposite, "Public", SWT.RADIO);
+        publicButton = new Button(visiComposite, SWT.RADIO);
+        publicButton.setText("Public");
         publicButton.setEnabled(!isReadOnly);
         publicButton.addSelectionListener(adapter);
-        protectedButton = toolkit.createButton(visiComposite, "Protected", SWT.RADIO);
+        protectedButton = new Button(visiComposite, SWT.RADIO);
+        protectedButton.setText("Protected");
         protectedButton.setEnabled(!isReadOnly);
         protectedButton.addSelectionListener(adapter);
-        privateButton = toolkit.createButton(visiComposite, "Private", SWT.RADIO);
+        privateButton = new Button(visiComposite, SWT.RADIO);
+        privateButton.setText("Private");
         privateButton.setEnabled(!isReadOnly);
         privateButton.addSelectionListener(adapter);
-        packageButton = toolkit.createButton(visiComposite, "Package", SWT.RADIO);
+        packageButton = new Button(visiComposite, SWT.RADIO);
+        packageButton.setText("Package");
         packageButton.setEnabled(!isReadOnly);
         packageButton.addSelectionListener(adapter);
 
@@ -345,34 +364,39 @@
         layout.numColumns = 5;
         optComposite.setLayout(layout);
         optComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-
-        abstractButton = toolkit.createButton(optComposite, "Abstract", SWT.CHECK);
+        abstractButton = new Button(optComposite, SWT.CHECK);
+        abstractButton.setText("Abstract");
         abstractButton.setEnabled(!isReadOnly);
         abstractButton.addSelectionListener(adapter);
 
-        orderedButton = toolkit.createButton(optComposite, "Ordered", SWT.CHECK);
+        orderedButton = new Button(optComposite, SWT.CHECK);
+        orderedButton.setText("Ordered");
         orderedButton.setEnabled(!isReadOnly);
         orderedButton.addSelectionListener(adapter);
 
-        uniqueButton = toolkit.createButton(optComposite, "Unique", SWT.CHECK);
+        uniqueButton = new Button(optComposite, SWT.CHECK);
+        uniqueButton.setText("Unique");
         uniqueButton.setEnabled(!isReadOnly);
         uniqueButton.addSelectionListener(adapter);
 
         if (prop.getPropertyValue(IOssjLegacySettigsProperty.ENABLE_ISOPTIONAL)) {
-            optionalButton = toolkit.createButton(optComposite, "Optional", SWT.CHECK);
+            optionalButton = new Button(optComposite, SWT.CHECK);
+            optionalButton.setText("Optional");
             optionalButton.setEnabled(!isReadOnly);
             optionalButton.addSelectionListener(adapter);
         }
 
         if (prop.getPropertyValue(IOssjLegacySettigsProperty.ENABLE_INSTANCEMETHOD)) {
-            isInstanceMethodButton = toolkit.createButton(optComposite, "Instance", SWT.CHECK);
+            isInstanceMethodButton = new Button(optComposite, SWT.CHECK);
+            isInstanceMethodButton.setText("Instance");
             isInstanceMethodButton.setEnabled(!isReadOnly);
             isInstanceMethodButton.addSelectionListener(adapter);
         }
 
         toolkit.createLabel(sectionClient, "Method Return: ");
 
-        isVoid = toolkit.createButton(sectionClient, "isVoid", SWT.CHECK);
+        isVoid = new Button(sectionClient, SWT.CHECK);
+        isVoid.setText("isVoid");
         isVoid.setEnabled(!isReadOnly);
         isVoid.addSelectionListener(adapter);
 
@@ -414,13 +438,16 @@
         typeText.setEnabled(!isReadOnly);
         typeText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 
-        typeBrowseButton = toolkit.createButton(c, " Browse ", SWT.PUSH);
+        typeBrowseButton = new Button(c, SWT.PUSH);
+        typeBrowseButton.setText("Browse ");
         typeBrowseButton.setLayoutData(new GridData(GridData.FILL_VERTICAL));
         typeBrowseButton.setEnabled(!isReadOnly);
         typeBrowseButton.addSelectionListener(adapter);
         typeText.addModifyListener(adapter);
         typeText.addKeyListener(adapter);
 
+        typeControlDecoration = ArtifactSectionPart.decorate(typeText);
+
         multiplicityLabel = toolkit.createLabel(sectionClient, "Multiplicity: ");
         multiplicityLabel.setEnabled(!isReadOnly);
         multiplicityCombo = new CCombo(sectionClient, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
@@ -438,17 +465,20 @@
             layout.numColumns = 3;
             refComposite.setLayout(layout);
             refComposite.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-            refByValueButton = toolkit.createButton(refComposite, IField.refByLabels[IField.REFBY_VALUE], SWT.RADIO);
+            refByValueButton = new Button(refComposite, SWT.RADIO);
+            refByValueButton.setText(IField.refByLabels[IField.REFBY_VALUE]);
             refByValueButton.addSelectionListener(adapter);
-            refByKeyButton = toolkit.createButton(refComposite, IField.refByLabels[IField.REFBY_KEY], SWT.RADIO);
+            refByKeyButton = new Button(refComposite, SWT.RADIO);
+            refByKeyButton.setText(IField.refByLabels[IField.REFBY_KEY]);
             refByKeyButton.addSelectionListener(adapter);
-            refByKeyResultButton = toolkit.createButton(refComposite, IField.refByLabels[IField.REFBY_KEYRESULT],
-                    SWT.RADIO);
+            refByKeyResultButton = new Button(refComposite,SWT.RADIO);
+            refByKeyResultButton.setText(IField.refByLabels[IField.REFBY_KEYRESULT]);
             refByKeyResultButton.addSelectionListener(adapter);
             toolkit.createLabel(sectionClient, "");
             // Iterator for multiplicity "*"
             toolkit.createLabel(sectionClient, "");
-            iteratorReturnButton = toolkit.createButton(sectionClient, "Iterator for return", SWT.CHECK);
+            iteratorReturnButton = new Button(sectionClient, SWT.CHECK);
+            iteratorReturnButton.setText("Iterator for return");
             iteratorReturnButton.setEnabled(!isReadOnly);
             iteratorReturnButton.addSelectionListener(adapter);
             toolkit.createLabel(sectionClient, "");
@@ -470,6 +500,8 @@
         defaultReturnValue.addModifyListener(adapter);
         defaultReturnValue.addKeyListener(adapter);
 
+        defaultValueDecoration = ArtifactSectionPart.decorate(defaultReturnValue);
+
         toolkit.createLabel(sectionClient, "");
         editReturnStereotypes = new Button(sectionClient, SWT.PUSH);
         editReturnStereotypes.setText("Return Stereotypes");
@@ -531,29 +563,34 @@
         layout.topMargin = layout.bottomMargin = 0;
         buttonsClient.setLayout(layout);
 
-        addArgButton = toolkit.createButton(buttonsClient, "Add", SWT.PUSH);
+        addArgButton = new Button(buttonsClient, SWT.PUSH);
+        addArgButton.setText("Add");
         // Support for testing
         addArgButton.setData("name", "Add_Argument");
         addArgButton.setEnabled(!isReadOnly);
         addArgButton.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         addArgButton.addSelectionListener(adapter);
 
-        editArgButton = toolkit.createButton(buttonsClient, "Edit", SWT.PUSH);
+        editArgButton = new Button(buttonsClient, SWT.PUSH);
+        editArgButton.setText("Edit");
         editArgButton.setEnabled(false);
         editArgButton.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         editArgButton.addSelectionListener(adapter);
 
-        upArgButton = toolkit.createButton(buttonsClient, "Up", SWT.PUSH);
+        upArgButton = new Button(buttonsClient, SWT.PUSH);
+        upArgButton.setText("Up");
         upArgButton.setEnabled(false);
         upArgButton.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         upArgButton.addSelectionListener(adapter);
 
-        downArgButton = toolkit.createButton(buttonsClient, "Down", SWT.PUSH);
+        downArgButton = new Button(buttonsClient, SWT.PUSH);
+        downArgButton.setText("Down");
         downArgButton.setEnabled(false);
         downArgButton.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         downArgButton.addSelectionListener(adapter);
 
-        removeArgButton = toolkit.createButton(buttonsClient, "Remove", SWT.PUSH);
+        removeArgButton = new Button(buttonsClient, SWT.PUSH);
+        removeArgButton.setText("Remove");
         // Support for testing
         removeArgButton.setData("name", "Remove_Argument");
         removeArgButton.setEnabled(false);
@@ -615,14 +652,16 @@
         layout.bottomMargin = 30;
         buttonsClient.setLayout(layout);
 
-        addExceptionButton = toolkit.createButton(buttonsClient, "Add", SWT.PUSH);
+        addExceptionButton = new Button(buttonsClient, SWT.PUSH);
+        addExceptionButton.setText("Add");
         addExceptionButton.setEnabled(!isReadOnly);
         // Support for testing
         addExceptionButton.setData("name", "Add_Exception");
         addExceptionButton.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
         addExceptionButton.addSelectionListener(adapter);
 
-        removeExceptionButton = toolkit.createButton(buttonsClient, "Remove", SWT.PUSH);
+        removeExceptionButton = new Button(buttonsClient, SWT.PUSH);
+        removeExceptionButton.setText("Remove");
         // Support for testing
         removeExceptionButton.setData("name", "Remove_Exception");
         removeExceptionButton.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
@@ -683,11 +722,36 @@
         public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
         }
     }
-
     public class ArgumentLabelProvider implements ILabelProvider {
 
+        private List<IStatus> statuses;
+
+        public void setStatuses(List<IStatus> statuses) {
+            this.statuses = statuses;
+        }
+
         @Override
         public Image getImage(Object element) {
+            if (element instanceof IArgument) {
+                if (statuses != null) {
+                    List<IStatus> argStatuses = statuses.stream().
+                            filter(ComponentStatus.class::isInstance)
+                            .map(ComponentStatus.class::cast).
+                            filter(st ->st.getSubComponent().equals("arg:"+((IArgument) element).getName())).collect(Collectors.toList());
+
+                    IStatus high = ArtifactAttributesSection.getHighestSeverityStatus(argStatuses, 2);
+                    if (high != null) {
+                        switch (high.getSeverity()) {
+                        case IStatus.ERROR:                
+                            return Images.get(Images.STATUS_ERROR);
+                        case IStatus.WARNING:
+                            return Images.get(Images.STATUS_WARNING);
+                        default:
+                            return null;
+                        }
+                    } 
+                }
+            }
             return null;
         }
 
@@ -922,7 +986,7 @@
         typeText.setText(Misc.removeJavaLangString(method.getReturnType().getFullyQualifiedName()));
         if (!method.isVoid()) {
             multiplicityCombo
-                    .select(IModelComponent.EMultiplicity.indexOf(method.getReturnType().getTypeMultiplicity()));
+            .select(IModelComponent.EMultiplicity.indexOf(method.getReturnType().getTypeMultiplicity()));
             updateDefaultValueCombo();
             defaultReturnValue.setEnabled(!isReadOnly);
             editReturnStereotypes.setEnabled(!isReadOnly);
@@ -1009,7 +1073,7 @@
         removeArgButton.setEnabled(!isReadOnly && argViewer.getTable().getSelectionCount() > 0);
 
         TableItem[] selection = argViewer.getTable().getSelection();
-        List<IArgument> arguments = new ArrayList<IArgument>(getMethod().getArguments());
+        List<IArgument> arguments = new ArrayList<>(getMethod().getArguments());
         boolean canMoveUp = selection.length == 1 && arguments.indexOf((selection[0].getData())) != 0;
 
         boolean canMoveDown = selection.length == 1
@@ -1170,10 +1234,10 @@
         } catch (TigerstripeException e) {
             EclipsePlugin.log(e);
             MessageDialog
-                    .openWarning(shell,
-                            "Default " + ArtifactMetadataFactory.INSTANCE
-                                    .getMetadata(IPrimitiveTypeArtifact.class.getName()).getLabel(null) + " For Parameter",
-                            e.getMessage());
+            .openWarning(shell,
+                    "Default " + ArtifactMetadataFactory.INSTANCE
+                    .getMetadata(IPrimitiveTypeArtifact.class.getName()).getLabel(null) + " For Parameter",
+                    e.getMessage());
             return;
         }
         type.setTypeMultiplicity(EMultiplicity.ONE);
@@ -1244,10 +1308,10 @@
             // Bug # 124
             dialog.setTitle(
                     ArtifactMetadataFactory.INSTANCE.getMetadata(IExceptionArtifact.class.getName()).getLabel(null)
-                            + " Selection for Method ");
+                    + " Selection for Method ");
             dialog.setMessage(
                     "Select the " + ArtifactMetadataFactory.INSTANCE.getMetadata(IExceptionArtifact.class.getName())
-                            .getLabel(null) + "(s) for the method " + method.getName());
+                    .getLabel(null) + "(s) for the method " + method.getName());
 
             // Build list of existing exceptions
             TableItem[] items = exceptionViewer.getTable().getItems();
@@ -1455,11 +1519,35 @@
         return annTable;
     }
 
+    @Override
+    public void updateDecorators(Map<String,List<IStatus>> statuses) {
+
+        if (method != null) {
+            // TODO - add more decorators for anything we actually audit!
+
+            List<IStatus> componentStatuses;
+            try {
+                componentStatuses = statuses.get(TigerstripeURIAdapterFactory.toURI(method).getFragment());
+                ArtifactSectionPart.updateDecorator(componentStatuses, "type", getTypeControlDecoration());
+                ArtifactSectionPart.updateDecorator(componentStatuses, "default", getDefaultValueDecoration());
+
+                ((ArgumentLabelProvider) getArgViewer().getLabelProvider()).setStatuses(componentStatuses);
+                getArgViewer().refresh();
+            } catch (TigerstripeException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+
+
     /**
      * An adapter that will listen for changes on the form
      */
     private class MethodInfoListener extends SelectionAdapter
-            implements ModifyListener, KeyListener, IDoubleClickListener {
+    implements ModifyListener, KeyListener, IDoubleClickListener {
 
         @Override
         public void doubleClick(DoubleClickEvent event) {
@@ -1575,6 +1663,14 @@
         return typeText;
     }
 
+    public ControlDecoration getTypeControlDecoration() {
+        return typeControlDecoration;
+    }
+
+    public ControlDecoration getDefaultValueDecoration() {
+        return defaultValueDecoration;
+    }
+
     public Button getIsVoid() {
         return isVoid;
     }
