Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java (revision 1733462) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/NodeTypeTemplateImpl.java (working copy) @@ -178,8 +178,20 @@ private static void writeItemDefinitions(@Nonnull Tree nodeTypeTree, @CheckForNull List itemDefTemplates, @Nonnull String nodeName, @Nonnull String primaryTypeName) throws RepositoryException { + // first remove potentially existing item definitions + removeChild(nodeTypeTree, nodeName); + // Oak versions prior to 1.4 wrote explicit one index (OAK-4085) + removeChild(nodeTypeTree, nodeName + "[1]"); + // remove remaining if any Tree tree; - int index = 1; + int index = 2; + tree = nodeTypeTree.getChild(nodeName(nodeName, index++)); + while (tree.exists()) { + tree.remove(); + tree = nodeTypeTree.getChild(nodeName(nodeName, index++)); + } + // now write definitions + index = 1; if (itemDefTemplates != null) { for (ItemDefinitionTemplate template : itemDefTemplates) { String name = nodeName(nodeName, index); @@ -193,10 +205,12 @@ index++; } } - tree = nodeTypeTree.getChild(nodeName(nodeName, index++)); - while (tree.exists()) { - tree.remove(); - tree = nodeTypeTree.getChild(nodeName(nodeName, index++)); + } + + private static void removeChild(Tree tree, String name) { + Tree child = tree.getChild(name); + if (child.exists()) { + child.remove(); } }