diff --git a/src/models/AbstractModel.h b/src/models/AbstractModel.h
new file mode 100644
index 000000000..1e7d6a32d
--- /dev/null
+++ b/src/models/AbstractModel.h
@@ -0,0 +1,47 @@
+#ifndef STORM_MODELS_ABSTRACTMODEL_H_
+#define STORM_MODELS_ABSTRACTMODEL_H_
+
+#include <memory>
+
+namespace storm {
+namespace models {
+
+/*!
+ *  @brief  Enumeration of all supported types of models.
+ */
+enum ModelType {
+    Unknown, DTMC, CTMC, MDP, CTMDP
+};
+/*
+// TODO: If we want this to work, it has to be in a cpp... :-)
+std::ostream& operator<<(std::ostream& os, const ModelType type)
+{
+    switch (type) {
+        case Unknown: os << "Unknown"; break;
+        case DTMC: os << "DTMC"; break;
+        case CTMC: os << "CTMC"; break;
+        case MDP: os << "MDP"; break;
+        case CTMDP: os << "CTMDP"; break;
+        default: os << "Invalid ModelType"; break;
+    }   
+    return os;
+}
+*/
+
+class AbstractModel {
+
+	public:
+		template <typename Model>
+		std::shared_ptr<Model> as() {
+			//return *dynamic_cast<Model*>(this);
+			return std::dynamic_pointer_cast<Model>(std::shared_ptr<AbstractModel>(this));
+		}
+		
+		virtual ModelType getType() = 0;
+		
+};
+
+} // namespace models
+} // namespace storm
+
+#endif /* STORM_MODELS_ABSTRACTMODEL_H_ */
\ No newline at end of file
diff --git a/src/models/Model.h b/src/models/Model.h
deleted file mode 100644
index fbb2da3de..000000000
--- a/src/models/Model.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef STORM_MODELS_MODEL_H_
-#define STORM_MODELS_MODEL_H_
-
-namespace storm {
-namespace models {
-
-class Model {
-};
-
-} // namespace models
-} // namespace storm
-
-#endif /* STORM_MODELS_MODEL_H_ */
\ No newline at end of file