diff --git a/lib/icinga/checkable.cpp b/lib/icinga/checkable.cpp
index 73bf6afa3..9e13c17fd 100644
--- a/lib/icinga/checkable.cpp
+++ b/lib/icinga/checkable.cpp
@@ -51,6 +51,27 @@ Checkable::Checkable(void)
 	SetSchedulingOffset(Utility::Random());
 }
 
+void Checkable::OnAllConfigLoaded(void)
+{
+	ObjectImpl<Checkable>::OnAllConfigLoaded();
+
+	Endpoint::Ptr endpoint = GetCommandEndpoint();
+
+	if (endpoint) {
+		Zone::Ptr checkableZone = static_pointer_cast<Zone>(GetZone());
+
+		if (!checkableZone)
+			checkableZone = Zone::GetLocalZone();
+
+		Zone::Ptr cmdZone = endpoint->GetZone();
+
+		if (cmdZone != checkableZone && cmdZone->GetParent() != checkableZone) {
+			BOOST_THROW_EXCEPTION(ValidationError(this, boost::assign::list_of("command_endpoint"),
+			    "Command endpoint must be in zone '" + checkableZone->GetName() + "' or in a direct child zone thereof."));
+		}
+	}
+}
+
 void Checkable::Start(bool runtimeCreated)
 {
 	double now = Utility::GetTime();
diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp
index d40e1b76e..db15fcae9 100644
--- a/lib/icinga/checkable.hpp
+++ b/lib/icinga/checkable.hpp
@@ -185,6 +185,7 @@ public:
 
 protected:
 	virtual void Start(bool runtimeCreated) override;
+	virtual void OnAllConfigLoaded(void) override;
 
 private:
 	mutable boost::mutex m_CheckableMutex;
diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti
index 27a158da4..81571f924 100644
--- a/lib/icinga/checkable.ti
+++ b/lib/icinga/checkable.ti
@@ -44,6 +44,10 @@ enum AcknowledgementType
 
 abstract class Checkable : CustomVarObject
 {
+	load_after ApiListener;
+	load_after Endpoint;
+	load_after Zone;
+
 	[config, required, navigation] name(CheckCommand) check_command (CheckCommandRaw) {
 		navigate {{{
 			return CheckCommand::GetByName(GetCheckCommandRaw());
diff --git a/lib/remote/endpoint.cpp b/lib/remote/endpoint.cpp
index 4430308ee..1cfe9ed59 100644
--- a/lib/remote/endpoint.cpp
+++ b/lib/remote/endpoint.cpp
@@ -37,7 +37,7 @@ boost::signals2::signal<void(const Endpoint::Ptr&, const JsonRpcConnection::Ptr&
 
 void Endpoint::OnAllConfigLoaded(void)
 {
-	ConfigObject::OnConfigLoaded();
+	ObjectImpl<Endpoint>::OnAllConfigLoaded();
 
 	BOOST_FOREACH(const Zone::Ptr& zone, ConfigType::GetObjectsByType<Zone>()) {
 		const std::set<Endpoint::Ptr> members = zone->GetEndpoints();
diff --git a/lib/remote/zone.cpp b/lib/remote/zone.cpp
index 31286b859..594fc6c3f 100644
--- a/lib/remote/zone.cpp
+++ b/lib/remote/zone.cpp
@@ -30,6 +30,8 @@ REGISTER_TYPE(Zone);
 
 void Zone::OnAllConfigLoaded(void)
 {
+	ObjectImpl<Zone>::OnAllConfigLoaded();
+
 	m_Parent = Zone::GetByName(GetParentRaw());
 
 	Zone::Ptr zone = m_Parent;