diff --git a/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java b/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java
index c72b814fddc5c412836d2c007d6d9f28542a13af..3122eb8f53dcb9bd92a2f62c69d4236494ea81bd 100644
--- a/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java
+++ b/server-data-store/src/main/java/ch/ethz/sis/afsserver/server/observer/impl/OpenBISServerObserver.java
@@ -86,15 +86,15 @@ public class OpenBISServerObserver implements ServerObserver<TransactionConnecti
     @Override
     public void beforeAPICall(Worker<TransactionConnection> worker, Request request) throws Exception
     {
-        boolean isOnePhaseTransaction = worker.isInteractiveSessionMode();
-        boolean isTwoPhaseTransaction = worker.isTransactionManagerMode();
-
         // handle only transactional calls
-        if (!isOnePhaseTransaction && !isTwoPhaseTransaction)
+        if (!worker.isInteractiveSessionMode())
         {
             return;
         }
 
+        boolean isOnePhaseTransaction = !worker.isTransactionManagerMode();
+        boolean isTwoPhaseTransaction = worker.isTransactionManagerMode();
+
         if ((isOnePhaseTransaction && request.getMethod().equals("commit")) || (isTwoPhaseTransaction && request.getMethod().equals("prepare")))
         {
             List<String> paths = new ArrayList<>();
@@ -128,11 +128,8 @@ public class OpenBISServerObserver implements ServerObserver<TransactionConnecti
     @Override
     public void afterAPICall(Worker<TransactionConnection> worker, Request request) throws Exception
     {
-        boolean isOnePhaseTransaction = worker.isInteractiveSessionMode();
-        boolean isTwoPhaseTransaction = worker.isTransactionManagerMode();
-
         // handle only non-transactional calls
-        if (isOnePhaseTransaction || isTwoPhaseTransaction)
+        if (worker.isInteractiveSessionMode())
         {
             return;
         }
@@ -287,7 +284,7 @@ public class OpenBISServerObserver implements ServerObserver<TransactionConnecti
             ownerPath = ownerPath.substring(storageRoot.length());
         }
 
-        Pattern compile = Pattern.compile("/\\d+/.+/../../../(\\d+-\\d+)/.*");
+        Pattern compile = Pattern.compile("/\\d+/.+/../../../(.+)/.*");
         Matcher matcher = compile.matcher(ownerPath);
 
         if (matcher.matches())
diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java
index 885c1b21a67a36c98df7bdb1e217e2a92c1099b6..5b75316efe259e57af7ef37c3cccd02c84489443 100644
--- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java
+++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java
@@ -67,6 +67,10 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest
 
     private static final String OPENBIS_DUMMY_SERVER_PATH = "/";
 
+    private static final String TRANSACTION_MANAGER_KEY = "5678";
+
+    private static final String INTERACTIVE_SESSION_KEY = "1234";
+
     private static final String SHARE_1 = "1";
 
     private static final String SHARE_2 = "2";
@@ -474,8 +478,6 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest
 
         // no more datasets get created on subsequent writes
         assertEquals(1, dataSetCreations.size());
-        assertEquals(ownerWithoutFiles, dataSetCreations.get(0).getCode());
-        assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId());
     }
 
     @Test
@@ -500,6 +502,104 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest
         afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA));
     }
 
+    @Test
+    public void write_createsDataSetInAS_1PCTransaction() throws Exception
+    {
+        login();
+
+        String ownerWithoutFiles = UUID.randomUUID().toString();
+
+        List<DataSetCreation> dataSetCreations = new ArrayList<>();
+
+        dummyOpenBisServer.setOperationExecutor((methodName, methodArguments) ->
+        {
+            switch (methodName)
+            {
+                case "createDataSets":
+                    dataSetCreations.addAll((List<DataSetCreation>) methodArguments[1]);
+                    return List.of(new DataSetPermId(ownerWithoutFiles));
+            }
+
+            return getDefaultOperationExecutor().executeOperation(methodName, methodArguments);
+        });
+
+        UUID transactionId = UUID.randomUUID();
+        afsClient.setInteractiveSessionKey(INTERACTIVE_SESSION_KEY);
+
+        afsClient.begin(transactionId);
+        assertEquals(0, dataSetCreations.size());
+
+        afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA));
+        assertEquals(0, dataSetCreations.size());
+
+        afsClient.commit();
+
+        // dataset gets created on commit
+        assertEquals(1, dataSetCreations.size());
+        assertEquals(ownerWithoutFiles.toUpperCase(), dataSetCreations.get(0).getCode());
+        assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId());
+
+        UUID transactionId2 = UUID.randomUUID();
+
+        afsClient.begin(transactionId2);
+        afsClient.write(ownerWithoutFiles, FILE_B, 0L, DATA, IOUtils.getMD5(DATA));
+        afsClient.commit();
+
+        // no more datasets get created on subsequent writes
+        assertEquals(1, dataSetCreations.size());
+    }
+
+    @Test
+    public void write_createsDataSetInAS_2PCTransaction() throws Exception
+    {
+        login();
+
+        String ownerWithoutFiles = UUID.randomUUID().toString();
+
+        List<DataSetCreation> dataSetCreations = new ArrayList<>();
+
+        dummyOpenBisServer.setOperationExecutor((methodName, methodArguments) ->
+        {
+            switch (methodName)
+            {
+                case "createDataSets":
+                    dataSetCreations.addAll((List<DataSetCreation>) methodArguments[1]);
+                    return List.of(new DataSetPermId(ownerWithoutFiles));
+            }
+
+            return getDefaultOperationExecutor().executeOperation(methodName, methodArguments);
+        });
+
+        UUID transactionId = UUID.randomUUID();
+        afsClient.setTransactionManagerKey(TRANSACTION_MANAGER_KEY);
+        afsClient.setInteractiveSessionKey(INTERACTIVE_SESSION_KEY);
+
+        afsClient.begin(transactionId);
+        assertEquals(0, dataSetCreations.size());
+
+        afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA));
+        assertEquals(0, dataSetCreations.size());
+
+        afsClient.prepare();
+
+        // dataset gets created on prepare
+        assertEquals(1, dataSetCreations.size());
+        assertEquals(ownerWithoutFiles.toUpperCase(), dataSetCreations.get(0).getCode());
+        assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId());
+
+        afsClient.commit();
+
+        UUID transactionId2 = UUID.randomUUID();
+
+        afsClient.begin(transactionId2);
+        afsClient.write(ownerWithoutFiles, FILE_B, 0L, DATA, IOUtils.getMD5(DATA));
+        afsClient.prepare();
+        afsClient.commit();
+
+        // no more datasets get created on subsequent writes
+        assertEquals(1, dataSetCreations.size());
+    }
+
     @Test
     public void move_failsDueToMissingPermissions() throws Exception
     {