diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index d3170e4ae51595c6b1393cbf03c79ed21b25d8d2..316d85cef683a654e3e9b0db9e52e7aed28804f5 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1350,13 +1350,6 @@ cmTarget::AddSystemIncludeDirectories(const std::set<std::string> &incs)
   this->SystemIncludeDirectories.insert(incs.begin(), incs.end());
 }
 
-//----------------------------------------------------------------------------
-void
-cmTarget::AddSystemIncludeDirectories(const std::vector<std::string> &incs)
-{
-  this->SystemIncludeDirectories.insert(incs.begin(), incs.end());
-}
-
 #if defined(_WIN32) && !defined(__CYGWIN__)
 //----------------------------------------------------------------------------
 void
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 490aaa3505ba31cd84afe40f6b5a6304c5b2e10c..2007b40966ed7371cddba0768e02c10027a54f63 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -427,7 +427,6 @@ public:
                                   cmTarget::LinkLibraryType llt) const;
 
   void AddSystemIncludeDirectories(const std::set<std::string> &incs);
-  void AddSystemIncludeDirectories(const std::vector<std::string> &incs);
   std::set<std::string> const & GetSystemIncludeDirectories() const
     { return this->SystemIncludeDirectories; }
 
diff --git a/Source/cmTargetIncludeDirectoriesCommand.cxx b/Source/cmTargetIncludeDirectoriesCommand.cxx
index 7824c898d96e0789d7b2a395bc78dfcf663f22c4..7dfe9ca38948945fd2d072db7a5fe5f8baca8190 100644
--- a/Source/cmTargetIncludeDirectoriesCommand.cxx
+++ b/Source/cmTargetIncludeDirectoriesCommand.cxx
@@ -75,7 +75,23 @@ bool cmTargetIncludeDirectoriesCommand
   tgt->InsertInclude(this->Join(content), lfbt, prepend);
   if (system)
     {
-    tgt->AddSystemIncludeDirectories(content);
+    std::string prefix =
+      this->Makefile->GetCurrentSourceDirectory() + std::string("/");
+    std::set<std::string> sdirs;
+    for (std::vector<std::string>::const_iterator it = content.begin();
+      it != content.end(); ++it)
+      {
+      if (cmSystemTools::FileIsFullPath(it->c_str())
+          || cmGeneratorExpression::Find(*it) == 0)
+        {
+        sdirs.insert(*it);
+        }
+      else
+        {
+        sdirs.insert(prefix + *it);
+        }
+      }
+    tgt->AddSystemIncludeDirectories(sdirs);
     }
   return true;
 }
@@ -91,7 +107,7 @@ void cmTargetIncludeDirectoriesCommand
 
   if (system)
     {
-    std::string joined = cmJoin(content, ";");
+    std::string joined = this->Join(content);
     tgt->AppendProperty("INTERFACE_SYSTEM_INCLUDE_DIRECTORIES",
                         joined.c_str());
     }
diff --git a/Tests/IncludeDirectories/SystemIncludeDirectories/CMakeLists.txt b/Tests/IncludeDirectories/SystemIncludeDirectories/CMakeLists.txt
index 0215e9322f423993d2335bfafe5ec298d6550fc3..dcee85eb4804e0ddb2d59d7ca18d128936c97e4d 100644
--- a/Tests/IncludeDirectories/SystemIncludeDirectories/CMakeLists.txt
+++ b/Tests/IncludeDirectories/SystemIncludeDirectories/CMakeLists.txt
@@ -35,6 +35,16 @@ add_library(imported_consumer2 imported_consumer.cpp)
 target_link_libraries(imported_consumer2 imported_consumer)
 target_compile_options(imported_consumer2 PRIVATE -Werror=unused-variable)
 
+# add a target which has a relative system include
+add_library(somelib imported_consumer.cpp)
+target_include_directories(somelib SYSTEM PUBLIC "systemlib_header_only")
+target_compile_options(somelib PRIVATE -Werror=unused-variable)
+
+# add a target which consumes a relative system include
+add_library(otherlib upstream.cpp)
+target_link_libraries(otherlib PUBLIC somelib)
+target_compile_options(somelib PRIVATE -Werror=unused-variable)
+
 macro(do_try_compile error_option)
   set(TC_ARGS
     IFACE_TRY_COMPILE_${error_option}