diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6d06143ad6cfb5f68206b4108b8abc7f45f329c1..7d4220d1e13d12997c540bc54ced8b6e99b5f7fe 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -22,7 +22,7 @@ image: alpine:3.15
 
 build:worker:
   stage: build
-  image: gitlab.fit.cvut.cz:5000/algorithms-library-toolkit/automata-library/cli:snapshot
+  image: gitlab.fit.cvut.cz:5000/algorithms-library-toolkit/webui-client/core-snapshot:0.0.0.r1468.g6fa14a8d8
   before_script:
     - apk add --no-cache curl && curl https://alt.fit.cvut.cz/repo/alpine/alt-dev-repo.sh | sh
     - apk add --no-cache build-base cmake jsoncpp-dev pkgconf apr-dev spdlog-dev catch2 activemq-cpp-dev argparse
diff --git a/webui/src/components/WebUI/Toolbar/AlgorithmDrawer.tsx b/webui/src/components/WebUI/Toolbar/AlgorithmDrawer.tsx
index f3add59e4ede28e80df3739abddd39530219779a..7c1e85a682d7279bfa4e9f67579a2ce7a5e79026 100644
--- a/webui/src/components/WebUI/Toolbar/AlgorithmDrawer.tsx
+++ b/webui/src/components/WebUI/Toolbar/AlgorithmDrawer.tsx
@@ -76,7 +76,7 @@ export const AlgorithmDrawer = () => {
 			handleButtonClick(
 				'inputString',
 				'string',
-				'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >',
+				'std:string',
 				[],
 				''
 			),
diff --git a/webui/src/reducers/algorithmData.ts b/webui/src/reducers/algorithmData.ts
index c90b19db3feb2f9833847b82c30091e9fe93a70e..46049e270e93620a5773867eb50b74ef6cf4619d 100644
--- a/webui/src/reducers/algorithmData.ts
+++ b/webui/src/reducers/algorithmData.ts
@@ -206,8 +206,7 @@ export const algorithmReducer = (
 				nodes: state.nodes.update(id, emptyNode, (node) => ({
 					...node,
 					name: 'string',
-					resultType:
-						'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >',
+					resultType: 'std::string',
 					nodeType: 'inputString',
 					value
 				})),
diff --git a/worker/Dockerfile b/worker/Dockerfile
index c01a20d895b2ad748ab8576dc6bd0e881e073426..a990975fd534eb3b4f0779d4d46c65df6c05083a 100644
--- a/worker/Dockerfile
+++ b/worker/Dockerfile
@@ -1,4 +1,4 @@
-ARG BASE_IMAGE=gitlab.fit.cvut.cz:5000/algorithms-library-toolkit/automata-library/cli:snapshot
+ARG BASE_IMAGE=gitlab.fit.cvut.cz:5000/algorithms-library-toolkit/webui-client/core-snapshot:0.0.0.r1468.g6fa14a8d8
 
 #-----------------------------------------------------------------------------------------
 
diff --git a/worker/src/utils/alt.cpp b/worker/src/utils/alt.cpp
index 0bcfb46630d8f166bb846e918f54f6bb02ed360e..5da5a8e54617c0019c9271bd9bd789bea7cd27c8 100644
--- a/worker/src/utils/alt.cpp
+++ b/worker/src/utils/alt.cpp
@@ -5,7 +5,7 @@
 
 std::string abstractValueToString(const std::shared_ptr<abstraction::Value>& val)
 {
-    std::shared_ptr<abstraction::OperationAbstraction> op = abstraction::Registry::getValuePrinterAbstraction(val->getType());
+    std::shared_ptr<abstraction::OperationAbstraction> op = abstraction::Registry::getValuePrinterAbstraction(val->getDeclaredType());
 
     ext::ostringstream oss;
     op->attachInput(val, 0);
diff --git a/worker/src/worker/introspection/introspect.cpp b/worker/src/worker/introspection/introspect.cpp
index 2080a3d650fb81cb883ec4cac46061d9d1c6f530..34fbbf2141384409a2f70afcb40d922422593a46 100644
--- a/worker/src/worker/introspection/introspect.cpp
+++ b/worker/src/worker/introspection/introspect.cpp
@@ -20,10 +20,9 @@ Json::Value getAlgorithmOverloadJSON(const ext::tuple<abstraction::AlgorithmFull
 
     while (paramsIterator != params.cend() || paramsNamesIterator != paramsNames.cend()) {
         Json::Value paramJSON(Json::objectValue);
-        ;
 
         paramJSON["name"] = *paramsNamesIterator;
-        paramJSON["type"] = std::get<0>(*paramsIterator);
+        paramJSON["type"] = ext::to_string(std::get<0>(*paramsIterator));
 
         paramsJSON.append(paramJSON);
 
@@ -31,7 +30,7 @@ Json::Value getAlgorithmOverloadJSON(const ext::tuple<abstraction::AlgorithmFull
         ++paramsNamesIterator;
     }
 
-    overloadJSON["resultType"] = info.getResult().first;
+    overloadJSON["resultType"] = ext::to_string(info.getResult().first);
     overloadJSON["params"] = paramsJSON;
     if (auto docs = std::get<1>(overload)) {
         overloadJSON["docs"] = *docs;
@@ -85,13 +84,12 @@ Json::Value getCastsJSON()
 {
     Json::Value castsJSON(Json::objectValue);
 
-    for (const ext::tuple<std::string, std::string, bool>& castPair : abstraction::Registry::listCasts()) {
-        const auto& isExplicit = std::get<2>(castPair);
+    for (const auto& [toType, fromType, isExplicit] : abstraction::Registry::listCasts()) {
         if (isExplicit)
             continue;
 
-        const auto& from = std::get<1>(castPair);
-        const auto& to = std::get<0>(castPair);
+        auto from = ext::to_string(fromType);
+        auto to = ext::to_string(toType);
 
         if (castsJSON[from].isNull())
             castsJSON[from] = Json::Value(Json::arrayValue);
diff --git a/worker/test-src/evaluator/AlgorithmNodeTest.cpp b/worker/test-src/evaluator/AlgorithmNodeTest.cpp
index 23071e579b082ab7c0095c87befc984e32c4f0c3..b35f8c6c1a467c4ecb69b516b08b0eb437f87999 100644
--- a/worker/test-src/evaluator/AlgorithmNodeTest.cpp
+++ b/worker/test-src/evaluator/AlgorithmNodeTest.cpp
@@ -57,21 +57,32 @@ TEST_CASE("AlgorithmNode evaluate")
 
 TEST_CASE("AlgorithmNode multiple params evaluate")
 {
-    auto inputInt = std::make_shared<IntNode>("", 4, ext::vector<std::string>());
-    auto inputBool = std::make_shared<BoolNode>("", false, ext::vector<std::string>());
-    auto node = std::make_shared<AlgorithmNode>("", "string::generate::RandomStringFactory", ext::vector<std::string>());
+    auto alphabetSize = std::make_shared<IntNode>("", 4, ext::vector<std::string>());
+    auto randomizeAlphabet = std::make_shared<BoolNode>("", true, ext::vector<std::string>());
+    auto lowerCase = std::make_shared<BoolNode>("", false, ext::vector<std::string>());
+    auto randomAlphabet = std::make_shared<AlgorithmNode>("", "alphabet::generate::GenerateAlphabet", ext::vector<std::string>());
+
+    alphabetSize->createEdge(randomAlphabet, 0);
+    randomizeAlphabet->createEdge(randomAlphabet, 1);
+    lowerCase->createEdge(randomAlphabet, 2);
+
+    auto stringSize = std::make_shared<IntNode>("", 10, ext::vector<std::string>());
+    auto randomString = std::make_shared<AlgorithmNode>("", "string::generate::RandomStringFactory", ext::vector<std::string>());
     auto mockOutputNode = std::make_shared<AlgorithmTestNodeMock>();
 
-    inputInt->createEdge(node, 0);
-    inputInt->createEdge(node, 1);
-    inputBool->createEdge(node, 2);
-    inputBool->createEdge(node, 3);
+    stringSize->createEdge(randomString, 0);
+    randomAlphabet->createEdge(randomString, 1);
+    randomString->createEdge(mockOutputNode, 0);
 
     cli::Environment environment;
-    inputInt->evaluate(environment);
-    inputBool->evaluate(environment);
-    node->evaluate(environment);
+    alphabetSize->evaluate(environment);
+    randomizeAlphabet->evaluate(environment);
+    lowerCase->evaluate(environment);
+    randomAlphabet->evaluate(environment);
+    stringSize->evaluate(environment);
+    randomString->evaluate(environment);
     mockOutputNode->evaluate(environment);
 
     REQUIRE(mockOutputNode->getParams().size() == 1);
+    REQUIRE(abstractValueToString(mockOutputNode->getParams().at(0)).starts_with("(LinearString content"));
 }