diff --git a/libraries/shared/transformer/generic_transformer.go b/libraries/shared/transformer/generic_transformer.go
new file mode 100644
index 00000000..cba448ac
--- /dev/null
+++ b/libraries/shared/transformer/generic_transformer.go
@@ -0,0 +1,31 @@
+// VulcanizeDB
+// Copyright © 2018 Vulcanize
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+package transformer
+
+import (
+ "github.com/vulcanize/vulcanizedb/pkg/config"
+ "github.com/vulcanize/vulcanizedb/pkg/core"
+ "github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
+)
+
+type GenericTransformer interface {
+ Init() error
+ Execute() error
+ GetConfig() config.ContractConfig
+}
+
+type GenericTransformerInitializer func(db *postgres.DB, bc core.BlockChain) GenericTransformer
diff --git a/libraries/shared/watcher/generic_watcher.go b/libraries/shared/watcher/generic_watcher.go
new file mode 100644
index 00000000..2407f175
--- /dev/null
+++ b/libraries/shared/watcher/generic_watcher.go
@@ -0,0 +1,77 @@
+// VulcanizeDB
+// Copyright © 2018 Vulcanize
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+// Dynamic watcher is built with a more generic interface
+// that allows offloading more of the operatinal logic to
+// the transformers, allowing them to act more dynamically
+// Built to work primarily with the omni pkging
+package watcher
+
+import (
+ "fmt"
+
+ log "github.com/sirupsen/logrus"
+
+ "github.com/vulcanize/vulcanizedb/libraries/shared/transformer"
+ "github.com/vulcanize/vulcanizedb/pkg/core"
+ "github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
+)
+
+type GenericWatcher struct {
+ Transformers []transformer.GenericTransformer
+ DB *postgres.DB
+ BlockChain core.BlockChain
+}
+
+func NewGenericWatcher(db *postgres.DB, bc core.BlockChain) *GenericWatcher {
+ return &GenericWatcher{
+ DB: db,
+ BlockChain: bc,
+ }
+}
+
+func (watcher *GenericWatcher) AddTransformers(inits interface{}) error {
+ initializers, ok := inits.([]transformer.GenericTransformerInitializer)
+ if !ok {
+ return fmt.Errorf("initializers of type %T, not %T", inits, []transformer.GenericTransformerInitializer{})
+ }
+
+ watcher.Transformers = make([]transformer.GenericTransformer, 0, len(initializers))
+ for _, initializer := range initializers {
+ t := initializer(watcher.DB, watcher.BlockChain)
+ watcher.Transformers = append(watcher.Transformers, t)
+ }
+
+ for _, transformer := range watcher.Transformers {
+ err := transformer.Init()
+ if err != nil {
+ log.Print("Unable to initialize transformer:", transformer.GetConfig().Name, err)
+ return err
+ }
+ }
+ return nil
+}
+
+func (watcher *GenericWatcher) Execute(interface{}) error {
+ for _, transformer := range watcher.Transformers {
+ err := transformer.Execute()
+ if err != nil {
+ log.Error("Unable to execute transformer:", transformer.GetConfig().Name, err)
+ return err
+ }
+ }
+ return nil
+}