diff --git a/ruleEngines/metadatahooks.re b/ruleEngines/metadatahooks.re
new file mode 100644
index 0000000000000000000000000000000000000000..15a80bf4132e8133bd01e512c0cf27ec6af4d5f4
--- /dev/null
+++ b/ruleEngines/metadatahooks.re
@@ -0,0 +1,106 @@
+######################################################
+# Metadata policies
+#
+# The tag "RESOURCE" is reserved for data objects only.
+# It can only take the values:
+#     disk, archive, dual
+#
+# The rules below replicate the data according to the
+# resource tag:
+#     disk: demoResc
+#     archive: 500Gvault
+#     dual: disk and archive
+# During the replication the data is always updated 
+# to the latest copy.
+#
+# Author: Christine Staiger (2021)
+#######################################################
+
+# Policy when metadata is newly created on data objects
+# add, adda, addw, set
+acPreProcForModifyAVUMetadata(
+    *Option,*ItemType,*ItemName,*AName,*AValue,*AUnit){
+    on(*AName == "RESOURCE" && (*AValue == 'archive' || *AValue == 'disk' || *AValue == 'dual')
+                            && *ItemType == "-d" && *Option!="rm" && *Option!="rmw" && *Option!="rmi"){
+        writeLine("serverLog", "PREPROCESSING: CREATE METADATA");
+        writeLine("serverLog",
+            "DEBUG *Option,*ItemType,*ItemName,*AName,*AValue,*AUnit");
+        rescPolicy(*ItemName, *AValue);
+    }
+}
+
+acPreProcForModifyAVUMetadata(
+    *Option,*ItemType,*ItemName,*AName,*AValue,*AUnit){
+    on(*AName != "RESOURCE" || *Option == "rm" || *Option == "rmw" || *Option == "rmi"){}
+}
+
+# Policy when metadata is modified on data objects
+acPreProcForModifyAVUMetadata(
+    *Option,*ItemType,*ItemName,*AName,*AValue,*AUnit, *NAName, *NAValue, *NAUnit){
+    on(*AName == "RESOURCE" && (*AValue == 'archive' || *AValue == 'disk' || *AValue == 'dual')
+                            && *ItemType == "-d"){
+        writeLine("serverLog", "PREPROCESSING: MODIFY METADATA");
+        writeLine("serverLog",
+            "DEBUG *Option,*ItemType,*ItemName,*AName,*AValue,*AUnit,*NAName,*NAValue,*NAUnit");
+        *newval = substr(*NAValue, 2, strlen(*NAValue));
+        writeLine("serverLog", *newval);
+        rescPolicy(*ItemName, *newval);
+    }
+}
+
+acPreProcForModifyAVUMetadata(
+    *Option,*ItemType,*ItemName,*AName,*AValue,*AUnit, *NAName, *NAValue, *NAUnit){
+    on(*AName != "RESOURCE"){}
+}
+
+# Policy for copying metadata --> doing nothing for the moment
+#acPreProcForModifyAVUMetadata(
+    #*Option,*SourceItemType,*TargetItemType,*SourceItemName,*TargetItemName){ 
+    #writeLine("serverLog", "PREPROCESSING: COPY METADATA");
+    #writeLine("serverLog",
+    #    "DEBUG *Option,*SourceItemType,*TargetItemType,*SourceItemName,*TargetItemName")
+#}
+
+# General reosurce policy for data objects
+rescPolicy(*abspath, *value){
+    on(*value == "archive"){
+        *archive = "500Gvault";
+        replicate(*abspath, *archive);
+        foreach(*row in select RESC_NAME where RESC_NAME != *archive){
+            *resc = *row.RESC_NAME;
+            writeLine("serverLog", "DEBUG msiDataObjTrim(*abspath, *resc, null, 1, null, state)");
+            errormsg(msiDataObjTrim(*abspath, *resc, "null", "1", "null", *state), *err);
+            writeLine("serverLog", "DEBUG TRIM: state *state, trimming error message --> *err");
+        }
+    }
+}
+
+rescPolicy(*abspath, *value){
+    on(*value == "disk" || *value == ""){
+        *disk = "demoResc";
+        replicate(*abspath, *disk);
+        foreach(*row in select RESC_NAME where RESC_NAME != *disk){
+            *resc = *row.RESC_NAME;
+            writeLine("serverLog", "DEBUG msiDataObjTrim(*abspath, *resc, null, 1, null, state)");
+            errormsg(msiDataObjTrim(*abspath, *resc, "null", "1", "null", *state), *err);
+            writeLine("serverLog", "DEBUG TRIM: state *state, trimming error message --> *err");
+        }
+    }
+}
+
+rescPolicy(*abspath, *value){
+    on(*value == "dual"){
+        *archive = "500Gvault";
+        *disk = "demoResc";
+        replicate(*abspath, *archive);
+        replicate(*abspath, *disk);
+    }
+}
+
+
+replicate(*abspath, *rescname){
+    writeLine("serverLog", "DEBUG REPLICATE: *abspath");
+    errormsg(msiDataObjRepl(*abspath, "destRescName=*rescname++++verifyChksum=", *state), *err);
+    writeLine("serverLog", "DEBUG REPLICATE: state *state, repl error message --> *err");
+}
+