You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2020/12/04 14:52:38 UTC

[jena] branch master updated: JENA-2006: DatasetGraph prefixes

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/master by this push:
     new 19b4ed3  JENA-2006: DatasetGraph prefixes
     new 3ca8d03  Merge pull request #880 from afs/dataset-prefixes
19b4ed3 is described below

commit 19b4ed3d8a6e39573a78d5a0c39aeb3b3f95fe7b
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sun Nov 22 18:44:43 2020 +0000

    JENA-2006: DatasetGraph prefixes
---
 .../main/java/org/apache/jena/query/Dataset.java   |  65 +--
 .../main/java/org/apache/jena/riot/RDFParser.java  |  84 ++--
 .../main/java/org/apache/jena/riot/RDFWriter.java  |   2 +-
 .../apache/jena/riot/lang/CollectorStreamBase.java |  20 +-
 .../apache/jena/riot/lang/CollectorStreamRDF.java  |  32 +-
 .../apache/jena/riot/lang/PipedRDFIterator.java    |  16 +-
 .../org/apache/jena/riot/system}/PrefixEntry.java  |  23 +-
 .../org/apache/jena/riot/system}/PrefixLib.java    |  79 ++--
 .../org/apache/jena/riot/system/PrefixMap.java     |  54 ++-
 .../apache/jena/riot/system/PrefixMapAdapter.java  | 120 ++++++
 .../org/apache/jena/riot/system/PrefixMapBase.java | 110 +++--
 .../apache/jena/riot/system/PrefixMapExtended.java | 127 ------
 .../apache/jena/riot/system/PrefixMapFactory.java  |  88 ++--
 .../org/apache/jena/riot/system/PrefixMapNull.java |  34 +-
 .../apache/jena/riot/system/PrefixMapProxy.java}   |  22 +-
 .../system/PrefixMapSink.java}                     |  37 +-
 .../org/apache/jena/riot/system/PrefixMapStd.java  | 101 +++--
 .../jena/riot/system/PrefixMapUnmodifiable.java    |  16 +-
 .../apache/jena/riot/system/PrefixMapWrapper.java  |  49 ++-
 .../apache/jena/riot/system/PrefixMapZero.java}    |  19 +-
 .../java/org/apache/jena/riot/system/Prefixes.java | 160 ++++++++
 .../java/org/apache/jena/riot/system/Prologue.java | 103 ++---
 .../java/org/apache/jena/riot/system/RiotLib.java  |  88 ++--
 .../org/apache/jena/riot/system/StreamRDFLib.java  |  97 ++---
 .../org/apache/jena/sparql/core/DatasetGraph.java  |  54 +--
 .../apache/jena/sparql/core/DatasetGraphMap.java   |  46 ++-
 .../jena/sparql/core/DatasetGraphMapLink.java      |  27 +-
 .../apache/jena/sparql/core/DatasetGraphOne.java   |  30 +-
 .../apache/jena/sparql/core/DatasetGraphSink.java  |  28 +-
 .../jena/sparql/core/DatasetGraphWrapper.java      |  73 ++--
 .../apache/jena/sparql/core/DatasetGraphZero.java  |  11 +-
 .../org/apache/jena/sparql/core/GraphView.java     |  91 +++--
 .../java/org/apache/jena/sparql/core/Prologue.java |  76 ++--
 .../jena/sparql/core/mem/DatasetGraphInMemory.java |  61 +--
 .../core/mem/DatasetPrefixStorageInMemory.java     | 104 -----
 .../apache/jena/sparql/core/mem/GraphInMemory.java |   6 +-
 .../sparql/engine/binding/BindingInputStream.java  |  40 +-
 .../engine/iterator/QueryIterRepeatApply.java      |  38 +-
 .../jena/sparql/graph/GraphPrefixesProjection.java | 162 --------
 .../jena/sparql/graph/PrefixMappingAdapter.java    |  40 +-
 .../jena/sparql/graph/PrefixMappingZero.java       |   6 +-
 .../jena/sparql/util/DifferenceDatasetGraph.java   |  12 +-
 .../jena/sparql/util/DyadicDatasetGraph.java       |  14 +-
 .../jena/sparql/util/IntersectionDatasetGraph.java |   9 +-
 .../apache/jena/sparql/util/NodeFactoryExtra.java  |  25 +-
 .../apache/jena/sparql/util/UnionDatasetGraph.java |  13 +-
 .../apache/jena/riot/lang/TestParserFactory.java   |  32 +-
 .../org/apache/jena/riot/system/TS_RiotSystem.java |   5 +-
 .../jena/riot/system/TestJsonLDReadWrite.java      |  58 +--
 .../apache/jena/riot/writer/TestJsonLDWriter.java  |  17 +-
 .../sparql/core/AbstractDatasetGraphTests.java     | 175 +++++---
 .../jena/sparql/core/DatasetGraphSimpleMem.java    |  18 +-
 .../graph/AbstractTestPrefixMappingView.java       |  36 +-
 .../util/AbstractTestDyadicDatasetGraph.java       |  25 +-
 .../main/java/org/apache/jena/atlas/lib/Lib.java   |   5 +
 jena-cmds/src/main/java/tdb/tdbconfig.java         |  46 +--
 .../java/org/apache/jena/util/MonitorModel.java    |  10 +-
 .../org/apache/jena/dboe/storage/DatabaseRDF.java  |   2 +-
 .../org/apache/jena/dboe/storage/Prefixes.java     |  39 --
 .../apache/jena/dboe/storage/StoragePrefixes.java  |   3 +-
 .../org/apache/jena/dboe/storage/StorageRDF.java   |   6 +-
 .../jena/dboe/storage/prefixes/PrefixMapI.java     | 146 -------
 ...IOverStorage.java => PrefixMapOverStorage.java} |  50 +--
 .../storage/prefixes/PrefixMapStorageSimple.java   |   2 +
 .../prefixes/PrefixMappingOverPrefixMapI.java      | 145 -------
 .../dboe/storage/prefixes/PrefixesDboeFactory.java |  48 +++
 .../dboe/storage/prefixes/PrefixesFactory.java     |  60 ---
 .../dboe/storage/prefixes/StoragePrefixMap.java    |   2 +
 .../storage/prefixes/StoragePrefixesEmpty.java     |   1 +
 .../dboe/storage/prefixes/StoragePrefixesView.java |  12 +-
 .../apache/jena/dboe/storage/simple/SimpleDB.java  |   2 +-
 ...fixesMem.java => StoragePrefixesSimpleMem.java} |  42 +-
 .../{StorageMem.java => StorageSimpleMem.java}     |   4 +-
 .../dboe/storage/system/DatasetGraphStorage.java   |  23 +-
 .../jena/dboe/storage/system/GraphViewStorage.java |  26 --
 .../AbstractTestDatasetPrefixesStorage.java        |   1 +
 .../jena/dboe/storage/prefixes/TS_Prefixes.java    |   2 -
 .../storage/prefixes/TestDatasetPrefixesMem.java   |   2 +-
 .../jena/dboe/storage/prefixes/TestPrefixLib.java  |  22 +-
 .../TestPrefixMappingOverDatasetPrefixes.java      |   9 +-
 .../TestPrefixMappingOverDatasetPrefixes2.java     |   9 +-
 .../prefixes/TestPrefixMappingOverPrefixMap.java   |  39 --
 .../dboe/storage/storage/TestStorageSimple.java    |   4 +-
 .../jena/dboe/trans/bplustree/BPTreeNodeMgr.java   |   9 +-
 .../bplustree/rewriter/BPTreeNodeBuilder.java      |  13 -
 .../jena/dboe/trans/data/TransBinaryDataFile.java  |   4 +-
 .../org/apache/jena/dboe/trans/data/TransBlob.java |  18 +-
 .../jena/dboe/transaction/txn/Transaction.java     |   7 +-
 .../jena/tdb2/loader/main/DataToTuplesInline.java  |   4 +-
 .../tdb2/loader/main/DataToTuplesInlineSingle.java |   4 +-
 .../apache/jena/tdb2/loader/main/LoaderMain.java   |   2 +-
 .../jena/tdb2/loader/main/PrefixHandlerBulk.java   |   4 +-
 .../jena/tdb2/store/DatasetGraphSwitchable.java    |  14 +-
 .../apache/jena/tdb2/store/DatasetGraphTDB.java    |   6 +-
 .../java/org/apache/jena/tdb2/store/GraphTDB.java  |   8 +-
 .../jena/tdb2/store/GraphViewSwitchable.java       |  65 +--
 .../jena/tdb2/store/PrefixMapSwitchable.java}      |  29 +-
 .../apache/jena/tdb2/store/StoragePrefixesTDB.java |  17 +-
 .../jena/tdb2/graph/AbstractTestGraphsTDB.java     |  12 -
 .../jena/tdb2/graph/TestDatasetGraphTDB.java       |   7 -
 .../org/apache/jena/tdb2/store/TestDatasetTDB.java |   3 +-
 .../org/apache/jena/tdb2/sys/TestDatabaseOps.java  |  11 +-
 .../apache/jena/arq/querybuilder/Converters.java   |  59 ++-
 .../org/apache/jena/fuseki/ctl/ActionPing.java     |   3 +-
 .../org/apache/jena/fuseki/server/Dispatcher.java  |  14 -
 .../java/org/apache/jena/test/TC_Integration.java  |  25 +-
 .../jena/test/integration/TS_Integration.java      |  20 +-
 .../jena/test/integration/TestDatasetPrefixes.java | 236 +++++++++++
 .../apache/jena/test/txn/TestDataset2Graph.java    |  28 +-
 .../org/apache/jena/sdb/store/DatasetGraphSDB.java |  20 +-
 .../jena/tdb/index/bplustree/BPTreeNode.java       | 448 ++++++++++-----------
 .../tdb/index/bplustree/BPTreeNodeBuilder.java     |  54 +--
 .../jena/tdb/index/bplustree/BPTreeNodeMgr.java    |  86 ++--
 .../main/java/org/apache/jena/tdb/lib/DumpOps.java |   2 +-
 .../org/apache/jena/tdb/store/DatasetGraphTDB.java |  72 ++--
 .../jena/tdb/store}/DatasetPrefixStorage.java      |  51 +--
 .../jena/tdb/store/DatasetPrefixStorageLogger.java | 128 ------
 .../apache/jena/tdb/store/DatasetPrefixesTDB.java  |  94 ++---
 .../jena/tdb/store/GraphPrefixesProjection.java    | 113 ++++++
 .../java/org/apache/jena/tdb/store/GraphTDB.java   |  67 +--
 .../org/apache/jena/tdb/store/PrefixMapTDB1.java   |  25 +-
 .../jena/tdb/store/bulkloader/BulkLoader.java      |  22 +-
 .../store/bulkloader2/ProcNodeTableBuilder.java    |  44 +-
 .../apache/jena/tdb/store/nodetable/NodecSSE.java  |  52 +--
 .../tdb/store/nodetupletable/NodeTupleTable.java   |  14 +-
 .../nodetupletable/NodeTupleTableConcrete.java     |  13 +-
 .../tdb/store/tupletable/TupleIndexRecord.java     |   8 +-
 .../tdb/transaction/DatasetGraphTransaction.java   |  82 ++--
 .../org/apache/jena/tdb/transaction/Journal.java   |   4 +-
 .../java/org/apache/jena/tdb/graph/TS_Graph.java   |   3 +-
 .../apache/jena/tdb/graph/TestDatasetGraphTDB.java |   7 -
 .../apache/jena/tdb/graph/TestPrefixMapTDB.java    |  10 +-
 .../jena/tdb/graph/TestPrefixMappingTDB.java       |  42 +-
 .../org/apache/jena/tdb/store/TestDatasetTDB.java  |  85 ++--
 .../java/org/apache/jena/tdb/store/TestLoader.java |   6 +-
 .../tdb/store/nodetable/AbstractTestNodeTable.java |  30 +-
 136 files changed, 2855 insertions(+), 2989 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/query/Dataset.java b/jena-arq/src/main/java/org/apache/jena/query/Dataset.java
index 3a43214..cc54587 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/Dataset.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/Dataset.java
@@ -21,26 +21,28 @@ package org.apache.jena.query;
 import java.util.Iterator ;
 
 import org.apache.jena.rdf.model.Model ;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.shared.Lock ;
+import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.core.DatasetGraph ;
-import org.apache.jena.sparql.core.Transactional ;
+import org.apache.jena.sparql.core.Transactional;
 import org.apache.jena.sparql.util.Context ;
 
 /** Query is over a Dataset, a collection of named graphs
  *  and a background graph (also called the default
  *  graph or unnamed graph). */
 
-public interface Dataset extends Transactional 
+public interface Dataset extends Transactional
 {
     /** Get the default graph as a Jena Model */
     public Model getDefaultModel() ;
-    
-    /** Get the graph which is the unionof all named graphs as a Jena Model */
+
+    /** Get the graph which is the union of all named graphs as a Jena Model */
     public Model getUnionModel() ;
 
     /**
      * Set the default graph. Can be set to null for none.
-     * 
+     *
      * @param model the default graph to set
      * @return this {@code Dataset} for continued usage
      */
@@ -49,12 +51,12 @@ public interface Dataset extends Transactional
     /** Get a graph by name as a Jena Model */
     public Model getNamedModel(String uri) ;
 
-    /** Does the dataset contain a model with the name supplied? */ 
+    /** Does the dataset contain a model with the name supplied? */
     public boolean containsNamedModel(String uri) ;
 
     /**
      * Set a named graph.
-     * 
+     *
      * @param uri the name of the graph to set
      * @param model the graph to set
      * @return this {@code Dataset} for continued usage
@@ -63,7 +65,7 @@ public interface Dataset extends Transactional
 
     /**
      * Remove a named graph.
-     * 
+     *
      * @param uri the name of the gaph to remove
      * @return this {@code Dataset} for continued usage
      */
@@ -71,19 +73,19 @@ public interface Dataset extends Transactional
 
     /**
      * Change a named graph for another using the same name
-     * 
+     *
      * @param uri the name of the graph to replace
      * @param model the graph with which to replace it
      * @return this {@code Dataset} for continued usage
      */
     public Dataset replaceNamedModel(String uri, Model model);
-    
+
     /** List the names */
     public Iterator<String> listNames() ;
-    
+
     /** Get the lock for this dataset */
     public Lock getLock() ;
-    
+
     /** Get the context associated with this dataset */
     public Context getContext() ;
 
@@ -102,40 +104,51 @@ public interface Dataset extends Transactional
      * In addition, check details of a specific implementation.
      */
     public boolean supportsTransactions() ;
-    
+
     /** Declare whether {@link #abort} is supported.
      *  This goes along with clearing up after exceptions inside application transaction code.
      */
     public boolean supportsTransactionAbort() ;
-    
-    /** Start either a READ or WRITE transaction */ 
+
+    /** Start either a READ or WRITE transaction */
     @Override
     public void begin(ReadWrite readWrite) ;
-    
-    /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */  
+
+    /** Commit a transaction - finish the transaction and make any changes permanent (if a "write" transaction) */
     @Override
     public void commit() ;
-    
-    /** Abort a transaction - finish the transaction and undo any changes (if a "write" transaction) */  
+
+    /** Abort a transaction - finish the transaction and undo any changes (if a "write" transaction) */
     @Override
     public void abort() ;
 
-    /** Say whether a transaction is active */ 
+    /** Say whether a transaction is active */
     @Override
     public boolean isInTransaction() ;
-    
-    /** Finish the transaction - if a write transaction and commit() has not been called, then abort */  
+
+    /** Finish the transaction - if a write transaction and commit() has not been called, then abort */
     @Override
     public void end() ;
-    
+
     /** Get the dataset in graph form */
-    public DatasetGraph asDatasetGraph() ; 
-    
+    public DatasetGraph asDatasetGraph() ;
+
+    /** Get the {@link PrefixMapping} this dataset.
+     * <p>
+     * This is an optional operation.
+     */
+    public default PrefixMapping getPrefixMapping() {
+        DatasetGraph dsg = asDatasetGraph();
+        if ( dsg == null )
+            throw new UnsupportedOperationException("Dataset.getPrefixMapping");
+        return Prefixes.adapt(dsg.prefixes());
+    }
+
     /** Close the dataset, potentially releasing any associated resources.
      *  The dataset can not be used for query after this call.
      */
     public void close() ;
-    
+
     /**
      * @return Whether this {@code Dataset} is empty of triples, whether in the default graph or in any named graph.
      */
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java b/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
index 5794c65..b546d71 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
@@ -54,9 +54,9 @@ import org.apache.jena.sparql.util.Context;
  * "parse" method is called. It can be used multiple times in which case the same source
  * is reread. The destination can vary. The application is responsible for concurrency of
  * the destination of the parse operation.
- * 
+ *
  * The process is
- * 
+ *
  * <pre>
  *    StreamRDF destination = ...
  *    RDFParser parser = RDFParser.create().source("filename.ttl").build();
@@ -68,12 +68,12 @@ import org.apache.jena.sparql.util.Context;
  * </pre>
  * The {@code destination} {@link StreamRDF} and can be given as a
  * {@link Graph} or {@link DatasetGraph} as well.
- * 
- * @see ReaderRIOT The interface to the syntax parsing process for each RDF syntax. 
+ *
+ * @see ReaderRIOT The interface to the syntax parsing process for each RDF syntax.
  */
 
 public class RDFParser {
-    /*package*/ enum LangTagForm { NONE, LOWER_CASE, CANONICAL }  
+    /*package*/ enum LangTagForm { NONE, LOWER_CASE, CANONICAL }
 
     private final String            uri;
     private final Path              path;
@@ -100,7 +100,7 @@ public class RDFParser {
     private boolean                 canUseThisParser = true;
 
     // ---- Builder creation
-    
+
     /** Create an {@link RDFParserBuilder}.
      * <p>
      * Often used in a pattern such as:
@@ -109,7 +109,7 @@ public class RDFParser {
      *        .source("data.ttl")
      *        .parse(graph);
      * </pre>
-     * 
+     *
      */
     public static RDFParserBuilder create() {
         return RDFParserBuilder.create();
@@ -120,7 +120,7 @@ public class RDFParser {
      * {@link Path}.
      * <p>
      * This is a shortcut for {@code RDFParser.create().source(path)}.
-     * 
+     *
      * @param path
      * @return this
      */
@@ -133,11 +133,11 @@ public class RDFParser {
      * can be a filename.
      * <p>
      * This is a shortcut for {@code RDFParser.create().source(uriOrFile)}.
-     * 
+     *
      * @param uriOrFile
      * @return this
      */
-    
+
     public static RDFParserBuilder source(String uriOrFile) {
         return RDFParserBuilder.create().source(uriOrFile);
     }
@@ -154,23 +154,23 @@ public class RDFParser {
         return RDFParserBuilder.create().fromString(string);
     }
 
-    /** 
+    /**
      * Create an {@link RDFParserBuilder} and set the source to {@link InputStream}.
-     *  The {@link InputStream} will be closed when the 
-     *  parser is called and the parser can not be reused. 
+     *  The {@link InputStream} will be closed when the
+     *  parser is called and the parser can not be reused.
      *  The syntax must be set with {@code .lang(...)}.
      *  <p>
      *  This is a shortcut for {@code RDFParser.create().source(input)}.
      *  @param input
-     *  @return this 
+     *  @return this
      */
     public static RDFParserBuilder source(InputStream input) {
         return RDFParserBuilder.create().source(input);
     }
-    
-    /* package */ RDFParser(String uri, Path path, String content, InputStream inputStream, Reader javaReader, StreamManager streamManager, 
-                            HttpClient httpClient, Lang hintLang, Lang forceLang, String baseUri, boolean strict, Optional<Boolean> checking, 
-                            boolean canonicalLexicalValues, LangTagForm langTagForm,  
+
+    /* package */ RDFParser(String uri, Path path, String content, InputStream inputStream, Reader javaReader, StreamManager streamManager,
+                            HttpClient httpClient, Lang hintLang, Lang forceLang, String baseUri, boolean strict, Optional<Boolean> checking,
+                            boolean canonicalLexicalValues, LangTagForm langTagForm,
                             boolean resolveURIs, IRIResolver resolver, FactoryRDF factory,
                             ErrorHandler errorHandler, Context context) {
         int x = countNonNull(uri, path, content, inputStream, javaReader);
@@ -181,7 +181,7 @@ public class RDFParser {
         Objects.requireNonNull(factory);
         Objects.requireNonNull(errorHandler);
         Objects.requireNonNull(checking);
-        
+
         this.uri = uri;
         this.path = path;
         this.content = content;
@@ -229,40 +229,40 @@ public class RDFParser {
                 return false;
         return true;
     }
-    
+
     /**
      * Parse the source, sending the results to a {@link Graph}. The source must be for
-     * triples; any quads are discarded. 
+     * triples; any quads are discarded.
      */
     public void parse(Graph graph) {
         parse(StreamRDFLib.graph(graph));
     }
-    
+
     /**
      * Parse the source, sending the results to a {@link Model}.
      * The source must be for triples; any quads are discarded.
-     * This method is equivalent to {@code parse(model.getGraph())}. 
+     * This method is equivalent to {@code parse(model.getGraph())}.
      */
     public void parse(Model model) {
         parse(model.getGraph());
     }
-    
+
     /**
      * Parse the source, sending the results to a {@link DatasetGraph}.
      */
     public void parse(DatasetGraph dataset) {
         parse(StreamRDFLib.dataset(dataset));
     }
-    
+
     /**
      * Parse the source, sending the results to a {@link Dataset}.
-     * This method is equivalent to {@code parse(dataset.asDatasetGraph())}. 
+     * This method is equivalent to {@code parse(dataset.asDatasetGraph())}.
      */
     public void parse(Dataset dataset) {
         parse(dataset.asDatasetGraph());
     }
-    
-    /** 
+
+    /**
      * Parse the source, sending the results to a {@link StreamRDF}.
      */
     public void parse(StreamRDF destination) {
@@ -273,7 +273,7 @@ public class RDFParser {
         // FactoryRDF is stateful in the LabelToNode mapping.
         // NB FactoryRDFCaching does not need to reset its cache.
         factory.reset() ;
-        
+
         if ( canonicalLexicalValues )
             destination = new StreamCanonicalLiterals(destination);
         switch(langTagForm) {
@@ -332,23 +332,23 @@ public class RDFParser {
         ContentType ct = WebContent.determineCT(null, lang, baseUri);
         if ( ct == null )
             throw new RiotException("Failed to determine the RDF syntax (.lang or .base required)");
-    
+
         ReaderRIOT readerRiot = createReader(ct);
         if ( readerRiot == null )
             throw new RiotException("No parser registered for content type: " + ct.getContentTypeStr());
         Reader jr = javaReader;
         if ( content != null )
             jr = new StringReader(content);
-        
+
         read(readerRiot, inputStream, jr, baseUri, context, ct, destination);
     }
-    
+
     /** Call the reader, from either an InputStream or a Reader */
     private static void read(ReaderRIOT readerRiot, InputStream inputStream, Reader javaReader,
                              String baseUri, Context context,
                              ContentType ct, StreamRDF destination) {
         if ( inputStream != null && javaReader != null )
-            throw new InternalErrorException("Both inputStream and javaReader are non-null"); 
+            throw new InternalErrorException("Both inputStream and javaReader are non-null");
         if ( inputStream != null ) {
             readerRiot.read(inputStream, baseUri, ct, destination, context);
             return;
@@ -373,19 +373,19 @@ public class RDFParser {
             { throw new RiotNotFoundException() ;}
             catch (IOException ex) { IO.exception(ex); }
         }
-        
+
         TypedInputStream in;
         // Need more control than LocatorURL provides to get the Accept header in and the HttpCLient.
         // So map now.
         urlStr = streamManager.mapURI(urlStr);
         if ( urlStr.startsWith("http://") || urlStr.startsWith("https://") ) {
             // HttpOp.execHttpGet(,acceptHeader,) overrides the HttpClient default setting.
-            // 
+            //
             // If there is an explicitly set HttpClient use that as given, and do not override
             // the accept header (i.e. pass null to arg accpetHeader in execHttpGet).
             // Else, use httpOp as setup and set the accept header.
-            String acceptHeader = 
-                ( httpClient == null ) ? WebContent.defaultRDFAcceptHeader : null; 
+            String acceptHeader =
+                ( httpClient == null ) ? WebContent.defaultRDFAcceptHeader : null;
             in = HttpOp.execHttpGet(urlStr, acceptHeader, httpClient, null);
         } else {
             // Already mapped.
@@ -394,7 +394,7 @@ public class RDFParser {
         if ( in == null )
             throw new RiotNotFoundException("Not found: "+urlStr);
         return in ;
-        
+
     }
 
     private ReaderRIOT createReader(ContentType ct) {
@@ -406,7 +406,7 @@ public class RDFParser {
         ReaderRIOTFactory r = RDFParserRegistry.getFactory(lang);
         if ( r == null )
             return null;
-        
+
         ReaderRIOT reader = createReader(r, lang);
         return reader ;
     }
@@ -420,7 +420,7 @@ public class RDFParser {
     private ParserProfile makeParserProfile(Lang lang) {
         boolean resolve = resolveURIs;
         boolean checking$ = strict;
-        
+
         // Per language tweaks.
         if ( sameLang(NTRIPLES, lang) || sameLang(NQUADS, lang) ) {
             if ( ! strict )
@@ -435,11 +435,11 @@ public class RDFParser {
 
         IRIResolver resolver = this.resolver;
         if ( resolver == null ) {
-            resolver = resolve ? 
+            resolver = resolve ?
                 IRIResolver.create(baseUri) :
                 IRIResolver.createNoResolve() ;
         }
-        PrefixMap prefixMap = PrefixMapFactory.createForInput();
+        PrefixMap prefixMap = PrefixMapFactory.create();
         ParserProfileStd parserFactory = new ParserProfileStd(factory, errorHandler, resolver, prefixMap, context, checking$, strict);
         return parserFactory;
     }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java b/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java
index 9e9694f..3a1ed89 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFWriter.java
@@ -219,7 +219,7 @@ public class RDFWriter {
     }
 
     private  PrefixMap prefixMap(DatasetGraph dataset) {
-        return prefixMap(dataset.getDefaultGraph());
+        return PrefixMapFactory.createForOutput(dataset.prefixes());
     }
 
     private static PrefixMap prefixMap(Graph graph) {
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java
index 23af37f..68f9e63 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamBase.java
@@ -28,11 +28,11 @@ import org.apache.jena.sparql.core.Quad ;
 
 /**
  * Base class for StreamRDF implementations which store received <T>
- * objects in a {@link java.util.Collection}. 
- * 
+ * objects in a {@link java.util.Collection}.
+ *
  * The resulting collection can be retrieved via the {@link #getCollected()}
  * method.
- * 
+ *
  * Implementations are suitable for single-threaded parsing, for use with small
  * data or distributed computing frameworks (e.g. Hadoop) where the overhead
  * of creating many threads is significant.
@@ -40,12 +40,12 @@ import org.apache.jena.sparql.core.Quad ;
  * @param <T> Type of the value stored in the collection
  */
 public abstract class CollectorStreamBase<T> implements StreamRDF {
-	private final PrefixMap prefixes = PrefixMapFactory.createForInput();
+	private final PrefixMap prefixes = PrefixMapFactory.create();
 	private String baseIri;
-	
+
 	@Override
 	public void finish() {}
-	
+
 	@Override
 	public void triple(Triple triple) {}
 
@@ -54,17 +54,17 @@ public abstract class CollectorStreamBase<T> implements StreamRDF {
 
 	@Override
 	public void start() {}
-	
+
 	@Override
 	public void base(String base) {
 		this.baseIri = base;
 	}
-	
+
 	@Override
 	public void prefix(String prefix, String iri) {
 		prefixes.add(prefix, iri);
 	}
-	
+
 	public PrefixMap getPrefixes() {
 		return prefixes;
 	}
@@ -74,7 +74,7 @@ public abstract class CollectorStreamBase<T> implements StreamRDF {
 	}
 
 	/**
-	 * @return The collection received by this instance. 
+	 * @return The collection received by this instance.
 	 */
 	public abstract Collection<T> getCollected();
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java
index 5afa453..2964be6 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/CollectorStreamRDF.java
@@ -28,50 +28,50 @@ import org.apache.jena.riot.system.StreamRDF ;
 import org.apache.jena.sparql.core.Quad ;
 
 /**
- * StreamRDF implementations which store received triples and quads 
- * in a {@link java.util.Collection}. 
- * 
+ * StreamRDF implementations which store received triples and quads
+ * in a {@link java.util.Collection}.
+ *
  * The resulting collection can be retrieved via the
- * {@link #getTriples()} and {@link #getQuads()} 
+ * {@link #getTriples()} and {@link #getQuads()}
  * methods.
- * 
+ *
  * The implementations are suitable for single-threaded parsing, for use with small
  * data or distributed computing frameworks (e.g. Hadoop) where the overhead
  * of creating many threads for a push-pull parser setup is significant.
  */
 public class CollectorStreamRDF implements StreamRDF {
-	private PrefixMap prefixes = PrefixMapFactory.createForInput();
+	private PrefixMap prefixes = PrefixMapFactory.create();
 	private String baseIri;
-	
+
 	private List<Triple> triples = new ArrayList<>();
 	private List<Quad> quads = new ArrayList<>();
-    
+
     @Override
     public void start() {
         triples.clear() ;
         quads.clear() ;
-        prefixes = PrefixMapFactory.createForInput();
+        prefixes = PrefixMapFactory.create();
     }
 
 	@Override
 	public void finish() {}
-	
+
 	@Override
 	public void triple(Triple triple) { triples.add(triple) ; }
-	
+
 	@Override
 	public void quad(Quad quad) { quads.add(quad) ; }
-	
+
 	@Override
 	public void base(String base) {
 		this.baseIri = base;
 	}
-	
+
 	@Override
 	public void prefix(String prefix, String iri) {
 		prefixes.add(prefix, iri);
 	}
-	
+
 	public PrefixMap getPrefixes() {
 		return prefixes;
 	}
@@ -80,6 +80,6 @@ public class CollectorStreamRDF implements StreamRDF {
 		return baseIri;
 	}
 
-	public List<Triple> getTriples()        { return triples ; } 
-    public List<Quad> getQuads()            { return quads ; } 
+	public List<Triple> getTriples()        { return triples ; }
+    public List<Quad> getQuads()            { return quads ; }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java
index a79ae6f..b2fca7b 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/PipedRDFIterator.java
@@ -48,11 +48,11 @@ import org.apache.jena.riot.system.PrefixMapFactory;
  * Inspired by Java's {@link java.io.PipedInputStream} and
  * {@link java.io.PipedOutputStream}
  * </p>
- * 
+ *
  * @param <T>
  *            The type of the RDF primitive, should be one of {@code Triple},
  *            {@code Quad}, or {@code Tuple<Node>}
- * 
+ *
  * @see PipedTriplesStream
  * @see PipedQuadsStream
  * @see PipedTuplesStream
@@ -94,7 +94,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
 
     private final Object lock = new Object(); // protects baseIri and prefixes
     private String baseIri;
-    private final PrefixMap prefixes = PrefixMapFactory.createForInput();
+    private final PrefixMap prefixes = PrefixMapFactory.create();
 
     /**
      * Creates a new piped RDF iterator with the default buffer size of
@@ -122,7 +122,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
      * the expected input size though you may need to tune this depending on how
      * fast your consumer thread is.
      * </p>
-     * 
+     *
      * @param bufferSize
      *            Buffer size
      */
@@ -146,7 +146,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
      * chance of thread starvation. This likely need only be set to {@code true}
      * if there will be multiple consumers.
      * </p>
-     * 
+     *
      * @param bufferSize
      *            Buffer size
      * @param fair
@@ -188,7 +188,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
      * and errors out accordingly. You may need to adjust this if you have a
      * slow producer thread or many consumer threads.
      * </p>
-     * 
+     *
      * @param bufferSize
      *            Buffer size
      * @param fair
@@ -328,7 +328,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
 
     /**
      * Gets the most recently seen Base IRI
-     * 
+     *
      * @return Base IRI
      */
     public String getBaseIri() {
@@ -345,7 +345,7 @@ public class PipedRDFIterator<T> implements Iterator<T>, Closeable {
 
     /**
      * Gets the prefix map which contains the prefixes seen so far in the stream
-     * 
+     *
      * @return Prefix Map
      */
     public PrefixMap getPrefixes() {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixEntry.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixEntry.java
similarity index 68%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixEntry.java
rename to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixEntry.java
index 7bab96a..c7effd5 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixEntry.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixEntry.java
@@ -15,13 +15,17 @@
  *  information regarding copyright ownership.
  */
 
-package org.apache.jena.dboe.storage.prefixes;
+package org.apache.jena.riot.system;
+
+import java.util.Objects;
 
 /** Entry in a prefix map. */
 public class PrefixEntry {
     // Custom interface to get more appropriate names.
 
     public static PrefixEntry create(String prefix, String uri) {
+        Objects.requireNonNull(prefix);
+        Objects.requireNonNull(uri);
         return new PrefixEntry(prefix, uri);
     }
     private final String prefix;
@@ -44,4 +48,21 @@ public class PrefixEntry {
     public String toString() {
         return "PrefixEntry["+prefix+": <"+uri+">]";
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(prefix, uri);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if ( this == obj )
+            return true;
+        if ( obj == null )
+            return false;
+        if ( getClass() != obj.getClass() )
+            return false;
+        PrefixEntry other = (PrefixEntry)obj;
+        return Objects.equals(prefix, other.prefix) && Objects.equals(uri, other.uri);
+    }
 }
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixLib.java
similarity index 63%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixLib.java
rename to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixLib.java
index 56b1eab..4bb2e4d 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixLib.java
@@ -15,26 +15,28 @@
  *  information regarding copyright ownership.
  */
 
-package org.apache.jena.dboe.storage.prefixes;
+package org.apache.jena.riot.system;
 
-import java.util.Objects;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.dboe.storage.Prefixes;
 import org.apache.jena.graph.Node;
 import org.apache.jena.sparql.core.Quad;
 
 /**
- * Algorithms over {@link PrefixMapI} to abbreviate and expand
+ * Algorithms over {@link PrefixMap} to abbreviate and expand
  */
 public class PrefixLib {
-
     /**
      * Remove ":" from a prefix if necessary to make it canonical.
      * @param prefix
      * @return prefix, without colon.
      */
     public static String canonicalPrefix(String prefix) {
+        if ( prefix == null )
+            // null is not good style but let's be robust.
+            return "";
         if ( prefix.endsWith(":") )
             return prefix.substring(0, prefix.length() - 1);
         return prefix;
@@ -42,31 +44,21 @@ public class PrefixLib {
 
     /** Canonical name for graphs */
     public static Node canonicalGraphName(Node graphName) {
-        if ( graphName == Prefixes.nodeDefaultGraph) 
-            return graphName;
         if ( graphName == null || Quad.isDefaultGraph(graphName) )
-            return Prefixes.nodeDefaultGraph;
+            return Prefixes.nodeDataset;
         return graphName;
     }
 
     /**
-     * Is this the canonical, internal marker for the default graph for storage
-     * prefixes? ({@link Prefixes#nodeDefaultGraph})
-     * 
-     * @param graphName
-     */
-    public static boolean isNodeDefaultGraph(Node graphName) {
-        return Objects.equals(Prefixes.nodeDefaultGraph, graphName);
-    }
-
-    /** abbreviate a uriStr, giving a string as a short form. If not possible return null.
+     * Abbreviate a uriStr, giving a string as a short form. If not possible return null.
      * This does not guarantee that the result is suitable for all RDF syntaxes.
      * Further checking for the rules of a particular syntax are necessary.
      */
-    public static String abbreviate(PrefixMapI pmap, String uriStr) {
-        for ( PrefixEntry e : pmap ) {
-            String prefix = e.getPrefix();
-            String prefixUri = e.getUri();
+    public static String abbreviate(PrefixMap prefixes, String uriStr) {
+        Map<String, String> map = prefixes.getMapping();
+        for ( Entry<String, String> e : map.entrySet() ) {
+            String prefix = e.getKey();
+            String prefixUri = e.getValue();
             if ( uriStr.startsWith(prefixUri) ) {
                 String ln = uriStr.substring(prefixUri.length());
                 if ( strSafeFor(ln, '/') && strSafeFor(ln, '#') && strSafeFor(ln, ':') )
@@ -80,17 +72,34 @@ public class PrefixLib {
      * Abbreviate a uriStr, return the prefix and local parts.
      * This does not guarantee that the result is suitable for all RDF syntaxes.
      */
-    public static Pair<String, String> abbrev(PrefixMapI prefixes, String uriStr) {
-        for ( PrefixEntry e : prefixes ) {
-            String uriForPrefix = e.getUri();
-            if ( uriStr.startsWith(uriForPrefix) )
-                return Pair.create(e.getPrefix(), uriStr.substring(uriForPrefix.length()));
+    public static Pair<String, String> abbrev(PrefixMap prefixes, String uriStr) {
+        return abbrev(prefixes.getMapping(), uriStr, true);
+    }
+
+    /**
+     * Abbreviate a uriStr, return the prefix and local parts, using a {@code Map} of
+     * prefix string to URI string. This does not guarantee that the result is
+     * suitable for all RDF syntaxes. In addition, perform a fast check for legal
+     * turtle local parts using {@link #isSafeLocalPart}. This covers the majority of
+     * real work cases and allows the code to find a probably-legal abbrev pair if an
+     * illegal one is found. (In practice, illegal local names arise only when one
+     * prefix URI is a substring of another.)
+     */
+    public static Pair<String, String> abbrev(Map<String, String> prefixesMap, String uriStr, boolean turtleSafeLocalPart) {
+        for ( Entry<String, String> e : prefixesMap.entrySet() ) {
+            String prefix = e.getKey();
+            String uriForPrefix = e.getValue();
+            if ( uriStr.startsWith(uriForPrefix) ) {
+                String ln = uriStr.substring(uriForPrefix.length());
+                if (! turtleSafeLocalPart || isSafeLocalPart(ln))
+                    return Pair.create(e.getKey(), ln);
+            }
         }
         return null;
     }
 
     /** Expand a prefixedName which must include a ':' */
-    public static String expand(PrefixMapI prefixes, String prefixedName) {
+    public static String expand(PrefixMap prefixes, String prefixedName) {
         int i = prefixedName.indexOf(':');
         if ( i < 0 )
             return null;
@@ -98,17 +107,17 @@ public class PrefixLib {
     }
 
     /** Expand a prefix, local name pair. */
-    public static String expand(PrefixMapI prefixes, String prefix, String localName) {
+    public static String expand(PrefixMap prefixes, String prefix, String localName) {
         prefix = canonicalPrefix(prefix);
         String x = prefixes.get(prefix);
         if ( x == null )
             return null;
         return x + localName;
     }
-    
+
     /**
      * Takes a guess for the String string to use in abbreviation.
-     * 
+     *
      * @param iriString String string
      * @return String or null
      */
@@ -130,15 +139,15 @@ public class PrefixLib {
      * @param localName Local name
      * @return True if safe, false otherwise
      */
-    public boolean isSafeLocalPart(String localName) {
-        // This test isn't complete but covers the common issues that arise. 
+    public static boolean isSafeLocalPart(String localName) {
+        // This test isn't complete but covers the common issues that arise.
         // Does not consider possible escaping.
         // There needs to be a further, stronger check for output.
-        // About ':' -- Turtle RDF 1.1 allows this in a local part of a prefix name. 
+        // About ':' -- Turtle RDF 1.1 allows this in a local part of a prefix name.
         return strSafeFor(localName, '/') && strSafeFor(localName, '#');
     }
 
     private static boolean strSafeFor(String str, char ch) {
         return str.indexOf(ch) == -1;
     }
-    }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java
index 8193d9f..79746c2 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMap.java
@@ -19,6 +19,7 @@ package org.apache.jena.riot.system;
 
 import java.util.Map;
 import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
 
 import org.apache.jena.atlas.lib.Pair;
 import org.apache.jena.iri.IRI;
@@ -35,6 +36,24 @@ import org.apache.jena.shared.PrefixMapping ;
  * </p>
  */
 public interface PrefixMap {
+    /**
+     * Return the URI for the prefix, or null if there is no entry for this prefix.
+     */
+    public String get(String prefix);
+
+    // Is this a good idea? Leave out until it is justified.
+//    /**
+//     * Find a prefix that is mapped to the URI argument.
+//     * <p>
+//     * Several prefixes may map to the same URI; this function does not say which is
+//     * return nor whether the same prefix is returned each time.
+//     * <p>
+//     * This operation may be slow (a scan of all the prefix mappings).
+//     */
+//    public default String getByURI(String uri) {
+//        Objects.requireNonNull(uri);
+//        return getMapping().entrySet().stream().filter(e->e.getValue().equals(uri)).map(e->e.getKey()).findFirst().orElse(null);
+//    }
 
     /**
      * Return the underlying mapping, this is generally unsafe to modify and
@@ -45,7 +64,7 @@ public interface PrefixMap {
      *
      * @return Underlying mapping
      */
-    public abstract Map<String, String> getMapping();
+    public Map<String, String> getMapping();
 
     /**
      * Return a fresh copy of the underlying mapping, should be safe to modify
@@ -53,12 +72,17 @@ public interface PrefixMap {
      *
      * @return Copy of the mapping
      */
-    public abstract Map<String, String> getMappingCopy();
+    public Map<String, String> getMappingCopy();
+
+    /**
+     * Apply a {@link BiConsumer}{@literal<String, String>} to each entry in the PrefixMap.
+     */
+    public void forEach(BiConsumer<String, String> action) ;
 
     /**
-     * Apply a {@link BiConsumer}{@code <String, String>} to each entry in the Prefixmap.
+     * Return a stream of {@link PrefixEntry}, pairs of prefix and URI.
      */
-    public abstract void forEach(BiConsumer<String, String> action) ;
+    public Stream<PrefixEntry> stream();
 
     /**
      * Add a prefix, overwrites any existing association
@@ -66,7 +90,7 @@ public interface PrefixMap {
      * @param prefix Prefix
      * @param iriString Namespace IRI
      */
-    public abstract void add(String prefix, String iriString);
+    public void add(String prefix, String iriString);
 
     /**
      * Add a prefix, overwrites any existing association
@@ -85,33 +109,33 @@ public interface PrefixMap {
      *
      * @param pmap Prefix Map
      */
-    public abstract void putAll(PrefixMap pmap);
+    public void putAll(PrefixMap pmap);
 
     /**
      * Add a prefix, overwrites any existing association
      *
      * @param pmap Prefix Mapping
      */
-    public abstract void putAll(PrefixMapping pmap);
+    public void putAll(PrefixMapping pmap);
 
     /**
      * Add a prefix, overwrites any existing association
      *
      * @param mapping A Map of prefix name to IRI string
      */
-    public abstract void putAll(Map<String, String> mapping) ;
+    public void putAll(Map<String, String> mapping) ;
 
     /**
      * Delete a prefix
      *
      * @param prefix Prefix to delete
      */
-    public abstract void delete(String prefix);
+    public void delete(String prefix);
 
     /**
      * Clear all prefixes.
      */
-    public abstract void clear();
+    public void clear();
 
     /**
      * Gets whether the map contains a given prefix
@@ -120,7 +144,7 @@ public interface PrefixMap {
      *            Prefix
      * @return True if the prefix is contained in the map, false otherwise
      */
-    public abstract boolean containsPrefix(String prefix);
+    public boolean containsPrefix(String prefix);
 
     /** @deprecated Use {@link #containsPrefix(String)} */
     @Deprecated
@@ -134,7 +158,7 @@ public interface PrefixMap {
      * @param uriStr URI to abbreviate
      * @return URI in prefixed name form if possible, null otherwise
      */
-    public abstract String abbreviate(String uriStr);
+    public String abbreviate(String uriStr);
 
     /**
      * Abbreviate an IRI and return a pair of prefix and local parts, or null.
@@ -143,7 +167,7 @@ public interface PrefixMap {
      * @return Pair of prefix and local name
      * @see #abbreviate
      */
-    public abstract Pair<String, String> abbrev(String uriStr);
+    public Pair<String, String> abbrev(String uriStr);
 
     /**
      * Expand a prefix named, return null if it can't be expanded
@@ -151,7 +175,7 @@ public interface PrefixMap {
      * @param prefixedName Prefixed Name
      * @return Expanded URI if possible, null otherwise
      */
-    public abstract String expand(String prefixedName);
+    public String expand(String prefixedName);
 
     /**
      * Expand a prefix, return null if it can't be expanded
@@ -160,7 +184,7 @@ public interface PrefixMap {
      * @param localName Local name
      * @return Expanded URI if possible, null otherwise
      */
-    public abstract String expand(String prefix, String localName);
+    public String expand(String prefix, String localName);
 
     /**
      * Return whether the prefix map is empty or not.
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapAdapter.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapAdapter.java
new file mode 100644
index 0000000..195d286
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapAdapter.java
@@ -0,0 +1,120 @@
+/*
+ * 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.jena.riot.system;
+
+import java.util.Map;
+
+import org.apache.jena.atlas.lib.Pair;
+import org.apache.jena.shared.PrefixMapping;
+import org.apache.jena.sparql.graph.PrefixMappingAdapter;
+import org.apache.jena.util.SplitIRI;
+
+/** 
+ * Provided {@link PrefixMap} for a {@link PrefixMapping}.
+ * @see PrefixMappingAdapter
+ */
+final
+public class PrefixMapAdapter extends PrefixMapBase implements PrefixMap {
+    private final PrefixMapping prefixMapping;
+
+    public PrefixMapAdapter(PrefixMapping prefixMapping) {
+        this.prefixMapping = prefixMapping;
+    }
+
+    public PrefixMapping getPrefixMapping() {
+        return prefixMapping;
+    }
+
+    @Override
+    public String get(String prefix) {
+        return prefixMapping.getNsPrefixURI(prefix);
+    }
+
+    @Override
+    public Map<String, String> getMappingCopy() {
+        return prefixMapping.getNsPrefixMap();
+    }
+
+    @Override
+    public Map<String, String> getMapping() {
+        // Actually a copy. There is no direct access in PrefixMapping.
+        return prefixMapping.getNsPrefixMap();
+    }
+
+    @Override
+    public void add(String prefix, String iriString) {
+        // Will apply addition PrefixMapping restrictions.
+        prefixMapping.setNsPrefix(prefix, iriString);
+    }
+
+    @Override
+    public void delete(String prefix) {
+        prefixMapping.removeNsPrefix(prefix);
+    }
+
+    @Override
+    public void clear() {
+        prefixMapping.clearNsPrefixMap();
+    }
+
+    @Override
+    public boolean containsPrefix(String prefix) {
+        return prefixMapping.getNsPrefixURI(prefix) != null;
+    }
+
+    @Override
+    public String abbreviate(String uriStr) {
+        return prefixMapping.qnameFor(uriStr);
+    }
+
+    @Override
+    public Pair<String, String> abbrev(String uriStr) {
+        int split = SplitIRI.splitXML(uriStr);
+        if ( split == uriStr.length() ) {
+            return null;
+        }
+        String ns = uriStr.substring(0, split);
+        String local = uriStr.substring(split);
+        return Pair.create(ns, local);
+    }
+
+    @Override
+    public String expand(String prefix, String localName) {
+        String prefixUri = prefixMapping.getNsPrefixURI(prefix);
+        if ( prefixUri == null )
+            return null;
+        return prefixUri+localName;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return size() == 0 ;
+    }
+
+    @Override
+    public int size() {
+        return prefixMapping.numPrefixes();
+    }
+
+    @Override
+    public String toString() {
+        return Prefixes.toString(this);
+    }
+}
+
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java
index 1c81d57..b49cfab 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapBase.java
@@ -19,30 +19,28 @@
 package org.apache.jena.riot.system;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
 
+import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.atlas.lib.Pair;
 import org.apache.jena.shared.PrefixMapping ;
 
 /**
  * Abstract base implementation of a {@link PrefixMap} which provides
- * some useful helper methods
- *
+ * some implementations of API methods.
  */
 public abstract class PrefixMapBase implements PrefixMap {
 
+    protected PrefixMapBase() {}
+
     protected boolean strSafeFor(String str, char ch) {
         return str.indexOf(ch) == -1;
     }
 
-    protected String canonicalPrefix(String prefix) {
-        if (prefix.endsWith(":"))
-            return prefix.substring(0, prefix.length() - 1);
-        return prefix;
-    }
-
     @Override
     public Map<String, String> getMappingCopy() {
         return new HashMap<>(this.getMapping());
@@ -53,9 +51,19 @@ public abstract class PrefixMapBase implements PrefixMap {
         getMapping().forEach(action);
     }
 
+    // e.g. Iterable.
+    private Iterator<PrefixEntry> iterator() {
+        return Iter.iter(getMapping().entrySet()).map(e->PrefixEntry.create(e.getKey(), e.getValue()));
+    }
+
+    @Override
+    public Stream<PrefixEntry> stream() {
+        return getMapping().entrySet().stream().map(e->PrefixEntry.create(e.getKey(), e.getValue()));
+    }
+
     @Override
     public void putAll(PrefixMap pmap) {
-    		pmap.getMapping().forEach(this::add);
+        pmap.getMapping().forEach(this::add);
     }
 
     @Override
@@ -65,69 +73,49 @@ public abstract class PrefixMapBase implements PrefixMap {
 
     @Override
     public void putAll(Map<String, String> mapping) {
-    		mapping.forEach(this::add);
+        mapping.forEach(this::add);
     }
 
-    /**
-     * Abbreviate an IRI or return a pair of prefix and local parts.
-     *
-     * @param uriStr
-     *            URI string to abbreviate
-     * @param turtleSafe
-     *            Only return legal Turtle local names.
-     */
-    protected Pair<String, String> abbrev(Map<String, String> prefixes, String uriStr, boolean checkLocalPart) {
-        for (Entry<String, String> e : prefixes.entrySet()) {
-            String uriForPrefix = e.getValue();
-
-            if (uriStr.startsWith(uriForPrefix)) {
-                String ln = uriStr.substring(uriForPrefix.length());
-                if (!checkLocalPart || this.isSafeLocalPart(ln))
-                    return Pair.create(e.getKey(), ln);
-            }
-        }
-        return null;
+    @Override
+    public String abbreviate(String uriStr) {
+        Objects.requireNonNull(uriStr);
+        PrefixLib.abbreviate(this, uriStr);
+        Pair<String, String> p = abbrev(uriStr);
+        if (p == null)
+            return null;
+        return p.getLeft() + ":" + p.getRight();
     }
 
     @Override
-    public String expand(String prefixedName) {
-        int i = prefixedName.indexOf(':');
-        if (i < 0)
-            return null;
-        return expand(prefixedName.substring(0, i), prefixedName.substring(i + 1));
+    public String expand(String prefix, String localName)  {
+        Objects.requireNonNull(prefix);
+        Objects.requireNonNull(localName);
+        return PrefixLib.expand(this, prefix, localName);
+    }
+
+    @Override
+    public Pair<String, String> abbrev(String uriStr) {
+        return PrefixLib.abbrev(this, uriStr);
     }
 
     /**
-     * Is a local name safe? Default is a fast check for Turtle-like local names.
-     * @param ln Local name
-     * @return True if safe, false otherwise
+     * Abbreviate an IRI and return a pair of prefix and local parts; return null otherwise.
+     *
+     * @param uriStr               URI string to abbreviate
+     * @param turtleSafeLocalPart  Only return legal Turtle local names.
      */
-    protected boolean isSafeLocalPart(String ln) {
-        // This test isn't complete but covers the common issues that arise.
-        // Does not consider possible escaping.
-        // There needs to be a further, stronger check for output.
-        // About ':' -- Turtle RDF 1.1 allows this in a local part of a prefix name.
-        return strSafeFor(ln, '/') && strSafeFor(ln, '#');
+    protected Pair<String, String> abbrev(Map<String, String> prefixesMap, String uriStr, boolean turtleSafeLocalPart) {
+        return PrefixLib.abbrev(prefixesMap, uriStr, turtleSafeLocalPart);
+    }
+
+    @Override
+    public String expand(String prefixedName) {
+        Objects.requireNonNull(prefixedName);
+        return PrefixLib.expand(this, prefixedName);
     }
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("{ ");
-        boolean first = true;
-
-        for (Entry<String, String> e : this.getMapping().entrySet()) {
-            String prefix = e.getKey();
-            String iri = e.getValue();
-            if (first)
-                first = false;
-            else
-                sb.append(" ,");
-            sb.append(prefix);
-            sb.append(":=");
-            sb.append(iri);
-        }
-        sb.append(" }");
-        return sb.toString();
+        return Prefixes.toString(this);
     }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapExtended.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapExtended.java
deleted file mode 100644
index 02f671c..0000000
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapExtended.java
+++ /dev/null
@@ -1,127 +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.jena.riot.system;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.atlas.logging.Log;
-
-// UNUSED
-/**
- * Implementation of a {@link PrefixMap} which extends another prefix map
- * without ever altering the parent.
- * <p>
- * This allows code to modify a prefix map based off of another map without
- * modifying that original map. This is somewhat different than simply making a
- * copy of an existing map since this implementation is partly a view over
- * another map so will reflect changes that happen to the other map.
- * </p>
- */
-public class PrefixMapExtended extends PrefixMapBase {
-    protected PrefixMap parent;
-    protected PrefixMap local;
-
-    /**
-     * Creates an extended prefix map
-     * 
-     * @param ext
-     *            Prefix Map to extend
-     */
-    public PrefixMapExtended(PrefixMap ext) {
-        if (ext == null)
-            throw new IllegalArgumentException("Prefix Map to extend cannot be null");
-        this.parent = ext;
-        this.local = PrefixMapFactory.create();
-    }
-
-    @Override
-    public void add(String prefix, String iri) {
-        prefix = canonicalPrefix(prefix);
-        // Add to local always.
-        local.add(prefix, iri);
-    }
-
-    @Override
-    public void delete(String prefix) {
-        prefix = canonicalPrefix(prefix);
-        local.delete(prefix);
-        if (parent.containsPrefix(prefix))
-            Log.warn(this, "Attempt to delete a prefix in the parent");
-    }
-
-    @Override
-    public void clear() {
-        local.clear();
-//        if (!parent.isEmpty() ) 
-//            Log.warn(this, "clear() : Parent not empty") ;
-    }
-
-    @Override
-    public String expand(String prefix, String localName) {
-        prefix = canonicalPrefix(prefix);
-        String x = local.expand(prefix, localName);
-        if (x != null)
-            return x;
-        return parent.expand(prefix, localName);
-    }
-
-    @Override
-    public Map<String, String> getMapping() {
-        Map<String, String> mapping = new HashMap<>();
-        mapping.putAll(parent.getMapping());
-        mapping.putAll(local.getMapping());
-        return Collections.unmodifiableMap(mapping);
-    }
-
-    @Override
-    public boolean containsPrefix(String prefix) {
-        return local.containsPrefix(prefix) || parent.containsPrefix(prefix);
-    }
-
-    @Override
-    public String abbreviate(String uriStr) {
-        String x = local.abbreviate(uriStr);
-        if (x != null)
-            return x;
-        return parent.abbreviate(uriStr);
-    }
-
-    @Override
-    public Pair<String, String> abbrev(String uriStr) {
-        Pair<String, String> p = local.abbrev(uriStr);
-        if (p != null)
-            return p;
-        return parent.abbrev(uriStr);
-    }
-    
-    @Override
-    public boolean isEmpty()
-    {
-        return parent.isEmpty() && local.isEmpty() ;
-    }
-
-    @Override
-    public int size()
-    {
-        return parent.size() + local.size() ;
-    }
-}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java
index 563f640..7039833 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapFactory.java
@@ -24,7 +24,7 @@ import org.apache.jena.shared.PrefixMapping ;
 
 /**
  * Factory which provides prefix maps
- * 
+ *
  */
 public class PrefixMapFactory {
 
@@ -34,7 +34,7 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the default
      * implementation, this may change from release to release.
      * </p>
-     * 
+     *
      * @return Prefix Map
      */
     public static PrefixMap create() {
@@ -48,10 +48,10 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the default
      * implementation, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap
      *            Prefix Map to copy
-     * 
+     *
      * @return Prefix Map
      */
     public static PrefixMap create(PrefixMap pmap) {
@@ -65,10 +65,10 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the default
      * implementation, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap
      *            PrefixMapping to copy
-     * 
+     *
      * @return Prefix Map
      */
     public static PrefixMap create(PrefixMapping pmap) {
@@ -83,7 +83,7 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the default
      * implementation, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap Mapping from prefix to IRI string
      * @return Prefix Map
      */
@@ -95,11 +95,13 @@ public class PrefixMapFactory {
 
     /**
      * Creates a new prefix map which is intended for use in input.
-     * 
+     *
      * @return Prefix map
+     * @deprecated Use {@link #create()}
      */
+    @Deprecated
     public static PrefixMap createForInput() {
-        return new PrefixMapStd();
+        return create();
     }
 
     /**
@@ -109,13 +111,15 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the best
      * implementation for input, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap
      *            Prefix Map to copy
      * @return Prefix Map
+     * @deprecated Use {@link #create(PrefixMap)}
      */
+    @Deprecated
     public static PrefixMap createForInput(PrefixMap pmap) {
-        return new PrefixMapStd(pmap);
+        return create(pmap);
     }
 
     /**
@@ -125,38 +129,37 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the best
      * implementation for input, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap
      *            Prefix Map to copy
-     * 
+     *
      * @return Prefix Map
+     * @deprecated Use {@link #create(PrefixMapping)}
      */
+    @Deprecated
     public static PrefixMap createForInput(PrefixMapping pmap) {
-        PrefixMap created = createForInput();
-        created.putAll(pmap);
-        return created;
+        return create(pmap);
     }
 
     /**
      * Creates a new prefix map, initialized from a Map of prefix to IRI string.
-     * 
+     *
      * @param pmap Mapping from prefix to IRI string
      * @return Prefix Map
+     * @deprecated Use {@link #create(Map)}
      */
+    @Deprecated
     public static PrefixMap createForInput(Map<String, String> pmap) {
-        PrefixMap created = createForInput();
-        created.putAll(pmap);
-        return created;
+        return create(pmap);
     }
 
-    
     /**
      * Creates a new prefix map which is intended for use in output
      * <p>
      * Will use whatever the version of ARQ you are using considers the best
      * implementation for output, this may change from release to release.
      * </p>
-     * 
+     *
      * @return Prefix Map
      */
     public static PrefixMap createForOutput() {
@@ -170,10 +173,10 @@ public class PrefixMapFactory {
      * Will use whatever the version of ARQ you are using considers the best
      * implementation for output, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap
      *            Prefix Map to copy
-     * 
+     *
      * @return Prefix Map
      */
     public static PrefixMap createForOutput(PrefixMap pmap) {
@@ -182,15 +185,15 @@ public class PrefixMapFactory {
 
     /**
      * Creates a new prefix map which is intended for use in output which starts
-     * with a copy of an existing map
+     * with a copy of an existing map.
      * <p>
      * Will use whatever the version of ARQ you are using considers the best
      * implementation for output, this may change from release to release.
      * </p>
-     * 
+     *
      * @param pmap
      *            Prefix Map to copy
-     * 
+     *
      * @return Prefix Map
      */
     public static PrefixMap createForOutput(PrefixMapping pmap) {
@@ -201,7 +204,7 @@ public class PrefixMapFactory {
 
     /**
      * Creates a new prefix map, initialized from a Map of prefix to IRI string.
-     * 
+     *
      * @param pmap Mapping from prefix to IRI string
      * @return Prefix Map
      */
@@ -211,25 +214,8 @@ public class PrefixMapFactory {
         return created;
     }
 
-    /**
-     * Creates a new prefix map which is an extension of an existing prefix map
-     * <p>
-     * This differs from using one of the various {@code create} methods since
-     * it does not copy the existing prefix map, rather it maintains both a
-     * local map and the existing map. All operations favour the local map but
-     * defer to the existing map if the local map cannot fulfil a request.
-     * </p>
-     * 
-     * @param pmap
-     *            Prefix Map to extend
-     * @return Prefix Map
-     */
-    public static PrefixMap extend(PrefixMap pmap) {
-        return new PrefixMapExtended(pmap);
-    }
-    
     /** Return an immutable view of the prefix map.
-     * Throws {@link UnsupportedOperationException} on 
+     * Throws {@link UnsupportedOperationException} on
      * attempts to update it.  Reflects changes made to the underlying map.
      * @param pmap  PrefixMap
      * @return Prefix Map
@@ -238,13 +224,13 @@ public class PrefixMapFactory {
     {
         return new PrefixMapUnmodifiable(pmap) ;
     }
-    
-    /** Return an always-empty and immutable prefix map 
+
+    /** Return an always-empty and immutable prefix map
      * @return Prefix Map
-     */ 
+     */
     public static PrefixMap emptyPrefixMap()
     {
-        return PrefixMapNull.empty ;
+        return PrefixMapZero.empty ;
     }
-    
+
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java
index b394dc3..b4cc3cd 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapNull.java
@@ -18,18 +18,20 @@
 
 package org.apache.jena.riot.system ;
 
+import static org.apache.jena.atlas.lib.Lib.unsupportedMethod;
+
 import java.util.Collections ;
 import java.util.Map ;
 import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
 
 import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.shared.PrefixMapping ;
 
-/** Always empty prefix map */
-public class PrefixMapNull implements PrefixMap {
-    public static PrefixMap empty = new PrefixMapNull() ;
+/** Base of always empty prefix maps {@link PrefixMapSink} and {@link PrefixMapZero}. */
+public abstract class PrefixMapNull implements PrefixMap {
 
-    private PrefixMapNull() {}
+    protected PrefixMapNull() {}
 
     @Override
     public Map<String, String> getMapping() {
@@ -44,34 +46,46 @@ public class PrefixMapNull implements PrefixMap {
     @Override
     public void forEach(BiConsumer<String, String> action) {}
 
+
+    @Override
+    public Stream<PrefixEntry> stream() {
+        return Stream.empty();
+    }
+
+
+    @Override
+    public String get(String prefix) {
+        return null;
+    }
+
     @Override
     public void add(String prefix, String iri) {
-        throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+        throw unsupportedMethod(this, "add") ;
     }
 
     @Override
     public void putAll(PrefixMap pmap) {
-        throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+        throw unsupportedMethod(this, "putAll") ;
     }
 
     @Override
     public void putAll(PrefixMapping pmap) {
-        throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+        throw unsupportedMethod(this, "putAll") ;
     }
 
     @Override
     public void putAll(Map<String, String> mapping) {
-        throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+        throw unsupportedMethod(this, "putAll") ;
     }
 
     @Override
     public void delete(String prefix) {
-        throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+        throw unsupportedMethod(this, "delete") ;
     }
 
     @Override
     public void clear() {
-        throw new UnsupportedOperationException("Unmodifiable PrefixMap") ;
+        throw unsupportedMethod(this, "clear") ;
     }
 
     @Override
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapProxy.java
similarity index 62%
copy from jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
copy to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapProxy.java
index 1ee7efb..fd32368 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapProxy.java
@@ -18,15 +18,25 @@
 
 package org.apache.jena.riot.system;
 
+import java.util.function.Supplier;
+
+import org.apache.jena.sparql.core.DatasetGraph;
+
 /**
- * Tests for {@link PrefixMapExtended} applied over a {@link PrefixMapStd}
- *
+ * Delay touching the {@link DatasetGraph#prefixes} until an
+ * operation (method call) happens.
  */
-public class TestPrefixMapExtended1 extends AbstractTestPrefixMap {
+public class PrefixMapProxy extends PrefixMapWrapper {
 
-    @Override
-    protected PrefixMap getPrefixMap() {
-        return new PrefixMapExtended(new PrefixMapStd());
+    private final Supplier<DatasetGraph> base;
+    public PrefixMapProxy(Supplier<DatasetGraph> other) {
+        super(null);
+        this.base = other;
     }
 
+    @Override
+    protected PrefixMap getR() { return base.get().prefixes(); }
+
+    @Override
+    protected PrefixMap getW() { return base.get().prefixes(); }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapSink.java
similarity index 57%
copy from jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
copy to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapSink.java
index f7ad75c..8bafdcb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapSink.java
@@ -1,4 +1,4 @@
-/*
+/**
  * 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
@@ -16,25 +16,38 @@
  * limitations under the License.
  */
 
-package org.apache.jena.sparql.graph;
+package org.apache.jena.riot.system ;
 
-import org.apache.jena.shared.PrefixMapping;
+import java.util.Map ;
 
-/** Immutable empty {@link PrefixMapping}. */
-public class PrefixMappingZero extends PrefixMappingSink {
+import org.apache.jena.shared.PrefixMapping ;
+
+/** Empty prefix map that throws away updates. */
+public class PrefixMapSink extends PrefixMapNull {
+    public static PrefixMap sink = new PrefixMapSink() ;
+
+    private PrefixMapSink() {}
 
     @Override
-    protected void add(String prefix, String uri) {
-        throw new UnsupportedOperationException("add prefix");
-    }
+    public void add(String prefix, String iri) { }
 
     @Override
-    protected void remove(String prefix) {
-        throw new UnsupportedOperationException("remove prefix");
-    }
+    public void putAll(PrefixMap pmap) { }
+
+    @Override
+    public void putAll(PrefixMapping pmap) { }
+
+    @Override
+    public void putAll(Map<String, String> mapping) { }
+
+    @Override
+    public void delete(String prefix) { }
+
+    @Override
+    public void clear() { }
 
     @Override
     public String toString() {
-        return "pm:Zero";
+        return "PrefixMapSink";
     }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java
index 20b6b53..1ee20cd 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapStd.java
@@ -18,38 +18,55 @@
 
 package org.apache.jena.riot.system;
 
+import static org.apache.jena.riot.system.PrefixLib.canonicalPrefix;
+import static org.apache.jena.riot.system.PrefixLib.isSafeLocalPart;
+
 import java.util.Collections ;
-import java.util.HashMap ;
 import java.util.Map ;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.jena.atlas.lib.Pair ;
 
 /**
- * Default implementation of a {@link PrefixMap}.
+ * In-memory implementation of a {@link PrefixMap}.
+ * <p>
+ * This also provides fast URI to prefix name calculation suitable for output. For
+ * output, calculating possible prefix names from a URI happens on every URI so this
+ * operations needs to be efficient. Normally, a prefix map is "prefix to URI" and
+ * the abbreviation is a reverse lookup, which is a scan of the value of the map.
+ * This class keeps a reverse lookup map of URI to prefix which combined with a fast,
+ * approximate for determining the split point exploiting the most common use cases,
+ * provides efficient abbreviation.
+ * <p>
+ * Usage for abbreviation: call
+ * {@linkplain PrefixMapFactory#createForOutput(PrefixMap)} which copies the argument
+ * prefix map into an instance of this class, setting up the reverse lookup. This
+ * copy is cheaper than repeated reverse lookups would be.
  */
 public class PrefixMapStd extends PrefixMapBase {
     // Expansion map
-    final Map<String, String> prefixes = new HashMap<>();
+    final Map<String, String> prefixes = new ConcurrentHashMap<>();
 
-    // Immutable view of prefixes 
+    // Immutable view of prefixes
     private final Map<String, String> prefixes2 = Collections.unmodifiableMap(prefixes);
-    
+
     // Abbreviation map used for common cases.
     // This keeps the URI->prefix mappings for a computed guess at the answer, before
-    // resorting to a full search. See abbrev(String) below. 
-    final Map<String, String> uriToPrefix = new HashMap<>();
+    // resorting to a full search. See abbrev(String) below.
+    private final Map<String, String> uriToPrefix = new ConcurrentHashMap<>();
 
     /**
      * Creates a new empty prefix mapping
      */
-    public PrefixMapStd() {
-    }
+    public PrefixMapStd() {}
 
     /**
      * Creates a new prefix mapping copied from an existing map
      * @param prefixMap Prefix Map
      */
     public PrefixMapStd(PrefixMap prefixMap) {
+        Objects.requireNonNull(prefixMap);
         prefixes.putAll(prefixMap.getMapping());
     }
 
@@ -59,14 +76,27 @@ public class PrefixMapStd extends PrefixMapBase {
     }
 
     @Override
+    public String get(String prefix) {
+        Objects.requireNonNull(prefix);
+        prefix = canonicalPrefix(prefix);
+        return prefixes.get(prefix);
+    }
+
+    @Override
     public void add(String prefix, String iri) {
+        Objects.requireNonNull(prefix);
+        Objects.requireNonNull(iri);
         prefix = canonicalPrefix(prefix);
+        String oldURI = prefixes.get(prefix);
+        if ( oldURI != null )
+            uriToPrefix.remove(oldURI);
         prefixes.put(prefix, iri);
         uriToPrefix.put(iri.toString(), prefix) ;
     }
 
     @Override
     public void delete(String prefix) {
+        Objects.requireNonNull(prefix);
         prefix = canonicalPrefix(prefix);
         prefixes.remove(prefix);
         // Remove from the abbreviation map.
@@ -75,43 +105,51 @@ public class PrefixMapStd extends PrefixMapBase {
 
     @Override
     public void clear() {
-        prefixes.clear() ; 
+        prefixes.clear() ;
     }
 
     @Override
     public boolean containsPrefix(String prefix) {
+        Objects.requireNonNull(prefix);
         prefix = canonicalPrefix(prefix);
         return prefixes.containsKey(prefix);
     }
 
     @Override
     public String abbreviate(String uriStr) {
+        Objects.requireNonNull(uriStr);
         Pair<String, String> p = abbrev(uriStr);
         if (p == null)
             return null;
         return p.getLeft() + ":" + p.getRight();
     }
 
+    // This is thread safe (does not crash) - it is not thread-consistent (answer
+    // uncertain if the prefix mappings are in flux).
     @Override
     public Pair<String, String> abbrev(String uriStr) {
+        Objects.requireNonNull(uriStr);
+        // Fast path.
         // Look for a prefix by URI ending "#" or "/"
         // then look for that as a known prefix.
-        String candidate = getPossibleKey(uriStr) ;
-        String uriForPrefix = uriToPrefix.get(candidate) ;
-        if ( uriForPrefix != null )
-        {
-            // Fast track.
-            String ln = uriStr.substring(candidate.length());
-            if ( isSafeLocalPart(ln))
-                return Pair.create(uriForPrefix, ln); 
+        String candidate = getPossibleKey(uriStr);
+        if ( candidate != null ) {
+            String uriForPrefix = uriToPrefix.get(candidate);
+            if ( uriForPrefix != null ) {
+                // Fast track.
+                String ln = uriStr.substring(candidate.length());
+                if ( isSafeLocalPart(ln) )
+                    return Pair.create(uriForPrefix, ln);
+            }
         }
-        // Not in the uri -> prefix map.  Crunch it.
-        return abbrev(this.prefixes, uriStr, true);
+        // Not in the uri -> prefix map. Crunch it.
+        return PrefixLib.abbrev(prefixes, uriStr, true);
     }
 
     /**
-     * Takes a guess for the String string to use in abbreviation.
-     * 
+     * Takes a guess for the namespace URI string to use in abbreviation.
+     * Finds the part of the IRI string before the last '#' or '/'.
+     *
      * @param iriString String string
      * @return String or null
      */
@@ -129,23 +167,12 @@ public class PrefixMapStd extends PrefixMapBase {
     }
 
     @Override
-    public String expand(String prefix, String localName) {
-        prefix = canonicalPrefix(prefix);
-        String x = prefixes.get(prefix);
-        if (x == null)
-            return null;
-        return x.toString() + localName;
-    }
-
-    @Override
-    public boolean isEmpty()
-    {
-        return prefixes.isEmpty() ;
+    public boolean isEmpty() {
+        return prefixes.isEmpty();
     }
 
     @Override
-    public int size()
-    {
-        return prefixes.size() ;
+    public int size() {
+        return prefixes.size();
     }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java
index 7591219..ae8535e 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapUnmodifiable.java
@@ -24,36 +24,36 @@ import java.util.Map ;
 import org.apache.jena.iri.IRI ;
 import org.apache.jena.shared.PrefixMapping ;
 
-/** A PrefixMap that traps update operations on a wrapped prefix map */ 
+/** A PrefixMap that traps update operations on a wrapped prefix map */
 public class PrefixMapUnmodifiable extends PrefixMapWrapper
 {
     public PrefixMapUnmodifiable(PrefixMap other) { super(other) ; }
 
     @Override
     public Map<String, String> getMapping()
-    { return Collections.unmodifiableMap(get().getMapping()) ; }
+    { return Collections.unmodifiableMap(getR().getMapping()) ; }
 
     @Override
     public void add(String prefix, String iriString)
-    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }  
+    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
 
     @Override
     public void add(String prefix, IRI iri)
-    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }  
+    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
 
     @Override
     public void putAll(PrefixMap pmap)
-    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }  
+    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
 
     @Override
     public void putAll(PrefixMapping pmap)
-    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }  
+    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
 
     @Override
     public void putAll(Map<String, String> mapping)
-    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }  
+    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
 
     @Override
     public void delete(String prefix)
-    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }  
+    { throw new UnsupportedOperationException("Unmodifiable PrefixMap") ; }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java
index d147db3..e100825 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapWrapper.java
@@ -20,6 +20,7 @@ package org.apache.jena.riot.system;
 
 import java.util.Map ;
 import java.util.function.BiConsumer ;
+import java.util.stream.Stream;
 
 import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.shared.PrefixMapping ;
@@ -27,72 +28,84 @@ import org.apache.jena.shared.PrefixMapping ;
 public class PrefixMapWrapper implements PrefixMap
 {
     private final PrefixMap other ;
-    protected PrefixMap get() { return other; }
+    private PrefixMap get() { return other; }
 
     public PrefixMapWrapper(PrefixMap other) { this.other = other ; }
 
+    protected PrefixMap getR() { return get(); }
+
+    protected PrefixMap getW() { return get(); }
+
     @Override
     public Map<String, String> getMapping()
-    { return get().getMapping() ; }
+    { return getR().getMapping() ; }
 
     @Override
     public Map<String, String> getMappingCopy()
-    { return get().getMappingCopy() ; }
+    { return getR().getMappingCopy() ; }
+
+    @Override
+    public void forEach(BiConsumer<String, String> action)
+    { getR().forEach(action); }
 
     @Override
-    public void forEach(BiConsumer<String, String> action) {
-        get().forEach(action);
+    public Stream<PrefixEntry> stream() {
+        return getR().stream();
     }
 
     @Override
+    public String get(String prefix)
+    { return getR().get(prefix); }
+
+    @Override
     public void add(String prefix, String iri)
-    { get().add(prefix, iri) ; }
+    { getW().add(prefix, iri) ; }
 
     @Override
     public void putAll(PrefixMap pmap)
-    { get().putAll(pmap) ; }
+    { getW().putAll(pmap) ; }
 
     @Override
     public void putAll(PrefixMapping pmap)
-    { get().putAll(pmap) ; }
+    { getW().putAll(pmap) ; }
 
     @Override
     public void putAll(Map<String, String> mapping)
-    { get().putAll(mapping) ; }
+    { getW().putAll(mapping) ; }
 
     @Override
     public void delete(String prefix)
-    { get().delete(prefix) ; }
+    { getW().delete(prefix) ; }
 
     @Override
     public void clear()
-    { get().clear(); }
+    { getW().clear(); }
 
     @Override
     public boolean containsPrefix(String prefix)
-    { return get().containsPrefix(prefix) ; }
+    { return getR().containsPrefix(prefix) ; }
 
     @Override
     public String abbreviate(String uriStr)
-    { return get().abbreviate(uriStr) ; }
+    { return getR().abbreviate(uriStr) ; }
 
     @Override
     public Pair<String, String> abbrev(String uriStr)
-    { return get().abbrev(uriStr) ; }
+    { return getR().abbrev(uriStr) ; }
 
     @Override
     public String expand(String prefixedName)
-    { return get().expand(prefixedName) ; }
+    { return getR().expand(prefixedName) ; }
 
     @Override
     public String expand(String prefix, String localName)
-    { return get().expand(prefix, localName) ; }
+    { return getR().expand(prefix, localName) ; }
 
     @Override
     public boolean isEmpty()
-    { return get().isEmpty() ; }
+    { return getR().isEmpty() ; }
 
     @Override
     public int size()
-    { return get().size() ; }
+    { return getR().size() ; }
 }
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapZero.java
similarity index 74%
copy from jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
copy to jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapZero.java
index 1ee7efb..e4800d1 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/PrefixMapZero.java
@@ -1,4 +1,4 @@
-/*
+/**
  * 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
@@ -16,17 +16,16 @@
  * limitations under the License.
  */
 
-package org.apache.jena.riot.system;
+package org.apache.jena.riot.system ;
 
-/**
- * Tests for {@link PrefixMapExtended} applied over a {@link PrefixMapStd}
- *
- */
-public class TestPrefixMapExtended1 extends AbstractTestPrefixMap {
+/** Always empty, immutable prefix map */
+public class PrefixMapZero extends  PrefixMapNull {
+    public static PrefixMap empty = new PrefixMapZero() ;
+
+    private PrefixMapZero() {}
 
     @Override
-    protected PrefixMap getPrefixMap() {
-        return new PrefixMapExtended(new PrefixMapStd());
+    public String toString() {
+        return "PrefixMapZero";
     }
-
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/Prefixes.java b/jena-arq/src/main/java/org/apache/jena/riot/system/Prefixes.java
new file mode 100644
index 0000000..fbb6d38
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/Prefixes.java
@@ -0,0 +1,160 @@
+/*
+ * 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.jena.riot.system;
+
+import java.util.Map.Entry;
+
+import static java.lang.String.format;
+
+import java.util.Objects;
+import java.util.StringJoiner;
+
+import org.apache.jena.graph.Graph;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.shared.PrefixMapping;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.graph.PrefixMappingAdapter;
+
+public class Prefixes {
+    // Distinguished nodes:
+    // Default graph : Quad.defaultGraphNodeGenerated would have been preferred.
+    // For compatibility reasons, in TDB2, this is the URI <> (empty string).
+
+
+    // **** Implementations
+    // ** DatasetGraphMap, DatasetGraphMapLink : adapter to the default graph
+    //
+    // ** DatasetGraphOne : adapt the graph
+    //
+    // ** TIM
+    //    Prefixes are thread safe, MRSW but not transactional. (Uses PrefixMapStd).
+    //
+    // ** TDB1
+    //    DatasetGraphTDB
+    //    -> DatasetPrefixesTDB
+    //    -> GraphPrefixesProjection which is a prefixMap
+    //
+    // ** TDB2
+    //    DatasetGraphTDB
+    //    -> StoragePrefixes
+    //    -> StoragePrefixesView(projection) implements StoragePrefixMap
+    //    -> PrefixMapOverStorage
+    //
+    // ** DatasetGraphNull > DatasetGraphSink/DatasetGraphZero
+    //    PrefixMapNull > PrefixMapSink/PrefixMapZero
+
+//    /** Name for dataset-wide prefixes. */
+//    public static final String  dftGraphPrefixSet = "";
+
+    /** Name for dataset-wide prefixes. */
+    public static final String  datasetPrefixSet  = ""; //dftGraphPrefixSet;
+
+    // As Nodes.
+    /** Name assigned to the default graph. */
+//    public static Node          nodeDefaultGraph  = NodeFactory.createURI(dftGraphPrefixSet);
+
+    /** Name for dataset prefixes. */
+    public static Node          nodeDataset       = NodeFactory.createURI(datasetPrefixSet);
+
+    private static final String dftUri1           = Quad.defaultGraphIRI.getURI();
+    private static final String dftUri2           = Quad.defaultGraphNodeGenerated.getURI();
+
+    /** Is this a name for the default graph prefix set? */
+    public static boolean isDftGraph(String graphName) {
+        return graphName == null
+               //|| graphName.equals(dftGraphPrefixSet)
+               || graphName.equals(dftUri1) || graphName.equals(dftUri2);
+    }
+
+    /** Is this a name node for the default graph prefix set? */
+    public static boolean isDftGraph(Node graphName) {
+        if ( !graphName.isURI() )
+            return false;
+        return graphName == null
+            //|| graphName.equals(nodeDefaultGraph)
+            || Quad.isDefaultGraph(graphName);
+    }
+
+    /**
+     * Canonical prefix - remove a trailing ":". The return is not null.
+     */
+    public static String prefix(String prefix) {
+        if ( prefix == null )
+            // null is not good style but let's be robust.
+            return "";
+        if ( prefix.endsWith(":") )
+            return prefix.substring(prefix.length() - 1);
+        return prefix;
+    }
+
+    /**
+     * Reverse lookup of URI to a prefix. General implementation by scanning the
+     * {@link PrefixMap}. Returns a prefix if found or null. If several prefixes for
+     * the same URI, returns one at random.
+     */
+    public static String findByURI(PrefixMap pmap, String uriStr) {
+        return pmap.getMapping().entrySet().stream()
+            .filter(e -> Objects.equals(uriStr, e.getValue().toString()))
+            .map(Entry::getKey)
+            .findFirst()
+            .orElse(null);
+    }
+
+    /**
+     * Provide, via an adapter if necessary, the {@link PrefixMap} for a {@link Graph}.
+     */
+    public static PrefixMap adapt(Graph graph) {
+        Objects.requireNonNull(graph);
+        return adapt(graph.getPrefixMapping());
+    }
+
+    /**
+     * Apply a wrapper to a {@link PrefixMap} to provide the
+     * {@link PrefixMapping} API.
+     */
+    public static PrefixMapping adapt(PrefixMap prefixMap) {
+        Objects.requireNonNull(prefixMap);
+        if ( prefixMap instanceof PrefixMapAdapter )
+            // Already adapter from a PrefixMapping
+            return ((PrefixMapAdapter)prefixMap).getPrefixMapping();
+        return new PrefixMappingAdapter(prefixMap);
+    }
+
+    /**
+     * Apply a wrapper to a {@link PrefixMapping} to provide the
+     * {@link PrefixMap} API.
+     */
+    public static PrefixMap adapt(PrefixMapping prefixMapping) {
+        Objects.requireNonNull(prefixMapping);
+        if ( prefixMapping instanceof PrefixMappingAdapter )
+            // Already adapter from a PrefixMap
+            return ((PrefixMappingAdapter)prefixMapping).getPrefixMap();
+        return new PrefixMapAdapter(prefixMapping);
+    }
+
+    /** Calculate a printable multi-line string. */
+    public static String toString(PrefixMap prefixMap) {
+        if ( prefixMap.isEmpty() )
+            return "{}";
+        StringJoiner sj = new StringJoiner("\n", "{\n", "}");
+        prefixMap.getMapping().forEach((p,u)->sj.add(format("  %-6s <%s>\n", p+":", u)));
+        return sj.toString();
+    }
+}
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java b/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java
index 921d62a..5599e3b 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/Prologue.java
@@ -28,71 +28,69 @@ public class Prologue
 
     protected PrefixMap prefixMap = null ;
     protected IRIResolver resolver = null ;
-    
+
     public static Prologue create(String base, PrefixMapping pmapping)
     {
-        PrefixMap pmap = null ;
+        PrefixMap pmap = new PrefixMapStd() ;
         if ( pmapping != null )
-        {
-            pmap = PrefixMapFactory.createForInput(pmapping) ;
-        }
+            // Copy to isolate
+            pmap.putAll(pmapping);
         IRIResolver resolver = null ;
         if ( base != null )
             resolver = IRIResolver.create(base) ;
         return new Prologue(pmap, resolver) ;
     }
-    
+
     public Prologue()
-    { 
-        this.prefixMap = PrefixMapFactory.createForInput() ;
+    {
+        this.prefixMap = PrefixMapFactory.create() ;
         this.resolver = null ;
     }
-    
+
     public Prologue(PrefixMap pmap, IRIResolver resolver)
     {
-        this.prefixMap = pmap ; 
+        this.prefixMap = pmap ;
         this.resolver = resolver ;
     }
-    
+
     public Prologue(Prologue other)
     {
-        this.prefixMap = other.prefixMap ; 
+        this.prefixMap = other.prefixMap ;
         this.resolver = other.resolver ;
     }
 
     public Prologue copy()
     {
-        PrefixMap prefixMap = PrefixMapFactory.createForInput(this.prefixMap) ;
+        PrefixMap prefixMap = PrefixMapFactory.create(this.prefixMap) ;
         return new Prologue(prefixMap, resolver) ;
     }
-    
+
     public void usePrologueFrom(Prologue other)
     {
         // Copy.
-        prefixMap = PrefixMapFactory.createForInput(other.prefixMap) ;
+        prefixMap = PrefixMapFactory.create(other.prefixMap) ;
         seenBaseURI = false ;
         if ( other.resolver != null )
             resolver = IRIResolver.create(other.resolver.getBaseIRIasString()) ;
     }
-    
+
     public Prologue sub(PrefixMap newMappings)  { return sub(newMappings, null) ; }
     public Prologue sub(String base)            { return sub(null, base) ; }
-    
-    public Prologue sub(PrefixMap newMappings, String base)
-    {
+
+    public Prologue sub(PrefixMap newMappings, String base) {
         // New prefix mappings
         PrefixMap ext = getPrefixMap() ;
         if ( newMappings != null )
-            ext = PrefixMapFactory.extend(ext) ;
+            ext.putAll(newMappings);
         // New base.
         IRIResolver r = resolver ;
         if ( base != null )
             r = IRIResolver.create(base) ;
         return new Prologue(ext, r) ;
     }
-    
+
     /**
-     * @return True if the query has an explicitly set base URI. 
+     * @return True if the query has an explicitly set base URI.
      */
     public boolean explicitlySetBaseURI() { return seenBaseURI ; }
 
@@ -103,7 +101,7 @@ public class Prologue
     {
         if ( resolver == null )
             return null ;
-        
+
 //        if ( baseURI == null )
 //            setDefaultBaseIRI() ;
         return resolver.getBaseIRIasString();
@@ -114,13 +112,13 @@ public class Prologue
     public void setBaseURI(String baseURI)
     {
         this.seenBaseURI = true ;
-        this.resolver = IRIResolver.create(baseURI) ; 
+        this.resolver = IRIResolver.create(baseURI) ;
     }
-    
+
     public void setBaseURI(IRI iri)
     {
         this.seenBaseURI = true ;
-        this.resolver = IRIResolver.create(iri) ; 
+        this.resolver = IRIResolver.create(iri) ;
     }
 
     /**
@@ -129,64 +127,23 @@ public class Prologue
     public void setBaseURI(IRIResolver resolver)
     {
         this.seenBaseURI = true ;
-        this.resolver = resolver ; 
+        this.resolver = resolver ;
     }
-    
-//    protected void setDefaultBaseIRI() { setDefaultBaseIRI(null) ; }
-//    
-//    protected void setDefaultBaseIRI(String base)
-//    {
-//        if ( baseURI != null )
-//            return ;
-//        
-//        baseURI = IRIResolver.chooseBaseURI(base) ;
-//    }
-    
+
     // ---- Query prefixes
-    
+
     /** Set a prefix for this query */
     public void setPrefix(String prefix, String expansion)
     {
         prefixMap.add(prefix, expansion) ;
-    }   
+    }
 
-    /** Return the prefix map from the parsed query */ 
+    /** Return the prefix map from the parsed query */
     public PrefixMap getPrefixMap() { return prefixMap ; }
-//    /** Set the mapping */
-//    public void setPrefixMapping(PrefixMap pmap ) { prefixMap = pmap ; }
-
-//    /** Reverse lookup of a URI to get a prefix */
-//    public String getPrefix(String uriStr)
-//    {
-//        return prefixMap.getPrefix(uriStr) ;
-//    }
 
     /** Get the IRI resolver */
     public IRIResolver getResolver() { return resolver ; }
-    
+
     /** Set the IRI resolver */
     public void setResolver(IRIResolver resolver) { this.resolver = resolver; }
-    
-//    /** Expand prefixed name 
-//     * 
-//     * @param qname  The prefixed name to be expanded
-//     * @return URI, or null if not expanded.
-//     */
-//
-//    public String expandPrefixedName(String qname)
-//    {
-//        // Split qname.
-//        
-//        String s = prefixMap.expand(qname) ;
-//        if ( s.equals(qname) )
-//            return null ;
-//        return s ;
-//    }
-    
-//    /** Use the prefix map to turn a URI into a qname, or return the original URI */
-//    
-//    public String shortForm(String uri)
-//    {
-//        return prefixMap.shortForm(uri) ;
-//    }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java
index 966ce3b..6cda2f8 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/RiotLib.java
@@ -55,7 +55,7 @@ public class RiotLib
 {
     // ---- BlankNode skolemization as IRIs
     private final static boolean skolomizedBNodes = ARQ.isTrueOrUndef(ARQ.constantBNodeLabels);
-    /** "Skolemize" to a node. 
+    /** "Skolemize" to a node.
      * Returns a Node_URI.
      */
     public static Node blankNodeToIri(Node node) {
@@ -64,7 +64,7 @@ public class RiotLib
         return node;
     }
 
-    /** "Skolemize" to a string. */ 
+    /** "Skolemize" to a string. */
     public static String blankNodeToIriString(Node node) {
         if ( node.isBlank() ) {
             String x = node.getBlankNodeLabel();
@@ -95,21 +95,21 @@ public class RiotLib
     public static boolean isBNodeIRI(String iri) {
         return iri.startsWith(bNodeLabelStart);
     }
-    
+
     private static final String URI_PREFIX_FIXUP = "::";
-    
+
     // These two must be in-step.
-    /** Function applied to undefined prefixes to convert to a URI string */  
+    /** Function applied to undefined prefixes to convert to a URI string */
     public static final Function<String,String> fixupPrefixes      = (x) -> URI_PREFIX_FIXUP.concat(x);
 
-    /** Function to test for undefined prefix URIs*/  
+    /** Function to test for undefined prefix URIs*/
     public static final Predicate<String> testFixupedPrefixURI     = (x) -> x.startsWith(URI_PREFIX_FIXUP);
-    
+
     /** Test whether a IRI is a ARQ-encoded blank node. */
     public static boolean isPrefixIRI(String iri) {
         return testFixupedPrefixURI.test(iri);
     }
-    
+
     /** Convert an prefix name (qname) to an IRI, for when the prerix is nor defined.
      * @see ARQ#fixupUndefinedPrefixes
      */
@@ -123,29 +123,29 @@ public class RiotLib
     public static String fixupPrefixIRI(String prefixedName) {
         return fixupPrefixes.apply(prefixedName);
     }
-    
-    /** Internal ParserProfile used to create nodes from strings. */ 
+
+    /** Internal ParserProfile used to create nodes from strings. */
     private static ParserProfile setupInternalParserProfile() {
-        PrefixMap pmap = PrefixMapFactory.createForInput();
+        PrefixMap pmap = PrefixMapFactory.create();
         pmap.add("rdf",  ARQConstants.rdfPrefix);
         pmap.add("rdfs", ARQConstants.rdfsPrefix);
         pmap.add("xsd",  ARQConstants.xsdPrefix);
         pmap.add("owl" , ARQConstants.owlPrefix);
-        pmap.add("fn" ,  ARQConstants.fnPrefix); 
-        pmap.add("op" ,  ARQConstants.fnPrefix); 
+        pmap.add("fn" ,  ARQConstants.fnPrefix);
+        pmap.add("op" ,  ARQConstants.fnPrefix);
         pmap.add("ex" ,  "http://example/ns#");
         pmap.add("" ,    "http://example/");
-        
-        return new ParserProfileStd(RiotLib.factoryRDF(), 
+
+        return new ParserProfileStd(RiotLib.factoryRDF(),
                                     ErrorHandlerFactory.errorHandlerStd,
                                     IRIResolver.create(),
                                     pmap,
                                     RIOT.getContext().copy(),
                                     true, false);
     }
-    
+
     private static ParserProfile profile = setupInternalParserProfile();
-    
+
     /** Parse a string to get one Node (the first token in the string) */
     public static Node parse(String string) {
         return NodeFactoryExtra.parseNode(string, null);
@@ -172,7 +172,7 @@ public class RiotLib
     /** Create a parser profile for the given setup
      * @param baseIRI       Base IRI
      * @param resolveIRIs   Whether to resolve IRIs
-     * @param checking      Whether to check 
+     * @param checking      Whether to check
      * @param handler       Error handler
      * @return ParserProfile
      * @see #profile for per-language setup
@@ -182,7 +182,7 @@ public class RiotLib
     public static ParserProfile profile(String baseIRI, boolean resolveIRIs, boolean checking, ErrorHandler handler)
     {
         LabelToNode labelToNode = SyntaxLabels.createLabelToNode();
-        
+
         IRIResolver resolver;
         if ( resolveIRIs )
             resolver = IRIResolver.create(baseIRI);
@@ -193,15 +193,15 @@ public class RiotLib
     }
 
     /** Create a new (not influenced by anything else) {@code FactoryRDF}
-     * using the label to blank node scheme provided. 
+     * using the label to blank node scheme provided.
      */
     public static FactoryRDF factoryRDF(LabelToNode labelMapping) {
         return new FactoryRDFCaching(FactoryRDFCaching.DftNodeCacheSize, labelMapping);
     }
 
     /** Create a new (not influenced by anything else) {@code FactoryRDF}
-     * using the default label to blank node scheme. 
-     */  
+     * using the default label to blank node scheme.
+     */
     public static FactoryRDF factoryRDF() {
         return factoryRDF(SyntaxLabels.createLabelToNode());
     }
@@ -218,21 +218,21 @@ public class RiotLib
 
     /** Create a {@link ParserProfile} with default settings, and a specific error handler. */
     public static ParserProfile createParserProfile(FactoryRDF factory, ErrorHandler errorHandler, boolean checking) {
-        return new ParserProfileStd(factory, 
+        return new ParserProfileStd(factory,
                                     errorHandler,
                                     IRIResolver.create(),
-                                    PrefixMapFactory.createForInput(),
+                                    PrefixMapFactory.create(),
                                     RIOT.getContext().copy(),
                                     checking, false);
     }
-    
+
     /** Create a {@link ParserProfile}. */
-    public static ParserProfile createParserProfile(FactoryRDF factory, ErrorHandler errorHandler, 
+    public static ParserProfile createParserProfile(FactoryRDF factory, ErrorHandler errorHandler,
                                           IRIResolver resolver, boolean checking) {
-        return new ParserProfileStd(factory, 
+        return new ParserProfileStd(factory,
                                     errorHandler,
                                     resolver,
-                                    PrefixMapFactory.createForInput(),
+                                    PrefixMapFactory.create(),
                                     RIOT.getContext().copy(),
                                     checking, false);
     }
@@ -273,7 +273,7 @@ public class RiotLib
     public static boolean strSafeFor(String str, char ch) {
         return str.indexOf(ch) == -1;
     }
-    
+
     public static void writeBase(IndentedWriter out, String base, boolean newStyle) {
         if ( newStyle )
             writeBaseNewStyle(out, base);
@@ -304,7 +304,7 @@ public class RiotLib
         }
     }
 
-    /** Write prefixes */ 
+    /** Write prefixes */
     public static void writePrefixes(IndentedWriter out, PrefixMap prefixMap, boolean newStyle) {
         if ( prefixMap != null && !prefixMap.isEmpty() ) {
             for ( Map.Entry<String, String> e : prefixMap.getMapping().entrySet() ) {
@@ -315,10 +315,10 @@ public class RiotLib
             }
         }
     }
-    
+
     /** Write a prefix.
      * Write using {@code @prefix} or {@code PREFIX}.
-     */ 
+     */
     public static void writePrefix(IndentedWriter out, String prefix, String uri, boolean newStyle) {
         if ( newStyle )
             writePrefixNewStyle(out, prefix, uri);
@@ -326,7 +326,7 @@ public class RiotLib
             writePrefixOldStyle(out, prefix, uri);
     }
 
-    /** Write prefix, using {@code PREFIX} */ 
+    /** Write prefix, using {@code PREFIX} */
     private static void writePrefixNewStyle(IndentedWriter out, String prefix, String uri) {
         out.print("PREFIX ");
         out.print(prefix);
@@ -338,7 +338,7 @@ public class RiotLib
         out.println();
     }
 
-    /** Write prefixes, using {@code @prefix} */ 
+    /** Write prefixes, using {@code @prefix} */
     public static void writePrefixOldStyle(IndentedWriter out, String prefix, String uri) {
         out.print("@prefix ");
         out.print(prefix);
@@ -369,7 +369,7 @@ public class RiotLib
     {
         if ( ! prefixMap.containsPrefix(rdfNS) && RDF_type.equals(p) )
             return 1;
-        
+
         String x = prefixMap.abbreviate(p.getURI());
         if ( x == null )
             return p.getURI().length()+2;
@@ -378,9 +378,9 @@ public class RiotLib
 
     public static int calcWidth(PrefixMap prefixMap, String baseURI, Collection<Node> nodes, int minWidth, int maxWidth)
     {
-        Node prev = null; 
+        Node prev = null;
         int nodeMaxWidth = minWidth;
-        
+
         for ( Node n : nodes )
         {
             if ( prev != null && prev.equals(n) )
@@ -392,14 +392,14 @@ public class RiotLib
                 nodeMaxWidth = len;
             prev = n;
         }
-        return nodeMaxWidth; 
+        return nodeMaxWidth;
     }
 
     public static int calcWidthTriples(PrefixMap prefixMap, String baseURI, Collection<Triple> triples, int minWidth, int maxWidth)
     {
-        Node prev = null; 
+        Node prev = null;
         int nodeMaxWidth = minWidth;
-    
+
         for ( Triple triple : triples )
         {
             Node n = triple.getPredicate();
@@ -423,7 +423,7 @@ public class RiotLib
     public static WriterGraphRIOTBase adapter(WriterDatasetRIOT writer)
     { return new WriterAdapter(writer); }
 
-    /** Hidden to direct program to using OutputStreams (for RDF, that gets the charset right) */ 
+    /** Hidden to direct program to using OutputStreams (for RDF, that gets the charset right) */
     private static class IndentedWriterWriter extends IndentedWriter
     {
         IndentedWriterWriter(Writer w) { super(w); }
@@ -432,16 +432,16 @@ public class RiotLib
     private static class WriterAdapter extends WriterGraphRIOTBase
     {
         private WriterDatasetRIOT writer;
-    
+
         WriterAdapter(WriterDatasetRIOT writer) { this.writer = writer; }
         @Override
         public Lang getLang()
         { return writer.getLang(); }
-    
+
         @Override
         public void write(OutputStream out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
         { writer.write(out, DatasetGraphFactory.wrap(graph), prefixMap, baseURI, context); }
-        
+
         @Override
         public void write(Writer out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
         { writer.write(out, DatasetGraphFactory.wrap(graph), prefixMap, baseURI, context); }
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
index 21e80ca..5b4bc7e 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
@@ -31,7 +31,6 @@ import org.apache.jena.graph.Triple ;
 import org.apache.jena.riot.lang.StreamRDFCounting ;
 import org.apache.jena.riot.writer.WriterStreamRDFPlain ;
 import org.apache.jena.shared.JenaException ;
-import org.apache.jena.shared.PrefixMapping ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sparql.core.Quad ;
 
@@ -172,74 +171,76 @@ public class StreamRDFLib
         { sink.flush() ; }
     }
 
-    private static class ParserOutputGraph extends StreamRDFBase
-    {
-        protected final Graph graph ;
-        protected boolean warningIssued = false ;
-        public ParserOutputGraph(Graph graph) { this.graph = graph ; }
+    private static class ParserOutputGraph extends StreamRDFBase {
+        protected final Graph graph;
+        protected boolean     warningIssued = false;
+        public ParserOutputGraph(Graph graph) {
+            this.graph = graph;
+        }
+
+        @Override
+        public void triple(Triple triple) {
+            graph.add(triple);
+        }
 
-        @Override public void triple(Triple triple)     { graph.add(triple) ; }
-        @Override public void quad(Quad quad)
-        {
+        @Override
+        public void quad(Quad quad) {
             if ( quad.isTriple() || quad.isDefaultGraph() )
-                graph.add(quad.asTriple()) ;
-            else
-            {
-                if ( ! warningIssued )
-                {
-                    //SysRIOT.getLogger().warn("Only triples or default graph data expected : named graph data ignored") ;
+                graph.add(quad.asTriple());
+            else {
+                if ( !warningIssued ) {
+                    // SysRIOT.getLogger().warn("Only triples or default graph data expected : named graph data ignored") ;
                     // Not ideal - assumes the global default.
-                    ErrorHandlerFactory.getDefaultErrorHandler().warning("Only triples or default graph data expected : named graph data ignored", -1, -1) ;
+                    ErrorHandlerFactory.getDefaultErrorHandler()
+                        .warning("Only triples or default graph data expected : named graph data ignored", -1, -1);
                 }
-                warningIssued = true ;
+                warningIssued = true;
             }
-            //throw new IllegalStateException("Quad passed to graph parsing") ;
+            // throw new IllegalStateException("Quad passed to graph parsing") ;
         }
 
-        @Override public void base(String base)
-        { }
+        @Override
+        public void base(String base) {}
 
-        @Override public void prefix(String prefix, String uri)
-        {
-            try { // Jena applies XML rules to prerfixes.
-                graph.getPrefixMapping().setNsPrefix(prefix, uri) ;
+        @Override
+        public void prefix(String prefix, String uri) {
+            try { // Some graphs applies XML rules to prefixes.
+                graph.getPrefixMapping().setNsPrefix(prefix, uri);
             } catch (JenaException ex) {}
         }
     }
 
-    private static class ParserOutputDataset extends StreamRDFBase
-    {
-        protected final DatasetGraph dsg ;
-        protected final PrefixMapping prefixMapping ;
-
-        public ParserOutputDataset(DatasetGraph dsg)
-        {
-            this.dsg = dsg ;
-            this.prefixMapping = dsg.getDefaultGraph().getPrefixMapping() ;
-            // = dsg.getPrefixMapping().setNsPrefix(prefix, uri) ;
+    private static class ParserOutputDataset extends StreamRDFBase {
+        protected final DatasetGraph dsg;
+        protected final PrefixMap    prefixMap;
+
+        public ParserOutputDataset(DatasetGraph dsg) {
+            this.dsg = dsg;
+            this.prefixMap = dsg.prefixes();
         }
 
-        @Override public void triple(Triple triple)
-        {
-            dsg.add(Quad.defaultGraphNodeGenerated, triple.getSubject(), triple.getPredicate(), triple.getObject()) ;
-            //throw new IllegalStateException("Triple passed to dataset parsing") ;
+        @Override
+        public void triple(Triple triple) {
+            dsg.add(Quad.defaultGraphNodeGenerated, triple.getSubject(), triple.getPredicate(), triple.getObject());
         }
 
-        @Override public void quad(Quad quad)
-        {
+        @Override
+        public void quad(Quad quad) {
             if ( quad.isTriple() )
-                dsg.add(Quad.defaultGraphNodeGenerated, quad.getSubject(), quad.getPredicate(), quad.getObject()) ;
+                dsg.add(Quad.defaultGraphNodeGenerated, quad.getSubject(), quad.getPredicate(), quad.getObject());
             else
-                dsg.add(quad) ;
+                dsg.add(quad);
         }
 
-        @Override public void base(String base)
-        { }
+        @Override
+        public void base(String base) {}
 
-        @Override public void prefix(String prefix, String uri)
-        {
-            try { // Jena applies XML rules to prerfixes.
-                prefixMapping.setNsPrefix(prefix, uri) ;
+        @Override
+        public void prefix(String prefix, String uri) {
+            try {
+                // Some datasets may be tied to PrefixMappings and may apply XML
+                // rules to prefixes.
+                prefixMap.add(prefix, uri);
             } catch (JenaException ex) {}
         }
     }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java
index c61e751..0966efd 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraph.java
@@ -25,11 +25,12 @@ import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.query.Dataset ;
+import org.apache.jena.riot.system.PrefixMap;
 import org.apache.jena.shared.Lock ;
 import org.apache.jena.sparql.util.Context ;
 
 /** DatasetGraph: The graph representation of an RDF Dataset. See {@link Dataset}
- * for the Model level of an RDF dataset.  
+ * for the Model level of an RDF dataset.
  * <p>
  * Whether a dataset contains a graph if there are no triples
  * is not defined; see the specific implementation.
@@ -42,25 +43,25 @@ public interface DatasetGraph extends Transactional, Closeable
     /** Get the default graph as a Jena Graph */
     public Graph getDefaultGraph() ;
 
-    /** Get the graph named by graphNode : returns null when there is no such graph. 
+    /** Get the graph named by graphNode : returns null when there is no such graph.
      * NB Whether a dataset contains a graph if there are no triples is not defined - see the specific implementation.
      * Some datasets are "open" - they have all graphs even if no triples.
      */
     public Graph getGraph(Node graphNode) ;
-    
+
     /**
      * Return a {@link Graph} that is the union of all named graphs in this dataset. This
      * union graph is read-only (its prefix mapping in the current JVM may be changed but
      * that may not persist).
      */
     public Graph getUnionGraph();
-    
+
     /**
-     * Does the DatasetGraph contain a specific named graph? 
+     * Does the DatasetGraph contain a specific named graph?
      * Whether a dataset contains a graph if there are no triples is
      * not defined - see the specific implementation. Some datasets are "open" -
      * they have all graphs even if no triples and this returns true always.
-     * 
+     *
      * @param graphNode
      * @return boolean
      */
@@ -68,15 +69,15 @@ public interface DatasetGraph extends Transactional, Closeable
 
     /** Set the default graph.  Set the active graph if it was null.
      *  This replaces the contents default graph, not merge data into it.
-     *  Do not assume that the same object is returned by {@link #getDefaultGraph} 
+     *  Do not assume that the same object is returned by {@link #getDefaultGraph}
      */
     public void setDefaultGraph(Graph g) ;
 
-    /** 
+    /**
      * Add the given graph to the dataset.
-     * <em>Replaces</em> any existing data for the named graph; to add data, 
+     * <em>Replaces</em> any existing data for the named graph; to add data,
      * get the graph and add triples to it, or add quads to the dataset.
-     * Do not assume that the same Java object is returned by {@link #getGraph}  
+     * Do not assume that the same Java object is returned by {@link #getGraph}
      */
     public void addGraph(Node graphName, Graph graph) ;
 
@@ -89,35 +90,35 @@ public interface DatasetGraph extends Transactional, Closeable
     public Iterator<Node> listGraphNodes() ;
 
     // ---- Quad view
-    
+
     /** Add a quad */
     public void add(Quad quad) ;
-    
+
     /** Delete a quad */
     public void delete(Quad quad) ;
-    
+
     /** Add a quad */
     public void add(Node g, Node s, Node p, Node o) ;
 
     /** Delete a quad */
     public void delete(Node g, Node s, Node p, Node o) ;
-    
+
     /** Delete any quads matching the pattern */
     public void deleteAny(Node g, Node s, Node p, Node o) ;
 
     /** Iterate over all quads in the dataset graph */
     public Iterator<Quad> find() ;
-    
+
     /** Find matching quads in the dataset - may include wildcards, Node.ANY or null
      * @see Graph#find(Triple)
      */
     public Iterator<Quad> find(Quad quad) ;
-    
+
     /** Find matching quads in the dataset (including default graph) - may include wildcards, Node.ANY or null
      * @see Graph#find(Node,Node,Node)
      */
     public Iterator<Quad> find(Node g, Node s, Node p , Node o) ;
-    
+
     /** Find matching quads in the dataset in named graphs only - may include wildcards, Node.ANY or null
      * @see Graph#find(Node,Node,Node)
      */
@@ -134,25 +135,28 @@ public interface DatasetGraph extends Transactional, Closeable
 
     /** Test whether the dataset is empty */
     public boolean isEmpty() ;
-    
+
     /** Return a lock for the dataset to help with concurrency control
      * @see Lock
      */
     public Lock getLock() ;
-    
+
     /** Get the context associated with this object - may be null */
-    public Context getContext() ; 
-    
-    /** Get the size (number of named graphs) - may be -1 for unknown */ 
+    public Context getContext() ;
+
+    /** Get the size (number of named graphs) - may be -1 for unknown */
     public long size() ;
-    
+
     /** Close the dataset */
     @Override
     public void close() ;
 
+    /** Prefixes for this DatasetGraph */
+    public PrefixMap prefixes();
+
     /**
      * A {@code DatasetGraph} supports transactions if it provides {@link #begin}/
-     * {@link #commit}/{@link #end}. The core storage {@code DatasetGraph}s 
+     * {@link #commit}/{@link #end}. The core storage {@code DatasetGraph}s
      * provide fully serialized transactions. A {@code DatasetGraph} that provides
      * functionality across independent systems can not provide such strong guarantees.
      * For example, it may use MRSW locking and some isolation control.
@@ -162,7 +166,7 @@ public interface DatasetGraph extends Transactional, Closeable
      * In addition, check details of a specific implementation.
      */
     public boolean supportsTransactions() ;
-    
+
     /** Declare whether {@link #abort} is supported.
      *  This goes along with clearing up after exceptions inside application transaction code.
      */
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
index 3991004..8d3e793 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
@@ -30,6 +30,8 @@ import org.apache.jena.graph.Triple ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.sparql.ARQException ;
 import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
 import org.apache.jena.sparql.graph.GraphUnionRead ;
@@ -40,33 +42,36 @@ import org.apache.jena.sparql.graph.GraphUnionRead ;
  *  This implementation provides copy-in, copy-out for {@link #addGraph}.
  *  <p>See {@link DatasetGraphMapLink} for a {@code DatasetGraph}
  *  that holds graphs as provided.
- *  
- *  @see DatasetGraphMapLink  
+ *
+ *  @see DatasetGraphMapLink
  */
 public class DatasetGraphMap extends DatasetGraphTriplesQuads
 {
     private final GraphMaker graphMaker ;
     private final Map<Node, Graph> graphs = new HashMap<>() ;
-    private Graph defaultGraph ;
-    
+    private final Graph defaultGraph ;
+    private final PrefixMap prefixes ;
+
     /**  DatasetGraphMap defaulting to storage in memory.
      */
     public DatasetGraphMap() {
-        this(DatasetGraphFactory.graphMakerNamedGraphMem) ; 
+        this(DatasetGraphFactory.graphMakerNamedGraphMem) ;
     }
-    
+
     /**  DatasetGraphMap with a specific policy for graph creation.
-     *   This allows control over the storage. 
+     *   This allows control over the storage.
      */
     public DatasetGraphMap(GraphMaker graphMaker) {
         this(graphMaker.create(null), graphMaker) ;
     }
-    
+
     private DatasetGraphMap(Graph defaultGraph, GraphMaker graphMaker) {
         this.defaultGraph = defaultGraph ;
         this.graphMaker = graphMaker ;
+        // Preserves legacy behaviour of "getDefaultPraph" having prefixes.
+        this.prefixes = Prefixes.adapt(defaultGraph);
     }
-    
+
     // ----
     private final Transactional txn                     = TransactionalLock.createMRSW() ;
     private final Transactional txn()                   { return txn; }
@@ -83,24 +88,29 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
     @Override public boolean supportsTransactions()     { return true; }
     @Override public boolean supportsTransactionAbort() { return false; }
     // ----
-    
+
     @Override
     public Iterator<Node> listGraphNodes() {
-        // Hide empty graphs. 
+        // Hide empty graphs.
         return graphs.entrySet().stream().filter(e->!e.getValue().isEmpty()).map(Entry::getKey).iterator();
     }
 
     @Override
+    public PrefixMap prefixes() {
+        return prefixes;
+    }
+
+    @Override
     public boolean containsGraph(Node graphNode) {
-        // Hide empty graphs. 
+        // Hide empty graphs.
         if ( Quad.isDefaultGraph(graphNode) )
             return true;
         if ( Quad.isUnionGraph(graphNode) )
             return true;
         Graph g = graphs.get(graphNode);
-        return g != null && !g.isEmpty(); 
+        return g != null && !g.isEmpty();
     }
-    
+
     @Override
     protected void addToDftGraph(Node s, Node p, Node o) {
         getDefaultGraph().add(Triple.create(s, p, o)) ;
@@ -155,7 +165,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
 
     @Override
     public Graph getGraph(Node graphNode) {
-        if ( Quad.isUnionGraph(graphNode) ) 
+        if ( Quad.isUnionGraph(graphNode) )
             return new GraphUnionRead(this) ;
         if ( Quad.isDefaultGraph(graphNode))
             return getDefaultGraph() ;
@@ -171,15 +181,15 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
 
     /** Called from getGraph when a nonexistent graph is asked for.
      * Return null for "nothing created as a graph".
-     * Sub classes can reimplement this.  
+     * Sub classes can reimplement this.
      */
-    protected Graph getGraphCreate(Node graphNode) { 
+    protected Graph getGraphCreate(Node graphNode) {
         Graph g = graphMaker.create(graphNode) ;
         if ( g == null )
             throw new ARQException("Can't make new graphs") ;
         return g ;
     }
-    
+
     @Override
     public long size() {
         return graphs.size();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index 2933eee..b925c1e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -26,6 +26,8 @@ import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.sparql.SystemARQ ;
 import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
 import org.apache.jena.sparql.graph.GraphUnionRead ;
@@ -34,12 +36,12 @@ import org.apache.jena.sparql.graph.GraphZero;
 /** Implementation of a DatasetGraph as an extensible set of graphs where graphs are held by reference.
  *  Care is needed when manipulating their contents
  *  especially if they are also in another {@code DatasetGraph}.
- *  <p> 
+ *  <p>
  *  See {@link DatasetGraphMap} for an implementation that copies graphs
  *  and so providing better isolation.
  *  <p>
- *  This class is best used for creating views  
- *  
+ *  This class is best used for creating views
+ *
  *  @see DatasetGraphMap
  */
 public class DatasetGraphMapLink extends DatasetGraphCollection
@@ -48,6 +50,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     private final Map<Node, Graph> graphs = new HashMap<>() ;
 
     private Graph defaultGraph ;
+    private PrefixMap prefixes ;
     private final Transactional txn;
     private final TxnDataset2Graph txnDsg2Graph;
     private static GraphMaker dftGraphMaker = DatasetGraphFactory.graphMakerMem;
@@ -55,12 +58,12 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     /**
      * Create a new {@code DatasetGraph} that copies the dataset structure of default
      * graph and named graph and links to the graphs of the original {@code DatasetGraph}.
-     * Any new graphs needed are separate from the original dataset and created in-memory. 
+     * Any new graphs needed are separate from the original dataset and created in-memory.
      */
     public static DatasetGraph cloneStructure(DatasetGraph dsg) {
         return cloneStructure(dsg, dftGraphMaker);
     }
-    
+
     /**
      * Create a new {@code DatasetGraph} that copies the dataset structure of default
      * graph and named graph and links to the graphs of the original {@code DatasetGraph}
@@ -74,7 +77,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     }
 
     private static void linkGraphs(DatasetGraph srcDsg, DatasetGraphMapLink dstDsg) {
-        dstDsg.defaultGraph = srcDsg.getDefaultGraph();
+        dstDsg.setDefaultGraph(srcDsg.getDefaultGraph());
         for ( Iterator<Node> names = srcDsg.listGraphNodes() ; names.hasNext() ; ) {
             Node gn = names.next() ;
             dstDsg.addGraph(gn, srcDsg.getGraph(gn)) ;
@@ -88,10 +91,10 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
         this(dftGraph, dftGraphMaker);
     }
 
-    // This is the root constructor. 
+    // This is the root constructor.
     /*package*/DatasetGraphMapLink(Graph dftGraph, GraphMaker graphMaker) {
         this.graphMaker = graphMaker;
-        this.defaultGraph = dftGraph;
+        this.setDefaultGraph(dftGraph);
         txnDsg2Graph = new TxnDataset2Graph(dftGraph);
         txn = txnDsg2Graph;
     }
@@ -132,7 +135,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     @Override
     public Graph getGraph(Node graphNode) {
         // Same as DatasetGraphMap.getGraph but we inherit differently.
-        if ( Quad.isUnionGraph(graphNode) ) 
+        if ( Quad.isUnionGraph(graphNode) )
             return new GraphUnionRead(this) ;
         if ( Quad.isDefaultGraph(graphNode))
             return getDefaultGraph() ;
@@ -176,6 +179,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
         if ( txnDsg2Graph != null )
             txnDsg2Graph.addGraph(g);
         defaultGraph = g;
+        prefixes = Prefixes.adapt(g.getPrefixMapping());
     }
 
     @Override
@@ -184,6 +188,11 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     }
 
     @Override
+    public PrefixMap prefixes() {
+        return prefixes;
+    }
+
+    @Override
     public long size() {
         return graphs.size();
     }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
index b7acb8f..5365945 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphOne.java
@@ -29,12 +29,14 @@ import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.reasoner.InfGraph;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.sparql.graph.GraphOps;
 import org.apache.jena.sparql.graph.GraphZero;
 
 /** DatasetGraph of a single graph as default graph.
  * <p>
- *  Fixed as one graph (the default) - named graphs can notbe added nor the default graph changed, only the contents modified.
+ *  Fixed as one graph (the default) - named graphs can not be added nor the default graph changed, only the contents modified.
  *  <p>
  *  This dataset passes transactions down to a nominated backing {@link DatasetGraph}.
  *  <p>
@@ -42,6 +44,7 @@ import org.apache.jena.sparql.graph.GraphZero;
  */
 public class DatasetGraphOne extends DatasetGraphBaseFind {
     private final Graph graph;
+    private final PrefixMap prefixes;
     private final DatasetGraph backingDGS;
     private final Transactional txn;
     private final boolean supportsAbort;
@@ -72,22 +75,22 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
     }
 
     private DatasetGraphOne(Graph graph, DatasetGraph backing) {
-        this.graph = graph;
-        backingDGS = backing;
-        supportsAbort = backing.supportsTransactionAbort();
-        txn = backing;
+        this(graph, backing, backing, backing.supportsTransactionAbort());
     }
 
     private DatasetGraphOne(Graph graph) {
-        // Not GraphView which was handled in create(Graph).
-        this.graph = graph;
-        txn = new TxnDataset2Graph(graph);
-        //txn = TransactionalLock.createMRSW();
-        backingDGS = null;
         // Don't advertise the fact but TxnDataset2Graph tries to provide abort.
         // We can not guarantee it though because a plain, non-TIM,
         // memory graph does not support abort.
-        supportsAbort = false;
+        this(graph, null, new TxnDataset2Graph(graph), false);
+    }
+
+    private DatasetGraphOne(Graph graph, DatasetGraph backing, Transactional txn, boolean supportsAbort) {
+        this.graph = graph;
+        this.prefixes = Prefixes.adapt(graph);
+        this.txn = txn;
+        this.backingDGS = backing;
+        this.supportsAbort = supportsAbort;
     }
 
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
@@ -134,6 +137,11 @@ public class DatasetGraphOne extends DatasetGraphBaseFind {
     }
 
     @Override
+    public PrefixMap prefixes() {
+        return prefixes;
+    }
+
+    @Override
     public long size() {
         return 0;
     }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
index 7a5faa6..994b422 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphSink.java
@@ -20,36 +20,38 @@ package org.apache.jena.sparql.core;
 
 import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapSink;
 import org.apache.jena.sparql.graph.GraphSink;
 
 
-/** 
+/**
  * An always empty {@link DatasetGraph} that accepts changes but ignores them.
- * 
+ *
  * @see DatasetGraphZero - a DSG that does not allow changes.
  */
 public class DatasetGraphSink extends DatasetGraphNull {
 
     public static DatasetGraph create() { return new DatasetGraphSink(); }
-    
+
     @Override
     protected Graph createGraph() {
         return GraphSink.instance();
     }
-    
+
     public DatasetGraphSink() {}
-    
+
     // Ignore all updates.
-    
+
     @Override
-    public void add(Quad quad) { /* ignore */ } 
-    
+    public void add(Quad quad) { /* ignore */ }
+
     @Override
     public void delete(Quad quad) { /* ignore */ }
-    
+
     @Override
     public void deleteAny(Node g, Node s, Node p, Node o) { /* ignore */ }
-    
+
     @Override
     public void setDefaultGraph(Graph g) { /* ignore */ }
 
@@ -58,4 +60,10 @@ public class DatasetGraphSink extends DatasetGraphNull {
 
     @Override
     public void removeGraph(Node graphName) { /* ignore */ }
+
+    @Override
+    public PrefixMap prefixes() {
+        return PrefixMapSink.sink;
+    }
+
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
index 4b5f219..91cdc61 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphWrapper.java
@@ -25,22 +25,23 @@ import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
 import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.PrefixMap;
 import org.apache.jena.shared.Lock;
 import org.apache.jena.sparql.SystemARQ;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.system.Txn;
 
-public class DatasetGraphWrapper implements DatasetGraph, Sync 
+public class DatasetGraphWrapper implements DatasetGraph, Sync
 {
     // The wrapped DatasetGraph but all calls go via get() so this can be null.
     private final DatasetGraph dsg;
     private Context context;
-    
+
     /** Return the DatasetGraph being wrapped. */
-    public final DatasetGraph getWrapped() { 
+    public final DatasetGraph getWrapped() {
         return get();
     }
-    
+
     /**
      * Recursively unwrap a {@link DatasetGraphWrapper}.
      * <p>
@@ -48,11 +49,11 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
      * the wrapped dataset stored in this object.
      * <p>
      * Note 2: TDB datasets require a  transaction to unwrap.
-     * 
+     *
      * @return the first found {@link DatasetGraph} that is not an instance of
      *     {@link DatasetGraphWrapper}
      */
-    public final DatasetGraph getBase() { 
+    public final DatasetGraph getBase() {
         DatasetGraph dsgw = get();
         while (dsgw instanceof DatasetGraphWrapper) {
             dsgw = ((DatasetGraphWrapper)dsgw).getWrapped();
@@ -60,7 +61,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
         return dsgw;
     }
 
-    /** 
+    /**
      * Unwrap a {@code DatasetGraph} to find the base {@code DatasetGraph}.
      * Calls {@link #getBase} if the argument is a {@code DatasetGraphWrapper}.
      * <p>
@@ -74,10 +75,10 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
             return dsg;
         return ((DatasetGraphWrapper)dsg).getBase();
     }
-    
+
     /** Recursively unwrap a {@link DatasetGraphWrapper}, stopping at a {@link DatasetGraphWrapper}
-     * that indicate it is "view changing", ie shows quads to the base dataset graph.  
-     * 
+     * that indicate it is "view changing", ie shows quads to the base dataset graph.
+     *
      * @return the first found {@link DatasetGraph} that is not an instance of {@link DatasetGraphWrapper}
      */
     public final DatasetGraph getBaseForQuery() {
@@ -96,24 +97,24 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
      *  made based on that contract.
      */
     protected DatasetGraph get() { return dsg; }
-    
+
     protected Context getCxt()   { return context; }
 
-    /** For operations that only read the DatasetGraph. */ 
+    /** For operations that only read the DatasetGraph. */
     protected DatasetGraph getR() { return get(); }
-    
-    /** For operations that write the DatasetGraph. */ 
+
+    /** For operations that write the DatasetGraph. */
     protected DatasetGraph getW() { return get(); }
-    
+
     /** For operations that get a handle on a graph. */
     protected DatasetGraph getG() { return get(); }
-    
+
     /** For operations that pass on transaction actions. */
     protected DatasetGraph getT() { return get(); }
 
     /**
      * Create a operations wrapper around {@code dsg}.
-     * The {@link Context} of the wrapper is the context of the {@code dsg}. 
+     * The {@link Context} of the wrapper is the context of the {@code dsg}.
      */
     public DatasetGraphWrapper(DatasetGraph dsg) {
         this(dsg, (dsg == null) ? null : dsg.getContext());
@@ -178,7 +179,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
     @Override
     public void delete(Node g, Node s, Node p, Node o)
     { getW().delete(g, s, p, o); }
-    
+
     @Override
     public void deleteAny(Node g, Node s, Node p, Node o)
     { getW().deleteAny(g, s, p, o); }
@@ -186,11 +187,15 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
     @Override
     public void clear()
     { getW().clear(); }
-    
+
     @Override
     public boolean isEmpty()
     { return getR().isEmpty(); }
-    
+
+    @Override
+    public PrefixMap prefixes()
+    { return get().prefixes(); }
+
     @Override
     public Iterator<Quad> find()
     { return getR().find(); }
@@ -226,7 +231,7 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
     @Override
     public void close()
     { getW().close(); }
-    
+
     @Override
     public String toString() {
         DatasetGraph dsg = getR();
@@ -241,37 +246,37 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
 
     @Override
     public void begin() { getT().begin(); }
-    
+
     @Override
-    public ReadWrite transactionMode() 
+    public ReadWrite transactionMode()
     { return getT().transactionMode(); }
 
     @Override
-    public  TxnType transactionType() 
+    public  TxnType transactionType()
     { return getT().transactionType(); }
-    
+
     @Override
     public void begin(TxnType type)
     { getT().begin(type); }
 
     @Override
-    public void begin(ReadWrite readWrite) 
+    public void begin(ReadWrite readWrite)
     { getT().begin(readWrite); }
 
     @Override
     public boolean promote()
     { return getT().promote(); }
-    
+
     @Override
     public boolean promote(Promote type)
     { return getT().promote(type); }
-    
+
     @Override
-    public void commit() 
+    public void commit()
     { getT().commit(); }
 
     @Override
-    public void abort() 
+    public void abort()
     { getT().abort(); }
 
     @Override
@@ -279,15 +284,15 @@ public class DatasetGraphWrapper implements DatasetGraph, Sync
     { getT().end(); }
 
     @Override
-    public boolean isInTransaction() 
-    { return get().isInTransaction(); }    
+    public boolean isInTransaction()
+    { return get().isInTransaction(); }
 
     @Override
-    public boolean supportsTransactions() 
+    public boolean supportsTransactions()
     { return getT().supportsTransactions(); }
 
     @Override
     public boolean supportsTransactionAbort()
     { return getT().supportsTransactionAbort(); }
-    
+
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
index 32f0469..07ec875 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphZero.java
@@ -19,9 +19,11 @@
 package org.apache.jena.sparql.core;
 
 import org.apache.jena.graph.Graph;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapZero;
 import org.apache.jena.sparql.graph.GraphZero;
 
-/** An always empty {@link DatasetGraph}. 
+/** An always empty {@link DatasetGraph}.
  * One graph (the default graph) with zero triples.
  * No changes allowed - this is not a sink.
  * @see DatasetGraphSink
@@ -34,6 +36,11 @@ public class DatasetGraphZero extends DatasetGraphNull {
     protected Graph createGraph() {
         return GraphZero.instance();
     }
-    
+
     public DatasetGraphZero() {}
+
+    @Override
+    public PrefixMap prefixes() {
+        return PrefixMapZero.empty;
+    }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
index f59e7b3..774dee7 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
@@ -22,36 +22,33 @@ import java.util.Iterator ;
 
 import org.apache.jena.atlas.iterator.Iter ;
 import org.apache.jena.atlas.lib.Sync ;
-import org.apache.jena.graph.Capabilities;
-import org.apache.jena.graph.Node;
-import org.apache.jena.graph.TransactionHandler;
-import org.apache.jena.graph.Triple;
+import org.apache.jena.graph.*;
 import org.apache.jena.graph.impl.GraphBase ;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.shared.AddDeniedException;
 import org.apache.jena.shared.DeleteDeniedException;
 import org.apache.jena.shared.JenaException ;
 import org.apache.jena.shared.PrefixMapping ;
-import org.apache.jena.shared.impl.PrefixMappingImpl ;
 import org.apache.jena.sparql.SystemARQ ;
 import org.apache.jena.sparql.graph.GraphUnionRead ;
 import org.apache.jena.util.iterator.ExtendedIterator ;
 import org.apache.jena.util.iterator.WrappedIterator ;
 
 /** Implement a Graph as a view of the DatasetGraph.
- * 
- *  It maps graph operations to quad operations. 
- *  
+ *
+ *  It maps graph operations to quad operations.
+ *
  *  {@link GraphUnionRead} provides a union graph that does not assume quads, but loops on graphs.
- *  
+ *
  *  @see GraphUnionRead
- */ 
+ */
 
 public class GraphView extends GraphBase implements NamedGraph, Sync
 {
     // Beware this implements union graph - implementations may wish
     // to do better so see protected method below.
-    
+
     static class GraphViewException extends JenaException
     {
         public GraphViewException()                                  { super(); }
@@ -59,25 +56,25 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
         public GraphViewException(Throwable cause)                   { super(cause) ; }
         public GraphViewException(String message, Throwable cause)   { super(message, cause) ; }
     }
-    
+
     private final DatasetGraph dsg ;
     // null for default graph.
-    private final Node gn ;                 
+    private final Node graphName ;
     private final TransactionHandlerView transactionHandler;
 
     // Factory style.
     public static GraphView createDefaultGraph(DatasetGraph dsg)
     { return new GraphView(dsg, Quad.defaultGraphNodeGenerated) ; }
-    
+
     public static GraphView createNamedGraph(DatasetGraph dsg, Node graphIRI)
     { return new GraphView(dsg, graphIRI) ; }
-    
+
     public static GraphView createUnionGraph(DatasetGraph dsg)
     { return new GraphView(dsg, Quad.unionGraph) ; }
 
     protected GraphView(DatasetGraph dsg, Node gn) {
         this.dsg = dsg ;
-        this.gn = gn ;
+        this.graphName = gn ;
         this.transactionHandler = new TransactionHandlerView(dsg);
     }
 
@@ -87,24 +84,23 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
      */
     @Override
     public Node getGraphName() {
-        return (gn == Quad.defaultGraphNodeGenerated) ? null : gn ;
+        return isDefaultGraph() ? null : graphName ;
     }
 
     /** Return the {@link DatasetGraph} we are viewing. */
     public DatasetGraph getDataset() {
         return dsg ;
     }
-    
-    protected final boolean isDefaultGraph() { return isDefaultGraph(gn) ; }
-    protected final boolean isUnionGraph()   { return isUnionGraph(gn) ; }
+
+    protected final boolean isDefaultGraph() { return isDefaultGraph(graphName) ; }
+    protected final boolean isUnionGraph()   { return isUnionGraph(graphName) ; }
 
     protected static final boolean isDefaultGraph(Node gn) { return gn == null || Quad.isDefaultGraph(gn) ; }
     protected static final boolean isUnionGraph(Node gn)   { return Quad.isUnionGraph(gn) ; }
-    
+
     @Override
     protected PrefixMapping createPrefixMapping() {
-        // Subclasses should override this but in the absence of anything better ...
-        return new PrefixMappingImpl() ;
+        return Prefixes.adapt(dsg.prefixes());
     }
 
     @Override
@@ -115,12 +111,12 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
         Node o = m.getMatchObject() ;
         return graphBaseFind(s, p, o) ;
     }
-    
+
     @Override
     protected ExtendedIterator<Triple> graphBaseFind(Node s, Node p, Node o) {
-        if ( Quad.isUnionGraph(gn) )
+        if ( Quad.isUnionGraph(graphName) )
             return graphUnionFind(s, p, o) ;
-        Node g = graphNode(gn) ;
+        Node g = graphNode(graphName) ;
         Iterator<Triple> iter = G.quads2triples(dsg.find(g, s, p, o)) ;
         return WrappedIterator.createNoRemove(iter) ;
     }
@@ -130,7 +126,7 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
     }
 
     protected ExtendedIterator<Triple> graphUnionFind(Node s, Node p, Node o) {
-        Node g = graphNode(gn) ;
+        Node g = graphNode(graphName) ;
         // Implementations may wish to do better so this is separated out.
         // For example, Iter.distinctAdjacent is a lot cheaper than Iter.distinct
         // but assumes things come back in a particular order
@@ -140,12 +136,12 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
         iter = Iter.distinct(iter) ;
         return WrappedIterator.createNoRemove(iter) ;
     }
-    
+
     @Override
-    public void performAdd( Triple t ) { 
-        Node g = graphNode(gn) ;
+    public void performAdd( Triple t ) {
+        Node g = graphNode(graphName) ;
         if ( Quad.isUnionGraph(g) )
-            throw new AddDeniedException("Can't update the union graph of a dataset") ; 
+            throw new AddDeniedException("Can't update the union graph of a dataset") ;
         Node s = t.getSubject() ;
         Node p = t.getPredicate() ;
         Node o = t.getObject() ;
@@ -154,15 +150,15 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
 
     @Override
     public void performDelete( Triple t ) {
-        Node g = graphNode(gn) ;
+        Node g = graphNode(graphName) ;
         if ( Quad.isUnionGraph(g) )
-            throw new DeleteDeniedException("Can't update the union graph of a dataset") ; 
+            throw new DeleteDeniedException("Can't update the union graph of a dataset") ;
         Node s = t.getSubject() ;
         Node p = t.getPredicate() ;
         Node o = t.getObject() ;
         dsg.delete(g, s, p, o) ;
     }
-    
+
     @Override
     public void remove(Node s, Node p, Node o) {
         if ( getEventManager().listening() ) {
@@ -175,9 +171,18 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
         // We know no one is listening ...
         // getEventManager().notifyEvent(this, GraphEvents.remove(s, p, o) );
     }
-    
-    /** 
-     * Subclasses may wish to provide {@code graphBaseSize} otherwise {@link GraphBase} uses {@code find()}.  
+
+    @Override
+    public void clear() {
+        Node gn = getGraphName();
+        if ( gn == null )
+            gn = Quad.defaultGraphNodeGenerated;
+        getDataset().deleteAny(gn, Node.ANY, Node.ANY, Node.ANY);
+        getEventManager().notifyEvent(this, GraphEvents.removeAll);
+    }
+
+    /**
+     * Subclasses may wish to provide {@code graphBaseSize} otherwise {@link GraphBase} uses {@code find()}.
      */
     @Override protected int graphBaseSize() { return super.graphBaseSize(); }
 
@@ -185,19 +190,19 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
     public void sync() {
         SystemARQ.sync(dsg);
     }
-    
+
     @Override
     public TransactionHandler getTransactionHandler() {
         return new TransactionHandlerView(dsg);
     }
-    
+
     @Override
-    public Capabilities getCapabilities() { 
-        if (capabilities == null) 
+    public Capabilities getCapabilities() {
+        if (capabilities == null)
             capabilities = new GraphViewCapabilities();
         return capabilities;
     }
-    
+
     protected static class GraphViewCapabilities implements Capabilities {
         @Override
         public boolean sizeAccurate() {
@@ -231,7 +236,7 @@ public class GraphView extends GraphBase implements NamedGraph, Sync
 
         @Override
         public boolean iteratorRemoveAllowed() {
-            //Default for GraphViews is that iterators do not provide remove. 
+            //Default for GraphViews is that iterators do not provide remove.
             return false;
         }
 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java
index 09ed4a3..b606f3a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Prologue.java
@@ -34,32 +34,26 @@ public class Prologue
 
     protected PrefixMapping prefixMap = null ;
     protected IRIResolver resolver = null ;
-    
+
     public Prologue() { prefixMap = new PrefixMappingImpl() ; }
-    
+
     public Prologue(PrefixMapping pmap)
-    { 
-        this.prefixMap = pmap ; 
+    {
+        this.prefixMap = pmap ;
         this.resolver = null ;
     }
-    
+
     public Prologue(PrefixMapping pmap, String base)
-    { 
+    {
         this.prefixMap = pmap ;
         setBaseURI(base) ;
     }
-    
+
     public Prologue(PrefixMapping pmap, IRIResolver resolver)
     {
-        this.prefixMap = pmap ; 
+        this.prefixMap = pmap ;
         this.resolver = resolver ;
     }
-    
-    public Prologue(Prologue other)
-    {
-        this.prefixMap = other.prefixMap ; 
-        this.resolver = other.resolver ;
-    }
 
     public Prologue copy()
     {
@@ -68,10 +62,10 @@ public class Prologue
         String baseURI = null ;
         if ( resolver != null)
             baseURI = resolver.getBaseIRIasString() ;
-        
+
         return new Prologue(prefixMap, baseURI) ;
     }
-    
+
     // Reverse of sub()
     public void usePrologueFrom(Prologue other)
     {
@@ -80,10 +74,10 @@ public class Prologue
         if ( other.resolver != null )
             resolver = IRIResolver.create(getBaseURI()) ;
     }
-    
+
     public Prologue sub(PrefixMapping newMappings) { return sub(newMappings, null) ; }
     public Prologue sub(String base) { return sub(null, base) ; }
-    
+
     public Prologue sub(PrefixMapping newMappings, String base)
     {
         // New prefix mappings
@@ -96,9 +90,9 @@ public class Prologue
             r = IRIResolver.create(base) ;
         return new Prologue(ext, r) ;
     }
-    
+
     /**
-     * @return True if the query has an explicitly set base URI. 
+     * @return True if the query has an explicitly set base URI.
      */
     public boolean explicitlySetBaseURI() { return seenBaseURI ; }
 
@@ -122,9 +116,9 @@ public class Prologue
             return ;
         }
         this.seenBaseURI = true ;
-        this.resolver = IRIResolver.create(baseURI) ; 
+        this.resolver = IRIResolver.create(baseURI) ;
     }
-    
+
     /**
      * @param resolver IRI resolver
      */
@@ -136,31 +130,31 @@ public class Prologue
             return ;
         }
         this.seenBaseURI = true ;
-        this.resolver = resolver ; 
+        this.resolver = resolver ;
     }
-    
+
     // ---- Query prefixes
-    
+
     /** Set a prefix for this query */
     public void setPrefix(String prefix, String expansion)
     {
         try {
             // Removal may involve regeneration of the reverse mapping
-            // so only do if needed.   
+            // so only do if needed.
             String oldExpansion = prefixMap.getNsPrefixURI(prefix) ;
             if ( Objects.equals(oldExpansion, expansion) )
                 return ;
             if ( oldExpansion != null )
                 prefixMap.removeNsPrefix(prefix) ;
-            
+
             prefixMap.setNsPrefix(prefix, expansion) ;
         } catch (PrefixMapping.IllegalPrefixException ex)
         {
             Log.warn(this, "Illegal prefix mapping(ignored): "+prefix+"=>"+expansion) ;
         }
-    }   
+    }
 
-    /** Return the prefix map from the parsed query */ 
+    /** Return the prefix map from the parsed query */
     public PrefixMapping getPrefixMapping() { return prefixMap ; }
     /** Set the mapping */
     public void setPrefixMapping(PrefixMapping pmap ) { prefixMap = pmap ; }
@@ -173,12 +167,12 @@ public class Prologue
 
     /** Get the IRI resolver */
     public IRIResolver getResolver() { return resolver ; }
-    
+
     /** Set the IRI resolver */
     public void setResolver(IRIResolver resolver) { this.resolver = resolver; }
-    
-    /** Expand prefixed name 
-     * 
+
+    /** Expand prefixed name
+     *
      * @param prefixed  The prefixed name to be expanded
      * @return URI, or null if not expanded.
      */
@@ -187,7 +181,7 @@ public class Prologue
     {
         //From PrefixMappingImpl.expandPrefix( String prefixed )
         int colon = prefixed.indexOf( ':' );
-        if (colon < 0) 
+        if (colon < 0)
             return null ;
         else {
             String prefix = prefixed.substring( 0, colon ) ;
@@ -197,35 +191,35 @@ public class Prologue
             return uri + prefixed.substring( colon + 1 );
         }
     }
-    
+
     /** Use the prefix map to turn a URI into a qname, or return the original URI */
-    
+
     public String shortForm(String uri)
     {
         return prefixMap.shortForm(uri) ;
     }
-    
+
     /** Test whether a Prologue will perform the same as this one. */
     public boolean samePrologue(Prologue other) {
         // Prologue are mutable and superclasses so .equals is left as the default.
         String base1 = explicitlySetBaseURI() ? getBaseURI() : null ;
-        String base2 = other.explicitlySetBaseURI() ? other.getBaseURI() : null ;        
+        String base2 = other.explicitlySetBaseURI() ? other.getBaseURI() : null ;
         if (! Objects.equals(base1,  base2) )
             return false ;
         if ( getPrefixMapping() == null && other.getPrefixMapping() == null )
             return true ;
         if ( getPrefixMapping() == null )
             return false ;
-        return getPrefixMapping().samePrefixMappingAs(other.getPrefixMapping()) ;    
+        return getPrefixMapping().samePrefixMappingAs(other.getPrefixMapping()) ;
     }
 
     // Caution.
     // Prologues are inherited (historical).
     // This is support code.
-    
+
     public static int hash(Prologue prologue) {
         final int prime = 31 ;
-        int x = 1 ; 
+        int x = 1 ;
         if ( prologue.seenBaseURI )
             x = prime * x + prologue.getBaseURI().hashCode() ;
         else
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
index ffacc0a..ceca76b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
@@ -39,10 +39,15 @@ import org.apache.jena.graph.Triple;
 import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapStd;
 import org.apache.jena.shared.Lock;
 import org.apache.jena.shared.LockMRPlusSW;
 import org.apache.jena.sparql.JenaTransactionException;
-import org.apache.jena.sparql.core.* ;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphTriplesQuads;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.core.Transactional;
 import org.slf4j.Logger;
 
 /**
@@ -53,7 +58,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
 
     private static final Logger log = getLogger(DatasetGraphInMemory.class);
 
-    private final DatasetPrefixStorage prefixes = new DatasetPrefixStorageInMemory();
+    private final PrefixMap prefixes = new PrefixMapStd();
 
     /** This lock imposes the multiple-reader and single-writer policy of transactions */
     private final Lock transactionLock = new LockMRPlusSW();
@@ -62,11 +67,11 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
      * Transaction lifecycle operations must be atomic, especially
      * {@link Transactional#begin} and {@link Transactional#commit}.
      * <p>
-     * There are changes to be made to several datastructures and this 
+     * There are changes to be made to several datastructures and this
      * insures that they are made consistently.
      */
     private final ReentrantLock systemLock = new ReentrantLock(true);
-    
+
     /**
      * Dataset version.
      * A write transaction increments this in commit.
@@ -93,10 +98,10 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
      * @return the current mode of the transaction in progress
      */
     @Override
-    public ReadWrite transactionMode() { 
+    public ReadWrite transactionMode() {
         return transactionMode.get();
     }
-    
+
     @Override
     public TxnType transactionType() {
         return transactionType.get();
@@ -133,7 +138,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
         this.quadsIndex = i;
         this.defaultGraph = t;
     }
-    
+
     @Override
     public boolean supportsTransactions()       { return true; }
     @Override
@@ -146,12 +151,12 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
 
     @Override
     public void begin(TxnType txnType) {
-        if (isInTransaction()) 
+        if (isInTransaction())
             throw new JenaTransactionException("Transactions cannot be nested!");
         transactionType.set(txnType);
         _begin(txnType, TxnType.initial(txnType));
     }
-    
+
     private void _begin(TxnType txnType, ReadWrite readWrite) {
         // Takes transactionLock
         startTransaction(txnType, readWrite);
@@ -161,8 +166,8 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             version.set(generation.get());
         }) ;
     }
-    
-    /** Called transaction start code at most once per transaction. */ 
+
+    /** Called transaction start code at most once per transaction. */
     private void startTransaction(TxnType txnType, ReadWrite mode) {
         transactionLock.enterCriticalSection(mode.equals(ReadWrite.READ)); // get the dataset write lock, if needed.
         transactionType.set(txnType);
@@ -170,7 +175,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
         isInTransaction(true);
     }
 
-    /** Called transaction ending code at most once per transaction. */ 
+    /** Called transaction ending code at most once per transaction. */
     private void finishTransaction() {
         isInTransaction.remove();
         transactionType.remove();
@@ -185,12 +190,12 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             throw new JenaTransactionException("Tried to promote outside a transaction!");
         if ( transactionMode().equals(ReadWrite.WRITE) )
             return true;
-        
+
         if ( transactionType() == TxnType.READ )
             return false;
-        
+
         boolean readCommitted = (promoteMode == Promote.READ_COMMITTED);
-        
+
         try {
             _promote(readCommitted);
             return true;
@@ -198,7 +203,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             return false ;
         }
     }
-    
+
     private void _promote(boolean readCommited) {
         // Outside lock.
         if ( ! readCommited && version.get() != generation.get() )  {
@@ -208,10 +213,10 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             // The final test is after we obtain the transactionLock.
             throw new JenaTransactionException("Dataset changed - can't promote") ;
         }
-    
+
         // Blocking on other writers.
         transactionLock.enterCriticalSection(Lock.WRITE);
-        // Check again now we are inside the lock. 
+        // Check again now we are inside the lock.
         if ( ! readCommited && version.get() != generation.get() )  {
                 // Can't promote - release the lock.
                 transactionLock.leaveCriticalSection();
@@ -245,10 +250,10 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             }
         } ) ;
     }
-    
+
     @Override
     public void abort() {
-        if (!isInTransaction()) 
+        if (!isInTransaction())
             throw new JenaTransactionException("Tried to abort outside a transaction!");
         if (transactionMode().equals(WRITE))
             _abort();
@@ -263,7 +268,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             defaultGraph().end();
         } ) ;
     }
-    
+
     @Override
     public void close() {
         if (isInTransaction())
@@ -275,7 +280,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
         if (isInTransaction()) {
             if (transactionMode().equals(WRITE)) {
                 String msg = "end() called for WRITE transaction without commit or abort having been called. This causes a forced abort.";
-                // _abort does _end actions inside the lock. 
+                // _abort does _end actions inside the lock.
                 _abort() ;
                 finishTransaction();
                 throw new JenaTransactionException(msg);
@@ -285,14 +290,14 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             finishTransaction();
         }
     }
-    
+
     private void _end() {
         withLock(systemLock, () -> {
             quadsIndex().end();
             defaultGraph().end();
         } ) ;
     }
-    
+
     private static void withLock(java.util.concurrent.locks.Lock lock, Runnable action) {
         lock.lock();
         try { action.run(); }
@@ -300,7 +305,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
             lock.unlock();
         }
     }
-    
+
     private <T> T access(final Supplier<T> source) {
         return isInTransaction() ? source.get() : calculateRead(this, source::get);
     }
@@ -349,7 +354,7 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
     public Graph getUnionGraph() {
         return getGraph(Quad.unionGraph);
     }
-    
+
     private Consumer<Graph> addGraph(final Node name) {
         return g -> g.find().mapWith(t -> new Quad(name, t)).forEachRemaining(this::add);
     }
@@ -364,7 +369,6 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
     @Override
     public void removeGraph(final Node graphName) {
         mutate(removeGraph, getGraph(graphName));
-        prefixes().removeAllFromPrefixMap(graphName.getURI()) ;
     }
 
     /**
@@ -396,7 +400,8 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
     /**
      * @return the prefixes in use in this dataset
      */
-    public DatasetPrefixStorage prefixes() {
+    @Override
+    public PrefixMap prefixes() {
         return prefixes;
     }
 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetPrefixStorageInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetPrefixStorageInMemory.java
deleted file mode 100644
index de4a604..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetPrefixStorageInMemory.java
+++ /dev/null
@@ -1,104 +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.jena.sparql.core.mem;
-
-import static org.apache.jena.sparql.core.Quad.defaultGraphIRI;
-
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.shared.impl.PrefixMappingImpl;
-import org.apache.jena.sparql.core.DatasetPrefixStorage;
-
-/**
- * A simple {@link DatasetPrefixStorage} for in-memory datasets.
- */
-public class DatasetPrefixStorageInMemory implements DatasetPrefixStorage {
-
-    private Map<String, PrefixMapping> prefixMappings = new ConcurrentHashMap<>();
-
-    /**
-     * A mapping from graph name to {@link PrefixMapping} for that graph.
-     */
-    private Map<String, PrefixMapping> prefixMappings() {
-        return prefixMappings;
-    }
-
-    @Override
-    public void close() {
-        prefixMappings = null;
-    }
-
-    @Override
-    public void sync() {
-        // NO OP
-    }
-
-    @Override
-    public Set<String> graphNames() {
-        return prefixMappings().keySet();
-    }
-
-    @Override
-    public String readPrefix(final String graphName, final String prefix) {
-        return getPrefixMapping(graphName).getNsPrefixURI(prefix);
-    }
-
-    @Override
-    public String readByURI(final String graphName, final String uriStr) {
-        return getPrefixMapping(graphName).getNsURIPrefix(uriStr);
-    }
-
-    @Override
-    public Map<String, String> readPrefixMap(final String graphName) {
-        return getPrefixMapping(graphName).getNsPrefixMap();
-    }
-
-    @Override
-    public void insertPrefix(final String graphName, final String prefix, final String uri) {
-        getPrefixMapping(graphName).setNsPrefix(prefix, uri);
-    }
-
-    @Override
-    public void loadPrefixMapping(final String graphName, final PrefixMapping pmap) {
-        getPrefixMapping(graphName).setNsPrefixes(pmap);
-    }
-
-    @Override
-    public void removeFromPrefixMap(final String graphName, final String prefix) {
-        getPrefixMapping(graphName).removeNsPrefix(prefix);
-    }
-
-    @Override
-    public void removeAllFromPrefixMap(String graphName) {
-        getPrefixMapping(graphName).clearNsPrefixMap() ;
-    }
-
-    @Override
-    public PrefixMapping getPrefixMapping() {
-        return getPrefixMapping(defaultGraphIRI.getURI());
-    }
-
-    @Override
-    public PrefixMapping getPrefixMapping(final String graphName) {
-        return prefixMappings().computeIfAbsent(graphName, x -> new PrefixMappingImpl());
-    }
-}
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java
index 53c864f..f6acc8b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/GraphInMemory.java
@@ -19,8 +19,8 @@
 package org.apache.jena.sparql.core.mem;
 
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.core.DatasetPrefixStorage;
 import org.apache.jena.sparql.core.GraphView;
 
 /**
@@ -39,9 +39,7 @@ public class GraphInMemory extends GraphView {
 
     @Override
     protected PrefixMapping createPrefixMapping() {
-        final DatasetPrefixStorage prefixes = datasetGraph().prefixes();
-        return isDefaultGraph() || isUnionGraph() ? prefixes.getPrefixMapping() : prefixes
-            .getPrefixMapping(getGraphName().getURI());
+        return Prefixes.adapt(datasetGraph.prefixes());
     }
 
     private DatasetGraphInMemory datasetGraph() {
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java
index 5335eef..575783b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingInputStream.java
@@ -42,7 +42,7 @@ import org.apache.jena.sparql.graph.NodeConst ;
 
 /** Language for reading in a stream of bindings.
  * See <a href="https://cwiki.apache.org/confluence/display/JENA/BindingIO">BindingIO</a>
- * 
+ *
  * <p>Summary:</p>
  * <ul>
  * <li>Directives:
@@ -50,7 +50,7 @@ import org.apache.jena.sparql.graph.NodeConst ;
  *     <li>VARS - list of variables.</li>
  *     <li>PREFIX</li>
  *   </ul>
- *  </li> 
+ *  </li>
  * <li>Lines of RDF terms (Turtle, no triple-quoted strings)</li>
  * <li>Items on line align with last VARS declaration</li>
  * <li>* for "same as last row"</li>
@@ -60,35 +60,35 @@ import org.apache.jena.sparql.graph.NodeConst ;
 public class BindingInputStream extends LangEngine implements Iterator<Binding>, Closeable
 {
     // In effect, multiple Inheritance.
-    // We implementation-inherit from LangEngine(no public methods) 
-    // and also IteratorTuples (redirecting calls to be object) 
+    // We implementation-inherit from LangEngine(no public methods)
+    // and also IteratorTuples (redirecting calls to be object)
     private final IteratorTuples iter ;
-    
+
     public BindingInputStream(InputStream in)
     {
         this(TokenizerText.create().source(in).build()) ;
     }
-    
+
     public BindingInputStream(Tokenizer tokenizer)
     {
         this(tokenizer,  profile()) ;
     }
-    
+
     static ParserProfile profile()
     {
         // Don't do anything with IRIs or blank nodes.
-        Prologue prologue = new Prologue(PrefixMapFactory.createForInput(), IRIResolver.createNoResolve()) ;
+        Prologue prologue = new Prologue(PrefixMapFactory.create(), IRIResolver.createNoResolve()) ;
         ErrorHandler handler = ErrorHandlerFactory.getDefaultErrorHandler() ;
         FactoryRDF factory = RiotLib.factoryRDF(LabelToNode.createUseLabelAsGiven()) ;
         ParserProfile profile = RiotLib.createParserProfile(factory, handler, false);
         return profile ;
     }
-    
+
     /** Create an RDF Tuples parser.
-     *  No need to pass in a buffered InputStream; the code 
+     *  No need to pass in a buffered InputStream; the code
      *  will do its own buffering.
      */
-    
+
     private BindingInputStream(Tokenizer tokenizer, ParserProfile profile)
     {
         super(tokenizer, profile, profile.getErrorHandler()) ;
@@ -110,7 +110,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
     @Override
     public void remove()
     { iter.remove() ; }
-    
+
     public List<Var> vars()
     { return Collections.unmodifiableList(iter.vars) ; }
 
@@ -124,7 +124,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
         {
             directives() ;
         }
-        
+
         private void directives()
         {
             while ( lookingAt(TokenType.KEYWORD) )
@@ -146,7 +146,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
                 break;
             }
         }
-        
+
         protected final static String  KW_TRUE        = "true" ;
         protected final static String  KW_FALSE       = "false" ;
 
@@ -158,14 +158,14 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
             BindingMap binding = BindingFactory.create() ;
 
             int i = 0 ;
-            
+
             while( ! lookingAt(TokenType.DOT) )
             {
                 if ( i >= vars.size() )
                     exception(peekToken(), "Too many items in a line.  Expected "+vars.size()) ;
-                
+
                 Var v = vars.get(i) ;
-                
+
                 Token token = nextToken() ;
                 if ( ! token.hasType(TokenType.MINUS ) )
                 {
@@ -195,9 +195,9 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
             }
             if ( eof() )
                 exception(peekToken(), "Line does not end with a DOT") ;
-            
+
             Token dot = nextToken() ;
-            
+
             if ( i != vars.size() )
             {
                 Var v = vars.get(vars.size()-1) ;
@@ -212,7 +212,7 @@ public class BindingInputStream extends LangEngine implements Iterator<Binding>,
         {
             return moreTokens() ;
         }
-     
+
         private void directiveVars()
         {
             vars.clear() ;
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java
index f7ce736..c2af573 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRepeatApply.java
@@ -26,31 +26,31 @@ import org.apache.jena.sparql.engine.QueryIterator ;
 import org.apache.jena.sparql.engine.binding.Binding ;
 
 /** Repeatedly execute the subclass operation for each Binding in the input iterator. */
- 
+
 public abstract class QueryIterRepeatApply extends QueryIter1
 {
-    int count = 0 ; 
-    private QueryIterator currentStage ; 
-    private volatile boolean cancelRequested = false;   // [CANCEL] needed? super.cancelRequest?
-    
+    int count = 0 ;
+    private QueryIterator currentStage ;
+    private volatile boolean cancelRequested = false;
+
     public QueryIterRepeatApply( QueryIterator input ,
                                  ExecutionContext context)
     {
         super(input, context) ;
         this.currentStage = null ;
-        
+
         if ( input == null )
         {
             Log.error(this, "[QueryIterRepeatApply] Repeated application to null input iterator") ;
             return ;
         }
     }
-       
+
     protected QueryIterator getCurrentStage()
     {
         return currentStage ;
     }
-    
+
     protected abstract QueryIterator nextStage(Binding binding) ;
 
     @Override
@@ -58,22 +58,22 @@ public abstract class QueryIterRepeatApply extends QueryIter1
     {
         if ( isFinished() )
             return false ;
-        
+
         for ( ;; )
         {
             if ( currentStage == null  )
                 currentStage = makeNextStage() ;
-            
+
             if ( currentStage == null  )
                 return false ;
-            
+
             if ( cancelRequested )
                 // Pass on the cancelRequest to the active stage.
                 performRequestCancel(currentStage);
-            
+
             if ( currentStage.hasNext() )
                 return true ;
-            
+
             // finish this step
             currentStage.close() ;
             currentStage = null ;
@@ -88,9 +88,9 @@ public abstract class QueryIterRepeatApply extends QueryIter1
         if ( ! hasNextBinding() )
             throw new NoSuchElementException(Lib.className(this)+".next()/finished") ;
         return currentStage.nextBinding() ;
-        
+
     }
-    
+
     private QueryIterator makeNextStage()
     {
         count++ ;
@@ -101,21 +101,21 @@ public abstract class QueryIterRepeatApply extends QueryIter1
         if ( !getInput().hasNext() )
         {
             getInput().close() ;
-            return null ; 
+            return null ;
         }
-        
+
         Binding binding = getInput().next() ;
         QueryIterator iter = nextStage(binding) ;
         return iter ;
     }
-   
+
     @Override
     protected void closeSubIterator()
     {
         if ( currentStage != null )
             currentStage.close() ;
     }
-    
+
     @Override
     protected void requestSubCancel()
     {
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphPrefixesProjection.java b/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphPrefixesProjection.java
deleted file mode 100644
index 56b38ce..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphPrefixesProjection.java
+++ /dev/null
@@ -1,162 +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.jena.sparql.graph;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-
-import org.apache.jena.rdf.model.impl.Util;
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.core.DatasetPrefixStorage;
-
-public class GraphPrefixesProjection implements PrefixMapping {
-    private final String graphName;
-    private final DatasetPrefixStorage prefixes; 
-
-    public GraphPrefixesProjection(String graphName, DatasetPrefixStorage prefixes)
-    { 
-        this.graphName = graphName;
-        this.prefixes = prefixes;
-    }
-
-    @Override
-    public PrefixMapping setNsPrefix(String prefix, String uri) {
-        prefixes.insertPrefix(graphName, prefix, uri); 
-        return this;
-    }
-
-    @Override
-    public PrefixMapping removeNsPrefix(String prefix) {
-        prefixes.removeFromPrefixMap(graphName, prefix);
-        return this;
-    }
-
-    @Override
-    public PrefixMapping clearNsPrefixMap() {
-        prefixes.removeAllFromPrefixMap(graphName);
-        return this;
-    }
-
-    @Override
-    public PrefixMapping setNsPrefixes(PrefixMapping other) {
-        setNsPrefixes(other.getNsPrefixMap());
-        return this;
-    }
-
-    @Override
-    public PrefixMapping setNsPrefixes(Map<String, String> map) {
-        map.entrySet().forEach(entry->{
-            setNsPrefix(entry.getKey(), entry.getValue());
-        });
-        return this;
-    }
-
-    @Override
-    public PrefixMapping withDefaultMappings(PrefixMapping other) {
-        other.getNsPrefixMap().entrySet().forEach(entry->{
-            String prefix = entry.getKey();
-            String uri = entry.getValue();
-            if (getNsPrefixURI( prefix ) == null && getNsURIPrefix( uri ) == null)
-                setNsPrefix( prefix, uri );
-        });
-        return this;
-    }
-
-    @Override
-    public String getNsPrefixURI(String prefix) {
-        return prefixes.readPrefix(graphName, prefix);
-    }
-
-    @Override
-    public String getNsURIPrefix(String uri) {
-        return prefixes.readByURI(graphName, uri);
-    }
-
-    @Override
-    public Map<String, String> getNsPrefixMap() {
-        return prefixes.readPrefixMap(graphName);
-    }
-
-    // From PrefixMappingImpl
-    @Override
-    public String expandPrefix(String prefixed) {
-        {
-            int colon = prefixed.indexOf(':');
-            if ( colon < 0 )
-                return prefixed;
-            else {
-                String prefix = prefixed.substring(0, colon);
-                String uri = prefixes.readPrefix(graphName, prefix);
-                return uri == null ? prefixed : uri + prefixed.substring(colon + 1);
-            }
-        }
-    }
-
-    @Override
-    public String qnameFor(String uri) {
-        int split = Util.splitNamespaceXML(uri);
-        String ns = uri.substring(0, split); 
-        String local = uri.substring(split);
-        if ( local.equals("") )
-            return null;
-        String prefix = prefixes.readByURI(graphName, ns);
-        return prefix == null ? null : prefix + ":" + local;
-    }
-    
-    @Override
-    public String shortForm(String uri) {
-        Optional<Entry<String, String>> e = findMapping(uri, true);
-        if ( ! e.isPresent() )
-            return uri;
-        return e.get().getKey() + ":" + uri.substring((e.get().getValue()).length());
-    }
-
-    @Override
-    public boolean hasNoMappings() {
-        return getNsPrefixMap().isEmpty();
-    }
-    
-    @Override
-    public int numPrefixes() {
-        return getNsPrefixMap().size();
-    }
-
-    private Optional<Entry<String, String>> findMapping( String uri, boolean partial )
-    {
-        return getNsPrefixMap().entrySet().stream().sequential().filter(e->{
-            String ss = e.getValue();
-            if (uri.startsWith( ss ) && (partial || ss.length() == uri.length())) 
-                return true;
-            return false;
-        }).findFirst();
-    }    
-    
-    @Override
-    public PrefixMapping lock() {
-        return this;
-    }
-
-    @Override
-    public boolean samePrefixMappingAs(PrefixMapping other) {
-        return this.getNsPrefixMap().equals(other.getNsPrefixMap());
-    }
-
-}
-
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java
index 0d0c236..76322c5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingAdapter.java
@@ -24,50 +24,60 @@ import java.util.Objects;
 import java.util.function.BiConsumer;
 
 import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapAdapter;
 import org.apache.jena.shared.PrefixMapping;
 
-/** Provided {@link PrefixMapping} for a {@link PrefixMap}. */
+/**
+ * Provided {@link PrefixMapping} for a {@link PrefixMap}.
+ *
+ * @see PrefixMapAdapter
+ */
+final
 public class PrefixMappingAdapter extends PrefixMappingBase {
 
-    private final PrefixMap pmap;
-    
+    private final PrefixMap prefixMap;
+
     public PrefixMappingAdapter(PrefixMap pmap) {
-        this.pmap = pmap;
+        this.prefixMap = pmap;
     }
-    
+
+    public PrefixMap getPrefixMap() {
+        return prefixMap;
+    }
+
     @Override
     protected void add(String prefix, String uri) {
-        pmap.add(prefix, uri);
+        prefixMap.add(prefix, uri);
     }
 
     @Override
     protected void remove(String prefix) {
-        pmap.delete(prefix);
+        prefixMap.delete(prefix);
     }
 
     @Override
     protected void clear() {
-        pmap.clear();
+        prefixMap.clear();
     }
 
     @Override
     protected boolean isEmpty() {
-        return pmap.isEmpty();
+        return prefixMap.isEmpty();
     }
 
     @Override
     protected int size() {
-        return pmap.size();
+        return prefixMap.size();
     }
 
     @Override
     protected String prefixToUri(String prefix) {
-        return pmap.getMapping().get(prefix);
+        return prefixMap.getMapping().get(prefix);
     }
 
     @Override
     protected String uriToPrefix(String uri) {
-       return pmap.getMapping().entrySet().stream()
+       return prefixMap.getMapping().entrySet().stream()
            .filter(e->Objects.equals(uri, e.getValue().toString()))
            .map(Entry::getKey)
            .findFirst()
@@ -76,16 +86,16 @@ public class PrefixMappingAdapter extends PrefixMappingBase {
 
     @Override
     protected Map<String, String> asMap() {
-        return pmap.getMapping();
+        return prefixMap.getMapping();
     }
 
     @Override
     protected Map<String, String> asMapCopy() {
-        return pmap.getMappingCopy();
+        return prefixMap.getMappingCopy();
     }
 
     @Override
     protected void apply(BiConsumer<String, String> action) {
-        pmap.forEach(action);
+        prefixMap.forEach(action);
     }
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
index f7ad75c..5d4610d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/graph/PrefixMappingZero.java
@@ -18,6 +18,8 @@
 
 package org.apache.jena.sparql.graph;
 
+import static org.apache.jena.atlas.lib.Lib.unsupportedMethod;
+
 import org.apache.jena.shared.PrefixMapping;
 
 /** Immutable empty {@link PrefixMapping}. */
@@ -25,12 +27,12 @@ public class PrefixMappingZero extends PrefixMappingSink {
 
     @Override
     protected void add(String prefix, String uri) {
-        throw new UnsupportedOperationException("add prefix");
+        throw unsupportedMethod(this, "add") ;
     }
 
     @Override
     protected void remove(String prefix) {
-        throw new UnsupportedOperationException("remove prefix");
+        throw unsupportedMethod(this, "remove") ;
     }
 
     @Override
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
index db165e5..39f3939 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java
@@ -34,7 +34,7 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
 	public DifferenceDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) {
 		super(left, right, c);
 	}
-	
+
 	private Graph difference(Function<DatasetGraph, Graph> op) {
 	    return apply(DifferenceView::new, op);
 	}
@@ -73,7 +73,7 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
 	public long size() {
 		return getLeft().size();
 	}
-	
+
     static class DifferenceView extends Difference {
 
         public DifferenceView(Graph L, Graph R) {
@@ -89,7 +89,13 @@ public class DifferenceDatasetGraph extends DyadicDatasetGraph {
         public void performDelete(Triple t) {
             throwNoMutationAllowed();
         }
-        
+
+        @Override
+        public void remove(Node s, Node p, Node o) {
+            throwNoMutationAllowed();
+        }
+
+
         @Override
         public void clear() {
             throwNoMutationAllowed();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
index 063457c..ecd756b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DyadicDatasetGraph.java
@@ -36,6 +36,8 @@ import org.apache.jena.graph.compose.MultiUnion;
 import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapUnmodifiable;
 import org.apache.jena.shared.Lock;
 import org.apache.jena.sparql.JenaTransactionException;
 import org.apache.jena.sparql.core.DatasetGraph;
@@ -57,6 +59,12 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
         throw new UnsupportedOperationException("This view does not allow mutation!");
     }
 
+
+    @Override
+    public PrefixMap prefixes() {
+        return new PrefixMapUnmodifiable(getLeft().prefixes());
+    }
+
     @Override
     public void commit() {
         forEach(DatasetGraph::commit);
@@ -67,7 +75,7 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
         begin(TxnType.READ);
     }
 
-    
+
     @Override
     public void begin(TxnType type) {
         switch (type) {
@@ -84,11 +92,11 @@ public abstract class DyadicDatasetGraph extends PairOfSameType<DatasetGraph> im
         // no mutation allowed
         return false;
     }
-    
+
     @Override
     public ReadWrite transactionMode() {
         if ( ! isInTransaction() )
-            return null; 
+            return null;
         return TxnType.convert(transactionType());
     }
 
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java
index 469f64b..0ea7f33 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java
@@ -30,7 +30,7 @@ import org.apache.jena.util.iterator.ExtendedIterator;
 import org.apache.jena.util.iterator.NullIterator;
 
 public class IntersectionDatasetGraph extends DyadicDatasetGraph {
-  
+
     public IntersectionDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) {
         super(left, right, c);
     }
@@ -79,7 +79,12 @@ public class IntersectionDatasetGraph extends DyadicDatasetGraph {
         public void performDelete(Triple t) {
             throwNoMutationAllowed();
         }
-        
+
+        @Override
+        public void remove(Node s, Node p, Node o) {
+            throwNoMutationAllowed();
+        }
+
         @Override
         public void clear() {
             throwNoMutationAllowed();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java
index 7cf1edb..2e564a3 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/NodeFactoryExtra.java
@@ -31,6 +31,7 @@ import org.apache.jena.query.QueryParseException ;
 import org.apache.jena.riot.RiotException ;
 import org.apache.jena.riot.system.PrefixMap ;
 import org.apache.jena.riot.system.PrefixMapFactory ;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.riot.tokens.Token ;
 import org.apache.jena.riot.tokens.Tokenizer ;
 import org.apache.jena.riot.tokens.TokenizerText;
@@ -40,16 +41,16 @@ import org.apache.jena.sparql.sse.SSE ;
  * Various convenience helper methods for converting to and from nodes
  */
 public class NodeFactoryExtra {
-    private static final PrefixMap prefixMappingDefault = PrefixMapFactory.createForInput(SSE.getPrefixMapRead()) ;
+    private static final PrefixMap prefixMappingDefault = Prefixes.adapt(SSE.getPrefixMapRead()) ;
 
     /**
      * Parse a node - with convenience prefix mapping
      * <p>
      * Allows surrounding white space
      * </p>
-     * 
+     *
      * @param nodeString Node string to parse
-     * 
+     *
      */
     public static Node parseNode(String nodeString) {
         return parseNode(nodeString, prefixMappingDefault) ;
@@ -62,7 +63,7 @@ public class NodeFactoryExtra {
      * <p>
      * Allows surrounding white space.
      * </p>
-     * 
+     *
      * @param nodeString Node string to parse
      * @param pmap Prefix Map, null to use no prefix mappings
      * @return Parsed Node
@@ -110,7 +111,7 @@ public class NodeFactoryExtra {
 
     /**
      * Node to int
-     * 
+     *
      * @param node
      * @return The int value or Integer.MIN_VALUE.
      */
@@ -125,7 +126,7 @@ public class NodeFactoryExtra {
 
     /**
      * Node to long
-     * 
+     *
      * @param node
      * @return The long value or Long.MIN_VALUE.
      */
@@ -140,7 +141,7 @@ public class NodeFactoryExtra {
 
     /**
      * Node to float
-     * 
+     *
      * @param node
      * @return The float value or Float.NaN
      */
@@ -156,7 +157,7 @@ public class NodeFactoryExtra {
 
     /**
      * Node to double
-     * 
+     *
      * @param node
      * @return The double value or Double.NaN
      */
@@ -171,7 +172,7 @@ public class NodeFactoryExtra {
 
     /**
      * int to Node
-     * 
+     *
      * @param integer
      * @return An xsd:integer
      */
@@ -181,7 +182,7 @@ public class NodeFactoryExtra {
 
     /**
      * long to Node
-     * 
+     *
      * @param integer
      * @return An xsd:integer
      */
@@ -191,7 +192,7 @@ public class NodeFactoryExtra {
 
     /**
      * float to Node
-     * 
+     *
      * @param value
      * @return An xsd:float
      */
@@ -201,7 +202,7 @@ public class NodeFactoryExtra {
 
     /**
      * double to Node
-     * 
+     *
      * @param value
      * @return An double
      */
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java
index c76ed85..98321c9 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java
@@ -22,7 +22,9 @@ import java.util.Iterator;
 import java.util.function.Function;
 
 import org.apache.jena.atlas.iterator.Iter;
-import org.apache.jena.graph.*;
+import org.apache.jena.graph.Graph;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Triple;
 import org.apache.jena.graph.compose.Union;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.Quad;
@@ -85,7 +87,7 @@ public class UnionDatasetGraph extends DyadicDatasetGraph {
     public boolean isEmpty() {
         return both(DatasetGraph::isEmpty);
     }
-    
+
     static class UnionView extends Union {
 
         public UnionView(Graph L, Graph R) {
@@ -101,7 +103,12 @@ public class UnionDatasetGraph extends DyadicDatasetGraph {
         public void performDelete(Triple t) {
             throwNoMutationAllowed();
         }
-        
+
+        @Override
+        public void remove(Node s, Node p, Node o) {
+            throwNoMutationAllowed();
+        }
+
         @Override
         public void clear() {
             throwNoMutationAllowed();
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
index 7803faa..fcbb240 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
@@ -37,7 +37,7 @@ import org.junit.Test ;
 /** System-level testing of the parsers - testing the parser plumbing, not the language details */
 public class TestParserFactory
 {
-    @Test public void ntriples_01() 
+    @Test public void ntriples_01()
     {
         {
             String s = "<x> <p> <q> ." ;
@@ -51,7 +51,7 @@ public class TestParserFactory
         }
 
         // Old style, direct to LangRIOT -- very deprecated.
-        // NQ version tests that relative URIs remain relative. 
+        // NQ version tests that relative URIs remain relative.
         Tokenizer tokenizer = TokenizerText.create().fromString("<x> <p> <q> .").build();
         CatchParserOutput sink = new CatchParserOutput() ;
         ParserProfile profile = makeParserProfile(IRIResolver.createNoResolve(), null, false);
@@ -64,7 +64,7 @@ public class TestParserFactory
         assertEquals(SSE.parseTriple("(<x> <p> <q>)"), last(sink.triples)) ;
     }
 
-    @Test public void turtle_01() 
+    @Test public void turtle_01()
     {
         // Verify the expected output works.
         String s = "<x> <p> <q> ." ;
@@ -76,19 +76,19 @@ public class TestParserFactory
         Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ;
         assertEquals(t, last(sink.triples)) ;
     }
-    
+
     private ParserProfile makeParserProfile(IRIResolver resolver, ErrorHandler errorHandler, boolean checking) {
         if ( errorHandler == null )
             errorHandler = ErrorHandlerFactory.errorHandlerStd;
-        return new ParserProfileStd(RiotLib.factoryRDF(), 
+        return new ParserProfileStd(RiotLib.factoryRDF(),
                                     errorHandler,
                                     resolver,
-                                    PrefixMapFactory.createForInput(),
+                                    PrefixMapFactory.create(),
                                     RIOT.getContext().copy(),
                                     checking, false) ;
     }
 
-    @Test public void nquads_01() 
+    @Test public void nquads_01()
     {
         String s = "<x> <p> <q> <g> ." ;
         CatchParserOutput sink = parseCapture(s, Lang.NQ) ;
@@ -102,34 +102,34 @@ public class TestParserFactory
 
     @Test public void nquads_dft_triple() {
         // JENA-1854
-        String s = "<x> <p> <q> ." ; 
+        String s = "<x> <p> <q> ." ;
         CatchParserOutput sink = parseCapture(s, Lang.NQ) ;
         assertEquals(1, sink.startCalled) ;
         assertEquals(1, sink.finishCalled) ;
         assertEquals(0, sink.triples.size()) ;
         assertEquals(1, sink.quads.size()) ;
-        
+
         Triple t = SSE.parseTriple("(<x> <p> <q>)") ;
         Quad q = new Quad(Quad.defaultGraphNodeGenerated, t) ;
         assertEquals(q, last(sink.quads)) ;
     }
 
-    
+
     @Test public void trig_dft_triple() {
         // JENA-1854
-        String s = "{ <x> <p> <q> }" ; 
+        String s = "{ <x> <p> <q> }" ;
         CatchParserOutput sink = parseCapture(s, Lang.TRIG) ;
         assertEquals(1, sink.startCalled) ;
         assertEquals(1, sink.finishCalled) ;
         assertEquals(0, sink.triples.size()) ;
         assertEquals(1, sink.quads.size()) ;
-        
+
         Triple t = SSE.parseTriple("(<http://base/x> <http://base/p> <http://base/q>)") ;
         Quad q = new Quad(Quad.defaultGraphNodeGenerated, t) ;
         assertEquals(q, last(sink.quads)) ;
     }
-    
-    @Test public void trig_02() 
+
+    @Test public void trig_02()
     {
         String s = "<g> { <x> <p> <q> }" ;
         CatchParserOutput sink = parseCapture(s, Lang.TRIG) ;
@@ -148,8 +148,8 @@ public class TestParserFactory
         return sink ;
     }
 
-    private static <T> T last(List<T> list) 
-    { 
+    private static <T> T last(List<T> list)
+    {
         if ( list.isEmpty() ) return null ;
         return list.get(list.size()-1) ;
     }
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java b/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java
index 0556c5f..4f77e8b 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/system/TS_RiotSystem.java
@@ -27,7 +27,7 @@ import org.junit.runners.Suite.SuiteClasses ;
  *
  */
 @RunWith(Suite.class)
-@SuiteClasses({ 
+@SuiteClasses({
     TestChecker.class
     , TestStreamRDF.class
     , TestFactoryRDF.class
@@ -37,8 +37,7 @@ import org.junit.runners.Suite.SuiteClasses ;
     , TestPrefixMap.class
     , TestPrefixMapWrapper.class
     , TestPrefixMapOther.class
-    , TestPrefixMapExtended1.class
-    
+
     , TestIO_JenaReaders.class
     , TestIO_JenaWriters.class
     , TestLangRegistration.class
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java b/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java
index 6c9c9c8..6062f2e 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/system/TestJsonLDReadWrite.java
@@ -26,6 +26,7 @@ import java.io.ByteArrayOutputStream ;
 import java.util.Iterator ;
 import java.util.Map ;
 
+import org.apache.jena.atlas.lib.Creator;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.query.DatasetFactory ;
 import org.apache.jena.rdf.model.Model ;
@@ -39,8 +40,8 @@ import org.junit.Test ;
 /** tests : JSONLD->RDF ; JSONLD->RDF->JSONLD */
 public class TestJsonLDReadWrite
 {
-    private static String DIR = "testing/RIOT/jsonld/" ; 
-    
+    private static String DIR = "testing/RIOT/jsonld/" ;
+
     @Test public void read_g01() { graphJ2R("graph1.jsonld", "graph1.ttl") ; }
 
     @Test public void read_g02() { graphJ2R("graph2.jsonld", "graph2.ttl") ; }
@@ -80,59 +81,60 @@ public class TestJsonLDReadWrite
         filename = DIR+filename ;
         // Read in
         Model model = RDFDataMgr.loadModel(filename) ;
-        
+
         // Write a JSON-LD
         ByteArrayOutputStream out = new ByteArrayOutputStream() ;
         RDFDataMgr.write(out, model, JSONLD) ;
         ByteArrayInputStream r = new ByteArrayInputStream(out.toByteArray()) ;
-        
+
 //        System.out.println();
 //        System.out.println(new String(out.toByteArray()));
 //        System.out.println();
-        
-        // Read as JSON-LD 
+
+        // Read as JSON-LD
         Model model2 = ModelFactory.createDefaultModel() ;
         RDFDataMgr.read(model2, r, null, JSONLD) ;
-        
+
         // Compare
-        if ( ! model.isIsomorphicWith(model2) ) 
+        if ( ! model.isIsomorphicWith(model2) )
             System.out.println("## ---- DIFFERENT") ;
-        
+
         assertTrue(model.isIsomorphicWith(model2));
-        
+
         // Check namespaces in parsed graph match the original data
         checkNamespaces(model2, model.getNsPrefixMap());
     }
-    
+
     static void rtRJRds(String filename)
     {
+        //Creator<Dataset> creator = ()->DatasetFactory.createTxnMem();
+        Creator<Dataset> creator = ()->DatasetFactory.createGeneral();
+
         filename = DIR+filename ;
-        Dataset ds1 = RDFDataMgr.loadDataset(filename) ;
-        
+        Dataset ds1 = creator.create();
+        RDFDataMgr.read(ds1, filename) ;
+
         // Write a JSON-LD
         ByteArrayOutputStream out = new ByteArrayOutputStream() ;
         RDFDataMgr.write(out, ds1, JSONLD) ;
         ByteArrayInputStream r = new ByteArrayInputStream(out.toByteArray()) ;
-        
-//        System.out.println();
-//        System.out.println(new String(out.toByteArray()));
-//        System.out.println();
-        
-        // Read as JSON-LD 
-        @SuppressWarnings("deprecation")
-        Dataset ds2 = DatasetFactory.createMem() ;
+
+        // Read as JSON-LD
+        // This must be the same kind of dataset as ds1 due to treatment of prefixes
+        // on individual graphs for legacy.
+        Dataset ds2 = creator.create();
         RDFDataMgr.read(ds2, r, null, JSONLD) ;
-        
+
         if ( ! isIsomorphic(ds1, ds2) )
         {
             SSE.write(ds1) ;
             SSE.write(ds2) ;
         }
-        
-        assertTrue(isIsomorphic(ds1, ds2) ) ; 
-        
+
+        assertTrue(isIsomorphic(ds1, ds2) ) ;
+
         // Check namespaces in the parsed dataset match those in the original data
-    	checkNamespaces(ds2.getDefaultModel(), ds1.getDefaultModel().getNsPrefixMap());
+        checkNamespaces(ds2.getDefaultModel(), ds1.getDefaultModel().getNsPrefixMap());
     	Iterator<String> graphNames = ds2.listNames();
     	while (graphNames.hasNext()) {
     		String gn = graphNames.next();
@@ -144,10 +146,10 @@ public class TestJsonLDReadWrite
     {
         return IsoMatcher.isomorphic(ds1.asDatasetGraph(), ds2.asDatasetGraph()) ;
     }
-    
+
     private static void checkNamespaces(Model m, Map<String, String> namespaces) {
     	if (namespaces == null) return;
-    	
+
     	for (String prefix : namespaces.keySet()) {
     	    if ( ! prefix.isEmpty() )
     		Assert.assertEquals("Model does contain expected namespace " + prefix + ": <" + namespaces.get(prefix) + ">", namespaces.get(prefix), m.getNsPrefixURI(prefix));
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java
index 2affc61..35b3854 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/writer/TestJsonLDWriter.java
@@ -41,7 +41,6 @@ import org.apache.jena.riot.JsonLDWriteContext;
 import org.apache.jena.riot.RDFFormat;
 import org.apache.jena.riot.RDFWriter;
 import org.apache.jena.riot.system.PrefixMap;
-import org.apache.jena.riot.system.RiotLib;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.vocabulary.FOAF;
@@ -130,7 +129,7 @@ public class TestJsonLDWriter {
             if (((RDFFormat.JSONLDVariant) f.getVariant()).isFrame()) continue;
             String s = toString(m, f, null);
             Model m2 = parse(s);
-            assertTrue(m2.isIsomorphicWith(m));        
+            assertTrue(m2.isIsomorphicWith(m));
         }
     }
 
@@ -170,7 +169,7 @@ public class TestJsonLDWriter {
 
         // String js = "{\"p\":{\"@id\":\"http://www.a.com/foo/p\",\"@type\":\"@id\"},\"ex\":\"http://www.a.com/foo/\"}";
         // constructing the js string ny hand:
-        JsonObject obj = new JsonObject();  
+        JsonObject obj = new JsonObject();
         obj.put("@id", ns + "p");
         obj.put("@type", "@id");
         JsonObject json = new JsonObject();
@@ -184,7 +183,7 @@ public class TestJsonLDWriter {
         // model wo prefix -> no more prefix string in result:
         assertFalse(s2.contains(prefixStringInResult));
 
-        // the model wo prefix, output as jsonld using a context that defines the prefix    
+        // the model wo prefix, output as jsonld using a context that defines the prefix
         JsonLDWriteContext jenaCtx = new JsonLDWriteContext();
         jenaCtx.setJsonLDContext(js);
 
@@ -248,7 +247,7 @@ public class TestJsonLDWriter {
 
     /**
      * Checks that one can pass a context defined by its URI
-     * 
+     *
      */
     @Test
     public final void testContextByUri() {
@@ -367,7 +366,7 @@ public class TestJsonLDWriter {
 
         String jsonld = toString(m, RDFFormat.JSONLD_FLAT, null);
 
-        // without following line in JsonLDWriter, the test fails 
+        // without following line in JsonLDWriter, the test fails
         // if (! isLangString(o) && ! isSimpleString(o) )
         String vv = "\"plangstring\":{\"@language\":\"fr\",\"@value\":\"a langstring\"}";
         assertTrue(jsonld.contains(vv));
@@ -431,7 +430,7 @@ public class TestJsonLDWriter {
         JsonLDWriteContext jenaCtx = new JsonLDWriteContext();
 
         JsonLdOptions opts = new JsonLdOptions(null);
-        opts.setCompactArrays(false);       
+        opts.setCompactArrays(false);
 
         jenaCtx.setOptions(opts);
 
@@ -484,7 +483,7 @@ public class TestJsonLDWriter {
         m.setNsPrefix("", ns);
 
         DatasetGraph g = DatasetFactory.wrap(m).asDatasetGraph();
-        PrefixMap pm = RiotLib.prefixMap(g);
+        PrefixMap pm = g.prefixes();
         String base = null;
         Context jenaContext = null;
 
@@ -502,7 +501,7 @@ public class TestJsonLDWriter {
             Object o = e.getValue();
             if (o instanceof Map) {
                 o = ((Map<String, Object>) o).get("@id");
-            }           
+            }
             if ((o != null) && (o instanceof String)) {
                 if (((String) o).equals(ns + e.getKey())) {
                     remove.add(e.getKey());
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java
index e62527e..cf67432 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/AbstractDatasetGraphTests.java
@@ -35,6 +35,7 @@ import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.sparql.graph.GraphFactory ;
 import org.apache.jena.sparql.sse.SSE ;
+import org.apache.jena.system.Txn;
 import org.junit.Test ;
 
 /** Test basic operations on a DatasetGraph
@@ -46,7 +47,7 @@ import org.junit.Test ;
 public abstract class AbstractDatasetGraphTests
 {
     protected abstract DatasetGraph emptyDataset() ;
-    
+
     @Test public void create_1()
     {
         DatasetGraph dsg = emptyDataset() ;
@@ -54,8 +55,8 @@ public abstract class AbstractDatasetGraphTests
         assertNotNull(dsg.getDefaultGraph()) ;
         assertTrue(dsg.getDefaultGraph().isEmpty()) ;
     }
-    
-    // Quad operations 
+
+    // Quad operations
     /*
      * void add(Quad quad)
      * void delete(Quad quad)
@@ -72,18 +73,18 @@ public abstract class AbstractDatasetGraphTests
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
         dsg.add(quad) ;
         assertTrue(dsg.contains(quad)) ;
-        
+
         Iterator<Quad> iter = dsg.find(quad) ;
         assertTrue(iter.hasNext()) ;
         Quad quad2 = iter.next();
         assertFalse(iter.hasNext()) ;
         assertEquals(quad, quad2) ;
-        
+
         // and the graph view.
         assertTrue(dsg.getDefaultGraph().isEmpty()) ;
         assertFalse(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
     }
-    
+
     @Test public void quad_02()
     {
         DatasetGraph dsg = emptyDataset() ;
@@ -91,35 +92,35 @@ public abstract class AbstractDatasetGraphTests
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
         dsg.add(quad) ;
         dsg.containsGraph(NodeFactory.createURI("g")) ;
-        
+
         dsg.delete(quad) ;
         assertTrue(dsg.isEmpty()) ;
         assertTrue(dsg.getDefaultGraph().isEmpty()) ;
         assertTrue(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
     }
-    
+
     @Test public void quad_03()
     {
         DatasetGraph dsg = emptyDataset() ;
         assertNotNull(dsg) ;
         Quad quad1 = SSE.parseQuad("(quad <g> <s> <p> <o1>)") ;
         Quad quad2 = SSE.parseQuad("(quad <g> <s> <p> <o2>)") ;
-        dsg.add(quad1) ; 
-        dsg.add(quad2) ; 
-        
+        dsg.add(quad1) ;
+        dsg.add(quad2) ;
+
         dsg.deleteAny(NodeFactory.createURI("g"), NodeFactory.createURI("s"), null, null) ;
-        assertFalse(dsg.contains(quad1)) ; 
-        assertFalse(dsg.contains(quad2)) ; 
+        assertFalse(dsg.contains(quad1)) ;
+        assertFalse(dsg.contains(quad2)) ;
     }
-    
+
     @Test public void quad_04()
     {
         DatasetGraph dsg = emptyDataset() ;
         assertNotNull(dsg) ;
         Quad quad1 = SSE.parseQuad("(quad <g> <s> <p> <o1>)") ;
         Quad quad2 = SSE.parseQuad("(quad <g> <s> <p> <o2>)") ;
-        dsg.add(quad1) ; 
-        dsg.add(quad2) ; 
+        dsg.add(quad1) ;
+        dsg.add(quad2) ;
         Iterator<Quad> iter = dsg.find(NodeFactory.createURI("g"), NodeFactory.createURI("s"), null, null) ;
 
         assertTrue(iter.hasNext()) ;
@@ -140,7 +141,7 @@ public abstract class AbstractDatasetGraphTests
         Node p  = SSE.parseNode("<p>") ;
         Node o1 = SSE.parseNode("<o1>") ;
         Node o2 = SSE.parseNode("<o2>") ;
-        
+
         dsg.add(g,s,p,o1) ;
         assertTrue(dsg.contains(quad1)) ;
         assertTrue(dsg.contains(g,s,p,o1)) ;
@@ -150,14 +151,14 @@ public abstract class AbstractDatasetGraphTests
 
     /*
      * getDefaultGraph()
-     * getGraph(Node) 
+     * getGraph(Node)
      * containsGraph(Node)
-     * ???? setDefaultGraph(Graph) 
+     * ???? setDefaultGraph(Graph)
      * addGraph(Node, Graph)
      * removeGraph(Node)
      * listGraphNodes()
      */
-    
+
     // Graph centric operations
     @Test public void graph_00()
     {
@@ -169,27 +170,27 @@ public abstract class AbstractDatasetGraphTests
         dsg.addGraph(gn, g);
         assertTrue(dsg.containsGraph(gn)) ;
     }
-    
+
     // Graph centric operations
     @Test public void graph_01()
     {
         DatasetGraph dsg = emptyDataset() ;
         assertNotNull(dsg) ;
         Node g = NodeFactory.createURI("g") ;
-        
+
         Triple t = SSE.parseTriple("(<s> <p> <o>)") ;
-        
+
         dsg.getGraph(g).add(t) ;
         assertTrue(dsg.getGraph(g).contains(t)) ;
-        
+
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
         Iterator<Quad> iter = dsg.find(null, null, null, null) ;
-        
+
         assertTrue(iter.hasNext()) ;
         Quad quad2 = iter.next();
         assertFalse(iter.hasNext()) ;
         assertEquals(quad, quad2) ;
-        
+
         assertTrue(dsg.getDefaultGraph().isEmpty()) ;
         assertFalse(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
     }
@@ -201,14 +202,14 @@ public abstract class AbstractDatasetGraphTests
         assertNotNull(dsg) ;
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
         dsg.add(quad) ;
-        
+
         Triple t = SSE.parseTriple("(<s> <p> <o>)") ;
         dsg.getGraph(g).delete(t) ;
         assertTrue(dsg.getDefaultGraph().isEmpty()) ;
         assertTrue(dsg.getGraph(NodeFactory.createURI("g")).isEmpty()) ;
-        assertFalse(dsg.find(Node.ANY, Node.ANY, Node.ANY, Node.ANY).hasNext()) ; 
+        assertFalse(dsg.find(Node.ANY, Node.ANY, Node.ANY, Node.ANY).hasNext()) ;
     }
-    
+
     @Test public void graph_03()
     {
         Node g = NodeFactory.createURI("g") ;
@@ -218,7 +219,7 @@ public abstract class AbstractDatasetGraphTests
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
         assertTrue(dsg.contains(quad)) ;
     }
-    
+
     @Test public void find_01()
     {
         Node g1 = NodeFactory.createURI("g1") ;
@@ -227,13 +228,13 @@ public abstract class AbstractDatasetGraphTests
         Quad quad2 = SSE.parseQuad("(quad <g2> <s2> <p2> <o2>)") ;
         dsg.add(quad1) ;
         dsg.add(quad2) ;
-        
+
         List<Quad> quads = Iter.toList(dsg.find(g1, null, null, null)) ;
         assertEquals(1, quads.size()) ;
-        Quad q = quads.get(0) ; 
+        Quad q = quads.get(0) ;
         assertEquals(quad1, q) ;
     }
-    
+
     @Test public void deleteAny_01()
     {
         DatasetGraph dsg = emptyDataset() ;
@@ -243,7 +244,7 @@ public abstract class AbstractDatasetGraphTests
         dsg.add(new Quad(Quad.defaultGraphIRI, subject, predicate, object));
         dsg.deleteAny(Node.ANY, subject, null, null);
     }
-  
+
     @Test public void deleteAny_02()
     {
         DatasetGraph dsg = emptyDataset() ;
@@ -251,20 +252,65 @@ public abstract class AbstractDatasetGraphTests
         Node predicate = NodeFactory.createURI("http://example/p");
         Node object1 = NodeFactory.createBlankNode();
         Node object2 = NodeFactory.createBlankNode();
-        Node graph = NodeFactory.createURI("http://example/g") ; 
-        
+        Node graph = NodeFactory.createURI("http://example/g") ;
+
         dsg.add(graph, subject, predicate, object1);
         dsg.add(graph, subject, predicate, object2);
-        
+
         dsg.deleteAny(Quad.defaultGraphIRI, null, null, null);
         List<Quad> quads = Iter.toList(dsg.find(graph, null, null, null)) ;
         assertEquals(2, quads.size()) ;
-        
+
         dsg.deleteAny(graph, null, null, null);
         quads = Iter.toList(dsg.find(graph, null, null, null)) ;
         assertEquals(0, quads.size()) ;
     }
-    
+    @Test public void deleteAny_03()
+    {
+        DatasetGraph dsg = emptyDataset() ;
+        Node subject = NodeFactory.createURI("http://example/s");
+        Node predicate = NodeFactory.createURI("http://example/p");
+        Node object1 = NodeFactory.createBlankNode();
+        Node object2 = NodeFactory.createBlankNode();
+        Node graph = NodeFactory.createURI("http://example/g") ;
+
+        dsg.getDefaultGraph().add(Triple.create(subject, predicate, object1));
+        dsg.getGraph(graph).add(Triple.create(subject, predicate, object2));
+
+        dsg.deleteAny(Quad.defaultGraphIRI, null, null, null);
+        List<Quad> quads = Iter.toList(dsg.find(Quad.defaultGraphIRI, null, null, null)) ;
+        assertEquals(0, quads.size()) ;
+
+        dsg.deleteAny(graph, null, null, null);
+        quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+        assertEquals(0, quads.size()) ;
+    }
+
+    @Test public void deleteAny_04()
+    {
+        DatasetGraph dsg = emptyDataset() ;
+
+        Node subject = NodeFactory.createURI("http://example/s");
+        Node predicate = NodeFactory.createURI("http://example/p");
+        Node object1 = NodeFactory.createBlankNode();
+        Node object2 = NodeFactory.createBlankNode();
+        Node graph = NodeFactory.createURI("http://example/g") ;
+        Node graph2 = NodeFactory.createURI("http://example/abc") ;
+
+        dsg.add(graph, subject, predicate, object1);
+        dsg.add(graph, subject, predicate, object2);
+
+        dsg.deleteAny(graph2, null, null, null);
+
+        List<Quad> quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+        assertEquals(2, quads.size()) ;
+
+        dsg.deleteAny(graph, null, null, null);
+
+        quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+        assertEquals(0, quads.size()) ;
+    }
+
     @Test public void clear_01() {
         DatasetGraph dsg = emptyDataset() ;
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
@@ -273,20 +319,49 @@ public abstract class AbstractDatasetGraphTests
         dsg.add(quad) ;
         assertFalse(dsg.isEmpty()) ;
         assertTrue(dsg.containsGraph(gn)) ;
-        
+
         dsg.clear() ;
-        
+
         assertTrue(dsg.isEmpty()) ;
         assertFalse(dsg.containsGraph(gn)) ;
     }
-    
-    // Quad delete causes graph to not be visable.
+
+    @Test public void graph_clear_1() {
+        DatasetGraph dsg = emptyDataset() ;
+        if ( ! dsg.supportsTransactions() )
+            return;
+        Quad quad = SSE.parseQuad("(<g> <s> <p> 0)") ;
+        Node gn = quad.getGraph();
+        Txn.executeWrite(dsg, ()->{
+            dsg.add(quad);
+            dsg.getGraph(gn).clear();
+            assertTrue(dsg.isEmpty());
+        });
+    }
+
+    // Check that clear does not leak.
+    @Test public void graph_clear_2() {
+        DatasetGraph dsg = emptyDataset() ;
+        if ( ! dsg.supportsTransactions() )
+            return;
+        Quad quad = SSE.parseQuad("(<g> <s> <p> 0)") ;
+        Node gn = quad.getGraph();
+        Node gnx = NodeFactory.createURI("xyz");
+        Txn.executeWrite(dsg, ()->{
+            dsg.add(quad);
+            dsg.getGraph(gnx).clear();
+            assertFalse(dsg.isEmpty());
+            assertFalse(dsg.getGraph(gn).isEmpty());
+        });
+    }
+
+    // Quad delete causes graph to not be visible.
     // Not valid for all datasets (e.g. DatasetGraphMapLink)
     @Test public void emptyGraph_1() {
         DatasetGraph dsg = emptyDataset() ;
         Node gn = NodeFactory.createURI("http://example/g") ;
         Quad q = SSE.parseQuad("(:g :s :p :o)");
-        
+
         dsg.add(q);
         List<Node> nodes1 = Iter.toList(dsg.listGraphNodes());
         assertEquals(1, nodes1.size());
@@ -294,19 +369,19 @@ public abstract class AbstractDatasetGraphTests
         List<Node> nodes2 = Iter.toList(dsg.listGraphNodes());
         assertEquals(0, nodes2.size());
     }
-    
+
     @Test public void emptyGraph_2() {
         DatasetGraph dsg = emptyDataset() ;
         Node gn = NodeFactory.createURI("http://example/g") ;
         Quad q = SSE.parseQuad("(:g :s :p :o)");
-        
+
         dsg.add(q);
         assertTrue(dsg.containsGraph(gn));
-        
+
         dsg.delete(q);
         assertFalse(dsg.containsGraph(gn));
     }
-    
+
     @Test public void listGraphNodes_1() {
         DatasetGraph dsg = emptyDataset();
         Quad quad = SSE.parseQuad("(quad <g> <s> <p> <o>)") ;
@@ -317,7 +392,7 @@ public abstract class AbstractDatasetGraphTests
         Node gn2 = x.get(0);
         assertEquals(gn, gn2);
     }
-    
+
     @Test public void listGraphNodes_2() {
         DatasetGraph dsg = emptyDataset();
         Quad quad1 = SSE.parseQuad("(quad <g1> <s> <p> <o>)") ;
@@ -332,7 +407,7 @@ public abstract class AbstractDatasetGraphTests
         boolean b = ListUtils.equalsUnordered(e, x);
         assertTrue(b);
     }
-    
+
     @Test public void listGraphNodes_3() {
         DatasetGraph dsg = emptyDataset();
         Quad quad1 = SSE.parseQuad("(quad _ <s> <p> <o>)") ;
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
index 1cea767..c58f341 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/DatasetGraphSimpleMem.java
@@ -24,18 +24,21 @@ import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.graph.impl.GraphBase ;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapStd;
 import org.apache.jena.util.iterator.ExtendedIterator ;
 import org.apache.jena.util.iterator.WrappedIterator ;
 
-/** Very simple, non-scalable DatasetGraph implementation 
+/** Very simple, non-scalable DatasetGraph implementation
  * of a triples+quads style for testing the {@link DatasetGraphTriplesQuads}
- * style implementation framework. 
+ * style implementation framework.
  */
 public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements TransactionalNotSupportedMixin
 {
     private MiniSet<Triple> triples = new MiniSet<>() ;
     private MiniSet<Quad> quads = new MiniSet<>() ;
-    
+    private PrefixMap prefixes = new PrefixMapStd();
+
     /** Simple abstraction of a Set */
     private static class MiniSet<T> implements Iterable<T> {
         final Collection<T> store;
@@ -70,7 +73,7 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
             return store.size();
         }
     }
-    
+
     public DatasetGraphSimpleMem() {}
 
     @Override
@@ -109,7 +112,7 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
 
     /** Convert null to Node.ANY */
     public static Node nullAsAny(Node x) { return nullAsDft(x, Node.ANY) ; }
-    
+
     /** Convert null to some default Node */
     public static Node nullAsDft(Node x, Node dft) { return x==null ? dft : x ; }
 
@@ -221,6 +224,11 @@ public class DatasetGraphSimpleMem extends DatasetGraphTriplesQuads implements T
         return graphNodes().iterator();
     }
 
+    @Override
+    public PrefixMap prefixes() {
+        return prefixes;
+    }
+
     private Set<Node> graphNodes() {
         Set<Node> x = new HashSet<>();
         for ( Quad q : quads )
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java b/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java
index ed29964..5d52f14 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/graph/AbstractTestPrefixMappingView.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.assertNotNull;
 import org.apache.jena.shared.PrefixMapping ;
 import org.junit.Test ;
 
-/** Tests for when the prefix mapping,of the graph it comes from, is view */ 
+/** Tests, for when the prefix mapping of the graph it comes from its view */
 public abstract class AbstractTestPrefixMappingView
 {
     static final String defaultPrefixURI  = "" ;
@@ -32,50 +32,50 @@ public abstract class AbstractTestPrefixMappingView
     /** Create a fresh PrefixMapping */
     protected abstract PrefixMapping create() ;
     /** Create a fresh view over the same storage as last create() */
-    protected abstract PrefixMapping view() ; 
-    
+    protected abstract PrefixMapping view() ;
+
     @Test public void prefix1()
     {
         PrefixMapping pmap = create() ;
     }
-    
+
     @Test public void prefix2()
     {
         PrefixMapping pmap = create() ;
         pmap.setNsPrefix("ex", "http://example/") ;
         assertNotNull(pmap.getNsPrefixURI("ex")) ;
     }
-    
+
     @Test public void prefix3()
     {
         String uri = "http://example/" ;
         PrefixMapping pmap = create() ;
         pmap.setNsPrefix("ex", uri) ;
-        
+
         // Create a second view onto the same storage.
-        
+
         PrefixMapping pmap2 = view() ;
         String x = pmap2.getNsPrefixURI("ex") ;
-        
+
         assertNotNull(x) ;
         assertEquals(uri,x) ;
     }
-        
+
     @Test public void prefix4()
     {
         String uri = "http://example/" ;
         PrefixMapping pmap = create() ;
         pmap.setNsPrefix("ex", uri) ;
-        
+
         assertEquals("ex", pmap.getNsURIPrefix("http://example/")) ;
     }
-        
+
     @Test public void prefix5()
     {
         String uri = "http://example/" ;
         PrefixMapping pmap = create() ;
         pmap.setNsPrefix("ex", uri) ;
-        
+
         assertEquals(uri+"foo", pmap.expandPrefix("ex:foo")) ;
     }
 
@@ -84,7 +84,7 @@ public abstract class AbstractTestPrefixMappingView
         String uri = "http://example/" ;
         PrefixMapping pmap = create() ;
         pmap.setNsPrefix("ex", uri) ;
-        
+
         assertEquals("ex:foo", pmap.qnameFor("http://example/foo")) ;
     }
 
@@ -92,21 +92,21 @@ public abstract class AbstractTestPrefixMappingView
     {
         String uri1 = "http://example/" ;
         String uri2 = "http://example/ns#" ;
-        
+
         PrefixMapping pmap = create() ;
         pmap.setNsPrefix("ex1", uri1) ;
         pmap.setNsPrefix("ex2", uri2) ;
         assertEquals("ex2:foo", pmap.qnameFor("http://example/ns#foo")) ;
     }
-    
+
     @Test public void prefix8()
     {
         PrefixMapping pmap = create() ;
         String x = "scheme:i_do_not_exist" ;
-        
+
         assertEquals(x, pmap.expandPrefix(x)) ;
-        // Call again - used to cause problems. 
+        // Call again - used to cause problems.
         assertEquals(x, pmap.expandPrefix(x)) ;
     }
-    
+
 }
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java b/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java
index 3918a92..49e0086 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/util/AbstractTestDyadicDatasetGraph.java
@@ -90,44 +90,45 @@ public abstract class AbstractTestDyadicDatasetGraph {
     public void noClearing() {
         emptyDsg().clear();
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noAddingToDefaultGraph() {
         emptyDsg().getDefaultGraph().add(null);
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noDeletingFromDefaultGraph() {
         emptyDsg().getDefaultGraph().delete(null);
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noAddingToANamedGraph() {
         Node graphName = NodeFactory.createBlankNode();
         emptyDsg().getGraph(graphName).add(null);
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noDeletingFromANamedGraph() {
         Node graphName = NodeFactory.createBlankNode();
         emptyDsg().getGraph(graphName).delete(null);
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noClearingDefaultGraph() {
         emptyDsg().getDefaultGraph().clear();
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noClearingANamedGraph() {
         Node graphName = NodeFactory.createBlankNode();
         emptyDsg().getGraph(graphName).clear();
     }
-    
+
     @Test(expected = UnsupportedOperationException.class)
     public void noRemovingFromANamedGraph() {
         Node graphName = NodeFactory.createBlankNode();
-        emptyDsg().getGraph(graphName).remove(null, null, null);
+        emptyDsg().getGraph(graphName)
+        .remove(null, null, null);
     }
 
     // Read lifecycle.
@@ -140,7 +141,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
         dsg.commit();
         dsg.end();
     }
-    
+
     @Test
     public void txnRead2() {
         final DatasetGraph dsg = emptyDsg();
@@ -149,7 +150,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
         assertTrue(dsg.isInTransaction());
         dsg.end();
     }
-    
+
     @Test
     public void txnRead3() {
         final DatasetGraph dsg = emptyDsg();
@@ -160,7 +161,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
         assertEquals(TxnType.READ, dsg.transactionType());
         dsg.end();
     }
-    
+
     @Test(expected = JenaTransactionException.class)
     public void noWriting1() {
         emptyDsg().begin(ReadWrite.WRITE);
@@ -180,7 +181,7 @@ public abstract class AbstractTestDyadicDatasetGraph {
     public void noWriting4() {
         emptyDsg().begin(TxnType.READ_COMMITTED_PROMOTE);
     }
-    
+
     @Test
     public void noPromoting() {
         final DatasetGraph dsg = emptyDsg();
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java
index 871c699..8a2d275 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/Lib.java
@@ -77,6 +77,11 @@ public class Lib
             return "null" ;
         return cls.getSimpleName() ;
     }
+         
+    /** Create {@link UnsupportedOperationException} with formatted message. */
+    static public UnsupportedOperationException unsupportedMethod(Object object, String method) {
+        return new UnsupportedOperationException(Lib.className(object) + "." + method);
+    }
 
     /** Do two lists have the same elements? */
     public static <T> boolean equalsListAsSet(List<T> list1, List<T> list2) {
diff --git a/jena-cmds/src/main/java/tdb/tdbconfig.java b/jena-cmds/src/main/java/tdb/tdbconfig.java
index 99aea15..4fd1e13 100644
--- a/jena-cmds/src/main/java/tdb/tdbconfig.java
+++ b/jena-cmds/src/main/java/tdb/tdbconfig.java
@@ -22,13 +22,12 @@ package tdb;
 import java.util.List ;
 import java.util.Map ;
 
+import arq.cmdline.CmdARQ ;
 import jena.cmd.ModVersion;
-
 import org.apache.jena.atlas.io.IndentedWriter ;
 import org.apache.jena.atlas.lib.DateTimeUtils ;
 import org.apache.jena.graph.Node ;
-import org.apache.jena.shared.PrefixMapping ;
-import org.apache.jena.sparql.core.DatasetPrefixStorage ;
+import org.apache.jena.riot.system.PrefixMap;
 import org.apache.jena.tdb.TDB ;
 import org.apache.jena.tdb.base.file.FileFactory ;
 import org.apache.jena.tdb.base.file.Location ;
@@ -37,12 +36,11 @@ import org.apache.jena.tdb.setup.Build ;
 import org.apache.jena.tdb.solver.stats.Stats ;
 import org.apache.jena.tdb.solver.stats.StatsResults ;
 import org.apache.jena.tdb.store.DatasetGraphTDB ;
+import org.apache.jena.tdb.store.DatasetPrefixStorage;
 import org.apache.jena.tdb.sys.DatasetControlNone ;
-
 import tdb.cmdline.CmdSub ;
 import tdb.cmdline.CmdTDB ;
 import tdb.cmdline.CmdTDBGraph ;
-import arq.cmdline.CmdARQ ;
 
 /** Tools to manage a TDB store.  Subcommand based. */
 public class tdbconfig extends CmdSub
@@ -53,7 +51,7 @@ public class tdbconfig extends CmdSub
     static final String CMD_NODES       = "nodes" ;
     static final String CMD_INFO        = "info" ;
     static final String CMD_PREFIXES    = "prefixes" ;
-    
+
     static public void main(String... argv)
     {
         CmdTDB.init() ;
@@ -65,30 +63,30 @@ public class tdbconfig extends CmdSub
         super(argv) ;
 //        super.addSubCommand(CMD_CLEAN, new Exec()
 //          { @Override public void exec(String[] argv) { new tdbclean(argv).main() ; } }) ;
-        
+
         super.addSubCommand(CMD_HELP, new Exec()
         { /*@Override*/ @Override
         public void exec(String[] argv) { new SubHelp(argv).mainRun() ; } }) ;
-        
+
         super.addSubCommand(CMD_STATS, new Exec()
         { /*@Override*/ @Override
         public void exec(String[] argv) { new SubStats(argv).mainRun() ; } }) ;
-        
+
         super.addSubCommand(CMD_NODES, new Exec()
         { /*@Override*/ @Override
         public void exec(String[] argv) { new SubNodes(argv).mainRun() ; } }) ;
-        
+
         super.addSubCommand(CMD_INFO, new Exec()
         { /*@Override*/ @Override
         public void exec(String[] argv) { new SubInfo(argv).mainRun() ; } }) ;
-        
+
         super.addSubCommand(CMD_PREFIXES, new Exec()
         { /*@Override*/ @Override
         public void exec(String[] argv) { new SubPrefixes(argv).mainRun() ; } }) ;
 
-        
+
     }
-    
+
     static class SubPrefixes extends CmdTDB
     {
         public SubPrefixes(String ... argv)
@@ -111,14 +109,14 @@ public class tdbconfig extends CmdSub
             for ( String gn : prefixes.graphNames() )
             {
                 System.out.println("Graph: "+gn) ;
-                PrefixMapping pmap = prefixes.getPrefixMapping(gn) ;
-                Map<String, String> x = pmap.getNsPrefixMap() ;
+                PrefixMap pmap = prefixes.getPrefixMap(gn) ;
+                Map<String, String> x = pmap.getMapping();
                 for ( String k : x.keySet() )
                     System.out.printf("  %-10s %s\n", k+":", x.get(k)) ;
             }
         }
     }
-    
+
     // Subcommand : help
     class SubHelp extends CmdARQ
     {
@@ -127,7 +125,7 @@ public class tdbconfig extends CmdSub
             super(argv) ;
             //super.addModule(modSymbol) ;
         }
-        
+
         @Override
         protected String getSummary()
         {
@@ -143,7 +141,7 @@ public class tdbconfig extends CmdSub
 
             for ( String name : subCommandNames() )
             {
-                out.println(name) ; 
+                out.println(name) ;
             }
             out.decIndent() ;
             out.flush() ;
@@ -155,7 +153,7 @@ public class tdbconfig extends CmdSub
             return "tdbconfig help" ;
         }
     }
-    
+
     static class SubStats extends CmdTDBGraph
     {
         public SubStats(String ... argv)
@@ -163,7 +161,7 @@ public class tdbconfig extends CmdSub
             super(argv) ;
             //super.addModule(modSymbol) ;
         }
-        
+
         @Override
         protected String getSummary()
         {
@@ -185,14 +183,14 @@ public class tdbconfig extends CmdSub
             return "tdbconfig stats" ;
         }
     }
-    
+
     static class SubNodes extends CmdTDB
     {
         public SubNodes(String ... argv)
         {
             super(argv) ;
         }
-        
+
         @Override
         protected String getSummary()
         {
@@ -224,7 +222,7 @@ public class tdbconfig extends CmdSub
         {
             super(argv) ;
         }
-        
+
         @Override
         protected String getSummary()
         {
@@ -246,5 +244,5 @@ public class tdbconfig extends CmdSub
             return "tdbconfig info" ;
         }
     }
-    
+
 }
diff --git a/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java b/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java
index 7e4572a..2353775 100644
--- a/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java
+++ b/jena-core/src/main/java/org/apache/jena/util/MonitorModel.java
@@ -26,10 +26,10 @@ import org.apache.jena.rdf.model.impl.ModelCom ;
 
 /**
  * Model wrapper which provides normal access to an underlying model but
- * also maintains a snapshot of the triples it was last known to contain. 
+ * also maintains a snapshot of the triples it was last known to contain.
  * A snapshot action
  * causes the set of changes between this and the previous snapshot to
- * be calculated and the cache updated. The snapshot process will also 
+ * be calculated and the cache updated. The snapshot process will also
  * fire change notification.
  */
 
@@ -41,7 +41,7 @@ public class MonitorModel extends ModelCom {
     public MonitorModel(Model base) {
         super(new MonitorGraph(base.getGraph()));
     }
-    
+
     /**
      * Compute the differences between the current monitored graph and the last
      * snapshot. The changes will also be forwarded to any listeners.
@@ -66,7 +66,7 @@ public class MonitorModel extends ModelCom {
             }
         }
     }
-    
+
     /**
      * Compute the differences between the current monitored graph and the last
      * snapshot, forward any changes to registered listeners, then take a new snapshot.
@@ -74,5 +74,5 @@ public class MonitorModel extends ModelCom {
     public void snapshot() {
         snapshot(null, null);
     }
-    
+
 }
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java
index 153b24e..c44aead 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/DatabaseRDF.java
@@ -30,7 +30,7 @@ public interface DatabaseRDF  {
     /**
      * @return the prefixes storage.
      */
-    public StoragePrefixes getPrefixes();
+    public StoragePrefixes getStoragePrefixes();
 
     /**
      * @return the {@link Transactional} for this database.
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/Prefixes.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/Prefixes.java
deleted file mode 100644
index 132825c..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/Prefixes.java
+++ /dev/null
@@ -1,39 +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.jena.dboe.storage;
-
-import org.apache.jena.graph.Node;
-import org.apache.jena.graph.NodeFactory;
-
-public class Prefixes {
-    //Distinguished nodes:
-    //  Default graph   : Quad.defaultGraphNodeGenerated would have been preferred.
-    //     For compatibility reasons, in TDB2, this is the URI <> (empty string).
-    //  "whole dataset" : <urn:x-arq:Dataset> (maybe reserved NodeFactory.createLiteral("") or URI <$>
-
-    // Name assigned to the default graph.
-    // For backwards compatibility of TDB2 , this an (unresolved) URI <>.
-    /** Name assigned to the default graph. */
-    public static Node nodeDefaultGraph = NodeFactory.createURI("");
-
-    /** Name for dataset prefixes. */
-    public static Node nodeDataset = nodeDefaultGraph; //NodeFactory.createURI("urn:x-arq:Dataset");
-
-
-}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java
index 3718558..3e343b6 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StoragePrefixes.java
@@ -21,8 +21,9 @@ import java.util.Iterator;
 
 import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.dboe.storage.prefixes.PrefixEntry;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
+import org.apache.jena.riot.system.Prefixes;
 
 /** Like PrefixMapping, only for a dataset which can have different prefix maps for different graphs.
  * There is a distinguished name {@linkplain Prefixes#nodeDataset} that means the prefixes
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java
index 905ed34..b28922f 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/StorageRDF.java
@@ -44,14 +44,14 @@ import org.apache.jena.sparql.core.Quad;
  * Various API operations work on "concrete" terms. For example, {@code add}. These are
  * marked "concrete operation" in their javadoc. They are not matching operations. A
  * concrete term is one of a URI, blank node or literal. It is not {@code null},
- * {@code Node#ANY} nor a named variable. Any {@code Triple} or {@code Quad} must be
+ * {@code Node.ANY} nor a named variable. Any {@code Triple} or {@code Quad} must be
  * composed of concrete terms.
  * <p>
  * A pattern operation is one where the arguments are concrete terms or wildcard
  * {@code ANY}. Such an operation will match zero or more triples or quads.
- * Any {@code Triple} or {@code Quad} can use {@code.ANY}.
+ * Any {@code Triple} or {@code Quad} can use {@code ANY}.
  * <p>Pattern operations do not match named variables.
- * Using {@code Node#ANY} rather than {@code null} is preferred in pattern operations but
+ * Using {@code Node.ANY} rather than {@code null} is preferred in pattern operations but
  * both are acceptable.
  */
 public interface StorageRDF {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapI.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapI.java
deleted file mode 100644
index 1a71853..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapI.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Licensed 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.
- *
- *  See the NOTICE file distributed with this work for additional
- *  information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.function.BiConsumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.riot.system.PrefixMap;
-import org.apache.jena.shared.PrefixMapping;
-
-/**
- * Interface for lightweight prefix maps as an implementation and storage view. This
- * is similar to {@link PrefixMapping} from Jena Core but it omits any reverse lookup
- * functionality (URI to prefix) and does not impose XML-specific rules (e.g. local
- * names must start with a letter).
- * <p>
- * The contract does not require an implementation to do any validation unlike the
- * Jena Core {@link PrefixMapping} which requires validation of prefixes.
- * </p>
- *
- * @implNote The package {@code org.apache.jena.dboe.storage.prefixes} in module
- *     {@code jena-dboe-storage} provides implementations that work with
- *     {@code StoragePrefixes} which is dataset provision of prefixes on per-named
- *     graph basis.
- */
-public interface PrefixMapI extends Iterable<PrefixEntry>, PrefixMap
-{
-    /** Returns the underlying mapping.
-     *  Do not modify this map, call interface operations.
-     */
-    @Override
-    public Map<String, String> getMapping();
-
-    /** Returns a copy of the underlying mapping */
-    @Override
-    public default Map<String, String> getMappingCopy() {
-        return this.stream().collect(Collectors.toMap((e) -> e.getPrefix(), (e) -> e.getUri()));
-    }
-
-    /* Return the underlying PrefixMapStorage - optional operation, may return null */
-    public StoragePrefixMap getPrefixMapStorage();
-
-    /** Add a prefix, overwrites any existing association */
-    @Override
-    public void add(String prefix, String iriString);
-
-    /** Merge one {@code PrefixMap} into another. */
-    @Override
-    public default void putAll(PrefixMap pmap) {
-        pmap.forEach(this::add);
-    }
-
-    @Override
-    public default void putAll(PrefixMapping pmap) {
-        pmap.getNsPrefixMap().forEach(this::add);
-    }
-
-    /** Merge all the entries from the map into this {@link PrefixMapI}. */
-    @Override
-    public default void putAll(Map<String, String> map) {
-        map.forEach(this::add);
-    }
-
-    /** Delete a prefix */
-    @Override
-    public void delete(String prefix);
-
-    /** Clear the prefix mappings. */
-    @Override
-    public void clear();
-
-    /** Get the mapping for a prefix (or return null). */
-    public String get(String prefix);
-
-    @Override
-    public boolean containsPrefix(String prefix);
-
-    /** Abbreviate an IRI or return null */
-    @Override
-    public default String abbreviate(String uriStr) {
-        return PrefixLib.abbreviate(this, uriStr);
-    }
-
-    /** Abbreviate an IRI or return null */
-    @Override
-    public default Pair<String, String> abbrev(String uriStr) {
-        return PrefixLib.abbrev(this, uriStr);
-    }
-
-    /** Expand a prefixed name, return null if it can't be expanded */
-    @Override
-    public default String expand(String prefixedName) {
-        return PrefixLib.expand(this, prefixedName);
-    }
-
-    /** Expand a prefix, return null if it can't be expanded */
-    @Override
-    public default String expand(String prefix, String localName)  {
-        return PrefixLib.expand(this, prefix, localName);
-    }
-
-    /** Iterator over all prefix entries. */
-    @Override
-    public default Iterator<PrefixEntry> iterator() {
-        return stream().iterator();
-    }
-
-    /** Apply a {@link BiConsumer}{@code <String, String>} to each entry in the PrefixMap. */
-    @Override
-    public abstract void forEach(BiConsumer<String, String> action);
-
-    /** Stream of over all prefix entries. */
-    public Stream<PrefixEntry> stream();
-
-    /** Stream all prefixes. */
-    public default Stream<String> prefixes() {
-        return stream().map(PrefixEntry::getPrefix);
-    }
-
-    /** Return whether there are any prefix mappings or not. */
-    @Override
-    public boolean isEmpty();
-
-    /** Return the number of mappings. */
-    @Override
-    public int size();
-}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapIOverStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapOverStorage.java
similarity index 67%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapIOverStorage.java
rename to jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapOverStorage.java
index aef2c55..9014785 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapIOverStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapOverStorage.java
@@ -17,18 +17,23 @@
 
 package org.apache.jena.dboe.storage.prefixes;
 
+import static org.apache.jena.riot.system.PrefixLib.canonicalPrefix;
+
 import java.util.Map;
 import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
-/** {@link PrefixMapI} implemented using {@link StoragePrefixMap} */
-public class PrefixMapIOverStorage implements PrefixMapI {
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapBase;
+import org.apache.jena.riot.system.Prefixes;
+
+/** {@link PrefixMap} implemented using {@link StoragePrefixMap} */
+public class PrefixMapOverStorage extends PrefixMapBase {
 
     private final StoragePrefixMap prefixes;
     protected StoragePrefixMap spm() { return prefixes; }
 
-    public PrefixMapIOverStorage(StoragePrefixMap storage) {
+    public PrefixMapOverStorage(StoragePrefixMap storage) {
         this.prefixes = storage;
     }
 
@@ -43,26 +48,21 @@ public class PrefixMapIOverStorage implements PrefixMapI {
     }
 
     @Override
-    public StoragePrefixMap getPrefixMapStorage() {
-        return prefixes;
-    }
-
-    @Override
     public void add(String prefix, String iriString) {
-        prefix = PrefixLib.canonicalPrefix(prefix);
+        prefix = canonicalPrefix(prefix);
         spm().put(prefix, iriString);
     }
 
     @Override
     public void delete(String prefix) {
-        prefix = PrefixLib.canonicalPrefix(prefix);
+        prefix = canonicalPrefix(prefix);
         spm().remove(prefix);
     }
 
-    @Override
-    public Stream<PrefixEntry> stream() {
-        return spm().stream();
-    }
+//    @Override
+//    public Stream<PrefixEntry> stream() {
+//        return spm().stream();
+//    }
 
     @Override
     public void forEach(BiConsumer<String, String> action) {
@@ -86,32 +86,18 @@ public class PrefixMapIOverStorage implements PrefixMapI {
 
     @Override
     public String get(String prefix) {
-        prefix = PrefixLib.canonicalPrefix(prefix);
+        prefix = canonicalPrefix(prefix);
         return spm().get(prefix);
     }
 
     @Override
     public boolean containsPrefix(String prefix) {
-        prefix = PrefixLib.canonicalPrefix(prefix);
+        prefix = canonicalPrefix(prefix);
         return spm().containsPrefix(prefix);
     }
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("{ ");
-        boolean first = true;
-
-        for ( PrefixEntry e : prefixes ) {
-            if ( first )
-                first = false;
-            else
-                sb.append(" ,");
-            sb.append(e.getPrefix());
-            sb.append(":=");
-            sb.append(e.getUri());
-        }
-        sb.append(" }");
-        return sb.toString();
+        return Prefixes.toString(this);
     }
 }
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java
index 2eed056..1fc98bb 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMapStorageSimple.java
@@ -22,6 +22,8 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.stream.Stream;
 
+import org.apache.jena.riot.system.PrefixEntry;
+
 public class PrefixMapStorageSimple implements StoragePrefixMap {
     private Map<String, String> map = new HashMap<>();
 
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMappingOverPrefixMapI.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMappingOverPrefixMapI.java
deleted file mode 100644
index b237b13..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixMappingOverPrefixMapI.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  Licensed 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.
- *
- *  See the NOTICE file distributed with this work for additional
- *  information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import java.util.Map;
-
-import org.apache.jena.atlas.lib.Pair;
-import org.apache.jena.shared.PrefixMapping;
-
-/**
- * Converted from PrefixMap (as used by the parsers) to Jena's interface PrefixMapping
- * (which is a bit XML-centric for historical reasons).
- */
-
-public class PrefixMappingOverPrefixMapI implements PrefixMapping {
-    private PrefixMapI pmap;
-
-    PrefixMappingOverPrefixMapI(PrefixMapI pmap) {
-        this.pmap = pmap;
-    }
-
-    @Override
-    public PrefixMapping setNsPrefix(String prefix, String uri) {
-        pmap.add(prefix, uri);
-        return this;
-    }
-
-    @Override
-    public PrefixMapping removeNsPrefix(String prefix) {
-        pmap.delete(prefix);
-        return this;
-    }
-
-    @Override
-    public PrefixMapping clearNsPrefixMap() {
-        pmap.clear();
-        return this;
-    }
-
-    @Override
-    public PrefixMapping setNsPrefixes(PrefixMapping other) {
-        return setNsPrefixes(other.getNsPrefixMap());
-    }
-
-    @Override
-    public PrefixMapping setNsPrefixes(Map<String, String> map) {
-        for ( Map.Entry<String, String> e : map.entrySet() ) {
-            String prefix = e.getKey();
-            String iriStr = e.getValue();
-            pmap.add(prefix, iriStr);
-        }
-        return this;
-    }
-
-    @Override
-    public PrefixMapping withDefaultMappings(PrefixMapping map) {
-        Map<String, String> emap = map.getNsPrefixMap();
-        for ( Map.Entry<String, String> e : emap.entrySet() ) {
-            String prefix = e.getKey();
-            String iriStr = e.getValue();
-            if ( !pmap.containsPrefix(prefix) )
-                pmap.add(prefix, iriStr);
-        }
-        return this;
-    }
-
-    @Override
-    public String getNsPrefixURI(String prefix) {
-        return pmap.get(prefix);
-    }
-
-    @Override
-    public String getNsURIPrefix(String uri) {
-        Pair<String, String> abbrev = pmap.abbrev(uri);
-        if ( abbrev == null )
-            return null;
-        return abbrev.getLeft();
-    }
-
-    @Override
-    public Map<String, String> getNsPrefixMap() {
-        return pmap.getMappingCopy();
-    }
-
-    @Override
-    public String expandPrefix(String prefixed) {
-        String str = pmap.expand(prefixed);
-        if ( str == null )
-            return prefixed;
-        return str;
-    }
-
-    @Override
-    public String shortForm(String uri) {
-        String s = pmap.abbreviate(uri);
-        if ( s == null )
-            return uri;
-        return s;
-    }
-
-    @Override
-    public String qnameFor(String uri) {
-        return pmap.abbreviate(uri);
-    }
-
-    @Override
-    public boolean hasNoMappings() {
-        return pmap.isEmpty();
-    }
-
-    @Override
-    public int numPrefixes() {
-        return pmap.size();
-    }
-
-    @Override
-    public PrefixMapping lock() {
-        return this;
-    }
-
-    @Override
-    public boolean samePrefixMappingAs(PrefixMapping other) {
-        return this.getNsPrefixMap().equals(other.getNsPrefixMap());
-    }
-
-    @Override
-    public String toString() {
-        return "PrefixMappingOverPrefixMapI:"+pmap.toString();
-    }
-}
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesDboeFactory.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesDboeFactory.java
new file mode 100644
index 0000000..6d14ce8
--- /dev/null
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesDboeFactory.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed 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.
+ *
+ *  See the NOTICE file distributed with this work for additional
+ *  information regarding copyright ownership.
+ */
+
+package org.apache.jena.dboe.storage.prefixes;
+
+import org.apache.jena.dboe.storage.StoragePrefixes;
+import org.apache.jena.dboe.storage.simple.StoragePrefixesSimpleMem;
+import org.apache.jena.riot.system.PrefixMap;
+
+/** Factory for DBOE impls */
+public class PrefixesDboeFactory
+{
+    /** Create a memory-backed {@link StoragePrefixes} */
+    public static StoragePrefixes newDatasetPrefixesMem()
+    { return new StoragePrefixesSimpleMem(); }
+
+//    /** Create {@link StoragePrefixMap} for the default graph of a {@link StoragePrefixes}. */
+//    public static StoragePrefixMap storagePrefixMapDataset(StoragePrefixes storage)
+//    { return StoragePrefixesView.viewDataset(storage); }
+
+    // Not needed for dataset prefixes.
+//    /** Create {@link StoragePrefixMap} for the named graph of a {@link StoragePrefixes}. */
+//    public static StoragePrefixMap storagePrefixMapGraph(StoragePrefixes storage, Node graphName)
+//    { return StoragePrefixesView.viewGraph(storage, graphName); }
+
+//    /** Create a memory-backed {@link StoragePrefixMap} */
+//    public static StoragePrefixMap newPrefixMapStorageMem()
+//    { return new PrefixMapStorageSimple(); }
+//
+    /** Create a {@link PrefixMap} over a {@link StoragePrefixMap}. */
+    public static PrefixMap newPrefixMap(StoragePrefixMap storage)
+    { return new PrefixMapOverStorage(storage); }
+}
+
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesFactory.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesFactory.java
deleted file mode 100644
index adf9012..0000000
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/PrefixesFactory.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed 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.
- *
- *  See the NOTICE file distributed with this work for additional
- *  information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.simple.StoragePrefixesMem;
-import org.apache.jena.graph.Node;
-import org.apache.jena.shared.PrefixMapping;
-
-/** Factory for some in-memory prefix impls */
-public class PrefixesFactory
-{
-    public static PrefixMapI createMem() { return newPrefixMap(newPrefixMapStorageMem() ); }
-
-    /** Create a memory-backed {@link StoragePrefixes} */
-    public static StoragePrefixes newDatasetPrefixesMem()
-    { return new StoragePrefixesMem(); }
-
-    /** Create {@link PrefixMapping} using a {@link PrefixMapI}. */
-    public static PrefixMapping newPrefixMappingOverPrefixMapI(PrefixMapI pmap)
-    { return new PrefixMappingOverPrefixMapI(pmap); }
-
-    /** Create {@link StoragePrefixMap} for the default graph of a {@link StoragePrefixes}. */
-    public static StoragePrefixMap storagePrefixMapDft(StoragePrefixes storage)
-    { return StoragePrefixesView.viewDefaultGraph(storage); }
-
-    /** Create {@link StoragePrefixMap} for the named graph of a {@link StoragePrefixes}. */
-    public static StoragePrefixMap storagePrefixMapGraph(StoragePrefixes storage, Node graphName)
-    { return StoragePrefixesView.viewGraph(storage, graphName); }
-
-    /** Create a memory-backed {@link StoragePrefixMap} */
-    public static StoragePrefixMap newPrefixMapStorageMem()
-    { return new PrefixMapStorageSimple(); }
-
-    /** Create a {@link PrefixMapI} over a {@link StoragePrefixMap}. */
-    public static PrefixMapI newPrefixMap(StoragePrefixMap storage)
-    { return new PrefixMapIOverStorage(storage); }
-
-    /** Return an empty immutable {@link PrefixMapI}. */
-    public static PrefixMapI empty() { return emptyPrefixMap; }
-
-    private static StoragePrefixes emptyDatasetPrefixes = new StoragePrefixesEmpty();
-    private static PrefixMapI emptyPrefixMap = newPrefixMap(storagePrefixMapDft(emptyDatasetPrefixes));
-}
-
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java
index 7e24c5f..7319a0f 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixMap.java
@@ -20,6 +20,8 @@ package org.apache.jena.dboe.storage.prefixes;
 import java.util.Iterator;
 import java.util.stream.Stream;
 
+import org.apache.jena.riot.system.PrefixEntry;
+
 /**
  * Storage-oriented abstraction for one set of prefix mappings.
  * The API features, such as expanding prefix names. are provided elsewhere.
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java
index 707a3ff..f839191 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesEmpty.java
@@ -24,6 +24,7 @@ import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.atlas.lib.Pair;
 import org.apache.jena.dboe.storage.StoragePrefixes;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
 
 public class StoragePrefixesEmpty implements StoragePrefixes {
 
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java
index 3b8b374..8236dbd 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/prefixes/StoragePrefixesView.java
@@ -25,6 +25,7 @@ import java.util.stream.Stream;
 import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.dboe.storage.StoragePrefixes;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
 import org.apache.jena.sparql.core.Quad;
 
 /**
@@ -36,10 +37,17 @@ public class StoragePrefixesView implements StoragePrefixMap
     private final StoragePrefixes dsgPrefixes;
     private final Node graphName;
 
-    public static StoragePrefixMap viewDefaultGraph(StoragePrefixes dsgPrefixes)
+    public static StoragePrefixMap viewDataset(StoragePrefixes dsgPrefixes)
     { return new StoragePrefixesView(dsgPrefixes, Quad.defaultGraphNodeGenerated); }
 
-    public static StoragePrefixMap viewGraph(StoragePrefixes dsgPrefixes, Node graphName)
+    // Used by tests only
+    // ** Not for dataset prefixes.
+    /*package*/ static StoragePrefixMap viewDefaultGraph(StoragePrefixes dsgPrefixes)
+    { return new StoragePrefixesView(dsgPrefixes, Quad.defaultGraphNodeGenerated); }
+
+    // Used by tests only
+    // ** Not for dataset prefixes.
+    /*package*/ static StoragePrefixMap viewGraph(StoragePrefixes dsgPrefixes, Node graphName)
     { return new StoragePrefixesView(dsgPrefixes, graphName); }
 
     private StoragePrefixesView(StoragePrefixes dsgPrefixes, Node graphName) {
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java
index 484adf6..0791314 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/SimpleDB.java
@@ -31,7 +31,7 @@ public class SimpleDB {
 
     public static class DatasetGraphSimpleDB extends DatasetGraphStorage {
         public DatasetGraphSimpleDB() {
-            super(new StorageMem(), new StoragePrefixesMem(), TransactionalLock.createMRSW());
+            super(new StorageSimpleMem(), new StoragePrefixesSimpleMem(), TransactionalLock.createMRSW());
         }
     }
 }
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesMem.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesSimpleMem.java
similarity index 71%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesMem.java
rename to jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesSimpleMem.java
index 1fb3db4..3dee0f7 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesMem.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StoragePrefixesSimpleMem.java
@@ -17,7 +17,7 @@
 
 package org.apache.jena.dboe.storage.simple;
 
-import static org.apache.jena.dboe.storage.prefixes.PrefixLib.canonicalGraphName;
+import static org.apache.jena.riot.system.PrefixLib.canonicalGraphName;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -25,23 +25,23 @@ import java.util.Map;
 
 import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.prefixes.PrefixEntry;
-import org.apache.jena.dboe.storage.prefixes.PrefixMapI;
-import org.apache.jena.dboe.storage.prefixes.PrefixesFactory;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixEntry;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapFactory;
+import org.apache.jena.riot.system.PrefixMapZero;
 
 /** In-memory dataset prefixes */
-
-public class StoragePrefixesMem implements StoragePrefixes {
+public class StoragePrefixesSimpleMem implements StoragePrefixes {
     // Effectively this a map of maps
-    private Map<Node, PrefixMapI> map = new HashMap<Node, PrefixMapI>();
+    private Map<Node, PrefixMap> map = new HashMap<Node, PrefixMap>();
 
-    public StoragePrefixesMem() {}
+    public StoragePrefixesSimpleMem() {}
 
     @Override
     public String get(Node graphNode, String prefix) {
         graphNode = canonicalGraphName(graphNode);
-        PrefixMapI pmap = map.get(graphNode);
+        PrefixMap pmap = map.get(graphNode);
         if ( pmap == null )
             return null;
         return pmap.get(prefix);
@@ -50,13 +50,13 @@ public class StoragePrefixesMem implements StoragePrefixes {
     @Override
     public Iterator<PrefixEntry> get(Node graphNode) {
         graphNode = canonicalGraphName(graphNode);
-        PrefixMapI pmap = map.get(graphNode);
+        PrefixMap pmap = map.get(graphNode);
         if ( pmap == null )
             return Iter.nullIterator();
-        if ( pmap.getPrefixMapStorage() != null )
-            //If implemented as a map of other-implementation PrefixMapI
-            return pmap.getPrefixMapStorage().iterator();
-        return pmap.iterator();
+        return
+            pmap.getMapping().entrySet().stream()
+                .map(e->PrefixEntry.create(e.getKey(), e.getValue()))
+                .iterator();
     }
 
     @Override
@@ -94,14 +94,14 @@ public class StoragePrefixesMem implements StoragePrefixes {
         return 0;
     }
 
-    protected PrefixMapI createPrefixMap() {
-        return PrefixesFactory.createMem();
+    protected PrefixMap createPrefixMap() {
+        return PrefixMapFactory.create();
     }
 
     // Access or return a fresh, empty.
-    private PrefixMapI accessForUpdate(Node graphName) {
+    private PrefixMap accessForUpdate(Node graphName) {
         graphName = canonicalGraphName(graphName);
-        PrefixMapI pmap = map.get(graphName);
+        PrefixMap pmap = map.get(graphName);
         if ( pmap == null ) {
             pmap = createPrefixMap();
             map.put(graphName, pmap);
@@ -110,11 +110,11 @@ public class StoragePrefixesMem implements StoragePrefixes {
     }
 
     // Access or return the empty, dummy mapping.
-    private PrefixMapI access(Node graphName) {
+    private PrefixMap access(Node graphName) {
         graphName = canonicalGraphName(graphName);
-        PrefixMapI pmap = map.get(graphName);
+        PrefixMap pmap = map.get(graphName);
         if ( pmap == null )
-            return PrefixesFactory.empty();
+            return PrefixMapZero.empty;
         return pmap;
     }
 }
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageMem.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageSimpleMem.java
similarity index 91%
rename from jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageMem.java
rename to jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageSimpleMem.java
index 32ffed2..1e30bc8 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageMem.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/simple/StorageSimpleMem.java
@@ -20,9 +20,9 @@ package org.apache.jena.dboe.storage.simple;
 import org.apache.jena.dboe.storage.StorageRDF;
 
 /** Very simple {@link StorageRDF} based on a set/scan implementation of tuple storage.*/
-public class StorageMem extends StorageTuples {
+public class StorageSimpleMem extends StorageTuples {
 
-    public StorageMem() {
+    public StorageSimpleMem() {
         super(new StorageTuplesN(3), new StorageTuplesN(4));
     }
 }
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
index 932600b..a671f2d 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/DatasetGraphStorage.java
@@ -23,6 +23,9 @@ import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.dboe.storage.DatabaseRDF;
 import org.apache.jena.dboe.storage.StoragePrefixes;
 import org.apache.jena.dboe.storage.StorageRDF;
+import org.apache.jena.dboe.storage.prefixes.PrefixesDboeFactory;
+import org.apache.jena.dboe.storage.prefixes.StoragePrefixMap;
+import org.apache.jena.dboe.storage.prefixes.StoragePrefixesView;
 import org.apache.jena.dboe.transaction.txn.IteratorTxnTracker;
 import org.apache.jena.dboe.transaction.txn.TransactionalSystem;
 import org.apache.jena.dboe.transaction.txn.TxnId;
@@ -31,7 +34,11 @@ import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.ReadWrite;
 import org.apache.jena.query.TxnType;
-import org.apache.jena.sparql.core.*;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.sparql.core.DatasetGraphBaseFind;
+import org.apache.jena.sparql.core.DatasetGraphTriplesQuads;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.core.Transactional;
 
 /** Alternative: DatasetGraph over RDFStorage, using DatasetGraphBaseFind
  *  Collapses DatasetGraphTriplesQuads into this adapter class.
@@ -70,16 +77,24 @@ public class DatasetGraphStorage extends DatasetGraphBaseFind implements Databas
 
     private final StorageRDF storage;
     private final StoragePrefixes prefixes;
+    private final PrefixMap prefixMap;
 
     public DatasetGraphStorage(StorageRDF storage, StoragePrefixes prefixes, Transactional transactional) {
         this.storage = storage;
         this.prefixes = prefixes;
+        StoragePrefixMap spm = StoragePrefixesView.viewDataset(prefixes);
+        this.prefixMap = PrefixesDboeFactory.newPrefixMap(spm);
         this.txn = transactional;
     }
 
-    @Override public StorageRDF getData()             { return storage; }
-    @Override public StoragePrefixes getPrefixes()    { return prefixes; }
-    @Override public Transactional getTransactional() { return txn; }
+    @Override public StorageRDF getData()               { return storage; }
+    @Override public StoragePrefixes getStoragePrefixes()    { return prefixes; }
+    @Override public Transactional getTransactional()   { return txn; }
+
+    @Override
+    public PrefixMap prefixes() {
+        return prefixMap;
+    }
 
     /**
      * Provide a general implementation of "listGraphNodes". Implementations may wish
diff --git a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java
index 9349571..e82ea3d 100644
--- a/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java
+++ b/jena-db/jena-dboe-storage/src/main/java/org/apache/jena/dboe/storage/system/GraphViewStorage.java
@@ -20,13 +20,7 @@ package org.apache.jena.dboe.storage.system;
 
 import org.apache.jena.dboe.storage.StoragePrefixes;
 import org.apache.jena.dboe.storage.StorageRDF;
-import org.apache.jena.dboe.storage.prefixes.PrefixMapI;
-import org.apache.jena.dboe.storage.prefixes.PrefixesFactory;
-import org.apache.jena.dboe.storage.prefixes.StoragePrefixMap;
-import org.apache.jena.dboe.storage.prefixes.StoragePrefixesView;
-import org.apache.jena.graph.GraphEvents;
 import org.apache.jena.graph.Node;
-import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.GraphView;
 import org.apache.jena.sparql.core.Quad;
@@ -34,9 +28,7 @@ import org.apache.jena.sparql.core.Quad;
 /**
  * General operations for graphs over datasets where the datasets are {@link StorageRDF} based.
  */
-// Can't merge into GraphView because of StoragePrefixes
 public class GraphViewStorage extends GraphView {
-    private final StoragePrefixMap  prefixes;
 
     public static GraphView createDefaultGraphStorage(DatasetGraph dsg, StoragePrefixes prefixes)
     { return new GraphViewStorage(dsg, Quad.defaultGraphNodeGenerated, prefixes); }
@@ -49,23 +41,5 @@ public class GraphViewStorage extends GraphView {
 
     protected GraphViewStorage(DatasetGraph dataset, Node graphName, StoragePrefixes prefixes) {
         super(dataset, graphName);
-        this.prefixes = StoragePrefixesView.viewGraph(prefixes, graphName);
-    }
-
-    @Override
-    protected PrefixMapping createPrefixMapping() {
-        PrefixMapI x = PrefixesFactory.newPrefixMap(prefixes);
-        PrefixMapping pm = PrefixesFactory.newPrefixMappingOverPrefixMapI(x);
-        return pm;
-    }
-
-    @Override
-    public void clear() {
-        // GraphView uses null.
-        Node gn = getGraphName();
-        if ( gn == null )
-            gn = Quad.defaultGraphNodeGenerated;
-        getDataset().deleteAny(gn, Node.ANY, Node.ANY, Node.ANY);
-        getEventManager().notifyEvent(this, GraphEvents.removeAll);
     }
 }
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java
index 8d527f0..0627dfc 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/AbstractTestDatasetPrefixesStorage.java
@@ -26,6 +26,7 @@ import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.dboe.storage.StoragePrefixes;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.riot.system.PrefixEntry;
 import org.junit.Test;
 
 public abstract class AbstractTestDatasetPrefixesStorage
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java
index 2e06284..abf2003 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TS_Prefixes.java
@@ -25,8 +25,6 @@ import org.junit.runners.Suite;
     TestDatasetPrefixesMem.class
     , TestPrefixMappingOverDatasetPrefixes.class
     , TestPrefixMappingOverDatasetPrefixes2.class
-    , TestPrefixMappingOverPrefixMap.class
-    , TestPrefixMapOverPrefixMapI.class
     , TestPrefixLib.class
 })
 
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java
index 40bb7f2..badca57 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestDatasetPrefixesMem.java
@@ -25,7 +25,7 @@ public class TestDatasetPrefixesMem extends AbstractTestDatasetPrefixesStorage {
 
     @Override
     protected StoragePrefixes create() {
-        prefixes = PrefixesFactory.newDatasetPrefixesMem();
+        prefixes = PrefixesDboeFactory.newDatasetPrefixesMem();
         return view();
     }
 
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java
index 9dfcff4..495fa33 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixLib.java
@@ -22,13 +22,14 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
 import org.apache.jena.atlas.lib.Pair;
+import org.apache.jena.riot.system.PrefixLib;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapFactory;
 import org.junit.Test;
 
 public class TestPrefixLib {
-    // abbreviate
-
-    private PrefixMapI create() {
-        return PrefixesFactory.createMem();
+    private PrefixMap create() {
+        return PrefixMapFactory.create();
     }
     protected String pref1  = "pref1";
     protected String pref1a = "pref1:";
@@ -36,7 +37,7 @@ public class TestPrefixLib {
 
     @Test
     public void abbreviate_1() {
-        PrefixMapI prefixes = create();
+        PrefixMap prefixes = create();
         prefixes.add(pref1, "http://example.net/ns#");
 
         String x = PrefixLib.abbreviate(prefixes, "http://example.net/ns#xyz");
@@ -45,7 +46,7 @@ public class TestPrefixLib {
 
     @Test
     public void abbreviate_2() {
-        PrefixMapI prefixes = create();
+        PrefixMap prefixes = create();
         prefixes.add(pref1, "http://example.net/ns#");
 
         String x = PrefixLib.abbreviate(prefixes, "http://other/ns#xyz");
@@ -54,7 +55,7 @@ public class TestPrefixLib {
 
     @Test
     public void abbrev_1() {
-        PrefixMapI prefixes = create();
+        PrefixMap prefixes = create();
         prefixes.add(pref1, "http://example.net/ns#");
 
         Pair<String, String> x = PrefixLib.abbrev(prefixes, "http://example.net/ns#xyz");
@@ -65,7 +66,7 @@ public class TestPrefixLib {
 
     @Test
     public void abbrev_2() {
-        PrefixMapI prefixes = create();
+        PrefixMap prefixes = create();
         prefixes.add(pref1, "http://example.net/ns#");
         Pair<String, String> x = PrefixLib.abbrev(prefixes, "http://other/ns#xyz");
         assertNull(x);
@@ -73,7 +74,7 @@ public class TestPrefixLib {
 
     @Test
     public void expand_1() {
-        PrefixMapI prefixes = create();
+        PrefixMap prefixes = create();
         prefixes.add(pref1, "http://example.net/ns#");
         String x = PrefixLib.expand(prefixes, "pref1:abc");
         assertEquals("http://example.net/ns#abc", x);
@@ -83,10 +84,9 @@ public class TestPrefixLib {
 
     @Test
     public void expand_2() {
-        PrefixMapI prefixes = create();
+        PrefixMap prefixes = create();
         prefixes.add(pref1, "http://example.net/ns#");
         String x2 = PrefixLib.expand(prefixes, "pref1z:abc");
         assertNull(x2);
     }
-
 }
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java
index d99db99..89021c7 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes.java
@@ -18,24 +18,27 @@
 package org.apache.jena.dboe.storage.prefixes;
 
 import org.apache.jena.dboe.storage.StoragePrefixes;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.graph.AbstractTestPrefixMappingView;
 
+/** AbstractTestPrefixMappingView for default graph. */
 public class TestPrefixMappingOverDatasetPrefixes extends AbstractTestPrefixMappingView
 {
     StoragePrefixes dsgprefixes;
 
     @Override
     protected PrefixMapping create() {
-        dsgprefixes = PrefixesFactory.newDatasetPrefixesMem();
+        dsgprefixes = PrefixesDboeFactory.newDatasetPrefixesMem();
         return view();
     }
 
     @Override
     protected PrefixMapping view() {
         StoragePrefixMap view = StoragePrefixesView.viewDefaultGraph(dsgprefixes);
-        PrefixMapI pmap = PrefixesFactory.newPrefixMap(view);
-        return PrefixesFactory.newPrefixMappingOverPrefixMapI(pmap);
+        PrefixMap pmap = PrefixesDboeFactory.newPrefixMap(view);
+        return Prefixes.adapt(pmap);
     }
 }
 
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java
index ca2d7c1..a2b3b54 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverDatasetPrefixes2.java
@@ -20,9 +20,12 @@ package org.apache.jena.dboe.storage.prefixes;
 import org.apache.jena.dboe.storage.StoragePrefixes;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.graph.AbstractTestPrefixMappingView;
 
+/** AbstractTestPrefixMappingView for named graph. */
 public class TestPrefixMappingOverDatasetPrefixes2 extends AbstractTestPrefixMappingView
 {
     static Node gn = NodeFactory.createURI("http://test/graphName");
@@ -30,15 +33,15 @@ public class TestPrefixMappingOverDatasetPrefixes2 extends AbstractTestPrefixMap
 
     @Override
     protected PrefixMapping create() {
-        dsgprefixes = PrefixesFactory.newDatasetPrefixesMem();
+        dsgprefixes = PrefixesDboeFactory.newDatasetPrefixesMem();
         return view();
     }
 
     @Override
     protected PrefixMapping view() {
         StoragePrefixMap view = StoragePrefixesView.viewGraph(dsgprefixes, gn);
-        PrefixMapI pmap = PrefixesFactory.newPrefixMap(view);
-        return PrefixesFactory.newPrefixMappingOverPrefixMapI(pmap);
+        PrefixMap pmap = PrefixesDboeFactory.newPrefixMap(view);
+        return Prefixes.adapt(pmap);
     }
 }
 
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverPrefixMap.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverPrefixMap.java
deleted file mode 100644
index 8a15086..0000000
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMappingOverPrefixMap.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Licensed 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.
- *
- *  See the NOTICE file distributed with this work for additional
- *  information regarding copyright ownership.
- */
-
-package org.apache.jena.dboe.storage.prefixes;
-
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.sparql.graph.AbstractTestPrefixMappingView;
-
-public class TestPrefixMappingOverPrefixMap extends AbstractTestPrefixMappingView
-{
-    // Via DatasetPrefixesStorageMem
-    PrefixMapI lastPrefixMap;
-
-    @Override
-    protected PrefixMapping create() {
-        lastPrefixMap = PrefixesFactory.createMem();
-        return view();
-    }
-
-    @Override
-    protected PrefixMapping view() {
-        return PrefixesFactory.newPrefixMappingOverPrefixMapI(lastPrefixMap);
-    }
-}
-
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java
index 438434b..bcbf9e0 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java
+++ b/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/storage/TestStorageSimple.java
@@ -18,12 +18,12 @@
 package org.apache.jena.dboe.storage.storage;
 
 import org.apache.jena.dboe.storage.StorageRDF;
-import org.apache.jena.dboe.storage.simple.StorageMem;
+import org.apache.jena.dboe.storage.simple.StorageSimpleMem;
 
 public class TestStorageSimple extends BaseTestStorageRDF {
 
     @Override
     protected StorageRDF create() {
-        return new StorageMem();
+        return new StorageSimpleMem();
     }
 }
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java
index 70bd0f2..8051325 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/BPTreeNodeMgr.java
@@ -164,17 +164,10 @@ public final class BPTreeNodeMgr extends PageBlockMgr<BPTreeNode>
         BPlusTreeParams params = bpTree.getParams();
 
         int ptrBuffLen = params.MaxPtr * params.getPtrLength();
-        // Only store the key part of records in a B+Tree block
-        // OLD - Node table has real value part - what's going on?
 
-        // [Issue:FREC]
-        // Allocate space for record, key and value, despite slight over
-        // allocation.
+        // Allocate space for record, key and value, despite slight over allocation.
         int recBuffLen = params.MaxRec * params.getRecordLength();
 
-        // [Issue:FREC] Should be: key space only.
-        // int recBuffLen = params.MaxRec * params.getKeyLength();
-
         n.id = block.getId().intValue();
         n.setParent(parent);
         n.setCount(count);
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java
index e99c51d..8a1d79e 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/bplustree/rewriter/BPTreeNodeBuilder.java
@@ -95,16 +95,9 @@ class BPTreeNodeBuilder implements Iterator<Pair<Integer, Record>> {
                 System.out.println("** Item: " + pair);
             Record r = pair.cdr();
 
-            // [Issue: FREC]
-            // The record buffer size is wrong.
-            // Writes the whole record, only need to write the key part.
-            // **** r = recordFactory.createKeyOnly(r);
-
-            // [Issue: FREC]
             // The record is key-only (which is correct) but until FREC fixed,
             // we need key,value
             r = recordFactory.create(r.getKey());
-            // -- End FREC
 
             // Always add - so ptrBuff is one ahead when we finish.
             // There is always one more ptr than record in a B+Tree node.
@@ -114,12 +107,6 @@ class BPTreeNodeBuilder implements Iterator<Pair<Integer, Record>> {
             // Add pointer.
             ptrBuff.add(pair.car());
 
-            // [Issue: FREC]
-            // Either test shoudl work but due to the missetting of record
-            // buffer size
-            // testing recBuff does not work.
-            // if ( recBuff.isFull() )
-            // .... test ptrBuff
             if ( ptrBuff.isFull() ) {
                 // End of this block.
 
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java
index 2d2fbdf..ce39743 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBinaryDataFile.java
@@ -53,7 +53,7 @@ public class TransBinaryDataFile extends TransactionalComponentLifecycle<TransBi
 
     // The current committed position and the limit as seen by readers.
     // This is also the abort point.
-    // Global.s
+    // Global.
     private final AtomicLong committedLength;
 
     // The state of the file visible outside the transaction.
@@ -164,7 +164,7 @@ public class TransBinaryDataFile extends TransactionalComponentLifecycle<TransBi
         if ( isWriteTxn() ) {
             long x = committedLength.get();
             // Internal consistency check.
-            // (Abort after commit would trigger the warning.) 
+            // (Abort after commit would trigger the warning.)
             if ( txnResetState.length != x )
                 Log.warn(this, format("Mismatch: state.length = %d,  committedLength = %d", txnResetState.length != x));
             binFile.truncate(x);
diff --git a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java
index ac32ef8..5a5629a 100644
--- a/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java
+++ b/jena-db/jena-dboe-trans-data/src/main/java/org/apache/jena/dboe/trans/data/TransBlob.java
@@ -37,17 +37,20 @@ import org.apache.jena.query.ReadWrite;
 public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobState> {
 
     // The last committed state.
+    // The current writer view is data state held by TransactionalComponentLifecycle.
     // Immutable ByteBuffer.
+
     private final AtomicReference<ByteBuffer> blobRef = new AtomicReference<>();
     private final BufferChannel file;
 
     static class BlobState {
-        boolean hasChanged = false;
-        ByteBuffer $txnBlob;
+        private boolean hasChanged = false;
+        private ByteBuffer $txnBlob;
 
         BlobState(ByteBuffer bb) {
             setByteBuffer(bb);
         }
+
         void setByteBuffer(ByteBuffer bb) {
             $txnBlob = bb;
             // Could compare - seems like added complexity.
@@ -73,7 +76,7 @@ public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobSta
         blobRef.set(blob);
     }
 
-    private void write() {
+    private void writeBlobState() {
         ByteBuffer blob = blobRef.get();
         blob.rewind();
         int x = blob.remaining();
@@ -152,7 +155,7 @@ public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobSta
     @Override
     public void finishRecovery() {
         if ( recoveryChange )
-            write();
+            writeBlobState();
     }
 
     @Override
@@ -186,9 +189,12 @@ public class TransBlob extends TransactionalComponentLifecycle<TransBlob.BlobSta
     protected void _commit(TxnId txnId, BlobState state) {
         if ( ! state.hasChanged )
             return;
-        // NB Change reference.
+        // Change reference.
         blobRef.set(state.getByteBuffer());
-        write();
+        // Write to persistent storage.
+        // It's in the journal already, and is rewritten from the journal
+        // if there is a crash at this point.
+        writeBlobState();
     }
 
     @Override
diff --git a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
index f5e4fe0..af9c45a 100644
--- a/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
+++ b/jena-db/jena-dboe-transaction/src/main/java/org/apache/jena/dboe/transaction/txn/Transaction.java
@@ -196,8 +196,6 @@ public class Transaction implements TransactionInfo {
     }
 
     public void end() {
-        // [1746]
-        // txnMgr.executeEnd(thus, ()->{});
         txnMgr.notifyEndStart(this);
         if ( isWriteTxn() && getState() == ACTIVE ) {
             //Log.warn(this, "Write transaction with no commit() or abort() before end()");
@@ -209,7 +207,6 @@ public class Transaction implements TransactionInfo {
         endInternal();
         txnMgr.notifyEndFinish(this);
         txnMgr = null;
-        //components.clear();
     }
 
     private void endInternal() {
@@ -240,14 +237,14 @@ public class Transaction implements TransactionInfo {
         setState(ACTIVE);
     }
 
-    /** Require a WRITE transaction - do not try to promote. */ 
+    /** Require a WRITE transaction - do not try to promote. */
     public void requireWriteTxn() {
         checkState(ACTIVE);
         if ( mode != ReadWrite.WRITE )
             throw new TransactionException("Not a write transaction");
     }
 
-    /** Require a WRITE transaction - includes trying to promote. */ 
+    /** Require a WRITE transaction - includes trying to promote. */
     public void ensureWriteTxn() {
         checkState(ACTIVE);
         if ( mode != ReadWrite.WRITE ) {
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java
index 659805b..54b2ab8 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInline.java
@@ -23,13 +23,13 @@ import java.util.List;
 
 import org.apache.jena.atlas.lib.tuple.Tuple;
 import org.apache.jena.atlas.lib.tuple.TupleFactory;
-import org.apache.jena.dboe.storage.Prefixes;
 import org.apache.jena.dboe.transaction.txn.Transaction;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.riot.lang.StreamRDFCounting;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.riot.system.StreamRDF;
 import org.apache.jena.sparql.core.Quad;
 import org.apache.jena.tdb2.loader.BulkLoaderException;
@@ -72,7 +72,7 @@ public class DataToTuplesInline implements StreamRDFCounting, BulkStartFinish {
         this.dest4 = dest4;
         this.output = output;
         this.nodeTable = dsgtdb.getTripleTable().getNodeTupleTable().getNodeTable();
-        this.prefixes = (StoragePrefixesTDB)dsgtdb.getPrefixes();
+        this.prefixes = (StoragePrefixesTDB)dsgtdb.getStoragePrefixes();
         NodeTable nodeTable2 = dsgtdb.getQuadTable().getNodeTupleTable().getNodeTable();
         if ( nodeTable != nodeTable2 )
             throw new BulkLoaderException("Different node tables");
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java
index 01503a0..2ebfd28 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/DataToTuplesInlineSingle.java
@@ -23,13 +23,13 @@ import java.util.function.Consumer;
 
 import org.apache.jena.atlas.lib.tuple.Tuple;
 import org.apache.jena.atlas.lib.tuple.TupleFactory;
-import org.apache.jena.dboe.storage.Prefixes;
 import org.apache.jena.dboe.transaction.txn.Transaction;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.riot.lang.StreamRDFCounting;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.riot.system.StreamRDF;
 import org.apache.jena.sparql.core.Quad;
 import org.apache.jena.tdb2.loader.BulkLoaderException;
@@ -73,7 +73,7 @@ public class DataToTuplesInlineSingle implements StreamRDFCounting, BulkStartFin
         this.dest4 = dest4;
         this.output = output;
         this.nodeTable = dsgtdb.getTripleTable().getNodeTupleTable().getNodeTable();
-        this.prefixes = (StoragePrefixesTDB)dsgtdb.getPrefixes();
+        this.prefixes = (StoragePrefixesTDB)dsgtdb.getStoragePrefixes();
         NodeTable nodeTable2 = dsgtdb.getQuadTable().getNodeTupleTable().getNodeTable();
         if ( nodeTable != nodeTable2 )
             throw new BulkLoaderException("Different node tables");
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java
index a5310dc..4c13453 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/LoaderMain.java
@@ -139,7 +139,7 @@ public class LoaderMain extends LoaderBase implements DataLoader {
      * Used by {@link InputStage#MULTI}.
      */
     private static StreamRDFCounting executeData(LoaderPlan loaderPlan, DatasetGraphTDB dsgtdb, Map<String, TupleIndex> indexMap, List<BulkStartFinish> dataProcess, MonitorOutput output) {
-        StoragePrefixesTDB dps = (StoragePrefixesTDB)dsgtdb.getPrefixes();
+        StoragePrefixesTDB dps = (StoragePrefixesTDB)dsgtdb.getStoragePrefixes();
         PrefixHandlerBulk prefixHandler = new PrefixHandlerBulk(dps, output);
         dataProcess.add(prefixHandler);
 
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java
index d79d809..6316a4c 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/loader/main/PrefixHandlerBulk.java
@@ -18,12 +18,12 @@
 
 package org.apache.jena.tdb2.loader.main;
 
-import org.apache.jena.dboe.storage.Prefixes;
 import org.apache.jena.dboe.transaction.txn.Transaction;
 import org.apache.jena.dboe.transaction.txn.TransactionCoordinator;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
 import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.tdb2.loader.base.BulkStartFinish;
 import org.apache.jena.tdb2.loader.base.CoLib;
 import org.apache.jena.tdb2.loader.base.MonitorOutput;
@@ -69,7 +69,7 @@ public class PrefixHandlerBulk implements BulkStartFinish {
         return (prefix, uriStr) -> {
             Node p = NodeFactory.createLiteral(prefix);
             Node u = NodeFactory.createURI(uriStr);
-            prefixes.add_ext(Prefixes.nodeDefaultGraph, prefix, uriStr);
+            prefixes.add_ext(Prefixes.nodeDataset, prefix, uriStr);
         };
     }
 }
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
index 8d13680..4d44577 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphSwitchable.java
@@ -26,6 +26,7 @@ import org.apache.jena.atlas.lib.CacheFactory;
 import org.apache.jena.dboe.base.file.Location;
 import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
+import org.apache.jena.riot.system.PrefixMap;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.DatasetGraphWrapper;
 import org.apache.jena.sparql.core.Quad;
@@ -45,6 +46,7 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
     // Null for in-memory datasets.
     private final Path basePath;
     private final Location location;
+    private final PrefixMapSwitchable prefixes;
 
     public DatasetGraphSwitchable(Path base, Location location, DatasetGraph dsg) {
         // Don't use the slot in datasetGraphWrapper - use the AtomicReference
@@ -52,6 +54,7 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
         dsgx.set(dsg);
         this.basePath = base;
         this.location = location;
+        this.prefixes = new PrefixMapSwitchable(this);
     }
 
     /** Is this {@code DatasetGraphSwitchable} just a holder for a {@code DatasetGraph}?
@@ -78,6 +81,12 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
         return dsgx.getAndSet(dsg);
     }
 
+    @Override
+    public PrefixMap prefixes() {
+        return prefixes;
+    }
+
+
     /** Don't do anything on close.
      *  This would not be safe across switches.
      */
@@ -88,7 +97,8 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
 //    @Override
 //    public void sync() { }
 
-    /** If and only if the current value is the given old value, set the base {@link DatasetGraph}
+    /**
+     * If and only if the current value is the given old value, set the base {@link DatasetGraph}
      * Returns true if a swap happened.
      */
     public boolean change(DatasetGraph oldDSG, DatasetGraph newDSG) {
@@ -107,7 +117,7 @@ public class DatasetGraphSwitchable extends DatasetGraphWrapper
     public Graph getUnionGraph() {
         return GraphViewSwitchable.createUnionGraphSwitchable(this);
     }
-    
+
 //    private Cache<Node, Graph> ngCache = CacheFactory.createCache(10);
     private Cache<Node, Graph> ngCache = CacheFactory.createOneSlotCache();
 
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
index 5ba2771..08a7486 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/DatasetGraphTDB.java
@@ -119,17 +119,17 @@ public class DatasetGraphTDB extends DatasetGraphStorage
 
     public GraphTDB getDefaultGraphTDB() {
         checkNotClosed();
-        return GraphTDB.tdb_createDefaultGraph(this, getPrefixes());
+        return GraphTDB.tdb_createDefaultGraph(this, getStoragePrefixes());
     }
 
     public GraphTDB getGraphTDB(Node graphNode) {
         checkNotClosed();
-        return GraphTDB.tdb_createNamedGraph(this, graphNode, getPrefixes());
+        return GraphTDB.tdb_createNamedGraph(this, graphNode, getStoragePrefixes());
     }
 
     public GraphTDB getUnionGraphTDB() {
         checkNotClosed();
-        return GraphTDB.tdb_createUnionGraph(this, getPrefixes());
+        return GraphTDB.tdb_createUnionGraph(this, getStoragePrefixes());
     }
 
     @Override
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java
index f200ca7..51d5e70 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphTDB.java
@@ -30,6 +30,7 @@ import org.apache.jena.dboe.storage.system.GraphViewStorage;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.core.Quad;
 import org.apache.jena.tdb2.TDBException;
 import org.apache.jena.tdb2.store.nodetupletable.NodeTupleTable;
@@ -67,6 +68,11 @@ public class GraphTDB extends GraphViewStorage {
         return getDSG().chooseNodeTupleTable(getGraphName());
     }
 
+    @Override
+    public PrefixMapping getPrefixMapping() {
+        return createPrefixMapping();
+    }
+
     // Better ways to execute.
 
     @Override
@@ -114,7 +120,7 @@ public class GraphTDB extends GraphViewStorage {
         return WrappedIterator.createNoRemove(iter);
     }
 
-    
+
     @Override
     public final void sync() {
     }
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
index c991b91..0f0610a 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/GraphViewSwitchable.java
@@ -18,20 +18,16 @@
 
 package org.apache.jena.tdb2.store;
 
-import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.prefixes.*;
 import org.apache.jena.graph.Graph;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
-import org.apache.jena.shared.PrefixMapping;
-import org.apache.jena.shared.impl.PrefixMappingImpl;
 import org.apache.jena.sparql.core.GraphView;
 import org.apache.jena.sparql.core.Quad;
 import org.apache.jena.util.iterator.ExtendedIterator;
 
 /**
  * A GraphView that is sensitive to {@link DatasetGraphSwitchable} switching.
- * This ensures that a graph object remains valid as the {@link DatasetGraphSwitchable} switchs.
+ * This ensures that a graph object remains valid as the {@link DatasetGraphSwitchable} switches.
  */
 public class GraphViewSwitchable extends GraphView {
     public static GraphViewSwitchable createDefaultGraphSwitchable(DatasetGraphSwitchable dsg)
@@ -51,25 +47,8 @@ public class GraphViewSwitchable extends GraphView {
         this.dsgx = dsg;
     }
 
-    // Some operations need to be caught and switched here, some don't 
+    // Some operations need to be caught and switched here, some don't
     // Add/delete get switched because the DSG of the super class GraphView switches.
-    // But we need a switching PrefixMapping.
-    // We need a TransactionHandler.
-    
-    @Override
-    protected PrefixMapping createPrefixMapping() {
-        Node gn = super.getGraphName();
-        if ( gn == Quad.defaultGraphNodeGenerated )
-            gn = null;
-        if ( Quad.isUnionGraph(gn) ) {
-            // [TDBX] Union
-            // Read-only wrapper would be better than a copy.
-            PrefixMapping pmap = new PrefixMappingImpl();
-            pmap.setNsPrefixes(prefixMapping(null));
-            return pmap;
-        }
-        return prefixMapping(gn);
-    }
 
     /** Return the {@link DatasetGraphSwitchable} we are viewing. */
     @Override
@@ -77,7 +56,7 @@ public class GraphViewSwitchable extends GraphView {
         return getx();
     }
 
-    /** 
+    /**
      *  Return the {@code Graph} from the underlying DatasetGraph
      *  Do not hold onto this reference across switches.
      */
@@ -98,48 +77,20 @@ public class GraphViewSwitchable extends GraphView {
     public void clear() {
         getBaseGraph().clear();
     }
-    
+
     // Operations that GraphView provides but where the underlying switchable graph may be do better.
     // As the underlying graph is not a subclass, it can not override by inheritance.
-    
+
     @Override
-    public void sync() { } 
-   
+    public void sync() { }
+
     @Override
     protected ExtendedIterator<Triple> graphBaseFind(Node s, Node p, Node o) {
         // This breaks the cycle because super.find will call here again.
-        return getBaseGraph().find(s, p, o); 
+        return getBaseGraph().find(s, p, o);
     }
 
-    // Not needed here because the union graph is a graph(unionGraph) so that redirects on use.
-    // graphUnionFind(Node s, Node p, Node o) : see GraphTDB
-    
     private DatasetGraphTDB getDSG() {
         return ((DatasetGraphTDB)(getx().get()));
     }
-
-    private PrefixMapping prefixMapping(Node graphName) {
-        PrefixMapI pmap = new PrefixMapTDB2(graphName);
-        return PrefixesFactory.newPrefixMappingOverPrefixMapI(pmap);
-    }
-
-    class PrefixMapTDB2 extends PrefixMapIOverStorage {
-        
-        private final Node graphName;
-    
-        PrefixMapTDB2(Node graphName) {
-            super(null);
-            graphName = PrefixLib.canonicalGraphName(graphName);
-            this.graphName = graphName;
-        }
-    
-        @Override
-        protected StoragePrefixMap spm() {
-            StoragePrefixes prefixes = getDSG().getPrefixes();
-            StoragePrefixMap view = PrefixLib.isNodeDefaultGraph(graphName)
-                ? StoragePrefixesView.viewDefaultGraph(prefixes)
-                : StoragePrefixesView.viewGraph(prefixes, graphName);
-            return view;
-        }
-    }
 }
diff --git a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMapOverPrefixMapI.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/PrefixMapSwitchable.java
similarity index 54%
copy from jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMapOverPrefixMapI.java
copy to jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/PrefixMapSwitchable.java
index 12e5865..7e02f9d 100644
--- a/jena-db/jena-dboe-storage/src/test/java/org/apache/jena/dboe/storage/prefixes/TestPrefixMapOverPrefixMapI.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/PrefixMapSwitchable.java
@@ -16,16 +16,31 @@
  * limitations under the License.
  */
 
-package org.apache.jena.dboe.storage.prefixes;
+package org.apache.jena.tdb2.store;
 
-import org.apache.jena.riot.system.AbstractTestPrefixMap;
 import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.PrefixMapWrapper;
 
-public class TestPrefixMapOverPrefixMapI extends AbstractTestPrefixMap {
+/**
+ * {@link PrefixMap} that goes to the current DatasetGraphTDB prefixes.
+ */
+public class PrefixMapSwitchable extends PrefixMapWrapper {
+    // PrefixMapProxy not needed. It calls a Supplier
+    // but in TDB2
 
-    @Override
-    protected PrefixMap getPrefixMap() {
-        PrefixMapI pmapi = PrefixesFactory.createMem();
-        return pmapi;
+    private final DatasetGraphSwitchable dsgx;
+    protected DatasetGraphSwitchable getx() { return dsgx; }
+
+    protected PrefixMapSwitchable(DatasetGraphSwitchable dsg) {
+        // We override get() so don't set the wrapped object
+        super(null);
+        this.dsgx = dsg;
     }
+
+    @Override
+    protected PrefixMap getR() { return dsgx.get().prefixes(); }
+
+    @Override
+    protected PrefixMap getW() { return dsgx.get().prefixes(); }
+
 }
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java
index e431738..007afc7 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/store/StoragePrefixesTDB.java
@@ -18,6 +18,8 @@
 
 package org.apache.jena.tdb2.store;
 
+import static org.apache.jena.riot.system.PrefixLib.canonicalGraphName;
+
 import java.util.Iterator;
 import java.util.List;
 
@@ -25,13 +27,12 @@ import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.atlas.lib.tuple.Tuple;
 import org.apache.jena.dboe.base.record.RecordFactory;
 import org.apache.jena.dboe.storage.StoragePrefixes;
-import org.apache.jena.dboe.storage.prefixes.PrefixEntry;
-import org.apache.jena.dboe.storage.prefixes.PrefixLib;
 import org.apache.jena.dboe.transaction.txn.Transaction;
 import org.apache.jena.dboe.transaction.txn.TransactionException;
 import org.apache.jena.dboe.transaction.txn.TransactionalSystem;
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.riot.system.PrefixEntry;
 import org.apache.jena.tdb2.store.nodetupletable.NodeTupleTable;
 
 public class StoragePrefixesTDB implements StoragePrefixes {
@@ -52,7 +53,7 @@ public class StoragePrefixesTDB implements StoragePrefixes {
     @Override
     public String get(Node graphNode, String prefix) {
         requireTxn();
-        graphNode = PrefixLib.canonicalGraphName(graphNode);
+        graphNode = canonicalGraphName(graphNode);
         Node p = NodeFactory.createLiteral(prefix);
         Iterator<Tuple<Node>> iter = prefixTable.find(graphNode, p, null);
         if ( ! iter.hasNext() )
@@ -65,7 +66,7 @@ public class StoragePrefixesTDB implements StoragePrefixes {
     @Override
     public Iterator<PrefixEntry> get(Node graphNode) {
         requireTxn();
-        graphNode = PrefixLib.canonicalGraphName(graphNode);
+        graphNode = canonicalGraphName(graphNode);
         Iterator<Tuple<Node>> iter = prefixTable.find(graphNode, null, null);
         return Iter.iter(iter).map(t->PrefixEntry.create(t.get(1).getLiteralLexicalForm(), t.get(2).getURI()));
     }
@@ -83,12 +84,12 @@ public class StoragePrefixesTDB implements StoragePrefixes {
         add_ext(graphNode, prefix, iriStr);
     }
 
-    /** Add without checks - used by the bulkloader when it takes control of the transaction. */  
+    /** Add without checks - used by the bulkloader when it takes control of the transaction. */
     public void add_ext(Node graphNode, String prefix, String iriStr) {
         // By exposing the operation here, we use the rules (e.g. canonicalGraphName) on
         // added prefixes. Going to the NodeTupleTable prefixTable would skip those and
         // require node creation in the caller as well.
-        graphNode = PrefixLib.canonicalGraphName(graphNode);
+        graphNode = canonicalGraphName(graphNode);
         Node p = NodeFactory.createLiteral(prefix);
         Node u = NodeFactory.createURI(iriStr);
         // Delete any existing old mapping of prefix.
@@ -112,10 +113,10 @@ public class StoragePrefixesTDB implements StoragePrefixes {
         remove_ext(g, p, u);
     }
 
-    /** Remove without checks - used by the bulkloader when it takes control of the transaction. */  
+    /** Remove without checks - used by the bulkloader when it takes control of the transaction. */
     private void remove_ext(Node g, Node p, Node u) {
         // See add_ext
-        g = PrefixLib.canonicalGraphName(g);
+        g = canonicalGraphName(g);
         Iterator<Tuple<Node>> iter = prefixTable.find(g, p, u);
         List<Tuple<Node>> list = Iter.toList(iter);    // Materialize.
         for ( Tuple<Node> tuple : list )
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java
index 431ed60..410b153 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/AbstractTestGraphsTDB.java
@@ -24,8 +24,6 @@ import org.apache.jena.sparql.graph.GraphsTests;
 import org.apache.jena.tdb2.sys.SystemTDB;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
 
 public abstract class AbstractTestGraphsTDB extends GraphsTests
 {
@@ -38,14 +36,4 @@ public abstract class AbstractTestGraphsTDB extends GraphsTests
     }
 
     @AfterClass public static void afterClass() {  SystemTDB.setDefaultReorderTransform(reorder); }
-
-    // These don't pass ... not quite clear if the test is right.  Investigate.
-
-    @Override
-    @Ignore @Test public void graph_count5() {}
-
-    @Override
-    @Ignore @Test public void graph_count6() {}
-
-
 }
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java
index 1fc4f06..32a335f 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/graph/TestDatasetGraphTDB.java
@@ -24,7 +24,6 @@ import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.tdb2.junit.TL;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Test;
 
 // Quad tests
 public class TestDatasetGraphTDB extends AbstractDatasetGraphTests
@@ -44,10 +43,4 @@ public class TestDatasetGraphTDB extends AbstractDatasetGraphTests
     protected DatasetGraph emptyDataset() {
         return dsg;
     }
-
-    @Override
-    // Empty graph tests: N/A
-    @Test public void graph_01()
-    {}
-
 }
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
index 55ee251..2abb355 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/store/TestDatasetTDB.java
@@ -110,7 +110,8 @@ public class TestDatasetTDB
         load1(m);
         Model m2 = ds.getNamedModel("http://example/graph/");
         String x = m2.expandPrefix(":x");
-        assertEquals(x, ":x");
+        // Shared prefixes.
+        assertEquals("http://example/x", x);
     }
 
     @Test public void query1()
diff --git a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
index 0e7760b..c3b0631 100644
--- a/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
+++ b/jena-db/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestDatabaseOps.java
@@ -137,7 +137,7 @@ public class TestDatabaseOps
         //         at org.apache.jena.tdb2.sys.TestDatabaseOps.compact_prefixes_3(TestDatabaseOps.java:135)
         // (and now JDK15).
         // The NPE is from java.nio.file.Files.provider.
-        // It does not fail anywhere else ecept at ASF and it does not always fail.
+        // It does not fail anywhere else except at ASF and it does not always fail.
         // This seems to be on specific, maybe just on, Jenkins build node.
         try {
             compact_prefixes_3_test();
@@ -162,8 +162,17 @@ public class TestDatabaseOps
         DatasetGraph dsg1 = dsgs.get();
         Location loc1 = ((DatasetGraphTDB)dsg1).getLocation();
 
+        // Before
+        int x1 = Txn.calculateRead(dsg, ()->dsg.prefixes().size());
+        assertTrue("Prefxies count", x1 > 0);
+
         DatabaseMgr.compact(dsgs); // HERE
 
+        // After
+        int x2 = Txn.calculateRead(dsg, ()->dsg.prefixes().size());
+
+        assertEquals("Before and after prefix count", x1, x2);
+
         Graph g2 = dsgs.getDefaultGraph();
 
         Txn.executeRead(dsgs, ()-> {
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java
index 2dd08b7..6565774 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/Converters.java
@@ -6,9 +6,9 @@
  * 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.
@@ -47,11 +47,11 @@ import org.apache.jena.sparql.util.NodeFactoryExtra;
  * types used in Query and Update construction.
  */
 public class Converters {
-	
-	private Converters() { 
+
+	private Converters() {
 		// do not make instance
 	}
-	
+
 	/**
 	 * Converts any Node_Variable nodes into Var nodes.
 	 * @param n the node to check
@@ -65,7 +65,7 @@ public class Converters {
 		}
 		return n;
 	}
-	
+
 	/**
 	 * Creates a literal from an object.
 	 * If the object type is registered with the TypeMapper the associated literal
@@ -76,17 +76,17 @@ public class Converters {
 	 * @throws IllegalArgumentException if object type is not registered.
 	 */
 	public static Node makeLiteral(Object o) {
-		
+
 		RDFDatatype dt = TypeMapper.getInstance().getTypeByValue( o );
 		if (dt == null) {
 			String msg = "No TypeDef defined for %s. Use TypeMapper.getInstance().register() to "
 					+ "register one or use makeLiteral() method in query builder instance.";
 			throw new IllegalArgumentException( String.format( msg, o.getClass()));
-		} 
+		}
 		return NodeFactory.createLiteral(LiteralLabelFactory.createTypedLiteral(o));
 
 	}
-	
+
 	/**
 	 * Creates a literal from the value and type URI.
 	 * There are several possible outcomes:
@@ -98,10 +98,10 @@ public class Converters {
 	 * will return a proper object.
 	 * </li><li>
 	 * If the URI is unregistered a Datatype is created but not registered
-	 * with the TypeMapper.  The resulting node is properly constructed for 
-	 * used in output serialization, queries, or updates.  Calling 
+	 * with the TypeMapper.  The resulting node is properly constructed for
+	 * used in output serialization, queries, or updates.  Calling
 	 * {@code getLiteralValue()} on the returned node will throw DatatypeFormatException.
-	 * Note that if {@code JenaParameters.enableEagerLiteralValidation} is true the 
+	 * Note that if {@code JenaParameters.enableEagerLiteralValidation} is true the
 	 * DatatypeFormatException will be thrown by this method.
 	 * </li><li>
 	 * If the URI is registered but the value is not a proper lexical form
@@ -124,7 +124,7 @@ public class Converters {
 			public boolean isValidValue(Object valueForm) {
 				return false;
 			}
-			
+
 			@Override
 			public Object parse(String lexicalForm) throws DatatypeFormatException {
 				RDFDatatype dt = TypeMapper.getInstance().getTypeByName(uri);
@@ -134,7 +134,7 @@ public class Converters {
 				}
 				return dt.parse( lexicalForm );
 		    }
-			
+
 		};
 		} else {
 			oValue = dt.parse( value );
@@ -142,7 +142,7 @@ public class Converters {
 		LiteralLabel ll = LiteralLabelFactory.createByValue( oValue, null, dt );
 		return NodeFactory.createLiteral(ll);
 	}
-	
+
 	/**
 	 * Makes a node from an object while using the associated prefix mapping.
 	 * <ul>
@@ -172,8 +172,7 @@ public class Converters {
 		}
 		if (o instanceof String) {
 			try {
-				return checkVar(NodeFactoryExtra.parseNode((String) o, PrefixMapFactory
-						.createForInput(pMapping)));
+				return checkVar(NodeFactoryExtra.parseNode((String) o, PrefixMapFactory.create(pMapping)));
 			} catch (final RiotException e) {
 				// expected in some cases -- do nothing
 			}
@@ -198,7 +197,7 @@ public class Converters {
 	 * @param o the object that should be interpreted as a path or a node.
 	 * @param pMapping the prefix mapping to resolve path or node with
 	 * @return the Path or Node
-	 * @see #makeLiteral(Object) 
+	 * @see #makeLiteral(Object)
 	 */
 	public static Object makeNodeOrPath(Object o, PrefixMapping pMapping)
 	{
@@ -217,7 +216,7 @@ public class Converters {
 			return checkVar((Node)o);
 		}
 		if (o instanceof String) {
-			try {			
+			try {
 				final Path p = PathParser.parse((String) o, pMapping);
 				if (p instanceof P_Link)
 				{
@@ -225,14 +224,14 @@ public class Converters {
 				}
 				return p;
 			}
-			
+
 			catch (final Exception e)
 			{
 				// expected in some cases -- do nothing
 			}
 
 		}
-		return makeNode( o, pMapping );		
+		return makeNode( o, pMapping );
 	}
 
 	/**
@@ -251,7 +250,7 @@ public class Converters {
 	 * <li>For all other objects will return the "?" prefixed to the toString()
 	 * value.</li>
 	 * </ul>
-	 * 
+	 *
 	 * @param o
 	 *            The object to convert.
 	 * @return the Var value.
@@ -283,24 +282,24 @@ public class Converters {
 	/**
 	 * A convenience method to quote a string.
 	 * @param q the string to quote.
-	 * 
-	 * Will use single quotes if there are no single quotes in the string or if the 
+	 *
+	 * Will use single quotes if there are no single quotes in the string or if the
 	 * double quote is before the single quote in the string.
-	 * 
+	 *
 	 * Will use double quote otherwise.
-	 * 
-	 * @return the quoted string. 
+	 *
+	 * @return the quoted string.
 	 */
 	public static String quoted(String q) {
 		int qt = q.indexOf('"');
 		int sqt = q.indexOf("'");
-		if (qt == -1) { 
+		if (qt == -1) {
 			qt = Integer.MAX_VALUE;
 		}
 		if (sqt == -1) {
 			sqt = Integer.MAX_VALUE;
 		}
-		
+
 		if (qt <= sqt)
 		{
 			return String.format( "'%s'", q);
@@ -328,7 +327,7 @@ public class Converters {
 			if (o == null)
 			{
 				values.add( null );
-			} else 
+			} else
 			{
 				values.add( makeNode( o, prefixMapping ));
 			}
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java
index 8f3097f..2efe240 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/ctl/ActionPing.java
@@ -35,7 +35,7 @@ import org.apache.jena.web.HttpSC;
 
 /** The ping servlet provides a low cost, uncached endpoint that can be used
  * to determine if this component is running and responding.  For example,
- * a nagios check should use this endpoint.
+ * a Nagios check should use this endpoint.
  */
 public class ActionPing extends HttpServlet
 {
@@ -54,7 +54,6 @@ public class ActionPing extends HttpServlet
         doCommon(req, resp);
     }
 
-
     @Override
     protected void doHead(HttpServletRequest req, HttpServletResponse resp) {
         doCommon(req, resp);
diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java
index 5d3cd21..6c72a5a 100644
--- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java
+++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/Dispatcher.java
@@ -190,20 +190,6 @@ public class Dispatcher {
         return processor;
     }
 
-
-
-//    // Find the endpoints for an operation.
-//    // This is GSP_R/GSP_RW aware.
-//    // If asked for GSP_R and there are no endpoints for GSP_R, try GSP_RW.
-//    private static Collection<Endpoint> getEndpoints(DataService dataService, Operation operation) {
-//        Collection<Endpoint> x = dataService.getEndpoints(operation);
-//        if ( x == null || x.isEmpty() ) {
-//            if ( operation == GSP_R ) // [GSP Promote]
-//                x = dataService.getEndpoints(GSP_RW);
-//        }
-//        return x;
-//    }
-
     /**
      * Choose an endpoint.
      * An endpoint is a name and an operation.
diff --git a/jena-tdb/src/test/java/org/apache/jena/tdb/graph/TS_Graph.java b/jena-integration-tests/src/test/java/org/apache/jena/test/TC_Integration.java
similarity index 63%
copy from jena-tdb/src/test/java/org/apache/jena/tdb/graph/TS_Graph.java
copy to jena-integration-tests/src/test/java/org/apache/jena/test/TC_Integration.java
index 9353cca..31fe74d 100644
--- a/jena-tdb/src/test/java/org/apache/jena/tdb/graph/TS_Graph.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/TC_Integration.java
@@ -16,21 +16,22 @@
  * limitations under the License.
  */
 
-package org.apache.jena.tdb.graph;
+package org.apache.jena.test;
 
-import org.junit.runner.RunWith ;
-import org.junit.runners.Suite ;
+import org.apache.jena.test.assembler.TS_Assembler;
+import org.apache.jena.test.integration.TS_Integration;
+import org.apache.jena.test.rdfconnection.TS_RDFConnectionIntegration;
+import org.apache.jena.test.txn.TS_TranactionIntegration;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
 
 @RunWith(Suite.class)
 @Suite.SuiteClasses( {
-    TestPrefixMappingTDB.class
-    , TestDatasetGraphTDB.class
-    , TestGraphsTDBnonTxn.class
-    , TestGraphsTDBinsideTxn.class
-    , TestDatasetGraphAccessorTDB.class
-    , TestGraphOverDatasetTDB.class
+    TS_Integration.class
+    , TS_TranactionIntegration.class
+    , TS_RDFConnectionIntegration.class
+    , TS_Assembler.class
 })
-public class TS_Graph
-{
 
-}
+public class TC_Integration { }
+
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TS_Integration.java
similarity index 72%
rename from jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
rename to jena-integration-tests/src/test/java/org/apache/jena/test/integration/TS_Integration.java
index 1ee7efb..ddad9b6 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/system/TestPrefixMapExtended1.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TS_Integration.java
@@ -16,17 +16,15 @@
  * limitations under the License.
  */
 
-package org.apache.jena.riot.system;
+package org.apache.jena.test.integration;
 
-/**
- * Tests for {@link PrefixMapExtended} applied over a {@link PrefixMapStd}
- *
- */
-public class TestPrefixMapExtended1 extends AbstractTestPrefixMap {
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
 
-    @Override
-    protected PrefixMap getPrefixMap() {
-        return new PrefixMapExtended(new PrefixMapStd());
-    }
+@RunWith(Suite.class)
+@Suite.SuiteClasses( {
+    TestDatasetPrefixes.class
+})
 
-}
+/** General system integration tests */
+public class TS_Integration {}
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TestDatasetPrefixes.java b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TestDatasetPrefixes.java
new file mode 100644
index 0000000..d79f948
--- /dev/null
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/integration/TestDatasetPrefixes.java
@@ -0,0 +1,236 @@
+/*
+ * 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.jena.test.integration;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.apache.jena.atlas.lib.Creator;
+import org.apache.jena.query.TxnType;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
+import org.apache.jena.shared.JenaException;
+import org.apache.jena.sparql.JenaTransactionException;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.core.DatasetGraphFactory;
+import org.apache.jena.sparql.core.DatasetGraphMap;
+import org.apache.jena.sparql.core.DatasetGraphMapLink;
+import org.apache.jena.sparql.graph.GraphFactory;
+import org.apache.jena.system.Txn;
+import org.apache.jena.tdb.TDBFactory;
+import org.apache.jena.tdb.transaction.TDBTransactionException;
+import org.apache.jena.tdb2.DatabaseMgr;
+import org.junit.Assume;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+// Tests go simple -> complex
+// Does not matter ass to their execution, it does help pinpoint what has broken.
+/**
+ * Test of dataset prefixes.
+ * See {@code AbstractTestPrefixMap} for tests of prefix maps in general.
+ */
+
+
+@FixMethodOrder(MethodSorters.JVM)
+@RunWith(Parameterized.class)
+public class TestDatasetPrefixes {
+
+    @Parameters(name = "{index}: {0}")
+    public static Collection<Object[]> data(){
+        Creator<DatasetGraph> c1 = ()->DatasetGraphFactory.createTxnMem();
+        Creator<DatasetGraph> c2 = ()->TDBFactory.createDatasetGraph();
+        Creator<DatasetGraph> c3 = ()->DatabaseMgr.createDatasetGraph();
+        Creator<DatasetGraph> c4 = ()->new DatasetGraphMap();     //DatasetGraphFactory.create();
+        Creator<DatasetGraph> c5 = ()->new DatasetGraphMapLink(GraphFactory.createDefaultGraph()); //DatasetGraphFactory.createGeneral();
+
+        Object[] x1 = { "TIM",  c1 , false, true, true };
+        Object[] x2 = { "TDB1", c2 , true, true, true };
+        Object[] x3 = { "TDB2", c3 , true, true, true };
+        Object[] x4 = { "Map",  c4 , false, false, false };
+        Object[] x5 = { "MapLink", c5 , false, false, false };
+        return Arrays.asList(x1, x2, x3, x4,x5);
+    }
+
+    private final Creator<DatasetGraph> cdsg;
+    private final boolean txnIsolation;
+    private final boolean supportsPromote;
+    private final boolean unifiedPrefixMaps;
+
+    public TestDatasetPrefixes(String name, Creator<DatasetGraph> cdsg,
+                               // Do the prefixes provide full isolation?
+                               boolean txnIsolation,
+                               // Do the prefixes work with transaction promote?
+                               boolean supportsPromote,
+                               // Single shared prefix map for all graphs and the dataset?
+                               boolean unifiedPrefixMaps) {
+        this.cdsg = cdsg;
+        this.txnIsolation = txnIsolation;
+        this.supportsPromote = supportsPromote;
+        this.unifiedPrefixMaps = unifiedPrefixMaps;
+    }
+
+    private DatasetGraph create() {
+        DatasetGraph dsg = cdsg.create();
+        // Force into transactional (TDB1)
+        Txn.executeWrite(dsg, () -> {});
+        return dsg;
+    }
+
+    @Test
+    public void dsg_prefixes_basic_1() {
+        DatasetGraph dsg = create();
+        PrefixMap pmap = dsg.prefixes();
+        Txn.executeRead(dsg, ()->{
+            assertEquals(0, pmap.size());
+            assertTrue(pmap.isEmpty());
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_basic_2() {
+        DatasetGraph dsg = create();
+        Txn.executeWrite(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/");
+            String x = pmap.get("ex");
+            assertEquals("http://example/", x);
+            assertEquals(1, pmap.size());
+            assertFalse(pmap.isEmpty());
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_basic_3() {
+        DatasetGraph dsg = create();
+        Txn.executeWrite(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/");
+            pmap.add("ex", "http://example/1");
+            String x = pmap.get("ex");
+            assertEquals("http://example/1", x);
+            assertEquals(1, pmap.size());
+            assertFalse(pmap.isEmpty());
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_basic_4() {
+        DatasetGraph dsg = create();
+        Txn.executeWrite(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/");
+            pmap.delete("ex");
+            String x = pmap.get("ex");
+            assertNull(x);
+            assertEquals(0, pmap.size());
+            assertTrue(pmap.isEmpty());
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_basic_5() {
+        Assume.assumeTrue(unifiedPrefixMaps);
+        DatasetGraph dsg = create();
+        Txn.executeWrite(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/");
+            PrefixMap pmapDft = Prefixes.adapt(dsg.getDefaultGraph().getPrefixMapping());
+            String x1 = pmapDft.get("ex");
+            assertEquals("http://example/", x1);
+            pmapDft.add("ex", "http://example/ns2");
+
+            PrefixMap pmapUnion = Prefixes.adapt(dsg.getUnionGraph().getPrefixMapping());
+            String x2 = pmapUnion.get("ex");
+            assertEquals("http://example/ns2", x2);
+
+            String x3 = pmap.get("ex");
+            assertEquals("http://example/ns2", x2);
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_txn_1() {
+        DatasetGraph dsg = create();
+        Txn.executeWrite(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/");
+        });
+        Txn.executeRead(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            String x = pmap.get("ex");
+            assertEquals("http://example/", x);
+        });
+    }
+
+    // Legacy: TDBTransactionException is not under JenaTransactionException.
+    @Test(expected = JenaException.class)
+    public void dsg_prefixes_txn_2() {
+        Assume.assumeTrue(txnIsolation);
+        DatasetGraph dsg = create();
+        Txn.executeRead(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            try {
+                // Write inside read.
+                // TIM prefixes are standalone, MRSW so they are thread safe but not tied to the TIM transaction lifecycle.
+                // No Isolation.
+                pmap.add("ex", "http://example/2");
+            } catch (JenaTransactionException | TDBTransactionException ex) {
+                throw ex;
+            }
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_txn_3() {
+        Assume.assumeTrue(supportsPromote);
+        DatasetGraph dsg = create();
+        Assume.assumeTrue(dsg.supportsTransactionAbort());
+        Txn.exec(dsg, TxnType.READ_PROMOTE, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/2");
+        });
+    }
+
+    @Test
+    public void dsg_prefixes_txn_4() {
+        Assume.assumeTrue(txnIsolation);
+        DatasetGraph dsg = create();
+        Txn.executeWrite(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            pmap.add("ex", "http://example/2");
+            dsg.abort();
+        });
+        Txn.executeRead(dsg, () -> {
+            PrefixMap pmap = dsg.prefixes();
+            String x = pmap.get("ex");
+            assertNull(x);
+        });
+    }
+}
+
diff --git a/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java b/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java
index 99949b3..7f9cb4f 100644
--- a/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java
+++ b/jena-integration-tests/src/test/java/org/apache/jena/test/txn/TestDataset2Graph.java
@@ -49,7 +49,7 @@ import org.junit.runners.Parameterized.Parameters;
 //   DatasetOne, DatasetGraphOne. <-- Flag needed.
 //   DatasetImpl
 
-/** Additional testing for "Dataset over Graph" transaction mapping */ 
+/** Additional testing for "Dataset over Graph" transaction mapping */
 
 @RunWith(Parameterized.class)
 public class TestDataset2Graph {
@@ -60,7 +60,9 @@ public class TestDataset2Graph {
         Creator<Dataset> datasetTxnMemMaker = ()-> DatasetFactory.createTxnMem() ;
         Creator<Dataset> datasetTDB1 = ()-> TDBFactory.createDataset();
         Creator<Dataset> datasetTDB2 = ()-> TDB2Factory.createDataset();
-        return Arrays.asList(new Object[][] { 
+
+
+        return Arrays.asList(new Object[][] {
             { "Plain", datasetPlainMaker },
             { "TIM",   datasetTxnMemMaker },
             { "TDB1",  datasetTDB1 },
@@ -74,7 +76,7 @@ public class TestDataset2Graph {
         this.creator = creator;
     }
 
-    @Test public void dsgGraphTxn_model() {
+    @Test public void dsgGraphTxn_infModel() {
         testInfModel(creator.create());
     }
 
@@ -88,28 +90,28 @@ public class TestDataset2Graph {
 
     private static void testInfModel(Dataset ds0) {
         Txn.executeWrite(ds0, ()->{});
-        Model baseModel = ds0.getDefaultModel(); 
+        Model baseModel = ds0.getDefaultModel();
         Model model = ModelFactory.createInfModel(RDFSRuleReasonerFactory.theInstance().create(null), baseModel);
         if ( model.getGraph().getTransactionHandler().transactionsSupported() ) {
-            // InfModels do not support transactions per se - they particpate if includes in a suitable dataset.
+            // InfModels do not support transactions per se - they participate if included in a suitable dataset.
             model.begin();
             long x = Iter.count(model.listStatements());
             model.commit();
             assertTrue(x > 10);
         }
     }
-    
+
     private static void testOverDS(Dataset ds0, boolean wrap) {
         // Force to transactions / verify the DSG is transactional.
         Txn.executeWrite(ds0, ()->{});
-        Model baseModel = ds0.getDefaultModel(); 
+        Model baseModel = ds0.getDefaultModel();
         Model model = ModelFactory.createInfModel(RDFSRuleReasonerFactory.theInstance().create(null), baseModel);
         Dataset ds1 = wrap ? DatasetFactory.wrap(model) : DatasetFactory.create(model);
 
         try ( RDFConnection conn = RDFConnectionFactory.connect(ds1) ) {
-            
+
             //conn.querySelect("SELECT (count(*) AS ?C) { ?s ?p ?o } HAVING (?C = 0)", (qs)-> fail("Didn't expect any query solutions"));
-            
+
             // Necessary
             Txn.exec(conn, TxnType.READ, ()->{
                 try ( QueryExecution qExec = conn.query("SELECT * { ?s ?p ?o }") ) {
@@ -118,18 +120,18 @@ public class TestDataset2Graph {
                 }
             });
         }
-        
+
         Triple t = SSE.parseTriple("(:s :p :o)");
         Quad q = Quad.create(Quad.defaultGraphIRI, t);
-        
+
         // Now write via top.
         Txn.executeWrite(ds1, ()->{
             ds1.asDatasetGraph().add(q);
         });
-        
+
         // And get it back again from storage.
         Txn.exec(ds0, TxnType.READ, ()->{
-            assertEquals(1, ds0.asDatasetGraph().getDefaultGraph().size()); 
+            assertEquals(1, ds0.asDatasetGraph().getDefaultGraph().size());
             assertTrue(ds0.getDefaultModel().getGraph().contains(t));
         });
     }
diff --git a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
index a780424..ce173d8 100644
--- a/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
+++ b/jena-sdb/src/main/java/org/apache/jena/sdb/store/DatasetGraphSDB.java
@@ -27,6 +27,8 @@ import org.apache.jena.graph.Triple ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.query.TxnType;
 import org.apache.jena.riot.other.G;
+import org.apache.jena.riot.system.PrefixMap;
+import org.apache.jena.riot.system.Prefixes;
 import org.apache.jena.sdb.Store ;
 import org.apache.jena.sdb.graph.GraphSDB ;
 import org.apache.jena.sdb.util.StoreUtils ;
@@ -35,7 +37,7 @@ import org.apache.jena.shared.LockMRSW ;
 import org.apache.jena.sparql.core.* ;
 import org.apache.jena.sparql.util.Context ;
 
-public class DatasetGraphSDB extends DatasetGraphTriplesQuads 
+public class DatasetGraphSDB extends DatasetGraphTriplesQuads
     implements DatasetGraph, Closeable
     /** SDB uses JDBC transactions, not Dataset transactions*/
 {
@@ -43,7 +45,7 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
     private Lock lock = new LockMRSW() ;
     private final Context context ;
     private GraphSDB defaultGraph;
-    
+
     public DatasetGraphSDB(Store store, Context context) {
         this(store, new GraphSDB(store), context);
     }
@@ -78,7 +80,13 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
     public Graph getGraph(Node graphNode) {
         return new GraphSDB(store, graphNode);
     }
-    
+
+    @Override
+    public PrefixMap prefixes() {
+        // Don't create when object is created - database may not be formatted yet.
+        return Prefixes.adapt(getDefaultGraph());
+    }
+
     // Use unsubtle versions (the bulk loader copes with large additions).
     @Override
     protected void addToDftGraph(Node s, Node p, Node o)
@@ -102,17 +110,17 @@ public class DatasetGraphSDB extends DatasetGraphTriplesQuads
 
     @Override
     protected Iterator<Quad> findInAnyNamedGraphs(Node s, Node p, Node o)
-    { return LibSDB.findInQuads(this, Node.ANY, s, p, o) ; } 
+    { return LibSDB.findInQuads(this, Node.ANY, s, p, o) ; }
 
     @Override
     protected Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p, Node o)
     { return LibSDB.findInQuads(this, g, s, p, o) ; }
-    
+
     @Override
     public void close()
     { store.close() ; }
 
-    // Transactions for SDB are an aspect of the JDBC connection not the dataset. 
+    // Transactions for SDB are an aspect of the JDBC connection not the dataset.
     private final Transactional txn                     = new TransactionalNotSupported() ;
     @Override public void begin()                       { txn.begin(); }
     @Override public void begin(TxnType txnType)        { txn.begin(txnType); }
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java b/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java
index fcae4c6..2fc4be3 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/index/bplustree/BPTreeNode.java
@@ -45,30 +45,30 @@ public final class BPTreeNode extends BPTreePage
     // Assume package access.
 
     private static Logger log = LoggerFactory.getLogger(BPTreeNode.class) ;
-    
+
     private Block block ;
     private int id ;
-    private short blockState = READ ;  
-    
+    private short blockState = READ ;
+
     int parent ;
     int count ;             // Number of records.  Number of pointers is +1
-    
+
     // "Leaf" of the BPTree is the lowest level of ptr/key splits, not the data blocks.
     // We need to know this to know which block manager the block pointers refer to.
-    boolean isLeaf ;        
+    boolean isLeaf ;
     private RecordBuffer records ;
     void setRecordBuffer(RecordBuffer r) { records = r ; }
     PtrBuffer ptrs ;
 
     /* B+Tree
-     * 
-     * Two block managers : 
+     *
+     * Two block managers :
      *   one for Nodes (BPlusTreePages => BPlusTreeNode)
      *   one for Leaves (RecordBufferPages)
-     * The split key is the held in the highest in the block  
-     * 
-     * A "leaf" node is a leaf of the B+Tree part, and points to 
-     * highest record in a RecordBuffer 
+     * The split key is the held in the highest in the block
+     *
+     * A "leaf" node is a leaf of the B+Tree part, and points to
+     * highest record in a RecordBuffer
      *
      * The Gap is usually zero.
      * N = 2, Gap = 1 =>
@@ -77,7 +77,7 @@ public final class BPTreeNode extends BPTreePage
      *  N-1:      MinRec = 1, MinPtr = 2
      *
      * BPTreeNode:
-     * 
+     *
      *      +------------------------+
      *      |-| K0 | K1 | K2 | K3 |--|
      *      +------------------------+
@@ -89,44 +89,44 @@ public final class BPTreeNode extends BPTreePage
      *      +------------------------+
      *      | P0 | P1 | P2 | ** | ** |
      *      +------------------------+
-     *      
+     *
      * BPTreeRecords -> RecordBuffer:
-     *      
+     *
      *      +------------------------+
      *      | K0 | K1 | K2 | ** | ** |
      *      +------------------------+
-     *      
+     *
      * The size of records blocks and size of tree nodes don't have to be the same.
-     * They use different page managers, and are in different files.  
+     * They use different page managers, and are in different files.
      *
      * The minimal tree is one, leaf, root BPTreeNode and one BPTreeRecords page.
-     * 
-     * Pictures:      
+     *
+     * Pictures:
      *      /--\ \--\
      * means a block with free space introduced between records[i] and records[i+1], ptrs[i+1]/ptrs[i+2]
-     * Lower half is a valid structure (except for overall size) 
-     *       
+     * Lower half is a valid structure (except for overall size)
+     *
      *      /--/ /--\
      * means a block with free space introduced between records[i] and records[i+1], ptrs[i]/ptrs[i+1]
-     * Upper half is a valid structure (except for overall size) 
+     * Upper half is a valid structure (except for overall size)
      */
 
     // Branch nodes only need create branch nodes (splitting sideways)
     // Leaf nodes only create leaf nodes.
     // The root is an exception.
-    
+
     private BPTreeNode create(int parent, boolean isLeaf)
     {
         return create(bpTree, parent, isLeaf) ;
     }
-    
+
     private static BPTreeNode create(BPlusTree bpTree, int parent, boolean isLeaf)
     {
         BPTreeNode n = bpTree.getNodeManager().createNode(parent) ;
         n.isLeaf = isLeaf ;
         return n ;
     }
-    
+
     /*package*/ BPTreeNode(BPlusTree bpTree, Block block)
     {
         super(bpTree) ;
@@ -135,14 +135,14 @@ public final class BPTreeNode extends BPTreePage
     }
 
     @Override
-    public void reset(Block block) 
-    { 
+    public void reset(Block block)
+    {
         this.block = block ;
         // reformat block (sets record and pointer buffers)
         BPTreeNodeMgr.formatBPTreeNode(this, bpTree, block, isLeaf, parent, count) ;
     }
-    
-    /** Get the page at slot idx - switch between B+Tree and records files */ 
+
+    /** Get the page at slot idx - switch between B+Tree and records files */
     private BPTreePage get(int idx, short state)
     {
         int subId = ptrs.get(idx) ;
@@ -151,9 +151,9 @@ public final class BPTreeNode extends BPTreePage
         if ( state == WRITE )
             return getMgrWrite(subId) ;
         log.error("Unknown state: "+state) ;
-        return null ;   
+        return null ;
     }
-    
+
     private BPTreePage getMgrRead(int subId)
     {
         if ( isLeaf )
@@ -161,7 +161,7 @@ public final class BPTreeNode extends BPTreePage
         else
             return bpTree.getNodeManager().getRead(subId, this.id) ;
     }
-    
+
     private BPTreePage getMgrWrite(int subId)
     {
         if ( isLeaf )
@@ -172,7 +172,7 @@ public final class BPTreeNode extends BPTreePage
 
     // ---------- Public calls.
     // None of these are called recursively.
-    
+
     /** Find a record, using the active comparator */
     public static Record search(BPTreeNode root, Record rec)
     {
@@ -191,22 +191,22 @@ public final class BPTreeNode extends BPTreePage
             log.debug(format("** insert(%s) / start", record)) ;
             if ( DumpTree ) root.dump() ;
         }
-     
+
         if ( ! root.isRoot() )
             throw new BPTreeException("Insert begins but this is not the root") ;
-        
+
         if ( root.isFull() )
         {
             // Root full - root split is a special case.
             splitRoot(root) ;
             if ( DumpTree ) root.dump() ;
         }
-        
+
         // Root ready - call insert proper.
         Record result = root.internalInsert(record) ;
-        
+
         root.internalCheckNodeDeep() ;
-    
+
         if ( logging() )
         {
             log.debug(format("** insert(%s) / finish", record)) ;
@@ -217,7 +217,7 @@ public final class BPTreeNode extends BPTreePage
 
     /** Delete a record - return the old value if there was one, else null*/
     public static Record delete(BPTreeNode root, Record rec)
-    { 
+    {
         if ( logging() )
         {
             log.debug(format("** delete(%s) / start", rec)) ;
@@ -225,7 +225,7 @@ public final class BPTreeNode extends BPTreePage
         }
         if ( ! root.isRoot() )
             throw new BPTreeException("Delete begins but this is not the root") ;
-    
+
         if ( root.isLeaf && root.count == 0 )
         {
             // Special case.  Just a records block.  Allow that to go too small.
@@ -236,7 +236,7 @@ public final class BPTreeNode extends BPTreePage
             page.release() ;
             return r ;
         }
-        
+
         // Entry: checkNodeDeep() ;
         Record v = root.internalDelete(rec) ;
 
@@ -246,7 +246,7 @@ public final class BPTreeNode extends BPTreePage
             root.reduceRoot() ;
             root.internalCheckNodeDeep() ;
         }
-        
+
         if ( logging() )
         {
             log.debug(format("** delete(%s) / finish", rec)) ;
@@ -254,8 +254,8 @@ public final class BPTreeNode extends BPTreePage
         }
         return v ;
     }
-    
-    /** Returns the id of the records buffer page for this record.  Records Buffer Page NOT read; record may not exist */ 
+
+    /** Returns the id of the records buffer page for this record.  Records Buffer Page NOT read; record may not exist */
     static int recordsPageId(BPTreeNode node, Record fromRec)
     {
         // Walk down the B+tree part of the structure ...
@@ -269,7 +269,7 @@ public final class BPTreeNode extends BPTreePage
                 node.release() ;
             node = n ;
         }
-        // ... then find the id of the next step down, but do not touch the records buffer page. 
+        // ... then find the id of the next step down, but do not touch the records buffer page.
         int id ;
         if ( fromRec == null )
         {
@@ -279,7 +279,7 @@ public final class BPTreeNode extends BPTreePage
         else
         {
             // Get the right id based on starting record.
-            int idx = node.findSlot(fromRec) ; 
+            int idx = node.findSlot(fromRec) ;
             idx = convert(idx) ;
             id = node.getPtrBuffer().get(idx) ;
         }
@@ -312,7 +312,7 @@ public final class BPTreeNode extends BPTreePage
 //    protected BPTreeRecords findPage(Record rec)
 //    {
 //        if ( CheckingNode ) internalCheckNode() ;
-//        
+//
 //        BPTreePage page = findHere(rec) ;
 //        if ( page == null )
 //            return null ;
@@ -320,7 +320,7 @@ public final class BPTreeNode extends BPTreePage
 //        page.release() ;
 //        return bpr ;
 //    }
-//    
+//
 //    // Find first page.
 //    @Override
 //    BPTreeRecords findFirstPage()
@@ -341,59 +341,59 @@ public final class BPTreeNode extends BPTreePage
     @Override final
     Record getHighRecord()
     {
-        return records.getHigh() ; 
+        return records.getHigh() ;
     }
-    
+
     // count is the number of pointers.
-    
+
     @Override
     final int getMaxSize()           { return params.getOrder() ; }
-    
+
     @Override
     final int getCount()             { return count ; }
- 
+
     @Override
     final void setCount(int count)   { this.count = count ; }
-    
+
     @Override
 //    public ByteBuffer getBackingByteBuffer()       { return byteBuffer ; }
     public Block getBackingBlock()       { return block ; }
-    
+
     /** Do not use without great care */
     RecordBuffer getRecordBuffer()   { return records ; }
     /** Do not use without great care */
     PtrBuffer getPtrBuffer()         { return ptrs ; }
-    
+
     void setIsLeaf(boolean isLeaf)   { this.isLeaf = isLeaf ; }
 
     boolean isLeaf()                 { return this.isLeaf ; }
-    
+
     @Override
     public final int getId()                { return id ; }
 
     @Override
-    final void write()          { bpTree.getNodeManager().write(this) ; } 
-    
+    final void write()          { bpTree.getNodeManager().write(this) ; }
+
     @Override
     final void promote()        { bpTree.getNodeManager().promote(this) ; }
 
     @Override
-    final void release()        { bpTree.getNodeManager().release(this) ; } 
+    final void release()        { bpTree.getNodeManager().release(this) ; }
 
     @Override
-    final void free()           { bpTree.getNodeManager().free(this) ; } 
-    
-    
+    final void free()           { bpTree.getNodeManager().free(this) ; }
+
+
     // ============ SEARCH
-    
-    /* 
+
+    /*
      * Do a (binary) search of the node to find the record.
-     *   Returns: 
-     *     +ve or 0 => the index of the record 
+     *   Returns:
+     *     +ve or 0 => the index of the record
      *     -ve => The insertion point : the immediate higher record or length as (-i-1)
-     *  Convert to +ve and decend to find the RecordBuffer with the record in it. 
+     *  Convert to +ve and decend to find the RecordBuffer with the record in it.
      */
-    
+
     @Override final
     Record internalSearch(Record rec)
     {
@@ -407,7 +407,7 @@ public final class BPTreeNode extends BPTreePage
     /** Find the next page to look at as we walk down the tree */
     private final BPTreePage findHere(Record rec)
     {
-        int idx = findSlot(rec) ; 
+        int idx = findSlot(rec) ;
         idx = convert(idx) ;
         // Find index, or insertion point (immediate higher slot) as (-i-1)
         // A key is the highest element of the records up to this point
@@ -416,33 +416,33 @@ public final class BPTreeNode extends BPTreePage
         BPTreePage page = get(idx, READ) ;
         return page ;
     }
-    
+
     // ============ INSERT
-    
+
     /* Traverse this page, ensuring the node below is not full before
      * decending.  Therefore there is always space to do the actual insert.
      */
-    
+
     @Override final
     Record internalInsert(Record record)
     {
         if ( logging() )
             log.debug(format("internalInsert: %s [%s]", record, this)) ;
-        
+
         internalCheckNode() ;
-        
+
         int idx = findSlot(record) ;
 
         if ( logging() )
             log.debug(format("internalInsert: idx=%d=>%d", idx, convert(idx))) ;
-        
+
         idx = convert(idx) ;
-        
+
         BPTreePage page = get(idx, READ) ;
-        
+
         if ( logging() )
             log.debug(format("internalInsert: next: %s",page));
-        
+
         if ( page.isFull() )
         {
             // Need to split the page before descending.
@@ -480,14 +480,14 @@ public final class BPTreeNode extends BPTreePage
      */
     private void split(int idx, BPTreePage y)
     {
-        boolean logging = logging() ; 
+        boolean logging = logging() ;
         //logging = true ;
         if ( logging )
         {
             log.debug(format("split >> y.id=%d  this.id=%d idx=%d", y.getId(), this.id, idx)) ;
             log.debug("split --   "+y) ;
         }
-            
+
         internalCheckNode() ;
         if ( CheckingNode )
         {
@@ -500,13 +500,13 @@ public final class BPTreeNode extends BPTreePage
             }
         }
         internalCheckNodeDeep() ;
-        
+
         promote() ;
         y.promote() ;
-        
+
         Record splitKey = y.getSplitKey() ;
         splitKey = keyRecord(splitKey) ;
-        
+
         if ( logging )
             log.debug(format("Split key: %s", splitKey)) ;
 
@@ -516,30 +516,28 @@ public final class BPTreeNode extends BPTreePage
             log.debug(format("Split: %s", y)) ;
             log.debug(format("Split: %s", z)) ;
         }
-        
+
         // Key only.
         if ( splitKey.hasSeparateValue() )
         {
-            // [Issue: FREC]
-            // This creates a empty (null-byte-initialized) value array.
             splitKey = params.getKeyFactory().create(splitKey.getKey()) ;
 
             // Better: but an on-disk change. This is key only.
             // splitKey = params.getKeyFactory().createKeyOnly(splitKey) ;
-        }        
-        
+        }
+
         // Insert new node. "add" shuffle's up as well.
         records.add(idx, splitKey) ;
         ptrs.add(idx+1, z.getId()) ;
         count++ ;
-        
+
         if ( logging )
         {
             log.debug("split <<   "+this) ;
             log.debug("split <<   "+y) ;
             log.debug("split <<   "+z) ;
         }
-        
+
         y.write();
         z.write();
         z.release() ;
@@ -552,15 +550,15 @@ public final class BPTreeNode extends BPTreePage
             internalCheckNodeDeep() ;
         }
     }
-    
+
     @Override final
     Record getSplitKey()
     {
         int ix = params.SplitIndex ;
-        Record split = records.get(ix) ; 
+        Record split = records.get(ix) ;
         return split ;
     }
-    
+
     /** Split this block - return the split record (key only needed) */
     @Override final
     BPTreePage split()
@@ -570,17 +568,17 @@ public final class BPTreeNode extends BPTreePage
 
         // New block.
         BPTreeNode z = create(this.parent, isLeaf) ;
-        
+
         // Leave the low end untouched and copy, and clear the high end.
         // z becomes the new upper node, not the lower node.
         // 'this' is the lower block.
-        
+
         int maxRec = maxRecords() ;
-        // Copy from top of y into z. 
+        // Copy from top of y into z.
         records.copy(ix+1, z.records, 0, maxRec-(ix+1)) ;
-        records.clear(ix, maxRec-ix) ;                    // Clear copied and median slot 
+        records.clear(ix, maxRec-ix) ;                    // Clear copied and median slot
         records.setSize(ix) ;                             // Reset size
-        
+
         ptrs.copy(ix+1, z.ptrs, 0, params.MaxPtr-(ix+1)) ;
         ptrs.clear(ix+1, params.MaxPtr-(ix+1)) ;
         ptrs.setSize(ix+1) ;
@@ -588,15 +586,15 @@ public final class BPTreeNode extends BPTreePage
         // Set sizes of subnodes
         setCount(ix) ;                          // Median is ix
         internalCheckNode() ;                   // y finished
-        
-        z.isLeaf = isLeaf ; 
+
+        z.isLeaf = isLeaf ;
         z.setCount(maxRec - (ix+1)) ;           // Number copied into z
 
         // Caller puts the blocks in split(int, BTreePage)
         z.internalCheckNode() ;
         return z ;
     }
-    
+
     /* Split the root and leave the root block as the root.
      * This is the only point the height of the tree increases.
      *
@@ -604,7 +602,7 @@ public final class BPTreeNode extends BPTreePage
      *  Copy root low into left
      *  Copy root high into right
      *  Set counts.
-     *  Create new root settings (two pointers, one key record) 
+     *  Create new root settings (two pointers, one key record)
      *  WRITE(left)
      *  WRITE(right)
      *  WRITE(root)
@@ -612,16 +610,16 @@ public final class BPTreeNode extends BPTreePage
     private static void splitRoot(BPTreeNode root)
     {
         BPlusTree bpTree = root.bpTree ;
-        
+
         if ( CheckingNode )
             if ( root.id != 0 ) root.error("Not root: %d (root is id zero)", root.id) ;
         root.internalCheckNode() ;
         root.promote() ;
-        
+
         // Median record
         int splitIdx = root.params.SplitIndex ;
         Record rec = root.records.get(splitIdx) ;
-        
+
         if ( logging() )
         {
             log.debug(format("** Split root %d (%s)", splitIdx, rec)) ;
@@ -631,9 +629,9 @@ public final class BPTreeNode extends BPTreePage
         // New blocks.
         BPTreeNode left = create(bpTree, root.id, root.isLeaf) ;
         BPTreeNode right = create(bpTree, root.id, root.isLeaf) ;
-        
+
         //int maxRecords = maxRecords() ;
-        
+
         // New left
         root.records.copy(0, left.records, 0, splitIdx) ;
         root.ptrs.copy(0, left.ptrs, 0, splitIdx+1) ;
@@ -643,27 +641,27 @@ public final class BPTreeNode extends BPTreePage
         root.records.copy(splitIdx+1, right.records, 0, root.maxRecords()-(splitIdx+1)) ;
         root.ptrs.copy(splitIdx+1, right.ptrs, 0, root.params.MaxPtr-(splitIdx+1)) ;
         right.count = root.maxRecords()-(splitIdx+1) ;
-        
+
         if ( logging() )
         {
             log.debug("splitRoot -- left:   "+left) ;
             log.debug("splitRoot -- right:  "+right) ;
         }
-        
+
         // So left.count+right.count = bTree.NumRec-1
-        
+
         // Clear root by reformatting.  New root not a leaf.  Has count of 1 after formatting.
         BPTreeNodeMgr.formatForRoot(root, false) ;
         // Make a non-leaf.
-        
+
         // Insert two subnodes, divided by the median record
         root.count = 1 ;
-        
+
         root.records.add(0, rec) ;
         root.ptrs.setSize(2) ;
         root.ptrs.set(0, left.id) ;        // slot 0
         root.ptrs.set(1, right.id) ;       // slot 1
-        
+
         if ( logging())
         {
             log.debug("splitRoot <<   "+root) ;
@@ -694,22 +692,22 @@ public final class BPTreeNode extends BPTreePage
      * Descend, making sure that the node is not minimum size at each descend.
      * If it is, rebalenace.
      */
-    
+
     @Override final
     Record internalDelete(Record rec)
     {
         internalCheckNode() ;
         if ( logging() )
             log.debug(format("internalDelete(%s) : %s", rec, this)) ;
-        
+
         int x = findSlot(rec) ;
 
-        // If x is >= 0, may need to adjust this 
+        // If x is >= 0, may need to adjust this
         int y = convert(x) ;
         BPTreePage page = get(y, READ) ;
-        
+
         boolean thisWriteNeeded = false ;
-        if ( page.isMinSize() )             // Can't be root - we decended in the get(). 
+        if ( page.isMinSize() )             // Can't be root - we decended in the get().
         {
             promote() ;
             page = rebalance(page, y) ;
@@ -723,7 +721,7 @@ public final class BPTreeNode extends BPTreePage
             }
             this.write() ;
         }
-        
+
         // Go to bottom
         // Need to return the new key.
         Record r2 =  page.internalDelete(rec) ;
@@ -744,15 +742,15 @@ public final class BPTreeNode extends BPTreePage
      * WRITE(root)
      * RELEASE(old child)
      * This is the only point the height of the tree decreases.
-     */ 
-    
+     */
+
     private void reduceRoot()
     {
         if ( logging() )
             log.debug(format("reduceRoot >> %s", this)) ;
-        
+
         if ( CheckingNode && ( ! isRoot() || count != 0 ) ) error("Not an empty root") ;
-        
+
... 3164 lines suppressed ...