Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java	(revision 586792)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java	(working copy)
@@ -17,9 +17,6 @@
 package org.apache.jackrabbit.core;
 
 import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.io.PrintStream;
 import java.security.AccessControlException;
 import java.security.Principal;
@@ -34,7 +31,6 @@
 import javax.jcr.AccessDeniedException;
 import javax.jcr.Credentials;
 import javax.jcr.InvalidItemStateException;
-import javax.jcr.InvalidSerializedDataException;
 import javax.jcr.Item;
 import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
@@ -59,15 +55,10 @@
 import javax.jcr.observation.ObservationManager;
 import javax.jcr.version.VersionException;
 import javax.security.auth.Subject;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
 
 import org.apache.commons.collections.IteratorUtils;
 import org.apache.commons.collections.map.ReferenceMap;
+import org.apache.jackrabbit.commons.AbstractSession;
 import org.apache.jackrabbit.core.config.AccessManagerConfig;
 import org.apache.jackrabbit.core.config.WorkspaceConfig;
 import org.apache.jackrabbit.core.lock.LockManager;
@@ -86,7 +77,6 @@
 import org.apache.jackrabbit.core.version.VersionManager;
 import org.apache.jackrabbit.core.xml.DocViewSAXEventGenerator;
 import org.apache.jackrabbit.core.xml.ImportHandler;
-import org.apache.jackrabbit.core.xml.SAXParserProvider;
 import org.apache.jackrabbit.core.xml.SessionImporter;
 import org.apache.jackrabbit.core.xml.SysViewSAXEventGenerator;
 import org.apache.jackrabbit.name.NameException;
@@ -105,7 +95,8 @@
 /**
  * A <code>SessionImpl</code> ...
  */
-public class SessionImpl implements Session, NamePathResolver, Dumpable {
+public class SessionImpl extends AbstractSession
+        implements NamePathResolver, Dumpable {
 
     private static Logger log = LoggerFactory.getLogger(SessionImpl.class);
 
@@ -1096,36 +1087,6 @@
     /**
      * {@inheritDoc}
      */
-    public void importXML(String parentAbsPath, InputStream in,
-                          int uuidBehavior)
-            throws IOException, PathNotFoundException, ItemExistsException,
-            ConstraintViolationException, VersionException,
-            InvalidSerializedDataException, LockException, RepositoryException {
-        // check sanity of this session
-        sanityCheck();
-
-        ImportHandler handler = (ImportHandler)
-                getImportContentHandler(parentAbsPath, uuidBehavior);
-        try {
-            SAXParserProvider.getParser().parse(new InputSource(in), handler);
-        } catch (SAXException se) {
-            // check for wrapped repository exception
-            Exception e = se.getException();
-            if (e != null && e instanceof RepositoryException) {
-                throw (RepositoryException) e;
-            } else {
-                String msg = "failed to parse XML stream";
-                log.debug(msg);
-                throw new InvalidSerializedDataException(msg, se);
-            }
-        } catch (ParserConfigurationException e) {
-            throw new RepositoryException("SAX parser configuration error", e);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public void exportDocumentView(String absPath, ContentHandler contentHandler,
                                    boolean skipBinary, boolean noRecurse)
             throws PathNotFoundException, SAXException, RepositoryException {
@@ -1144,30 +1105,6 @@
     /**
      * {@inheritDoc}
      */
-    public void exportDocumentView(String absPath, OutputStream out,
-                                   boolean skipBinary, boolean noRecurse)
-            throws IOException, PathNotFoundException, RepositoryException {
-
-        SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
-
-        try {
-            TransformerHandler th = stf.newTransformerHandler();
-            th.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml");
-            th.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-            th.getTransformer().setOutputProperty(OutputKeys.INDENT, "no");
-            th.setResult(new StreamResult(out));
-
-            exportDocumentView(absPath, th, skipBinary, noRecurse);
-        } catch (TransformerException te) {
-            throw new RepositoryException(te);
-        } catch (SAXException se) {
-            throw new RepositoryException(se);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public void exportSystemView(String absPath, ContentHandler contentHandler,
                                  boolean skipBinary, boolean noRecurse)
             throws PathNotFoundException, SAXException, RepositoryException {
@@ -1186,29 +1123,6 @@
     /**
      * {@inheritDoc}
      */
-    public void exportSystemView(String absPath, OutputStream out,
-                                 boolean skipBinary, boolean noRecurse)
-            throws IOException, PathNotFoundException, RepositoryException {
-
-        SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
-        try {
-            TransformerHandler th = stf.newTransformerHandler();
-            th.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml");
-            th.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-            th.getTransformer().setOutputProperty(OutputKeys.INDENT, "no");
-            th.setResult(new StreamResult(out));
-
-            exportSystemView(absPath, th, skipBinary, noRecurse);
-        } catch (TransformerException te) {
-            throw new RepositoryException(te);
-        } catch (SAXException se) {
-            throw new RepositoryException(se);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public boolean isLive() {
         return alive;
     }
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(revision 586792)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java	(working copy)
@@ -16,6 +16,8 @@
  */
 package org.apache.jackrabbit.core;
 
+import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
+import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
 import org.apache.jackrabbit.core.nodetype.EffectiveNodeType;
 import org.apache.jackrabbit.core.nodetype.NodeDef;
 import org.apache.jackrabbit.core.nodetype.NodeDefId;
@@ -89,7 +91,6 @@
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Calendar;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -2813,7 +2814,7 @@
         ArrayList nodes = new ArrayList();
         // traverse children using a special filtering 'collector'
         accept(new ChildrenCollectorFilter(namePattern, nodes, true, false, 1));
-        return new IteratorHelper(Collections.unmodifiableList(nodes));
+        return new NodeIteratorAdapter(nodes);
     }
 
     /**
@@ -2827,7 +2828,7 @@
         ArrayList properties = new ArrayList();
         // traverse children using a special filtering 'collector'
         accept(new ChildrenCollectorFilter(namePattern, properties, false, true, 1));
-        return new IteratorHelper(Collections.unmodifiableList(properties));
+        return new PropertyIteratorAdapter(properties);
     }
 
     /**
@@ -4319,7 +4320,7 @@
                 return new LazyItemIterator(itemMgr, idList);
             } else {
                 // there are no references, return empty iterator
-                return IteratorHelper.EMPTY;
+                return PropertyIteratorAdapter.EMPTY;
             }
         } catch (ItemStateException e) {
             String msg = "Unable to retrieve REFERENCE properties that refer to " + id;
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java	(revision 586792)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java	(working copy)
@@ -22,6 +22,7 @@
 import EDU.oswego.cs.dl.util.concurrent.WriterPreferenceReadWriteLock;
 import org.apache.commons.collections.map.ReferenceMap;
 import org.apache.jackrabbit.api.JackrabbitRepository;
+import org.apache.jackrabbit.commons.AbstractRepository;
 import org.apache.jackrabbit.core.cluster.ClusterContext;
 import org.apache.jackrabbit.core.cluster.ClusterException;
 import org.apache.jackrabbit.core.cluster.ClusterNode;
@@ -99,8 +100,8 @@
 /**
  * A <code>RepositoryImpl</code> ...
  */
-public class RepositoryImpl implements JackrabbitRepository, SessionListener,
-        EventListener {
+public class RepositoryImpl extends AbstractRepository
+        implements JackrabbitRepository, SessionListener, EventListener {
 
     private static Logger log = LoggerFactory.getLogger(RepositoryImpl.class);
 
@@ -1239,29 +1240,6 @@
     /**
      * {@inheritDoc}
      */
-    public Session login(String workspaceName)
-            throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        return login(null, workspaceName);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public Session login() throws LoginException, RepositoryException {
-        return login(null, null);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public Session login(Credentials credentials)
-            throws LoginException, RepositoryException {
-        return login(credentials, null);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
     public String getDescriptor(String key) {
         return repProps.getProperty(key);
     }
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java	(revision 586792)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeManagerImpl.java	(working copy)
@@ -25,6 +25,7 @@
 import org.apache.jackrabbit.util.IteratorHelper;
 import org.apache.jackrabbit.util.name.NamespaceMapping;
 import org.apache.jackrabbit.api.JackrabbitNodeTypeManager;
+import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
 import org.apache.jackrabbit.core.NamespaceRegistryImpl;
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.nodetype.compact.CompactNodeTypeDefReader;
@@ -373,7 +374,7 @@
         for (int i = 0; i < ntNames.length; i++) {
             list.add(getNodeType(ntNames[i]));
         }
-        return new IteratorHelper(Collections.unmodifiableCollection(list));
+        return new NodeTypeIteratorAdapter(list);
     }
 
     /**
@@ -388,7 +389,7 @@
                 list.add(nt);
             }
         }
-        return new IteratorHelper(Collections.unmodifiableCollection(list));
+        return new NodeTypeIteratorAdapter(list);
     }
 
     /**
@@ -403,7 +404,7 @@
                 list.add(nt);
             }
         }
-        return new IteratorHelper(Collections.unmodifiableCollection(list));
+        return new NodeTypeIteratorAdapter(list);
     }
 
     /**
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SAXParserProvider.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SAXParserProvider.java	(revision 586792)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SAXParserProvider.java	(working copy)
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.jackrabbit.core.xml;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
-
-/**
- * Provides configured SAXParser instances and logs which
- * parser class is being used.
- */
-public class SAXParserProvider {
-    private static Logger log = LoggerFactory.getLogger(SAXParserProvider.class);
-    private static boolean infoLogged;
-
-    /**
-     * Return a configured SAXParser
-     */
-    public static SAXParser getParser() throws SAXException, ParserConfigurationException {
-        // we could save the factory, but it's not threadsafe so keep it simple
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setFeature(
-                "http://xml.org/sax/features/namespace-prefixes", false);
-        SAXParser parser = factory.newSAXParser();
-
-        // log only once (not threadsafe but good enough ;-)
-        if (log.isInfoEnabled() && !infoLogged) {
-            log.info("Using SAXParser class " + parser.getClass().getName());
-            infoLogged = true;
-        }
-        return parser;
-    }
-}
\ No newline at end of file
Index: jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java
===================================================================
--- jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java	(revision 586792)
+++ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/WorkspaceImpl.java	(working copy)
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.core;
 
 import org.apache.jackrabbit.api.JackrabbitWorkspace;
+import org.apache.jackrabbit.commons.AbstractWorkspace;
 import org.apache.jackrabbit.core.config.WorkspaceConfig;
 import org.apache.jackrabbit.core.lock.LockManager;
 import org.apache.jackrabbit.core.observation.EventStateCollection;
@@ -30,7 +31,6 @@
 import org.apache.jackrabbit.core.version.VersionSelector;
 import org.apache.jackrabbit.core.xml.ImportHandler;
 import org.apache.jackrabbit.core.xml.Importer;
-import org.apache.jackrabbit.core.xml.SAXParserProvider;
 import org.apache.jackrabbit.core.xml.WorkspaceImporter;
 import org.apache.jackrabbit.name.NameException;
 import org.apache.jackrabbit.name.Path;
@@ -38,11 +38,9 @@
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
 import javax.jcr.AccessDeniedException;
 import javax.jcr.InvalidItemStateException;
-import javax.jcr.InvalidSerializedDataException;
 import javax.jcr.ItemExistsException;
 import javax.jcr.ItemNotFoundException;
 import javax.jcr.NamespaceRegistry;
@@ -59,17 +57,15 @@
 import javax.jcr.version.Version;
 import javax.jcr.version.VersionException;
 import javax.jcr.version.VersionHistory;
-import javax.xml.parsers.ParserConfigurationException;
 
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Iterator;
 
 /**
  * A <code>WorkspaceImpl</code> ...
  */
-public class WorkspaceImpl implements JackrabbitWorkspace, EventStateCollectionFactory {
+public class WorkspaceImpl extends AbstractWorkspace
+        implements JackrabbitWorkspace, EventStateCollectionFactory {
 
     private static Logger log = LoggerFactory.getLogger(WorkspaceImpl.class);
 
@@ -814,34 +810,6 @@
     }
 
     /**
-     * {@inheritDoc}
-     */
-    public void importXML(String parentAbsPath, InputStream in,
-                          int uuidBehavior)
-            throws IOException, PathNotFoundException, ItemExistsException,
-            ConstraintViolationException, InvalidSerializedDataException,
-            LockException, RepositoryException {
-
-        ImportHandler handler =
-                (ImportHandler) getImportContentHandler(parentAbsPath, uuidBehavior);
-        try {
-            SAXParserProvider.getParser().parse(new InputSource(in), handler);
-        } catch (SAXException se) {
-            // check for wrapped repository exception
-            Exception e = se.getException();
-            if (e != null && e instanceof RepositoryException) {
-                throw (RepositoryException) e;
-            } else {
-                String msg = "failed to parse XML stream";
-                log.debug(msg);
-                throw new InvalidSerializedDataException(msg, se);
-            }
-        } catch (ParserConfigurationException e) {
-            throw new RepositoryException("SAX parser configuration error", e);
-        }
-    }
-
-    /**
      * Create the persistent item state manager on top of the shared item
      * state manager. May be overridden by subclasses.
      * @param shared shared item state manager
Index: jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java
===================================================================
--- jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java	(revision 586792)
+++ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/DefaultContentHandler.java	(working copy)
@@ -26,6 +26,8 @@
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.InputSource;
@@ -40,6 +42,12 @@
 class DefaultContentHandler extends DefaultHandler {
 
     /**
+     * Logger instance.
+     */
+    private static final Logger logger =
+        LoggerFactory.getLogger(DefaultContentHandler.class);
+
+    /**
      * The adapted content handler instance.
      */
     private final ContentHandler handler;
@@ -69,6 +77,8 @@
                     "http://xml.org/sax/features/namespace-prefixes", false);
 
             SAXParser parser = factory.newSAXParser();
+            // JCR-984 & JCR-985: Log the name of the SAXParser class
+            logger.debug("Using SAX parser " + parser.getClass().getName());
             parser.parse(new InputSource(in), this);
         } catch (FactoryConfigurationError e) {
             throw new RepositoryException(
Index: jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/IteratorHelper.java
===================================================================
--- jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/IteratorHelper.java	(revision 586792)
+++ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/IteratorHelper.java	(working copy)
@@ -30,6 +30,8 @@
  * <code>IteratorHelper</code> is a utility class which
  * wraps an iterator and implements the various typed iterator
  * interfaces.
+ *
+ * @deprecated See {@link org.apache.jackrabbit.commons.iterator}
  */
 public class IteratorHelper
         implements NodeIterator, PropertyIterator, NodeTypeIterator {
Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java
===================================================================
--- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java	(revision 586792)
+++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/NodeInfoImpl.java	(working copy)
@@ -16,13 +16,13 @@
  */
 package org.apache.jackrabbit.spi.commons;
 
+import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
 import org.apache.jackrabbit.spi.NodeInfo;
 import org.apache.jackrabbit.spi.NodeId;
 import org.apache.jackrabbit.spi.PropertyId;
 import org.apache.jackrabbit.spi.IdFactory;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
-import org.apache.jackrabbit.util.IteratorHelper;
 
 import java.util.List;
 import java.util.ArrayList;
@@ -96,7 +96,7 @@
                     nodeInfo.getPath(), nodeId,
                     nodeInfo.getIndex(), nodeInfo.getNodetype(),
                     nodeInfo.getMixins(), serRefs.iterator(),
-                    new IteratorHelper(nodeInfo.getPropertyIds()) {
+                    new RangeIteratorAdapter(nodeInfo.getPropertyIds()) {
                         public Object next() {
                             PropertyId propId = (PropertyId) super.next();
                             NodeId parentId = propId.getParentId();
Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/EmptyNodeReferences.java
===================================================================
--- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/EmptyNodeReferences.java	(revision 586792)
+++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/state/EmptyNodeReferences.java	(working copy)
@@ -18,8 +18,8 @@
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.jackrabbit.util.IteratorHelper;
 
+import java.util.Collections;
 import java.util.Iterator;
 
 /**
@@ -46,6 +46,6 @@
     }
 
     public Iterator iterator() {
-        return IteratorHelper.EMPTY;
+        return Collections.EMPTY_LIST.iterator();
     }
 }
\ No newline at end of file
Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/RepositoryImpl.java
===================================================================
--- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/RepositoryImpl.java	(revision 586792)
+++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/RepositoryImpl.java	(working copy)
@@ -35,6 +35,7 @@
 import javax.naming.StringRefAddr;
 import javax.naming.spi.ObjectFactory;
 
+import org.apache.jackrabbit.commons.AbstractRepository;
 import org.apache.jackrabbit.jcr2spi.config.RepositoryConfig;
 import org.apache.jackrabbit.spi.SessionInfo;
 import org.apache.jackrabbit.spi.XASessionInfo;
@@ -44,7 +45,8 @@
 /**
  * <code>RepositoryImpl</code>...
  */
-public class RepositoryImpl implements Repository, Referenceable {
+public class RepositoryImpl extends AbstractRepository
+        implements Referenceable {
 
     private static Logger log = LoggerFactory.getLogger(RepositoryImpl.class);
 
@@ -96,27 +98,6 @@
         }
     }
 
-    /**
-     * @see Repository#login(javax.jcr.Credentials)
-     */
-    public Session login(Credentials credentials) throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        return login(credentials, null);
-    }
-
-    /**
-     * @see Repository#login(String)
-     */
-    public Session login(String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        return login(null, workspaceName);
-    }
-
-    /**
-     * @see Repository#login()
-     */
-    public Session login() throws LoginException, NoSuchWorkspaceException, RepositoryException {
-        return login(null, null);
-    }
-
     //---------------------------------------------------------< Rereferencable >---
 
     /**
Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java
===================================================================
--- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java	(revision 586792)
+++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/SessionImpl.java	(working copy)
@@ -51,6 +51,7 @@
 import org.apache.jackrabbit.spi.QValueFactory;
 import org.apache.jackrabbit.spi.NameFactory;
 import org.apache.jackrabbit.spi.PathFactory;
+import org.apache.jackrabbit.commons.AbstractSession;
 import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.jackrabbit.conversion.NameException;
 import org.apache.jackrabbit.conversion.PathResolver;
@@ -60,7 +61,6 @@
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
 import javax.jcr.AccessDeniedException;
@@ -85,25 +85,14 @@
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.version.VersionException;
 import javax.jcr.version.Version;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.TransformerException;
-import javax.xml.parsers.SAXParserFactory;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.ParserConfigurationException;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.security.AccessControlException;
 import java.util.Map;
 
 /**
  * <code>SessionImpl</code>...
  */
-public class SessionImpl implements Session, ManagerProvider {
+public class SessionImpl extends AbstractSession implements ManagerProvider {
 
     private static Logger log = LoggerFactory.getLogger(SessionImpl.class);
 
@@ -389,35 +378,6 @@
     }
 
     /**
-     * @see javax.jcr.Session#importXML(String, java.io.InputStream, int)
-     */
-    public void importXML(String parentAbsPath, InputStream in, int uuidBehavior) throws IOException, PathNotFoundException, ItemExistsException, ConstraintViolationException, VersionException, InvalidSerializedDataException, LockException, RepositoryException {
-        // NOTE: checks are performed by 'getImportContentHandler'
-        ImportHandler handler = (ImportHandler) getImportContentHandler(parentAbsPath, uuidBehavior);
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setNamespaceAware(true);
-            factory.setFeature(
-                    "http://xml.org/sax/features/namespace-prefixes", false);
-
-            SAXParser parser = factory.newSAXParser();
-            parser.parse(new InputSource(in), handler);
-        } catch (SAXException se) {
-            // check for wrapped repository exception
-            Exception e = se.getException();
-            if (e != null && e instanceof RepositoryException) {
-                throw (RepositoryException) e;
-            } else {
-                String msg = "failed to parse XML stream";
-                log.debug(msg);
-                throw new InvalidSerializedDataException(msg, se);
-            }
-        } catch (ParserConfigurationException e) {
-            throw new RepositoryException("SAX parser configuration error", e);
-        }
-    }
-
-    /**
      * @see javax.jcr.Session#exportSystemView(String, org.xml.sax.ContentHandler, boolean, boolean)
      */
     public void exportSystemView(String absPath, ContentHandler contentHandler, boolean skipBinary, boolean noRecurse) throws PathNotFoundException, SAXException, RepositoryException {
@@ -431,26 +391,6 @@
     }
 
     /**
-     * @see javax.jcr.Session#exportSystemView(String, OutputStream, boolean, boolean)
-     */
-    public void exportSystemView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse) throws IOException, PathNotFoundException, RepositoryException {
-        SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
-        try {
-            TransformerHandler th = stf.newTransformerHandler();
-            th.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml");
-            th.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-            th.getTransformer().setOutputProperty(OutputKeys.INDENT, "no");
-            th.setResult(new StreamResult(out));
-
-            exportSystemView(absPath, th, skipBinary, noRecurse);
-        } catch (TransformerException te) {
-            throw new RepositoryException(te);
-        } catch (SAXException se) {
-            throw new RepositoryException(se);
-        }
-    }
-
-    /**
      * @see javax.jcr.Session#exportDocumentView(String, org.xml.sax.ContentHandler, boolean, boolean)
      */
     public void exportDocumentView(String absPath, ContentHandler contentHandler, boolean skipBinary, boolean noRecurse) throws InvalidSerializedDataException, PathNotFoundException, SAXException, RepositoryException {
@@ -464,26 +404,6 @@
     }
 
     /**
-     * @see javax.jcr.Session#exportDocumentView(String, OutputStream, boolean, boolean)
-     */
-    public void exportDocumentView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse) throws InvalidSerializedDataException, IOException, PathNotFoundException, RepositoryException {
-        SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
-        try {
-            TransformerHandler th = stf.newTransformerHandler();
-            th.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml");
-            th.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-            th.getTransformer().setOutputProperty(OutputKeys.INDENT, "no");
-            th.setResult(new StreamResult(out));
-
-            exportDocumentView(absPath, th, skipBinary, noRecurse);
-        } catch (TransformerException te) {
-            throw new RepositoryException(te);
-        } catch (SAXException se) {
-            throw new RepositoryException(se);
-        }
-    }
-
-    /**
      * @see javax.jcr.Session#setNamespacePrefix(String, String)
      * @see LocalNamespaceMappings#setNamespacePrefix(String, String)
      */
Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java
===================================================================
--- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java	(revision 586792)
+++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/nodetype/NodeTypeManagerImpl.java	(working copy)
@@ -18,6 +18,7 @@
 
 import org.apache.commons.collections.map.ReferenceMap;
 import org.apache.jackrabbit.namespace.NamespaceResolver;
+import org.apache.jackrabbit.commons.iterator.NodeTypeIteratorAdapter;
 import org.apache.jackrabbit.conversion.NameException;
 import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.jackrabbit.spi.Name;
@@ -290,7 +291,7 @@
         for (int i = 0; i < ntNames.length; i++) {
             list.add(getNodeType(ntNames[i]));
         }
-        return new IteratorHelper(Collections.unmodifiableCollection(list));
+        return new NodeTypeIteratorAdapter(list);
     }
 
     /**
@@ -305,7 +306,7 @@
                 list.add(nt);
             }
         }
-        return new IteratorHelper(Collections.unmodifiableCollection(list));
+        return new NodeTypeIteratorAdapter(list);
     }
 
     /**
@@ -320,7 +321,7 @@
                 list.add(nt);
             }
         }
-        return new IteratorHelper(Collections.unmodifiableCollection(list));
+        return new NodeTypeIteratorAdapter(list);
     }
 
     /**
Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java
===================================================================
--- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java	(revision 586792)
+++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/NodeImpl.java	(working copy)
@@ -20,6 +20,8 @@
 import org.apache.jackrabbit.util.IteratorHelper;
 import org.apache.jackrabbit.value.ValueHelper;
 import org.apache.jackrabbit.value.ValueFormat;
+import org.apache.jackrabbit.commons.iterator.NodeIteratorAdapter;
+import org.apache.jackrabbit.commons.iterator.PropertyIteratorAdapter;
 import org.apache.jackrabbit.conversion.NameException;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
@@ -80,7 +82,6 @@
 import java.io.InputStream;
 import java.util.Calendar;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Arrays;
 import java.util.Iterator;
@@ -438,7 +439,7 @@
         ArrayList nodes = new ArrayList();
         // traverse children using a special filtering 'collector'
         accept(new ChildrenCollectorFilter(namePattern, nodes, true, false, 1));
-        return new IteratorHelper(Collections.unmodifiableList(nodes));
+        return new NodeIteratorAdapter(nodes);
     }
 
     /**
@@ -485,7 +486,7 @@
         ArrayList properties = new ArrayList();
         // traverse children using a special filtering 'collector'
         accept(new ChildrenCollectorFilter(namePattern, properties, false, true, 1));
-        return new IteratorHelper(Collections.unmodifiableList(properties));
+        return new PropertyIteratorAdapter(properties);
     }
 
     /**
@@ -539,7 +540,7 @@
         NodeReferences refs = getNodeState().getNodeReferences();
         if (refs.isEmpty()) {
             // there are no references, return empty iterator
-            return IteratorHelper.EMPTY;
+            return PropertyIteratorAdapter.EMPTY;
         } else {
             return new LazyItemIterator(itemMgr, session.getHierarchyManager(), refs.iterator());
         }
@@ -884,7 +885,7 @@
 
         // if same workspace, ignore
         if (session.getWorkspace().getName().equals(srcWorkspace)) {
-            return IteratorHelper.EMPTY;
+            return NodeIteratorAdapter.EMPTY;
         }
         // make sure the workspace exists and is accessible for this session.
         session.checkAccessibleWorkspace(srcWorkspace);
Index: contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java
===================================================================
--- contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java	(revision 586792)
+++ contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/observation/ObservationManagerImpl.java	(working copy)
@@ -22,7 +22,7 @@
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.EventBundle;
 import org.apache.jackrabbit.spi.EventFilter;
-import org.apache.jackrabbit.util.IteratorHelper;
+import org.apache.jackrabbit.commons.iterator.EventListenerIteratorAdapter;
 import org.apache.jackrabbit.conversion.NamePathResolver;
 import org.apache.jackrabbit.conversion.NameException;
 import org.slf4j.Logger;
@@ -160,7 +160,7 @@
             ensureReadOnlyMap();
             activeListeners = readOnlySubscriptions;
         }
-        return new ListenerIterator(activeListeners.keySet());
+        return new EventListenerIteratorAdapter(activeListeners.keySet());
     }
 
     //-----------------------< InternalEventListener >--------------------------
@@ -211,15 +211,4 @@
         }
     }
 
-    private static final class ListenerIterator extends IteratorHelper
-            implements EventListenerIterator {
-
-        public ListenerIterator(Collection c) {
-            super(c);
-        }
-
-        public EventListener nextEventListener() {
-            return (EventListener) next();
-        }
-    }
 }
