diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java
index 116ad2f68ff4170d6bf46f93b675d9259fa4d2a2..6239dd78e801cc195f325181558763dae2e7a660 100644
--- a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatus.java
@@ -1,10 +1,15 @@
 package de.ozgcloud.apilib.common.command;
 
+import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.commons.lang3.StringUtils;
+
 import de.ozgcloud.common.datatype.StringBasedValue;
 import lombok.EqualsAndHashCode;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @EqualsAndHashCode(callSuper = true)
 public class OzgCloudCommandStatus extends StringBasedValue {
 
@@ -14,14 +19,24 @@ public class OzgCloudCommandStatus extends StringBasedValue {
 	public static final OzgCloudCommandStatus REVOKE_PENDING = new OzgCloudCommandStatus("REVOKE_PENDING");
 	public static final OzgCloudCommandStatus REVOKED = new OzgCloudCommandStatus("REVOKED");
 
+	private static final Set<OzgCloudCommandStatus> ALL_STATES = new HashSet<>(Set.of(PENDING, FINISHED, ERROR, REVOKE_PENDING, REVOKED));
 	private static final Set<OzgCloudCommandStatus> FINAL_STATES = Set.of(FINISHED, ERROR, REVOKED);
 
 	OzgCloudCommandStatus(String status) {
 		super(status);
 	}
 
-	public static OzgCloudCommandStatus from(String status) {
-		return new OzgCloudCommandStatus(status);
+	public static OzgCloudCommandStatus from(String statusString) {
+		return ALL_STATES.stream()
+				.filter(status -> StringUtils.equals(statusString, status.toString())).findAny()
+				.orElseGet(() -> unknownStatus(statusString));
+	}
+
+	private static OzgCloudCommandStatus unknownStatus(String statusString) {
+		LOG.warn("Unknown status string given: {}", statusString);
+		var newStatus = new OzgCloudCommandStatus(statusString);
+		ALL_STATES.add(newStatus);
+		return newStatus;
 	}
 
 	public boolean isFinalState() {
diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java
index 42ca9bbf70f581d9bbb1a9398b80ed6eba5f0a92..a1a7a5a8ed6a19edfb5d6667acd4554089197d5d 100644
--- a/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java
+++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandService.java
@@ -64,7 +64,7 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
 	}
 
 	void verifyCommand(OzgCloudCommand command) {
-		if (command.getStatus() == OzgCloudCommandStatus.ERROR) {
+		if (OzgCloudCommandStatus.ERROR.equals(command.getStatus())) {
 			throw new TechnicalException("Command (id=%s) failed: %s".formatted(command.getId(), command.getErrorMessage()));
 		}
 	}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatusTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatusTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..14ef4c1ffd07b005ffe490d78beece0dd105cf3d
--- /dev/null
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/OzgCloudCommandStatusTest.java
@@ -0,0 +1,45 @@
+package de.ozgcloud.apilib.common.command;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+class OzgCloudCommandStatusTest {
+
+	@Nested
+	class From {
+
+		@Test
+		void shouldReturnSameInstance() {
+			OzgCloudCommandStatus result = OzgCloudCommandStatus.from("ERROR");
+
+			assertThat(OzgCloudCommandStatus.ERROR).isSameAs(result);
+		}
+
+		@ParameterizedTest
+		@ValueSource(strings = { "PENDING", "FINISHED", "ERROR", "REVOKE_PENDING", "REVOKED" })
+		void shouldReturnSameInstance(String status) {
+			OzgCloudCommandStatus result = OzgCloudCommandStatus.from(status);
+
+			assertThat(result).isSameAs(OzgCloudCommandStatus.from(status));
+		}
+
+		@Test
+		void shouldAllowUnkownStatusString() {
+			var result = OzgCloudCommandStatus.from("SOMETHING_NEW");
+
+			assertThat(result).isNotNull();
+		}
+
+		@Test
+		void shouldLearnNewStatus() {
+			var result = OzgCloudCommandStatus.from("SOMETHING_NEW");
+
+			assertThat(result).isSameAs(OzgCloudCommandStatus.from("SOMETHING_NEW"));
+		}
+	}
+
+}
diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java
index 3bd0589814294aec800d3157c4acf933094d2c03..fa820c62f6acbc2d40e755a9b08a61b309c68b31 100644
--- a/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java
+++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/common/command/grpc/GrpcOzgCloudCommandServiceTest.java
@@ -124,7 +124,7 @@ class GrpcOzgCloudCommandServiceTest {
 
 		@Test
 		void shouldThrowException() {
-			var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.ERROR).build();
+			var command = OzgCloudCommandTestFactory.createBuilder().status(OzgCloudCommandStatus.from("ERROR")).build();
 
 			assertThrows(TechnicalException.class, () -> service.verifyCommand(command));
 		}