diff --git a/modules/conop/src/diag.hh b/modules/conop/src/diag.hh
index 1e749f3d8953c5db0e673f335aa2134567b13480..ba7297dd63766ede1e5dd067852b99b61fd14cae 100644
--- a/modules/conop/src/diag.hh
+++ b/modules/conop/src/diag.hh
@@ -112,6 +112,12 @@ class Diagnostics;
 
 typedef boost::shared_ptr<Diagnostics> DiagnosticsPtr;
 
+
+class DLLEXPORT DiagError : public Error {
+public:
+  DiagError(const Diag& diag) : Error(diag.Format(false)) {}
+};
+
 class DLLEXPORT_OST_CONOP Diagnostics {
 public:
   typedef std::vector<Diag*>::iterator diag_iterator;
diff --git a/modules/conop/src/rule_based.cc b/modules/conop/src/rule_based.cc
index 7bde24ffd328d4394cb62c730c6500dd839ae262..862faffada08ba9b48f4cc9a8fced2b2fde3da1d 100644
--- a/modules/conop/src/rule_based.cc
+++ b/modules/conop/src/rule_based.cc
@@ -114,7 +114,7 @@ void RuleBasedProcessor::ProcessUnkResidue(DiagnosticsPtr diags,
             .AddResidue(res);
       break;
     case CONOP_FATAL:
-      // FIXME: Implement a ConopError based on Diag...
+      throw DiagError(Diag(DIAG_UNK_RESIDUE, "unknown residue %0").AddResidue(res));
       break;
     case CONOP_REMOVE_RESIDUE:
     case CONOP_REMOVE:
@@ -162,6 +162,7 @@ void RuleBasedProcessor::ProcessUnkAtoms(DiagnosticsPtr diags,
              .AddResidue(i->GetResidue()).AddString(i->GetName());
         break;
       case CONOP_FATAL:
+        throw DiagError(Diag(DIAG_UNK_ATOM, "unknown atom %0").AddAtom(*i));
         // FIXME: Implement a ConopError based on Diag...
         break;
       case CONOP_REMOVE_RESIDUE: