diff --git a/src/command.cpp b/src/command.cpp
index 777ec668a7a10de88ff7eaab67b49e86fc8763c1..6d8571308682de62f806deb6d1245d6b35555ac1 100644
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -75,6 +75,8 @@ Command Command::fromString(const QString& source)
             return parseAuthenticate(rootobj);
         case Action::storeToken:
             return parseStoreToken(rootobj);
+        case Action::updateExperimentState:
+            return parseUpdateExperimentState(rootobj);
         case Action::sendHistogramUpdate:
         case Action::moveTargetCloser:
         case Action::moveTargetFarther:
@@ -88,7 +90,6 @@ Command Command::fromString(const QString& source)
             return parseError(rootobj);
         // Not yet implemented:
         case Action::queryServerInformation:
-        case Action::updateExperimentState:
         case Action::updateHistogram:
         case Action::setTargetState:
         case Action::fillHistogram:
@@ -183,6 +184,29 @@ Protocol::Command Protocol::Command::parseError(const QJsonObject& input)
            );
 }
 
+Protocol::Command Protocol::Command::parseUpdateExperimentState(const QJsonObject& input)
+{
+    if (
+        !input.keys().contains(QStringLiteral("action")) || !input.value(QStringLiteral("action")).isString()
+        || !input.keys().contains(QStringLiteral("adcstate")) || !input.value(QStringLiteral("adcstate")).isString()
+        || !input.keys().contains(QStringLiteral("adcthreshold")) || !input.value(QStringLiteral("adcthreshold")).isString()
+        || !input.keys().contains(QStringLiteral("beamhole")) || !input.value(QStringLiteral("beamhole")).isString()
+        || !input.keys().contains(QStringLiteral("pressurehPa")) || !input.value(QStringLiteral("pressurehPa")).isString()
+        || !input.keys().contains(QStringLiteral("targetposition")) || !input.value(QStringLiteral("targetposition")).isString()
+        || !input.keys().contains(QStringLiteral("token")) || !input.value(QStringLiteral("token")).isString()
+        || !input.keys().contains(QStringLiteral("vacuumvalve")) || !input.value(QStringLiteral("vacuumvalve")).isString()
+    ) {
+        logError(QStringLiteral("At least one property of the updateExperimentState command is missing or not a string."));
+        return Command();
+    }
+
+    return Command(
+               Action::updateExperimentState,
+               Arguments{std::make_pair(QStringLiteral("adcstate"), input.value(QStringLiteral("adcstate")).toString()), std::make_pair(QStringLiteral("adcthreshold"), input.value(QStringLiteral("adcthreshold")).toString()), std::make_pair(QStringLiteral("beamhole"), input.value(QStringLiteral("beamhole")).toString()), std::make_pair(QStringLiteral("pressurehPa"), input.value(QStringLiteral("pressurehPa")).toString()), std::make_pair(QStringLiteral("targetposition"), input.value(QStringLiteral("targetposition")).toString()), std::make_pair(QStringLiteral("vacuumvalve"), input.value(QStringLiteral("vacuumvalve")).toString())},
+               input.value(QStringLiteral("token")).toString()
+           );
+}
+
 QString Command::toString() const
 {
     if (action == Action::invalid)
diff --git a/src/command.h b/src/command.h
index 0fd7830b22c91827ec264590fef2fa3c9b0ff3e5..d87819ca333563819df5b1a8a1a2e6afa5143d95 100644
--- a/src/command.h
+++ b/src/command.h
@@ -72,6 +72,7 @@ private:
     static Command parseAuthenticate(const QJsonObject& input);
     static Command parseStoreToken(const QJsonObject& input);
     static Command parseError(const QJsonObject& input);
+    static Command parseUpdateExperimentState(const QJsonObject& input);
 
     static QString getActionString(const Action action);
 };