Squashed commit of the following:

commit cd3c9d27444f369c51d791a7c1d201fd603976ea
Author: Richard Craddock <rcraddoc@cisco.com>
Date:   Mon Apr 27 17:09:40 2020 +0100

    Puch to provoke a PR

commit fe429b4fa7b2ab41c9a66b88c05132c0a9d32bc9
Author: Richard Craddock <rcraddoc@cisco.com>
Date:   Mon Apr 27 12:09:36 2020 +0100

    Very small change to provoke git

commit cbd866ba75976a58602f3e901793a6ec58f74246
Author: Richard Craddock <rcraddoc@cisco.com>
Date:   Thu Apr 23 10:09:58 2020 +0100

    Change to decorate certain cntrols on Artifact Editors based on
markers

    Primarily looks at "type" errors and anything else that is audited
by
    TS, AND CAN BE SET THROUGH THE UI.

    If something cannot be changed to an errored state in the UI, then
in
    general it is not audited, and the error message will be "generic".

    Works off "Markers", so only updated on a save.

Change-Id: Ibceda57850f5d4f0c1f1d80be51eea7e96403381
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;
     }