diff --git a/rdf.storage.sparql/LICENSE b/rdf.storage.sparql/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/rdf.storage.sparql/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/rdf.storage.sparql/nb-configuration.xml b/rdf.storage.sparql/nb-configuration.xml
new file mode 100644
index 0000000..ec4540c
--- /dev/null
+++ b/rdf.storage.sparql/nb-configuration.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-shared-configuration>
+    <!--
+This file contains additional configuration written by modules in the NetBeans IDE.
+The configuration is intended to be shared among all the users of project and
+therefore it is assumed to be part of version control checkout.
+Without this configuration present, some functionality in the IDE may be limited or fail altogether.
+-->
+    <properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
+        <!--
+Properties that influence various parts of the IDE, especially code formatting and the like. 
+You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
+That way multiple projects can share the same settings (useful for formatting rules for example).
+Any value defined here will override the pom.xml file value but is only applicable to the current project.
+-->
+        <netbeans.compile.on.save>none</netbeans.compile.on.save>
+    </properties>
+</project-shared-configuration>
diff --git a/rdf.storage.sparql/nbactions.xml b/rdf.storage.sparql/nbactions.xml
new file mode 100644
index 0000000..ffd7a0f
--- /dev/null
+++ b/rdf.storage.sparql/nbactions.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<actions>
+  <action>
+    <actionName>CUSTOM-deploy to localhost:8080</actionName>
+    <displayName>deploy to localhost:8080</displayName>
+    <goals>
+      <goal>install</goal>
+      <goal>org.apache.sling:maven-sling-plugin:install</goal>
+    </goals>
+  </action>
+  <action>
+            <actionName>CUSTOM-fusepool-info</actionName>
+            <displayName>fusepool-info</displayName>
+            <goals>
+                <goal>install</goal>
+                <goal>org.apache.sling:maven-sling-plugin:install</goal>
+            </goals>
+            <properties>
+                <sling.url>http://platform.fusepool.info/system/console</sling.url>
+            </properties>
+        </action>
+</actions>
diff --git a/rdf.storage.sparql/pom.xml b/rdf.storage.sparql/pom.xml
new file mode 100644
index 0000000..cbe1614
--- /dev/null
+++ b/rdf.storage.sparql/pom.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<!--
+
+ 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.
+
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.clerezza</groupId>
+        <artifactId>clerezza</artifactId>
+        <version>0.5-SNAPSHOT</version>
+        <relativePath>../parent</relativePath>
+    </parent>
+    <artifactId>rdf.storage.sparql</artifactId>
+    <version>0.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>Clerezza - SCB Sparql Storage Provider</name>
+    <description>A storage provider backed by a SPARQL endpoint.</description>
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>rdf.ontologies</artifactId>
+            <version>0.12-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>rdf.utils</artifactId>
+            <version>0.14-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>rdf.scala.utils</artifactId>
+            <version>0.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>osgi.services</artifactId>
+            <version>0.2-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>jsr311-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <version>1.9.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza.ext</groupId>
+            <artifactId>slf4j-scala-api</artifactId>
+            <version>1.6.3-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <sourceDirectory>src/main/scala</sourceDirectory>
+        <testSourceDirectory>src/test/scala</testSourceDirectory>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.4.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Import-Package>org.osgi.*; version="[1,2)",javax.ws.rs.*; version="[1,3)",
+                            org.apache.stanbol.commons.security.*; version="[0,3)",
+                            !org.apache.felix.scr.annotations.*,*</Import-Package>
+                            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+                        <_nodefaultversion />
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+                <version>1.14.0</version>
+                <executions>
+                    <execution>
+                        <id>generate-scr-scrdescriptor</id>
+                        <goals>
+                            <goal>scr</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <scanClasses>true</scanClasses> 
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.scala-tools</groupId>
+                <artifactId>maven-scala-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/rdf.storage.sparql/src/main/scala/org/apache/clerezza/rdf/storage/sparql/SparqlStorageProvider.scala b/rdf.storage.sparql/src/main/scala/org/apache/clerezza/rdf/storage/sparql/SparqlStorageProvider.scala
new file mode 100644
index 0000000..14b006e
--- /dev/null
+++ b/rdf.storage.sparql/src/main/scala/org/apache/clerezza/rdf/storage/sparql/SparqlStorageProvider.scala
@@ -0,0 +1,252 @@
+/*
+ * 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.clerezza.rdf.storage.sparql
+
+import org.osgi.service.component.ComponentContext
+import java.io.IOException
+import java.net.{ HttpURLConnection, URL }
+import org.apache.clerezza.rdf.core.serializedform.SupportedFormat
+import org.apache.clerezza.rdf.core.serializedform.Parser
+import java.security.PrivilegedActionException
+import org.slf4j.scala._
+import org.apache.clerezza.rdf.core.access._
+import org.apache.clerezza.rdf.core.impl.AbstractMGraph
+import org.apache.clerezza.rdf.core._
+import scala.collection.JavaConversions.asScalaSet
+import java.util.Collection
+import java.util.Collections
+import org.apache.felix.scr.annotations.Component
+import org.apache.felix.scr.annotations.Service
+import org.apache.felix.scr.annotations.Property
+import java.net.URLEncoder
+import org.apache.clerezza.rdf.core.impl.TripleImpl
+import org.apache.clerezza.rdf.ontologies.RDF
+
+/**
+ * The Web Proxy Service enables applications to request remote (and local) graphs.
+ * It keeps cached version of the remote graphs in store for faster delivery.
+ *
+ */
+@Component
+@Service(Array(classOf[WeightedTcProvider]))
+class SparqlStorageProvider extends WeightedTcProvider with Logging {
+
+  final val queryEndpointKey = "query-endpoint"
+  @Property(name = queryEndpointKey, value = Array("http://localhost:3030/ds/query"))
+  private var queryEndpoint: String = _
+
+  final val updateEndpointKey = "update-endpoint"
+  @Property(name = updateEndpointKey, value = Array("http://localhost:3030/ds/update"))
+  private var updateEndpoint: String = _
+
+  final val metaGraphName = new UriRef("urn:x-internal:/meta")
+  final val mGraphClass = new UriRef("http://clerezza.apache.org/ontologies/storage#MGraph")
+
+  /**OSGI method, called on activation */
+  protected def activate(context: ComponentContext) = {
+    queryEndpoint = context.getProperties.get(queryEndpointKey).toString
+    updateEndpoint = context.getProperties.get(updateEndpointKey).toString
+  }
+
+  private var parser: Parser = null
+
+  protected def bindParser(p: Parser) = {
+    parser = p
+  }
+
+  protected def unbindParser(p: Parser) = {
+    parser = null
+  }
+
+  def getWeight: Int = {
+    return 20000
+  }
+
+  def getMGraph(name: UriRef): MGraph = {
+    checkMGraphExists(name)
+    getMGraphNoExistenceCheck(name)
+  }
+
+  /**
+   * throws NoSuchEntity if not existing
+   */
+  protected def checkMGraphExists(name: UriRef) {
+    val metaGraph = getMGraphNoExistenceCheck(metaGraphName)
+    if (!metaGraph.contains(new TripleImpl(name, RDF.`type`, mGraphClass))) {
+      throw new NoSuchEntityException(name)
+    }
+  }
+
+  protected def getMGraphNoExistenceCheck(name: UriRef): MGraph = {
+    return new AbstractMGraph() {
+      protected def performFilter(subject: NonLiteral, predicate: UriRef, obj: Resource): java.util.Iterator[Triple] = {
+        def ask = {
+          //TODO ask query
+          true
+        }
+        
+        val vars = new collection.mutable.ListBuffer[Char]
+        if (subject == null) vars += 's'
+        if (predicate == null) vars += 'p'
+        if (obj == null) vars += 'o'
+        if (vars.isEmpty() && ask()) {
+          Collections.singletonList(new TripleImpl(subject, predicate, obj)).iterator() 
+        } else {
+          val vs = vars.foldLeft[String]("")(((s,v) => s+" ?"+v+" "))
+        val query = "SELECT "+vs+" WHERE {" + SparqlStorageProvider.tpEncode(subject) +
+          " " + SparqlStorageProvider.tpEncode(predicate) + " " + SparqlStorageProvider.tpEncode(obj) + " } "
+        val url = new URL(queryEndpoint)
+        val con = url.openConnection().asInstanceOf[HttpURLConnection]
+        //not sure
+        System.out.println("DEBUG: doing output...")
+        con.setDoOutput(true)
+        con.setRequestMethod("POST")
+        val out = con.getOutputStream()
+        System.out.println("update:  " + update)
+        out.write(("update=" + URLEncoder.encode(update)).getBytes())
+        val err = con.getErrorStream()
+        if (err != null) {
+          var che = err.read
+          while (che != -1) {
+            System.out.write(che)
+            che = err.read
+          }
+        } else {
+          val in = con.getInputStream()
+          var ch = in.read
+          while (ch != -1) {
+            System.out.write(ch)
+            ch = in.read
+          }
+        }
+        System.out.flush
+        Collections.emptyList[Triple]().iterator()
+            }
+      }
+      override def add(triple: Triple) = {
+        val update = "INSERT DATA { GRAPH " + name + " {" + SparqlStorageProvider.tpEncode(triple.getSubject) +
+          " " + SparqlStorageProvider.tpEncode(triple.getPredicate) + " " + SparqlStorageProvider.tpEncode(triple.getObject) + " } }"
+        performUpdate(update)
+        true
+      }
+
+      def size = 0
+    }
+  }
+
+  protected def performUpdate(update: String) {
+    val url = new URL(updateEndpoint)
+    val con = url.openConnection().asInstanceOf[HttpURLConnection]
+    //not sure
+    System.out.println("DEBUG: doing output...")
+    con.setDoOutput(true)
+    con.setRequestMethod("POST")
+    val out = con.getOutputStream()
+    System.out.println("update:  " + update)
+    out.write(("update=" + URLEncoder.encode(update)).getBytes())
+    val err = con.getErrorStream()
+    if (err != null) {
+      var che = err.read
+      while (che != -1) {
+        System.out.write(che)
+        che = err.read
+      }
+    } else {
+      val in = con.getInputStream()
+      var ch = in.read
+      while (ch != -1) {
+        System.out.write(ch)
+        ch = in.read
+      }
+    }
+    System.out.flush
+  }
+
+  def getGraph(name: UriRef): Graph = {
+    throw new NoSuchEntityException(name)
+  }
+
+  def getTriples(name: UriRef): TripleCollection = {
+    return getMGraph(name)
+  }
+
+  def createMGraph(name: UriRef): MGraph = {
+    performUpdate("CREATE GRAPH " + name)
+    val metaGraph = getMGraphNoExistenceCheck(metaGraphName)
+    metaGraph.add(new TripleImpl(name, RDF.`type`, mGraphClass))
+    getMGraph(name)
+  }
+
+  def createGraph(name: UriRef, triples: TripleCollection): Graph = {
+    throw new UnsupportedOperationException
+  }
+
+  def deleteTripleCollection(name: UriRef): Unit = {
+    throw new UnsupportedOperationException
+  }
+
+  def getNames(graph: Graph): java.util.Set[UriRef] = {
+    return java.util.Collections.emptySet[UriRef]
+  }
+
+  def listTripleCollections: java.util.Set[UriRef] = {
+    var result: java.util.Set[UriRef] = new java.util.HashSet[UriRef]
+    result.addAll(listGraphs)
+    result.addAll(listMGraphs)
+    return result
+  }
+
+  def listGraphs: java.util.Set[UriRef] = {
+    //or should we list graphs for which we have a cached version?
+    return java.util.Collections.emptySet[UriRef]
+  }
+
+  def listMGraphs: java.util.Set[UriRef] = {
+    var result: java.util.Set[UriRef] = new java.util.HashSet[UriRef]
+    result.add(new UriRef("http://fake/sparql"))
+    result.add(new UriRef(queryEndpoint))
+    result.add(new UriRef(updateEndpoint))
+    return result
+
+  }
+}
+object SparqlStorageProvider {
+  private def tpEncode(res: Resource): String =
+    res match {
+      case l: Literal => tpEncode(l)
+      case u: UriRef => u.toString()
+      case b: BNode => tpEncode(b)
+    }
+
+  private def tpEncode(lit: Literal): String =
+    lit match {
+      case l: PlainLiteral if (l.getLanguage() == null) => "\"\"\"" + l.getLexicalForm() + "\"\"\""
+      case l: PlainLiteral if (l.getLanguage() != null) => "\"\"\"" + l.getLexicalForm() + "\"\"\"@" + l.getLanguage()
+      case l: TypedLiteral => "\"\"\"" + l.getLexicalForm() + "\"\"\"^^" + l.getDataType()
+    }
+
+  private def tpEncode(bNode: BNode): String =
+    //if the bNode has previously been retuned by SPARQL we should add 
+    //TriplePatterns so that the right one is identified
+    //If this is one that is newly added we must make sure the subsequentyl added
+    //statements get added, as long as a newly added bNode doesn't add
+    //new information (would cause a non-lean graph) it is not added to the graph
+    "_:"
+}
