diff --git a/buildcc/CMakeLists.txt b/buildcc/CMakeLists.txt
index 860404be..90bf1a23 100644
--- a/buildcc/CMakeLists.txt
+++ b/buildcc/CMakeLists.txt
@@ -34,6 +34,9 @@ endif()
 # Environment
 add_subdirectory(lib/env)
 
+# 
+add_subdirectory(lib/command)
+
 # Toolchain
 add_subdirectory(lib/toolchain)
 add_subdirectory(toolchains)
diff --git a/buildcc/lib/command/CMakeLists.txt b/buildcc/lib/command/CMakeLists.txt
new file mode 100644
index 00000000..6c9d63da
--- /dev/null
+++ b/buildcc/lib/command/CMakeLists.txt
@@ -0,0 +1,65 @@
+if (${TESTING})
+    add_library(mock_command
+        mock/execute.cpp
+        src/command.cpp
+    )
+    target_include_directories(mock_command PUBLIC 
+        ${CMAKE_CURRENT_SOURCE_DIR}/include
+        ${CMAKE_CURRENT_SOURCE_DIR}/mock
+    )
+    target_link_libraries(mock_command PUBLIC
+        fmt::fmt-header-only
+        mock_env
+        CppUTest
+        CppUTestExt
+        gcov
+    )
+    target_compile_options(mock_command PUBLIC ${TEST_COMPILE_FLAGS} ${BUILD_COMPILE_FLAGS})
+    target_link_options(mock_command PUBLIC ${TEST_LINK_FLAGS} ${BUILD_LINK_FLAGS})
+endif()
+
+set(COMMAND_SRCS
+    src/execute.cpp
+    src/command.cpp
+    include/command/command.h
+)
+
+if(${BUILDCC_BUILD_AS_SINGLE_LIB})
+    target_sources(buildcc PRIVATE
+        ${COMMAND_SRCS}
+    )
+    target_include_directories(buildcc PUBLIC
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+        $<INSTALL_INTERFACE:${BUILDCC_INSTALL_HEADER_PREFIX}>
+    )
+endif()
+
+if(${BUILDCC_BUILD_AS_INTERFACE})
+    m_clangtidy("command")
+    add_library(command
+        ${COMMAND_SRCS}
+    )
+    target_include_directories(command PUBLIC 
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+        $<INSTALL_INTERFACE:${BUILDCC_INSTALL_HEADER_PREFIX}>
+    )
+    target_link_libraries(command PRIVATE 
+        fmt::fmt-header-only
+        tiny-process-library::tiny-process-library
+
+        env
+    )
+    target_compile_options(command PRIVATE ${BUILD_COMPILE_FLAGS})
+    target_link_options(command PRIVATE ${BUILD_LINK_FLAGS})
+
+
+    # Command install
+    if (${BUILDCC_INSTALL})
+        install(TARGETS command DESTINATION lib EXPORT commandConfig)
+        install(EXPORT commandConfig DESTINATION "${BUILDCC_INSTALL_LIB_PREFIX}/command")
+    endif()
+endif()
+
+if (${BUILDCC_INSTALL})
+    install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION "${BUILDCC_INSTALL_HEADER_PREFIX}")
+endif()
diff --git a/buildcc/lib/target/include/target/command.h b/buildcc/lib/command/include/command/command.h
similarity index 88%
rename from buildcc/lib/target/include/target/command.h
rename to buildcc/lib/command/include/command/command.h
index 0e399400..047fe4bf 100644
--- a/buildcc/lib/target/include/target/command.h
+++ b/buildcc/lib/command/include/command/command.h
@@ -14,16 +14,14 @@
  * limitations under the License.
  */
 
-#ifndef TARGET_COMMAND_H_
-#define TARGET_COMMAND_H_
+#ifndef COMMAND_COMMAND_H_
+#define COMMAND_COMMAND_H_
 
+#include <string>
+#include <string_view>
 #include <unordered_map>
 
-#include "target/path.h"
-
-#include "toolchain/toolchain.h"
-
-namespace buildcc::internal {
+namespace buildcc {
 
 class Command {
 public:
@@ -45,6 +43,6 @@ class Command {
   std::unordered_map<const char *, std::string> default_values_;
 };
 
-} // namespace buildcc::internal
+} // namespace buildcc
 
 #endif
diff --git a/buildcc/lib/target/mock/util/execute.cpp b/buildcc/lib/command/mock/execute.cpp
similarity index 82%
rename from buildcc/lib/target/mock/util/execute.cpp
rename to buildcc/lib/command/mock/execute.cpp
index 0658e058..c1226eaa 100644
--- a/buildcc/lib/target/mock/util/execute.cpp
+++ b/buildcc/lib/command/mock/execute.cpp
@@ -1,8 +1,8 @@
-#include "target/command.h"
+#include "command/command.h"
 
 #include "CppUTestExt/MockSupport.h"
 
-namespace buildcc::internal {
+namespace buildcc {
 
 static constexpr const char *const EXECUTE_FUNCTION = "execute";
 
@@ -20,4 +20,4 @@ void CommandExpect_Execute(unsigned int calls, bool expectation) {
 
 } // namespace m
 
-} // namespace buildcc::internal
+} // namespace buildcc
diff --git a/buildcc/lib/command/mock/expect_command.h b/buildcc/lib/command/mock/expect_command.h
new file mode 100644
index 00000000..3dd539bd
--- /dev/null
+++ b/buildcc/lib/command/mock/expect_command.h
@@ -0,0 +1,10 @@
+#ifndef COMMAND_MOCK_EXPECT_COMMAND_H_
+#define COMMAND_MOCK_EXPECT_COMMAND_H_
+
+namespace buildcc::m {
+
+void CommandExpect_Execute(unsigned int calls, bool expectation);
+
+} // namespace buildcc::m
+
+#endif
diff --git a/buildcc/lib/target/src/util/command.cpp b/buildcc/lib/command/src/command.cpp
similarity index 95%
rename from buildcc/lib/target/src/util/command.cpp
rename to buildcc/lib/command/src/command.cpp
index 80ec331f..31135be8 100644
--- a/buildcc/lib/target/src/util/command.cpp
+++ b/buildcc/lib/command/src/command.cpp
@@ -14,14 +14,16 @@
  * limitations under the License.
  */
 
-#include "target/command.h"
+#include "command/command.h"
 
 #include <algorithm>
 
-#include "env/logging.h"
 #include "fmt/format.h"
 
-namespace buildcc::internal {
+#include "env/assert_fatal.h"
+#include "env/logging.h"
+
+namespace buildcc {
 
 void Command::AddDefaultArguments(
     const std::unordered_map<const char *, std::string> &arguments) {
@@ -61,4 +63,4 @@ bool Command::ConstructAndExecute(
   return Execute(constructed_command);
 }
 
-} // namespace buildcc::internal
+} // namespace buildcc
diff --git a/buildcc/lib/target/src/util/execute.cpp b/buildcc/lib/command/src/execute.cpp
similarity index 88%
rename from buildcc/lib/target/src/util/execute.cpp
rename to buildcc/lib/command/src/execute.cpp
index da1ba27b..ef04df69 100644
--- a/buildcc/lib/target/src/util/execute.cpp
+++ b/buildcc/lib/command/src/execute.cpp
@@ -14,15 +14,18 @@
  * limitations under the License.
  */
 
-#include "target/command.h"
+#include "command/command.h"
 
+#include "fmt/format.h"
+
+#include "env/assert_fatal.h"
 #include "env/logging.h"
 
 #include "process.hpp"
 
 namespace tpl = TinyProcessLib;
 
-namespace buildcc::internal {
+namespace buildcc {
 
 bool Command::Execute(const std::string &command) {
   env::assert_fatal(!command.empty(),
@@ -33,4 +36,4 @@ bool Command::Execute(const std::string &command) {
   return process.get_exit_status() == 0;
 }
 
-} // namespace buildcc::internal
+} // namespace buildcc
diff --git a/buildcc/lib/env/CMakeLists.txt b/buildcc/lib/env/CMakeLists.txt
index 9458eb75..93c26078 100644
--- a/buildcc/lib/env/CMakeLists.txt
+++ b/buildcc/lib/env/CMakeLists.txt
@@ -10,6 +10,8 @@ if (${TESTING})
     target_link_libraries(mock_env PUBLIC
         fmt::fmt-header-only
     )
+    target_compile_options(mock_env PUBLIC ${TEST_COMPILE_FLAGS} ${BUILD_COMPILE_FLAGS})
+    target_link_options(mock_env PUBLIC ${TEST_LINK_FLAGS} ${BUILD_LINK_FLAGS})
 endif()
 
 set(ENV_SRCS
diff --git a/buildcc/lib/target/cmake/mock_target.cmake b/buildcc/lib/target/cmake/mock_target.cmake
index 4a5d4dd9..e75b4ed7 100644
--- a/buildcc/lib/target/cmake/mock_target.cmake
+++ b/buildcc/lib/target/cmake/mock_target.cmake
@@ -12,8 +12,6 @@ add_library(mock_target STATIC
     src/fbs/fbs_storer.cpp
 
     src/util/util.cpp
-    src/util/command.cpp
-    mock/util/execute.cpp
 )
 target_include_directories(mock_target PUBLIC
     ${CMAKE_CURRENT_SOURCE_DIR}/include
@@ -28,6 +26,7 @@ target_link_libraries(mock_target PUBLIC
     Taskflow
 
     mock_env
+    mock_command
     toolchain
 
     CppUTest
diff --git a/buildcc/lib/target/cmake/target.cmake b/buildcc/lib/target/cmake/target.cmake
index 520ad9a2..2603ce76 100644
--- a/buildcc/lib/target/cmake/target.cmake
+++ b/buildcc/lib/target/cmake/target.cmake
@@ -13,14 +13,11 @@ set(TARGET_SRCS
     src/fbs/fbs_storer.cpp
 
     src/util/util.cpp
-    src/util/command.cpp
-    src/util/execute.cpp
 
     include/target/target.h
     include/target/fbs_loader.h
     include/target/path.h
     include/target/util.h
-    include/target/command.h
 )
 
 if(${BUILDCC_BUILD_AS_SINGLE_LIB})
@@ -48,13 +45,11 @@ if(${BUILDCC_BUILD_AS_INTERFACE})
     )
     target_link_libraries(target PUBLIC 
         env
+        command
         toolchain
         flatbuffers_header_only
         Taskflow
     )
-    target_link_libraries(target PRIVATE
-        tiny-process-library::tiny-process-library
-    )
 
     target_include_directories(target PRIVATE
         ${SCHEMA_BUILD_DIR}
diff --git a/buildcc/lib/target/include/target/target.h b/buildcc/lib/target/include/target/target.h
index 46428481..7e8bc3de 100644
--- a/buildcc/lib/target/include/target/target.h
+++ b/buildcc/lib/target/include/target/target.h
@@ -27,14 +27,12 @@
 #include <vector>
 
 // Internal
-#include "target/command.h"
 #include "target/fbs_loader.h"
 #include "target/path.h"
 
-#include "toolchain/toolchain.h"
-
-// Env
+#include "command/command.h"
 #include "env/env.h"
+#include "toolchain/toolchain.h"
 
 // Third Party
 #include "taskflow/taskflow.hpp"
@@ -313,7 +311,7 @@ class Target {
   // TODO, Add more internal variables
 
   internal::FbsLoader loader_;
-  internal::Command command_;
+  Command command_;
 
   // Build states
   bool dirty_ = false;
diff --git a/buildcc/lib/target/mock/expect_target.h b/buildcc/lib/target/mock/expect_target.h
index a12c1783..61d28aa1 100644
--- a/buildcc/lib/target/mock/expect_target.h
+++ b/buildcc/lib/target/mock/expect_target.h
@@ -5,12 +5,6 @@
 
 namespace buildcc {
 
-namespace internal::m {
-
-void CommandExpect_Execute(unsigned int calls, bool expectation);
-
-} // namespace internal::m
-
 namespace base::m {
 
 void TargetExpect_SourceRemoved(unsigned int calls, Target *target);
diff --git a/buildcc/lib/target/src/target/source.cpp b/buildcc/lib/target/src/target/source.cpp
index cbe3c4f4..6ba19a9b 100644
--- a/buildcc/lib/target/src/target/source.cpp
+++ b/buildcc/lib/target/src/target/source.cpp
@@ -162,8 +162,7 @@ void Target::RecompileSources(std::vector<fs::path> &compile_sources,
 }
 
 void Target::CompileSource(const fs::path &current_source) const {
-  const bool success =
-      internal::Command::Execute(CompileCommand(current_source));
+  const bool success = Command::Execute(CompileCommand(current_source));
   env::assert_fatal(success, fmt::format("Compilation failed for: {}",
                                          current_source.string()));
 }
diff --git a/buildcc/lib/target/test/target/test_target_c_compile_flags.cpp b/buildcc/lib/target/test/target/test_target_c_compile_flags.cpp
index 6185c27b..b9299ac6 100644
--- a/buildcc/lib/target/test/target/test_target_c_compile_flags.cpp
+++ b/buildcc/lib/target/test/target/test_target_c_compile_flags.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -48,8 +50,8 @@ TEST(TargetTestCCompileFlagsGroup, Target_AddCompileFlag) {
   simple.AddSource(DUMMY_MAIN);
   simple.AddCCompileFlag("-std=c11");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   simple.Build();
 
   mock().checkExpectations();
@@ -78,8 +80,8 @@ TEST(TargetTestCCompileFlagsGroup, Target_ChangedCompileFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddCCompileFlag("-std=c11");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
   {
@@ -88,8 +90,8 @@ TEST(TargetTestCCompileFlagsGroup, Target_ChangedCompileFlag) {
                                  gcc, "data");
     simple.AddSource(DUMMY_MAIN);
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
@@ -100,8 +102,8 @@ TEST(TargetTestCCompileFlagsGroup, Target_ChangedCompileFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddCCompileFlag("-std=c11");
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
diff --git a/buildcc/lib/target/test/target/test_target_cpp_compile_flags.cpp b/buildcc/lib/target/test/target/test_target_cpp_compile_flags.cpp
index f03cb6d3..27df7c16 100644
--- a/buildcc/lib/target/test/target/test_target_cpp_compile_flags.cpp
+++ b/buildcc/lib/target/test/target/test_target_cpp_compile_flags.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -48,8 +50,8 @@ TEST(TargetTestCppCompileFlagsGroup, Target_AddCompileFlag) {
   simple.AddSource(DUMMY_MAIN);
   simple.AddCppCompileFlag("-std=c++17");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   simple.Build();
 
   mock().checkExpectations();
@@ -78,8 +80,8 @@ TEST(TargetTestCppCompileFlagsGroup, Target_ChangedCompileFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddCCompileFlag("-std=c++17");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
   {
@@ -88,8 +90,8 @@ TEST(TargetTestCppCompileFlagsGroup, Target_ChangedCompileFlag) {
                                  gcc, "data");
     simple.AddSource(DUMMY_MAIN);
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
@@ -100,8 +102,8 @@ TEST(TargetTestCppCompileFlagsGroup, Target_ChangedCompileFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddCCompileFlag("-std=c++17");
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
diff --git a/buildcc/lib/target/test/target/test_target_external_lib.cpp b/buildcc/lib/target/test/target/test_target_external_lib.cpp
index 47e23264..6ffd0e90 100644
--- a/buildcc/lib/target/test/target/test_target_external_lib.cpp
+++ b/buildcc/lib/target/test/target/test_target_external_lib.cpp
@@ -2,7 +2,9 @@
 
 #include "env/logging.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "target/fbs_loader.h"
@@ -43,8 +45,8 @@ TEST(TargetTestExternalLib, TestAddLibDir) {
   exe.AddSource("foo_main.cpp");
   exe.AddLibDir(exe.GetTargetPath().parent_path());
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   exe.Build();
 
   mock().checkExpectations();
@@ -69,8 +71,8 @@ TEST(TargetTestExternalLib, TestAddExternalLibDep_Simple) {
   exe.AddLibDir(exe.GetTargetPath().parent_path());
   exe.AddLibDep("-lfoo");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   exe.Build();
 
   mock().checkExpectations();
@@ -96,8 +98,8 @@ TEST(TargetTestExternalLib, TestAddExternalLibDep_RebuildChanged) {
     exe.AddSource("foo_main.cpp");
     exe.AddLibDir(exe.GetTargetPath().parent_path());
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe.Build();
   }
 
@@ -110,7 +112,7 @@ TEST(TargetTestExternalLib, TestAddExternalLibDep_RebuildChanged) {
     exe.AddLibDep("-lfoo");
 
     buildcc::base::m::TargetExpect_ExternalLibChanged(1, &exe);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe.Build();
   }
 
@@ -122,7 +124,7 @@ TEST(TargetTestExternalLib, TestAddExternalLibDep_RebuildChanged) {
     exe.AddLibDir(exe.GetTargetPath().parent_path());
 
     buildcc::base::m::TargetExpect_ExternalLibChanged(1, &exe);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe.Build();
   }
 
diff --git a/buildcc/lib/target/test/target/test_target_include_dir.cpp b/buildcc/lib/target/test/target/test_target_include_dir.cpp
index 8c90a87a..c0ed7279 100644
--- a/buildcc/lib/target/test/target/test_target_include_dir.cpp
+++ b/buildcc/lib/target/test/target/test_target_include_dir.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -108,8 +110,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildIncludeDir) {
     // Duplicate include directory
     include_compile.AddIncludeDir(RELATIVE_INCLUDE_DIR);
 
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     include_compile.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -139,8 +141,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildIncludeDir) {
     include_compile.AddIncludeDir("");
 
     buildcc::base::m::TargetExpect_DirChanged(1, &include_compile);
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     include_compile.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -167,8 +169,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildIncludeDir) {
     include_compile.AddIncludeDir(RELATIVE_INCLUDE_DIR);
 
     buildcc::base::m::TargetExpect_DirChanged(1, &include_compile);
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     include_compile.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -219,8 +221,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildHeaderFile) {
     add_header.AddSource(INCLUDE_HEADER_SOURCE);
     add_header.AddIncludeDir(RELATIVE_INCLUDE_DIR);
 
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     add_header.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -241,8 +243,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildHeaderFile) {
     add_header.AddIncludeDir(RELATIVE_INCLUDE_DIR);
 
     buildcc::base::m::TargetExpect_PathAdded(1, &add_header);
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     add_header.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -269,8 +271,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildHeaderFile) {
     add_header.AddIncludeDir(RELATIVE_INCLUDE_DIR);
 
     buildcc::base::m::TargetExpect_PathUpdated(1, &add_header);
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     add_header.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -290,8 +292,8 @@ TEST(TargetTestIncludeDirGroup, TargetBuildHeaderFile) {
     add_header.AddIncludeDir(RELATIVE_INCLUDE_DIR);
 
     buildcc::base::m::TargetExpect_PathRemoved(1, &add_header);
-    buildcc::internal::m::CommandExpect_Execute(2, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(2, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     add_header.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
diff --git a/buildcc/lib/target/test/target/test_target_lib_dep.cpp b/buildcc/lib/target/test/target/test_target_lib_dep.cpp
index 5847316d..7e3ebe0c 100644
--- a/buildcc/lib/target/test/target/test_target_lib_dep.cpp
+++ b/buildcc/lib/target/test/target/test_target_lib_dep.cpp
@@ -3,7 +3,9 @@
 #include "env/logging.h"
 #include "env/util.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 //
@@ -45,8 +47,8 @@ TEST(TargetTestLibDep, StaticLibrary_SimpleBuildTest) {
   foolib.AddSource("foo.cpp", "foo");
   foolib.AddIncludeDir("foo");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   foolib.Build();
 
   mock().checkExpectations();
@@ -74,8 +76,8 @@ TEST(TargetTestLibDep, TargetDep_RebuildTest) {
     foolib.AddSource("foo/foo.cpp");
     foolib.AddIncludeDir("foo");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     foolib.Build();
     buildcc::env::SaveFile(foolib.GetTargetPath().string().c_str(),
                            std::string{""}, false);
@@ -87,8 +89,8 @@ TEST(TargetTestLibDep, TargetDep_RebuildTest) {
     exe_target.AddIncludeDir("foo");
     exe_target.AddLibDep(foolib);
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe_target.Build();
   }
 
@@ -123,8 +125,8 @@ TEST(TargetTestLibDep, TargetDep_AddRemoveTest) {
   foolib.AddSource("foo/foo.cpp");
   foolib.AddIncludeDir("foo");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   foolib.Build();
 
   buildcc::env::SaveFile(foolib.GetTargetPath().string().c_str(),
@@ -138,8 +140,8 @@ TEST(TargetTestLibDep, TargetDep_AddRemoveTest) {
     exe_target.AddSource("empty_main.cpp");
     exe_target.AddIncludeDir("foo");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe_target.Build();
   }
 
@@ -153,7 +155,7 @@ TEST(TargetTestLibDep, TargetDep_AddRemoveTest) {
     exe_target.AddLibDep(foolib);
 
     buildcc::base::m::TargetExpect_PathAdded(1, &exe_target);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe_target.Build();
   }
 
@@ -165,7 +167,7 @@ TEST(TargetTestLibDep, TargetDep_AddRemoveTest) {
     exe_target.AddIncludeDir("foo");
 
     buildcc::base::m::TargetExpect_PathRemoved(1, &exe_target);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe_target.Build();
   }
 
@@ -186,8 +188,8 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) {
     foolib.AddSource("foo/foo.cpp");
     foolib.AddIncludeDir("foo");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     foolib.Build();
 
     bool saved = buildcc::env::SaveFile(foolib.GetTargetPath().string().c_str(),
@@ -200,8 +202,8 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) {
     exe_target.AddIncludeDir("foo");
     exe_target.AddLibDep(foolib);
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe_target.Build();
   }
 
@@ -214,8 +216,8 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) {
     foolib.AddIncludeDir("");
 
     buildcc::base::m::TargetExpect_DirChanged(1, &foolib);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     foolib.Build();
 
     // * To make sure that SaveFile is newer
@@ -231,7 +233,7 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) {
     exe_target.AddLibDep(foolib);
 
     buildcc::base::m::TargetExpect_PathUpdated(1, &exe_target);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     exe_target.Build();
   }
 
diff --git a/buildcc/lib/target/test/target/test_target_link_flags.cpp b/buildcc/lib/target/test/target/test_target_link_flags.cpp
index d86391cf..d76f290d 100644
--- a/buildcc/lib/target/test/target/test_target_link_flags.cpp
+++ b/buildcc/lib/target/test/target/test_target_link_flags.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -48,8 +50,8 @@ TEST(TargetTestLinkFlagsGroup, Target_AddLinkFlag) {
   simple.AddSource(DUMMY_MAIN);
   simple.AddLinkFlag("-lm");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   simple.Build();
 
   mock().checkExpectations();
@@ -78,8 +80,8 @@ TEST(TargetTestLinkFlagsGroup, Target_ChangedLinkFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddLinkFlag("-lm");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
   {
@@ -88,7 +90,7 @@ TEST(TargetTestLinkFlagsGroup, Target_ChangedLinkFlag) {
                                  gcc, "data");
     simple.AddSource(DUMMY_MAIN);
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
@@ -99,7 +101,7 @@ TEST(TargetTestLinkFlagsGroup, Target_ChangedLinkFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddLinkFlag("-lm");
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
diff --git a/buildcc/lib/target/test/target/test_target_preprocessor_flags.cpp b/buildcc/lib/target/test/target/test_target_preprocessor_flags.cpp
index ad8fefb1..578614a0 100644
--- a/buildcc/lib/target/test/target/test_target_preprocessor_flags.cpp
+++ b/buildcc/lib/target/test/target/test_target_preprocessor_flags.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -48,8 +50,8 @@ TEST(TargetTestPreprocessorFlagGroup, Target_AddPreprocessorFlag) {
   simple.AddSource(DUMMY_MAIN);
   simple.AddPreprocessorFlag("-DCOMPILE=1");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   simple.Build();
 
   mock().checkExpectations();
@@ -78,8 +80,8 @@ TEST(TargetTestPreprocessorFlagGroup, Target_ChangedPreprocessorFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddPreprocessorFlag("-DCOMPILE=1");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
   {
@@ -88,8 +90,8 @@ TEST(TargetTestPreprocessorFlagGroup, Target_ChangedPreprocessorFlag) {
                                  gcc, "data");
     simple.AddSource(DUMMY_MAIN);
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
@@ -100,8 +102,8 @@ TEST(TargetTestPreprocessorFlagGroup, Target_ChangedPreprocessorFlag) {
     simple.AddSource(DUMMY_MAIN);
     simple.AddPreprocessorFlag("-DRANDOM=1");
     buildcc::base::m::TargetExpect_FlagChanged(1, &simple);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
   }
 
diff --git a/buildcc/lib/target/test/target/test_target_source.cpp b/buildcc/lib/target/test/target/test_target_source.cpp
index 1daf6847..793d97c6 100644
--- a/buildcc/lib/target/test/target/test_target_source.cpp
+++ b/buildcc/lib/target/test/target/test_target_source.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -98,8 +100,8 @@ TEST(TargetTestSourceGroup, Target_Build_SourceCompile) {
   buildcc::base::Target simple(NAME, buildcc::base::TargetType::Executable, gcc,
                                "data");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true); // compile
-  buildcc::internal::m::CommandExpect_Execute(1, true); // link
+  buildcc::m::CommandExpect_Execute(1, true); // compile
+  buildcc::m::CommandExpect_Execute(1, true); // link
 
   simple.AddSource(DUMMY_MAIN);
   simple.Build();
@@ -132,7 +134,7 @@ TEST(TargetTestSourceGroup, Target_Build_SourceCompileError) {
                                  gcc, "data");
 
     simple.AddSource(DUMMY_MAIN);
-    buildcc::internal::m::CommandExpect_Execute(1, false); // compile
+    buildcc::m::CommandExpect_Execute(1, false); // compile
     CHECK_THROWS(std::exception, simple.Build());
   }
 
@@ -142,8 +144,8 @@ TEST(TargetTestSourceGroup, Target_Build_SourceCompileError) {
                                  gcc, "data");
 
     simple.AddSource(DUMMY_MAIN);
-    buildcc::internal::m::CommandExpect_Execute(1, true);  // compile
-    buildcc::internal::m::CommandExpect_Execute(1, false); // compile
+    buildcc::m::CommandExpect_Execute(1, true);  // compile
+    buildcc::m::CommandExpect_Execute(1, false); // compile
     CHECK_THROWS(std::exception, simple.Build());
   }
 
@@ -176,9 +178,9 @@ TEST(TargetTestSourceGroup, Target_Build_SourceRecompile) {
     simple.AddSource(DUMMY_MAIN_C);
     simple.AddSource(NEW_SOURCE);
 
-    buildcc::internal::m::CommandExpect_Execute(1, true); // compile
-    buildcc::internal::m::CommandExpect_Execute(1, true); // compile
-    buildcc::internal::m::CommandExpect_Execute(1, true); // link
+    buildcc::m::CommandExpect_Execute(1, true); // compile
+    buildcc::m::CommandExpect_Execute(1, true); // compile
+    buildcc::m::CommandExpect_Execute(1, true); // link
     simple.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
@@ -202,11 +204,11 @@ TEST(TargetTestSourceGroup, Target_Build_SourceRecompile) {
     buildcc::base::m::TargetExpect_SourceRemoved(1, &simple);
 
     // Added and compiled
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     buildcc::base::m::TargetExpect_SourceAdded(1, &simple);
 
     // Rebuild target
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
 
     // Run the second Build to test Recompile
     simple.Build();
@@ -232,10 +234,10 @@ TEST(TargetTestSourceGroup, Target_Build_SourceRecompile) {
     simple.AddSource(NEW_SOURCE);
     // Run the second Build to test Recompile
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     buildcc::base::m::TargetExpect_SourceUpdated(1, &simple);
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     simple.Build();
 
     buildcc::internal::FbsLoader loader(NAME, intermediate_path);
diff --git a/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp b/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp
index a9dc319d..0bfdcbbc 100644
--- a/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp
+++ b/buildcc/lib/target/test/target/test_target_source_out_of_root.cpp
@@ -1,6 +1,8 @@
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -40,8 +42,8 @@ TEST(TargetTestSourceOutOfRootGroup, Add_OutOfRootSource) {
                                gcc, "");
   simple.AddSource("../dummy_main.cpp");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   simple.Build();
 }
 
@@ -60,8 +62,8 @@ TEST(TargetTestSourceOutOfRootGroup, Glob_OutOfRootSource) {
 
   CHECK_EQUAL(12, simple.GetCurrentSourceFiles().size());
 
-  buildcc::internal::m::CommandExpect_Execute(12, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(12, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   simple.Build();
 
   mock().checkExpectations();
diff --git a/buildcc/lib/target/test/target/test_target_user_deps.cpp b/buildcc/lib/target/test/target/test_target_user_deps.cpp
index eaf71060..2cfded7b 100644
--- a/buildcc/lib/target/test/target/test_target_user_deps.cpp
+++ b/buildcc/lib/target/test/target/test_target_user_deps.cpp
@@ -2,7 +2,9 @@
 
 #include "constants.h"
 
+#include "expect_command.h"
 #include "expect_target.h"
+
 #include "target/target.h"
 
 #include "env/env.h"
@@ -40,8 +42,8 @@ TEST(TargetTestUserDepsGroup, Target_Build_CompileDeps_NoChange) {
   compileDep.AddSource("dummy_main.cpp");
   compileDep.AddCompileDependency("new_source.cpp");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   compileDep.Build();
 
   mock().checkExpectations();
@@ -54,8 +56,8 @@ TEST(TargetTestUserDepsGroup, Target_Build_LinkDeps_NoChange) {
   linkDep.AddSource("dummy_main.cpp");
   linkDep.AddLinkDependency("new_source.cpp");
 
-  buildcc::internal::m::CommandExpect_Execute(1, true);
-  buildcc::internal::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
+  buildcc::m::CommandExpect_Execute(1, true);
   linkDep.Build();
 
   mock().checkExpectations();
@@ -69,8 +71,8 @@ TEST(TargetTestUserDepsGroup, Target_Build_CompileDeps_Rebuild) {
     compileDep.AddSource("dummy_main.cpp");
     compileDep.AddCompileDependency("new_source.cpp");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     compileDep.Build();
   }
 
@@ -90,8 +92,8 @@ TEST(TargetTestUserDepsGroup, Target_Build_CompileDeps_Rebuild) {
     compileDep.AddCompileDependency("new_source.cpp");
 
     buildcc::base::m::TargetExpect_PathUpdated(1, &compileDep);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     compileDep.Build();
   }
 
@@ -106,8 +108,8 @@ TEST(TargetTestUserDepsGroup, Target_Build_LinkDeps_Rebuild) {
     linkDep.AddSource("dummy_main.cpp");
     linkDep.AddLinkDependency("new_source.cpp");
 
-    buildcc::internal::m::CommandExpect_Execute(1, true);
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     linkDep.Build();
   }
 
@@ -127,7 +129,7 @@ TEST(TargetTestUserDepsGroup, Target_Build_LinkDeps_Rebuild) {
     linkDep.AddLinkDependency("new_source.cpp");
 
     buildcc::base::m::TargetExpect_PathUpdated(1, &linkDep); // Only link
-    buildcc::internal::m::CommandExpect_Execute(1, true);
+    buildcc::m::CommandExpect_Execute(1, true);
     linkDep.Build();
   }
 
diff --git a/codecov.yml b/codecov.yml
index 0b9f6a30..e47d5566 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -7,6 +7,15 @@ coverage:
   precision: 2
   round: nearest
   range: "60...100"
+  status:
+    project:
+      default:
+        target: auto
+        threshold: 1%
+    patch:
+      default:
+        target: auto
+        threshold: 1%
 
 parsers:
   gcov:
diff --git a/doc/software_architecture/buildcc_interface_lib.PNG b/doc/software_architecture/buildcc_interface_lib.PNG
index afa72a69..9bc1da9b 100644
Binary files a/doc/software_architecture/buildcc_interface_lib.PNG and b/doc/software_architecture/buildcc_interface_lib.PNG differ
diff --git a/example/hybrid/generic/build.cpp b/example/hybrid/generic/build.cpp
index 6be2b4ba..e027d181 100644
--- a/example/hybrid/generic/build.cpp
+++ b/example/hybrid/generic/build.cpp
@@ -67,8 +67,8 @@ int main(int argc, char **argv) {
 
   // 5. Test steps
   reg.Test(custom_toolchain.state, generic_target, [](base::Target &target) {
-    const bool execute = internal::Command::Execute(
-        fmt::format("{}", target.GetTargetPath().string()));
+    const bool execute =
+        Command::Execute(fmt::format("{}", target.GetTargetPath().string()));
     env::assert_fatal(execute, "Test failed");
   });