diff --git a/Framework/Algorithms/inc/MantidAlgorithms/FilterEvents.h b/Framework/Algorithms/inc/MantidAlgorithms/FilterEvents.h
index 8ffdd7161b961d695c77b9cdf350b5f017b4d0e5..94aaacb94043a7a54bcaf66edeb4569619aee211 100644
--- a/Framework/Algorithms/inc/MantidAlgorithms/FilterEvents.h
+++ b/Framework/Algorithms/inc/MantidAlgorithms/FilterEvents.h
@@ -72,6 +72,7 @@ public:
   const std::string category() const override {
     return "Events\\EventFiltering";
   }
+  std::map<std::string, std::string> validateInputs() override;
 
 private:
   // Implement abstract Algorithm methods
diff --git a/Framework/Algorithms/src/FilterEvents.cpp b/Framework/Algorithms/src/FilterEvents.cpp
index c4a4cf3116eb8a013bd7e65b0c7f5051326923dc..763249165061306139a999193b34d24b1aa7756d 100644
--- a/Framework/Algorithms/src/FilterEvents.cpp
+++ b/Framework/Algorithms/src/FilterEvents.cpp
@@ -171,6 +171,36 @@ void FilterEvents::init() {
                   "Otherwise, only those specified logs will be split.");
 }
 
+std::map<std::string, std::string> FilterEvents::validateInputs() {
+  const std::string SPLITER_PROP_NAME = "SplitterWorkspace";
+  std::map<std::string, std::string> result;
+
+  // check the splitters workspace for special behavior
+  API::Workspace_const_sptr wksp = this->getProperty(SPLITER_PROP_NAME);
+  // SplittersWorkspace is a special type that needs no further checking
+  if (!bool(boost::dynamic_pointer_cast<const SplittersWorkspace>(wksp))) {
+    const auto table = boost::dynamic_pointer_cast<const TableWorkspace>(wksp);
+    const auto matrix =
+        boost::dynamic_pointer_cast<const MatrixWorkspace>(wksp);
+    if (bool(table)) {
+      if (table->columnCount() != 3)
+        result[SPLITER_PROP_NAME] = "TableWorkspace must have 3 columns";
+    } else if (bool(matrix)) {
+      if (matrix->getNumberHistograms() == 1) {
+        if (!matrix->isHistogramData())
+          result[SPLITER_PROP_NAME] = "MatrixWorkspace must be histogram";
+      } else {
+        result[SPLITER_PROP_NAME] =
+            "MatrixWorkspace can have only one histogram";
+      }
+    } else {
+      result[SPLITER_PROP_NAME] = "Incompatible workspace type";
+    }
+  }
+
+  return result;
+}
+
 /** Execution body
  */
 void FilterEvents::exec() {
@@ -845,23 +875,24 @@ void FilterEvents::processMatrixSplitterWorkspace() {
   // Check input workspace validity
   assert(m_matrixSplitterWS);
 
-  auto X = m_matrixSplitterWS->binEdges(0);
-  auto &Y = m_matrixSplitterWS->y(0);
-  size_t sizex = X.size();
-  size_t sizey = Y.size();
+  const auto X = m_matrixSplitterWS->binEdges(0);
+  const auto &Y = m_matrixSplitterWS->y(0);
+  const size_t sizex = X.size();
+  const size_t sizey = Y.size();
 
   // Assign vectors for time comparison
-  m_vecSplitterTime.assign(X.size(), 0);
-  m_vecSplitterGroup.assign(Y.size(), -1);
+  m_vecSplitterTime.assign(sizex, static_cast<int64_t>(0));
+  m_vecSplitterGroup.assign(sizey, static_cast<int>(-1));
 
   // Transform vector
   for (size_t i = 0; i < sizex; ++i) {
     m_vecSplitterTime[i] = static_cast<int64_t>(X[i] * 1.E9);
   }
+
   // shift the splitters' time if user specifis that the input times are
   // relative
   if (m_isSplittersRelativeTime) {
-    int64_t time_shift_ns = m_filterStartTime.totalNanoseconds();
+    const int64_t time_shift_ns = m_filterStartTime.totalNanoseconds();
     for (size_t i = 0; i < sizex; ++i)
       m_vecSplitterTime[i] += time_shift_ns;
   }