diff --git a/src/xpdev/sopenfile.c b/src/xpdev/sopenfile.c
index d2d70b86f4e75241e6a150b1c57b3072324daa88..71f1cf9e077ecfc0e9fc608f6a6b9f88cde8937b 100644
--- a/src/xpdev/sopenfile.c
+++ b/src/xpdev/sopenfile.c
@@ -1,20 +1,40 @@
 #include "filewrap.h"
+#include "threadwrap.h"
 #include <stdlib.h>
 #include <string.h>
 
+int access_ = O_RDWR;
+
+void child(void* arg)
+{
+	char* path = (char*)arg;
+
+	printf("Opening in child thread: ");
+	int fd = open(path, access_, DEFFILEMODE);
+	if(fd < 0)
+		perror(path);
+	else {
+		printf("Success\n");
+		printf("close(%s) = %d\n", path, close(fd));
+	}
+}
+
 int main(int argc, char** argv)
 {
-	int access = O_RDWR;
 	char* share = "NWA";
 	bool try_all = true;
 	bool loop = false;
 	bool rm = false;
+	bool second = false;
+	bool thread = false;
 
 	if(argc < 2) {
-		printf("usage: sopenfile [-r] [-l] <path/filename> [share-mode]\n");
+		printf("usage: sopenfile [-opts] <path/filename> [share-mode]\n");
 		printf("\n");
 		printf("-r           open file read-only instead of read/write\n");
 		printf("-c           open file with create permissions\n");
+		printf("-2           open and close a second descriptor\n");
+		printf("-t           open and close a second descriptor in a second thread\n");
 		printf("-R           remove file after open\n");
 		printf("-l           loop until failure\n");
 		printf("\n");
@@ -24,21 +44,21 @@ int main(int argc, char** argv)
 		return EXIT_SUCCESS;
 	}
 	int argn = 1;
-	if(strcmp(argv[argn], "-r") == 0) {
-		access = O_RDONLY;
-		++argn;
-	}
-	if(strcmp(argv[argn], "-c") == 0) {
-		access |= O_CREAT;
-		++argv;
-	}
-	if(strcmp(argv[argn], "-R") == 0) {
-		rm = true;
-		++argn;
-	}
-	if(strcmp(argv[argn], "-l") == 0) {
-		loop = true;
-		++argn;
+	for(; argn < argc; ++argn) {
+		if(strcmp(argv[argn], "-r") == 0)
+			access_ = O_RDONLY;
+		else if(strcmp(argv[argn], "-c") == 0)
+			access_ |= O_CREAT;
+		else if(strcmp(argv[argn], "-2") == 0)
+			second = true;
+		else if(strcmp(argv[argn], "-t") == 0)
+			thread = true;
+		else if(strcmp(argv[argn], "-l") == 0)
+			loop = true;
+		else if(strcmp(argv[argn], "-R") == 0)
+			rm = true;
+		else
+			break;
 	}
 	const char* path = argv[argn++];
 	if(argc > argn) {
@@ -65,11 +85,23 @@ int main(int argc, char** argv)
 					return EXIT_FAILURE;
 			}
 			fprintf(stderr, "%s Deny-%c (share mode %x): ", path, toupper(share_flag), share_mode);
-			int file = sopen(path, access, share_mode, DEFFILEMODE);
+			int file = sopen(path, access_, share_mode, DEFFILEMODE);
 			if(file < 0)
 				fprintf(stderr, "Error %d (%s)\n", errno, strerror(errno));
 			else {
 				printf("Success\n");
+				if(second) {
+					printf("Opening second descriptor: ");
+					int fd2 = open(path, access_, DEFFILEMODE);
+					if(fd2 < 0)
+						fprintf(stderr, "Error %d (%s)\n", errno, strerror(errno));
+					else {
+						printf("Success\n");
+						printf("close(%s) = %d\n", path, close(fd2));
+					}
+				}
+				if(thread)
+					_beginthread(child, 0, (void*)path);
 				if(rm)
 					printf("remove(%s) = %d\n", path, unlink(path));
 				if(!try_all) {