diff --git a/alib2cli/src/ast/command/EvalCommand.h b/alib2cli/src/ast/command/EvalCommand.h
index b7d561aa706e440ad322c23be567447efbade70c..079ea21598bd880dc26eeba05efde872f3e3a1ea 100644
--- a/alib2cli/src/ast/command/EvalCommand.h
+++ b/alib2cli/src/ast/command/EvalCommand.h
@@ -19,7 +19,7 @@ public:
 
     CommandResult run(Environment& environment) const override
     {
-        CommandResult state = environment.execute(std::make_shared<cli::StringLineInterface>(cli::StringLineInterface(m_code)));
+        CommandResult state = environment.execute(m_code);
 
         if (state != cli::CommandResult::QUIT)
             state = cli::CommandResult::OK;
diff --git a/alib2cli/src/ast/command/InterpretCommand.h b/alib2cli/src/ast/command/InterpretCommand.h
index 7a119ebe8df953c02e426ed2aa65d8b2e81318b6..35a29366607c7c0ba23d8c49bd723930bac914d1 100644
--- a/alib2cli/src/ast/command/InterpretCommand.h
+++ b/alib2cli/src/ast/command/InterpretCommand.h
@@ -24,7 +24,7 @@ public:
         if (!ifs.is_open())
             throw exception::CommonException("File '" + m_fileName + "' not found.");
 
-        CommandResult state = environment.execute(std::make_shared<cli::IstreamLineInterface<std::ifstream>>(cli::IstreamLineInterface<std::ifstream>(std::move(ifs))));
+        CommandResult state = environment.execute(ifs);
 
         if (state != cli::CommandResult::QUIT && state != cli::CommandResult::RETURN)
             state = cli::CommandResult::OK;
diff --git a/alib2cli/src/environment/Environment.cpp b/alib2cli/src/environment/Environment.cpp
index d40d5c1f7942e3450f7dadae51757d235ff1faeb..1217d2977ff14c3a780a891a3d9888356f482f9b 100644
--- a/alib2cli/src/environment/Environment.cpp
+++ b/alib2cli/src/environment/Environment.cpp
@@ -2,8 +2,7 @@
 
 #include <ext/exception>
 
-#include <lexer/Lexer.h>
-#include <parser/Parser.h>
+#include <parser/Parser2.h>
 
 #include <global/GlobalData.h>
 
@@ -43,33 +42,6 @@ std::string Environment::getBinding(const std::string& name) const
     throw exception::CommonException("Binded value of name " + name + " not found.");
 }
 
-cli::CommandResult Environment::execute(const std::shared_ptr<cli::LineInterface>& lineInterface)
-{
-    cli::CommandResult state = cli::CommandResult::OK;
-
-    while (state == cli::CommandResult::OK || state == cli::CommandResult::ERROR)
-        state = execute_line(cli::CharSequence(lineInterface));
-
-    return state;
-}
-
-cli::CommandResult Environment::execute_line(cli::CharSequence charSequence)
-{
-    try {
-        cli::Parser parser = cli::Parser(cli::Lexer(std::move(charSequence)));
-        std::unique_ptr<CommandList> command = parser.parse();
-        cli::CommandResult res = command->run(*this);
-
-        if (res == CommandResult::CONTINUE || res == CommandResult::BREAK)
-            throw std::logic_error("There is no loop to continue/break.");
-
-        return res;
-    } catch (...) {
-        alib::ExceptionHandler::handle(common::Streams::err);
-        return cli::CommandResult::EXCEPTION;
-    }
-}
-
 Environment& Environment::getGlobalScope()
 {
     if (!static_cast<bool>(m_upper))
@@ -77,10 +49,10 @@ Environment& Environment::getGlobalScope()
     return m_upper->getGlobalScope();
 }
 
-cli::CommandResult Environment::execute(const std::unique_ptr<cli::Command>& ast)
+cli::CommandResult Environment::execute(const std::unique_ptr<cli::Command>& command)
 {
     try {
-        cli::CommandResult res = ast->run(*this);
+        const CommandResult res = command->run(*this);
 
         if (res == CommandResult::CONTINUE || res == CommandResult::BREAK)
             throw std::logic_error("There is no loop to continue/break.");
@@ -88,8 +60,16 @@ cli::CommandResult Environment::execute(const std::unique_ptr<cli::Command>& ast
         return res;
     } catch (...) {
         alib::ExceptionHandler::handle(common::Streams::err);
-        return cli::CommandResult::EXCEPTION;
+        return CommandResult::EXCEPTION;
     }
 }
+cli::CommandResult Environment::execute(const std::string& input)
+{
+    return execute(Parser2::parseString(input));
+}
+cli::CommandResult Environment::execute(std::istream& input)
+{
+    return execute(Parser2::parseStream(input));
+}
 
 } /* namespace cli */
diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h
index 0e2d90af5c87738a01eecd473cd77d6192547653..763b3db1264a54b19e85f1f0a065f66c5ba23759 100644
--- a/alib2cli/src/environment/Environment.h
+++ b/alib2cli/src/environment/Environment.h
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <istream>
+
 #include <ext/concepts>
 #include <ext/memory>
 #include <ext/typeinfo>
@@ -119,10 +121,11 @@ public:
         return m_result;
     }
 
-    cli::CommandResult execute(const std::shared_ptr<cli::LineInterface>& lineInterface);
-    cli::CommandResult execute(const std::unique_ptr<cli::Command>& ast);
+    cli::CommandResult execute(const std::string& input);
+
+    cli::CommandResult execute(std::istream& input);
 
-    cli::CommandResult execute_line(cli::CharSequence charSequence);
+    cli::CommandResult execute(const std::unique_ptr<cli::Command>& command);
 
     Environment& getGlobalScope();
 };
diff --git a/alib2cli/test-src/aql/AntlrParserTest.cpp b/alib2cli/test-src/aql/AntlrParserTest.cpp
index 147bbcf77ef5e923d28386b5af64d8069ca18937..eaa92aadb75bd4c9c051341d7fcf7c81c38cd65f 100644
--- a/alib2cli/test-src/aql/AntlrParserTest.cpp
+++ b/alib2cli/test-src/aql/AntlrParserTest.cpp
@@ -14,9 +14,7 @@ template <typename T>
 std::unique_ptr<cli::CommandList> oldParseFile(T&& stream, bool print)
 {
     try {
-        auto command = cli::Parser(
-                           cli::Lexer(cli::CharSequence(cli::IstreamLineInterface<T>(std::forward<T>(stream)))))
-                           .parse();
+        auto command = cli::Parser::parse(cli::Lexer(cli::CharSequence(cli::IstreamLineInterface<T>(std::forward<T>(stream)))));
 
         if (print) {
             command->print(Catch::cout());
diff --git a/alib2cli/test-src/cli/TestUdfEval.cpp b/alib2cli/test-src/cli/TestUdfEval.cpp
index 57d16a9ed9e11f602558bbf2cd109446bef9b983..9b6c087f56250ec150aef2ceed423428b10537d6 100644
--- a/alib2cli/test-src/cli/TestUdfEval.cpp
+++ b/alib2cli/test-src/cli/TestUdfEval.cpp
@@ -15,8 +15,9 @@ TEST_CASE("Udf eval", "[unit][cli]")
     {
         cli::Environment environment;
 
-        std::string foo("function mojeFunkce ( const auto & $mojepromenna ) returning auto begin\nreturn $mojepromenna;\nend");
-        environment.execute(std::make_shared<cli::StringLineInterface>(cli::StringLineInterface(foo)));
+        environment.execute("function mojeFunkce ( const auto & $mojepromenna ) returning auto begin\n"
+                            "return $mojepromenna;\n"
+                            "end");
 
         auto input = std::make_shared<abstraction::ValueHolder<std::string>>(std::string{"neco"}, true);