Repository: idaholab/SR2ML (language: python)

Issue:
Move Several PostProcessors from RAVEN to SR2ML 
--------
Issue Description
--------

**Is your feature request related to a problem? Please describe.**
Several PostProcessors (i.e. DataClassifier, FTImporter, ETImporter, RiskMeasuresDiscrete, MCSImporter) in RAVEN actually belong to SR2ML. Due to the PostProcessor Plugin system is not in place, these PostProcessors were kept in RAVEN repo. Now the Plugin system has been designed and merged into RAVEN. These PostProcessors can be moved to SR2ML now. 

**Describe the solution you'd like**


**Describe alternatives you've considered**


**Additional context**

----------------
For Change Control Board: Issue Review
----------------
This review should occur before any development is performed as a response to this issue.
- [x] 1. Is it tagged with a type: defect or task?
- [x] 2. Is it tagged with a priority: critical, normal or minor?
- [x] 3. If it will impact requirements or requirements tests, is it tagged with requirements?
- [x] 4. If it is a defect, can it cause wrong results for users? If so an email needs to be sent to the users.
- [x] 5. Is a rationale provided? (Such as explaining why the improvement is needed or why current code is wrong.)

-------
For Change Control Board: Issue Closure
-------
This review should occur when the issue is imminently going to be closed.
- [x] 1. If the issue is a defect, is the defect fixed?
- [x] 2. If the issue is a defect, is the defect tested for in the regression test system?  (If not explain why not.)
- [x] 3. If the issue can impact users, has an email to the users group been written (the email should specify if the defect impacts stable or master)?
- [x] 4. If the issue is a defect, does it impact the latest release branch? If yes, is there any issue tagged with release (create if needed)?
- [x] 5. If the issue is being closed without a pull request, has an explanation of why it is being closed been provided?



Discussion / hints:

Fix patch:
diff --git a/__init__.py b/__init__.py
index b71d019..ba1595a 100644
--- a/__init__.py
+++ b/__init__.py
@@ -8,3 +8,8 @@
 from SR2ML.src import ReliabilityModel
 from SR2ML.src import MaintenanceModel
 from SR2ML.src import MCSSolver
+from SR2ML.src.PostProcessors import DataClassifier
+from SR2ML.src.PostProcessors import ETImporter
+from SR2ML.src.PostProcessors import FTImporter
+from SR2ML.src.PostProcessors import MCSimporter
+from SR2ML.src.PostProcessors import RiskMeasuresDiscrete
diff --git a/doc/user_manual/include/DataClassifier.tex b/doc/user_manual/include/DataClassifier.tex
index bd24e07..194af97 100644
--- a/doc/user_manual/include/DataClassifier.tex
+++ b/doc/user_manual/include/DataClassifier.tex
@@ -1,9 +1,112 @@
 \section{Data Classifier}
 \label{sec:dataClassifier}
 
-The \textbf{DataClassifier} post processor is specifically used to classify the data stored in the DataObjects.
-The details about this post-processor can be found in the RAVEN user manual subsection \textbf{PostProcessor}
-in the \textbf{Models} section.
+The \textbf{DataClassifier} post-processor is specifically used to classify the data stored in the DataObjects. It
+accepts two DataObjects, one is used as the classifier which must be a \textbf{PointSet}, the other one,
+i.e. \textbf{PointSet} or \textbf{HistorySet}, is used as the input DataObject to be classified.
+%
+\ppType{DataClassifier}{DataClassifier}
+%
+\begin{itemize}
+  \item \xmlNode{label}, \xmlDesc{string, required field}, the name of the label that are used for the classifier. This
+    label must exist in the DataObject that is used as the classifer. This name will also be used as
+    the label name for the DataObject that is classified.
+  \item \xmlNode{variable}, \xmlDesc{required, xml node}. In this node, the following attribute should be specified:
+    \begin{itemize}
+      \item \xmlAttr{name}, \xmlDesc{required, string attribute}, the variable name, which should be exist in
+        the DataObject that is used as classifier.
+    \end{itemize}
+    and the following sub-node should also be specified:
+    \begin{itemize}
+      \item \xmlNode{Function}, \xmlDesc{string, required field}, this function creates the mapping from input DataObject
+        to the Classifier.
+        \begin{itemize}
+          \item \xmlAttr{class}, \xmlDesc{string, required field}, the class of this function (e.g. Functions)
+          \item \xmlAttr{type}, \xmlDesc{string, required field}, the type of this function (e.g. external)
+        \end{itemize}
+    \end{itemize}
+\end{itemize}
+%
+In order to use this post-processor, the users need to specify two different DataObjects, i.e.
+\begin{lstlisting}[style=XML]
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC, LPI</Input>
+      <Output>sequence</Output>
+    </PointSet>
+    <PointSet name="sim_PS">
+      <Input>ACC_status, LPI_status</Input>
+      <Output>out</Output>
+    </PointSet>
+  </DataObjects>
+\end{lstlisting}
+The first data object ``ET\_PS'' contains the event tree with input variables ``ACC, LPI'' and output label ``sequence''.
+This data object will be used to classify the data in the second data object ``sim\_PS''. The results will be stored in
+the output data object with the same label ``sequence''. Since these two data objects contain different inputs,
+\xmlNode{Functions} will be used to create the maps between the inputs:
+\begin{lstlisting}[style=XML]
+  <Functions>
+    <External file="func_ACC.py" name="func_ACC">
+      <variable>ACC_status</variable>
+    </External>
+    <External file="func_LPI.py" name="func_LPI">
+      <variable>LPI_status</variable>
+    </External>
+  </Functions>
+\end{lstlisting}
+
+The inputs to these functions are the inputs of the data object that will be classified, and the outputs of these functions
+are the inputs of data object that is used as the classifier.
+
+\textbf{Example Python Function for ``func\_ACC.py''}
+\begin{lstlisting}[language=python]
+def evaluate(self):
+  return self.ACC_status
+\end{lstlisting}
+
+\textbf{Example Python Function for ``func\_LPI.py''}
+\begin{lstlisting}[language=python]
+def evaluate(self):
+  return self.LPI_status
+\end{lstlisting}
+
+\nb All the functions that are used to create the maps should be include the ``evaluate'' method.
+
+The \textbf{DataClassifier} post-processor is specifically used to classify the data stored in the DataObjects. It
+accepts two DataObjects, one is used as the classifier which should be always \textbf{PointSet}, the other one, i.e.
+either \textbf{PointSet} or \textbf{HistorySet} is used as the input DataObject to be classified.
+
+The \textbf{DataClassifier} is provided below:
+\begin{lstlisting}[style=XML]
+    <PostProcessor name="ET_Classifier" subType="SR2ML.DataClassifier">
+      <label>sequence</label>
+      <variable name='ACC'>
+        <Function class="Functions" type="External">func_ACC</Function>
+      </variable>
+      <variable name='LPI'>
+        <Function class="Functions" type="External">func_LPI</Function>
+      </variable>
+    </PostProcessor>
+\end{lstlisting}
+The definitions for the XML nodes can be found in the RAVEN user manual. The label ``sequence''
+and the variables ``ACC, LPI'' should be exist in the data object that is used as the classifier,
+while the functions ``func\_ACC, func\_LPI'' are used to map relationships between the input data objects.
+
+The classification can be achieved via the \xmlNode{Steps} as shown below:
+\begin{lstlisting}[style=XML]
+<Simulation>
+ ...
+  <Steps>
+    <PostProcess name="classify">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Input   class="DataObjects"  type="PointSet"        >sim_PS</Input>
+      <Model   class="Models"       type="PostProcessor"   >ET_Classifier</Model>
+      <Output  class="DataObjects"  type="PointSet"        >sim_PS</Output>
+    </PostProcess>
+  </Steps>
+ ...
+</Simulation>
+\end{lstlisting}
 
 \subsection{Data Classifier Reference Tests}
 \begin{itemize}
diff --git a/doc/user_manual/include/DiscreteRiskMeasures.tex b/doc/user_manual/include/DiscreteRiskMeasures.tex
new file mode 100644
index 0000000..2ebc934
--- /dev/null
+++ b/doc/user_manual/include/DiscreteRiskMeasures.tex
@@ -0,0 +1,165 @@
+\section{Discrete Risk Measures}
+\label{DiscreteRiskMeasures}
+This Post-Processor calculates a series of risk importance measures from a PointSet.
+This calculation is performed for a set of input parameters given an output target.
+
+The user is required to provide the following information:
+\begin{itemize}
+   \item the set of input variables. For each variable the following need to be specified:
+     \begin{itemize}
+       \item the set of values that imply a reliability value equal to $1$ for the input variable
+       \item the set of values that imply a reliability value equal to $0$ for the input variable
+     \end{itemize}
+   \item the output target variable. For this variable it is needed to specify the values of
+      the output target variable that defines the desired outcome.
+\end{itemize}
+
+The following variables are first determined for each input variable $i$:
+\begin{itemize}
+   \item $R_0$ Probability of the outcome of the output target variable (nominal value)
+   \item $R^{+}_i$ Probability of the outcome of the output target variable if reliability of the input variable is equal to $0$
+   \item $R^{-}_i$ Probability of the outcome of the output target variable if reliability of the input variable is equal to $1$
+\end{itemize}
+
+Available measures are:
+\begin{itemize}
+   \item Risk Achievement Worth (RAW): $RAW = R^{+}_i / R_0 $
+   \item Risk Achievement Worth (RRW): $RRW = R_0 / R^{-}_i$
+   \item Fussell-Vesely (FV): $FV = (R_0 - R^{-}_i) / R_0$
+   \item Birnbaum (B): $B = R^{+}_i - R^{-}_i$
+\end{itemize}
+
+\ppType{RiskMeasureDiscrete}{RiskMeasureDiscrete}
+
+In the \xmlNode{PostProcessor} input block, the following XML sub-nodes are required,
+independent of the \xmlAttr{subType} specified:
+
+\begin{itemize}
+   \item \xmlNode{measures}, \xmlDesc{string, required field}, desired risk importance measures
+      that have to be computed (RRW, RAW, FV, B)
+   \item \xmlNode{variable}, \xmlDesc{string, required field}, ID of the input variable. This
+      node is provided for each input variable. This nodes needs to contain also these attributes:
+     \begin{itemize}
+       \item \xmlAttr{R0values}, \xmlDesc{float, required field}, interval of values (comma separated values)
+          that implies a reliability value equal to $0$ for the input variable
+       \item \xmlAttr{R1values}, \xmlDesc{float, required field}, interval of values (comma separated values)
+          that implies a reliability value equal to $1$ for the input variable
+     \end{itemize}
+   \item \xmlNode{target}, \xmlDesc{string, required field}, ID of the output variable. This nodes needs to
+      contain also the attribute \xmlAttr{values}, \xmlDesc{string, required field}, interval of
+      values of the output target variable that defines the desired outcome
+\end{itemize}
+
+\textbf{Example:}
+This example shows an example where it is desired to calculate all available risk importance
+measures for two input variables (i.e., pumpTime and valveTime)
+given an output target variable (i.e., Tmax).
+A value of the input variable pumpTime in the interval $[0,240]$ implies a reliability
+value of the input variable pumpTime equal to $0$.
+A value of the input variable valveTime in the interval $[0,60]$ implies a reliability
+value of the input variable valveTime equal to $0$.
+A value of the input variables valveTime and pumpTime in the interval $[1441,2880]$ implies a
+reliability value of the input variables equal to $1$.
+The desired outcome of the output variable Tmax occurs in the interval $[2200,2500]$.
+\begin{lstlisting}[style=XML,morekeywords={subType,debug,name,class,type}]
+<Simulation>
+  ...
+  <Models>
+    ...
+    <PostProcessor name="riskMeasuresDiscrete" subType="RiskMeasuresDiscrete">
+      <measures>B,FV,RAW,RRW</measures>
+      <variable R0values='0,240' R1values='1441,2880'>pumpTime</variable>
+      <variable R0values='0,60'  R1values='1441,2880'>valveTime</variable>
+      <target   values='2200,2500'                  >Tmax</target>
+    </PostProcessor>
+    ...
+  </Models>
+  ...
+</Simulation>
+\end{lstlisting}
+
+This Post-Processor allows the user to consider also multiple datasets (a data set for each initiating event)
+and calculate the global risk importance measures.
+This can be performed by:
+\begin{itemize}
+  \item Including all datasets in the step
+\begin{lstlisting}[style=XML,morekeywords={subType,debug,name,class,type}]
+<Simulation>
+  ...
+  </Steps>
+    ...
+    <PostProcess name="PP">
+      <Input   class="DataObjects"  type="PointSet"        >outRun1</Input>
+      <Input   class="DataObjects"  type="PointSet"        >outRun2</Input>
+      <Model   class="Models"       type="PostProcessor"   >riskMeasuresDiscrete</Model>
+      <Output  class="DataObjects"  type="PointSet"        >outPPS</Output>
+      <Output  class="OutStreams"   type="Print"           >PrintPPS_dump</Output>
+    </PostProcess>
+  </Steps>
+  ...
+</Simulation>
+\end{lstlisting}
+  \item Adding in the Post-processor the frequency of the initiating event associated to each dataset
+\begin{lstlisting}[style=XML,morekeywords={subType,debug,name,class,type}]
+<Simulation>
+  ...
+  <Models>
+    ...
+    <PostProcessor name="riskMeasuresDiscrete" subType="SR2ML.RiskMeasuresDiscrete">
+      <measures>FV,RAW</measures>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Astatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Bstatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Cstatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Dstatus</variable>
+      <target   values='0.9,1.1'>outcome</target>
+      <data     freq='0.01'>outRun1</data>
+      <data     freq='0.02'>outRun2</data>
+    </PostProcessor>
+    ...
+  </Models>
+  ...
+</Simulation>
+\end{lstlisting}
+
+\end{itemize}
+
+This post-processor can be made time dependent if a single HistorySet is provided among the other data objects.
+The HistorySet contains the temporal profiles of a subset of the input variables. This temporal profile can be only
+boolean, i.e., 0 (component offline) or 1 (component online).
+Note that the provided history set must contains a single History; multiple Histories are not allowed.
+When this post-processor is in a dynamic configuration (i.e., time-dependent), the user is required to specify an xml
+node \xmlNode{temporalID} that indicates the ID of the temporal variable.
+For each time instant, this post-processor determines the temporal profiles of the desired risk importance measures.
+Thus, in this case, an HistorySet must be chosen as an output data object.
+An example is shown below:
+\begin{lstlisting}[style=XML,morekeywords={subType,debug,name,class,type}]
+<Simulation>
+  ...
+  <Models>
+    ...
+    <PostProcessor name="riskMeasuresDiscrete" subType="SR2ML.RiskMeasuresDiscrete">
+      <measures>B,FV,RAW,RRW,R0</measures>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Astatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Bstatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Cstatus</variable>
+      <target   values='0.9,1.1'>outcome</target>
+      <data     freq='1.0'>outRun1</data>
+      <temporalID>time</temporalID>
+    </PostProcessor>
+    ...
+  </Models>
+  ...
+  <Steps>
+    ...
+    <PostProcess name="PP">
+      <Input     class="DataObjects"  type="PointSet"        >outRun1</Input>
+      <Input     class="DataObjects"  type="HistorySet"      >timeDepProfiles</Input>
+      <Model     class="Models"       type="PostProcessor"   >riskMeasuresDiscrete</Model>
+      <Output    class="DataObjects"  type="HistorySet"      >outHS</Output>
+      <Output    class="OutStreams"   type="Print"           >PrintHS</Output>
+    </PostProcess>
+    ...
+  </Steps>
+  ...
+</Simulation>
+\end{lstlisting}
diff --git a/doc/user_manual/include/ETdataImporter.tex b/doc/user_manual/include/ETdataImporter.tex
index 860bdac..cb54c86 100644
--- a/doc/user_manual/include/ETdataImporter.tex
+++ b/doc/user_manual/include/ETdataImporter.tex
@@ -1,10 +1,178 @@
 \section{Event Tree Data Importer}
 \label{sec:ETdataImporter}
 
-This post-processor is designed to import an ET as a PointSet in RAVEN.
-The ET must be in: the OpenPSA format (\href{<url>}{https://github.com/open-psa}).
-The details about this post-processor can be found in the RAVEN user manual subsection \textbf{PostProcessor}
-in the \textbf{Models} section.
+The \textbf{ETImporter} post-processor has been designed to import Event-Tree (ET) object into
+RAVEN. Since several ET file formats are available, as of now only the OpenPSA format
+(see https://open-psa.github.io/joomla1.5/index.php.html) is supported. As an example,
+the OpenPSA format ET is shown below:
+
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=ET in OpenPSA format., label=lst:ETModel]
+<define-event-tree name="eventTree">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <define-sequence name="4"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <sequence name="1"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="2"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="3"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="4"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
+\end{lstlisting}
+
+This is performed by saving the structure of the ET (from file) as a \textbf{PointSet}
+(only \textbf{PointSet} are allowed), since an ET is a static Boolean logic structure. Each realization in the
+\textbf{PointSet} represents a unique accident sequence of the ET, and the \textbf{PointSet} is structured as follows:
+\begin{itemize}
+  \item Input variables of the \textbf{PointSet} are the branching conditions of the ET. The value of each input variable can be:
+  \begin{itemize}
+    \item  0: event did occur (typically upper branch)
+    \item  1: event did not occur (typically lower branch)
+    \item -1: event is not queried (no branching occured)
+  \end{itemize}
+  \item Output variables of the \textbf{PointSet} are the ID of each branch of the ET (i.e., positive integers greater than 0)
+\end{itemize}
+
+\nb that the 0 or 1 values are specified in the \xmlNode{path state="0"} or \xmlNode{path state="1"} nodes in the ET OpenPSA file.
+
+Provided this definition, the ET described in Listing~\ref{lst:ETModel} will be converted to \textbf{PointSet} that is characterized
+by the following variables:
+\begin{itemize}
+	\item Input variables: statusACC, statusLPI, statusLPR
+	\item Output variable: sequence
+\end{itemize}
+and the corresponding \textbf{PointSet} if the \xmlNode{expand} node is set to False is shown in Table~\ref{PointSetETExpandFalse}.
+If \xmlNode{expand} set to True, the corresponding \textbf{PointSet} is shown in Table~\ref{PointSetETExpandTrue}.
+\begin{table}[h]
+    \centering
+    \caption{PointSet generated by RAVEN by employing the ET Importer Post-Processor with \xmlNode{expand}
+             set to False for the ET of Listing~\ref{lst:ETModel}.}
+    \label{PointSetETExpandFalse}
+	\begin{tabular}{c | c | c | c}
+		\hline
+		ACC & LPI & LPR & sequence \\
+		\hline
+		0.  &  0. &  0. & 1. \\
+		0.  &  0. &  1. & 2. \\
+		0.  &  1. & -1. & 3. \\
+		1.  & -1. & -1. & 4. \\
+		\hline
+	\end{tabular}
+\end{table}
+\begin{table}[h]
+    \centering
+    \caption{PointSet generated by RAVEN by employing the ET Importer Post-Processor with \xmlNode{expand}
+             set to True for the ET of Listing~\ref{lst:ETModel}.}
+    \label{PointSetETExpandTrue}
+	\begin{tabular}{c | c | c | c}
+		\hline
+		ACC & LPI & LPR & sequence \\
+		\hline
+		0.  &  0. &  0. & 1. \\
+		0.  &  0. &  1. & 2. \\
+		0.  &  1. &  0. & 3. \\
+		0.  &  1. &  1. & 3. \\
+		1.  &  0. &  0. & 4. \\
+		1.  &  0. &  1. & 4. \\
+		1.  &  1. &  0. & 4. \\
+		1.  &  1. &  1. & 4. \\
+		\hline
+	\end{tabular}
+\end{table}
+
+The ETImporter PP supports also:
+\begin{itemize}
+  \item links to sub-trees
+	      \nb If the ET is split in two or more ETs (and thus one file for each ET), then it is only required to list
+	      all files in the Step. RAVEN automatically detect links among ETs and merge all of them into a single PointSet.
+  \item by-pass branches
+  \item symbolic definition of outcomes: typically outcomes are defined as either 0 (upper branch) or 1 (lower branch). If instead the ET uses the
+    \textbf{success/failure} labels, then they are converted into 0/1 labels
+    \nb If the branching condition is not binary or \textbf{success/failure}, then the ET Importer Post-Processor just follows
+	   the numerical value of the \xmlNode{state} attribute of the \xmlNode{<path>} node in the ET OpenPSA file.
+  \item symbolic/numerical definition of sequences: if the ET contains a symbolic sequence then a .xml file is generated.  This file contains
+        the mapping between the sequences defined in the ET and the numerical IDs created by RAVEN. The file name is the concatenation of the ET name
+        and ``\_mapping''. As an example the file ``eventTree\_mapping.xml'' generated by RAVEN:
+        \begin{lstlisting}[style=XML]
+            <map Tree="eventTree">
+              <sequence ID="0">seq_1</sequence>
+              <sequence ID="1">seq_2</sequence>
+              <sequence ID="2">seq_3</sequence>
+              <sequence ID="3">seq_4</sequence>
+            </map>
+        \end{lstlisting}
+        contains the mapping of four sequences defined in the ET (seq\_1,seq\_2,seq\_3,seq\_4) with the IDs generated by RAVEN (0,1,2,3).
+        Note that if the sequences defined in the ET are both numerical and symbolic then they are all mapped.
+  \item The ET can contain a branch that is defined as a separate block in the \xmlNode{define-branch} node and it is
+        replicated in the ET; in such case RAVEN automatically replicate such branch when generating the PointSet.
+\end{itemize}
+The \xmlNode{collect-formula} are not considered since this node is used to connect the Boolean formulae generated by the
+Fault-Trees to the branch (i.e., fork) point.
+
+%
+\ppType{ETImporter}{ETImporter}
+%
+\begin{itemize}
+  \item \xmlNode{fileFormat}, \xmlDesc{string, required field}, specifies the format of the file that contains the ET structure (supported format: OpenPSA).
+  \item  \xmlNode{expand},\xmlDesc{bool, required parameter}, expand the ET branching conditions for all branches even if they are not queried
+\end{itemize}
+
+\textbf{Example:}
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=ET Importer input example., label=lst:ET_PP_InputExample]
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Models>
+    ...
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+    ...
+  </Models>
+
+  <Steps>
+    ...
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    ...
+  </Steps>
+
+  <DataObjects>
+    ...
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+    ...
+  </DataObjects>
+\end{lstlisting}
 
 \subsection{ET Importer Reference Tests}
 \begin{itemize}
diff --git a/doc/user_manual/include/FTdataImporter.tex b/doc/user_manual/include/FTdataImporter.tex
index 74bd7d8..5d0dd91 100644
--- a/doc/user_manual/include/FTdataImporter.tex
+++ b/doc/user_manual/include/FTdataImporter.tex
@@ -1,10 +1,176 @@
 \section{Fault Tree Data Importer}
 \label{sec:FTdataImporter}
 
-This post processor is designed to import a FT as a PointSet in RAVEN.
-The FT must be in: the OpenPSA format (\href{<url>}{https://github.com/open-psa}).
-The details about this post-processor can be found in the RAVEN user manual subsection \textbf{PostProcessor}
-in the \textbf{Models} section.
+The \textbf{FTImporter} post-processor has been designed to import Fault-Tree (FT) object into
+RAVEN. Since several FT file formats are available, as of now only the OpenPSA format
+(see https://open-psa.github.io/joomla1.5/index.php.html) is supported. As an example,
+the FT in OpenPSA format is shown in Listing~\ref{lst:FTModel}.
+
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=FT in OpenPSA format., label=lst:FTModel]
+<opsa-mef>
+    <define-fault-tree name="FT">
+        <define-gate name="TOP">
+            <or>
+                <gate name="G1"/>
+                <gate name="G2"/>
+                <gate name="G3"/>
+            </or>
+        </define-gate>
+        <define-component name="A">
+            <define-gate name="G1">
+                <and>
+                    <basic-event name="BE1"/>
+                    <basic-event name="BE2"/>
+                </and>
+            </define-gate>
+            <define-gate name="G2">
+                <and>
+                    <basic-event name="BE1"/>
+                    <basic-event name="BE3"/>
+                </and>
+            </define-gate>
+            <define-basic-event name="BE1">
+                <float value="1.2e-3"/>
+            </define-basic-event>
+            <define-component name="B">
+                <define-basic-event name="BE2">
+                    <float value="2.4e-3"/>
+                </define-basic-event>
+                <define-basic-event name="BE3">
+                    <float value="5.2e-3"/>
+                </define-basic-event>
+            </define-component>
+        </define-component>
+        <define-component name="C">
+            <define-gate name="G3">
+                <and>
+                    <basic-event name="BE1"/>
+                    <basic-event name="BE4"/>
+                </and>
+            </define-gate>
+            <define-basic-event name="BE4">
+                <float value="1.6e-3"/>
+            </define-basic-event>
+        </define-component>
+    </define-fault-tree>
+</opsa-mef>
+\end{lstlisting}
+
+This is performed by saving the structure of the FT (from file) as a \textbf{PointSet}
+(only \textbf{PointSet} are allowed).
+
+Each Point in the PointSet represents a unique combination of the basic events.
+The PointSet is structured as follows: input variables are the basic events, output variable is the top event of the FT.
+The value for each input and output variable can have the following values:
+\begin{itemize}
+  \item  0: False
+  \item  1: True
+\end{itemize}
+
+Provided this definition, the FT model of Listing~\ref{lst:FTModel} can be converted to
+\textbf{PointSet} that is characterized by these variables:
+\begin{itemize}
+	\item Input variables: BE1, BE2, BE3, BE4
+	\item Output variable: out
+\end{itemize}
+and it is structured is shown in Table~\ref{PointSetFT}.
+
+\begin{table}[h]
+    \centering
+    \caption{PointSet generated by RAVEN by employing the FT Importer Post-Processor for the FT of Listing~\ref{lst:FTModel}.}
+    \label{PointSetFT}
+	\begin{tabular}{c | c | c | c | c}
+		\hline
+		BE1 & BE2 & BE3 & BE4 & TOP \\
+		\hline
+		 0. &  0. &  0. &  0. &  0. \\
+		 0. &  0. &  0. &  1. &  0. \\
+		 0. &  0. &  1. &  0. &  0. \\
+		 0. &  0. &  1. &  1. &  0. \\
+		 0. &  1. &  0. &  0. &  0. \\
+		 0. &  1. &  0. &  1. &  0. \\
+		 0. &  1. &  1. &  0. &  0. \\
+		 0. &  1. &  1. &  1. &  0. \\
+		 1. &  0. &  0. &  0. &  0. \\
+		 1. &  0. &  0. &  1. &  1. \\
+		 1. &  0. &  1. &  0. &  1. \\
+		 1. &  0. &  1. &  1. &  1. \\
+		 1. &  1. &  0. &  0. &  1. \\
+		 1. &  1. &  0. &  1. &  1. \\
+		 1. &  1. &  1. &  0. &  1. \\
+		 1. &  1. &  1. &  1. &  1. \\
+		\hline
+	\end{tabular}
+\end{table}
+
+%
+\ppType{FTImporter}{FTImporter}
+%
+\begin{itemize}
+  \item \xmlNode{fileFormat}, \xmlDesc{string, required field}, specifies the format of the file that contains the
+    FT structure (supported format: OpenPSA).
+  \item  \xmlNode{topEventID},\xmlDesc{string, required parameter}, the name of the top event of the FT
+\end{itemize}
+
+The example of FTImporter PostProcessor is shown in Listing~\ref{lst:FT_PP_InputExample}
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=FT Importer input example., label=lst:FT_PP_InputExample]
+  <Files>
+    <Input name="faultTreeTest" type="">FTimporter_not.xml</Input>
+  </Files>
+
+  <Models>
+    ...
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+    ...
+  </Models>
+
+  <Steps>
+    ...
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    ...
+  </Steps>
+
+  <DataObjects>
+    ...
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3,BE4</Input>
+      <Output>TOP</Output>
+    </PointSet>
+    ...
+  </DataObjects>
+\end{lstlisting}
+
+Important notes and capabilities:
+\begin{itemize}
+	\item If the FT is split in two or more FTs (and thus one file for each FT), then it is only required to list
+	      all files in the Step. RAVEN automatically detect links among FTs and merge all of them into a single PointSet.
+	\item Allowed gates: AND, OR, NOT, ATLEAST, CARDINALITY, IFF, imply, NAND, NOR, XOR
+	\item If an house-event is defined in the FT:
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=FT Importer input example: house-event., label=lst:FT_house event]
+<opsa-mef>
+    <define-fault-tree name="FT">
+        <define-gate name="TOP">
+            <or>
+                <basic-event name="BE1"/>
+                <basic-event name="BE2"/>
+                <house-event name="HE1"/>
+            </or>
+        </define-gate>
+        <define-house-event name="HE1">
+        	<constant value="true"/>
+        </define-house-event>
+    </define-fault-tree>
+</opsa-mef>
+\end{lstlisting}
+           then the HE1 is not part of the PointSet (value is fixed)
+\end{itemize}
 
 \subsection{FT Importer Reference Tests}
 \begin{itemize}
diff --git a/doc/user_manual/include/MCSImporter.tex b/doc/user_manual/include/MCSImporter.tex
new file mode 100644
index 0000000..1df4395
--- /dev/null
+++ b/doc/user_manual/include/MCSImporter.tex
@@ -0,0 +1,118 @@
+\section{MCSImporter}
+\label{MCSimporterPP}
+
+The \textbf{MCSImporter} post-processor has been designed to import Minimal Cut Sets (MCSs) into RAVEN.
+This post-processor reads a csv file which contain the list of MCSs and it save this list as a DataObject
+(i.e.,  a PointSet).
+The csv file is composed by three columns; the first contains the ID number of the MCS, the second one contains
+the MCS probability value, the third one lists all the Basic Events contained in the MCS.
+An example of csv file is shown in Table~\ref{MCScsv}.
+
+\begin{table}[h]
+    \centering
+    \caption{Example of csv file which contains four MCSs.}
+    \label{MCScsv}
+	\begin{tabular}{c  c  c}
+		\hline
+		ID, & Prob, & MCS, \\
+		\hline
+		1.,  &  1.8E-2, &  D  \\
+		2.,  &  4.0E-3, &  B \\
+		3.,  &  3.0E-4, &  A,C  \\
+		4.,  &  2.1E-5, &  E,C \\
+		\hline
+	\end{tabular}
+\end{table}
+
+The PointSet is structured to include all Basic Event, the MCS ID, the MCS probability, and the outcome of such MCS
+(always set to 1).
+MCS ID and MCS probability are copied directly from the csv file.
+For each MCS, the Basic Events can have two possible values:
+  \begin{itemize}
+    \item  0: Basic Event is not included in the MCS
+    \item  1: Basic Event is included in the MCS
+  \end{itemize}
+The PointSet generated from the csv file of Table~\ref{MCScsv} is shown in Table~\ref{PointSetMCSExpandFalse}.
+\begin{table}[h]
+    \centering
+    \caption{PointSet generated by RAVEN for the list of MCSs shown in Table~\ref{MCScsv}.}
+    \label{PointSetMCSExpandFalse}
+	\begin{tabular}{c | c | c | c | c | c | c | c }
+		\hline
+		A & B & C & D & E & MCS\_ID & probability & out \\
+		\hline
+		0 & 0 & 0 & 1 & 0 & 1 & 1.8E-2 & 1 \\
+		0 & 1 & 0 & 0 & 0 & 2 & 4.0E-3 & 1 \\
+		1 & 0 & 1 & 0 & 0 & 3 & 3.0E-4 & 1 \\
+		0 & 0 & 1 & 0 & 1 & 4 & 4.0E-3 & 1 \\
+		\hline
+	\end{tabular}
+\end{table}
+
+%
+\ppType{MCSImporter}{MCSImporter}
+%
+\begin{itemize}
+  \item  \xmlNode{expand},\xmlDesc{bool, required parameter}, expand the set of Basic Events by including all PRA Basic Events
+  and not only the once listed in the MCSs
+  \item  \xmlNode{BElistColumn},\xmlDesc{string, optional parameter}, if expand is set to True, then this node contains the
+  column of the csv file which contains all the PRA Basic Events
+\end{itemize}
+
+\textbf{Example:}
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=MCS Importer input example (no expand)., label=lst:MCS_PP_InputExample]
+  <Files>
+    <Input name="MCSlistFile" type="MCSlist">MCSlist.csv</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="MCSImporter" subType="SR2ML.MCSImporter">
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type="MCSlist"         >MCSlistFile</Input>
+      <Model   class="Models"       type="PostProcessor"   >MCSImporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >MCS_PS</Output>
+    </PostProcess>
+  </Steps>
+
+  <DataObjects>
+    <PointSet name="MCS_PS">
+      <Input>A,B,C,D,E</Input>
+      <Output>MCS_ID,probability,out</Output>
+    </PointSet>
+  </DataObjects>
+\end{lstlisting}
+
+\textbf{Example:}
+\begin{lstlisting}[style=XML,morekeywords={anAttribute},caption=MCS Importer input example (expanded)., label=lst:MCS_PP_InputExample]
+  <Files>
+    <Input name="MCSlistFile" type="MCSlist">MCSlist.csv</Input>
+    <Input name="BElistFile"  type="BElist" >BElist.csv</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="MCSImporter" subType="SR2ML.MCSImporter">
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type="MCSlist"         >MCSlistFile</Input>
+      <Input   class="Files"        type="BElist"          >BElistFile</Input>
+      <Model   class="Models"       type="PostProcessor"   >MCSimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >MCS_PS</Output>
+    </PostProcess>
+  </Steps>
+
+  <DataObjects>
+    <PointSet name="MCS_PS">
+      <Input>A,B,C,D,E,F,G</Input>
+      <Output>MCS_ID,probability,out</Output>
+    </PointSet>
+  </DataObjects>
+\end{lstlisting}
diff --git a/doc/user_manual/user_manual.tex b/doc/user_manual/user_manual.tex
index 404bb6d..04c22f2 100644
--- a/doc/user_manual/user_manual.tex
+++ b/doc/user_manual/user_manual.tex
@@ -157,7 +157,15 @@
                                                 % xmlDesc = XML description
 \newcommand{\default}[1]{~\\*\textit{Default: #1}}
 \newcommand{\nb} {\textcolor{deepgreen}{\textbf{~Note:}}~}
+\newcommand{\ppType}[2]
+{
+  In order to use the \textit{#1} PP, the user needs to set the
+  \xmlAttr{subType} of a \xmlNode{PostProcessor} node:
+
+  \xmlNode{PostProcessor \xmlAttr{name}=\xmlString{ppName} \xmlAttr{subType}=\xmlString{SR2ML.#2}/}.
 
+   Several sub-nodes are available:
+}
 
 %%%%%%%% End comands definition to input python code into document
 
@@ -292,16 +300,20 @@
     % This is where the body of the report begins; usually with an Introduction
     %
     \input{Introduction.tex}
+    %%%%%%%%%%%%% External Models %%%%%%%%%%%%%%
     \input{include/ETmodel.tex}
     \input{include/FTmodel.tex}
     \input{include/MarkovModel.tex}
     \input{include/RBDmodel.tex}
-    \input{include/DataClassifier.tex}
-    \input{include/ETdataImporter.tex}
-    \input{include/FTdataImporter.tex}
     \input{include/MCSsolver.tex}
     \input{include/ReliabilityModels.tex}
     \input{include/MaintenanceModels.tex}
+    %%%%%%%%%%%%% PostProcessors %%%%%%%%%%%%%%%%
+    \input{include/DataClassifier.tex}
+    \input{include/ETdataImporter.tex}
+    \input{include/FTdataImporter.tex}
+    \input{include/MCSImporter.tex}
+    \input{include/DiscreteRiskMeasures.tex}
 
     \section*{Document Version Information}
     This document has been compiled using the following version of the plug-in git repository:
diff --git a/src/ETModel.py b/src/ETModel.py
index 4d1c867..f9ab75a 100644
--- a/src/ETModel.py
+++ b/src/ETModel.py
@@ -8,7 +8,7 @@
 
 #Internal Modules---------------------------------------------------------------
 from PluginBaseClasses.ExternalModelPluginBase import ExternalModelPluginBase
-from Models.PostProcessors.ETStructure import ETStructure
+from .PostProcessors.ETStructure import ETStructure
 #Internal Modules End-----------------------------------------------------------
 
 
diff --git a/src/FTModel.py b/src/FTModel.py
index eb402bb..039ffea 100644
--- a/src/FTModel.py
+++ b/src/FTModel.py
@@ -12,7 +12,7 @@
 
 #Internal Modules---------------------------------------------------------------
 from PluginBaseClasses.ExternalModelPluginBase import ExternalModelPluginBase
-from Models.PostProcessors.FTStructure import FTStructure
+from .PostProcessors.FTStructure import FTStructure
 #Internal Modules End-----------------------------------------------------------
 
 
diff --git a/src/MCSSolver.py b/src/MCSSolver.py
index 53cf855..4733a80 100644
--- a/src/MCSSolver.py
+++ b/src/MCSSolver.py
@@ -27,7 +27,7 @@
 
 #Internal Modules---------------------------------------------------------------
 from PluginBaseClasses.ExternalModelPluginBase import ExternalModelPluginBase
-from Models.PostProcessors.MCSimporter import mcsReader
+from .PostProcessors.MCSimporter import mcsReader
 #Internal Modules End-----------------------------------------------------------
 
 class MCSSolver(ExternalModelPluginBase):
diff --git a/src/PostProcessors/DataClassifier.py b/src/PostProcessors/DataClassifier.py
new file mode 100644
index 0000000..bc95e5f
--- /dev/null
+++ b/src/PostProcessors/DataClassifier.py
@@ -0,0 +1,195 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on Jan 29, 2018
+
+@author: Congjian Wang
+"""
+
+import numpy as np
+
+from utils import InputData, InputTypes, utils
+from PluginBaseClasses.PostProcessorPluginBase import PostProcessorPluginBase
+
+class DataClassifier(PostProcessorPluginBase):
+  """
+    This Post-Processor performs data classification based on given classifier.
+    In order to use this interface post-processor, the users need to provide
+    two data objects, one (only PointSet is allowed) is used to construct the
+    classifier that will be used to label the data in the second data object
+    (both PointSet and HistorySet are allowed).
+  """
+
+  @classmethod
+  def getInputSpecification(cls):
+    """
+      Method to get a reference to a class that specifies the input data for
+      class cls.
+      @ In, cls, the class for which we are retrieving the specification
+      @ Out, inputSpecification, InputData.ParameterInput, class to use for
+        specifying input of cls.
+    """
+    inputSpecification = super().getInputSpecification()
+    VariableInput = InputData.parameterInputFactory("variable", contentType=InputTypes.StringType)
+    VariableInput.addParam("name", InputTypes.StringType, True)
+    FunctionInput = InputData.parameterInputFactory("Function", contentType=InputTypes.StringType)
+    FunctionInput.addParam("class", InputTypes.StringType, True)
+    FunctionInput.addParam("type", InputTypes.StringType, True)
+    VariableInput.addSub(FunctionInput, InputData.Quantity.one)
+    LabelInput = InputData.parameterInputFactory("label",contentType=InputTypes.StringType)
+    inputSpecification.addSub(VariableInput, InputData.Quantity.one_to_infinity)
+    inputSpecification.addSub(LabelInput, InputData.Quantity.one)
+
+    return inputSpecification
+
+  def __init__(self):
+    """
+      Constructor
+      @ In, None
+      @ Out, None
+    """
+    super().__init__()
+    self.printTag   = 'POSTPROCESSOR DataClassifier'
+    self.mapping    = {}  # dictionary for mapping input space between different DataObjects {'variableName':'externalFunctionName'}
+    self.funcDict   = {}  # Contains the function to be used {'variableName':externalFunctionInstance}
+    self.label      = None # ID of the variable which containf the label values
+    self.outputMultipleRealizations = True # True indicate multiple realizations are returned
+
+    # assembler objects to be requested
+    self.addAssemblerObject('Function', InputData.Quantity.one_to_infinity)
+
+  def initialize(self, runInfo, inputs, initDict=None):
+    """
+      Method to initialize the DataClassifier post-processor.
+      @ In, runInfo, dict, dictionary of run info (e.g. working dir, etc)
+      @ In, inputs, list, list of inputs
+      @ In, initDict, dict, optional, dictionary with initialization options
+      @ Out, None
+    """
+    super().initialize(runInfo, inputs, initDict)
+    for key, val in self.mapping.items():
+     self.funcDict[key] = self.retrieveObjectFromAssemblerDict('Function',val[1])
+
+  def _handleInput(self, paramInput):
+    """
+      Method that handles PostProcessor parameter input block
+      @ In, paramInput, ParameterInput, the already parsed input
+      @ Out, None
+    """
+    super()._handleInput(paramInput)
+    for child in paramInput.subparts:
+      if child.getName() == 'variable':
+        func = child.findFirst('Function')
+        funcType = func.parameterValues['type']
+        funcName = func.value.strip()
+        varName = child.parameterValues['name']
+        if varName in self.mapping.keys():
+          self.raiseAnError(IOError, "The variable {} name is duplicated in the XML input".format(varName))
+        self.mapping[varName] = (funcType, funcName)
+      elif child.getName() == 'label':
+        self.label = child.value.strip()
+
+  def identifyInputs(self, inputData):
+    """
+      Method to identify the type (i.e., 'classifier' or 'target') of input data.
+      If the input data contains 'label' and required 'variables' (provided by XML input file),
+      the input data will assign type 'classifier', otherwise 'target'
+      Please check 'PluginsBaseClasses.PostProcessorPluginBase' for the detailed descriptions
+      about 'inputData' and the output 'newInput'.
+      @ In, inputData, dict, dictionary contains the input data and input files, i.e.,
+          {'Data':[DataObjects.asDataset('dict')], 'Files':[FileObject]}
+      @ Out, newInput, dict, dictionary of identified inputs, i.e.,
+          {'classifier':DataObjects.asDataset('dict'), 'target':DataObjects.asDataset('dict')}
+    """
+    currentInput = inputData['Data']
+    if len(currentInput) != 2:
+      self.raiseAnError(IOError, "Required two inputs for PostProcessor {}, but got {}".format(self.name, len(currentInput)))
+    newInput ={'classifier':{}, 'target':{}}
+    haveClassifier = False
+    haveTarget = False
+    requiredKeys = list(self.mapping.keys()) + [self.label]
+    for inputTuple in currentInput:
+      _, _, inputDict = inputTuple
+      if inputDict['type'] not in ['PointSet', 'HistorySet']:
+        self.raiseAnError(IOError, "The input for this postprocesor", self.name, "is not acceptable! Allowed inputs are 'PointSet' and 'HistorySet'.")
+      dataType = None
+      if set(requiredKeys).issubset(set(inputDict['data'].keys())):
+        dataType = 'classifier'
+        if not haveClassifier:
+          haveClassifier = True
+        else:
+          self.raiseAnError(IOError, "Both input data objects have been already processed! No need to execute this postprocessor", self.name)
+        if inputDict['type'] != 'PointSet':
+          self.raiseAnError(IOError, "Only PointSet is allowed as classifier, but got", inputDict['type'])
+      else:
+        dataType = 'target'
+        if not haveTarget:
+          haveTarget = True
+        else:
+          self.raiseAnError(IOError, "None of the input DataObjects can be used as the reference classifier! Either the label", \
+                  self.label, "is not exist in the output of the DataObjects or the inputs of the DataObjects are not the same as", \
+                  ','.join(self.mapping.keys()))
+      newInput[dataType] = inputDict
+    return newInput
+
+  def run(self, inputIn):
+    """
+      This method executes the postprocessor action.
+      @ In,  inputIn, dict, dictionary contains the input data and input files, i.e.,
+          {'Data':[DataObjects.asDataset('dict')], 'Files':[FileObject]}, only 'Data'
+          will be used by this PostProcessor
+      @ Out, outputDict, dict, dictionary of outputs, i.e.,
+          {'data':dict of realizations, 'dim':{varName:independent dimensions that the variable depends on}}
+    """
+    inputDict = self.identifyInputs(inputIn)
+    targetDict = inputDict['target']
+    classifierDict = inputDict['classifier']
+    outputDict = {}
+    outputDict.update(inputDict['target']['data'])
+    outputType = targetDict['type']
+    dimsDict = targetDict['dims']
+    numRlz = utils.first(targetDict['data'].values()).size
+    outputDict[self.label] = []
+    for i in range(numRlz):
+      tempTargDict = {}
+      for param, vals in targetDict['data'].items():
+        tempTargDict[param] = vals[i]
+      tempClfList = []
+      labelIndex = None
+      for key in self.mapping.keys():
+        calcVal = self.funcDict[key].evaluate("evaluate", tempTargDict)
+        values = classifierDict['data'][key]
+        inds, = np.where(np.asarray(values) == calcVal)
+        if labelIndex is None:
+          labelIndex = set(inds)
+        else:
+          labelIndex = labelIndex & set(inds)
+      if len(labelIndex) != 1:
+        self.raiseAnError(IOError, "The parameters", ",".join(tempTargDict.keys()), "with values", ",".join([str(el) for el in tempTargDict.values()]), "could not be categorized!")
+      label = classifierDict['data'][self.label][list(labelIndex)[0]]
+      if outputType == 'PointSet':
+        outputDict[self.label].append(label)
+      else:
+        historySize = 1
+        for var in targetDict['data'].keys():
+          dims = dimsDict[var]
+          if len(dims) !=0:
+            historySize = len(targetDict['data'][var][i])
+            if self.label not in dimsDict:
+              dimsDict[self.label] = dims
+            break
+        outputDict[self.label].append(np.asarray([label]*historySize))
+    outputDict[self.label] = np.asarray(outputDict[self.label])
+    outputDict = {'data': outputDict, 'dims':targetDict['dims']}
+    return outputDict
diff --git a/src/PostProcessors/ETImporter.py b/src/PostProcessors/ETImporter.py
new file mode 100644
index 0000000..30680cd
--- /dev/null
+++ b/src/PostProcessors/ETImporter.py
@@ -0,0 +1,89 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on Nov 1, 2017
+
+@author: dan maljovec, mandd
+"""
+#Internal Modules---------------------------------------------------------------
+from utils import InputData, InputTypes
+from PluginBaseClasses.PostProcessorPluginBase import PostProcessorPluginBase
+from .ETStructure import ETStructure
+#Internal Modules End-----------------------------------------------------------
+
+class ETImporter(PostProcessorPluginBase):
+  """
+    This is the base class of the PostProcessor that imports Event-Trees (ETs) into RAVEN as a PointSet
+  """
+  def __init__(self):
+    """
+      Constructor
+      @ In, None
+      @ Out, None
+    """
+    super().__init__()
+    self.printTag  = 'POSTPROCESSOR ET IMPORTER'
+    self.expand    = None  # option that controls the structure of the ET. If True, the tree is expanded so that
+                           # all possible sequences are generated. Sequence label is maintained according to the
+                           # original tree
+    self.fileFormat = None # chosen format of the ET file
+    self.allowedFormats = ['OpenPSA'] # ET formats that are supported
+    self.validDataType = ['PointSet'] # The list of accepted types of DataObject
+    ## Currently, we have used both DataObject.addRealization and DataObject.load to
+    ## collect the PostProcessor returned outputs. DataObject.addRealization is used to
+    ## collect single realization, while DataObject.load is used to collect multiple realizations
+    ## However, the DataObject.load can not be directly used to collect single realization
+    self.outputMultipleRealizations = True
+
+  @classmethod
+  def getInputSpecification(cls):
+    """
+      Method to get a reference to a class that specifies the input data for
+      class cls.
+      @ In, cls, the class for which we are retrieving the specification
+      @ Out, inputSpecification, InputData.ParameterInput, class to use for
+        specifying input of cls.
+    """
+    inputSpecification = super().getInputSpecification()
+    inputSpecification.addSub(InputData.parameterInputFactory("fileFormat", contentType=InputTypes.StringType))
+    inputSpecification.addSub(InputData.parameterInputFactory("expand"    , contentType=InputTypes.BoolType))
+    return inputSpecification
+
+  def _handleInput(self, paramInput):
+    """
+      Method that handles PostProcessor parameter input block.
+      @ In, paramInput, ParameterInput, the already parsed input.
+      @ Out, None
+    """
+    super()._handleInput(paramInput)
+    fileFormat = paramInput.findFirst('fileFormat')
+    self.fileFormat = fileFormat.value
+    if self.fileFormat not in self.allowedFormats:
+      self.raiseAnError(IOError, 'ETImporter Post-Processor ' + self.name + ', format ' + str(self.fileFormat) + ' : is not supported')
+    expand = paramInput.findFirst('expand')
+    self.expand = expand.value
+
+  def run(self, inputIn):
+    """
+      This method executes the PostProcessor action.
+      @ In,  inputIn, dict, dictionary contains the input data and input files, i.e.,
+          {'Data':[DataObjects.asDataset('dict')], 'Files':[FileObject]}, only 'Files'
+          will be used by this PostProcessor
+      @ Out, outputDict, dict, dictionary of outputs, i.e.,
+          {'data':dict of realizations, 'dim':{varName:independent dimensions that the variable depends on}}
+    """
+    eventTreeModel = ETStructure(self.expand, inputIn['Files'])
+    outputDict, variables = eventTreeModel.returnDict()
+    outputDict = {'data': outputDict, 'dims':{}}
+    return outputDict
diff --git a/src/PostProcessors/ETStructure.py b/src/PostProcessors/ETStructure.py
new file mode 100644
index 0000000..ffa2bd6
--- /dev/null
+++ b/src/PostProcessors/ETStructure.py
@@ -0,0 +1,468 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on April 30, 2018
+
+@author: mandd
+"""
+#Internal Modules---------------------------------------------------------------
+import MessageHandler
+from utils import utils
+from utils import xmlUtils as xmlU
+import MessageHandler
+#Internal Modules End-----------------------------------------------------------
+
+#External Modules---------------------------------------------------------------
+import numpy as np
+import xml.etree.ElementTree as ET
+import copy
+import itertools
+from collections import OrderedDict
+#External Modules End-----------------------------------------------------------
+
+class ETStructure(object):
+  """
+    This is the base class of the ET structure which actually handles ET structures which is used by the ETimporter and the ETmodel
+  """
+  def __init__(self, expand, inputs):
+    """
+      This method executes the post-processor action.
+      @ In, inputs, list, list of file objects
+      @ In, expand, bool, boolean variable which indicates if the ET needs to be factorially expanded
+      @ Out, None
+    """
+    self.expand = expand
+    ### Check for link to other ET
+    links = []
+    sizes=(len(inputs),len(inputs))
+    connectivityMatrix = np.zeros(sizes)
+    listETs=[]
+    listRoots=[]
+
+    for fileID in inputs:
+      eventTree = ET.parse(fileID.getPath() + fileID.getFilename())
+      listETs.append(eventTree.getroot().get('name'))
+      listRoots.append(eventTree.getroot())
+    links = self.createLinkList(listRoots)
+
+    if len(inputs)>0:
+      rootETID = self.checkETStructure(links,listETs,connectivityMatrix)
+
+    if len(links)>=1 and len(inputs)>1:
+      finalAssembledTree = self.analyzeMultipleET(inputs,links,listRoots,listETs,rootETID)
+      self.pointSet = self.analyzeSingleET(finalAssembledTree)
+
+    elif len(links)==0 and len(inputs)>1:
+      raise IOError('Multiple ET files have provided but they are not linked')
+
+    elif len(links)>1 and len(inputs)==1:
+      raise IOError('A single ET files has provided but it contains a link to an additional ET')
+
+    elif len(links)==0 and len(inputs)==1:
+      eventTree = ET.parse(inputs[0].getPath() + inputs[0].getFilename())
+      self.pointSet = self.analyzeSingleET(eventTree.getroot())
+
+  def solve(self,combination):
+    """
+      This method provides the sequence of the ET given the status of its branching conditions
+      @ In, combination, dict, values of all ET branching conditions
+      @ In, outcome, float, sequence of the ET corresponding to the provided ET branching conditions
+    """
+    combinationArray=np.zeros(len(self.variables))
+    outcome = -1
+    for index, var in enumerate(self.variables):
+      combinationArray[index] = combination[var]
+    inputData = self.pointSet[:,:len(self.variables)]
+    for row in self.pointSet:
+      if np.array_equal(row[:len(self.variables)],combinationArray):
+        outcome = row[-1]
+    return outcome
+
+  def returnDict(self):
+    """
+      This method returns the ET data
+      @ In, None
+      @ Out, (outputDict,self.variables), tuple, tuple containing 1) outputDict (dict, dictionary containing the
+                                                 values of all ET branching conditions) and 2) self.variables
+                                                (list, IDs of the ET branching conditions)
+    """
+    outputDict = {}
+    for index, var in enumerate(self.variables):
+      outputDict[var] = self.pointSet[:, index]
+    outputDict['sequence'] = self.pointSet[:, -1]
+
+    return outputDict, self.variables
+
+  def createLinkList(self,listRoots):
+    """
+      This method identifies the links among ETs. It saves such links in the variable links.
+      Note that this method overwrites such variable when it is called. This is because the identification
+      of the links needs to be computed from scratch after every merging step since the structure of ETs has changed.
+      The variable links=[dep1,...,depN] is a list of connections where each connection dep is a
+      dictionary as follows:
+
+          dep.keys =
+                     * link_seqID  : ID of the link in the master ET
+                     * ET_slave_ID : ID of the slave ET that needs to be copied into the master ET
+                     * ET_master_ID: ID of the master ET;
+
+      The slave ET is merged into the master ET; note the master ET contains the link in at least one
+      <define-sequence> node:
+
+         <define-sequence name="Link-to-LP">
+           <event-tree name="Link-to-LP-Event-Tree"/>
+         </define-sequence>
+
+      @ In,  listRoots, list, list containing the root of all ETs
+      @ Out, linkList, list, list containing the links among the ETs
+    """
+    linkList = []
+    for root in listRoots:
+      links, seqID = self.checkLinkedTree(root)
+      if len(links) > 0:
+        for idx, val in enumerate(links):
+          dep = {}
+          dep['link_seqID'] = copy.deepcopy(seqID[idx])
+          dep['ET_slave_ID'] = copy.deepcopy(val)
+          dep['ET_master_ID'] = copy.deepcopy(root.get('name'))
+          linkList.append(dep)
+    return linkList
+
+  def checkETStructure(self,links,listETs,connectivityMatrix):
+    """
+      This method checks that the structure of the ET is consistent. In particular, it checks that only one root ET
+      and at least one leaf ET is provided. As an example consider the following ET structure:
+         ET1 ----> ET2 ----> ET3
+          |------> ET4 ----> ET5
+      Five ETs have been provided, ET1 is the only root ET while ET3 and ET5 are leaf ET.
+      @ In, links, list, list containing all the link connectivities among ETs
+      @ In, listETs, list, list containing the ID of the ETs
+      @ In, connectivityMatrix, np.array, matrix containing connectivity mapping
+      @ Out, rootETID, xml.etree.Element, root of the main ET
+    """
+
+    # each element (i,j) of the matrix connectivityMatrix shows if there is a connection from ET_i to ET_j:
+    #   * 0: no connection from i to j
+    #   * 1: a connection exists from i to j
+    for link in links:
+      row = listETs.index(link['ET_master_ID'])
+      col = listETs.index(link['ET_slave_ID'])
+      connectivityMatrix[row,col]=1.0
+
+    # the root ETs are charaterized by a column full of zeros
+    # the leaf ETs are charaterized by a row full of zeros
+    zeroRows    = np.where(~connectivityMatrix.any(axis=1))[0]
+    zeroColumns = np.where(~connectivityMatrix.any(axis=0))[0]
+
+    if len(zeroColumns)>1:
+      raise IOError('Multiple root ET')
+    if len(zeroColumns)==0:
+      raise IOError('No root ET')
+    if len(zeroColumns)==1:
+      rootETID = listETs[zeroColumns.astype(int)[0]]
+      print("ETImporter Root ET: " + str(rootETID))
+
+    leafs = []
+    for index in np.nditer(zeroRows):
+      leafs.append(listETs[index])
+    print("ETImporter leaf ETs: " + str(leafs))
+
+    return rootETID
+
+  def analyzeMultipleET(self,inputs,links,listRoots,listETs,rootETID):
+    """
+      This method executes the analysis of the ET if multiple ETs are provided. It merge all ETs onto the root ET
+      @ In, input, list, list of file objects
+      @ In, links, list, list containing the links among the ETs
+      @ In, listRoots, list containing the root of all ETs
+      @ In, listETs, list, list containing the ID of the ETs
+      @ In, rootETID, xml.etree.Element, root of the main ET
+      @ Out, xmlNode, xml.etree.Element, root of the assembled root ET
+    """
+    # 1. for all ET check if it contains SubBranches
+    ETset = []
+    for fileID in inputs:
+      eventTree = ET.parse(fileID.getPath() + fileID.getFilename())
+      root = self.checkSubBranches(eventTree.getroot())
+      ETset.append(root)
+
+    # 2. loop on the dependencies until it is empty
+    while len(links)>0:
+      for link in links:
+        indexMaster = listETs.index(link['ET_master_ID'])
+        indexSlave  = listETs.index(link['ET_slave_ID'])
+        mergedTree  = self.mergeLinkedTrees(listRoots[indexMaster],listRoots[indexSlave],link['link_seqID'])
+
+        listETs.pop(indexMaster)
+        listRoots.pop(indexMaster)
+
+        listETs.append(link['ET_master_ID'])
+        listRoots.append(mergedTree)
+
+        links = self.createLinkList(listRoots)
+
+    indexRootET = listETs.index(rootETID)
+    return listRoots[indexRootET]
+
+  def analyzeSingleET(self,masterRoot):
+    """
+      This method executes the analysis of the ET if a single ET is provided.
+      @ In,  masterRoot, xml.etree.Element, root of the ET
+      @ Out, pointSet, np.array, numpy matrix containing the pointSet data
+    """
+    root = self.checkSubBranches(masterRoot)
+
+    ## These outcomes will be encoded as integers starting at 0
+    outcomes = []
+    ## These variables will be mapped into an array where there index
+    self.variables = []
+    values = {}
+    for node in root.findall('define-functional-event'):
+      event = node.get('name')
+      ## First, map the variable to an index by placing it in a list
+      self.variables.append(event)
+      ## Also, initialize the dictionary of values for this variable so we can
+      ## encode them as integers as well
+      values[event] = []
+      ## Iterate through the forks that use this event and gather all of the
+      ## possible states
+      for fork in xmlU.findAllRecursive(root.find('initial-state'), 'fork'):
+        if fork.get('functional-event') == event:
+          for path in fork.findall('path'):
+            state = path.get('state')
+            if state not in values[event]:
+              values[event].append(state)
+
+    ## Iterate through the sequences and gather all of the possible outcomes
+    ## so we can numerically encode them latter
+    for node in root.findall('define-sequence'):
+      outcome = node.get('name')
+      if outcome not in outcomes:
+        outcomes.append(outcome)
+    etMap = self.returnMap(outcomes, root.get('name'))
+    print("ETImporter variables identified: " + str(format(self.variables)))
+
+    d = len(self.variables)
+    n = len(xmlU.findAllRecursive(root.find('initial-state'), 'sequence'))
+    pointSet = -1 * np.ones((n, d + 1))
+    rowCounter = 0
+    for node in root.find('initial-state'):
+      newRows = self.constructPointDFS(node, self.variables, values, etMap, pointSet, rowCounter)
+      rowCounter += newRows
+
+    if self.expand:
+      pointSet = self.expandPointSet(pointSet,values)
+
+    return pointSet
+
+  def expandPointSet(self,pointSet,values):
+    """
+      This method performs a full-factorial expansion of the ET: if a branch contains a -1 element this method
+      duplicate the branch; each duplicated branch contains element values equal to +1 and 0.
+      @ In,  pointSet, np.array, original point set
+      @ In, values, dict, dictionary containing the numerical value associated to each functional event
+      @ Out, pointSet, np.array, expanded point set
+    """
+    for col in range(pointSet.shape[1]):
+      indexes = np.where(pointSet[:,col] == -1)[0]
+      if indexes.size>0:
+        for idx in indexes:
+          var = self.variables[col]
+          pointSet[idx,col] = values[var][0]
+          for index, value in enumerate(values[var]):
+            if index > 0:
+              rowToBeAdded = copy.deepcopy(pointSet[idx,:])
+              rowToBeAdded[col] = value
+              pointSet = np.vstack([pointSet,rowToBeAdded])
+    return pointSet
+
+  def checkLinkedTree(self, root):
+    """
+      This method checks if the provided root of the ET contains links to other ETs.
+      This occurs if a <define-sequence> node contains a <event-tree> sub-node:
+          <define-sequence name="Link-to-LP">
+            <event-tree name="Link-to-LP-Event-Tree"/>
+          </define-sequence>
+      The name of the <event-tree> is the link to the ET defined as follows:
+          <define-event-tree name="Link-to-LP-Event-Tree">
+
+      @ In,  root, xml.etree.Element, root of the root ET
+      @ Out, returnData, tuple, tuple containing 1) dependencies (list of ID of the linked ET (e.g., Link-to-LP-Event-Tree))
+                                and seqID (list of ID of the link in the root ET (e.g., Link-to-LP))
+    """
+    dependencies = []
+    seqID        = []
+
+    for node in root.findall('define-sequence'):
+      for child in node.getiterator():
+        if 'event-tree' in child.tag:
+          dependencies.append(child.get('name'))
+          seqID.append(node.get('name'))
+    returnData = dependencies, seqID
+    return returnData
+
+  def mergeLinkedTrees(self,rootMaster,rootSlave,location):
+    """
+      This method merged two ET; it merges a slave ET onto the master ET. Note that slave ET can be copied
+      in multiple branches of the master ET.
+      @ In,  rootMaster, xml.etree.Element, root of the master ET
+      @ In,  rootSlave, xml.etree.Element,  root of the slave ET
+      @ In,  location, string, ID of the link that identifies the branches of the master ET that are linked to the slave ET
+      @ Out, rootMaster, xml.etree.Element, root of the master ET after the merging process has completed
+    """
+    # 1. copy define-functional-event block
+    for node in rootSlave.findall('define-functional-event'):
+      rootMaster.append(node)
+    # 2. copy define-sequence block
+    for node in rootSlave.findall('define-sequence'):
+      rootMaster.append(node)
+    # 3. remove the <define-sequence> that points at the "location"
+    for node in rootMaster.findall('define-sequence'):
+      if node.get('name') == location:
+        rootMaster.remove(node)
+    # 4. copy slave ET into master ET
+    for node in rootMaster.findall('.//'):
+      if node.tag == 'path':
+        for subNode in node.findall('sequence'):
+          linkName = subNode.get('name')
+          if linkName == location:
+            node.append(rootSlave.find('initial-state').find('fork'))
+            node.remove(subNode)
+    return copy.deepcopy(rootMaster)
+
+  def checkSubBranches(self,root):
+    """
+      This method checks if the provided ET contains sub-branches (i.e., by-pass).
+      This occurs if the node <define-branch> is provided.
+      As an example:
+          <define-branch name="sub-tree1">
+      defines a branch that is linked to multiple ET sequences:
+          <path state="0">
+              <branch name="sub-tree1"/>
+          </path>
+      The scope of this method is to copy the <define-branch> into the sequences of the
+      ET that are linked to <define-branch>
+      @ In,  root, xml.etree.Element, root of the ET
+      @ Out, root, xml.etree.Element, root of the processed ET
+    """
+    eventTree = root.findall('initial-state')
+
+    if len(eventTree) > 1:
+      print('ETImporter: more than one initial-state identified')
+    ### Check for sub-branches
+    subBranches = {}
+    for node in root.findall('define-branch'):
+      subBranches[node.get('name')] = node.find('fork')
+      print("ETImporter branch identified: " + str(node.get('name')))
+    if len(subBranches) > 0:
+      for node in root.findall('.//'):
+        if node.tag == 'path':
+          for subNode in node.findall('branch'):
+            linkName = subNode.get('name')
+            if linkName in subBranches.keys():
+                node.append(subBranches[linkName])
+            else:
+                raise IOError(' ETImporter: branch ' + str(
+              linkName) + ' linked in the ET is not defined; available branches are: ' + str(
+                  subBranches.keys()))
+
+    for child in root:
+      if child.tag == 'branch':
+        root.remove(child)
+
+    return root
+
+  def returnMap(self,outcomes,name):
+    """
+      This method returns a map if the ET contains symbolic sequences.
+      This is needed since since RAVEN requires numeric values for sequences.
+      @ In,  outcomes, list, list that contains all the sequences IDs provided in the ET
+      @ In,  name, string, name of the ET
+      @ Out, etMap, dict, dictionary containing the map
+    """
+    # check if outputMap contains string ID for  at least one sequence
+    # if outputMap contains all numbers then keep the number ID
+    allFloat = True
+    for seq in outcomes:
+      try:
+        float(seq)
+      except ValueError:
+        allFloat = False
+        break
+    etMap = {}
+    if allFloat == False:
+      # create an integer map, and create an integer map file
+      root = ET.Element('map')
+      root.set('Tree', name)
+      for seq in outcomes:
+        etMap[seq] = outcomes.index(seq)
+        ET.SubElement(root, "sequence", ID=str(outcomes.index(seq))).text = str(seq)
+      fileID = name + '_mapping.xml'
+      updatedTreeMap = ET.ElementTree(root)
+      xmlU.prettify(updatedTreeMap)
+      updatedTreeMap.write(fileID)
+    else:
+      for seq in outcomes:
+        etMap[seq] = utils.floatConversion(seq)
+    return etMap
+
+  def constructPointDFS(self, node, inputMap, stateMap, outputMap, X, rowCounter):
+    """
+      Construct a "sequence" using a depth-first search on a node, each call
+      will be on a fork except in the base case which will be called on a
+      sequence node. The recursive case will traverse into a path node, thus
+      path nodes will be "skipped" in the call stack as one level of paths
+      will be processed per recursive call in order to set one of the columns
+      of X for the row identified by rowCounter.
+      @ In, node, ET.Element, the current node to process
+      @ In, inputMap, list, a map for converting string variable names into
+            sequential non-negative integers that can be used to index X
+      @ In, stateMap, dict, a map similar to above, but instead converts the
+            possible states for each event (variable) into non-negative
+            integers
+      @ In, outputMap, list, a map for converting string outcome values into
+            non-negative integers
+      @ In, X, np.array, data object to populate with values
+      @ In, rowCounter, int, the row we are currently editing in X
+      @ Out, rowCounter, int, the number of rows of X this call has populated
+    """
+    # Construct point
+    if node.tag == 'sequence':
+      col = X.shape[1]-1
+      outcome = node.get('name')
+      val = outputMap[outcome]
+      X[rowCounter, col] = val
+      rowCounter += 1
+    elif node.tag == 'fork':
+      event = node.get('functional-event')
+      col = inputMap.index(event)
+
+      for path in node.findall('path'):
+        state = path.get('state')
+        if   state == 'failure':
+          val = '+1'
+        elif state =='success':
+          val = '0'
+        else:
+          val = int(state)#stateMap[event].index(state)
+        ## Fill in the rest of the data as the recursive nature will only
+        ## fill in the details under this branch, later iterations will
+        ## correct lower rows if a path does change
+        X[rowCounter, col] = val
+        for fork in path.getchildren():
+          newCounter = self.constructPointDFS(fork, inputMap, stateMap, outputMap, X, rowCounter)
+          for i in range(newCounter-rowCounter):
+            X[rowCounter+i, col] = val
+          rowCounter = newCounter
+    return rowCounter
diff --git a/src/PostProcessors/FTGate.py b/src/PostProcessors/FTGate.py
new file mode 100644
index 0000000..7199a78
--- /dev/null
+++ b/src/PostProcessors/FTGate.py
@@ -0,0 +1,273 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on April 30, 2018
+
+@author: mandd
+"""
+#Internal Modules---------------------------------------------------------------
+import MessageHandler
+from utils import utils
+from utils import xmlUtils as xmlU
+#Internal Modules End-----------------------------------------------------------
+
+#External Modules---------------------------------------------------------------
+import numpy as np
+import xml.etree.ElementTree as ET
+import copy
+import itertools
+from collections import OrderedDict
+#External Modules End-----------------------------------------------------------
+
+class FTGate(object):
+  """
+    This is the base class for all possible Boolean logic gates to be employed in Fault-Trees
+  """
+  def __init__(self, xmlNode):
+    """
+      Method that initializes the gate
+      @ In, xmlNode, xml.etree.Element, Xml element node
+      @ Out, None
+    """
+    self.name         = None # Specific ID of the gate
+    self.gate         = None # Type of logic gate (see self.allowedGates for a loist of allowed gate types)
+    self.arguments    = [] # input elements of the gate
+    self.negations    = [] # input elements of the gate that are negated
+    self.params       = {} # specific paramteres of the gate
+    self.allowedGates = {'not':1,'and':'inf','or':'inf','xor':'inf','iff':2,'nand':'inf','nor':'inf','atleast':'inf','cardinality':'inf','imply':2}
+
+    self.name = xmlNode.get('name')
+
+    for child in xmlNode:
+      if child.attrib:
+        self.params = child.attrib
+      if child.tag in self.allowedGates.keys():
+        self.gate = child.tag
+      else:
+        raise IOError('FTImporterPostProcessor Post-Processor; gate ' + str(child.tag) + ' : is not recognized. Allowed gates are: '+ str(self.allowedGates.keys()))
+
+    for node in xmlU.findAllRecursive(xmlNode, 'gate'):
+      self.arguments.append(node.get('name'))
+
+    for node in xmlU.findAllRecursive(xmlNode, 'basic-event'):
+      self.arguments.append(node.get('name'))
+
+    for node in xmlU.findAllRecursive(xmlNode, 'house-event'):
+      self.arguments.append(node.get('name'))
+
+    for child in xmlNode:
+      for childChild in child:
+        if childChild.tag == 'not':
+          event = list(childChild.iter())
+          if len(event)>2:
+            raise IOError('FTImporterPostProcessor Post-Processor; gate ' + str(self.name) + ' contains a negations of multiple basic events')
+          elif event[1].tag in ['gate','basic-event','house-event']:
+            self.negations.append(event[1].get('name'))
+
+    if self.gate in ['iff'] and len(self.arguments)>self.allowedGates['iff']:
+      raise IOError('FTImporterPostProcessor Post-Processor; iff gate ' + str(self.name) + ' has more than 2 events')
+    if self.gate in ['imply'] and len(self.arguments)>self.allowedGates['imply']:
+      raise IOError('FTImporterPostProcessor Post-Processor; imply gate ' + str(self.name) + ' has more than 2 events')
+
+  def returnArguments(self):
+    """
+      Method that returns the arguments of the gate
+      @ In, None
+      @ Out, self.arguments, list, list that contains the arguments of the gate
+    """
+    return self.arguments
+
+  def evaluate(self,argValues):
+    """
+      Method that evaluates the gate
+      @ In, argValues, dict, dictionary containing all available variables
+      @ Out, outcome, float, calculated outcome of the gate
+    """
+    argumentValues = copy.deepcopy(argValues)
+    for key in self.negations:
+      if argumentValues[key]==1:
+        argumentValues[key]=0
+      else:
+        argumentValues[key]=1
+    if set(self.arguments) <= set(argumentValues.keys()):
+      argumentsToPass = OrderedDict()
+      for arg in self.arguments:
+        argumentsToPass[arg] = argumentValues[arg]
+      outcome = self.evaluateGate(argumentsToPass)
+      return outcome
+    else:
+      raise IOError('FTImporterPostProcessor Post-Processor; gate ' + str(self.name) + ' can receive these arguments ' + str(self.arguments) + ' but the following were passed ' + str(argumentValues.keys()) )
+
+  def evaluateGate(self,argumentValues):
+    """
+      Method that evaluates the gate.
+      Note that argumentValues is passed directly (instead of argumentValues.values()) in case of the imply gate since the events IDs are important
+      @ In, argumentValues, OrderedDict, dictionary containing only the variables of interest to the gate
+      @ Out, outcome, float, calculated outcome of the gate
+    """
+    if self.gate == 'and':
+      outcome = andGate(list(argumentValues.values()))
+    elif self.gate == 'or':
+      outcome = orGate(list(argumentValues.values()))
+    elif self.gate == 'nor':
+      outcome = norGate(list(argumentValues.values()))
+    elif self.gate == 'nand':
+      outcome = nandGate(list(argumentValues.values()))
+    elif self.gate == 'xor':
+      outcome = xorGate(list(argumentValues.values()))
+    elif self.gate == 'iff':
+      outcome = iffGate(list(argumentValues.values()))
+    elif self.gate == 'atleast':
+      outcome = atLeastGate(list(argumentValues.values()),float(self.params['min']))
+    elif self.gate == 'cardinality':
+      outcome = cardinalityGate(list(argumentValues.values()),float(self.params['min']),float(self.params['max']))
+    elif self.gate == 'imply':
+      outcome = implyGate(argumentValues)
+    elif self.gate == 'not':
+      outcome = notGate(list(argumentValues.values()))
+    return outcome
+
+def notGate(value):
+  """
+    Method that evaluates the NOT gate
+    @ In, value, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  if len(value)>1:
+    raise IOError('NOT gate has received in input ' + str(len(value)) + ' values instead of 1.')
+  if value[0]==0:
+    outcome = 1
+  else:
+    outcome = 0
+  return outcome
+
+def andGate(argumentValues):
+  """
+    Method that evaluates the AND gate
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  if 0 in argumentValues:
+    outcome = 0
+  else:
+    outcome = 1
+  return outcome
+
+def orGate(argumentValues):
+  """
+    Method that evaluates the OR gate
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  if 1 in argumentValues:
+    outcome = 1
+  else:
+    outcome = 0
+  return outcome
+
+def nandGate(argumentValues):
+  """
+    Method that evaluates the NAND gate
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  out = []
+  out.append(andGate(argumentValues))
+  outcome = notGate(out)
+  return outcome
+
+def norGate(argumentValues):
+  """
+    Method that evaluates the NOR gate
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  out = []
+  out.append(orGate(argumentValues))
+  outcome = notGate(out)
+  return outcome
+
+def xorGate(argumentValues):
+  """
+    Method that evaluates the XOR gate
+    The XOR gate gives a true (1 or HIGH) output when the number of true inputs is odd.
+    https://electronics.stackexchange.com/questions/93713/how-is-an-xor-with-more-than-2-inputs-supposed-to-work
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  if argumentValues.count(1.) % 2 != 0:
+    outcome = 1
+  else:
+    outcome = 0
+  return outcome
+
+def iffGate(argumentValues):
+  """
+    Method that evaluates the IFF gate
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  out = []
+  out.append(xorGate(argumentValues))
+  outcome = notGate(out)
+  return outcome
+
+def implyGate(argumentValues):
+  """
+    Method that evaluates the IMPLY gate
+    Note that this gate requires a specific definition of the two inputs. This definition is specifed in the order of the events provided in the input file
+    As an example, BE1->BE2 is translated as:
+      <define-gate name="TOP">
+          <imply>
+              <basic-event name="BE1"/>
+              <basic-event name="BE2"/>
+          </imply>
+      </define-gate>
+    @ In, argumentValues, list, list of values
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  keys = list(argumentValues.keys())
+  if argumentValues[keys[0]]==1 and argumentValues[keys[1]]==0:
+    outcome = 0
+  else:
+    outcome = 1
+  return outcome
+
+def atLeastGate(argumentValues,k):
+  """
+    Method that evaluates the ATLEAST gate
+    @ In, argumentValues, list, list of values
+    @ In, k, float, max number of allowed events
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  if argumentValues.count(1) >= k:
+    outcome = 1
+  else:
+    outcome = 0
+  return outcome
+
+def cardinalityGate(argumentValues,l,h):
+  """
+    Method that evaluates the CARDINALITY gate
+    @ In, argumentValues, list, list of values
+    @ In, l, float, min number of allowed events
+    @ In, h, float, max number of allowed events
+    @ Out, outcome, float, calculated outcome of the gate
+  """
+  nOcc = argumentValues.count(1)
+  if nOcc >= l and nOcc <= h:
+    outcome = 1
+  else:
+    outcome = 0
+  return outcome
diff --git a/src/PostProcessors/FTImporter.py b/src/PostProcessors/FTImporter.py
new file mode 100644
index 0000000..edd8c4a
--- /dev/null
+++ b/src/PostProcessors/FTImporter.py
@@ -0,0 +1,85 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on Dec 21, 2017
+
+@author: mandd
+"""
+#Internal Modules---------------------------------------------------------------
+from utils import InputData, InputTypes
+from PluginBaseClasses.PostProcessorPluginBase import PostProcessorPluginBase
+from .FTStructure import FTStructure
+#Internal Modules End-----------------------------------------------------------
+
+class FTImporter(PostProcessorPluginBase):
+  """
+    This is the base class of the postprocessor that imports Fault-Trees (FTs) into RAVEN as a PointSet
+  """
+  @classmethod
+  def getInputSpecification(cls):
+    """
+      Method to get a reference to a class that specifies the input data for
+      class cls.
+      @ In, cls, the class for which we are retrieving the specification
+      @ Out, inputSpecification, InputData.ParameterInput, class to use for
+        specifying input of cls.
+    """
+    inputSpecification = super().getInputSpecification()
+    fileAllowedFormats = InputTypes.makeEnumType("FTFileFormat", "FTFileFormatType", ["OpenPSA"])
+    inputSpecification.addSub(InputData.parameterInputFactory("fileFormat", contentType=fileAllowedFormats))
+    inputSpecification.addSub(InputData.parameterInputFactory("topEventID", contentType=InputTypes.StringType))
+    return inputSpecification
+
+  def __init__(self):
+    """
+      Constructor
+      @ In, None
+      @ Out, None
+    """
+    super().__init__()
+    self.printTag = 'POSTPROCESSOR FT IMPORTER'
+    self.FTFormat = None # chosen format of the FT file
+    self.topEventID = None
+    self.validDataType = ['PointSet'] # The list of accepted types of DataObject
+    ## Currently, we have used both DataObject.addRealization and DataObject.load to
+    ## collect the PostProcessor returned outputs. DataObject.addRealization is used to
+    ## collect single realization, while DataObject.load is used to collect multiple realizations
+    ## However, the DataObject.load can not be directly used to collect single realization
+    self.outputMultipleRealizations = True
+
+  def _handleInput(self, paramInput):
+    """
+      Method that handles PostProcessor parameter input block.
+      @ In, paramInput, ParameterInput, the already parsed input.
+      @ Out, None
+    """
+    super()._handleInput(paramInput)
+    fileFormat = paramInput.findFirst('fileFormat')
+    self.fileFormat = fileFormat.value
+    topEventID = paramInput.findFirst('topEventID')
+    self.topEventID = topEventID.value
+
+  def run(self, inputIn):
+    """
+      This method executes the postprocessor action.
+      @ In,  inputIn, dict, dictionary contains the input data and input files, i.e.,
+          {'Data':[DataObjects.asDataset('dict')], 'Files':[FileObject]}, only 'Files'
+          will be used by this PostProcessor
+      @ Out, outputDict, dict, dictionary of outputs, i.e.,
+          {'data':dict of realizations, 'dim':{varName:independent dimensions that the variable depends on}}
+    """
+    faultTreeModel = FTStructure(inputIn['Files'], self.topEventID)
+    outputDict = faultTreeModel.returnDict()
+    outputDict = {'data': outputDict, 'dims':{}}
+    return outputDict
diff --git a/src/PostProcessors/FTStructure.py b/src/PostProcessors/FTStructure.py
new file mode 100644
index 0000000..5272229
--- /dev/null
+++ b/src/PostProcessors/FTStructure.py
@@ -0,0 +1,136 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on April 30, 2018
+
+@author: mandd
+"""
+import numpy as np
+import xml.etree.ElementTree as ET
+import copy
+import itertools
+
+from .FTGate import FTGate
+from utils import xmlUtils as xmlU
+
+class FTStructure(object):
+  """
+    This is the base class of the FT structure which actually handles FT structures which is used by the FTimporter and the FTmodel
+  """
+  def __init__(self, inputs, topEventID):
+    """
+      This method executes the postprocessor action.
+      @ In,  inputs, list, list of file objects
+      @ Out, outcome, dict, dict containing the processed FT
+    """
+    self.basicEvents = [] # List of Basic events of the FT
+    self.houseEvents = {} # List of House events of the FT
+    self.gateList    = {} # Dict of Gates of the FT
+    self.gateID      = [] # list of Gates name
+    self.topEventID  = topEventID # ID of the FT output
+
+    for fileID in inputs:
+      faultTree = ET.parse(fileID.getPath() + fileID.getFilename())
+      faultTree = xmlU.findAllRecursive(faultTree,'opsa-mef')
+
+      for gate in xmlU.findAllRecursive(faultTree[0], 'define-gate'):
+        ftGate = FTGate(gate)
+        self.gateList[gate.get('name')] = ftGate
+        self.gateID.append(gate.get('name'))
+
+      for basicEvent in xmlU.findAllRecursive(faultTree[0], 'basic-event'):
+        self.basicEvents.append(basicEvent.get('name'))
+
+      for houseEvent in xmlU.findAllRecursive(faultTree[0], 'define-house-event'):
+        value = houseEvent.find('constant').get('value')
+        if value in ['True','true']:
+          value = 1.
+        elif value in ['False','false']:
+          value = 0.
+        else:
+          raise IOError('FTImporterPostProcessor Post-Processor ' + self.name + ': house event ' + str(basicEvent.get('name')) + ' has a not boolean value (True or False)')
+        self.houseEvents[houseEvent.get('name')] = value
+
+    if not self.topEventID in self.gateID:
+      raise IOError('FTImporterPostProcessor: specified top event ' + str(self.topEventID) + ' is not contained in the fault-tree; available gates are: ' + str(self.gateID))
+
+  def returnDict(self):
+    """
+      This method calculates all possible input combinations and the corresponding output values
+      @ In,  None
+      @ Out, outcome, dict, dictionary containing
+    """
+    self.FTsolver()
+    outcome = self.constructData()
+    return outcome
+
+  def FTsolver(self):
+    """
+      This method determines the ordered sequence of gates to compute in order to solve the full FT.
+      The determined ordered sequence is stored in self.gateSequence.
+      @ In,  None
+      @ Out, None
+    """
+    self.gateSequence = []
+    availBasicEvents = copy.deepcopy(self.basicEvents)
+    availBasicEvents = availBasicEvents + list(self.houseEvents.keys())
+    counter = 0
+    while True:
+      complete=False
+      for gate in self.gateList.keys():
+        if set(self.gateList[gate].returnArguments()) <= set(availBasicEvents):
+          self.gateSequence.append(gate)
+          availBasicEvents.append(gate)
+        if set(availBasicEvents) == set(itertools.chain(self.basicEvents,self.gateID,self.houseEvents.keys())):
+          complete=True
+          break
+        if counter > len(self.gateList.keys()):
+          raise IOError('FTImporterPostProcessor Post-Processor ' + self.name + ': the provided FT cannot be computed')
+        counter += 1
+      if complete:
+        break
+
+  def evaluateFT(self,combination):
+    """
+      This method determines the outcome of the FT given a set of basic-event values
+      @ In,  combination, dict, dictionary containing values for all basic-events
+      @ Out, values, dict, dictionary containing calculated values for all gates
+    """
+    values = {}
+    for gate in self.gateSequence:
+      values[gate] = self.gateList[gate].evaluate(combination)
+      combination[gate] = values[gate]
+    return values
+
+  def constructData(self):
+    """
+      This method determines the outcome of the FT given a set of basic-event values
+      @ In,  None
+      @ Out, outcome, dict, dictionary containing calculated values for all basic-events and the Top-event
+    """
+    combinations = list(itertools.product([0,1],repeat=len(self.basicEvents)))
+    outcome={}
+    outcome={key:np.zeros(len(combinations)) for key in self.basicEvents}
+    outcome[self.topEventID] = np.zeros(len(combinations))
+    for index,combination in enumerate(combinations):
+      combinationDict = {key: combination[index] for index,key in enumerate(self.basicEvents)}
+      for houseEvent in self.houseEvents.keys():
+        combinationDict[houseEvent] = self.houseEvents[houseEvent]
+      out = self.evaluateFT(combinationDict)
+      for key in self.basicEvents:
+        outcome[key][index]=float(combinationDict[key])
+      outcome[self.topEventID][index] = out[self.topEventID]
+    return outcome
+
+
diff --git a/src/PostProcessors/MCSimporter.py b/src/PostProcessors/MCSimporter.py
new file mode 100644
index 0000000..2975077
--- /dev/null
+++ b/src/PostProcessors/MCSimporter.py
@@ -0,0 +1,166 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on Nov 1, 2019
+
+@author: mandd
+"""
+
+#External Modules---------------------------------------------------------------
+import pandas as pd
+import numpy as np
+#External Modules End-----------------------------------------------------------
+
+#Internal Modules---------------------------------------------------------------
+from PluginBaseClasses.PostProcessorPluginBase import PostProcessorPluginBase
+from utils import InputData, InputTypes
+#Internal Modules End-----------------------------------------------------------
+
+class MCSImporter(PostProcessorPluginBase):
+  """
+    This is the base class of the PostProcessor that imports Minimal Cut Sets (MCSs) into RAVEN as a PointSet
+  """
+  def __init__(self):
+    """
+      Constructor
+      @ In, None
+      @ Out, None
+    """
+    super().__init__()
+    self.printTag  = 'POSTPROCESSOR MCS IMPORTER'
+    self.expand    = None  # option that controls the structure of the ET. If True, the tree is expanded so that
+                           # all possible sequences are generated. Sequence label is maintained according to the
+                           # original tree
+    self.validDataType = ['PointSet'] # The list of accepted types of DataObject
+    ## Currently, we have used both DataObject.addRealization and DataObject.load to
+    ## collect the PostProcessor returned outputs. DataObject.addRealization is used to
+    ## collect single realization, while DataObject.load is used to collect multiple realizations
+    ## However, the DataObject.load can not be directly used to collect single realization
+    self.outputMultipleRealizations = True
+
+  @classmethod
+  def getInputSpecification(cls):
+    """
+      Method to get a reference to a class that specifies the input data for the class cls.
+      @ In, cls, the class for which we are retrieving the specification
+      @ Out, inputSpecification, InputData.ParameterInput, class to use for
+        specifying input of cls.
+    """
+    inputSpecification = super().getInputSpecification()
+    inputSpecification.addSub(InputData.parameterInputFactory("expand",       contentType=InputTypes.BoolType))
+    inputSpecification.addSub(InputData.parameterInputFactory("BElistColumn", contentType=InputTypes.StringType))
+    return inputSpecification
+
+  def _handleInput(self, paramInput):
+    """
+      Method that handles PostProcessor parameter input block.
+      @ In, paramInput, ParameterInput, the already parsed input.
+      @ Out, None
+    """
+    super()._handleInput(paramInput)
+    expand = paramInput.findFirst('expand')
+    self.expand = expand.value
+
+    if self.expand:
+      beListColumn = paramInput.findFirst('BElistColumn')
+      self.beListColumn = beListColumn.value
+
+  def run(self, inputIn):
+    """
+      This method executes the PostProcessor action.
+      @ In,  inputIn, dict, dictionary contains the input data and input files, i.e.,
+          {'Data':[DataObjects.asDataset('dict')], 'Files':[FileObject]}, only 'Files'
+          will be used by this PostProcessor
+      @ Out, mcsPointSet, dict, dictionary of outputs, i.e.,
+          {'data':dict of realizations, 'dim':{}}
+    """
+    inputs = inputIn['Files']
+    mcsFileFound = False
+    beFileFound  = False
+
+    for file in inputs:
+      if file.getType()=="MCSlist":
+        if mcsFileFound:
+          self.raiseAnError(IOError, 'MCSImporterPostProcessor Post-Processor ' + self.name + ', Multiple files with type=MCSlist have been found')
+        else:
+          mcsListFile = file
+          mcsFileFound = True
+      if file.getType()=="BElist":
+        if self.expand==False:
+          self.raiseAnError(IOError, 'MCSImporterPostProcessor Post-Processor ' + self.name + ', A file with type=BElist has been found but expand is set to False')
+        if beFileFound:
+          self.raiseAnError(IOError, 'MCSImporterPostProcessor Post-Processor ' + self.name + ', Multiple files with type=BElist have been found')
+        else:
+          BElistFile = file
+          beFileFound  = True
+
+    if beFileFound==False and self.expand==True:
+      self.raiseAnError(IOError, 'MCSImporterPostProcessor Post-Processor ' + self.name + ', Expand is set to False but no file with type=BElist has been found')
+
+    self.mcsIDs, self.probability, self.mcsList, self.beList = mcsReader(mcsListFile)
+
+    if self.expand:
+      beData = pd.read_csv(BElistFile.getFilename())
+      self.beList = beData[self.beListColumn].values.tolist()
+
+    mcsPointSet = {}
+
+    # MCS Input variables
+    mcsPointSet['probability'] = self.probability
+    mcsPointSet['MCS_ID']      = self.mcsIDs
+    mcsPointSet['out']         = np.ones((self.probability.size))
+
+    # MCS Output variables
+    for be in self.beList:
+      mcsPointSet[be]= np.zeros(self.probability.size)
+    counter=0
+    for mcs in self.mcsList:
+      for be in mcs:
+        mcsPointSet[be][counter] = 1.0
+      counter = counter+1
+    mcsPointSet = {'data': mcsPointSet, 'dims': {}}
+    return mcsPointSet
+
+def mcsReader(mcsListFile):
+  """
+    Function designed to read a file containing the set of MCSs and to save it as list of list
+    @ In, mcsListFile, string, name of the file containing the set of MCSs
+    @ Out, mcsIDs, np array, array containing the ID associated to each MCS
+    @ Out, probability, np array, array containing the probability associated to each MCS
+    @ Out, mcsList, list, list of MCS, each element is also a list containing the basic events of each MCS
+    @ Out, beList, list, list of all basic events contained in the MCSs
+  """
+  mcsList=[]
+  beList=set()
+  probability = np.zeros((0))
+  mcsIDs = np.zeros((0))
+
+  # construct the list of MCSs and the list of BE
+  with open(mcsListFile.getFilename(), 'r') as file:
+    next(file) # skip header
+    lines = file.read().splitlines()
+    for l in lines:
+      elementsList = l.split(',')
+
+      mcsIDs = np.append(mcsIDs,elementsList[0])
+      elementsList.pop(0)
+
+      probability=np.append(probability,elementsList[0])
+      elementsList.pop(0)
+
+      mcsList.append(list(element.rstrip('\n') for element in elementsList))
+
+      beList.update(elementsList)
+
+  return mcsIDs, probability, mcsList, beList
diff --git a/src/PostProcessors/RiskMeasuresDiscrete.py b/src/PostProcessors/RiskMeasuresDiscrete.py
new file mode 100644
index 0000000..4ded4c0
--- /dev/null
+++ b/src/PostProcessors/RiskMeasuresDiscrete.py
@@ -0,0 +1,424 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""
+Created on November 2016
+
+@author: mandd
+"""
+#External Modules------------------------------------------------------------------------------------
+import numpy as np
+import copy
+#External Modules End--------------------------------------------------------------------------------
+
+from utils import InputData, InputTypes
+from PluginBaseClasses.PostProcessorPluginBase import PostProcessorPluginBase
+
+class RiskMeasuresDiscrete(PostProcessorPluginBase):
+  """
+    This class implements the four basic risk-importance measures
+    This class inherits form the base class PostProcessorInterfaceBase and it contains three methods:
+      - initialize
+      - run
+  """
+  _availableMeasures = set(['B','FV','RAW','RRW','R0'])
+
+  @classmethod
+  def getInputSpecification(cls):
+    """
+      Method to get a reference to a class that specifies the input data for
+      class cls.
+      @ In, cls, the class for which we are retrieving the specification
+      @ Out, inputSpecification, InputData.ParameterInput, class to use for
+        specifying input of cls.
+    """
+    inputSpecification = super().getInputSpecification()
+    inputSpecification.addSubSimple("measures", InputTypes.StringListType)
+    variableSub = InputData.parameterInputFactory("variable", contentType=InputTypes.StringType)
+    variableSub.addParam("R0values", InputTypes.FloatListType)
+    variableSub.addParam("R1values", InputTypes.FloatListType)
+    inputSpecification.addSub(variableSub)
+    targetSub = InputData.parameterInputFactory("target", contentType=InputTypes.StringType)
+    targetSub.addParam("values", InputTypes.FloatListType)
+    inputSpecification.addSub(targetSub)
+    dataSub = InputData.parameterInputFactory("data")
+    dataSub.addParam("freq", InputTypes.FloatType)
+    inputSpecification.addSub(dataSub)
+    inputSpecification.addSubSimple("temporalID", InputTypes.StringType)
+    return inputSpecification
+
+  def __init__(self):
+    """
+      Constructor
+      @ In, None
+      @ Out, None
+    """
+    super().__init__()
+    self.validDataType = ['PointSet','HistorySet'] # The list of accepted types of DataObject
+    ## Currently, we have used both DataObject.addRealization and DataObject.load to
+    ## collect the PostProcessor returned outputs. DataObject.addRealization is used to
+    ## collect single realization, while DataObject.load is used to collect multiple realizations
+    ## However, the DataObject.load can not be directly used to collect single realization
+    ## One possible solution is all postpocessors return a list of realizations, and we only
+    ## use addRealization method to add the collections into the DataObjects
+    self.outputMultipleRealizations = True
+
+  def availableMeasures(cls):
+    """
+      A class level constant that tells developers what measures are available from this class
+      @ In, cls, the RiskMeasureDiscrete class of which this object will be a type
+    """
+    return cls._availableMeasures
+
+  def _handleInput(self, paramInput):
+    """
+      Function to handle the parameter input.
+      @ In, paramInput, ParameterInput, the already parsed input.
+      @ Out, None
+    """
+    super()._handleInput(paramInput)
+    self.variables = {}
+    self.target    = {}
+    self.IEData = {}
+    self.temporalID = None
+    for child in paramInput.subparts:
+      if child.getName() == 'measures':
+        self.measures = set(child.value)
+
+        if not self.measures.issubset(self.availableMeasures()):
+          unrecognizedMeasures  = self.measures.difference(self.availableMeasures())
+          self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) + ' : measures '
+                            + str(list(unrecognizedMeasures)) + ' are not recognized')
+
+      elif child.getName() == 'variable':
+        variableID = child.value
+        self.variables[variableID] = {}
+        if 'R0values' in child.parameterValues:
+          values = child.parameterValues['R0values']
+          if len(values) != 2:
+            self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                              ' : attribute node R0 for XML node: ' + str(child) + ' has one or more than two values')
+          try:
+            val1 = values[0]
+            val2 = values[1]
+          except:
+            self.raiseAnError(IOError,' Wrong R0values associated to RiskMeasuresDiscrete Post-Processor')
+          self.variables[variableID]['R0low']  = min(val1,val2)
+          self.variables[variableID]['R0high'] = max(val1,val2)
+        else:
+          self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                            ' : attribute node R0 is not present for XML node: ' + str(child) )
+        if 'R1values' in child.parameterValues:
+          values = child.parameterValues['R1values']
+          if len(values)>2:
+            self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                              ' : attribute node R1 for XML node: ' + str(child) + ' has more than two values')
+          try:
+            val1 = values[0]
+            val2 = values[1]
+          except:
+            self.raiseAnError(IOError,' Wrong R1values associated to RiskMeasuresDiscrete Post-Processor')
+          self.variables[variableID]['R1low']  = min(val1,val2)
+          self.variables[variableID]['R1high'] = max(val1,val2)
+        else:
+          self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                            ' : attribute node R1 is not present for XML node: ' + str(child) )
+
+      elif child.getName() == 'target':
+        self.target['targetID'] = child.value
+        if 'values' in child.parameterValues:
+          values = child.parameterValues['values']
+          if len(values) != 2:
+            self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                              ' : attribute node values for XML node: ' + str(child) + ' has one or more than two values')
+          try:
+            val1 = values[0]
+            val2 = values[1]
+          except:
+            self.raiseAnError(IOError,' Wrong target values associated to RiskMeasuresDiscrete Post-Processor')
+          self.target['low']  = min(val1,val2)
+          self.target['high'] = max(val1,val2)
+        else:
+          self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                            ' : attribute node values is not present for XML node: ' + str(child) )
+
+      elif child.getName() == 'data':
+        self.IEData[child.value] = child.parameterValues['freq']
+
+      elif child.getName() == 'temporalID':
+        self.temporalID = child.value
+
+  def run(self,inputIn):
+    """
+     This method perform the actual calculation of the risk measures
+      @ In,  inputIn, dict, dictionary contains the input data and input files, i.e.,
+          {'Data':[DataObjects.asDataset('dict')], 'Files':[FileObject]}, only 'Data'
+          will be used by this PostProcessor
+      @ Out, outputDic, dict, dictionary which contains the risk measures, i.e.,
+          {'data':dict of realizations, 'dim':{varName:independent dimensions that the variable depends on}}
+    """
+    # Check how many HistorySets (checkHSs) have been provided
+    inputDic = inputIn['Data']
+    checkHSs=0
+    for inp in inputDic:
+      _, _, inpDs = inp
+      if inpDs['type'] == 'HistorySet':
+        timeDepData = copy.deepcopy(inpDs)
+        inputDic.remove(inp)
+        checkHSs +=1
+
+    if checkHSs == 0:
+      # if no HistorySet has been provided run the static form of this PP
+      outputDic = self.runStatic(inputDic)
+      outputDic['dims'] = {}
+      for key in outputDic['data'].keys():
+        outputDic['dims'][key] = []
+    elif checkHSs == 1:
+       # if one HistorySet has been provided run the dynamic form of this PP
+      self.outputFormat = 'HistorySet'
+      outputDic = self.runDynamic(inputDic,timeDepData)
+      outputDic['dims'] = {}
+      for key in outputDic['data'].keys():
+        outputDic['dims'][key] = [self.temporalID]
+      for var in timeDepData['data'].keys():
+        if var != self.temporalID:
+          ## Are there any values in timeDepData['data']['output'][1][var] that are not 0 or 1?
+          if len(np.setdiff1d(timeDepData['data'][var][0], [0,1])):
+            self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                              ' : the provided HistorySet contains the variable ' + str(var) + ' which has elements different than 0 or 1')
+      outputDic['data'][self.temporalID] = np.zeros(1, dtype=object)
+      outputDic['data'][self.temporalID][0] = copy.deepcopy(timeDepData['data'][self.temporalID][0])
+
+      for var in timeDepData['inpVars']:
+        outputDic['data'][var] = copy.deepcopy(timeDepData['data'][var])
+    else: # checkHSs >= 2:
+      # only one HistorySet should be provided
+      self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                        ' : more than one HistorySet has been provided')
+
+    # replicate metadata
+    # add meta variables back
+    for inp in inputDic:
+      for key in inp[-1]['metaKeys']:
+        outputDic['data'][key] = np.asanyarray(1.0)
+
+    return outputDic
+
+  def runStatic(self,inputDic, componentConfig=None):
+    """
+     This method perform the static calculation of the risk measures
+     @ In, inputDic, list, list of dictionaries which contains the data inside the input DataObjects
+     @ In, componentConfig, dict, dictionary containing the boolean status (0 or 1) of a sub set of the input variables
+     @ Out, outputDic, dict, dictionary which contains the risk measures
+    """
+    if self.temporalID is not None and componentConfig is None:
+      self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor ' + str(self.name) +
+                        ' : a temporalID variable is specified but an HistorySet is not provided')
+
+    riskImportanceMeasures = {}
+    for variable in self.variables:
+      macroR0     = 0
+      macroRMinus = 0
+      macroRPlus  = 0
+
+      r0Low  = self.variables[variable]['R0low']
+      r0High = self.variables[variable]['R0high']
+      r1Low  = self.variables[variable]['R1low']
+      r1High = self.variables[variable]['R1high']
+
+      for inpInfo in inputDic:
+        _, _, inp = inpInfo
+        ## Get everything out of the inputDic at the outset, the hope is to have no string literals on the interior
+        ## of this function.
+        if componentConfig is None:
+          inputName     = inp['name']
+          inputDataIn   = {key: inp['data'][key] for key in inp['inpVars']}
+          inputDataOut  = {key: inp['data'][key] for key in inp['outVars']}
+          targetVar     = np.asarray(inp['data'][self.target['targetID']])
+          inputMetadata = {}
+          inputMetadata['ProbabilityWeight'] = inp['data']['ProbabilityWeight']
+        else:
+          # if componentConfig is provided, then only a subset of the original data must be considered
+          # only the data points that contains componentConfig are in fact considered
+          # indexUpdatedData contains the indexes of those data points
+          indexUpdatedData = None
+
+          for var in componentConfig.keys():
+            if componentConfig[var] == 0:
+              inputVar = np.asarray(inp['data'][var])
+              indexCompOut = np.where(inputVar==1)
+              if indexUpdatedData is None:
+                indexUpdatedData = copy.deepcopy(indexCompOut)
+              else:
+                indexUpdatedData = np.intersect1d(indexUpdatedData,indexCompOut)
+
+          if indexUpdatedData is not None:
+            inputName    = inp['name']
+            inputDataIn  = {}
+            inputDataOut = {}
+            for var in inp['inpVars']:
+              inputDataIn[var]  = inp['data'][var][indexUpdatedData]
+            for var in inp['outVars']:
+              inputDataOut[var] = inp['data'][var][indexUpdatedData]
+            targetVar = np.asarray(inputDataOut[self.target['targetID']])
+            inputMetadata = {}
+            inputMetadata['ProbabilityWeight'] = inp['data']['ProbabilityWeight'][indexUpdatedData]
+          else:
+            inputName     = inp['name']
+            inputDataIn   = {key: inp['data'][key] for key in inp['inpVars']} #inp['data']['input']
+            inputDataOut  = {key: inp['data'][key] for key in inp['outVars']} #inp['data']['output']
+            targetVar     = np.asarray(inputDataOut[self.target['targetID']])
+            inputMetadata = {}
+            inputMetadata['ProbabilityWeight'] = inp['data']['ProbabilityWeight']
+
+        if inputMetadata is not None and 'ProbabilityWeight' in inputMetadata:
+          inputWeights = copy.deepcopy(inputMetadata['ProbabilityWeight'])
+          pbWeights = inputWeights/np.sum(inputWeights)
+        else:
+          ## Any variable will do, so just count the first input. We could also have count the outputs, but this could
+          ## be tricky if the data is a HistorySet and thus multidimensional.
+          pointCount = inp['numberRealizations']
+          pbWeights  = np.ones(pointCount)/float(pointCount)
+
+        if inputName in self.IEData.keys():
+          multiplier = self.IEData[inputName]
+        else:
+          multiplier = 1.0
+          self.raiseAWarning('RiskMeasuresDiscrete Interfaced Post-Processor: the dataObject '
+                             + str (inputName) + ' does not have the frequency of the IE specified. It is assumed that the frequency of the IE is 1.0')
+
+        ## Calculate R0, RMinus, RPlus
+
+        ## Step 1: Retrieve points that contain system failure
+        indexSystemFailure = np.where(np.logical_and(targetVar >= self.target['low'], targetVar <= self.target['high']))[0]
+
+        if variable in inputDataIn.keys():
+          inputVar = np.asarray(inputDataIn[variable])
+
+          ## Step 2: Retrieve points from original dataset that contain component reliability values equal to 1
+          ##         (indexComponentMinus) and 0 (indexComponentPlus)
+          indexComponentMinus = np.where(np.logical_and(inputVar >= r1Low, inputVar <= r1High))[0]
+          indexComponentPlus  = np.where(np.logical_and(inputVar >= r0Low, inputVar <= r0High))[0]
+
+          ## Step 3: Retrieve points from Step 1 that contain component reliability values equal to 1
+          ##         (indexFailureMinus) and 0 (indexFailurePlus)
+          indexFailureMinus = np.intersect1d(indexSystemFailure,indexComponentMinus)
+          indexFailurePlus  = np.intersect1d(indexSystemFailure,indexComponentPlus)
+
+          ## Step 4: Sum pb weights for the subsets retrieved in Steps 1, 2, and 3
+          if componentConfig is None or variable not in componentConfig.keys():
+            # Coordinate BE2
+            ## R0 = pb of system failure
+            R0     = np.sum(pbWeights[indexSystemFailure])
+            RMinus = np.sum(pbWeights[indexFailureMinus]) / np.sum(pbWeights[indexComponentMinus])
+            RPlus  = np.sum(pbWeights[indexFailurePlus]) / np.sum(pbWeights[indexComponentPlus])
+          else:
+            # Coordinate BE3
+            R0 = np.sum(pbWeights[indexSystemFailure])
+            if   componentConfig[variable] == 0:
+              RMinus = RPlus = np.sum(pbWeights[indexFailurePlus]) / np.sum(pbWeights[indexComponentPlus])
+            elif componentConfig[variable] == 1:
+              if indexFailureMinus.size:
+                RMinus = np.sum(pbWeights[indexFailureMinus]) / np.sum(pbWeights[indexComponentMinus])
+              else:
+                RMinus = R0
+              if indexComponentPlus.size:
+                RPlus  = np.sum(pbWeights[indexFailurePlus]) / np.sum(pbWeights[indexComponentPlus])
+              else:
+                RPlus = R0
+        else:
+          # Coordinate BE1
+          R0 = RMinus = RPlus = np.sum(pbWeights[indexSystemFailure])
+
+        macroR0     += multiplier * R0
+        macroRMinus += multiplier * RMinus
+        macroRPlus  += multiplier * RPlus
+
+      if 'RRW' in self.measures:
+        RRW = riskImportanceMeasures[variable + '_RRW'] = np.asanyarray([macroR0/macroRMinus])
+        self.raiseADebug(str(variable) + ' RRW = ' + str(RRW))
+
+      if 'RAW' in self.measures:
+        RAW = riskImportanceMeasures[variable + '_RAW'] = np.asanyarray([macroRPlus/macroR0])
+        self.raiseADebug(str(variable) + ' RAW = ' + str(RAW))
+
+      if 'FV' in self.measures:
+        FV = riskImportanceMeasures[variable + '_FV']  = np.asanyarray([(macroR0-macroRMinus)/macroR0])
+        self.raiseADebug( str(variable) + ' FV = ' + str(FV))
+
+      if 'B' in self.measures:
+        B = riskImportanceMeasures[variable + '_B']   = np.asanyarray([macroRPlus-macroRMinus])
+        self.raiseADebug(str(variable) + ' B  = ' + str(B))
+
+      if 'R0' in self.measures:
+        riskImportanceMeasures['R0']   = np.asanyarray([macroR0])
+        self.raiseADebug(' R0  = ' + str(macroR0))
+
+    outputDic = {'data': riskImportanceMeasures}
+
+    ## If for whatever reason passing an empty input back causes errors, then you may want to add some sort of dummy
+    ## value.
+    # outputDic['data']['input'] = {} # {'dummy' : np.asanyarray(0)}
+
+    return outputDic
+
+  def runDynamic(self,inputDic,timeHistory):
+    """
+     This method performs the dynamic calculation of the risk measures
+     FIXME - Note for new development: clean this part so that the [0] index is removed from the timeHistory
+     RECALL - The gold files for this PP are theoretical values and hence they should be part of the analytical tests
+     @ In, inputDic, list, list of dictionaries which contains the data inside the input DataObjects
+     @ In, timeHistory, dict, dictionary containing  boolean temporal profiles (0 or 1) of a sub set of the input variables. Note that this
+                              history must contain a single history
+     @ Out, outputDic, dict, dictionary which contains the risk measures
+    """
+    # timeHistory format values:
+    # - 0 component is disconnected
+    # - 1 component is connected
+
+    if self.temporalID is None:
+      self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor: an HistorySet is provided but no temporalID variable is specified')
+
+    if self.temporalID not in timeHistory['data'].keys():
+      self.raiseAnError(IOError, 'RiskMeasuresDiscrete Interfaced Post-Processor: the specified temporalID variable '
+                        + str(self.temporalID) + ' is not part of the HistorySet variables')
+
+    outputDic = {}
+    outputDic['data'] = {}
+
+    for measure in self.measures:
+      if measure=='R0':
+        outputDic['data'][measure] = np.zeros(1, dtype=object)
+        outputDic['data'][measure][0] = np.zeros(len(timeHistory['data'][self.temporalID][0]))
+      else:
+        for var in self.variables:
+          outputDic['data'][var + '_' + measure]    = np.zeros(1, dtype=object)
+          outputDic['data'][var + '_' + measure][0] = np.zeros(len(timeHistory['data'][self.temporalID][0]))
+
+    previousSystemConfig = {}
+    for index,value in enumerate(timeHistory['data'][self.temporalID][0]):
+      systemConfig={}
+      # Retrieve the system configuration at time instant "index"
+      for var in timeHistory['outVars']:
+        if var != self.temporalID:
+          systemConfig[var] = timeHistory['data'][var][0][index]
+      # Do not repeat the calculation if the system configuration is identical to the one of previous time instant
+      if systemConfig == previousSystemConfig:
+        for key in outputDic['data'].keys():
+          outputDic['data'][key][0][index] = outputDic['data'][key][0][index-1]
+      else:
+        staticOutputDic = self.runStatic(inputDic,systemConfig)
+        for key in outputDic['data'].keys():
+          outputDic['data'][key][0][index] = staticOutputDic['data'][key][0]
+      previousSystemConfig = copy.deepcopy(systemConfig)
+    return outputDic
diff --git a/src/PostProcessors/__init__.py b/src/PostProcessors/__init__.py
new file mode 100644
index 0000000..4778d50
--- /dev/null
+++ b/src/PostProcessors/__init__.py
@@ -0,0 +1,2 @@
+# Copyright 2020, Battelle Energy Alliance, LLC
+# ALL RIGHTS RESERVED


Test patch:
diff --git a/tests/PostProcessors/DataClassifier/dataClassifier/THmodel.py b/tests/PostProcessors/DataClassifier/dataClassifier/THmodel.py
new file mode 100644
index 0000000..9626190
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifier/THmodel.py
@@ -0,0 +1,51 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import numpy as np
+
+def run(self,Input):
+  """
+    This method computes the final status of this simplified LB LOCA event
+    @ In, Input, dict, dictionary of inputs from RAVEN
+    @ Out, None
+  """
+  self.ACCstatus = Input['ACC_status'][0]
+  self.timeLPI   = Input['time_LPI'][0]
+  self.timeLPR   = Input['time_LPR'][0]
+
+  timeToCDLPI = 6.
+  timeToCDLPR = 11.
+
+  if self.ACCstatus == 1.:
+    self.out = 1.
+    self.LPI_status = 1.
+    self.LPR_status = 1.
+  else:
+    self.LPIact = self.timeLPI + 1.
+    if self.LPIact > timeToCDLPI:
+      self.out = 1.
+      self.LPI_status = 1.
+      self.LPR_status = 1.
+    else:
+      self.LPI_status = 0.
+      self.LPRact = self.LPIact + self.timeLPR
+      if self.LPRact > timeToCDLPR:
+        self.out = 1.
+        self.LPR_status = 1.
+      else:
+        self.out = 0.
+        self.LPR_status = 0.
+
+
+
diff --git a/tests/PostProcessors/DataClassifier/dataClassifier/eventTree.xml b/tests/PostProcessors/DataClassifier/dataClassifier/eventTree.xml
new file mode 100644
index 0000000..b9c5c08
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifier/eventTree.xml
@@ -0,0 +1,33 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="1"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/DataClassifier/dataClassifier/func_ACC.py b/tests/PostProcessors/DataClassifier/dataClassifier/func_ACC.py
new file mode 100644
index 0000000..6641075
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifier/func_ACC.py
@@ -0,0 +1,21 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+def evaluate(self):
+  """
+    This method returns the variable ACC_status
+    @ In, None
+    @ Out, ACC_status, float, accumulator system status
+  """
+  return self.ACC_status
diff --git a/tests/PostProcessors/DataClassifier/dataClassifier/func_LPI.py b/tests/PostProcessors/DataClassifier/dataClassifier/func_LPI.py
new file mode 100644
index 0000000..8ebeff0
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifier/func_LPI.py
@@ -0,0 +1,21 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+def evaluate(self):
+  """
+    This method returns the variable LPI_status
+    @ In, None
+    @ Out, LPI_status, float, LPI system status
+  """
+  return self.LPI_status
diff --git a/tests/PostProcessors/DataClassifier/dataClassifier/func_LPR.py b/tests/PostProcessors/DataClassifier/dataClassifier/func_LPR.py
new file mode 100644
index 0000000..c5ad4e6
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifier/func_LPR.py
@@ -0,0 +1,21 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+def evaluate(self):
+  """
+    This method returns the variable LPR_status
+    @ In, None
+    @ Out, LPR_status, float, LPR system status
+  """
+  return self.LPR_status
diff --git a/tests/PostProcessors/DataClassifier/dataClassifierHS/THmodelTD.py b/tests/PostProcessors/DataClassifier/dataClassifierHS/THmodelTD.py
new file mode 100644
index 0000000..fc8594a
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifierHS/THmodelTD.py
@@ -0,0 +1,64 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import numpy as np
+
+def run(self,Input):
+  """
+    This method computes the final status of this simplified LB LOCA event in time dependent mode
+    @ In, Input, dict, dictionary of inputs from RAVEN
+    @ Out, None
+  """
+  self.ACC      = Input['ACC_sim']
+  self.time_LPI = Input['time_LPI']
+  self.time_LPR = Input['time_LPR']
+
+  timeToCD_LPI = 6.
+  timeToCD_LPR = 11.
+
+  if self.ACC == 1.:
+    self.time       = np.array([ 0, 1, 2])
+    self.temp       = np.array([10,15,20])
+    self.out        = np.array([0.,0.,1.])
+    self.ACC_status = np.array([0.,1.,1.])
+    self.LPI_status = np.array([0.,0.,0.])
+    self.LPR_status = np.array([0.,0.,0.])
+  else:
+    self.LPI_act = self.time_LPI + 1.
+    if self.LPI_act > timeToCD_LPI:
+      self.time       = np.array([ 0, 1, 2, 3, 4, 5])
+      self.temp       = np.array([10,10,10,10,15,20])
+      self.out        = np.array([0.,0.,0.,0.,0.,1.])
+      self.ACC_status = np.array([0.,0.,0.,0.,0.,0.])
+      self.LPI_status = np.array([0.,0.,0.,0.,0.,1.])
+      self.LPR_status = np.array([0.,0.,0.,0.,0.,0.])
+    else:
+      self.LPR_act = self.LPI_act + self.time_LPR
+      if self.LPR_act > timeToCD_LPR:
+        self.time       = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8])
+        self.temp       = np.array([10,10,10,10,10,10,10,15,20])
+        self.out        = np.array([0.,0.,0.,0.,0.,0.,0.,0.,1.])
+        self.ACC_status = np.array([0.,0.,0.,0.,0.,0.,0.,0.,0.])
+        self.LPI_status = np.array([0.,0.,0.,0.,0.,0.,0.,0.,0.])
+        self.LPR_status = np.array([0.,0.,0.,0.,0.,0.,0.,0.,1.])
+      else:
+        self.time       = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10])
+        self.temp       = np.array([10,10,10,10,10,10,10,10,10,10,10])
+        self.out        = np.array([0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.])
+        self.ACC_status = np.array([0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.])
+        self.LPI_status = np.array([0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.])
+        self.LPR_status = np.array([0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.])
+
+
+
diff --git a/tests/PostProcessors/DataClassifier/dataClassifierHS/eventTree.xml b/tests/PostProcessors/DataClassifier/dataClassifierHS/eventTree.xml
new file mode 100644
index 0000000..b9c5c08
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifierHS/eventTree.xml
@@ -0,0 +1,33 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="1"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/DataClassifier/dataClassifierHS/func_ACC.py b/tests/PostProcessors/DataClassifier/dataClassifierHS/func_ACC.py
new file mode 100644
index 0000000..83477ef
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifierHS/func_ACC.py
@@ -0,0 +1,23 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import numpy as np
+
+def evaluate(self):
+  """
+    This method returns the variable ACC_status
+    @ In, None
+    @ Out, ACC_status, np.array, accumulator system status
+  """
+  return np.amax(self.ACC_status)
diff --git a/tests/PostProcessors/DataClassifier/dataClassifierHS/func_LPI.py b/tests/PostProcessors/DataClassifier/dataClassifierHS/func_LPI.py
new file mode 100644
index 0000000..2c0d38e
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifierHS/func_LPI.py
@@ -0,0 +1,23 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import numpy as np
+
+def evaluate(self):
+  """
+    This method returns the variable LPI_status
+    @ In, None
+    @ Out, LPI_status, np.array, LPI system status
+  """
+  return np.amax(self.LPI_status)
diff --git a/tests/PostProcessors/DataClassifier/dataClassifierHS/func_LPR.py b/tests/PostProcessors/DataClassifier/dataClassifierHS/func_LPR.py
new file mode 100644
index 0000000..c863ea1
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/dataClassifierHS/func_LPR.py
@@ -0,0 +1,23 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import numpy as np
+
+def evaluate(self):
+  """
+    This method returns the variable LPR_status
+    @ In, None
+    @ Out, LPR_status, np.array, LPR system status
+  """
+  return np.amax(self.LPR_status)
diff --git a/tests/PostProcessors/DataClassifier/gold/dataClassifier/Print_ET_PS.csv b/tests/PostProcessors/DataClassifier/gold/dataClassifier/Print_ET_PS.csv
new file mode 100644
index 0000000..df72766
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/gold/dataClassifier/Print_ET_PS.csv
@@ -0,0 +1,9 @@
+ACC,LPR,LPI,sequence
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+0.0,0.0,1.0,2.0
+1.0,0.0,0.0,3.0
+1.0,0.0,1.0,3.0
+0.0,1.0,1.0,2.0
+1.0,1.0,0.0,3.0
+1.0,1.0,1.0,3.0
diff --git a/tests/PostProcessors/DataClassifier/gold/dataClassifier/Print_sim_PS.csv b/tests/PostProcessors/DataClassifier/gold/dataClassifier/Print_sim_PS.csv
new file mode 100644
index 0000000..8f741e7
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/gold/dataClassifier/Print_sim_PS.csv
@@ -0,0 +1,11 @@
+ACC_status,time_LPI,time_LPR,out,LPI_status,LPR_status,sequence
+1.0,3.24346738646,5.15626305329,1.0,1.0,1.0,3.0
+1.0,5.24065913983,6.71959019433,1.0,1.0,1.0,3.0
+1.0,4.05352809614,4.78383580565,1.0,1.0,1.0,3.0
+0.0,1.66579188372,5.16739277245,0.0,0.0,0.0,0.0
+1.0,4.03784456096,5.51446945804,1.0,1.0,1.0,3.0
+1.0,3.81180868986,5.08101624411,1.0,1.0,1.0,3.0
+1.0,4.54265542392,4.90389579323,1.0,1.0,1.0,3.0
+0.0,5.50644105283,6.69722062124,1.0,1.0,1.0,2.0
+1.0,4.18443257172,6.40202427067,1.0,1.0,1.0,3.0
+0.0,4.99714902907,5.0469727304,1.0,0.0,1.0,1.0
diff --git a/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_0.csv b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_0.csv
new file mode 100644
index 0000000..bc1e7c8
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_0.csv
@@ -0,0 +1,4 @@
+time,temp,out,ACC_status,LPI_status,LPR_status,sequence
+0,10.0,0.0,0.0,0.0,0.0,3.0
+1,15.0,0.0,1.0,0.0,0.0,3.0
+2,20.0,1.0,1.0,0.0,0.0,3.0
diff --git a/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_3.csv b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_3.csv
new file mode 100644
index 0000000..bcd32e3
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_3.csv
@@ -0,0 +1,12 @@
+time,temp,out,ACC_status,LPI_status,LPR_status,sequence
+0,10.0,0.0,0.0,0.0,0.0,0.0
+1,10.0,0.0,0.0,0.0,0.0,0.0
+2,10.0,0.0,0.0,0.0,0.0,0.0
+3,10.0,0.0,0.0,0.0,0.0,0.0
+4,10.0,0.0,0.0,0.0,0.0,0.0
+5,10.0,0.0,0.0,0.0,0.0,0.0
+6,10.0,0.0,0.0,0.0,0.0,0.0
+7,10.0,0.0,0.0,0.0,0.0,0.0
+8,10.0,0.0,0.0,0.0,0.0,0.0
+9,10.0,0.0,0.0,0.0,0.0,0.0
+10,10.0,0.0,0.0,0.0,0.0,0.0
diff --git a/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_7.csv b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_7.csv
new file mode 100644
index 0000000..11c1596
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_7.csv
@@ -0,0 +1,7 @@
+time,temp,out,ACC_status,LPI_status,LPR_status,sequence
+0,10.0,0.0,0.0,0.0,0.0,2.0
+1,10.0,0.0,0.0,0.0,0.0,2.0
+2,10.0,0.0,0.0,0.0,0.0,2.0
+3,10.0,0.0,0.0,0.0,0.0,2.0
+4,15.0,0.0,0.0,0.0,0.0,2.0
+5,20.0,1.0,0.0,1.0,0.0,2.0
diff --git a/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_9.csv b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_9.csv
new file mode 100644
index 0000000..3cb8ccf
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/gold/dataClassifierHS/Print_sim_PS_9.csv
@@ -0,0 +1,10 @@
+time,temp,out,ACC_status,LPI_status,LPR_status,sequence
+0,10.0,0.0,0.0,0.0,0.0,1.0
+1,10.0,0.0,0.0,0.0,0.0,1.0
+2,10.0,0.0,0.0,0.0,0.0,1.0
+3,10.0,0.0,0.0,0.0,0.0,1.0
+4,10.0,0.0,0.0,0.0,0.0,1.0
+5,10.0,0.0,0.0,0.0,0.0,1.0
+6,10.0,0.0,0.0,0.0,0.0,1.0
+7,15.0,0.0,0.0,0.0,0.0,1.0
+8,20.0,1.0,0.0,0.0,1.0,1.0
diff --git a/tests/PostProcessors/DataClassifier/test_dataClassifier_postprocessor.xml b/tests/PostProcessors/DataClassifier/test_dataClassifier_postprocessor.xml
new file mode 100644
index 0000000..400d220
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/test_dataClassifier_postprocessor.xml
@@ -0,0 +1,157 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/DataClassifier/Clustering/</name>
+    <author>wangc</author>
+    <created>2018-10-18</created>
+    <classesTested>DataClassifier</classesTested>
+    <description>
+      Test DataClassifier PostProcessor with PointSet input
+    </description>
+    <revisions>
+      <revision author="wangc" date="2019-04-26">
+        Move the test from PRAPlugin to RAVEN tests/framework/PostProcessors/DataClassifier, this is because
+        the DataClassifier PostProcessor is currently in RAVEN main repository.
+      </revision>
+      <revision author="wangc" date="2019-05-02">
+        As reported in issue #805, RAVEN will not allow input DataObject of PostProcessor to be output DataObject,
+        the output data object will be renamed, and the variable name of labels will be explicitly defined.
+      </revision>
+    </revisions>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>dataClassifier</WorkingDir>
+    <Sequence>simRun,import_ET_PS,classify,printOnFile_ET_PS,printOnFile_sim_PS</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Distributions>
+    <Bernoulli name="ACC_distrib">
+      <p>0.4</p>
+    </Bernoulli>
+    <Normal name="LPI_distrib">
+      <mean>4</mean>
+      <sigma>1</sigma>
+    </Normal>
+    <Normal name="LPR_distrib">
+      <mean>5</mean>
+      <sigma>1</sigma>
+    </Normal>
+  </Distributions>
+
+  <Samplers>
+    <MonteCarlo name="MC_external">
+      <samplerInit>
+        <limit>10</limit>
+      </samplerInit>
+      <variable name="ACC_status">
+        <distribution>ACC_distrib</distribution>
+      </variable>
+      <variable name="time_LPI">
+        <distribution>LPI_distrib</distribution>
+      </variable>
+      <variable name="time_LPR">
+        <distribution>LPR_distrib</distribution>
+      </variable>
+    </MonteCarlo>
+  </Samplers>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Functions>
+    <External file="func_ACC.py" name="func_ACC">
+      <variables>ACC_status,time_LPI,time_LPR</variables>
+    </External>
+    <External file="func_LPI.py" name="func_LPI">
+      <variables>LPI_status,time_LPI,time_LPR</variables>
+    </External>
+    <External file="func_LPR.py" name="func_LPR">
+      <variables>LPR_status,time_LPI,time_LPR</variables>
+    </External>
+  </Functions>
+
+  <Models>
+    <ExternalModel ModuleToLoad="THmodel" name="PythonModule" subType="">
+      <variables>ACC_status,time_LPI,time_LPR,out,LPI_status,LPR_status</variables>
+    </ExternalModel>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>True</expand>
+    </PostProcessor>
+    <PostProcessor name="ET_Classifier" subType="SR2ML.DataClassifier">
+      <label>sequence</label>
+      <variable name='ACC'>
+        <Function class="Functions" type="External">func_ACC</Function>
+      </variable>
+      <variable name='LPI'>
+        <Function class="Functions" type="External">func_LPI</Function>
+      </variable>
+      <variable name='LPR'>
+        <Function class="Functions" type="External">func_LPR</Function>
+      </variable>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <MultiRun name="simRun">
+      <Input   class="DataObjects"  type="PointSet"        >inputPlaceHolder</Input>
+      <Model   class="Models"       type="ExternalModel"   >PythonModule</Model>
+      <Sampler class="Samplers"     type="MonteCarlo"      >MC_external</Sampler>
+      <Output  class="DataObjects"  type="PointSet"        >sim_PS</Output>
+    </MultiRun>
+    <PostProcess name="import_ET_PS">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <PostProcess name="classify">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Input   class="DataObjects"  type="PointSet"        >sim_PS</Input>
+      <Model   class="Models"       type="PostProcessor"   >ET_Classifier</Model>
+      <Output  class="DataObjects"  type="PointSet"        >sim_PS_out</Output>
+    </PostProcess>
+    <IOStep name="printOnFile_ET_PS">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >Print_ET_PS</Output>
+    </IOStep>
+    <IOStep name="printOnFile_sim_PS">
+      <Input   class="DataObjects"  type="PointSet"        >sim_PS_out</Input>
+      <Output  class="OutStreams"   type="Print"           >Print_sim_PS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="Print_ET_PS">
+      <type>csv</type>
+      <source>ET_PS</source>
+      <what>input,output</what>
+    </Print>
+    <Print name="Print_sim_PS">
+      <type>csv</type>
+      <source>sim_PS_out</source>
+      <what>input,output</what>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+    <PointSet name="inputPlaceHolder">
+      <Input>ACC_status,time_LPI,time_LPR</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <PointSet name="sim_PS">
+      <Input>ACC_status,time_LPI,time_LPR</Input>
+      <Output>out, LPI_status, LPR_status</Output>
+    </PointSet>
+    <PointSet name="sim_PS_out">
+      <Input>ACC_status,time_LPI,time_LPR</Input>
+      <Output>out, LPI_status, LPR_status, sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/DataClassifier/test_dataClassifier_postprocessor_HS.xml b/tests/PostProcessors/DataClassifier/test_dataClassifier_postprocessor_HS.xml
new file mode 100644
index 0000000..5482b90
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/test_dataClassifier_postprocessor_HS.xml
@@ -0,0 +1,158 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/DataClassifier/Clustering/</name>
+    <author>wangc</author>
+    <created>2018-10-18</created>
+    <classesTested>DataClassifier</classesTested>
+    <description>
+      Test DataClassifier PostProcessor with HistorySet input
+    </description>
+    <revisions>
+      <revision author="wangc" date="2019-04-26">
+        Move the test from PRAPlugin to RAVEN tests/framework/PostProcessors/DataClassifier, this is because
+        the DataClassifier PostProcessor is currently in RAVEN main repository.
+      </revision>
+      <revision author="wangc" date="2019-05-02">
+        As reported in issue #805, RAVEN will not allow input DataObject of PostProcessor to be output DataObject,
+        the output data object will be renamed, and the variable name of labels will be explicitly defined.
+      </revision>
+    </revisions>
+  </TestInfo>
+
+
+  <RunInfo>
+    <WorkingDir>dataClassifierHS</WorkingDir>
+    <Sequence>simRun,import_ET_PS,classify,printOnFile_ET_PS,printOnFile_sim_PS</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Distributions>
+    <Bernoulli name="ACC_distrib">
+      <p>0.4</p>
+    </Bernoulli>
+    <Normal name="LPI_distrib">
+      <mean>4</mean>
+      <sigma>1</sigma>
+    </Normal>
+    <Normal name="LPR_distrib">
+      <mean>5</mean>
+      <sigma>1</sigma>
+    </Normal>
+  </Distributions>
+
+  <Samplers>
+    <MonteCarlo name="MC_external">
+      <samplerInit>
+        <limit>10</limit>
+      </samplerInit>
+      <variable name="ACC_sim">
+        <distribution>ACC_distrib</distribution>
+      </variable>
+      <variable name="time_LPI">
+        <distribution>LPI_distrib</distribution>
+      </variable>
+      <variable name="time_LPR">
+        <distribution>LPR_distrib</distribution>
+      </variable>
+    </MonteCarlo>
+  </Samplers>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Functions>
+    <External file="func_ACC.py" name="func_ACC">
+      <variables>ACC_status,LPI_status,LPR_status</variables>
+    </External>
+    <External file="func_LPI.py" name="func_LPI">
+      <variables>ACC_status,LPI_status,LPR_status</variables>
+    </External>
+    <External file="func_LPR.py" name="func_LPR">
+      <variables>ACC_status,LPI_status,LPR_status</variables>
+    </External>
+  </Functions>
+
+  <Models>
+    <ExternalModel ModuleToLoad="THmodelTD" name="PythonModule" subType="">
+      <variables>ACC_sim,time_LPI,time_LPR,out,ACC_status,LPI_status,LPR_status,time,temp</variables>
+    </ExternalModel>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>True</expand>
+    </PostProcessor>
+    <PostProcessor name="ET_Classifier" subType="SR2ML.DataClassifier">
+      <label>sequence</label>
+      <variable name='ACC'>
+        <Function class="Functions" type="External">func_ACC</Function>
+      </variable>
+      <variable name='LPI'>
+        <Function class="Functions" type="External">func_LPI</Function>
+      </variable>
+      <variable name='LPR'>
+        <Function class="Functions" type="External">func_LPR</Function>
+      </variable>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <MultiRun name="simRun">
+      <Input   class="DataObjects"  type="PointSet"        >inputPlaceHolder</Input>
+      <Model   class="Models"       type="ExternalModel"   >PythonModule</Model>
+      <Sampler class="Samplers"     type="MonteCarlo"      >MC_external</Sampler>
+      <Output  class="DataObjects"  type="HistorySet"      >sim_PS</Output>
+    </MultiRun>
+    <PostProcess name="import_ET_PS">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <PostProcess name="classify">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Input   class="DataObjects"  type="HistorySet"      >sim_PS</Input>
+      <Model   class="Models"       type="PostProcessor"   >ET_Classifier</Model>
+      <Output  class="DataObjects"  type="HistorySet"      >sim_PS_out</Output>
+    </PostProcess>
+    <IOStep name="printOnFile_ET_PS">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >Print_ET_PS</Output>
+    </IOStep>
+    <IOStep name="printOnFile_sim_PS">
+      <Input   class="DataObjects"  type="HistorySet"      >sim_PS_out</Input>
+      <Output  class="OutStreams"   type="Print"           >Print_sim_PS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="Print_ET_PS">
+      <type>csv</type>
+      <source>ET_PS</source>
+      <what>input,output</what>
+    </Print>
+    <Print name="Print_sim_PS">
+      <type>csv</type>
+      <source>sim_PS_out</source>
+      <what>input,output</what>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+    <PointSet name="inputPlaceHolder">
+      <Input>ACC_sim,time_LPI,time_LPR</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <HistorySet name="sim_PS">
+      <Input>ACC_sim,time_LPI,time_LPR</Input>
+      <Output>time, temp, out, ACC_status, LPI_status, LPR_status</Output>
+    </HistorySet>
+    <HistorySet name="sim_PS_out">
+      <Input>ACC_sim,time_LPI,time_LPR</Input>
+      <Output>time, temp, out, ACC_status, LPI_status, LPR_status, sequence</Output>
+    </HistorySet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/DataClassifier/tests b/tests/PostProcessors/DataClassifier/tests
new file mode 100644
index 0000000..78b841b
--- /dev/null
+++ b/tests/PostProcessors/DataClassifier/tests
@@ -0,0 +1,14 @@
+[Tests]
+ [./TestDataClassifierPS]
+  type = 'RavenFramework'
+  input = 'test_dataClassifier_postprocessor.xml'
+  UnorderedCsv = 'dataClassifier/Print_sim_PS.csv dataClassifier/Print_ET_PS.csv'
+ [../]
+
+ [./TestDataClassifierHS]
+  type = 'RavenFramework'
+  input = 'test_dataClassifier_postprocessor_HS.xml'
+  UnorderedCsv = 'dataClassifierHS/Print_sim_PS_0.csv dataClassifierHS/Print_sim_PS_3.csv dataClassifierHS/Print_sim_PS_7.csv dataClassifierHS/Print_sim_PS_9.csv'
+ [../]
+[]
+
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporter/eventTree.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporter/eventTree.xml
new file mode 100644
index 0000000..b9c5c08
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporter/eventTree.xml
@@ -0,0 +1,33 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="1"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporterCoupledET/eventTree1.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporterCoupledET/eventTree1.xml
new file mode 100644
index 0000000..e83fb80
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporterCoupledET/eventTree1.xml
@@ -0,0 +1,26 @@
+<define-event-tree name="eventTreeMain">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="HPI"/>
+    <define-sequence name="Link-to-LP">
+      <event-tree name="Link-to-LP-Event-Tree"/>
+    </define-sequence>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="HPI">
+                    <path state="0">
+                        <sequence name="Link-to-LP"/>
+                    </path>
+                    <path state="+1">
+                        <sequence name="1"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="2"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporterCoupledET/eventTree2.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporterCoupledET/eventTree2.xml
new file mode 100644
index 0000000..3cffa52
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporterCoupledET/eventTree2.xml
@@ -0,0 +1,24 @@
+<define-event-tree name="Link-to-LP-Event-Tree">
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="T_A"/>
+    <define-sequence name="T_B"/>
+    <define-sequence name="T_C"/>
+    <initial-state>
+        <fork functional-event="LPI">
+            <path state="0">
+                <fork functional-event="LPR">
+                    <path state="0">
+                        <sequence name="T_A"/>
+                    </path>
+                    <path state="+1">
+                        <sequence name="T_B"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="T_C"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporterDefineBranch/eventTreeDefineBranch.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporterDefineBranch/eventTreeDefineBranch.xml
new file mode 100644
index 0000000..8067bfd
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporterDefineBranch/eventTreeDefineBranch.xml
@@ -0,0 +1,57 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-functional-event name="REC1"/>
+    <define-functional-event name="REC2"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <define-sequence name="4"/>
+    <define-sequence name="seq_5"/>
+    <define-sequence name="seq_6"/>
+    <define-branch name="sub-tree1">
+        <fork functional-event="REC1">
+            <path state="0">
+                <sequence name="3"/>
+            </path>
+            <path state="+1">
+                <sequence name="4"/>
+            </path>
+        </fork>
+    </define-branch>
+     <define-branch name="sub-tree2">
+        <fork functional-event="REC2">
+            <path state="success">
+                <sequence name="seq_5"/>
+            </path>
+            <path state="failure">
+                <sequence name="seq_6"/>
+            </path>
+        </fork>
+    </define-branch>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <branch name="sub-tree1"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="1"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <branch name="sub-tree2"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporterExpand/eventTree.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporterExpand/eventTree.xml
new file mode 100644
index 0000000..b9c5c08
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporterExpand/eventTree.xml
@@ -0,0 +1,33 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="1"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporterSymbolicSequence/eventTreeSymbolic.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporterSymbolicSequence/eventTreeSymbolic.xml
new file mode 100644
index 0000000..7407baf
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporterSymbolicSequence/eventTreeSymbolic.xml
@@ -0,0 +1,33 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="seq_1"/>
+    <define-sequence name="seq_2"/>
+    <define-sequence name="seq_3"/>
+    <define-sequence name="seq_4"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="success">
+                <fork functional-event="LPI">
+                    <path state="success">
+                        <fork functional-event="LPR">
+                            <path state="success">
+                                <sequence name="seq_1"/>
+                            </path>
+                            <path state="failure">
+                                <sequence name="seq_2"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="failure">
+                        <sequence name="seq_3"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="failure">
+                <sequence name="seq_4"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches/eventTree.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches/eventTree.xml
new file mode 100644
index 0000000..405c275
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches/eventTree.xml
@@ -0,0 +1,41 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <define-sequence name="4"/>
+    <define-sequence name="5"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="0">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="+1">
+                                <sequence name="1"/>
+                            </path>
+                            <path state="+2">
+                                <sequence name="4"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+            <path state="+2">
+                <sequence name="5"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches_NewNumbering/eventTree.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches_NewNumbering/eventTree.xml
new file mode 100644
index 0000000..5744a8a
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches_NewNumbering/eventTree.xml
@@ -0,0 +1,41 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <define-sequence name="4"/>
+    <define-sequence name="5"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="2">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="3">
+                                <sequence name="1"/>
+                            </path>
+                            <path state="0">
+                                <sequence name="4"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+            <path state="+2">
+                <sequence name="5"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches_NewNumbering_expanded/eventTree.xml b/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches_NewNumbering_expanded/eventTree.xml
new file mode 100644
index 0000000..5744a8a
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/ETimporter_3branches_NewNumbering_expanded/eventTree.xml
@@ -0,0 +1,41 @@
+<define-event-tree name="eventTreeMandd">
+    <define-functional-event name="ACC"/>
+    <define-functional-event name="LPI"/>
+    <define-functional-event name="LPR"/>
+    <define-sequence name="0"/>
+    <define-sequence name="1"/>
+    <define-sequence name="2"/>
+    <define-sequence name="3"/>
+    <define-sequence name="4"/>
+    <define-sequence name="5"/>
+    <initial-state>
+        <fork functional-event="ACC">
+            <path state="0">
+                <fork functional-event="LPI">
+                    <path state="0">
+                        <fork functional-event="LPR">
+                            <path state="2">
+                                <sequence name="0"/>
+                            </path>
+                            <path state="3">
+                                <sequence name="1"/>
+                            </path>
+                            <path state="0">
+                                <sequence name="4"/>
+                            </path>
+                        </fork>
+                    </path>
+                    <path state="+1">
+                        <sequence name="2"/>
+                    </path>
+                </fork>
+            </path>
+            <path state="+1">
+                <sequence name="3"/>
+            </path>
+            <path state="+2">
+                <sequence name="5"/>
+            </path>
+        </fork>
+    </initial-state>
+</define-event-tree>
\ No newline at end of file
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter/PrintPS.csv
new file mode 100644
index 0000000..774dcae
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter/PrintPS.csv
@@ -0,0 +1,5 @@
+ACC,LPR,LPI,sequence
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+0.0,-1.0,1.0,2.0
+1.0,-1.0,-1.0,3.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterCoupledET/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterCoupledET/PrintPS.csv
new file mode 100644
index 0000000..d6c069b
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterCoupledET/PrintPS.csv
@@ -0,0 +1,6 @@
+ACC,HPI,LPR,LPI,sequence
+0.0,0.0,0.0,0.0,2.0
+0.0,0.0,1.0,0.0,3.0
+0.0,0.0,-1.0,1.0,4.0
+0.0,1.0,-1.0,-1.0,0.0
+1.0,-1.0,-1.0,-1.0,1.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterCoupledET/eventTreeMain_mapping.xml b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterCoupledET/eventTreeMain_mapping.xml
new file mode 100644
index 0000000..eb562f2
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterCoupledET/eventTreeMain_mapping.xml
@@ -0,0 +1,11 @@
+<map Tree="eventTreeMain">
+  <sequence ID="0">1</sequence>
+
+  <sequence ID="1">2</sequence>
+
+  <sequence ID="2">T_A</sequence>
+
+  <sequence ID="3">T_B</sequence>
+
+  <sequence ID="4">T_C</sequence>
+</map>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterDefineBranch/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterDefineBranch/PrintPS.csv
new file mode 100644
index 0000000..321aa43
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterDefineBranch/PrintPS.csv
@@ -0,0 +1,7 @@
+ACC,REC2,REC1,LPR,LPI,sequence
+0.0,-1.0,0.0,0.0,0.0,2.0
+0.0,-1.0,1.0,0.0,0.0,3.0
+0.0,-1.0,-1.0,1.0,0.0,0.0
+0.0,-1.0,-1.0,-1.0,1.0,1.0
+1.0,0.0,-1.0,-1.0,-1.0,4.0
+1.0,1.0,-1.0,-1.0,-1.0,5.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterDefineBranch/eventTreeMandd_mapping.xml b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterDefineBranch/eventTreeMandd_mapping.xml
new file mode 100644
index 0000000..459d1cf
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterDefineBranch/eventTreeMandd_mapping.xml
@@ -0,0 +1,13 @@
+<map Tree="eventTreeMandd">
+  <sequence ID="0">1</sequence>
+
+  <sequence ID="1">2</sequence>
+
+  <sequence ID="2">3</sequence>
+
+  <sequence ID="3">4</sequence>
+
+  <sequence ID="4">seq_5</sequence>
+
+  <sequence ID="5">seq_6</sequence>
+</map>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterExpand/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterExpand/PrintPS.csv
new file mode 100644
index 0000000..df72766
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterExpand/PrintPS.csv
@@ -0,0 +1,9 @@
+ACC,LPR,LPI,sequence
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+0.0,0.0,1.0,2.0
+1.0,0.0,0.0,3.0
+1.0,0.0,1.0,3.0
+0.0,1.0,1.0,2.0
+1.0,1.0,0.0,3.0
+1.0,1.0,1.0,3.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterSymbolicSequence/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterSymbolicSequence/PrintPS.csv
new file mode 100644
index 0000000..774dcae
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterSymbolicSequence/PrintPS.csv
@@ -0,0 +1,5 @@
+ACC,LPR,LPI,sequence
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+0.0,-1.0,1.0,2.0
+1.0,-1.0,-1.0,3.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterSymbolicSequence/eventTreeMandd_mapping.xml b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterSymbolicSequence/eventTreeMandd_mapping.xml
new file mode 100644
index 0000000..03eb600
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporterSymbolicSequence/eventTreeMandd_mapping.xml
@@ -0,0 +1,9 @@
+<map Tree="eventTreeMandd">
+  <sequence ID="0">seq_1</sequence>
+
+  <sequence ID="1">seq_2</sequence>
+
+  <sequence ID="2">seq_3</sequence>
+
+  <sequence ID="3">seq_4</sequence>
+</map>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches/PrintPS.csv
new file mode 100644
index 0000000..6c31e84
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches/PrintPS.csv
@@ -0,0 +1,7 @@
+ACC,LPR,LPI,sequence
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+0.0,2.0,0.0,4.0
+0.0,-1.0,1.0,2.0
+1.0,-1.0,-1.0,3.0
+2.0,-1.0,-1.0,5.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches_NewNumbering/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches_NewNumbering/PrintPS.csv
new file mode 100644
index 0000000..80183c2
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches_NewNumbering/PrintPS.csv
@@ -0,0 +1,7 @@
+ACC,LPR,LPI,sequence
+0.0,2.0,0.0,0.0
+0.0,3.0,0.0,1.0
+0.0,0.0,0.0,4.0
+0.0,-1.0,1.0,2.0
+1.0,-1.0,-1.0,3.0
+2.0,-1.0,-1.0,5.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches_NewNumbering_expanded/PrintPS.csv b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches_NewNumbering_expanded/PrintPS.csv
new file mode 100644
index 0000000..776bf69
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/gold/ETimporter_3branches_NewNumbering_expanded/PrintPS.csv
@@ -0,0 +1,19 @@
+ACC,LPR,LPI,sequence
+0.0,2.0,0.0,0.0
+0.0,3.0,0.0,1.0
+0.0,0.0,0.0,4.0
+0.0,2.0,1.0,2.0
+1.0,2.0,0.0,3.0
+2.0,2.0,0.0,5.0
+1.0,2.0,1.0,3.0
+2.0,2.0,1.0,5.0
+0.0,3.0,1.0,2.0
+0.0,0.0,1.0,2.0
+1.0,3.0,0.0,3.0
+1.0,0.0,0.0,3.0
+2.0,3.0,0.0,5.0
+2.0,0.0,0.0,5.0
+1.0,3.0,1.0,3.0
+1.0,0.0,1.0,3.0
+2.0,3.0,1.0,5.0
+2.0,0.0,1.0,5.0
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter.xml
new file mode 100644
index 0000000..f88914e
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/ETimporterPostProcessor.ET_importer_OpenPSA</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporter</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporterMultipleET.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporterMultipleET.xml
new file mode 100644
index 0000000..f9d0c13
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporterMultipleET.xml
@@ -0,0 +1,60 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors.ETimporterPostProcessorMultipleET.ET_importer_OpenPSA_coupledET</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from multiple .xml files
+      (eventTree1.xml and eventTree2.xml). Note that one single ET is provided but its structure is splitted into two
+      files, i.e., the sub ETs are linked.
+      and it imports the fullET structure into a PointSet. Note that the ETs need to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporterCoupledET</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest1" type="">eventTree1.xml</Input>
+    <Input name="eventTreeTest2" type="">eventTree2.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest1</Input>
+      <Input   class="Files"        type=""                >eventTreeTest2</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,HPI,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporterSymbolic.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporterSymbolic.xml
new file mode 100644
index 0000000..d5a5479
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporterSymbolic.xml
@@ -0,0 +1,58 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+      <name>framework/PostProcessors/ETimporterPostProcessor.ET_importer_OpenPSA_Symbolic</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+      In particular, this tests checks that capability of the PP to manage symbolic ID for the ET sequences. Note that
+      in this configuration, a mapping file is generated
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporterSymbolicSequence</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTreeSymbolic.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches.xml
new file mode 100644
index 0000000..8046ad3
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/ETimporterPostProcessor.ET_importer_3branches</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporter_3branches</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches_NewNumbering.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches_NewNumbering.xml
new file mode 100644
index 0000000..895f4a3
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches_NewNumbering.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/ETimporterPostProcessor.ETimporter_3branches_NewNumbering</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporter_3branches_NewNumbering</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches_NewNumbering_expanded.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches_NewNumbering_expanded.xml
new file mode 100644
index 0000000..63d72f8
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_3branches_NewNumbering_expanded.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/ETimporterPostProcessor.ETimporter_3branches_NewNumbering_expanded</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporter_3branches_NewNumbering_expanded</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>True</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_DefineBranch.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_DefineBranch.xml
new file mode 100644
index 0000000..2cf768c
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_DefineBranch.xml
@@ -0,0 +1,57 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/ETimporterPostProcessor.ET_importer_OpenPSA_Define_Branch</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+      In particular, this tests checks that capability of the PP to manage ETs that contains by-pass branches.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporterDefineBranch</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTreeDefineBranch.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR,REC1,REC2</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_expand.xml b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_expand.xml
new file mode 100644
index 0000000..d12feac
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/test_ETimporter_expand.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/ETimporterPostProcessor.ET_importer_OpenPSA_Expand</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the ETImporter post-processor: it read an event-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the ET structure into a PointSet. Note that the ET needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>ETimporterExpand</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="eventTreeTest" type="">eventTree.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="ETimporter" subType="SR2ML.ETImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <expand>True</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >eventTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >ETimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >ET_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >ET_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>ET_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="ET_PS">
+      <Input>ACC,LPI,LPR</Input>
+      <Output>sequence</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/ETimporterPostProcessor/tests b/tests/PostProcessors/ETimporterPostProcessor/tests
new file mode 100644
index 0000000..0c779a9
--- /dev/null
+++ b/tests/PostProcessors/ETimporterPostProcessor/tests
@@ -0,0 +1,45 @@
+[Tests]
+  [./ET_importer_OpenPSA]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporter.xml'
+    csv    = 'ETimporter/PrintPS.csv'
+  [../]
+  [./ET_importer_OpenPSA_Symbolic]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporterSymbolic.xml'
+    csv    = 'ETimporterSymbolicSequence/PrintPS.csv'
+    output = 'ETimporterSymbolicSequence/eventTreeMandd_mapping.xml'
+  [../]
+  [./ET_importer_OpenPSA_Define_Branch]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporter_DefineBranch.xml'
+    csv    = 'ETimporterDefineBranch/PrintPS.csv'
+    output = 'ETimporterDefineBranch/eventTreeMandd_mapping.xml'
+  [../]
+  [./ET_importer_OpenPSA_coupledET]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporterMultipleET.xml'
+    csv    = 'ETimporterCoupledET/PrintPS.csv'
+    output = 'ETimporterCoupledET/eventTreeMain_mapping.xml'
+  [../]
+  [./ET_importer_OpenPSA_expand]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporter_expand.xml'
+    csv    = 'ETimporterExpand/PrintPS.csv'
+  [../]
+  [./ET_importer_3branches]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporter_3branches.xml'
+    csv    = 'ETimporter_3branches/PrintPS.csv'
+  [../]
+  [./ETimporter_3branches_NewNumbering]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporter_3branches_NewNumbering.xml'
+    csv    = 'ETimporter_3branches_NewNumbering/PrintPS.csv'
+  [../]
+  [./ETimporter_3branches_NewNumbering_expanded]
+    type   = 'RavenFramework'
+    input  = 'test_ETimporter_3branches_NewNumbering_expanded.xml'
+    csv    = 'ETimporter_3branches_NewNumbering_expanded/PrintPS.csv'
+  [../]
+[]
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and/FT_and.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and/FT_and.xml
new file mode 100644
index 0000000..cef336e
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and/FT_and.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <and>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	        </and>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT/FT_and_NOT.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT/FT_and_NOT.xml
new file mode 100644
index 0000000..78bfc34
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT/FT_and_NOT.xml
@@ -0,0 +1,16 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+		<define-gate name="TOP">
+		    <and>
+		        <basic-event name="BE1"/>
+		        <basic-event name="BE2"/>
+		        <gate        name="notBE3"/>
+		    </and>
+		</define-gate>
+		<define-gate name="notBE3">
+		  <not>
+		    <basic-event name="BE3"/>
+		  </not>
+		</define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT_embedded/FT_and_NOT_embedded.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT_embedded/FT_and_NOT_embedded.xml
new file mode 100644
index 0000000..7b831c3
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT_embedded/FT_and_NOT_embedded.xml
@@ -0,0 +1,13 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+		<define-gate name="TOP">
+		    <and>
+		        <basic-event name="BE1"/>
+		        <basic-event name="BE2"/>
+				<not>
+				  <basic-event name="BE3"/>
+				</not>
+		    </and>
+		</define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT_withNOT_embedded/FT_and_withNOT_withNOT_embedded.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT_withNOT_embedded/FT_and_withNOT_withNOT_embedded.xml
new file mode 100644
index 0000000..872b2e9
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_and_withNOT_withNOT_embedded/FT_and_withNOT_withNOT_embedded.xml
@@ -0,0 +1,18 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+		<define-gate name="TOP">
+		    <and>
+		        <basic-event name="BE1"/>
+		        <basic-event name="BE2"/>
+		        <not>
+		        	<gate    name="notBE3"/>
+		        </not>
+		    </and>
+		</define-gate>
+		<define-gate name="notBE3">
+		  <not>
+		    <basic-event name="BE3"/>
+		  </not>
+		</define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_atleast/FT_atleast.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_atleast/FT_atleast.xml
new file mode 100644
index 0000000..a85862f
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_atleast/FT_atleast.xml
@@ -0,0 +1,12 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <atleast min="2">
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	            <basic-event name="BE4"/>
+	        </atleast>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_cardinality/FT_cardinality.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_cardinality/FT_cardinality.xml
new file mode 100644
index 0000000..f7618ca
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_cardinality/FT_cardinality.xml
@@ -0,0 +1,13 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <cardinality min="2" max="3">
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	            <basic-event name="BE4"/>
+	            <basic-event name="BE5"/>
+	        </cardinality>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_component/FT1.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_component/FT1.xml
new file mode 100644
index 0000000..61d3140
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_component/FT1.xml
@@ -0,0 +1,47 @@
+<opsa-mef>
+    <define-fault-tree name="FT">
+        <define-gate name="TOP">
+            <or>
+                <gate name="G1"/>
+                <gate name="G2"/>
+                <gate name="G3"/>
+            </or>
+        </define-gate>
+        <define-component name="A">
+            <define-gate name="G1">
+                <and>
+                    <basic-event name="BE1"/>
+                    <basic-event name="BE2"/>
+                </and>
+            </define-gate>
+            <define-gate name="G2">
+                <and>
+                    <basic-event name="BE1"/>
+                    <basic-event name="BE3"/>
+                </and>
+            </define-gate>
+            <define-basic-event name="BE1">
+                <float value="1.2e-3"/>
+            </define-basic-event>
+            <define-component name="B">
+                <define-basic-event name="BE2">
+                    <float value="2.4e-3"/>
+                </define-basic-event>
+                <define-basic-event name="BE3">
+                    <float value="5.2e-3"/>
+                </define-basic-event>
+            </define-component>
+        </define-component>
+        <define-component name="C">
+            <define-gate name="G3">
+                <and>
+                    <basic-event name="BE1"/>
+                    <basic-event name="BE4"/>
+                </and>
+            </define-gate>
+            <define-basic-event name="BE4">
+                <float value="1.6e-3"/>
+            </define-basic-event>
+        </define-component>
+    </define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_doubleNot/FTimporter_doubleNot.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_doubleNot/FTimporter_doubleNot.xml
new file mode 100644
index 0000000..4eebbe1
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_doubleNot/FTimporter_doubleNot.xml
@@ -0,0 +1,11 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+		<define-gate name="TOP">
+		  <not>
+			<not>
+				<basic-event name="BE1"/>
+			</not>
+		  </not>
+		</define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_iff/FT_iff.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_iff/FT_iff.xml
new file mode 100644
index 0000000..e9c8250
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_iff/FT_iff.xml
@@ -0,0 +1,10 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <iff>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	        </iff>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_imply/FT_imply.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_imply/FT_imply.xml
new file mode 100644
index 0000000..c4c88dc
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_imply/FT_imply.xml
@@ -0,0 +1,10 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <imply>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	        </imply>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_model_data.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_model_data.xml
new file mode 100644
index 0000000..ec0bfcb
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_model_data.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+
+<!--
+This file contains probabilities for primary events in Trans fault trees
+for testing TransferIn and TransferOut capabilities of SCRAM
+The probabilities are the same as in OpenFTA examples.
+-->
+
+<opsa-mef>
+  <model-data>
+    <define-basic-event name="A">
+      <float value="2e-2"/>
+    </define-basic-event>
+    <define-basic-event name="B">
+      <float value="4e-2"/>
+    </define-basic-event>
+    <define-house-event name="C">
+      <constant value="false"/>
+    </define-house-event>
+  </model-data>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_one.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_one.xml
new file mode 100644
index 0000000..2327ebc
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_one.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+
+<!--
+This input contains the first part of fault tree with transfer symbols.
+-->
+
+<opsa-mef>
+  <define-fault-tree name="TransOne">
+    <define-gate name="TransOne">
+      <and>
+        <house-event name="C"/>
+        <gate name="TransTwo"/>  <!-- The gate with Transfer-In symbol -->
+      </and>
+    </define-gate>
+  </define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_two.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_two.xml
new file mode 100644
index 0000000..b99b1f5
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_multipleFTs/trans_two.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+
+<!--
+This file contains a self-contained fault tree
+that can be attached to any tree.
+This particular TransTwo tree
+is for testing TransferIn and TransferOut capabilities of SCRAM.
+-->
+
+<opsa-mef>
+  <define-fault-tree name="TransTwo">
+    <define-gate name="TransTwo">  <!-- The gate with Transfer-Out symbol -->
+      <and>
+        <basic-event name="A"/>
+        <basic-event name="B"/>
+      </and>
+    </define-gate>
+  </define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_nand/FT_nand.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_nand/FT_nand.xml
new file mode 100644
index 0000000..aaf5e0f
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_nand/FT_nand.xml
@@ -0,0 +1,11 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <nand>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	        </nand>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_nor/FT_nor.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_nor/FT_nor.xml
new file mode 100644
index 0000000..b31bfd6
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_nor/FT_nor.xml
@@ -0,0 +1,11 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <nor>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	        </nor>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_not/FTimporter_not.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_not/FTimporter_not.xml
new file mode 100644
index 0000000..d899c9b
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_not/FTimporter_not.xml
@@ -0,0 +1,9 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+		<define-gate name="TOP">
+		  <not>
+		     <basic-event name="BE1"/>
+		  </not>
+		</define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_or/FT_or.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_or/FT_or.xml
new file mode 100644
index 0000000..00dbf42
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_or/FT_or.xml
@@ -0,0 +1,11 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <or>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	        </or>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_or_houseEvent/FT_or_houseEvent.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_or_houseEvent/FT_or_houseEvent.xml
new file mode 100644
index 0000000..d0b9836
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_or_houseEvent/FT_or_houseEvent.xml
@@ -0,0 +1,14 @@
+<opsa-mef>
+    <define-fault-tree name="FT">
+        <define-gate name="TOP">
+            <or>
+                <basic-event name="BE1"/>
+                <basic-event name="BE2"/>
+                <house-event name="HE1"/>
+            </or>
+        </define-gate>
+        <define-house-event name="HE1">
+        	<constant value="true"/>
+        </define-house-event>
+    </define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/FTimporter_xor/FT_xor.xml b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_xor/FT_xor.xml
new file mode 100644
index 0000000..20b0960
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/FTimporter_xor/FT_xor.xml
@@ -0,0 +1,11 @@
+<opsa-mef>
+	<define-fault-tree name="FT">
+	    <define-gate name="TOP">
+	        <xor>
+	            <basic-event name="BE1"/>
+	            <basic-event name="BE2"/>
+	            <basic-event name="BE3"/>
+	        </xor>
+	    </define-gate>
+	</define-fault-tree>
+</opsa-mef>
\ No newline at end of file
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and/PrintPS.csv
new file mode 100644
index 0000000..642917d
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,0.0
+1.0,0.0,0.0,0.0
+1.0,1.0,0.0,0.0
+0.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0
+1.0,0.0,1.0,0.0
+1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT/PrintPS.csv
new file mode 100644
index 0000000..ebbb161
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,0.0
+1.0,0.0,0.0,0.0
+1.0,1.0,0.0,0.0
+0.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0
+1.0,0.0,1.0,1.0
+1.0,1.0,1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT_embedded/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT_embedded/PrintPS.csv
new file mode 100644
index 0000000..ebbb161
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT_embedded/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,0.0
+1.0,0.0,0.0,0.0
+1.0,1.0,0.0,0.0
+0.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0
+1.0,0.0,1.0,1.0
+1.0,1.0,1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT_withNOT_embedded/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT_withNOT_embedded/PrintPS.csv
new file mode 100644
index 0000000..642917d
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_and_withNOT_withNOT_embedded/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,0.0
+1.0,0.0,0.0,0.0
+1.0,1.0,0.0,0.0
+0.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0
+1.0,0.0,1.0,0.0
+1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_atleast/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_atleast/PrintPS.csv
new file mode 100644
index 0000000..0df8bb7
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_atleast/PrintPS.csv
@@ -0,0 +1,17 @@
+BE2,BE3,BE1,BE4,TOP
+0.0,0.0,0.0,0.0,0.0
+0.0,0.0,0.0,1.0,0.0
+0.0,1.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0,1.0
+1.0,0.0,0.0,0.0,0.0
+1.0,0.0,0.0,1.0,1.0
+1.0,1.0,0.0,0.0,1.0
+1.0,1.0,0.0,1.0,1.0
+0.0,0.0,1.0,0.0,0.0
+0.0,0.0,1.0,1.0,1.0
+0.0,1.0,1.0,0.0,1.0
+0.0,1.0,1.0,1.0,1.0
+1.0,0.0,1.0,0.0,1.0
+1.0,0.0,1.0,1.0,1.0
+1.0,1.0,1.0,0.0,1.0
+1.0,1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_cardinality/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_cardinality/PrintPS.csv
new file mode 100644
index 0000000..c173726
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_cardinality/PrintPS.csv
@@ -0,0 +1,33 @@
+BE2,BE3,BE1,BE4,BE5,TOP
+0.0,0.0,0.0,0.0,0.0,0.0
+0.0,0.0,0.0,0.0,1.0,0.0
+0.0,0.0,0.0,1.0,0.0,0.0
+0.0,0.0,0.0,1.0,1.0,1.0
+0.0,1.0,0.0,0.0,0.0,0.0
+0.0,1.0,0.0,0.0,1.0,1.0
+0.0,1.0,0.0,1.0,0.0,1.0
+0.0,1.0,0.0,1.0,1.0,1.0
+1.0,0.0,0.0,0.0,0.0,0.0
+1.0,0.0,0.0,0.0,1.0,1.0
+1.0,0.0,0.0,1.0,0.0,1.0
+1.0,0.0,0.0,1.0,1.0,1.0
+1.0,1.0,0.0,0.0,0.0,1.0
+1.0,1.0,0.0,0.0,1.0,1.0
+1.0,1.0,0.0,1.0,0.0,1.0
+1.0,1.0,0.0,1.0,1.0,0.0
+0.0,0.0,1.0,0.0,0.0,0.0
+0.0,0.0,1.0,0.0,1.0,1.0
+0.0,0.0,1.0,1.0,0.0,1.0
+0.0,0.0,1.0,1.0,1.0,1.0
+0.0,1.0,1.0,0.0,0.0,1.0
+0.0,1.0,1.0,0.0,1.0,1.0
+0.0,1.0,1.0,1.0,0.0,1.0
+0.0,1.0,1.0,1.0,1.0,0.0
+1.0,0.0,1.0,0.0,0.0,1.0
+1.0,0.0,1.0,0.0,1.0,1.0
+1.0,0.0,1.0,1.0,0.0,1.0
+1.0,0.0,1.0,1.0,1.0,0.0
+1.0,1.0,1.0,0.0,0.0,1.0
+1.0,1.0,1.0,0.0,1.0,0.0
+1.0,1.0,1.0,1.0,0.0,0.0
+1.0,1.0,1.0,1.0,1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_component/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_component/PrintPS.csv
new file mode 100644
index 0000000..c04d86e
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_component/PrintPS.csv
@@ -0,0 +1,65 @@
+BE2,BE3,BE1,BE4,TOP
+0.0,0.0,0.0,0.0,0.0
+0.0,0.0,0.0,1.0,0.0
+0.0,0.0,1.0,0.0,0.0
+0.0,0.0,1.0,1.0,1.0
+0.0,1.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0,1.0
+0.0,1.0,1.0,1.0,1.0
+0.0,0.0,0.0,0.0,0.0
+0.0,0.0,0.0,1.0,0.0
+0.0,0.0,1.0,0.0,0.0
+0.0,0.0,1.0,1.0,1.0
+0.0,1.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0,1.0
+0.0,1.0,1.0,1.0,1.0
+1.0,0.0,0.0,0.0,0.0
+1.0,0.0,0.0,1.0,0.0
+1.0,0.0,1.0,0.0,1.0
+1.0,0.0,1.0,1.0,1.0
+1.0,1.0,0.0,0.0,0.0
+1.0,1.0,0.0,1.0,0.0
+1.0,1.0,1.0,0.0,1.0
+1.0,1.0,1.0,1.0,1.0
+1.0,0.0,0.0,0.0,0.0
+1.0,0.0,0.0,1.0,0.0
+1.0,0.0,1.0,0.0,1.0
+1.0,0.0,1.0,1.0,1.0
+1.0,1.0,0.0,0.0,0.0
+1.0,1.0,0.0,1.0,0.0
+1.0,1.0,1.0,0.0,1.0
+1.0,1.0,1.0,1.0,1.0
+0.0,0.0,0.0,0.0,0.0
+0.0,0.0,0.0,1.0,0.0
+0.0,0.0,1.0,0.0,0.0
+0.0,0.0,1.0,1.0,1.0
+0.0,1.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0,1.0
+0.0,1.0,1.0,1.0,1.0
+0.0,0.0,0.0,0.0,0.0
+0.0,0.0,0.0,1.0,0.0
+0.0,0.0,1.0,0.0,0.0
+0.0,0.0,1.0,1.0,1.0
+0.0,1.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0,1.0
+0.0,1.0,1.0,1.0,1.0
+1.0,0.0,0.0,0.0,0.0
+1.0,0.0,0.0,1.0,0.0
+1.0,0.0,1.0,0.0,1.0
+1.0,0.0,1.0,1.0,1.0
+1.0,1.0,0.0,0.0,0.0
+1.0,1.0,0.0,1.0,0.0
+1.0,1.0,1.0,0.0,1.0
+1.0,1.0,1.0,1.0,1.0
+1.0,0.0,0.0,0.0,0.0
+1.0,0.0,0.0,1.0,0.0
+1.0,0.0,1.0,0.0,1.0
+1.0,0.0,1.0,1.0,1.0
+1.0,1.0,0.0,0.0,0.0
+1.0,1.0,0.0,1.0,0.0
+1.0,1.0,1.0,0.0,1.0
+1.0,1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_doubleNot/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_doubleNot/PrintPS.csv
new file mode 100644
index 0000000..02b6f19
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_doubleNot/PrintPS.csv
@@ -0,0 +1,3 @@
+BE1,TOP
+0.0,0.0
+1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_iff/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_iff/PrintPS.csv
new file mode 100644
index 0000000..da3529a
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_iff/PrintPS.csv
@@ -0,0 +1,5 @@
+BE2,BE1,TOP
+0.0,0.0,1.0
+1.0,0.0,0.0
+0.0,1.0,0.0
+1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_imply/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_imply/PrintPS.csv
new file mode 100644
index 0000000..590c280
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_imply/PrintPS.csv
@@ -0,0 +1,5 @@
+BE2,BE1,TOP
+0.0,0.0,1.0
+1.0,0.0,1.0
+0.0,1.0,0.0
+1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_multipleFTs/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_multipleFTs/PrintPS.csv
new file mode 100644
index 0000000..e335d22
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_multipleFTs/PrintPS.csv
@@ -0,0 +1,5 @@
+A,B,TransOne
+0.0,0.0,0.0
+0.0,1.0,0.0
+1.0,0.0,0.0
+1.0,1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_nand/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_nand/PrintPS.csv
new file mode 100644
index 0000000..6dabd14
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_nand/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,1.0
+0.0,1.0,0.0,1.0
+1.0,0.0,0.0,1.0
+1.0,1.0,0.0,1.0
+0.0,0.0,1.0,1.0
+0.0,1.0,1.0,1.0
+1.0,0.0,1.0,1.0
+1.0,1.0,1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_nor/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_nor/PrintPS.csv
new file mode 100644
index 0000000..f755645
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_nor/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,1.0
+0.0,1.0,0.0,0.0
+1.0,0.0,0.0,0.0
+1.0,1.0,0.0,0.0
+0.0,0.0,1.0,0.0
+0.0,1.0,1.0,0.0
+1.0,0.0,1.0,0.0
+1.0,1.0,1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_not/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_not/PrintPS.csv
new file mode 100644
index 0000000..1a9244c
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_not/PrintPS.csv
@@ -0,0 +1,3 @@
+BE1,TOP
+0.0,1.0
+1.0,0.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_or/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_or/PrintPS.csv
new file mode 100644
index 0000000..3cbc328
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_or/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+1.0,0.0,0.0,1.0
+1.0,1.0,0.0,1.0
+0.0,0.0,1.0,1.0
+0.0,1.0,1.0,1.0
+1.0,0.0,1.0,1.0
+1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_or_houseEvent/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_or_houseEvent/PrintPS.csv
new file mode 100644
index 0000000..73ef5a6
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_or_houseEvent/PrintPS.csv
@@ -0,0 +1,5 @@
+BE2,BE1,TOP
+0.0,0.0,1.0
+1.0,0.0,1.0
+0.0,1.0,1.0
+1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_xor/PrintPS.csv b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_xor/PrintPS.csv
new file mode 100644
index 0000000..6c36e72
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/gold/FTimporter_xor/PrintPS.csv
@@ -0,0 +1,9 @@
+BE2,BE3,BE1,TOP
+0.0,0.0,0.0,0.0
+0.0,1.0,0.0,1.0
+1.0,0.0,0.0,1.0
+1.0,1.0,0.0,0.0
+0.0,0.0,1.0,1.0
+0.0,1.0,1.0,0.0
+1.0,0.0,1.0,0.0
+1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and.xml
new file mode 100644
index 0000000..35ae65d
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_and</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_and</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_and.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT.xml
new file mode 100644
index 0000000..ad185d9
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_and_withNOT</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_and_withNOT</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_and_NOT.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT_embedded.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT_embedded.xml
new file mode 100644
index 0000000..3883b06
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT_embedded.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_and_withNOT_embedded</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_and_withNOT_embedded</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_and_NOT_embedded.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT_withNOT_embedded.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT_withNOT_embedded.xml
new file mode 100644
index 0000000..8886128
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_and_withNOT_withNOT_embedded.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_and_withNOT_withNOT_embedded</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_and_withNOT_withNOT_embedded.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_atleast.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_atleast.xml
new file mode 100644
index 0000000..0a79239
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_atleast.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_atleast</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_atleast</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_atleast.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3,BE4</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_cardinality.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_cardinality.xml
new file mode 100644
index 0000000..225f96b
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_cardinality.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_cardinality</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_cardinality</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_cardinality.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3,BE4,BE5</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_component.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_component.xml
new file mode 100644
index 0000000..49d8a9a
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_component.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_component</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_component</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT1.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3,BE4</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_doubleNot.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_doubleNot.xml
new file mode 100644
index 0000000..cfb229d
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_doubleNot.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_doubleNot</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_doubleNot</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FTimporter_doubleNot.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_iff.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_iff.xml
new file mode 100644
index 0000000..013d8cb
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_iff.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_iff</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_iff</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_iff.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_imply.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_imply.xml
new file mode 100644
index 0000000..60da53b
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_imply.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_impy</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_imply</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_imply.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_multipleFTs.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_multipleFTs.xml
new file mode 100644
index 0000000..9276a36
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_multipleFTs.xml
@@ -0,0 +1,60 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_multipleFTs</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_multipleFTs</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="trans_model_data" type="">trans_model_data.xml</Input>
+    <Input name="trans_one" type="">trans_one.xml</Input>
+    <Input name="trans_two" type="">trans_two.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TransOne</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >trans_model_data</Input>
+      <Input   class="Files"        type=""                >trans_one</Input>
+      <Input   class="Files"        type=""                >trans_two</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>A,B</Input>
+      <Output>TransOne</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_nand.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_nand.xml
new file mode 100644
index 0000000..05ed958
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_nand.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_nand</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_nand</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_nand.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_nor.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_nor.xml
new file mode 100644
index 0000000..7f6cbb9
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_nor.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_nor</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_nor</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_nor.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_not.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_not.xml
new file mode 100644
index 0000000..9d8675b
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_not.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_not</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_not</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FTimporter_not.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_or.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_or.xml
new file mode 100644
index 0000000..848cd38
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_or.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_or</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_or</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_or.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_or_houseEvent.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_or_houseEvent.xml
new file mode 100644
index 0000000..7bb47e1
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_or_houseEvent.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_or_houseEvent</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_or_houseEvent</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_or_houseEvent.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_xor.xml b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_xor.xml
new file mode 100644
index 0000000..0006184
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/test_FTimporter_xor.xml
@@ -0,0 +1,56 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/FTimporterPostProcessor.FTimporter_xor</name>
+    <author>mandd</author>
+    <created>2017-11-07</created>
+    <classesTested>ETimporter</classesTested>
+    <description>
+      Tests of the FTImporter post-processor: it read a fault-tree (ET) from an .xml file (eventTree.xml) and it imports
+      the FT structure into a PointSet. Note that the FT needs to be in an OpenPSA format.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>FTimporter_xor</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="faultTreeTest" type="">FT_xor.xml</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="FTimporter" subType="SR2ML.FTImporter">
+      <fileFormat>OpenPSA</fileFormat>
+      <topEventID>TOP</topEventID>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type=""                >faultTreeTest</Input>
+      <Model   class="Models"       type="PostProcessor"   >FTimporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >FT_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >FT_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>FT_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="FT_PS">
+      <Input>BE1,BE2,BE3</Input>
+      <Output>TOP</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/FTimporterPostProcessor/tests b/tests/PostProcessors/FTimporterPostProcessor/tests
new file mode 100644
index 0000000..e22c093
--- /dev/null
+++ b/tests/PostProcessors/FTimporterPostProcessor/tests
@@ -0,0 +1,87 @@
+[Tests]
+  [./FTimporter_and]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_and.xml'
+    csv    = 'FTimporter_and/PrintPS.csv'
+  [../]
+  [./FTimporter_and_withNOT]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_and_withNOT.xml'
+    csv    = 'FTimporter_and_withNOT/PrintPS.csv'
+  [../]
+  [./FTimporter_and_withNOT_embedded]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_and_withNOT_embedded.xml'
+    csv    = 'FTimporter_and_withNOT_embedded/PrintPS.csv'
+  [../]
+  [./FTimporter_and_withNOT_withNOT_embedded]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_and_withNOT_withNOT_embedded.xml'
+    csv    = 'FTimporter_and_withNOT_withNOT_embedded/PrintPS.csv'
+  [../]
+  [./FTimporter_atleast]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_atleast.xml'
+    csv    = 'FTimporter_atleast/PrintPS.csv'
+  [../]
+  [./FTimporter_cardinality]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_cardinality.xml'
+    csv    = 'FTimporter_cardinality/PrintPS.csv'
+  [../]
+  [./FTimporter_component]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_component.xml'
+    csv    = 'FTimporter_component/PrintPS.csv'
+  [../]
+  [./FTimporter_iff]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_iff.xml'
+    csv    = 'FTimporter_iff/PrintPS.csv'
+  [../]
+  [./FTimporter_imply]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_imply.xml'
+    csv    = 'FTimporter_imply/PrintPS.csv'
+  [../]
+  [./FTimporter_multipleFTs]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_multipleFTs.xml'
+    csv    = 'FTimporter_multipleFTs/PrintPS.csv'
+  [../]
+  [./FTimporter_nand]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_nand.xml'
+    csv    = 'FTimporter_nand/PrintPS.csv'
+  [../]
+  [./FTimporter_nor]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_nor.xml'
+    csv    = 'FTimporter_nor/PrintPS.csv'
+  [../]
+  [./FTimporter_or]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_or.xml'
+    csv    = 'FTimporter_or/PrintPS.csv'
+  [../]
+  [./FTimporter_or_houseEvent]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_or_houseEvent.xml'
+    csv    = 'FTimporter_or_houseEvent/PrintPS.csv'
+  [../]
+  [./FTimporter_xor]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_xor.xml'
+    csv    = 'FTimporter_xor/PrintPS.csv'
+  [../]
+  [./FTimporter_not]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_not.xml'
+    csv    = 'FTimporter_not/PrintPS.csv'
+  [../]
+  [./FTimporter_doubleNot]
+    type   = 'RavenFramework'
+    input  = 'test_FTimporter_doubleNot.xml'
+    csv    = 'FTimporter_doubleNot/PrintPS.csv'
+  [../]
+[]
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/MCSimporter/BElist.csv b/tests/PostProcessors/MCSimporterPostProcessor/MCSimporter/BElist.csv
new file mode 100644
index 0000000..6bb84bc
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/MCSimporter/BElist.csv
@@ -0,0 +1,12 @@
+Description,Model Type,Phase,Calc Prob
+ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN, RANDOM, CD,1.00E-01
+ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN, RANDOM, CD,2.00E-01
+ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN, RANDOM, CD,3.00E-01
+ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN, RANDOM, CD,1.00E-01
+FAILURE OF ACC INLET MOV 011 TO REMAIN OPEN, RANDOM, CD,2.00E-01
+FAILURE OF ACC INLET MOV 012 TO REMAIN OPEN, RANDOM, CD,3.00E-01
+FAILURE OF ACC INLET MOV 013 TO REMAIN OPEN, RANDOM, CD,1.00E-01
+4160 VAC BUS 1A FAILS, RANDOM, CD,2.00E-01
+480 VAC BUS 1A1 FAILS, RANDOM, CD,3.00E-01
+480 VAC BUS 1A2 FAILS, RANDOM, CD,1.00E-01
+480 VAC BUS 1A3 FAILS, RANDOM, CD,2.00E-01
\ No newline at end of file
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/MCSimporter/MCSlist.csv b/tests/PostProcessors/MCSimporterPostProcessor/MCSimporter/MCSlist.csv
new file mode 100644
index 0000000..a43ef52
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/MCSimporter/MCSlist.csv
@@ -0,0 +1,5 @@
+ID, Prob/Freq, Cut Set
+1,1.86E-02,ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN,480 VAC BUS 1A1 FAILS
+2,4.00E-03,ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN,480 VAC BUS 1A2 FAILS
+5,4.00E-03,ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN,480 VAC BUS 1A3 FAILS
+4,4.00E-04,ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN
\ No newline at end of file
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/MCSimporterNoExpand/MCSlist.csv b/tests/PostProcessors/MCSimporterPostProcessor/MCSimporterNoExpand/MCSlist.csv
new file mode 100644
index 0000000..a43ef52
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/MCSimporterNoExpand/MCSlist.csv
@@ -0,0 +1,5 @@
+ID, Prob/Freq, Cut Set
+1,1.86E-02,ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN,480 VAC BUS 1A1 FAILS
+2,4.00E-03,ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN,480 VAC BUS 1A2 FAILS
+5,4.00E-03,ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN,480 VAC BUS 1A3 FAILS
+4,4.00E-04,ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN
\ No newline at end of file
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/gold/MCSimporter/PrintPS.csv b/tests/PostProcessors/MCSimporterPostProcessor/gold/MCSimporter/PrintPS.csv
new file mode 100644
index 0000000..1335be1
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/gold/MCSimporter/PrintPS.csv
@@ -0,0 +1,5 @@
+ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN,ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN,ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN,FAILURE OF ACC INLET MOV 011 TO REMAIN OPEN,FAILURE OF ACC INLET MOV 012 TO REMAIN OPEN,FAILURE OF ACC INLET MOV 013 TO REMAIN OPEN,ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN,4160 VAC BUS 1A FAILS,480 VAC BUS 1A1 FAILS,480 VAC BUS 1A2 FAILS,480 VAC BUS 1A3 FAILS,MCS_ID,probability,out
+1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.86E-02,1.0
+0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,2,4.00E-03,1.0
+0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,5,4.00E-03,1.0
+0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,4,4.00E-04,1.0
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/gold/MCSimporterNoExpand/PrintPS.csv b/tests/PostProcessors/MCSimporterPostProcessor/gold/MCSimporterNoExpand/PrintPS.csv
new file mode 100644
index 0000000..2b225bb
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/gold/MCSimporterNoExpand/PrintPS.csv
@@ -0,0 +1,5 @@
+ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN,ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN,ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN,ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN,480 VAC BUS 1A1 FAILS,480 VAC BUS 1A2 FAILS,480 VAC BUS 1A3 FAILS,MCS_ID,probability,out
+1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.86E-02,1.0
+0.0,1.0,0.0,0.0,0.0,1.0,0.0,2,4.00E-03,1.0
+0.0,0.0,1.0,0.0,0.0,0.0,1.0,5,4.00E-03,1.0
+0.0,0.0,0.0,1.0,0.0,0.0,0.0,4,4.00E-04,1.0
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/test_MCSimporter.xml b/tests/PostProcessors/MCSimporterPostProcessor/test_MCSimporter.xml
new file mode 100644
index 0000000..f676ac7
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/test_MCSimporter.xml
@@ -0,0 +1,64 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/MCSimporterPostProcessor.MCSimporter</name>
+    <author>mandd</author>
+    <created>2019-11-01</created>
+    <classesTested>MCSImporter</classesTested>
+    <description>
+      Tests of the MCSImporter post-processor: it reads a list of MCSs generated from Saphire and it imports it as a PointSet.
+      We specifically test the capability to expand the list of Basic Events from an external file.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>MCSimporter</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="MCSlistFile" type="MCSlist">MCSlist.csv</Input>
+    <Input name="BElistFile"  type="BElist" >BElist.csv</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="MCSImporter" subType="SR2ML.MCSImporter">
+      <expand>True</expand>
+      <BElistColumn>Description</BElistColumn>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type="MCSlist"         >MCSlistFile</Input>
+      <Input   class="Files"        type="BElist"          >BElistFile</Input>
+      <Model   class="Models"       type="PostProcessor"   >MCSImporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >MCS_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >MCS_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>MCS_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="MCS_PS">
+      <Input> ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN,ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN,ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN,
+              FAILURE OF ACC INLET MOV 011 TO REMAIN OPEN,FAILURE OF ACC INLET MOV 012 TO REMAIN OPEN,FAILURE OF ACC INLET MOV 013 TO REMAIN OPEN,
+              ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN,
+              4160 VAC BUS 1A FAILS,
+              480 VAC BUS 1A1 FAILS,
+              480 VAC BUS 1A2 FAILS,
+              480 VAC BUS 1A3 FAILS </Input>
+      <Output> MCS_ID,probability,out </Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/test_MCSimporter_noExpand.xml b/tests/PostProcessors/MCSimporterPostProcessor/test_MCSimporter_noExpand.xml
new file mode 100644
index 0000000..f9f429c
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/test_MCSimporter_noExpand.xml
@@ -0,0 +1,58 @@
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/MCSimporterPostProcessor.MCSimporter_noExpand</name>
+    <author>mandd</author>
+    <created>2019-11-01</created>
+    <classesTested>MCSImporter</classesTested>
+    <description>
+      Tests of the MCSImporter post-processor: it reads a list of MCSs generated from Saphire and it imports it as a PointSet.
+    </description>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>MCSimporterNoExpand</WorkingDir>
+    <Sequence>import,printOnFile</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="MCSlistFile" type="MCSlist">MCSlist.csv</Input>
+  </Files>
+
+  <Models>
+    <PostProcessor name="MCSImporter" subType="SR2ML.MCSImporter">
+      <expand>False</expand>
+    </PostProcessor>
+  </Models>
+
+  <Steps>
+    <PostProcess name="import">
+      <Input   class="Files"        type="MCSlist"         >MCSlistFile</Input>
+      <Model   class="Models"       type="PostProcessor"   >MCSImporter</Model>
+      <Output  class="DataObjects"  type="PointSet"        >MCS_PS</Output>
+    </PostProcess>
+    <IOStep name="printOnFile">
+      <Input   class="DataObjects"  type="PointSet"        >MCS_PS</Input>
+      <Output  class="OutStreams"   type="Print"           >PrintPS</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPS">
+      <type>csv</type>
+      <source>MCS_PS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="MCS_PS">
+      <Input> ACCUMLATOR 1 DISCHARGE CKV 001 FAILS TO OPEN,ACCUMLATOR 2 DISCHARGE CKV 002 FAILS TO OPEN,ACCUMLATOR 3 DISCHARGE CKV 003 FAILS TO OPEN,
+              ACCUMULATOR CKVS 2 OF 3 FAIL FROM COMMON CAUSE TO OPEN,
+              480 VAC BUS 1A1 FAILS,
+              480 VAC BUS 1A2 FAILS,
+              480 VAC BUS 1A3 FAILS </Input>
+      <Output>MCS_ID,probability,out </Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/MCSimporterPostProcessor/tests b/tests/PostProcessors/MCSimporterPostProcessor/tests
new file mode 100644
index 0000000..2116f1e
--- /dev/null
+++ b/tests/PostProcessors/MCSimporterPostProcessor/tests
@@ -0,0 +1,12 @@
+[Tests]
+  [./MCSimporter]
+    type   = 'RavenFramework'
+    input  = 'test_MCSimporter.xml'
+    csv    = 'MCSimporter/PrintPS.csv'
+  [../]
+  [./MCSimporter_noExpand]
+    type   = 'RavenFramework'
+    input  = 'test_MCSimporter_noExpand.xml'
+    csv    = 'MCSimporterNoExpand/PrintPS.csv'
+  [../]
+[]
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscrete/modelTHreduced.py b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscrete/modelTHreduced.py
new file mode 100644
index 0000000..bf60b7a
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscrete/modelTHreduced.py
@@ -0,0 +1,50 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import numpy as np
+import math
+
+def initialize(self,runInfoDict,inputFiles):
+  return
+
+def run(self,Input):
+  pump1Time       = Input['pump1Time'][0]
+  pump2Time       = Input['pump2Time'][0]
+  valveTime       = Input['valveTime'][0]
+
+  self.failureTime = min(valveTime,(pump1Time+pump2Time))
+
+  # failure time 100%:  9.528*60.0
+  # failure time 120%: 10.128*60.0
+
+  if self.failureTime<9.528*60.0:
+    self.outcome = 1
+    self.Tmax = 1600.0
+  else:
+    self.outcome = 0
+    self.Tmax = 800.0
+
+  if pump1Time<1440.0:
+    self.pump1State = 1
+  else:
+    self.pump1State = 0
+
+  if pump2Time<1440.0:
+    self.pump2State = 1
+  else:
+    self.pump2State = 0
+
+  if valveTime<1440.0:
+    self.valveState = 1
+  else:
+    self.valveState = 0
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscreteMultipleIE/model1.py b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscreteMultipleIE/model1.py
new file mode 100644
index 0000000..58fca52
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscreteMultipleIE/model1.py
@@ -0,0 +1,29 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+def run(self,Input):
+  """
+    Method that implement a simple system with two components (B and C) in a parallel configuration followed by a component in series (A)
+    @ In, Input, dict, dictionary containing the data
+    @ Out, outcome, float, logical status of the system given status of the components
+  """
+  Astatus   = Input['Astatus'][0]
+  Bstatus   = Input['Bstatus'][0]
+  Cstatus   = Input['Cstatus'][0]
+
+  if (Astatus == 1.0) or (Bstatus == 1.0 and Cstatus == 1.0):
+    self.outcome = 1.0
+  else:
+    self.outcome = 0.0
+
+  return self.outcome
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscreteMultipleIE/model2.py b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscreteMultipleIE/model2.py
new file mode 100644
index 0000000..2b9b1f4
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresDiscreteMultipleIE/model2.py
@@ -0,0 +1,29 @@
+# Copyright 2017 Battelle Energy Alliance, LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+def run(self,Input):
+  """
+    Method that implement a simple system with three components in a parallel configuration
+    @ In, Input, dict, dictionary containing the data
+    @ Out, outcome, float, logical status of the system given status of the components
+  """
+  Bstatus   = Input['Bstatus'][0]
+  Cstatus   = Input['Cstatus'][0]
+  Dstatus   = Input['Dstatus'][0]
+
+  if (Bstatus == 1.0 and Cstatus == 1.0 and Dstatus==1.0):
+    self.outcome = 1.0
+  else:
+    self.outcome = 0.0
+
+  return self.outcome
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump.csv b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump.csv
new file mode 100644
index 0000000..4fffca4
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump.csv
@@ -0,0 +1,2 @@
+x0,filename
+1,testPrintHistorySet_dump_0.csv
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump.xml b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump.xml
new file mode 100644
index 0000000..342a0f1
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump.xml
@@ -0,0 +1,1 @@
+<data name="testPrintHistorySet_dump" type="HistorySet"><input>y0,x0,z0</input><output>y,x,z,time</output><inputFilename>testPrintHistorySet_dump.csv</inputFilename></data>
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump_0.csv b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump_0.csv
new file mode 100644
index 0000000..9c579d8
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/RiskMeasuresTimeDep/testPrintHistorySet_dump_0.csv
@@ -0,0 +1,34 @@
+Astatus,Bstatus,time
+1,1,0
+1,1,0.5
+1,1,1
+1,1,1.5
+1,1,2
+1,1,2.5
+1,1,3
+1,1,3.5
+1,0,4
+1,0,4.5
+1,0,5
+1,0,5.5
+1,0,6
+1,0,6.5
+1,0,7
+1,0,7.5
+1,0,8
+0,1,8.5
+0,1,9
+0,1,9.5
+0,1,10
+0,1,10.5
+0,1,11
+0,1,11.5
+0,1,12
+0,0,12.5
+0,0,13
+0,0,13.5
+0,0,14
+0,0,14.5
+0,0,15
+0,0,15.5
+0,0,16
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresDiscrete/PrintPPS_dump.csv b/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresDiscrete/PrintPPS_dump.csv
new file mode 100644
index 0000000..9af6708
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresDiscrete/PrintPPS_dump.csv
@@ -0,0 +1,2 @@
+pump1Time_B,pump2Time_B,valveTime_B,pump1Time_FV,pump2Time_FV,valveTime_FV,pump1Time_RAW,pump2Time_RAW,valveTime_RAW,pump1Time_RRW,pump2Time_RRW,valveTime_RRW,PointProbability,ProbabilityWeight,prefix,ProbabilityWeight-pump2Time,ProbabilityWeight-valveTime,ProbabilityWeight-pump1Time
+0.0666666666667,-0.0833333333333,0.666666666667,-0.666666666667,-0.666666666667,-0.666666666667,2.0,1.25,5.0,0.6,0.6,0.6,1.0,1.0,1.0,1.0,1.0,1.0
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresDiscreteMultipleIE/PrintPPS_dump.csv b/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresDiscreteMultipleIE/PrintPPS_dump.csv
new file mode 100644
index 0000000..b0ac0e9
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresDiscreteMultipleIE/PrintPPS_dump.csv
@@ -0,0 +1,2 @@
+Astatus_FV,Bstatus_FV,Cstatus_FV,Dstatus_FV,Astatus_RAW,Bstatus_RAW,Cstatus_RAW,Dstatus_RAW,Astatus_RRW,Bstatus_RRW,Cstatus_RRW,Dstatus_RRW
+0.656765676568,0.339933993399,0.339933993399,0.013201320132,66.0198019802,7.45874587459,4.05940594059,1.64686468647,2.91346153846,1.515,1.515,1.01337792642
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresTimeDep/PrintHS_0.csv b/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresTimeDep/PrintHS_0.csv
new file mode 100644
index 0000000..425b551
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/gold/RiskMeasuresTimeDep/PrintHS_0.csv
@@ -0,0 +1,34 @@
+Bstatus_RAW,Cstatus_FV,Astatus_RAW,Astatus_FV,Bstatus_FV,Bstatus_RRW,Cstatus_RAW,Astatus_RRW,time,R0,Cstatus_RRW
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,0.0,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,0.5,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,1.0,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,1.5,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,2.0,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,2.5,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,3.0,0.01495,1.495
+7.29096989967,0.33110367893,66.889632107,0.665551839465,0.33110367893,1.495,3.97993311037,2.99,3.5,0.01495,1.495
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,4.0,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,4.5,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,5.0,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,5.5,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,6.0,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,6.5,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,7.0,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,7.5,0.109,10.9
+1.0,0.908256880734,9.17431192661,0.0825688073394,-1.273191542e-16,1.0,9.17431192661,1.09,8.0,0.109,10.9
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,8.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,9.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,9.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,10.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,10.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,11.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,11.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,12.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,12.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,13.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,13.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,14.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,14.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,15.0,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,15.5,1.0,1.0
+1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,16.0,1.0,1.0
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMeasuresDiscrete.xml b/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMeasuresDiscrete.xml
new file mode 100644
index 0000000..bfbcdff
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMeasuresDiscrete.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" ?>
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/InterfacedPostProcessor/RiskMeasuresDiscrete</name>
+    <author>mandd</author>
+    <created>2016-10-31</created>
+    <classesTested>InterfacedPostProcessor</classesTested>
+    <description>
+      Tests of the four risk importance measures: Risk Achievement Worth (RAW), Risk Reduction Worth (RRW), Birnbaum (B) and Fussell-Vesely (FV)
+    </description>
+    <revisions>
+      <revision author="wangc" date="2021-04-22">
+        Move 'RiskMeasuresDiscrete' from InterfacedPostProcessor to Plugin-Type PostProcessor.
+        The subType of this PostProcessor will be changed to 'RiskMeasuresDiscrete',
+        and the 'method' node under this PostProcessor is no longer needed.
+      </revision>
+    </revisions>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>RiskMeasuresDiscrete</WorkingDir>
+    <Sequence>FirstMRun,PP</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Files>
+    <Input name="lorentzAttractor.py" type="">lorentzAttractor.py</Input>
+  </Files>
+
+  <Models>
+    <ExternalModel name='PythonModuleReduced' subType='' ModuleToLoad='modelTHreduced'>
+      <variables>pump1Time,pump2Time,valveTime,Tmax,outcome,pump1State,pump2State,valveState,failureTime</variables>
+    </ExternalModel>
+    <PostProcessor name="riskMeasuresDiscrete" subType="SR2ML.RiskMeasuresDiscrete">
+      <measures>B,FV,RAW,RRW</measures>
+      <variable R0values='0,240' R1values='1441,2880'>pump1Time</variable>
+      <variable R0values='0,240' R1values='1441,2880'>pump2Time</variable>
+      <variable R0values='0,240' R1values='1441,2880'>valveTime</variable>
+      <target   values='1400,14000'>Tmax</target>
+    </PostProcessor>
+  </Models>
+
+  <Distributions>
+    <Exponential name='valveTime_distExp'>
+      <lambda>0.00069444</lambda>
+    </Exponential>
+    <Exponential name='pump1Time_distExp'>
+      <lambda>0.00138889</lambda>
+    </Exponential>
+    <Exponential name='pump2Time_distExp'>
+      <lambda>0.00138889</lambda>
+    </Exponential>
+  </Distributions>
+
+  <Samplers>
+    <MonteCarlo name='MC'>
+      <samplerInit>
+        <limit>20</limit>
+      </samplerInit>
+      <variable name='valveTime'>
+        <distribution>valveTime_distExp</distribution>
+      </variable>
+      <variable name='pump1Time'>
+        <distribution>pump1Time_distExp</distribution>
+      </variable>
+      <variable name='pump2Time'>
+        <distribution>pump2Time_distExp</distribution>
+      </variable>
+    </MonteCarlo>
+  </Samplers>
+
+  <Steps>
+    <MultiRun name="FirstMRun" pauseAtEnd="True">
+      <Input   class="DataObjects"  type="PointSet"        >inputPlaceHolder</Input>
+      <Model   class="Models"       type="ExternalModel"   >PythonModuleReduced</Model>
+      <Sampler class="Samplers"     type="MonteCarlo"      >MC</Sampler>
+      <Output  class="DataObjects"  type="PointSet"        >outRun</Output>
+    </MultiRun>
+    <PostProcess name="PP">
+      <Input   class="DataObjects"  type="PointSet"        >outRun</Input>
+      <Model   class="Models"       type="PostProcessor"   >riskMeasuresDiscrete</Model>
+      <Output  class="DataObjects"  type="PointSet"        >outPPS</Output>
+      <Output  class="OutStreams"   type="Print"           >PrintPPS_dump</Output>
+    </PostProcess>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPPS_dump">
+      <type>csv</type>
+      <source>outPPS</source>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="inputPlaceHolder">
+      <Input>pump1Time,pump2Time,valveTime</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <PointSet name="outRun">
+      <Input>pump1Time,pump2Time,valveTime</Input>
+      <Output>Tmax,outcome,failureTime</Output>
+    </PointSet>
+    <PointSet name="outPPS">
+      <Output>pump1Time_B   , pump2Time_B   , valveTime_B,
+              pump1Time_FV  , pump2Time_FV  , valveTime_FV,
+              pump1Time_RAW , pump2Time_RAW , valveTime_RAW,
+              pump1Time_RRW , pump2Time_RRW , valveTime_RRW</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMeasuresDiscreteMultipleIE.xml b/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMeasuresDiscreteMultipleIE.xml
new file mode 100644
index 0000000..62cda41
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMeasuresDiscreteMultipleIE.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" ?>
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/InterfacedPostProcessor/RiskMeasuresDiscreteMultipleIE</name>
+    <author>mandd</author>
+    <created>2017-02-23</created>
+    <classesTested>InterfacedPostProcessor</classesTested>
+    <description>
+      Tests of the four risk importance measures for multiple IEs: Risk Achievement Worth (RAW), Risk Reduction Worth (RRW), Birnbaum (B) and Fussell-Vesely (FV)
+    </description>
+    <revisions>
+      <revision author="wangc" date="2021-04-22">
+        Move 'RiskMeasuresDiscrete' from InterfacedPostProcessor to Plugin-Type PostProcessor.
+        The subType of this PostProcessor will be changed to 'RiskMeasuresDiscrete',
+        and the 'method' node under this PostProcessor is no longer needed.
+      </revision>
+    </revisions>
+  </TestInfo>
+
+  <RunInfo>
+    <WorkingDir>RiskMeasuresDiscreteMultipleIE</WorkingDir>
+    <Sequence>Run1,Run2,PP</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Models>
+    <ExternalModel name='model1' subType='' ModuleToLoad='model1'>
+      <variables>Astatus,Bstatus,Cstatus,outcome</variables>
+    </ExternalModel>
+    <ExternalModel name='model2' subType='' ModuleToLoad='model2'>
+      <variables>Bstatus,Cstatus,Dstatus,outcome</variables>
+    </ExternalModel>
+    <PostProcessor name="riskMeasuresDiscrete" subType="SR2ML.RiskMeasuresDiscrete">
+      <measures>B,FV,RAW,RRW</measures>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Astatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Bstatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Cstatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Dstatus</variable>
+      <target   values='0.9,1.1'>outcome</target>
+      <data     freq='0.01'>outRun1</data>
+      <data     freq='0.02'>outRun2</data>
+    </PostProcessor>
+  </Models>
+
+  <Distributions>
+    <Bernoulli name='Adist'>
+      <p>0.01</p>
+    </Bernoulli>
+    <Bernoulli name='Bdist'>
+      <p>0.05</p>
+    </Bernoulli>
+    <Bernoulli name='Cdist'>
+      <p>0.1</p>
+    </Bernoulli>
+    <Bernoulli name='Ddist'>
+      <p>0.02</p>
+    </Bernoulli>
+  </Distributions>
+
+  <Samplers>
+    <Grid name='Grid1'>
+      <variable name='Astatus'>
+        <distribution>Adist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+      <variable name='Bstatus'>
+        <distribution>Bdist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+      <variable name='Cstatus'>
+        <distribution>Cdist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+    </Grid>
+    <Grid name='Grid2'>
+      <variable name='Bstatus'>
+        <distribution>Bdist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+      <variable name='Cstatus'>
+        <distribution>Cdist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+      <variable name='Dstatus'>
+        <distribution>Ddist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+    </Grid>
+  </Samplers>
+
+  <Steps>
+    <MultiRun name="Run1">
+      <Input   class="DataObjects"  type="PointSet"        >inputPlaceHolder1</Input>
+      <Model   class="Models"       type="ExternalModel"   >model1</Model>
+      <Sampler class="Samplers"     type="Grid"            >Grid1</Sampler>
+      <Output  class="DataObjects"  type="PointSet"        >outRun1</Output>
+    </MultiRun>
+    <MultiRun name="Run2" pauseAtEnd="True">
+      <Input   class="DataObjects"  type="PointSet"        >inputPlaceHolder2</Input>
+      <Model   class="Models"       type="ExternalModel"   >model2</Model>
+      <Sampler class="Samplers"     type="Grid"            >Grid2</Sampler>
+      <Output  class="DataObjects"  type="PointSet"        >outRun2</Output>
+    </MultiRun>
+    <PostProcess name="PP">
+      <Input   class="DataObjects"  type="PointSet"        >outRun1</Input>
+      <Input   class="DataObjects"  type="PointSet"        >outRun2</Input>
+      <Model   class="Models"       type="PostProcessor"   >riskMeasuresDiscrete</Model>
+      <Output  class="DataObjects"  type="PointSet"        >outPPS</Output>
+      <Output  class="OutStreams"   type="Print"           >PrintPPS_dump</Output>
+    </PostProcess>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintPPS_dump">
+      <type>csv</type>
+      <source>outPPS</source>
+      <what>input, output</what>
+    </Print>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="inputPlaceHolder1">
+      <Input>Astatus,Bstatus,Cstatus</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <PointSet name="outRun1">
+      <Input>Astatus,Bstatus,Cstatus</Input>
+      <Output>outcome</Output>
+    </PointSet>
+    <PointSet name="inputPlaceHolder2">
+      <Input>Bstatus,Cstatus,Dstatus</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <PointSet name="outRun2">
+      <Input>Bstatus,Cstatus,Dstatus</Input>
+      <Output>outcome</Output>
+    </PointSet>
+    <PointSet name="outPPS">
+      <Output>Astatus_FV, Bstatus_FV, Cstatus_FV, Dstatus_FV, Astatus_RAW, Bstatus_RAW, Cstatus_RAW, Dstatus_RAW, Astatus_RRW, Bstatus_RRW, Cstatus_RRW, Dstatus_RRW</Output>
+    </PointSet>
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMonitor.xml b/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMonitor.xml
new file mode 100644
index 0000000..75a7c8c
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/test_riskMonitor.xml
@@ -0,0 +1,276 @@
+<?xml version="1.0" ?>
+<Simulation verbosity="debug">
+  <TestInfo>
+    <name>framework/PostProcessors/InterfacedPostProcessor/RiskMeasuresTimeDep</name>
+    <author>mandd</author>
+    <created>2017-02-23</created>
+    <classesTested>InterfacedPostProcessor</classesTested>
+    <description>
+      Tests of the four risk importance measures for time dependent data: Risk Achievement Worth (RAW),
+      Risk Reduction Worth (RRW), Birnbaum (B) and Fussell-Vesely (FV)
+    </description>
+    <revisions>
+      <revision author="wangc" date="2021-04-22">
+        Move 'RiskMeasuresDiscrete' from InterfacedPostProcessor to Plugin-Type PostProcessor.
+        The subType of this PostProcessor will be changed to 'RiskMeasuresDiscrete',
+        and the 'method' node under this PostProcessor is no longer needed.
+      </revision>
+    </revisions>
+  </TestInfo>
+
+  <Files>
+    <Input name="testPrintHistorySet_dump" type="">testPrintHistorySet_dump.csv</Input>
+  </Files>
+
+  <RunInfo>
+    <WorkingDir>RiskMeasuresTimeDep</WorkingDir>
+    <Sequence>LoadHS,Run1,PP,plot</Sequence>
+    <batchSize>1</batchSize>
+  </RunInfo>
+
+  <Models>
+    <ExternalModel name='model1' subType='' ModuleToLoad='../RiskMeasuresDiscreteMultipleIE/model1'>
+      <variables>Astatus,Bstatus,Cstatus,outcome</variables>
+    </ExternalModel>
+    <PostProcessor name="riskMeasuresDiscrete" subType="SR2ML.RiskMeasuresDiscrete">
+      <measures>B,FV,RAW,RRW,R0</measures>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Astatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Bstatus</variable>
+      <variable R1values='-0.1,0.1' R0values='0.9,1.1'>Cstatus</variable>
+      <target   values='0.9,1.1'>outcome</target>
+      <data     freq='1.0'>outRun1</data>
+      <temporalID>time</temporalID>
+    </PostProcessor>
+  </Models>
+
+  <Distributions>
+    <Bernoulli name='Adist'>
+      <p>0.01</p>
+    </Bernoulli>
+    <Bernoulli name='Bdist'>
+      <p>0.05</p>
+    </Bernoulli>
+    <Bernoulli name='Cdist'>
+      <p>0.1</p>
+    </Bernoulli>
+    <Bernoulli name='Ddist'>
+      <p>0.02</p>
+    </Bernoulli>
+  </Distributions>
+
+  <Samplers>
+    <Grid name='Grid1'>
+      <variable name='Astatus'>
+        <distribution>Adist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+      <variable name='Bstatus'>
+        <distribution>Bdist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+      <variable name='Cstatus'>
+        <distribution>Cdist</distribution>
+        <grid type='value' construction='custom'>0.0 1.0</grid>
+      </variable>
+    </Grid>
+  </Samplers>
+
+  <Steps>
+		<IOStep      name='LoadHS'>
+		  <Input     class='Files'        type=''                >testPrintHistorySet_dump</Input>
+		  <Output    class='DataObjects'  type='HistorySet'      >timeDepProfiles</Output>
+		</IOStep>
+    <MultiRun    name="Run1" pauseAtEnd="True">
+      <Input     class="DataObjects"  type="PointSet"        >inputPlaceHolder1</Input>
+      <Model     class="Models"       type="ExternalModel"   >model1</Model>
+      <Sampler   class="Samplers"     type="Grid"            >Grid1</Sampler>
+      <Output    class="DataObjects"  type="PointSet"        >outRun1</Output>
+    </MultiRun>
+    <PostProcess name="PP">
+      <Input     class="DataObjects"  type="PointSet"        >outRun1</Input>
+      <Input     class="DataObjects"  type="HistorySet"      >timeDepProfiles</Input>
+      <Model     class="Models"       type="PostProcessor"   >riskMeasuresDiscrete</Model>
+      <Output    class="DataObjects"  type="HistorySet"      >outHS</Output>
+      <Output    class="OutStreams"   type="Print"           >PrintHS</Output>
+    </PostProcess>
+    <IOStep      name="plot">
+      <Input     class="DataObjects"  type="HistorySet"      >outHS</Input>
+      <Input     class='DataObjects'  type='HistorySet'      >timeDepProfiles</Input>
+      <Output    class="OutStreams"   type="Plot"            >plotStatus</Output>
+      <Output    class="OutStreams"   type="Plot"            >plotFV</Output>
+      <Output    class="OutStreams"   type="Plot"            >plotRRW</Output>
+      <Output    class="OutStreams"   type="Plot"            >plotRAW</Output>
+      <Output    class="OutStreams"   type="Plot"            >plotR0</Output>
+    </IOStep>
+  </Steps>
+
+  <OutStreams>
+    <Print name="PrintHS">
+      <type>csv</type>
+      <source>outHS</source>
+    </Print>
+    <Plot  name="plotStatus" overwrite="False">
+      <plotSettings>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>timeDepProfiles|Output|time</x>
+          <y>timeDepProfiles|Output|Astatus</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>timeDepProfiles|Output|time</x>
+          <y>timeDepProfiles|Output|Bstatus</y>
+        </plot>
+        <xlabel>time</xlabel>
+        <ylabel>comp. status</ylabel>
+      </plotSettings>
+      <actions>
+        <how>pdf</how>
+      </actions>
+    </Plot>
+    <Plot  name="plotR0" overwrite="False">
+      <plotSettings>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|R0</y>
+        </plot>
+        <xlabel>time</xlabel>
+        <ylabel>R0</ylabel>
+      </plotSettings>
+      <actions>
+        <how>pdf</how>
+        <title>
+          <text>Plot R0</text>
+        </title>
+      </actions>
+    </Plot>
+    <Plot  name="plotFV" overwrite="False">
+      <plotSettings>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Astatus_FV</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Bstatus_FV</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Cstatus_FV</y>
+        </plot>
+        <xlabel>time</xlabel>
+        <ylabel>FV</ylabel>
+      </plotSettings>
+      <actions>
+        <how>pdf</how>
+        <title>
+          <text>Plot FV</text>
+        </title>
+      </actions>
+    </Plot>
+    <Plot  name="plotRAW" overwrite="False">
+      <plotSettings>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Astatus_RAW</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Bstatus_RAW</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Cstatus_RAW</y>
+        </plot>
+        <xlabel>time</xlabel>
+        <ylabel>RAW</ylabel>
+      </plotSettings>
+      <actions>
+        <how>pdf</how>
+        <title>
+          <text>Plot RAW</text>
+        </title>
+      </actions>
+    </Plot>
+    <Plot  name="plotRRW" overwrite="False">
+      <plotSettings>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Astatus_RRW</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Bstatus_RRW</y>
+        </plot>
+        <plot>
+          <type>line</type>
+          <interpPointsX>1000</interpPointsX>
+          <x>outHS|Output|time</x>
+          <y>outHS|Output|Cstatus_RRW</y>
+        </plot>
+        <xlabel>time</xlabel>
+        <ylabel>RRW</ylabel>
+      </plotSettings>
+      <actions>
+        <how>pdf</how>
+        <title>
+          <text>Plot RRW</text>
+        </title>
+      </actions>
+    </Plot>
+  </OutStreams>
+
+  <DataObjects>
+    <PointSet name="inputPlaceHolder1">
+      <Input>Astatus,Bstatus,Cstatus</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <PointSet name="outRun1">
+      <Input>Astatus,Bstatus,Cstatus</Input>
+      <Output>outcome</Output>
+    </PointSet>
+    <PointSet name="inputPlaceHolder2">
+      <Input>Bstatus,Cstatus,Dstatus</Input>
+      <Output>OutputPlaceHolder</Output>
+    </PointSet>
+    <PointSet name="outPPS">
+      <Input> Astatus_avg , Bstatus_avg , Cstatus_avg </Input>
+      <Output>Astatus_FV  , Bstatus_FV  , Cstatus_FV  ,
+              Astatus_RAW , Bstatus_RAW , Cstatus_RAW ,
+              Astatus_RRW , Bstatus_RRW , Cstatus_RRW  </Output>
+    </PointSet>
+    <HistorySet name="timeDepProfiles">
+      <Input>x0</Input>
+      <Output>Astatus,Bstatus,time</Output>
+    </HistorySet>
+    <HistorySet name="outHS">
+      <Input>x0</Input>
+      <Output>time , R0   ,
+              Astatus_FV  , Bstatus_FV  , Cstatus_FV  ,
+              Astatus_RAW , Bstatus_RAW , Cstatus_RAW ,
+              Astatus_RRW , Bstatus_RRW , Cstatus_RRW  </Output>
+    </HistorySet>
+
+  </DataObjects>
+
+</Simulation>
diff --git a/tests/PostProcessors/RiskMeasuresDiscrete/tests b/tests/PostProcessors/RiskMeasuresDiscrete/tests
new file mode 100644
index 0000000..b2cccd6
--- /dev/null
+++ b/tests/PostProcessors/RiskMeasuresDiscrete/tests
@@ -0,0 +1,17 @@
+[Tests]
+  [./RiskMeasuresDiscrete]
+    type   = 'RavenFramework'
+    input  = 'test_riskMeasuresDiscrete.xml'
+    csv    = 'RiskMeasuresDiscrete/PrintPPS_dump.csv'
+  [../]
+  [./RiskMeasuresDiscreteMultipleIE]
+    type   = 'RavenFramework'
+    input  = 'test_riskMeasuresDiscreteMultipleIE.xml'
+    csv    = 'RiskMeasuresDiscreteMultipleIE/PrintPPS_dump.csv'
+  [../]
+  [./RiskMeasuresDiscreteTimeDep]
+    type   = 'RavenFramework'
+    input  = 'test_riskMonitor.xml'
+    csv    = 'RiskMeasuresTimeDep/PrintHS_0.csv'
+  [../]
+[]