@Override
  public String intercept(ActionInvocation invocation) throws Exception {

    ActionContext invocationContext = invocation.getInvocationContext();
    Map<String, Object> conversionErrors = invocationContext.getConversionErrors();
    ValueStack stack = invocationContext.getValueStack();

    HashMap<Object, Object> fakie = null;

    for (Map.Entry<String, Object> entry : conversionErrors.entrySet()) {
      String propertyName = entry.getKey();
      Object value = entry.getValue();

      if (shouldAddError(propertyName, value)) {
        String message = XWorkConverter.getConversionErrorMessage(propertyName, stack);

        Object action = invocation.getAction();
        if (action instanceof ValidationAware) {
          ValidationAware va = (ValidationAware) action;
          va.addFieldError(propertyName, message);
        }

        if (fakie == null) {
          fakie = new HashMap<Object, Object>();
        }

        fakie.put(propertyName, getOverrideExpr(invocation, value));
      }
    }

    if (fakie != null) {
      // if there were some errors, put the original (fake) values in place right before the result
      stack.getContext().put(ORIGINAL_PROPERTY_OVERRIDE, fakie);
      invocation.addPreResultListener(
          new PreResultListener() {
            public void beforeResult(ActionInvocation invocation, String resultCode) {
              Map<Object, Object> fakie =
                  (Map<Object, Object>)
                      invocation.getInvocationContext().get(ORIGINAL_PROPERTY_OVERRIDE);

              if (fakie != null) {
                invocation.getStack().setExprOverrides(fakie);
              }
            }
          });
    }
    return invocation.invoke();
  }