diff --git a/src/main/java/org/apache/xmlbeans/impl/store/DomImpl.java b/src/main/java/org/apache/xmlbeans/impl/store/DomImpl.java
index db5dc43..2b93134 100755
--- a/src/main/java/org/apache/xmlbeans/impl/store/DomImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/store/DomImpl.java
@@ -30,6 +30,9 @@
 import javax.xml.transform.Source;
 import java.io.PrintStream;
 import java.util.*;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
 
 // DOM Level 3
 
@@ -65,41 +68,39 @@
         void dump(PrintStream o, Object ref);
     }
 
-    ;
-
-    static Dom parent(Dom d) {
+    static Node parent(Dom d) {
         return node_getParentNode(d);
     }
 
-    static Dom firstChild(Dom d) {
+    static Node firstChild(Dom d) {
         return node_getFirstChild(d);
     }
 
-    static Dom nextSibling(Dom d) {
+    static Node nextSibling(Dom d) {
         return node_getNextSibling(d);
     }
 
-    static Dom prevSibling(Dom d) {
+    static Node prevSibling(Dom d) {
         return node_getPreviousSibling(d);
     }
 
-    public static Dom append(Dom n, Dom p) {
+    public static Node append(Dom n, Dom p) {
         return node_insertBefore(p, n, null);
     }
 
-    public static Dom insert(Dom n, Dom b) {
+    public static Node insert(Dom n, Dom b) {
         assert b != null;
-        return node_insertBefore(parent(b), n, b);
+        return node_insertBefore((Dom) parent(b), n, b);
     }
 
-    public static Dom remove(Dom n) {
-        Dom p = parent(n);
+    public static Node remove(Dom n) {
+        Node p = parent(n);
 
         if (p != null) {
-            node_removeChild(p, n);
+            node_removeChild((Dom) p, n);
         }
 
-        return n;
+        return (Node) n;
     }
 
     //
@@ -107,50 +108,30 @@
     //
 
     static class HierarchyRequestErr extends DOMException {
-        HierarchyRequestErr() {
-            this("This node isn't allowed there");
-        }
-
         HierarchyRequestErr(String message) {
             super(HIERARCHY_REQUEST_ERR, message);
         }
     }
 
     static class WrongDocumentErr extends DOMException {
-        WrongDocumentErr() {
-            this("Nodes do not belong to the same document");
-        }
-
         WrongDocumentErr(String message) {
             super(WRONG_DOCUMENT_ERR, message);
         }
     }
 
     static class NotFoundErr extends DOMException {
-        NotFoundErr() {
-            this("Node not found");
-        }
-
         NotFoundErr(String message) {
             super(NOT_FOUND_ERR, message);
         }
     }
 
     static class NamespaceErr extends DOMException {
-        NamespaceErr() {
-            this("Namespace error");
-        }
-
         NamespaceErr(String message) {
             super(NAMESPACE_ERR, message);
         }
     }
 
     static class NoModificationAllowedErr extends DOMException {
-        NoModificationAllowedErr() {
-            this("No modification allowed error");
-        }
-
         NoModificationAllowedErr(String message) {
             super(NO_MODIFICATION_ALLOWED_ERR, message);
         }
@@ -177,10 +158,6 @@
     }
 
     static class NotSupportedError extends DOMException {
-        NotSupportedError() {
-            this("This operation is not supported");
-        }
-
         NotSupportedError(String message) {
             super(NOT_SUPPORTED_ERR, message);
         }
@@ -210,7 +187,7 @@
         }
     }
 
-    public static NodeList _emptyNodeList = new EmptyNodeList();
+    public static final NodeList _emptyNodeList = new EmptyNodeList();
 
     static String nodeKindName(int t) {
         switch (t) {
@@ -315,7 +292,7 @@
             nodeKindName(ck) + " nodes as children";
     }
 
-    private static void validateNewChild(Dom parent, Dom child) {
+    private static void validateNewChild(final Dom parent, Dom child) {
         String msg = isValidChild(parent, child);
 
         if (msg != null) {
@@ -326,7 +303,7 @@
             throw new HierarchyRequestErr("New child and parent are the same node");
         }
 
-        while ((parent = parent(parent)) != null) {
+        for (Node p = (Node) parent; (p = parent((Dom) p)) != null; ) {
             // TODO - use read only state on a node to know if it is under an
             // entity ref
 
@@ -334,7 +311,7 @@
                 throw new NoModificationAllowedErr("Entity reference trees may not be modified");
             }
 
-            if (child == parent) {
+            if (child == p) {
                 throw new HierarchyRequestErr("New child is an ancestor node of the parent node");
             }
         }
@@ -499,8 +476,7 @@
 
         public Node item(int i) {
             ensureElements();
-
-            return i < 0 || i >= _elements.size() ? (Node) null : (Node) _elements.get(i);
+            return i < 0 || i >= _elements.size() ? null : (Node) _elements.get(i);
         }
 
         private void ensureElements() {
@@ -509,62 +485,46 @@
             }
 
             _version = _locale.version();
+            _elements = new ArrayList<>();
 
-            _elements = new ArrayList();
-
-            Locale l = _locale;
-
-            if (l.noSync()) {
-                l.enter();
-                try {
-                    addElements(_root);
-                } finally {
-                    l.exit();
-                }
-            } else {
-                synchronized (l) {
-                    l.enter();
-                    try {
-                        addElements(_root);
-                    } finally {
-                        l.exit();
-                    }
-                }
-            }
+            syncWrapHelper(_locale, true, () -> {
+                addElements(_root);
+                return null;
+            });
         }
 
         private void addElements(Dom node) {
-            for (Dom c = firstChild(node); c != null; c = nextSibling(c)) {
-                if (c.nodeType() == ELEMENT) {
-                    if (match(c)) {
-                        _elements.add(c);
+            for (Node c = firstChild(node); c != null; c = nextSibling((Dom) c)) {
+                if (((Dom) c).nodeType() == ELEMENT) {
+                    if (match((Dom) c)) {
+                        _elements.add((Dom) c);
                     }
 
-                    addElements(c);
+                    addElements((Dom) c);
                 }
             }
         }
 
         protected abstract boolean match(Dom element);
 
-        private Dom _root;
-        private Locale _locale;
+        private final Dom _root;
+        private final Locale _locale;
         private long _version;
-        private ArrayList _elements;
+        private ArrayList<Dom> _elements;
     }
 
     private static class ElementsByTagNameNodeList extends ElementsNodeList {
         ElementsByTagNameNodeList(Dom root, String name) {
             super(root);
-
             _name = name;
+            assert (_name != null);
         }
 
         protected boolean match(Dom element) {
-            return _name.equals("*") ? true : _node_getNodeName(element).equals(_name);
+            return _name.equals("*") || _name.equals(_node_getNodeName(element));
         }
 
-        private String _name;
+        private final String _name;
     }
 
     private static class ElementsByTagNameNSNodeList extends ElementsNodeList {
@@ -573,45 +533,27 @@
 
             _uri = uri == null ? "" : uri;
             _local = local;
+            assert (local != null);
         }
 
         protected boolean match(Dom element) {
-            if (!(_uri.equals("*") ? true : _node_getNamespaceURI(element).equals(_uri))) {
+            if (!(_uri.equals("*") || _uri.equals(_node_getNamespaceURI(element)))) {
                 return false;
             }
 
-            return _local.equals("*") ? true : _node_getLocalName(element).equals(_local);
+            return _local.equals("*") || _local.equals(_node_getLocalName(element));
         }
 
-        private String _uri;
-        private String _local;
+        private final String _uri;
+        private final String _local;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Document _domImplementation_createDocument(
-        Locale l, String u, String n, DocumentType t) {
-        Document d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return domImplementation_createDocument(l, u, n, t);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return domImplementation_createDocument(l, u, n, t);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+    public static Document _domImplementation_createDocument(Locale l, String u, String n, DocumentType t) {
+        return syncWrapHelper(l, true, () -> domImplementation_createDocument(l, u, n, t));
     }
 
     public static Document domImplementation_createDocument(
@@ -619,13 +561,9 @@
         validateQualifiedName(qualifiedName, namespaceURI, false);
 
         Cur c = l.tempCur();
-
         c.createDomDocumentRoot();
-
         Document doc = (Document) c.getDom();
-
         c.next();
-
         c.createElement(l.makeQualifiedQName(namespaceURI, qualifiedName));
 
         if (doctype != null) {
@@ -649,6 +587,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static boolean _domImplementation_hasFeature(Locale l, String feature, String version) {
         if (feature == null) {
             return false;
@@ -663,11 +602,7 @@
             return true;
         }
 
-        if (feature.equalsIgnoreCase("xml")) {
-            return true;
-        }
-
-        return false;
+        return feature.equalsIgnoreCase("xml");
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -675,35 +610,13 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Element _document_getDocumentElement(Dom d) {
-        Locale l = d.locale();
-
-        Dom e;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                e = document_getDocumentElement(d);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    e = document_getDocumentElement(d);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Element) e;
+        return syncWrap(d, DomImpl::document_getDocumentElement);
     }
 
-    public static Dom document_getDocumentElement(Dom d) {
-        for (d = firstChild(d); d != null; d = nextSibling(d)) {
-            if (d.nodeType() == ELEMENT) {
-                return d;
+    public static Element document_getDocumentElement(final Dom d) {
+        for (Node n = firstChild(d); n != null; n = nextSibling((Dom) n)) {
+            if (((Dom) n).nodeType() == ELEMENT) {
+                return (Element) n;
             }
         }
 
@@ -715,41 +628,15 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static DocumentFragment _document_createDocumentFragment(Dom d) {
-        Locale l = d.locale();
-
-        Dom f;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                f = document_createDocumentFragment(d);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    f = document_createDocumentFragment(d);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (DocumentFragment) f;
+        return syncWrap(d, DomImpl::document_createDocumentFragment);
     }
 
-    public static Dom document_createDocumentFragment(Dom d) {
+    public static DocumentFragment document_createDocumentFragment(Dom d) {
         Cur c = d.locale().tempCur();
-
         c.createDomDocFragRoot();
-
         Dom f = c.getDom();
-
         c.release();
-
-        return f;
+        return (DocumentFragment) f;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -757,44 +644,17 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Element _document_createElement(Dom d, String name) {
-        Locale l = d.locale();
-
-        Dom e;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                e = document_createElement(d, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    e = document_createElement(d, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Element) e;
+        return syncWrap(d, p -> document_createElement(p, name));
     }
 
-    public static Dom document_createElement(Dom d, String name) {
+    public static Element document_createElement(Dom d, String name) {
         validateName(name);
-
         Locale l = d.locale();
-
         Cur c = l.tempCur();
-
         c.createElement(l.makeQualifiedQName("", name));
-
-        Dom e = c.getDom();
-
+        ElementXobj e = (ElementXobj) c.getDom();
         c.release();
-        ((ElementXobj) e)._canHavePrefixUri = false;
+        e._canHavePrefixUri = false;
         return e;
     }
 
@@ -803,45 +663,17 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Element _document_createElementNS(Dom d, String uri, String qname) {
-        Locale l = d.locale();
-
-        Dom e;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                e = document_createElementNS(d, uri, qname);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    e = document_createElementNS(d, uri, qname);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Element) e;
+        return syncWrap(d, p -> document_createElementNS(p, uri, qname));
     }
 
-    public static Dom document_createElementNS(Dom d, String uri, String qname) {
+    public static Element document_createElementNS(Dom d, String uri, String qname) {
         validateQualifiedName(qname, uri, false);
-
         Locale l = d.locale();
-
         Cur c = l.tempCur();
-
         c.createElement(l.makeQualifiedQName(uri, qname));
-
         Dom e = c.getDom();
-
         c.release();
-
-        return e;
+        return (Element) e;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -849,44 +681,17 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Attr _document_createAttribute(Dom d, String name) {
-        Locale l = d.locale();
-
-        Dom a;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                a = document_createAttribute(d, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    a = document_createAttribute(d, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Attr) a;
+        return syncWrap(d, p -> document_createAttribute(p, name));
     }
 
-    public static Dom document_createAttribute(Dom d, String name) {
+    public static Attr document_createAttribute(Dom d, String name) {
         validateName(name);
-
         Locale l = d.locale();
-
         Cur c = l.tempCur();
-
         c.createAttr(l.makeQualifiedQName("", name));
-
-        Dom e = c.getDom();
-
+        AttrXobj e = (AttrXobj) c.getDom();
         c.release();
-        ((AttrXobj) e)._canHavePrefixUri = false;
+        e._canHavePrefixUri = false;
         return e;
     }
 
@@ -895,45 +700,17 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Attr _document_createAttributeNS(Dom d, String uri, String qname) {
-        Locale l = d.locale();
-
-        Dom a;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                a = document_createAttributeNS(d, uri, qname);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    a = document_createAttributeNS(d, uri, qname);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Attr) a;
+        return syncWrap(d, p -> document_createAttributeNS(p, uri, qname));
     }
 
-    public static Dom document_createAttributeNS(Dom d, String uri, String qname) {
+    public static Attr document_createAttributeNS(Dom d, String uri, String qname) {
         validateQualifiedName(qname, uri, true);
-
         Locale l = d.locale();
-
         Cur c = l.tempCur();
-
         c.createAttr(l.makeQualifiedQName(uri, qname));
-
         Dom e = c.getDom();
-
         c.release();
-
-        return e;
+        return (Attr) e;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -941,48 +718,20 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Comment _document_createComment(Dom d, String data) {
-        Locale l = d.locale();
-
-        Dom c;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                c = document_createComment(d, data);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    c = document_createComment(d, data);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Comment) c;
+        return syncWrap(d, p -> document_createComment(p, data));
     }
 
-    public static Dom document_createComment(Dom d, String data) {
+    public static Comment document_createComment(Dom d, String data) {
         Locale l = d.locale();
-
         Cur c = l.tempCur();
-
         c.createComment();
-
         Dom comment = c.getDom();
-
         if (data != null) {
             c.next();
             c.insertString(data);
         }
-
         c.release();
-
-        return comment;
+        return (Comment) comment;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -990,32 +739,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static ProcessingInstruction _document_createProcessingInstruction(Dom d, String target, String data) {
-        Locale l = d.locale();
-
-        Dom pi;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                pi = document_createProcessingInstruction(d, target, data);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    pi = document_createProcessingInstruction(d, target, data);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (ProcessingInstruction) pi;
+        return syncWrap(d, p -> document_createProcessingInstruction(p, target, data));
     }
 
-    public static Dom document_createProcessingInstruction(Dom d, String target, String data) {
+    public static ProcessingInstruction document_createProcessingInstruction(Dom d, String target, String data) {
         if (target == null) {
             throw new IllegalArgumentException("Target is null");
         }
@@ -1033,21 +760,15 @@
         }
 
         Locale l = d.locale();
-
         Cur c = l.tempCur();
-
         c.createProcinst(target);
-
         Dom pi = c.getDom();
-
         if (data != null) {
             c.next();
             c.insertString(data);
         }
-
         c.release();
-
-        return pi;
+        return (ProcessingInstruction) pi;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1055,10 +776,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static CDATASection _document_createCDATASection(Dom d, String data) {
-        return (CDATASection) document_createCDATASection(d, data);
+        return document_createCDATASection(d, data);
     }
 
-    public static Dom document_createCDATASection(Dom d, String data) {
+    public static CDATASection document_createCDATASection(Dom d, String data) {
         TextNode t = d.locale().createCdataNode();
 
         if (data == null) {
@@ -1067,7 +788,7 @@
 
         t.setChars(data, 0, data.length());
 
-        return t;
+        return (CDATASection) t;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1075,10 +796,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Text _document_createTextNode(Dom d, String data) {
-        return (Text) document_createTextNode(d, data);
+        return document_createTextNode(d, data);
     }
 
-    public static CharNode document_createTextNode(Dom d, String data) {
+    public static Text document_createTextNode(Dom d, String data) {
         TextNode t = d.locale().createTextNode();
 
         if (data == null) {
@@ -1094,6 +815,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static EntityReference _document_createEntityReference(Dom d, String name) {
         throw new RuntimeException("Not implemented");
     }
@@ -1102,6 +824,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static Element _document_getElementById(Dom d, String elementId) {
         throw new RuntimeException("Not implemented");
     }
@@ -1111,25 +834,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static NodeList _document_getElementsByTagName(Dom d, String name) {
-        Locale l = d.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return document_getElementsByTagName(d, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return document_getElementsByTagName(d, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> document_getElementsByTagName(p, name));
     }
 
     public static NodeList document_getElementsByTagName(Dom d, String name) {
@@ -1141,25 +846,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static NodeList _document_getElementsByTagNameNS(Dom d, String uri, String local) {
-        Locale l = d.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return document_getElementsByTagNameNS(d, uri, local);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return document_getElementsByTagNameNS(d, uri, local);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> document_getElementsByTagNameNS(p, uri, local));
     }
 
     public static NodeList document_getElementsByTagNameNS(Dom d, String uri, String local) {
@@ -1171,7 +858,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static DOMImplementation _document_getImplementation(Dom d) {
-        return (DOMImplementation) d.locale();
+        return d.locale();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1179,43 +866,16 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _document_importNode(Dom d, Node n, boolean deep) {
-        Locale l = d.locale();
-        Dom i;
-
-//        // TODO - need to wrap this in sync ..
-//        if (n instanceof Dom)
-//            i = node_cloneNode( (Dom) n, deep, m );
-//        else
-// TODO -- I'm importing my own nodes through DOM methods!  -- make this faster
-        {
-            if (l.noSync()) {
-                l.enter();
-                try {
-                    i = document_importNode(d, n, deep);
-                } finally {
-                    l.exit();
-                }
-            } else {
-                synchronized (l) {
-                    l.enter();
-                    try {
-                        i = document_importNode(d, n, deep);
-                    } finally {
-                        l.exit();
-                    }
-                }
-            }
-        }
-
-        return (Node) i;
+        // TODO -- I'm importing my own nodes through DOM methods!  -- make this faster
+        return syncWrap(d, p -> document_importNode(p, n, deep));
     }
 
-    public static Dom document_importNode(Dom d, Node n, boolean deep) {
+    public static Node document_importNode(Dom d, Node n, boolean deep) {
         if (n == null) {
             return null;
         }
 
-        Dom i;
+        Node i;
 
         boolean copyChildren = false;
 
@@ -1246,7 +906,7 @@
                 NamedNodeMap attrs = n.getAttributes();
 
                 for (int a = 0; a < attrs.getLength(); a++) {
-                    attributes_setNamedItem(i, document_importNode(d, attrs.item(a), true));
+                    attributes_setNamedItem((Dom) i, (Dom) document_importNode(d, attrs.item(a), true));
                 }
 
                 copyChildren = deep;
@@ -1317,7 +977,7 @@
             NodeList children = n.getChildNodes();
 
             for (int c = 0; c < children.getLength(); c++) {
-                node_insertBefore(i, document_importNode(d, children.item(c), true), null);
+                node_insertBefore((Dom) i, (Dom) document_importNode(d, children.item(c), true), null);
             }
         }
 
@@ -1329,32 +989,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static DocumentType _document_getDoctype(Dom d) {
-        Locale l = d.locale();
-
-        Dom dt;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                dt = document_getDoctype(d);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    dt = document_getDoctype(d);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (DocumentType) dt;
+        return syncWrap(d, DomImpl::document_getDoctype);
     }
 
-    public static Dom document_getDoctype(Dom d) {
+    public static DocumentType document_getDoctype(Dom d) {
         return null;
     }
 
@@ -1362,33 +1000,11 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Document _node_getOwnerDocument(Dom n) {
-        Locale l = n.locale();
-
-        Dom d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                d = node_getOwnerDocument(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    d = node_getOwnerDocument(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Document) d;
+    public static Document _node_getOwnerDocument(Dom d) {
+        return syncWrap(d, DomImpl::node_getOwnerDocument);
     }
 
-    public static Dom node_getOwnerDocument(Dom n) {
+    public static Document node_getOwnerDocument(Dom n) {
         if (n.nodeType() == DOCUMENT) {
             return null;
         }
@@ -1402,40 +1018,18 @@
             c.release();
         }
 
-        return l._ownerDoc;
+        return (Document) l._ownerDoc;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Node _node_getParentNode(Dom n) {
-        Locale l = n.locale();
-
-        Dom p;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                p = node_getParentNode(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    p = node_getParentNode(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) p;
+    public static Node _node_getParentNode(Dom d) {
+        return syncWrap(d, DomImpl::node_getParentNode);
     }
 
-    public static Dom node_getParentNode(Dom n) {
+    public static Node node_getParentNode(Dom n) {
         Cur c = null;
 
         switch (n.nodeType()) {
@@ -1484,7 +1078,7 @@
 
         c.release();
 
-        return d;
+        return (Node) d;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1492,9 +1086,6 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _node_getFirstChild(Dom n) {
-        Locale l = n.locale();
-
-        Dom fc;
         assert n instanceof Xobj;
         Xobj node = (Xobj) n;
         if (!node.isVacant()) {
@@ -1510,18 +1101,11 @@
                 return node._charNodesValue;
             }
         }
-        if (l.noSync()) {
-            fc = node_getFirstChild(n);
-        } else {
-            synchronized (l) {
-                fc = node_getFirstChild(n);
-            }
-        }
 
-        return (Node) fc;
+        return syncWrapNoEnter(n, DomImpl::node_getFirstChild);
     }
 
-    public static Dom node_getFirstChild(Dom n) {
+    public static Node node_getFirstChild(Dom n) {
         Dom fc = null;
 
         switch (n.nodeType()) {
@@ -1554,7 +1138,7 @@
                     if (lastAttr.isNextSiblingPtrDomUsable()) {
                         return (NodeXobj) lastAttr._nextSibling;
                     } else if (lastAttr.isCharNodesAfterUsable()) {
-                        return (CharNode) lastAttr._charNodesAfter;
+                        return lastAttr._charNodesAfter;
                     }
                 }
                 if (node.isCharNodesValueUsable()) {
@@ -1568,7 +1152,7 @@
 
         // TODO - handle entity refs here ...
 
-        return fc;
+        return (Node) fc;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1576,32 +1160,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _node_getLastChild(Dom n) {
-        Locale l = n.locale();
-
-        Dom lc;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                lc = node_getLastChild(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    lc = node_getLastChild(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) lc;
+        return syncWrap(n, DomImpl::node_getLastChild);
     }
 
-    public static Dom node_getLastChild(Dom n) {
+    public static Node node_getLastChild(Dom n) {
         switch (n.nodeType()) {
             case TEXT:
             case CDATA:
@@ -1654,7 +1216,7 @@
 
         // TODO - handle entity refs here ...
 
-        return lc;
+        return (Node) lc;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1662,22 +1224,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _node_getNextSibling(Dom n) {
-        Locale l = n.locale();
-
-        Dom ns;
-
-        if (l.noSync()) {
-            ns = node_getNextSibling(n);
-        } else {
-            synchronized (l) {
-                ns = node_getNextSibling(n);
-            }
-        }
-
-        return (Node) ns;
+        return syncWrapNoEnter(n, DomImpl::node_getNextSibling);
     }
 
-    public static Dom node_getNextSibling(Dom n) {
+    public static Node node_getNextSibling(Dom n) {
         Dom ns = null;
 
         switch (n.nodeType()) {
@@ -1748,7 +1298,7 @@
 
         // TODO - handle entity refs here ...
 
-        return ns;
+        return (Node) ns;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1756,23 +1306,11 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _node_getPreviousSibling(Dom n) {
-        Locale l = n.locale();
-
-        Dom ps;
-
-        if (l.noSync()) {
-            ps = node_getPreviousSibling(n);
-        } else {
-            synchronized (l) {
-                ps = node_getPreviousSibling(n);
-            }
-        }
-
-        return (Node) ps;
+        return syncWrapNoEnter(n, DomImpl::node_getPreviousSibling);
     }
 
-    public static Dom node_getPreviousSibling(Dom n) {
-        Dom prev;
+    public static Node node_getPreviousSibling(Dom n) {
+        Node prev;
         switch (n.nodeType()) {
             case TEXT:
             case CDATA: {
@@ -1781,28 +1319,27 @@
                 if (!(node.getObject() instanceof Xobj)) {
                     return null;
                 }
-                Xobj src = (Xobj) node.getObject();
+                NodeXobj src = (NodeXobj) node.getObject();
                 src.ensureOccupancy();
                 boolean isThisNodeAfterText = node.isNodeAftertext();
                 prev = node._prev;
                 if (prev == null) {
-                    prev = isThisNodeAfterText ? (Dom) src :
-                        src._charNodesValue;
+                    prev = isThisNodeAfterText ? src : src._charNodesValue;
                 }
                 break;
             }
             default: {
-                assert n instanceof Xobj;
-                Xobj node = (Xobj) n;
-                prev = (Dom) node._prevSibling;
+                assert n instanceof NodeXobj;
+                NodeXobj node = (NodeXobj) n;
+                prev = (NodeXobj) node._prevSibling;
                 if ((prev == null || !(node instanceof AttrXobj) && prev instanceof AttrXobj) &&
                     node._parent != null) {
                     prev = node_getFirstChild((Dom) node._parent);
                 }
             }
         }
-        Dom temp = prev;
-        while (temp != null && (temp = node_getNextSibling(temp)) != n) {
+        Node temp = prev;
+        while (temp != null && (temp = node_getNextSibling((Dom) temp)) != n) {
             prev = temp;
         }
         return prev;
@@ -1813,25 +1350,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static boolean _node_hasAttributes(Dom n) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return node_hasAttributes(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return node_hasAttributes(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, DomImpl::node_hasAttributes);
     }
 
     public static boolean node_hasAttributes(Dom n) {
@@ -1839,9 +1358,7 @@
 
         if (n.nodeType() == ELEMENT) {
             Cur c = n.tempCur();
-
             hasAttrs = c.hasAttrs();
-
             c.release();
         }
 
@@ -1861,25 +1378,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static void _node_normalize(Dom n) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                node_normalize(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    node_normalize(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, DomImpl::node_normalize);
     }
 
     public static void node_normalize(Dom n) {
@@ -1977,52 +1476,33 @@
             throw new WrongDocumentErr("Child to add is from another document");
         }
 
-        Dom oc = null;
+        Dom oc;
 
         if (!(oldChild instanceof Dom) || (oc = (Dom) oldChild).locale() != l) {
             throw new WrongDocumentErr("Child to replace is from another document");
         }
 
-        Dom d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                d = node_replaceChild(p, nc, oc);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    d = node_replaceChild(p, nc, oc);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) d;
+        Dom oc2 = oc;
+        return syncWrap(p, x -> node_replaceChild(x, nc, oc2));
     }
 
-    public static Dom node_replaceChild(Dom p, Dom newChild, Dom oldChild) {
+    public static Node node_replaceChild(Dom p, Dom newChild, Dom oldChild) {
         // Remove the old child firest to avoid a dom exception raised
         // when inserting two document elements
 
-        Dom nextNode = node_getNextSibling(oldChild);
+        Node nextNode = node_getNextSibling(oldChild);
 
         node_removeChild(p, oldChild);
 
         try {
-            node_insertBefore(p, newChild, nextNode);
+            node_insertBefore(p, newChild, (Dom) nextNode);
         } catch (DOMException e) {
-            node_insertBefore(p, oldChild, nextNode);
+            node_insertBefore(p, oldChild, (Dom) nextNode);
 
             throw e;
         }
 
-        return oldChild;
+        return (Node) oldChild;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2049,37 +1529,18 @@
                 throw new WrongDocumentErr("Reference child is from another document");
             }
         }
+        Dom rc2 = rc;
 
-        Dom d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                d = node_insertBefore(p, nc, rc);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    d = node_insertBefore(p, nc, rc);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) d;
+        return syncWrap(p, x -> node_insertBefore(x, nc, rc2));
     }
 
-    public static Dom node_insertBefore(Dom p, Dom nc, Dom rc) {
+    public static Node node_insertBefore(Dom p, Dom nc, final Dom rc) {
         assert nc != null;
 
         // Inserting self before self is a no-op
 
         if (nc == rc) {
-            return nc;
+            return (Node) nc;
         }
 
         if (rc != null && parent(rc) != p) {
@@ -2091,23 +1552,23 @@
         int nck = nc.nodeType();
 
         if (nck == DOCFRAG) {
-            for (Dom c = firstChild(nc); c != null; c = nextSibling(c)) {
-                validateNewChild(p, c);
+            for (Node c = firstChild(nc); c != null; c = nextSibling((Dom) c)) {
+                validateNewChild(p, (Dom) c);
             }
 
-            for (Dom c = firstChild(nc); c != null; ) {
-                Dom n = nextSibling(c);
+            for (Node c = firstChild(nc); c != null; ) {
+                Node n = nextSibling((Dom) c);
 
                 if (rc == null) {
-                    append(c, p);
+                    append((Dom) c, p);
                 } else {
-                    insert(c, rc);
+                    insert((Dom) c, rc);
                 }
 
                 c = n;
             }
 
-            return nc;
+            return (Node) nc;
         }
 
         //
@@ -2142,29 +1603,31 @@
                     if (rck == TEXT || rck == CDATA) {
                         // Quick and dirty impl....
 
-                        ArrayList charNodes = new ArrayList();
+                        List<Dom> charNodes = new ArrayList<>();
 
-                        while (rc != null && (rc.nodeType() == TEXT || rc.nodeType() == CDATA)) {
-                            Dom next = nextSibling(rc);
-                            charNodes.add(remove(rc));
-                            rc = next;
+                        Dom rc2 = rc;
+
+                        while (rc2 != null && (rc2.nodeType() == TEXT || rc2.nodeType() == CDATA)) {
+                            Node next = nextSibling(rc2);
+                            charNodes.add((Dom) remove(rc2));
+                            rc2 = (Dom) next;
                         }
 
-                        if (rc == null) {
+                        if (rc2 == null) {
                             append(nc, p);
                         } else {
-                            insert(nc, rc);
+                            insert(nc, rc2);
                         }
 
-                        rc = nextSibling(nc);
+                        rc2 = (Dom) nextSibling(nc);
 
-                        for (int i = 0; i < charNodes.size(); i++) {
-                            Dom n = (Dom) charNodes.get(i);
+                        for (Object charNode : charNodes) {
+                            Dom n = (Dom) charNode;
 
-                            if (rc == null) {
+                            if (rc2 == null) {
                                 append(n, p);
                             } else {
-                                insert(n, rc);
+                                insert(n, rc2);
                             }
                         }
                     } else if (rck == ENTITYREF) {
@@ -2232,7 +1695,7 @@
                 throw new RuntimeException("Unexpected child node type");
         }
 
-        return nc;
+        return (Node) nc;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2252,30 +1715,10 @@
             throw new WrongDocumentErr("Child to remove is from another document");
         }
 
-        Dom d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                d = node_removeChild(p, c);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    d = node_removeChild(p, c);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) d;
+        return syncWrap(p, x -> node_removeChild(x, c));
     }
 
-    public static Dom node_removeChild(Dom parent, Dom child) {
+    public static Node node_removeChild(Dom parent, Dom child) {
         if (parent(child) != parent) {
             throw new NotFoundErr("Child to remove is not a child of given parent");
         }
@@ -2295,19 +1738,13 @@
             case TEXT:
             case CDATA: {
                 Cur c = child.tempCur();
-
                 CharNode nodes = c.getCharNodes();
-
                 CharNode cn = (CharNode) child;
-
                 assert (cn.getDom() != null);
 
                 cn.setChars(c.moveChars(null, cn._cch), c._offSrc, c._cchSrc);
-
                 c.setCharNodes(CharNode.remove(nodes, cn));
-
                 c.release();
-
                 break;
             }
 
@@ -2323,7 +1760,7 @@
                 throw new RuntimeException("Unknown kind");
         }
 
-        return child;
+        return (Node) child;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2331,32 +1768,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _node_cloneNode(Dom n, boolean deep) {
-        Locale l = n.locale();
-
-        Dom c;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                c = node_cloneNode(n, deep);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    c = node_cloneNode(n, deep);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) c;
+        return syncWrap(n, p -> node_cloneNode(p, deep));
     }
 
-    public static Dom node_cloneNode(Dom n, boolean deep) {
+    public static Node node_cloneNode(Dom n, boolean deep) {
         Locale l = n.locale();
 
         Dom clone = null;
@@ -2432,15 +1847,10 @@
                 case TEXT:
                 case CDATA: {
                     Cur c = n.tempCur();
-
                     CharNode cn = n.nodeType() == TEXT ? l.createTextNode() : l.createCdataNode();
-
                     cn.setChars(c.getChars(((CharNode) n)._cch), c._offSrc, c._cchSrc);
-
                     clone = cn;
-
                     c.release();
-
                     break;
                 }
 
@@ -2455,7 +1865,7 @@
             }
         }
 
-        return clone;
+        return (Node) clone;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2480,9 +1890,8 @@
         }
         QName name = n.getQName();
         // TODO - should return the correct namespace for xmlns ...
-        return name == null ? "" :
-            //name.getNamespaceURI().equals("")? null:
-            name.getNamespaceURI();
+        //name.getNamespaceURI().equals("")? null:
+        return name == null ? "" : name.getNamespaceURI();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2490,25 +1899,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static void _node_setPrefix(Dom n, String prefix) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                node_setPrefix(n, prefix);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    node_setPrefix(n, prefix);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, p -> node_setPrefix(p, prefix));
     }
 
     public static void node_setPrefix(Dom n, String prefix) {
@@ -2528,7 +1919,6 @@
             prefix = validatePrefix(prefix, uri, local, n.nodeType() == ATTR);
 
             c.setName(n.locale().makeQName(uri, local, prefix));
-
             c.release();
         } else {
             validatePrefix(prefix, "", "", false);
@@ -2544,8 +1934,7 @@
             return null;
         }
         QName name = n.getQName();
-        return name == null ? "" :
-            name.getPrefix();
+        return name == null ? "" : name.getPrefix();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2598,25 +1987,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static void _node_setNodeValue(Dom n, String nodeValue) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                node_setNodeValue(n, nodeValue);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    node_setNodeValue(n, nodeValue);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, p -> node_setNodeValue(p, nodeValue));
     }
 
     public static void node_setNodeValue(Dom n, String nodeValue) {
@@ -2661,12 +2032,12 @@
                     children.item(0).setNodeValue(nodeValue);
                 }
                 if (((AttrXobj) n).isId()) {
-                    Dom d = DomImpl.node_getOwnerDocument(n);
+                    Document d = DomImpl.node_getOwnerDocument(n);
                     String val = node_getNodeValue(n);
                     if (d instanceof DocumentXobj) {
-                        ((DocumentXobj) d).removeIdElement(val);
-                        ((DocumentXobj) d).addIdElement(nodeValue,
-                            attr_getOwnerElement(n));
+                        DocumentXobj dox = (DocumentXobj) d;
+                        dox.removeIdElement(val);
+                        dox.addIdElement(nodeValue, (Dom) attr_getOwnerElement(n));
                     }
                 }
 
@@ -2694,15 +2065,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static String _node_getNodeValue(Dom n) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            return node_getNodeValue(n);
-        } else {
-            synchronized (l) {
-                return node_getNodeValue(n);
-            }
-        }
+        return syncWrapNoEnter(n, DomImpl::node_getNodeValue);
     }
 
     public static String node_getNodeValue(Dom n) {
@@ -2748,6 +2111,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static Object _node_getUserData(Dom n, String key) {
         throw new DomLevel3NotImplemented();
     }
@@ -2756,6 +2120,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static Object _node_setUserData(Dom n, String key, Object data, UserDataHandler handler) {
         throw new DomLevel3NotImplemented();
     }
@@ -2764,6 +2129,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static Object _node_getFeature(Dom n, String feature, String version) {
         throw new DomLevel3NotImplemented();
     }
@@ -2772,6 +2138,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static boolean _node_isEqualNode(Dom n, Node arg) {
         throw new DomLevel3NotImplemented();
     }
@@ -2798,6 +2165,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static String _node_lookupNamespaceURI(Dom n, String prefix) {
         throw new DomLevel3NotImplemented();
     }
@@ -2806,6 +2174,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static boolean _node_isDefaultNamespace(Dom n, String namespaceURI) {
         throw new DomLevel3NotImplemented();
     }
@@ -2814,6 +2183,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static String _node_lookupPrefix(Dom n, String namespaceURI) {
         throw new DomLevel3NotImplemented();
     }
@@ -2822,6 +2192,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static void _node_setTextContent(Dom n, String textContent) {
         throw new DomLevel3NotImplemented();
     }
@@ -2830,6 +2201,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static String _node_getTextContent(Dom n) {
         throw new DomLevel3NotImplemented();
     }
@@ -2892,6 +2264,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static String _node_getBaseURI(Dom n) {
         throw new DomLevel3NotImplemented();
     }
@@ -2901,24 +2274,12 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _childNodes_item(Dom n, int i) {
-        Locale l = n.locale();
-
-        Dom d;
-        if (i == 0) {
-            return _node_getFirstChild(n);
-        }
-        if (l.noSync()) {
-            d = childNodes_item(n, i);
-        } else {
-            synchronized (l) {
-                d = childNodes_item(n, i);
-            }
-        }
-
-        return (Node) d;
+        return i == 0
+            ? _node_getFirstChild(n)
+            : syncWrapNoEnter(n, p -> childNodes_item(p, i));
     }
 
-    public static Dom childNodes_item(Dom n, int i) {
+    public static Node childNodes_item(Dom n, int i) {
         if (i < 0) {
             return null;
         }
@@ -2947,7 +2308,7 @@
         if (i == 0) {
             return node_getFirstChild(n);
         }
-        return n.locale().findDomNthChild(n, i);
+        return (Node) n.locale().findDomNthChild(n, i);
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2955,7 +2316,6 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static int _childNodes_getLength(Dom n) {
-        Locale l = n.locale();
         assert n instanceof Xobj;
         int count;
         Xobj node = (Xobj) n;
@@ -2963,13 +2323,8 @@
             (count = node.getDomZeroOneChildren()) < 2) {
             return count;
         }
-        if (l.noSync()) {
-            return childNodes_getLength(n);
-        } else {
-            synchronized (l) {
-                return childNodes_getLength(n);
-            }
-        }
+
+        return syncWrapNoEnter(n, DomImpl::childNodes_getLength);
     }
 
     public static int childNodes_getLength(Dom n) {
@@ -3086,7 +2441,7 @@
     public static void _element_removeAttribute(Dom e, String name) {
         try {
             _attributes_removeNamedItem(e, name);
-        } catch (NotFoundErr ex) {
+        } catch (NotFoundErr ignored) {
         }
     }
 
@@ -3097,7 +2452,7 @@
     public static void _element_removeAttributeNS(Dom e, String uri, String local) {
         try {
             _attributes_removeNamedItemNS(e, uri, local);
-        } catch (NotFoundErr ex) {
+        } catch (NotFoundErr ignored) {
         }
     }
 
@@ -3122,39 +2477,24 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static void _element_setAttribute(Dom e, String name, String value) {
-        // TODO - validate all attr/element names in all apprpraite
-        // methdos
-
-        Locale l = e.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                element_setAttribute(e, name, value);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    element_setAttribute(e, name, value);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        // TODO - validate all attr/element names in all appropriate methods
+        syncWrapVoid(e, p -> element_setAttribute(p, name, value));
     }
 
     public static void element_setAttribute(Dom e, String name, String value) {
-        Dom a = attributes_getNamedItem(e, name);
+        Node a = attributes_getNamedItem(e, name);
 
         if (a == null) {
-            a = document_createAttribute(node_getOwnerDocument(e), name);
-            attributes_setNamedItem(e, a);
+            Dom e2 = (Dom) node_getOwnerDocument(e);
+            if (e2 == null) {
+                throw new NotFoundErr("Document element can't be determined.");
+            }
+
+            a = document_createAttribute(e2, name);
+            attributes_setNamedItem(e, (Dom) a);
         }
 
-        node_setNodeValue(a, value);
+        node_setNodeValue((Dom) a, value);
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3162,25 +2502,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static void _element_setAttributeNS(Dom e, String uri, String qname, String value) {
-        Locale l = e.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                element_setAttributeNS(e, uri, qname, value);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    element_setAttributeNS(e, uri, qname, value);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(e, p -> element_setAttributeNS(p, uri, qname, value));
     }
 
     public static void element_setAttributeNS(Dom e, String uri, String qname, String value) {
@@ -3190,15 +2512,15 @@
         String local = name.getLocalPart();
         String prefix = validatePrefix(name.getPrefix(), uri, local, true);
 
-        Dom a = attributes_getNamedItemNS(e, uri, local);
+        Node a = attributes_getNamedItemNS(e, uri, local);
 
         if (a == null) {
-            a = document_createAttributeNS(node_getOwnerDocument(e), uri, local);
-            attributes_setNamedItemNS(e, a);
+            a = document_createAttributeNS((Dom) node_getOwnerDocument(e), uri, local);
+            attributes_setNamedItemNS(e, (Dom) a);
         }
 
-        node_setPrefix(a, prefix);
-        node_setNodeValue(a, value);
+        node_setPrefix((Dom) a, prefix);
+        node_setNodeValue((Dom) a, value);
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3206,26 +2528,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static NodeList _element_getElementsByTagName(Dom e, String name) {
-        Locale l = e.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return element_getElementsByTagName(e, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return element_getElementsByTagName(e, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
+        return syncWrap(e, p -> element_getElementsByTagName(p, name));
     }
 
     public static NodeList element_getElementsByTagName(Dom e, String name) {
@@ -3237,25 +2540,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static NodeList _element_getElementsByTagNameNS(Dom e, String uri, String local) {
-        Locale l = e.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return element_getElementsByTagNameNS(e, uri, local);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return element_getElementsByTagNameNS(e, uri, local);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(e, p -> element_getElementsByTagNameNS(p, uri, local));
     }
 
     public static NodeList element_getElementsByTagNameNS(Dom e, String uri, String local) {
@@ -3267,30 +2552,11 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static int _attributes_getLength(Dom e) {
-        Locale l = e.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return attributes_getLength(e);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return attributes_getLength(e);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(e, DomImpl::attributes_getLength);
     }
 
     public static int attributes_getLength(Dom e) {
         int n = 0;
-
         Cur c = e.tempCur();
 
         while (c.toNextAttr()) {
@@ -3298,7 +2564,6 @@
         }
 
         c.release();
-
         return n;
     }
 
@@ -3319,30 +2584,10 @@
             throw new WrongDocumentErr("Attr to set is from another document");
         }
 
-        Dom oldA;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                oldA = attributes_setNamedItem(e, a);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    oldA = attributes_setNamedItem(e, a);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) oldA;
+        return syncWrap(e, p -> attributes_setNamedItem(p, a));
     }
 
-    public static Dom attributes_setNamedItem(Dom e, Dom a) {
+    public static Node attributes_setNamedItem(Dom e, Dom a) {
         if (attr_getOwnerElement(a) != null) {
             throw new InuseAttributeError();
         }
@@ -3381,7 +2626,7 @@
 
         c.release();
 
-        return oldAttr;
+        return (Node) oldAttr;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3389,39 +2634,15 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _attributes_getNamedItem(Dom e, String name) {
-        Locale l = e.locale();
-
-        Dom n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                n = attributes_getNamedItem(e, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    n = attributes_getNamedItem(e, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) n;
+        return syncWrap(e, p -> attributes_getNamedItem(e, name));
     }
 
-    public static Dom attributes_getNamedItem(Dom e, String name) {
+    public static Node attributes_getNamedItem(Dom e, String name) {
         Dom a = null;
-
         Cur c = e.tempCur();
 
         while (c.toNextAttr()) {
             Dom d = c.getDom();
-
             if (_node_getNodeName(d).equals(name)) {
                 a = d;
                 break;
@@ -3429,8 +2650,7 @@
         }
 
         c.release();
-
-        return a;
+        return (Node) a;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3438,43 +2658,19 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _attributes_getNamedItemNS(Dom e, String uri, String local) {
-        Locale l = e.locale();
-
-        Dom n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                n = attributes_getNamedItemNS(e, uri, local);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    n = attributes_getNamedItemNS(e, uri, local);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) n;
+        return syncWrap(e, p -> attributes_getNamedItemNS(p, uri, local));
     }
 
-    public static Dom attributes_getNamedItemNS(Dom e, String uri, String local) {
+    public static Node attributes_getNamedItemNS(Dom e, String uri, String local) {
         if (uri == null) {
             uri = "";
         }
 
         Dom a = null;
-
         Cur c = e.tempCur();
 
         while (c.toNextAttr()) {
             Dom d = c.getDom();
-
             QName n = d.getQName();
 
             if (n.getNamespaceURI().equals(uri) && n.getLocalPart().equals(local)) {
@@ -3484,8 +2680,7 @@
         }
 
         c.release();
-
-        return a;
+        return (Node) a;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3493,32 +2688,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _attributes_removeNamedItem(Dom e, String name) {
-        Locale l = e.locale();
-
-        Dom n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                n = attributes_removeNamedItem(e, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    n = attributes_removeNamedItem(e, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) n;
+        return syncWrap(e, p -> attributes_removeNamedItem(p, name));
     }
 
-    public static Dom attributes_removeNamedItem(Dom e, String name) {
+    public static Node attributes_removeNamedItem(Dom e, String name) {
         Dom oldAttr = null;
 
         Cur c = e.tempCur();
@@ -3532,7 +2705,7 @@
                 }
 
                 if (((AttrXobj) aa).isId()) {
-                    Dom d = DomImpl.node_getOwnerDocument(aa);
+                    Node d = DomImpl.node_getOwnerDocument(aa);
                     String val = node_getNodeValue(aa);
                     if (d instanceof DocumentXobj) {
                         ((DocumentXobj) d).removeIdElement(val);
@@ -3549,7 +2722,7 @@
             throw new NotFoundErr("Named item not found: " + name);
         }
 
-        return oldAttr;
+        return (Node) oldAttr;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3557,32 +2730,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _attributes_removeNamedItemNS(Dom e, String uri, String local) {
-        Locale l = e.locale();
-
-        Dom n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                n = attributes_removeNamedItemNS(e, uri, local);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    n = attributes_removeNamedItemNS(e, uri, local);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) n;
+        return syncWrap(e, p -> attributes_removeNamedItemNS(p, uri, local));
     }
 
-    public static Dom attributes_removeNamedItemNS(Dom e, String uri, String local) {
+    public static Node attributes_removeNamedItemNS(Dom e, String uri, String local) {
         if (uri == null) {
             uri = "";
         }
@@ -3601,7 +2752,7 @@
                     oldAttr = aa;
                 }
                 if (((AttrXobj) aa).isId()) {
-                    Dom d = DomImpl.node_getOwnerDocument(aa);
+                    Node d = DomImpl.node_getOwnerDocument(aa);
                     String val = node_getNodeValue(aa);
                     if (d instanceof DocumentXobj) {
                         ((DocumentXobj) d).removeIdElement(val);
@@ -3619,7 +2770,7 @@
             throw new NotFoundErr("Named item not found: uri=" + uri + ", local=" + local);
         }
 
-        return oldAttr;
+        return (Node) oldAttr;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3639,34 +2790,14 @@
             throw new WrongDocumentErr("Attr to set is from another document");
         }
 
-        Dom oldA;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                oldA = attributes_setNamedItemNS(e, a);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    oldA = attributes_setNamedItemNS(e, a);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) oldA;
+        return syncWrap(e, p -> attributes_setNamedItemNS(p, a));
     }
 
-    public static Dom attributes_setNamedItemNS(Dom e, Dom a) {
-        Dom owner = attr_getOwnerElement(a);
+    public static Node attributes_setNamedItemNS(Dom e, Dom a) {
+        Node owner = attr_getOwnerElement(a);
 
         if (owner == e) {
-            return a;
+            return (Node) a;
         }
 
         if (owner != null) {
@@ -3707,7 +2838,7 @@
 
         c.release();
 
-        return oldAttr;
+        return (Node) oldAttr;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3715,32 +2846,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Node _attributes_item(Dom e, int index) {
-        Locale l = e.locale();
-
-        Dom a;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                a = attributes_item(e, index);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    a = attributes_item(e, index);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Node) a;
+        return syncWrap(e, p -> attributes_item(p, index));
     }
 
-    public static Dom attributes_item(Dom e, int index) {
+    public static Node attributes_item(Dom e, int index) {
         if (index < 0) {
             return null;
         }
@@ -3758,7 +2867,7 @@
 
         c.release();
 
-        return a;
+        return (Node) a;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3789,6 +2898,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static boolean _attr_getSpecified(Dom a) {
         // Can't tell the difference
         return true;
@@ -3799,32 +2909,10 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static Element _attr_getOwnerElement(Dom a) {
-        Locale l = a.locale();
-
-        Dom e;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                e = attr_getOwnerElement(a);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    e = attr_getOwnerElement(a);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Element) e;
+        return syncWrap(a, DomImpl::attr_getOwnerElement);
     }
 
-    public static Dom attr_getOwnerElement(Dom n) {
+    public static Element attr_getOwnerElement(Dom n) {
         Cur c = n.tempCur();
 
         if (!c.toParentRaw()) {
@@ -3833,10 +2921,8 @@
         }
 
         Dom p = c.getDom();
-
         c.release();
-
-        return p;
+        return (Element) p;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3985,6 +3071,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static String _text_getWholeText(Dom t) {
         throw new DomLevel3NotImplemented();
     }
@@ -3993,6 +3080,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static boolean _text_isElementContentWhitespace(Dom t) {
         throw new DomLevel3NotImplemented();
     }
@@ -4001,6 +3089,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
+    @SuppressWarnings("unused")
     public static Text _text_replaceWholeText(Dom t, String content) {
         throw new DomLevel3NotImplemented();
     }
@@ -4010,25 +3099,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static XMLStreamReader _getXmlStreamReader(Dom n) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return getXmlStreamReader(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return getXmlStreamReader(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, DomImpl::getXmlStreamReader);
     }
 
     public static XMLStreamReader getXmlStreamReader(Dom n) {
@@ -4087,34 +3158,13 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static XmlCursor _getXmlCursor(Dom n) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return getXmlCursor(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return getXmlCursor(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, DomImpl::getXmlCursor);
     }
 
     public static XmlCursor getXmlCursor(Dom n) {
         Cur c = n.tempCur();
-
         Cursor xc = new Cursor(c);
-
         c.release();
-
         return xc;
     }
 
@@ -4123,34 +3173,13 @@
     //////////////////////////////////////////////////////////////////////////////////////
 
     public static XmlObject _getXmlObject(Dom n) {
-        Locale l = n.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return getXmlObject(n);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return getXmlObject(n);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, DomImpl::getXmlObject);
     }
 
     public static XmlObject getXmlObject(Dom n) {
         Cur c = n.tempCur();
-
         XmlObject x = c.getObject();
-
         c.release();
-
         return x;
     }
 
@@ -4164,27 +3193,8 @@
     //
 
     public static boolean _soapText_isComment(Dom n) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Text text = (org.apache.xmlbeans.impl.soap.Text) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapText_isComment(text);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapText_isComment(text);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, p -> p.locale()._saaj.soapText_isComment(text));
     }
 
     //
@@ -4192,147 +3202,33 @@
     //
 
     public static void _soapNode_detachNode(Dom n) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Node node = (org.apache.xmlbeans.impl.soap.Node) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapNode_detachNode(node);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapNode_detachNode(node);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, p -> p.locale()._saaj.soapNode_detachNode(node));
     }
 
     public static void _soapNode_recycleNode(Dom n) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Node node = (org.apache.xmlbeans.impl.soap.Node) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapNode_recycleNode(node);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapNode_recycleNode(node);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, p -> p.locale()._saaj.soapNode_recycleNode(node));
     }
 
     public static String _soapNode_getValue(Dom n) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Node node = (org.apache.xmlbeans.impl.soap.Node) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapNode_getValue(node);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapNode_getValue(node);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, p -> p.locale()._saaj.soapNode_getValue(node));
     }
 
     public static void _soapNode_setValue(Dom n, String value) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Node node = (org.apache.xmlbeans.impl.soap.Node) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapNode_setValue(node, value);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapNode_setValue(node, value);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, p -> p.locale()._saaj.soapNode_setValue(node, value));
     }
 
     public static SOAPElement _soapNode_getParentElement(Dom n) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Node node = (org.apache.xmlbeans.impl.soap.Node) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapNode_getParentElement(node);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapNode_getParentElement(node);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(n, p -> p.locale()._saaj.soapNode_getParentElement(node));
     }
 
     public static void _soapNode_setParentElement(Dom n, SOAPElement p) {
-        Locale l = n.locale();
-
         org.apache.xmlbeans.impl.soap.Node node = (org.apache.xmlbeans.impl.soap.Node) n;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapNode_setParentElement(node, p);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapNode_setParentElement(node, p);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(n, x -> x.locale()._saaj.soapNode_setParentElement(node, p));
     }
 
     //
@@ -4340,507 +3236,108 @@
     //
 
     public static void _soapElement_removeContents(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapElement_removeContents(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapElement_removeContents(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, x -> x.locale()._saaj.soapElement_removeContents(se));
     }
 
     public static String _soapElement_getEncodingStyle(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getEncodingStyle(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getEncodingStyle(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getEncodingStyle(se));
     }
 
     public static void _soapElement_setEncodingStyle(Dom d, String encodingStyle) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapElement_setEncodingStyle(se, encodingStyle);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapElement_setEncodingStyle(se, encodingStyle);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapElement_setEncodingStyle(se, encodingStyle));
     }
 
     public static boolean _soapElement_removeNamespaceDeclaration(Dom d, String prefix) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_removeNamespaceDeclaration(se, prefix);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_removeNamespaceDeclaration(se, prefix);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_removeNamespaceDeclaration(se, prefix));
     }
 
     public static Iterator _soapElement_getAllAttributes(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getAllAttributes(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getAllAttributes(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getAllAttributes(se));
     }
 
     public static Iterator _soapElement_getChildElements(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getChildElements(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getChildElements(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getChildElements(se));
     }
 
     public static Iterator _soapElement_getNamespacePrefixes(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getNamespacePrefixes(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getNamespacePrefixes(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getNamespacePrefixes(se));
     }
 
     public static SOAPElement _soapElement_addAttribute(Dom d, Name name, String value) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addAttribute(se, name, value);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addAttribute(se, name, value);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapElement_addAttribute(se, name, value));
     }
 
     public static SOAPElement _soapElement_addChildElement(Dom d, SOAPElement oldChild) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addChildElement(se, oldChild);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addChildElement(se, oldChild);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapElement_addChildElement(se, oldChild));
     }
 
     public static SOAPElement _soapElement_addChildElement(Dom d, Name name) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addChildElement(se, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addChildElement(se, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapElement_addChildElement(se, name));
     }
 
     public static SOAPElement _soapElement_addChildElement(Dom d, String localName) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addChildElement(se, localName);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addChildElement(se, localName);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapElement_addChildElement(se, localName));
     }
 
     public static SOAPElement _soapElement_addChildElement(Dom d, String localName, String prefix) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addChildElement(se, localName, prefix);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addChildElement(se, localName, prefix);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapElement_addChildElement(se, localName, prefix));
     }
 
     public static SOAPElement _soapElement_addChildElement(Dom d, String localName, String prefix, String uri) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addChildElement(se, localName, prefix, uri);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addChildElement(se, localName, prefix, uri);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapElement_addChildElement(se, localName, prefix, uri));
     }
 
     public static SOAPElement _soapElement_addNamespaceDeclaration(Dom d, String prefix, String uri) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addNamespaceDeclaration(se, prefix, uri);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addNamespaceDeclaration(se, prefix, uri);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_addNamespaceDeclaration(se, prefix, uri));
     }
 
     public static SOAPElement _soapElement_addTextNode(Dom d, String data) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_addTextNode(se, data);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_addTextNode(se, data);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_addTextNode(se, data));
     }
 
     public static String _soapElement_getAttributeValue(Dom d, Name name) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getAttributeValue(se, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getAttributeValue(se, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getAttributeValue(se, name));
     }
 
     public static Iterator _soapElement_getChildElements(Dom d, Name name) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getChildElements(se, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getChildElements(se, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getChildElements(se, name));
     }
 
     public static Name _soapElement_getElementName(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getElementName(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getElementName(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getElementName(se));
     }
 
     public static String _soapElement_getNamespaceURI(Dom d, String prefix) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getNamespaceURI(se, prefix);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getNamespaceURI(se, prefix);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getNamespaceURI(se, prefix));
     }
 
     public static Iterator _soapElement_getVisibleNamespacePrefixes(Dom d) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_getVisibleNamespacePrefixes(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_getVisibleNamespacePrefixes(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_getVisibleNamespacePrefixes(se));
     }
 
     public static boolean _soapElement_removeAttribute(Dom d, Name name) {
-        Locale l = d.locale();
-
         SOAPElement se = (SOAPElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapElement_removeAttribute(se, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapElement_removeAttribute(se, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapElement_removeAttribute(se, name));
     }
 
     //
@@ -4848,147 +3345,33 @@
     //
 
     public static SOAPBody _soapEnvelope_addBody(Dom d) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPEnvelope se = (SOAPEnvelope) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapEnvelope_addBody(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapEnvelope_addBody(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapEnvelope_addBody(se));
     }
 
     public static SOAPBody _soapEnvelope_getBody(Dom d) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPEnvelope se = (SOAPEnvelope) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapEnvelope_getBody(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapEnvelope_getBody(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapEnvelope_getBody(se));
     }
 
     public static SOAPHeader _soapEnvelope_getHeader(Dom d) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPEnvelope se = (SOAPEnvelope) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapEnvelope_getHeader(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapEnvelope_getHeader(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapEnvelope_getHeader(se));
     }
 
     public static SOAPHeader _soapEnvelope_addHeader(Dom d) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPEnvelope se = (SOAPEnvelope) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapEnvelope_addHeader(se);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapEnvelope_addHeader(se);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapEnvelope_addHeader(se));
     }
 
     public static Name _soapEnvelope_createName(Dom d, String localName) {
-        Locale l = d.locale();
-
         SOAPEnvelope se = (SOAPEnvelope) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapEnvelope_createName(se, localName);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapEnvelope_createName(se, localName);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapEnvelope_createName(se, localName));
     }
 
     public static Name _soapEnvelope_createName(Dom d, String localName, String prefix, String namespaceURI) {
-        Locale l = d.locale();
-
         SOAPEnvelope se = (SOAPEnvelope) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapEnvelope_createName(se, localName, prefix, namespaceURI);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapEnvelope_createName(se, localName, prefix, namespaceURI);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapEnvelope_createName(se, localName, prefix, namespaceURI));
     }
 
     //
@@ -4996,147 +3379,33 @@
     //
 
     public static Iterator soapHeader_examineAllHeaderElements(Dom d) {
-        Locale l = d.locale();
-
         SOAPHeader sh = (SOAPHeader) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeader_examineAllHeaderElements(sh);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeader_examineAllHeaderElements(sh);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeader_examineAllHeaderElements(sh));
     }
 
     public static Iterator soapHeader_extractAllHeaderElements(Dom d) {
-        Locale l = d.locale();
-
         SOAPHeader sh = (SOAPHeader) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeader_extractAllHeaderElements(sh);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeader_extractAllHeaderElements(sh);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeader_extractAllHeaderElements(sh));
     }
 
     public static Iterator soapHeader_examineHeaderElements(Dom d, String actor) {
-        Locale l = d.locale();
-
         SOAPHeader sh = (SOAPHeader) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeader_examineHeaderElements(sh, actor);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeader_examineHeaderElements(sh, actor);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeader_examineHeaderElements(sh, actor));
     }
 
     public static Iterator soapHeader_examineMustUnderstandHeaderElements(Dom d, String mustUnderstandString) {
-        Locale l = d.locale();
-
         SOAPHeader sh = (SOAPHeader) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeader_examineMustUnderstandHeaderElements(sh, mustUnderstandString);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeader_examineMustUnderstandHeaderElements(sh, mustUnderstandString);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeader_examineMustUnderstandHeaderElements(sh, mustUnderstandString));
     }
 
     public static Iterator soapHeader_extractHeaderElements(Dom d, String actor) {
-        Locale l = d.locale();
-
         SOAPHeader sh = (SOAPHeader) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeader_extractHeaderElements(sh, actor);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeader_extractHeaderElements(sh, actor);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeader_extractHeaderElements(sh, actor));
     }
 
     public static SOAPHeaderElement soapHeader_addHeaderElement(Dom d, Name name) {
-        Locale l = d.locale();
-
         SOAPHeader sh = (SOAPHeader) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeader_addHeaderElement(sh, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeader_addHeaderElement(sh, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeader_addHeaderElement(sh, name));
     }
 
     //
@@ -5144,171 +3413,38 @@
     //
 
     public static boolean soapBody_hasFault(Dom d) {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_hasFault(sb);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_hasFault(sb);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapBody_hasFault(sb));
     }
 
     public static SOAPFault soapBody_addFault(Dom d) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_addFault(sb);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_addFault(sb);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapBody_addFault(sb));
     }
 
     public static SOAPFault soapBody_getFault(Dom d) {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_getFault(sb);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_getFault(sb);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapBody_getFault(sb));
     }
 
     public static SOAPBodyElement soapBody_addBodyElement(Dom d, Name name) {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_addBodyElement(sb, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_addBodyElement(sb, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapBody_addBodyElement(sb, name));
     }
 
     public static SOAPBodyElement soapBody_addDocument(Dom d, Document document) {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_addDocument(sb, document);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_addDocument(sb, document);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapBody_addDocument(sb, document));
     }
 
     public static SOAPFault soapBody_addFault(Dom d, Name name, String s) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_addFault(sb, name, s);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_addFault(sb, name, s);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapBody_addFault(sb, name, s));
     }
 
     public static SOAPFault soapBody_addFault(Dom d, Name faultCode, String faultString, java.util.Locale locale) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPBody sb = (SOAPBody) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapBody_addFault(sb, faultCode, faultString, locale);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapBody_addFault(sb, faultCode, faultString, locale);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapBody_addFault(sb, faultCode, faultString, locale));
     }
 
     //
@@ -5316,291 +3452,69 @@
     //
 
     public static void soapFault_setFaultString(Dom d, String faultString) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapFault_setFaultString(sf, faultString);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapFault_setFaultString(sf, faultString);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapFault_setFaultString(sf, faultString));
     }
 
     public static void soapFault_setFaultString(Dom d, String faultString, java.util.Locale locale) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapFault_setFaultString(sf, faultString, locale);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapFault_setFaultString(sf, faultString, locale);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapFault_setFaultString(sf, faultString, locale));
     }
 
     public static void soapFault_setFaultCode(Dom d, Name faultCodeName) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapFault_setFaultCode(sf, faultCodeName);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapFault_setFaultCode(sf, faultCodeName);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapEx(d, () -> {
+            d.locale()._saaj.soapFault_setFaultCode(sf, faultCodeName);
+            return null;
+        });
     }
 
     public static void soapFault_setFaultActor(Dom d, String faultActorString) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapFault_setFaultActor(sf, faultActorString);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapFault_setFaultActor(sf, faultActorString);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapFault_setFaultActor(sf, faultActorString));
     }
 
     public static String soapFault_getFaultActor(Dom d) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_getFaultActor(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_getFaultActor(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapFault_getFaultActor(sf));
     }
 
     public static String soapFault_getFaultCode(Dom d) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_getFaultCode(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_getFaultCode(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapFault_getFaultCode(sf));
     }
 
     public static void soapFault_setFaultCode(Dom d, String faultCode) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapFault_setFaultCode(sf, faultCode);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapFault_setFaultCode(sf, faultCode);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapEx(d, () -> {
+            d.locale()._saaj.soapFault_setFaultCode(sf, faultCode);
+            return null;
+        });
     }
 
     public static java.util.Locale soapFault_getFaultStringLocale(Dom d) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_getFaultStringLocale(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_getFaultStringLocale(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapFault_getFaultStringLocale(sf));
     }
 
     public static Name soapFault_getFaultCodeAsName(Dom d) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_getFaultCodeAsName(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_getFaultCodeAsName(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapFault_getFaultCodeAsName(sf));
     }
 
     public static String soapFault_getFaultString(Dom d) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_getFaultString(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_getFaultString(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapFault_getFaultString(sf));
     }
 
     public static Detail soapFault_addDetail(Dom d) throws SOAPException {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_addDetail(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_addDetail(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrapEx(d, () -> d.locale()._saaj.soapFault_addDetail(sf));
     }
 
     public static Detail soapFault_getDetail(Dom d) {
-        Locale l = d.locale();
-
         SOAPFault sf = (SOAPFault) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapFault_getDetail(sf);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapFault_getDetail(sf);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapFault_getDetail(sf));
     }
 
     //
@@ -5608,99 +3522,23 @@
     //
 
     public static void soapHeaderElement_setMustUnderstand(Dom d, boolean mustUnderstand) {
-        Locale l = d.locale();
-
         SOAPHeaderElement she = (SOAPHeaderElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapHeaderElement_setMustUnderstand(she, mustUnderstand);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapHeaderElement_setMustUnderstand(she, mustUnderstand);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapHeaderElement_setMustUnderstand(she, mustUnderstand));
     }
 
     public static boolean soapHeaderElement_getMustUnderstand(Dom d) {
-        Locale l = d.locale();
-
         SOAPHeaderElement she = (SOAPHeaderElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeaderElement_getMustUnderstand(she);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeaderElement_getMustUnderstand(she);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeaderElement_getMustUnderstand(she));
     }
 
     public static void soapHeaderElement_setActor(Dom d, String actor) {
-        Locale l = d.locale();
-
         SOAPHeaderElement she = (SOAPHeaderElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapHeaderElement_setActor(she, actor);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapHeaderElement_setActor(she, actor);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapHeaderElement_setActor(she, actor));
     }
 
     public static String soapHeaderElement_getActor(Dom d) {
-        Locale l = d.locale();
-
         SOAPHeaderElement she = (SOAPHeaderElement) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapHeaderElement_getActor(she);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapHeaderElement_getActor(she);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapHeaderElement_getActor(she));
     }
 
     //
@@ -5708,51 +3546,13 @@
     //
 
     public static DetailEntry detail_addDetailEntry(Dom d, Name name) {
-        Locale l = d.locale();
-
         Detail detail = (Detail) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.detail_addDetailEntry(detail, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.detail_addDetailEntry(detail, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.detail_addDetailEntry(detail, name));
     }
 
     public static Iterator detail_getDetailEntries(Dom d) {
-        Locale l = d.locale();
-
         Detail detail = (Detail) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.detail_getDetailEntries(detail);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.detail_getDetailEntries(detail);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.detail_getDetailEntries(detail));
     }
 
     //
@@ -5760,267 +3560,58 @@
     //
 
     public static void _soapPart_removeAllMimeHeaders(Dom d) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapPart_removeAllMimeHeaders(sp);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapPart_removeAllMimeHeaders(sp);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapPart_removeAllMimeHeaders(sp));
     }
 
     public static void _soapPart_removeMimeHeader(Dom d, String name) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapPart_removeMimeHeader(sp, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapPart_removeMimeHeader(sp, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapPart_removeMimeHeader(sp, name));
     }
 
     public static Iterator _soapPart_getAllMimeHeaders(Dom d) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapPart_getAllMimeHeaders(sp);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapPart_getAllMimeHeaders(sp);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapPart_getAllMimeHeaders(sp));
     }
 
     public static SOAPEnvelope _soapPart_getEnvelope(Dom d) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapPart_getEnvelope(sp);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapPart_getEnvelope(sp);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapPart_getEnvelope(sp));
     }
 
     public static Source _soapPart_getContent(Dom d) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapPart_getContent(sp);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapPart_getContent(sp);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapPart_getContent(sp));
     }
 
     public static void _soapPart_setContent(Dom d, Source source) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapPart_setContent(sp, source);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapPart_setContent(sp, source);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapPart_setContent(sp, source));
     }
 
     public static String[] _soapPart_getMimeHeader(Dom d, String name) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapPart_getMimeHeader(sp, name);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapPart_getMimeHeader(sp, name);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapPart_getMimeHeader(sp, name));
     }
 
     public static void _soapPart_addMimeHeader(Dom d, String name, String value) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapPart_addMimeHeader(sp, name, value);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapPart_addMimeHeader(sp, name, value);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapPart_addMimeHeader(sp, name, value));
     }
 
     public static void _soapPart_setMimeHeader(Dom d, String name, String value) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                l._saaj.soapPart_setMimeHeader(sp, name, value);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    l._saaj.soapPart_setMimeHeader(sp, name, value);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> p.locale()._saaj.soapPart_setMimeHeader(sp, name, value));
     }
 
     public static Iterator _soapPart_getMatchingMimeHeaders(Dom d, String[] names) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapPart_getMatchingMimeHeaders(sp, names);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapPart_getMatchingMimeHeaders(sp, names);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapPart_getMatchingMimeHeaders(sp, names));
     }
 
     public static Iterator _soapPart_getNonMatchingMimeHeaders(Dom d, String[] names) {
-        Locale l = d.locale();
-
         SOAPPart sp = (SOAPPart) d;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l._saaj.soapPart_getNonMatchingMimeHeaders(sp, names);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l._saaj.soapPart_getNonMatchingMimeHeaders(sp, names);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, p -> p.locale()._saaj.soapPart_getNonMatchingMimeHeaders(sp, names));
     }
 
     //
@@ -6032,25 +3623,7 @@
     }
 
     public static void saajCallback_setSaajData(Dom d, Object o) {
-        Locale l = d.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                impl_saajCallback_setSaajData(d, o);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    impl_saajCallback_setSaajData(d, o);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        syncWrapVoid(d, p -> impl_saajCallback_setSaajData(p, o));
     }
 
     public static void impl_saajCallback_setSaajData(Dom d, Object o) {
@@ -6078,25 +3651,7 @@
     }
 
     public static Object saajCallback_getSaajData(Dom d) {
-        Locale l = d.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return impl_saajCallback_getSaajData(d);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return impl_saajCallback_getSaajData(d);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, DomImpl::impl_saajCallback_getSaajData);
     }
 
     public static Object impl_saajCallback_getSaajData(Dom d) {
@@ -6116,72 +3671,23 @@
     }
 
     public static Element saajCallback_createSoapElement(Dom d, QName name, QName parentName) {
-        Locale l = d.locale();
-
-        Dom e;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                e = impl_saajCallback_createSoapElement(d, name, parentName);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    e = impl_saajCallback_createSoapElement(d, name, parentName);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
-        return (Element) e;
+        return syncWrap(d, p -> impl_saajCallback_createSoapElement(p, name, parentName));
     }
 
-    public static Dom impl_saajCallback_createSoapElement(Dom d, QName name, QName parentName) {
+    public static Element impl_saajCallback_createSoapElement(Dom d, QName name, QName parentName) {
         Cur c = d.locale().tempCur();
-
         c.createElement(name, parentName);
-
         Dom e = c.getDom();
-
         c.release();
-
-        return e;
-    }
-
-    public static Element saajCallback_importSoapElement(
-        Dom d, Element elem, boolean deep, QName parentName) {
-        Locale l = d.locale();
-
-        Dom e;
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                e = impl_saajCallback_importSoapElement(d, elem, deep, parentName);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    e = impl_saajCallback_importSoapElement(d, elem, deep, parentName);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-
         return (Element) e;
     }
 
-    public static Dom impl_saajCallback_importSoapElement(
-        Dom d, Element elem, boolean deep, QName parentName) {
+    public static Element saajCallback_importSoapElement(Dom d, Element elem, boolean deep, QName parentName) {
+        return syncWrap(d, p -> impl_saajCallback_importSoapElement(p, elem, deep, parentName));
+    }
+
+    @SuppressWarnings("unused")
+    public static Element impl_saajCallback_importSoapElement(Dom d, Element elem, boolean deep, QName parentName) {
         // TODO -- need to rewrite DomImpl.document_importNode to use an Xcur
         // to create the new tree.  Then, I can pass the parentName to the new
         // fcn and use it to create the correct root parent
@@ -6191,38 +3697,16 @@
 
 
     public static Text saajCallback_ensureSoapTextNode(Dom d) {
-        Locale l = d.locale();
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return impl_saajCallback_ensureSoapTextNode(d);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return impl_saajCallback_ensureSoapTextNode(d);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
+        return syncWrap(d, DomImpl::impl_saajCallback_ensureSoapTextNode);
     }
 
     public static Text impl_saajCallback_ensureSoapTextNode(Dom d) {
-//        if (!(d instanceof Text))
-//        {
-//            Xcur x = d.tempCur();
-//
-//            x.moveTo
-//
-//            x.release();
-//        }
-//
-//        return (Text) d;
+        // if (!(d instanceof Text)) {
+        //     Xcur x = d.tempCur();
+        //     x.moveTo
+        //     x.release();
+        // }
+        // return (Text) d;
 
         return null;
     }
@@ -6232,5 +3716,77 @@
             super("DOM Level 3 Not implemented");
         }
     }
+
+
+    private interface WrapSoapEx<T> {
+        T get() throws SOAPException;
+    }
+
+    private static <T> T syncWrap(Dom d, Function<Dom, T> inner) {
+        return syncWrapHelper(d.locale(), true, () -> inner.apply(d));
+    }
+
+    private static <T> T syncWrapNoEnter(Dom d, Function<Dom, T> inner) {
+        return syncWrapHelper(d.locale(), false, () -> inner.apply(d));
+    }
+
+    private static void syncWrapVoid(Dom d, Consumer<Dom> inner) {
+        syncWrapHelper(d.locale(), true, () -> {
+            inner.accept(d);
+            return null;
+        });
+    }
+
+    private static <T> T syncWrapEx(Dom d, WrapSoapEx<T> inner) throws SOAPException {
+        return syncWrapHelperEx(d.locale(), true, inner);
+    }
+
+    private static <T> T syncWrapHelper(Locale l, boolean enter, Supplier<T> inner) {
+        if (l.noSync()) {
+            return syncWrapHelper2(l, enter, inner);
+        } else {
+            synchronized (l) {
+                return syncWrapHelper2(l, enter, inner);
+            }
+        }
+    }
+
+    private static <T> T syncWrapHelper2(Locale l, boolean enter, Supplier<T> inner) {
+        if (enter) {
+            l.enter();
+        }
+        try {
+            return inner.get();
+        } finally {
+            if (enter) {
+                l.exit();
+            }
+        }
+    }
+
+    private static <T> T syncWrapHelperEx(Locale l, boolean enter, WrapSoapEx<T> inner) throws SOAPException {
+        if (l.noSync()) {
+            return syncWrapHelperEx2(l, enter, inner);
+        } else {
+            synchronized (l) {
+                return syncWrapHelperEx2(l, enter, inner);
+            }
+        }
+    }
+
+    private static <T> T syncWrapHelperEx2(Locale l, boolean enter, WrapSoapEx<T> inner) throws SOAPException {
+        if (enter) {
+            l.enter();
+        }
+        try {
+            return inner.get();
+        } finally {
+            if (enter) {
+                l.exit();
+            }
+        }
+    }
+
+
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/impl/store/Locale.java b/src/main/java/org/apache/xmlbeans/impl/store/Locale.java
index ef3fb67..4757f53 100755
--- a/src/main/java/org/apache/xmlbeans/impl/store/Locale.java
+++ b/src/main/java/org/apache/xmlbeans/impl/store/Locale.java
@@ -2270,7 +2270,7 @@
                     x = _child;
                     _len = _n;
                 } else {
-                    x = DomImpl.firstChild(_parent);
+                    x = (Dom) DomImpl.firstChild(_parent);
                     _len = 0;
 
                     // cache the 0th child
@@ -2278,7 +2278,7 @@
                     _n = 0;
                 }
 
-                for (; x != null; x = DomImpl.nextSibling(x)) {
+                for (; x != null; x = (Dom) DomImpl.nextSibling(x)) {
                     _len++;
                 }
             }
@@ -2297,7 +2297,7 @@
                 _n = -1;
                 _len = -1;
 
-                for (Dom x = DomImpl.firstChild(_parent); x != null; x = DomImpl.nextSibling(x)) {
+                for (Dom x = (Dom) DomImpl.firstChild(_parent); x != null; x = (Dom) DomImpl.nextSibling(x)) {
                     _n++;
                     if (_child == null && n == _n) {
                         _child = x;
@@ -2314,7 +2314,7 @@
 
             if (n > _n) {
                 while (n > _n) {
-                    for (Dom x = DomImpl.nextSibling(_child); ; x = DomImpl.nextSibling(x)) {
+                    for (Dom x = (Dom) DomImpl.nextSibling(_child); ; x = (Dom) DomImpl.nextSibling(x)) {
                         if (x == null) {
                             return null;
                         }
@@ -2327,7 +2327,7 @@
                 }
             } else if (n < _n) {
                 while (n < _n) {
-                    for (Dom x = DomImpl.prevSibling(_child); ; x = DomImpl.prevSibling(x)) {
+                    for (Dom x = (Dom) DomImpl.prevSibling(_child); ; x = (Dom) DomImpl.prevSibling(x)) {
                         if (x == null) {
                             return null;
                         }
