diff --git a/src/repdav/textgrid_dav_provider.py b/src/repdav/textgrid_dav_provider.py
index 5f4ad4a14b5069451e5c94b16816fc52fd8fa6c9..557e849e83560ce583fa017e7ecb230c44b46a36 100644
--- a/src/repdav/textgrid_dav_provider.py
+++ b/src/repdav/textgrid_dav_provider.py
@@ -3,11 +3,16 @@
 import io
 import logging
 
+from pprint import pformat
+
+from tgclients.crud import TextgridCRUD
+from tgclients.config import TextgridConfig
+from tgclients.metadata import TextgridMetadata
 from wsgidav.dav_provider import DAVCollection, DAVNonCollection, DAVProvider
+from wsgidav.stream_tools import FileLikeQueue
 from wsgidav.util import join_uri, pop_path
 
-
-from .tgapi import TextgridAuth, TextgridCRUD, TextgridSearch
+from .tgapi import TextgridAuth, TextgridSearch
 
 _logger = logging.getLogger(__name__)
 
@@ -23,7 +28,6 @@ class TextgridRoot(DAVCollection):
     def __init__(self, path, environ):
         DAVCollection.__init__(self, path, environ)
         self._sid = environ["wsgidav.auth.user_name"]
-        _logger.debug("MY SID: %s", self._sid)
 
     def get_display_info(self):
         return {"type": "Textgrid root collection"}
@@ -85,7 +89,7 @@ class TextgridProject(DAVCollection):
         # path resolution has to be rewritten before we can work with resource titles
         resources = TextgridSearch().get_project_contents(
             self._sid, self.path.split("/")[-1])
-        _logger.debug("RESOURCES: %s", resources)
+        #_logger.debug("RESOURCES: %s", resources)
         return resources.keys()
 
     def get_member(self, name):
@@ -192,19 +196,48 @@ class TextgridResource(DAVNonCollection):
 
     def get_content_length(self):
         _logger.debug("Called TextgridResource.get_content_length(self).")
-        # return TextgridCRUD().get_metadata(self._sid, self.path.split("/")[-1])["content-length"]
         return self._info[self.name]["extent"]
 
     def get_content_type(self):
         _logger.debug("Called TextgridResource.get_content_type(self).")
-        # return TextgridCRUD().get_metadata(self._sid, self.path.split("/")[-1])["content-type"]
         return self._info[self.name]["format"]
 
     def get_content(self):
-        return io.BytesIO(TextgridCRUD().get_data(self._sid, self.path.split("/")[-1]))
+        config = TextgridConfig()
+        crud = TextgridCRUD(config.crud)
+        return io.BytesIO(crud.read_data(self.path.split("/")[-1], self._sid).content)
+
+    def get_content_title(self):
+        _logger.debug("Called TextgridResource.get_content_title(self).")
+        return self._info[self.name]["title"]
 
     def begin_write(self, content_type=None):
-        pass
+        _logger.debug(
+            "Called TextgridResource.begin_write(self, content_type=%s).", content_type)
+        config = TextgridConfig()
+        crud = TextgridCRUD(config.crud)
+        queue = FileLikeQueue(max_size=1)
+        # create metadata or update?
+        metadata = TextgridMetadata.create(
+            self.get_content_title(), self.get_content_type())
+        crud.update_resource(
+            self._sid, self.path.split("/")[-1], queue, metadata)
+        return queue
+
+    def end_write(self, with_errors):
+        _logger.debug(
+            "Called TextgridResource.end_write(self, with_errors=%s)", with_errors)
+
+    # temporary override for debugging
+    def resolve(self, script_name, path_info):
+        """Return a _DAVResource object for the path (None, if not found).
+        `path_info`: is a URL relative to this object.
+        """
+        _logger.debug(
+            "Called TextgridResource.resolve(self, %s, %s).", script_name, path_info)
+        if path_info in ("", "/"):
+            return self
+        return None
 
 
 # ============================================================================
@@ -214,12 +247,9 @@ class TextgridResourceProvider(DAVProvider):
     """DAV provider that serves Textgrid resources.
     """
 
-    def __init__(self):
-        super(TextgridResourceProvider, self).__init__()
-
     def get_resource_inst(self, path, environ):
         _logger.debug(
-            "Called TextgridResourceProvider.get_resource_inst(self, %s, %s).", path, environ)
+            "Called TextgridResourceProvider.get_resource_inst(self, %s, %s).", path, pformat(environ))
         self._count_get_resource_inst += 1
         root = TextgridRoot("/", environ)
         # an instance of _DAVResource (i.e. either DAVCollection or DAVNonCollection)