Repository: corazawaf/coraza
Pull request #475 (2022-10-26 06:13:54)

Remove many Get prefixes in interfaces
These were there to reduce the diff when introducing the interfaces but should be removed.

Will followup for `RuleMetadata` which will be less mechanical

codecov-commenter: # [Codecov](https://codecov.io/gh/corazawaf/coraza/pull/475?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf) Report
Base: **73.60**% // Head: **73.69**% // Increases project coverage by **`+0.09%`** :tada:
> Coverage data is based on head [(`5f4f3fb`)](https://codecov.io/gh/corazawaf/coraza/pull/475?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf) compared to base [(`5b0dfa2`)](https://codecov.io/gh/corazawaf/coraza/commit/5b0dfa270c3ab97ee729492dc6d5a876bf242167?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf).
> Patch coverage: 65.93% of modified lines in pull request are covered.

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##           v3/dev     #475      +/-   ##
==========================================
+ Coverage   73.60%   73.69%   +0.09%     
==========================================
  Files         146      146              
  Lines        6618     6618              
==========================================
+ Hits         4871     4877       +6     
+ Misses       1472     1466       -6     
  Partials      275      275              
```

| Flag | Coverage Δ | |
|---|---|---|
| no-tinygo | `73.63% <65.93%> (+0.09%)` | :arrow_up: |
| overall | `73.69% <65.93%> (+0.09%)` | :arrow_up: |
| tinygo | `72.39% <64.10%> (+0.06%)` | :arrow_up: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/corazawaf/coraza/pull/475?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf) | Coverage Δ | |
|---|---|---|
| [http/http.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-aHR0cC9odHRwLmdv) | `83.78% <0.00%> (ø)` | |
| [testing/engine.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-dGVzdGluZy9lbmdpbmUuZ28=) | `58.73% <11.11%> (ø)` | |
| [internal/corazawaf/transaction.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-aW50ZXJuYWwvY29yYXphd2FmL3RyYW5zYWN0aW9uLmdv) | `66.04% <39.16%> (+0.74%)` | :arrow_up: |
| [actions/setenv.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-YWN0aW9ucy9zZXRlbnYuZ28=) | `60.86% <50.00%> (ø)` | |
| [actions/setvar.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-YWN0aW9ucy9zZXR2YXIuZ28=) | `54.21% <66.66%> (ø)` | |
| [internal/corazawaf/rule.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-aW50ZXJuYWwvY29yYXphd2FmL3J1bGUuZ28=) | `93.80% <93.33%> (ø)` | |
| [actions/ctl.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-YWN0aW9ucy9jdGwuZ28=) | `69.00% <100.00%> (ø)` | |
| [actions/skipafter.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-YWN0aW9ucy9za2lwYWZ0ZXIuZ28=) | `100.00% <100.00%> (ø)` | |
| [internal/corazawaf/rulegroup.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-aW50ZXJuYWwvY29yYXphd2FmL3J1bGVncm91cC5nbw==) | `93.90% <100.00%> (ø)` | |
| [internal/corazawaf/waf.go](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf#diff-aW50ZXJuYWwvY29yYXphd2FmL3dhZi5nbw==) | `96.49% <100.00%> (ø)` | |
| ... and [2 more](https://codecov.io/gh/corazawaf/coraza/pull/475/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf) | |

Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf)

</details>

[:umbrella: View full report at Codecov](https://codecov.io/gh/corazawaf/coraza/pull/475?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf).   
:loudspeaker: Do you have feedback about the report comment? [Let us know in this issue](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=corazawaf).


Patch:
diff --git a/actions/ctl.go b/actions/ctl.go
index d27728c..c52d061 100644
--- a/actions/ctl.go
+++ b/actions/ctl.go
@@ -91,14 +91,14 @@ func (a *ctlFn) Evaluate(r rules.RuleMetadata, txS rules.TransactionState) {
 		rules := tx.WAF.Rules.GetRules()
 		for _, r := range rules {
 			if utils.InSlice(a.value, r.Tags) {
-				tx.RemoveRuleTargetByID(r.ID, a.collection, a.colKey)
+				tx.RemoveRuleTargetByID(r.GetID(), a.collection, a.colKey)
 			}
 		}
 	case ctlRuleRemoveTargetByMsg:
 		rules := tx.WAF.Rules.GetRules()
 		for _, r := range rules {
 			if r.Msg != nil && r.Msg.String() == a.value {
-				tx.RemoveRuleTargetByID(r.ID, a.collection, a.colKey)
+				tx.RemoveRuleTargetByID(r.GetID(), a.collection, a.colKey)
 			}
 		}
 	case ctlAuditEngine:
@@ -162,7 +162,7 @@ func (a *ctlFn) Evaluate(r rules.RuleMetadata, txS rules.TransactionState) {
 			}
 		}
 	case ctlRequestBodyProcessor:
-		tx.Variables.ReqbodyProcessor.Set(strings.ToUpper(a.value))
+		tx.Variables().RequestBodyProcessor().Set(strings.ToUpper(a.value))
 	case ctlHashEngine:
 		// Not supported yet
 	case ctlHashEnforcement:
diff --git a/actions/setenv.go b/actions/setenv.go
index ccdfed4..7e80b8a 100644
--- a/actions/setenv.go
+++ b/actions/setenv.go
@@ -35,10 +35,10 @@ func (a *setenvFn) Evaluate(r rules.RuleMetadata, tx rules.TransactionState) {
 	v := a.value.Expand(tx)
 	// set env variable
 	if err := os.Setenv(a.key, v); err != nil {
-		tx.DebugLogger().Error("[%s] Error setting env variable for rule %d: %s", tx.GetID(), r.GetID(), err.Error())
+		tx.DebugLogger().Error("[%s] Error setting env variable for rule %d: %s", tx.ID(), r.GetID(), err.Error())
 	}
 	// TODO is this ok?
-	tx.GetVariables().GetEnv().Set(a.key, []string{v})
+	tx.Variables().Env().Set(a.key, []string{v})
 
 }
 
diff --git a/actions/setvar.go b/actions/setvar.go
index a32a06f..dfc428c 100644
--- a/actions/setvar.go
+++ b/actions/setvar.go
@@ -59,7 +59,7 @@ func (a *setvarFn) Init(r rules.RuleMetadata, data string) error {
 func (a *setvarFn) Evaluate(r rules.RuleMetadata, tx rules.TransactionState) {
 	key := a.key.Expand(tx)
 	value := a.value.Expand(tx)
-	tx.DebugLogger().Debug("[%s] Setting var %q to %q by rule %d", tx.GetID(), key, value, r.GetID())
+	tx.DebugLogger().Debug("[%s] Setting var %q to %q by rule %d", tx.ID(), key, value, r.GetID())
 	a.evaluateTxCollection(r, tx, strings.ToLower(key), value)
 }
 
@@ -93,7 +93,7 @@ func (a *setvarFn) evaluateTxCollection(r rules.RuleMetadata, tx rules.Transacti
 		if len(value) > 1 {
 			sum, err = strconv.Atoi(value[1:])
 			if err != nil {
-				tx.DebugLogger().Error("[%s] Invalid value for setvar %q on rule %d", tx.GetID(), value, r.GetID())
+				tx.DebugLogger().Error("[%s] Invalid value for setvar %q on rule %d", tx.ID(), value, r.GetID())
 				return
 			}
 		}
@@ -101,7 +101,7 @@ func (a *setvarFn) evaluateTxCollection(r rules.RuleMetadata, tx rules.Transacti
 		if res != "" {
 			val, err = strconv.Atoi(res)
 			if err != nil {
-				tx.DebugLogger().Error("[%s] Invalid value for setvar %q on rule %d", tx.GetID(), res, r.GetID())
+				tx.DebugLogger().Error("[%s] Invalid value for setvar %q on rule %d", tx.ID(), res, r.GetID())
 				return
 			}
 		}
diff --git a/actions/skipafter.go b/actions/skipafter.go
index 73dc1dd..c4789a5 100644
--- a/actions/skipafter.go
+++ b/actions/skipafter.go
@@ -20,7 +20,7 @@ func (a *skipafterFn) Init(r rules.RuleMetadata, data string) error {
 }
 
 func (a *skipafterFn) Evaluate(r rules.RuleMetadata, tx rules.TransactionState) {
-	tx.DebugLogger().Debug("[%s] Starting secmarker %q", tx.GetID(), a.data)
+	tx.DebugLogger().Debug("[%s] Starting secmarker %q", tx.ID(), a.data)
 	// TODO(anuraaga): Confirm this is internal implementation detail
 	tx.(*corazawaf.Transaction).SkipAfter = a.data
 }
diff --git a/http/middleware.go b/http/middleware.go
index 588faa9..2e5efda 100644
--- a/http/middleware.go
+++ b/http/middleware.go
@@ -55,11 +55,11 @@ func processRequest(tx types.Transaction, req *http.Request) (*types.Interruptio
 	if req.Body != nil {
 		_, err := io.Copy(tx.RequestBodyWriter(), req.Body)
 		if err != nil {
-			return tx.GetInterruption(), err
+			return tx.Interruption(), err
 		}
 		reader, err := tx.RequestBodyReader()
 		if err != nil {
-			return tx.GetInterruption(), err
+			return tx.Interruption(), err
 		}
 		req.Body = io.NopCloser(reader)
 	}
diff --git a/internal/corazawaf/rule.go b/internal/corazawaf/rule.go
index 513476d..d7878a5 100644
--- a/internal/corazawaf/rule.go
+++ b/internal/corazawaf/rule.go
@@ -173,9 +173,9 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 
 	var matchedValues []types.MatchData
 	// we log if we are the parent rule
-	tx.WAF.Logger.Debug("[%s] [%d] Evaluating rule %d", tx.ID, rid, r.ID)
-	defer tx.WAF.Logger.Debug("[%s] [%d] Finish evaluating rule %d", tx.ID, rid, r.ID)
-	ruleCol := tx.Variables.Rule
+	tx.WAF.Logger.Debug("[%s] [%d] Evaluating rule %d", tx.id, rid, r.ID)
+	defer tx.WAF.Logger.Debug("[%s] [%d] Finish evaluating rule %d", tx.id, rid, r.ID)
+	ruleCol := tx.variables.rule
 	ruleCol.SetIndex("id", 0, strconv.Itoa(rid))
 	if r.Msg != nil {
 		ruleCol.SetIndex("msg", 0, r.Msg.String())
@@ -187,7 +187,7 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 	ruleCol.SetIndex("severity", 0, r.Severity.String())
 	// SecMark and SecAction uses nil operator
 	if r.operator == nil {
-		tx.WAF.Logger.Debug("[%s] [%d] Forcing rule %d to match", tx.ID, rid, r.ID)
+		tx.WAF.Logger.Debug("[%s] [%d] Forcing rule %d to match", tx.id, rid, r.ID)
 		md := types.MatchData{}
 		matchedValues = append(matchedValues, md)
 		r.matchVariable(tx, md)
@@ -203,10 +203,10 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 			}
 
 			values = tx.GetField(v)
-			tx.WAF.Logger.Debug("[%s] [%d] Expanding %d arguments for rule %d", tx.ID, rid, len(values), r.ID)
+			tx.WAF.Logger.Debug("[%s] [%d] Expanding %d arguments for rule %d", tx.id, rid, len(values), r.ID)
 			for _, arg := range values {
 				var args []string
-				tx.WAF.Logger.Debug("[%s] [%d] Transforming argument %q for rule %d", tx.ID, rid, arg.Value, r.ID)
+				tx.WAF.Logger.Debug("[%s] [%d] Transforming argument %q for rule %d", tx.id, rid, arg.Value, r.ID)
 				var errs []error
 				if r.MultiMatch {
 					// TODO in the future, we don't need to run every transformation
@@ -218,9 +218,9 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 					errs = es
 				}
 				if len(errs) > 0 {
-					tx.WAF.Logger.Debug("[%s] [%d] Error transforming argument %q for rule %d: %v", tx.ID, rid, arg.Value, r.ID, errs)
+					tx.WAF.Logger.Debug("[%s] [%d] Error transforming argument %q for rule %d: %v", tx.id, rid, arg.Value, r.ID, errs)
 				}
-				tx.WAF.Logger.Debug("[%s] [%d] Arguments transformed for rule %d: %v", tx.ID, rid, r.ID, args)
+				tx.WAF.Logger.Debug("[%s] [%d] Arguments transformed for rule %d: %v", tx.id, rid, r.ID, args)
 
 				// args represents the transformed variables
 				for _, carg := range args {
@@ -244,7 +244,7 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 						matchedValues = append(matchedValues, mr)
 
 						tx.WAF.Logger.Debug("[%s] [%d] Evaluating operator \"%s %s\" against %q: MATCH",
-							tx.ID,
+							tx.id,
 							rid,
 							r.operator.Function,
 							r.operator.Data,
@@ -252,7 +252,7 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 						)
 					} else {
 						tx.WAF.Logger.Debug("[%s] [%d] Evaluating operator \"%s %s\" against %q: NO MATCH",
-							tx.ID,
+							tx.id,
 							rid,
 							r.operator.Function,
 							r.operator.Data,
@@ -272,7 +272,7 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 	if r.ParentID == 0 {
 		// we only run the chains for the parent rule
 		for nr := r.Chain; nr != nil; {
-			tx.WAF.Logger.Debug("[%s] [%d] Evaluating rule chain for %d", tx.ID, rid, r.ID)
+			tx.WAF.Logger.Debug("[%s] [%d] Evaluating rule chain for %d", tx.id, rid, r.ID)
 			matchedChainValues := nr.Evaluate(tx)
 			if len(matchedChainValues) == 0 {
 				return matchedChainValues
@@ -282,10 +282,10 @@ func (r *Rule) doEvaluate(tx *Transaction) []types.MatchData {
 		}
 		// we need to add disruptive actions in the end, otherwise they would be triggered without their chains.
 		if tx.RuleEngine != types.RuleEngineDetectionOnly {
-			tx.WAF.Logger.Debug("[%s] [%d] Disrupting transaction by rule %d", tx.ID, rid, r.ID)
+			tx.WAF.Logger.Debug("[%s] [%d] Disrupting transaction by rule %d", tx.id, rid, r.ID)
 			for _, a := range r.actions {
 				if a.Function.Type() == rules.ActionTypeDisruptive || a.Function.Type() == rules.ActionTypeFlow {
-					tx.WAF.Logger.Debug("[%s] [%d] Evaluating action %s for rule %d", tx.ID, rid, a.Name, r.ID)
+					tx.WAF.Logger.Debug("[%s] [%d] Evaluating action %s for rule %d", tx.id, rid, a.Name, r.ID)
 					a.Function.Evaluate(r, tx)
 				}
 			}
@@ -305,7 +305,7 @@ func (r *Rule) matchVariable(tx *Transaction, m types.MatchData) {
 		rid = r.ParentID
 	}
 	if !m.IsNil() {
-		tx.WAF.Logger.Debug("[%s] [%d] Matching rule %d %s:%s", tx.ID, rid, r.ID, m.VariableName, m.Key)
+		tx.WAF.Logger.Debug("[%s] [%d] Matching rule %d %s:%s", tx.id, rid, r.ID, m.VariableName, m.Key)
 	}
 	// we must match the vars before running the chains
 
@@ -313,7 +313,7 @@ func (r *Rule) matchVariable(tx *Transaction, m types.MatchData) {
 	tx.matchVariable(m)
 	for _, a := range r.actions {
 		if a.Function.Type() == rules.ActionTypeNondisruptive {
-			tx.WAF.Logger.Debug("[%s] [%d] Evaluating action %s for rule %d", tx.ID, rid, a.Name, r.ID)
+			tx.WAF.Logger.Debug("[%s] [%d] Evaluating action %s for rule %d", tx.id, rid, a.Name, r.ID)
 			a.Function.Evaluate(r, tx)
 		}
 	}
diff --git a/internal/corazawaf/rulegroup.go b/internal/corazawaf/rulegroup.go
index ca4718b..d83a921 100644
--- a/internal/corazawaf/rulegroup.go
+++ b/internal/corazawaf/rulegroup.go
@@ -95,13 +95,13 @@ func (rg *RuleGroup) Clear() {
 // Eval rules for the specified phase, between 1 and 5
 // Returns true if transaction is disrupted
 func (rg *RuleGroup) Eval(phase types.RulePhase, tx *Transaction) bool {
-	tx.WAF.Logger.Debug("[%s] Evaluating phase %d", tx.ID, int(phase))
+	tx.WAF.Logger.Debug("[%s] Evaluating phase %d", tx.id, int(phase))
 	tx.LastPhase = phase
 	usedRules := 0
 	ts := time.Now().UnixNano()
 RulesLoop:
 	for _, r := range tx.WAF.Rules.GetRules() {
-		if tx.Interruption != nil && phase != types.PhaseLogging {
+		if tx.interruption != nil && phase != types.PhaseLogging {
 			break RulesLoop
 		}
 		// Rules with phase 0 will always run
@@ -112,7 +112,7 @@ RulesLoop:
 		// we skip the rule in case it's in the excluded list
 		for _, trb := range tx.ruleRemoveByID {
 			if trb == r.ID {
-				tx.WAF.Logger.Debug("[%s] Skipping rule %d", tx.ID, r.ID)
+				tx.WAF.Logger.Debug("[%s] Skipping rule %d", tx.id, r.ID)
 				continue RulesLoop
 			}
 		}
@@ -122,7 +122,7 @@ RulesLoop:
 			if r.SecMark == tx.SkipAfter {
 				tx.SkipAfter = ""
 			} else {
-				tx.WAF.Logger.Debug("[%s] Skipping rule %d because of SkipAfter, expecting %s and got: %q", tx.ID, r.ID, tx.SkipAfter, r.SecMark)
+				tx.WAF.Logger.Debug("[%s] Skipping rule %d because of SkipAfter, expecting %s and got: %q", tx.id, r.ID, tx.SkipAfter, r.SecMark)
 			}
 			continue
 		}
@@ -133,16 +133,16 @@ RulesLoop:
 		}
 		// TODO this lines are SUPER SLOW
 		// we reset matched_vars, matched_vars_names, etc
-		tx.Variables.MatchedVars.Reset()
-		tx.Variables.MatchedVarsNames.Reset()
+		tx.variables.matchedVars.Reset()
+		tx.variables.matchedVarsNames.Reset()
 
 		r.Evaluate(tx)
 		tx.Capture = false // we reset captures
 		usedRules++
 	}
-	tx.WAF.Logger.Debug("[%s] Finished phase %d", tx.ID, int(phase))
+	tx.WAF.Logger.Debug("[%s] Finished phase %d", tx.id, int(phase))
 	tx.stopWatches[phase] = time.Now().UnixNano() - ts
-	return tx.Interruption != nil
+	return tx.interruption != nil
 }
 
 // NewRuleGroup creates an empty RuleGroup that
diff --git a/internal/corazawaf/transaction.go b/internal/corazawaf/transaction.go
index a6d8887..0c83ca6 100644
--- a/internal/corazawaf/transaction.go
+++ b/internal/corazawaf/transaction.go
@@ -33,13 +33,13 @@ import (
 // thread safe
 type Transaction struct {
 	// Transaction ID
-	ID string
+	id string
 
 	// Contains the list of matched rules and associated match information
-	MatchedRules []types.MatchedRule
+	matchedRules []types.MatchedRule
 
 	// True if the transaction has been disrupted by any rule
-	Interruption *types.Interruption
+	interruption *types.Interruption
 
 	// Contains all Collections, including persistent
 	Collections []collection.Collection
@@ -105,15 +105,15 @@ type Transaction struct {
 	// it will write to the audit log
 	audit bool
 
-	Variables TransactionVariables
+	variables TransactionVariables
 }
 
-func (tx *Transaction) GetID() string {
-	return tx.ID
+func (tx *Transaction) ID() string {
+	return tx.id
 }
 
-func (tx *Transaction) GetVariables() rules.TransactionVariables {
-	return &tx.Variables
+func (tx *Transaction) Variables() rules.TransactionVariables {
+	return &tx.variables
 }
 
 func (tx *Transaction) Collection(idx variables.RuleVariable) collection.Collection {
@@ -122,7 +122,7 @@ func (tx *Transaction) Collection(idx variables.RuleVariable) collection.Collect
 
 func (tx *Transaction) Interrupt(interruption *types.Interruption) {
 	if tx.RuleEngine == types.RuleEngineOn {
-		tx.Interruption = interruption
+		tx.interruption = interruption
 	}
 }
 
@@ -152,24 +152,24 @@ func (tx *Transaction) AddRequestHeader(key string, value string) {
 		return
 	}
 	keyl := strings.ToLower(key)
-	tx.Variables.RequestHeadersNames.AddUniqueCS(keyl, key, keyl)
-	tx.Variables.RequestHeaders.AddCS(keyl, key, value)
+	tx.variables.requestHeadersNames.AddUniqueCS(keyl, key, keyl)
+	tx.variables.requestHeaders.AddCS(keyl, key, value)
 
 	if keyl == "content-type" {
 		val := strings.ToLower(value)
 		if val == "application/x-www-form-urlencoded" {
-			tx.Variables.ReqbodyProcessor.Set("URLENCODED")
+			tx.variables.reqbodyProcessor.Set("URLENCODED")
 		} else if strings.HasPrefix(val, "multipart/form-data") {
-			tx.Variables.ReqbodyProcessor.Set("MULTIPART")
+			tx.variables.reqbodyProcessor.Set("MULTIPART")
 		}
 	} else if keyl == "cookie" {
 		// Cookies use the same syntax as GET params but with semicolon (;) separator
 		values := urlutil.ParseQuery(value, ';')
 		for k, vr := range values {
 			kl := strings.ToLower(k)
-			tx.Variables.RequestCookiesNames.AddUniqueCS(kl, k, kl)
+			tx.variables.requestCookiesNames.AddUniqueCS(kl, k, kl)
 			for _, v := range vr {
-				tx.Variables.RequestCookies.AddCS(kl, k, v)
+				tx.variables.requestCookies.AddCS(kl, k, v)
 			}
 		}
 	}
@@ -183,13 +183,13 @@ func (tx *Transaction) AddResponseHeader(key string, value string) {
 		return
 	}
 	keyl := strings.ToLower(key)
-	tx.Variables.ResponseHeadersNames.AddUniqueCS(keyl, key, keyl)
-	tx.Variables.ResponseHeaders.AddCS(keyl, key, value)
+	tx.variables.responseHeadersNames.AddUniqueCS(keyl, key, keyl)
+	tx.variables.responseHeaders.AddCS(keyl, key, value)
 
 	// Most headers can be managed like that
 	if keyl == "content-type" {
 		spl := strings.SplitN(value, ";", 2)
-		tx.Variables.ResponseContentType.Set(spl[0])
+		tx.variables.responseContentType.Set(spl[0])
 	}
 }
 
@@ -201,17 +201,17 @@ func (tx *Transaction) Capturing() bool {
 // that supports capture, like @rx
 func (tx *Transaction) CaptureField(index int, value string) {
 	if tx.Capture {
-		tx.WAF.Logger.Debug("[%s] Capturing field %d with value %q", tx.ID, index, value)
+		tx.WAF.Logger.Debug("[%s] Capturing field %d with value %q", tx.id, index, value)
 		i := strconv.Itoa(index)
-		tx.Variables.TX.SetIndex(i, 0, value)
+		tx.variables.tx.SetIndex(i, 0, value)
 	}
 }
 
 // this function is used to control which variables are reset after a new rule is evaluated
 func (tx *Transaction) resetCaptures() {
-	tx.WAF.Logger.Debug("[%s] Reseting captured variables", tx.ID)
+	tx.WAF.Logger.Debug("[%s] Reseting captured variables", tx.id)
 	// We reset capture 0-9
-	ctx := tx.Variables.TX
+	ctx := tx.variables.tx
 	// RUNE 48 = 0
 	// RUNE 57 = 9
 	for i := rune(48); i <= 57; i++ {
@@ -253,7 +253,7 @@ func (tx *Transaction) ParseRequestReader(data io.Reader) (*types.Interruption,
 	if it := tx.ProcessRequestHeaders(); it != nil {
 		return it, nil
 	}
-	ctcol := tx.Variables.RequestHeaders.Get("content-type")
+	ctcol := tx.variables.requestHeaders.Get("content-type")
 	ct := ""
 	if len(ctcol) > 0 {
 		ct = strings.Split(ctcol[0], ";")[0]
@@ -284,17 +284,17 @@ func (tx *Transaction) matchVariable(match types.MatchData) {
 		varNamel = match.VariableName
 	}
 	// Array of values
-	matchedVars := tx.Variables.MatchedVars
+	matchedVars := tx.variables.matchedVars
 	// Last key
-	matchedVarName := tx.Variables.MatchedVarName
+	matchedVarName := tx.variables.matchedVarName
 	matchedVarName.Reset()
 	// Array of keys
-	matchedVarsNames := tx.Variables.MatchedVarsNames
+	matchedVarsNames := tx.variables.matchedVarsNames
 
 	// We add the key in lowercase for ease of lookup in chains
 	// This is similar to args handling
 	matchedVars.AddCS(varNamel, varName, match.Value)
-	tx.Variables.MatchedVar.Set(match.Value)
+	tx.variables.matchedVar.Set(match.Value)
 
 	// We add the key in lowercase for ease of lookup in chains
 	// This is similar to args handling
@@ -304,7 +304,7 @@ func (tx *Transaction) matchVariable(match types.MatchData) {
 
 // MatchRule Matches a rule to be logged
 func (tx *Transaction) MatchRule(r *Rule, mds []types.MatchData) {
-	tx.WAF.Logger.Debug("[%s] rule %d matched", tx.ID, r.ID)
+	tx.WAF.Logger.Debug("[%s] rule %d matched", tx.id, r.ID)
 	// tx.MatchedRules = append(tx.MatchedRules, mr)
 
 	// If the rule is set to audit, we log the transaction to the audit log
@@ -313,17 +313,17 @@ func (tx *Transaction) MatchRule(r *Rule, mds []types.MatchData) {
 	}
 
 	// set highest_severity
-	hs := tx.Variables.HighestSeverity
+	hs := tx.variables.highestSeverity
 	maxSeverity, _ := types.ParseRuleSeverity(hs.String())
 	if r.Severity > maxSeverity {
 		hs.Set(strconv.Itoa(r.Severity.Int()))
 	}
 
 	mr := types.MatchedRule{
-		URI:             tx.Variables.RequestURI.String(),
-		ID:              tx.ID,
-		ServerIPAddress: tx.Variables.ServerAddr.String(),
-		ClientIPAddress: tx.Variables.RemoteAddr.String(),
+		URI:             tx.variables.requestURI.String(),
+		ID:              tx.id,
+		ServerIPAddress: tx.variables.serverAddr.String(),
+		ClientIPAddress: tx.variables.remoteAddr.String(),
 		Rule:            r.RuleMetadata,
 		MatchedDatas:    mds,
 	}
@@ -337,7 +337,7 @@ func (tx *Transaction) MatchRule(r *Rule, mds []types.MatchData) {
 		}
 	}
 
-	tx.MatchedRules = append(tx.MatchedRules, mr)
+	tx.matchedRules = append(tx.matchedRules, mr)
 	if tx.WAF.ErrorLogCb != nil && r.Log {
 		tx.WAF.ErrorLogCb(mr)
 	}
@@ -448,10 +448,10 @@ func (tx *Transaction) ProcessConnection(client string, cPort int, server string
 	// 	tx.Variables.VARIABLE_REMOTE_HOST.Set(client)
 	// }
 
-	tx.Variables.RemoteAddr.Set(client)
-	tx.Variables.RemotePort.Set(p)
-	tx.Variables.ServerAddr.Set(server)
-	tx.Variables.ServerPort.Set(p2)
+	tx.variables.remoteAddr.Set(client)
+	tx.variables.remotePort.Set(p)
+	tx.variables.serverAddr.Set(server)
+	tx.variables.serverPort.Set(p2)
 }
 
 // ExtractArguments transforms an url encoded string to a map and creates
@@ -472,9 +472,9 @@ func (tx *Transaction) AddArgument(orig string, key string, value string) {
 	// TODO implement ARGS value limit using ArgumentsLimit
 	var vals *collection.Map
 	if orig == "GET" {
-		vals = tx.Variables.ArgsGet
+		vals = tx.variables.argsGet
 	} else {
-		vals = tx.Variables.ArgsPost
+		vals = tx.variables.argsPost
 	}
 	keyl := strings.ToLower(key)
 
@@ -492,12 +492,12 @@ func (tx *Transaction) AddArgument(orig string, key string, value string) {
 //
 // note: This function won't add GET arguments, they must be added with AddArgument
 func (tx *Transaction) ProcessURI(uri string, method string, httpVersion string) {
-	tx.Variables.RequestMethod.Set(method)
-	tx.Variables.RequestProtocol.Set(httpVersion)
-	tx.Variables.RequestURIRaw.Set(uri)
+	tx.variables.requestMethod.Set(method)
+	tx.variables.requestProtocol.Set(httpVersion)
+	tx.variables.requestURIRaw.Set(uri)
 
 	// TODO modsecurity uses HTTP/${VERSION} instead of just version, let's check it out
-	tx.Variables.RequestLine.Set(fmt.Sprintf("%s %s %s", method, uri, httpVersion))
+	tx.variables.requestLine.Set(fmt.Sprintf("%s %s %s", method, uri, httpVersion))
 
 	var err error
 
@@ -509,9 +509,9 @@ func (tx *Transaction) ProcessURI(uri string, method string, httpVersion string)
 	parsedURL, err := url.Parse(uri)
 	query := ""
 	if err != nil {
-		tx.Variables.UrlencodedError.Set(err.Error())
+		tx.variables.urlencodedError.Set(err.Error())
 		path = uri
-		tx.Variables.RequestURI.Set(uri)
+		tx.variables.requestURI.Set(uri)
 		/*
 			tx.Variables.VARIABLE_URI_PARSE_ERROR.Set("1")
 			posRawQuery := strings.Index(uri, "?")
@@ -526,19 +526,19 @@ func (tx *Transaction) ProcessURI(uri string, method string, httpVersion string)
 		*/
 	} else {
 		tx.ExtractArguments("GET", parsedURL.RawQuery)
-		tx.Variables.RequestURI.Set(parsedURL.String())
+		tx.variables.requestURI.Set(parsedURL.String())
 		path = parsedURL.Path
 		query = parsedURL.RawQuery
 	}
 	offset := strings.LastIndexAny(path, "/\\")
 	if offset != -1 && len(path) > offset+1 {
-		tx.Variables.RequestBasename.Set(path[offset+1:])
+		tx.variables.requestBasename.Set(path[offset+1:])
 	} else {
-		tx.Variables.RequestBasename.Set(path)
+		tx.variables.requestBasename.Set(path)
 	}
-	tx.Variables.RequestFilename.Set(path)
+	tx.variables.requestFilename.Set(path)
 
-	tx.Variables.QueryString.Set(query)
+	tx.variables.queryString.Set(query)
 }
 
 // ProcessRequestHeaders Performs the analysis on the request readers.
@@ -553,7 +553,7 @@ func (tx *Transaction) ProcessRequestHeaders() *types.Interruption {
 		return nil
 	}
 	tx.WAF.Rules.Eval(types.PhaseRequestHeaders, tx)
-	return tx.Interruption
+	return tx.interruption
 }
 
 func (tx *Transaction) RequestBodyWriter() io.Writer {
@@ -574,10 +574,10 @@ func (tx *Transaction) ProcessRequestBody() (*types.Interruption, error) {
 	// we won't process empty request bodies or disabled RequestBodyAccess
 	if !tx.RequestBodyAccess || tx.RequestBodyBuffer.Size() == 0 {
 		tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
-		return tx.Interruption, nil
+		return tx.interruption, nil
 	}
 	mime := ""
-	if m := tx.Variables.RequestHeaders.Get("content-type"); len(m) > 0 {
+	if m := tx.variables.requestHeaders.Get("content-type"); len(m) > 0 {
 		mime = m[0]
 	}
 
@@ -588,44 +588,44 @@ func (tx *Transaction) ProcessRequestBody() (*types.Interruption, error) {
 
 	// Chunked requests will always be written to a temporary file
 	if tx.RequestBodyBuffer.Size() >= tx.RequestBodyLimit {
-		tx.Variables.InboundErrorData.Set("1")
+		tx.variables.inboundErrorData.Set("1")
 		if tx.WAF.RequestBodyLimitAction == types.RequestBodyLimitActionReject {
 			// We interrupt this transaction in case RequestBodyLimitAction is Reject
-			tx.Interruption = &types.Interruption{
+			tx.interruption = &types.Interruption{
 				Status: 403,
 				Action: "deny",
 			}
-			return tx.Interruption, nil
+			return tx.interruption, nil
 		}
 
 		if tx.WAF.RequestBodyLimitAction == types.RequestBodyLimitActionProcessPartial {
-			tx.Variables.InboundErrorData.Set("1")
+			tx.variables.inboundErrorData.Set("1")
 			// we limit our reader to tx.RequestBodyLimit bytes
 			reader = io.LimitReader(reader, tx.RequestBodyLimit)
 		}
 	}
 
-	rbp := tx.Variables.ReqbodyProcessor.String()
+	rbp := tx.variables.reqbodyProcessor.String()
 
 	// Default variables.ReqbodyProcessor values
 	// XML and JSON must be forced with ctl:requestBodyProcessor=JSON
 	if tx.ForceRequestBodyVariable {
 		// We force URLENCODED if mime is x-www... or we have an empty RBP and ForceRequestBodyVariable
 		rbp = "URLENCODED"
-		tx.Variables.ReqbodyProcessor.Set(rbp)
+		tx.variables.reqbodyProcessor.Set(rbp)
 	}
-	tx.WAF.Logger.Debug("[%s] Attempting to process request body using %q", tx.ID, rbp)
+	tx.WAF.Logger.Debug("[%s] Attempting to process request body using %q", tx.id, rbp)
 	rbp = strings.ToLower(rbp)
 	if rbp == "" {
 		// so there is no bodyprocessor, we don't want to generate an error
 		tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
-		return tx.Interruption, nil
+		return tx.interruption, nil
 	}
 	bodyprocessor, err := bodyprocessors.Get(rbp)
 	if err != nil {
 		tx.generateReqbodyError(fmt.Errorf("Invalid body processor"))
 		tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
-		return tx.Interruption, nil
+		return tx.interruption, nil
 	}
 	if err := bodyprocessor.ProcessRequest(reader, tx.Collections, bodyprocessors.Options{
 		Mime:        mime,
@@ -633,11 +633,11 @@ func (tx *Transaction) ProcessRequestBody() (*types.Interruption, error) {
 	}); err != nil {
 		tx.generateReqbodyError(err)
 		tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
-		return tx.Interruption, nil
+		return tx.interruption, nil
 	}
 
 	tx.WAF.Rules.Eval(types.PhaseRequestBody, tx)
-	return tx.Interruption, nil
+	return tx.interruption, nil
 }
 
 // ProcessResponseHeaders Perform the analysis on the response readers.
@@ -648,15 +648,15 @@ func (tx *Transaction) ProcessRequestBody() (*types.Interruption, error) {
 // note: Remember to check for a possible intervention.
 func (tx *Transaction) ProcessResponseHeaders(code int, proto string) *types.Interruption {
 	c := strconv.Itoa(code)
-	tx.Variables.ResponseStatus.Set(c)
-	tx.Variables.ResponseProtocol.Set(proto)
+	tx.variables.responseStatus.Set(c)
+	tx.variables.responseProtocol.Set(proto)
 
 	if tx.RuleEngine == types.RuleEngineOff {
 		return nil
 	}
 
 	tx.WAF.Rules.Eval(types.PhaseResponseHeaders, tx)
-	return tx.Interruption
+	return tx.interruption
 }
 
 // IsProcessableResponseBody returns true if the response body meets the
@@ -666,7 +666,7 @@ func (tx *Transaction) ProcessResponseHeaders(code int, proto string) *types.Int
 // directly to the client or write them to Coraza
 func (tx *Transaction) IsProcessableResponseBody() bool {
 	// TODO add more validations
-	ct := tx.Variables.ResponseContentType.String()
+	ct := tx.variables.responseContentType.String()
 	return stringsutil.InSlice(ct, tx.WAF.ResponseBodyMimeTypes)
 }
 
@@ -683,33 +683,33 @@ func (tx *Transaction) ResponseBodyWriter() io.Writer {
 // note Remember to check for a possible intervention.
 func (tx *Transaction) ProcessResponseBody() (*types.Interruption, error) {
 	if tx.RuleEngine == types.RuleEngineOff {
-		return tx.Interruption, nil
+		return tx.interruption, nil
 	}
 	if !tx.ResponseBodyAccess || !tx.IsProcessableResponseBody() {
-		tx.WAF.Logger.Debug("[%s] Skipping response body processing (Access: %t)", tx.ID, tx.ResponseBodyAccess)
+		tx.WAF.Logger.Debug("[%s] Skipping response body processing (Access: %t)", tx.id, tx.ResponseBodyAccess)
 		tx.WAF.Rules.Eval(types.PhaseResponseBody, tx)
-		return tx.Interruption, nil
+		return tx.interruption, nil
 	}
-	tx.WAF.Logger.Debug("[%s] Attempting to process response body", tx.ID)
+	tx.WAF.Logger.Debug("[%s] Attempting to process response body", tx.id)
 	reader, err := tx.ResponseBodyBuffer.Reader()
 	if err != nil {
-		return tx.Interruption, err
+		return tx.interruption, err
 	}
 	reader = io.LimitReader(reader, tx.WAF.ResponseBodyLimit)
 	buf := new(strings.Builder)
 	length, err := io.Copy(buf, reader)
 	if err != nil {
-		return tx.Interruption, err
+		return tx.interruption, err
 	}
 
 	if tx.ResponseBodyBuffer.Size() >= tx.WAF.ResponseBodyLimit {
-		tx.Variables.OutboundDataError.Set("1")
+		tx.variables.outboundDataError.Set("1")
 	}
 
-	tx.Variables.ResponseContentLength.Set(strconv.FormatInt(length, 10))
-	tx.Variables.ResponseBody.Set(buf.String())
+	tx.variables.responseContentLength.Set(strconv.FormatInt(length, 10))
+	tx.variables.responseBody.Set(buf.String())
 	tx.WAF.Rules.Eval(types.PhaseResponseBody, tx)
-	return tx.Interruption, nil
+	return tx.interruption, nil
 }
 
 // ProcessLogging Logging all information relative to this transaction.
@@ -725,27 +725,27 @@ func (tx *Transaction) ProcessLogging() {
 
 	if tx.AuditEngine == types.AuditEngineOff {
 		// Audit engine disabled
-		tx.WAF.Logger.Debug("[%s] Transaction not marked for audit logging, AuditEngine is disabled", tx.ID)
+		tx.WAF.Logger.Debug("[%s] Transaction not marked for audit logging, AuditEngine is disabled", tx.id)
 		return
 	}
 
 	if tx.AuditEngine == types.AuditEngineRelevantOnly && !tx.audit {
 		// Transaction marked not for audit logging
-		tx.WAF.Logger.Debug("[%s] Transaction not marked for audit logging, AuditEngine is RelevantOnly and we got noauditlog", tx.ID)
+		tx.WAF.Logger.Debug("[%s] Transaction not marked for audit logging, AuditEngine is RelevantOnly and we got noauditlog", tx.id)
 		return
 	}
 
 	if tx.AuditEngine == types.AuditEngineRelevantOnly && tx.audit {
 		re := tx.WAF.AuditLogRelevantStatus
-		status := tx.Variables.ResponseStatus.String()
+		status := tx.variables.responseStatus.String()
 		if re != nil && !re.Match([]byte(status)) {
 			// Not relevant status
-			tx.WAF.Logger.Debug("[%s] Transaction status not marked for audit logging", tx.ID)
+			tx.WAF.Logger.Debug("[%s] Transaction status not marked for audit logging", tx.id)
 			return
 		}
 	}
 
-	tx.WAF.Logger.Debug("[%s] Transaction marked for audit logging", tx.ID)
+	tx.WAF.Logger.Debug("[%s] Transaction marked for audit logging", tx.id)
 	if writer := tx.WAF.AuditLogWriter; writer != nil {
 		// we don't log if there is an empty audit logger
 		if err := writer.Write(tx.AuditLog()); err != nil {
@@ -756,15 +756,15 @@ func (tx *Transaction) ProcessLogging() {
 
 // Interrupted will return true if the transaction was interrupted
 func (tx *Transaction) Interrupted() bool {
-	return tx.Interruption != nil
+	return tx.interruption != nil
 }
 
-func (tx *Transaction) GetInterruption() *types.Interruption {
-	return tx.Interruption
+func (tx *Transaction) Interruption() *types.Interruption {
+	return tx.interruption
 }
 
-func (tx *Transaction) GetMatchedRules() []types.MatchedRule {
-	return tx.MatchedRules
+func (tx *Transaction) MatchedRules() []types.MatchedRule {
+	return tx.matchedRules
 }
 
 // AuditLog returns an AuditLog struct, used to write audit logs
@@ -777,32 +777,32 @@ func (tx *Transaction) AuditLog() *loggers.AuditLog {
 	al.Transaction = loggers.AuditTransaction{
 		Timestamp:     ts,
 		UnixTimestamp: tx.Timestamp,
-		ID:            tx.ID,
-		ClientIP:      tx.Variables.RemoteAddr.String(),
-		ClientPort:    tx.Variables.RemotePort.Int(),
-		HostIP:        tx.Variables.ServerAddr.String(),
-		HostPort:      tx.Variables.ServerPort.Int(),
-		ServerID:      tx.Variables.ServerName.String(), // TODO check
+		ID:            tx.id,
+		ClientIP:      tx.variables.remoteAddr.String(),
+		ClientPort:    tx.variables.remotePort.Int(),
+		HostIP:        tx.variables.serverAddr.String(),
+		HostPort:      tx.variables.serverPort.Int(),
+		ServerID:      tx.variables.serverName.String(), // TODO check
 		Request: loggers.AuditTransactionRequest{
-			Method:      tx.Variables.RequestMethod.String(),
-			Protocol:    tx.Variables.RequestProtocol.String(),
-			URI:         tx.Variables.RequestURI.String(),
-			HTTPVersion: tx.Variables.RequestProtocol.String(),
+			Method:      tx.variables.requestMethod.String(),
+			Protocol:    tx.variables.requestProtocol.String(),
+			URI:         tx.variables.requestURI.String(),
+			HTTPVersion: tx.variables.requestProtocol.String(),
 			// Body and headers are audit variables.RequestUriRaws
 		},
 		Response: loggers.AuditTransactionResponse{
-			Status: tx.Variables.ResponseStatus.Int(),
+			Status: tx.variables.responseStatus.Int(),
 			// body and headers are audit parts
 		},
 	}
 	rengine := tx.RuleEngine.String()
 
-	al.Transaction.Request.Headers = tx.Variables.RequestHeaders.Data()
-	al.Transaction.Request.Body = tx.Variables.RequestBody.String()
+	al.Transaction.Request.Headers = tx.variables.requestHeaders.Data()
+	al.Transaction.Request.Body = tx.variables.requestBody.String()
 	// TODO maybe change to:
 	// al.Transaction.Request.Body = tx.RequestBodyBuffer.String()
-	al.Transaction.Response.Headers = tx.Variables.ResponseHeaders.Data()
-	al.Transaction.Response.Body = tx.Variables.ResponseBody.String()
+	al.Transaction.Response.Headers = tx.variables.responseHeaders.Data()
+	al.Transaction.Response.Body = tx.variables.responseBody.String()
 	al.Transaction.Producer = loggers.AuditTransactionProducer{
 		Connector:  tx.WAF.ProducerConnector,
 		Version:    tx.WAF.ProducerConnectorVersion,
@@ -822,9 +822,9 @@ func (tx *Transaction) AuditLog() *loggers.AuditLog {
 	// upload data
 	var files []loggers.AuditTransactionRequestFiles
 	al.Transaction.Request.Files = nil
-	for _, file := range tx.Variables.Files.Get("") {
+	for _, file := range tx.variables.files.Get("") {
 		var size int64
-		if fs := tx.Variables.FilesSizes.Get(file); len(fs) > 0 {
+		if fs := tx.variables.filesSizes.Get(file); len(fs) > 0 {
 			size, _ = strconv.ParseInt(fs[0], 10, 64)
 			// we ignore the error as it defaults to 0
 		}
@@ -838,7 +838,7 @@ func (tx *Transaction) AuditLog() *loggers.AuditLog {
 	}
 	al.Transaction.Request.Files = files
 	var mrs []loggers.AuditMessage
-	for _, mr := range tx.MatchedRules {
+	for _, mr := range tx.matchedRules {
 		r := mr.Rule
 		for _, matchData := range mr.MatchedDatas {
 			mrs = append(mrs, loggers.AuditMessage{
@@ -883,7 +883,7 @@ func (tx *Transaction) Close() error {
 		errs = append(errs, err)
 	}
 
-	tx.WAF.Logger.Debug("[%s] Transaction finished, disrupted: %t", tx.ID, tx.Interrupted())
+	tx.WAF.Logger.Debug("[%s] Transaction finished, disrupted: %t", tx.id, tx.Interrupted())
 
 	switch {
 	case len(errs) == 0:
@@ -902,8 +902,8 @@ func (tx *Transaction) String() string {
 // Debug will return a string with the transaction debug information
 func (tx *Transaction) Debug() string {
 	res := "\n\n----------------------- ERRORLOG ----------------------\n"
-	for _, mr := range tx.MatchedRules {
-		res += mr.ErrorLog(tx.Variables.ResponseStatus.Int())
+	for _, mr := range tx.matchedRules {
+		res += mr.ErrorLog(tx.variables.responseStatus.Int())
 		res += "\n\n----------------------- MATCHDATA ---------------------\n"
 		for _, md := range mr.MatchedDatas {
 			res += fmt.Sprintf("%+v", md) + "\n"
@@ -950,459 +950,459 @@ func (tx *Transaction) Debug() string {
 
 // generateReqbodyError generates all the error variables for the request body parser
 func (tx *Transaction) generateReqbodyError(err error) {
-	tx.Variables.ReqbodyError.Set("1")
-	tx.Variables.ReqbodyErrorMsg.Set(fmt.Sprintf("%s: %s", tx.Variables.ReqbodyProcessor.String(), err.Error()))
-	tx.Variables.ReqbodyProcessorError.Set("1")
-	tx.Variables.ReqbodyProcessorErrorMsg.Set(string(err.Error()))
+	tx.variables.reqbodyError.Set("1")
+	tx.variables.reqbodyErrorMsg.Set(fmt.Sprintf("%s: %s", tx.variables.reqbodyProcessor.String(), err.Error()))
+	tx.variables.reqbodyProcessorError.Set("1")
+	tx.variables.reqbodyProcessorErrorMsg.Set(string(err.Error()))
 }
 
 // TransactionVariables has pointers to all the variables of the transaction
 type TransactionVariables struct {
 	// Simple Variables
-	Userid                        *collection.Simple
-	UrlencodedError               *collection.Simple
-	ResponseContentType           *collection.Simple
-	UniqueID                      *collection.Simple
-	ArgsCombinedSize              *collection.SizeProxy
-	AuthType                      *collection.Simple
-	FilesCombinedSize             *collection.Simple
-	FullRequest                   *collection.Simple
-	FullRequestLength             *collection.Simple
-	InboundDataError              *collection.Simple
-	MatchedVar                    *collection.Simple
-	MatchedVarName                *collection.Simple
-	MultipartBoundaryQuoted       *collection.Simple
-	MultipartBoundaryWhitespace   *collection.Simple
-	MultipartCrlfLfLines          *collection.Simple
-	MultipartDataAfter            *collection.Simple
-	MultipartDataBefore           *collection.Simple
-	MultipartFileLimitExceeded    *collection.Simple
-	MultipartHeaderFolding        *collection.Simple
-	MultipartInvalidHeaderFolding *collection.Simple
-	MultipartInvalidPart          *collection.Simple
-	MultipartInvalidQuoting       *collection.Simple
-	MultipartLfLine               *collection.Simple
-	MultipartMissingSemicolon     *collection.Simple
-	MultipartStrictError          *collection.Simple
-	MultipartUnmatchedBoundary    *collection.Simple
-	OutboundDataError             *collection.Simple
-	PathInfo                      *collection.Simple
-	QueryString                   *collection.Simple
-	RemoteAddr                    *collection.Simple
-	RemoteHost                    *collection.Simple
-	RemotePort                    *collection.Simple
-	ReqbodyError                  *collection.Simple
-	ReqbodyErrorMsg               *collection.Simple
-	ReqbodyProcessorError         *collection.Simple
-	ReqbodyProcessorErrorMsg      *collection.Simple
-	ReqbodyProcessor              *collection.Simple
-	RequestBasename               *collection.Simple
-	RequestBody                   *collection.Simple
-	RequestBodyLength             *collection.Simple
-	RequestFilename               *collection.Simple
-	RequestLine                   *collection.Simple
-	RequestMethod                 *collection.Simple
-	RequestProtocol               *collection.Simple
-	RequestURI                    *collection.Simple
-	RequestURIRaw                 *collection.Simple
-	ResponseBody                  *collection.Simple
-	ResponseContentLength         *collection.Simple
-	ResponseProtocol              *collection.Simple
-	ResponseStatus                *collection.Simple
-	ServerAddr                    *collection.Simple
-	ServerName                    *collection.Simple
-	ServerPort                    *collection.Simple
-	Sessionid                     *collection.Simple
-	HighestSeverity               *collection.Simple
-	StatusLine                    *collection.Simple
-	InboundErrorData              *collection.Simple
+	userID                        *collection.Simple
+	urlencodedError               *collection.Simple
+	responseContentType           *collection.Simple
+	uniqueID                      *collection.Simple
+	argsCombinedSize              *collection.SizeProxy
+	authType                      *collection.Simple
+	filesCombinedSize             *collection.Simple
+	fullRequest                   *collection.Simple
+	fullRequestLength             *collection.Simple
+	inboundDataError              *collection.Simple
+	matchedVar                    *collection.Simple
+	matchedVarName                *collection.Simple
+	multipartBoundaryQuoted       *collection.Simple
+	multipartBoundaryWhitespace   *collection.Simple
+	multipartCrlfLfLines          *collection.Simple
+	multipartDataAfter            *collection.Simple
+	multipartDataBefore           *collection.Simple
+	multipartFileLimitExceeded    *collection.Simple
+	multipartHeaderFolding        *collection.Simple
+	multipartInvalidHeaderFolding *collection.Simple
+	multipartInvalidPart          *collection.Simple
+	multipartInvalidQuoting       *collection.Simple
+	multipartLfLine               *collection.Simple
+	multipartMissingSemicolon     *collection.Simple
+	multipartStrictError          *collection.Simple
+	multipartUnmatchedBoundary    *collection.Simple
+	outboundDataError             *collection.Simple
+	pathInfo                      *collection.Simple
+	queryString                   *collection.Simple
+	remoteAddr                    *collection.Simple
+	remoteHost                    *collection.Simple
+	remotePort                    *collection.Simple
+	reqbodyError                  *collection.Simple
+	reqbodyErrorMsg               *collection.Simple
+	reqbodyProcessorError         *collection.Simple
+	reqbodyProcessorErrorMsg      *collection.Simple
+	reqbodyProcessor              *collection.Simple
+	requestBasename               *collection.Simple
+	requestBody                   *collection.Simple
+	requestBodyLength             *collection.Simple
+	requestFilename               *collection.Simple
+	requestLine                   *collection.Simple
+	requestMethod                 *collection.Simple
+	requestProtocol               *collection.Simple
+	requestURI                    *collection.Simple
+	requestURIRaw                 *collection.Simple
+	responseBody                  *collection.Simple
+	responseContentLength         *collection.Simple
+	responseProtocol              *collection.Simple
+	responseStatus                *collection.Simple
+	serverAddr                    *collection.Simple
+	serverName                    *collection.Simple
+	serverPort                    *collection.Simple
+	sessionID                     *collection.Simple
+	highestSeverity               *collection.Simple
+	statusLine                    *collection.Simple
+	inboundErrorData              *collection.Simple
 	// Custom
-	Env      *collection.Map
-	TX       *collection.Map
-	Rule     *collection.Map
-	Duration *collection.Simple
+	env      *collection.Map
+	tx       *collection.Map
+	rule     *collection.Map
+	duration *collection.Simple
 	// Proxy Variables
-	Args *collection.Proxy
+	args *collection.Proxy
 	// Maps Variables
-	ArgsGet              *collection.Map
-	ArgsPost             *collection.Map
-	ArgsPath             *collection.Map
-	FilesTmpNames        *collection.Map
-	Geo                  *collection.Map
-	Files                *collection.Map
-	RequestCookies       *collection.Map
-	RequestHeaders       *collection.Map
-	ResponseHeaders      *collection.Map
-	MultipartName        *collection.Map
-	MatchedVarsNames     *collection.Map
-	MultipartFilename    *collection.Map
-	MatchedVars          *collection.Map
-	FilesSizes           *collection.Map
-	FilesNames           *collection.Map
-	FilesTmpContent      *collection.Map
-	ResponseHeadersNames *collection.Map
-	RequestHeadersNames  *collection.Map
-	RequestCookiesNames  *collection.Map
-	XML                  *collection.Map
-	RequestXML           *collection.Map
-	ResponseXML          *collection.Map
-	MultipartPartHeaders *collection.Map
+	argsGet              *collection.Map
+	argsPost             *collection.Map
+	argsPath             *collection.Map
+	filesTmpNames        *collection.Map
+	geo                  *collection.Map
+	files                *collection.Map
+	requestCookies       *collection.Map
+	requestHeaders       *collection.Map
+	responseHeaders      *collection.Map
+	multipartName        *collection.Map
+	matchedVarsNames     *collection.Map
+	multipartFilename    *collection.Map
+	matchedVars          *collection.Map
+	filesSizes           *collection.Map
+	filesNames           *collection.Map
+	filesTmpContent      *collection.Map
+	responseHeadersNames *collection.Map
+	requestHeadersNames  *collection.Map
+	requestCookiesNames  *collection.Map
+	xml                  *collection.Map
+	requestXML           *collection.Map
+	responseXML          *collection.Map
+	multipartPartHeaders *collection.Map
 	// Persistent variables
-	IP *collection.Map
+	ip *collection.Map
 	// Translation Proxy Variables
-	ArgsNames     *collection.TranslationProxy
-	ArgsGetNames  *collection.TranslationProxy
-	ArgsPostNames *collection.TranslationProxy
+	argsNames     *collection.TranslationProxy
+	argsGetNames  *collection.TranslationProxy
+	argsPostNames *collection.TranslationProxy
 }
 
-func (v *TransactionVariables) GetUserID() *collection.Simple {
-	return v.Userid
+func (v *TransactionVariables) UserID() *collection.Simple {
+	return v.userID
 }
 
-func (v *TransactionVariables) GetUrlencodedError() *collection.Simple {
-	return v.UrlencodedError
+func (v *TransactionVariables) UrlencodedError() *collection.Simple {
+	return v.urlencodedError
 }
 
-func (v *TransactionVariables) GetResponseContentType() *collection.Simple {
-	return v.ResponseContentType
+func (v *TransactionVariables) ResponseContentType() *collection.Simple {
+	return v.responseContentType
 }
 
-func (v *TransactionVariables) GetUniqueID() *collection.Simple {
-	return v.UniqueID
+func (v *TransactionVariables) UniqueID() *collection.Simple {
+	return v.uniqueID
 }
 
-func (v *TransactionVariables) GetArgsCombinedSize() *collection.SizeProxy {
-	return v.ArgsCombinedSize
+func (v *TransactionVariables) ArgsCombinedSize() *collection.SizeProxy {
+	return v.argsCombinedSize
 }
 
-func (v *TransactionVariables) GetAuthType() *collection.Simple {
-	return v.AuthType
+func (v *TransactionVariables) AuthType() *collection.Simple {
+	return v.authType
 }
 
-func (v *TransactionVariables) GetFilesCombinedSize() *collection.Simple {
-	return v.FilesCombinedSize
+func (v *TransactionVariables) FilesCombinedSize() *collection.Simple {
+	return v.filesCombinedSize
 }
 
-func (v *TransactionVariables) GetFullRequest() *collection.Simple {
-	return v.FullRequest
+func (v *TransactionVariables) FullRequest() *collection.Simple {
+	return v.fullRequest
 }
 
-func (v *TransactionVariables) GetFullRequestLength() *collection.Simple {
-	return v.FullRequestLength
+func (v *TransactionVariables) FullRequestLength() *collection.Simple {
+	return v.fullRequestLength
 }
 
-func (v *TransactionVariables) GetInboundDataError() *collection.Simple {
-	return v.InboundDataError
+func (v *TransactionVariables) InboundDataError() *collection.Simple {
+	return v.inboundDataError
 }
 
-func (v *TransactionVariables) GetMatchedVar() *collection.Simple {
-	return v.MatchedVar
+func (v *TransactionVariables) MatchedVar() *collection.Simple {
+	return v.matchedVar
 }
 
-func (v *TransactionVariables) GetMatchedVarName() *collection.Simple {
-	return v.MatchedVarName
+func (v *TransactionVariables) MatchedVarName() *collection.Simple {
+	return v.matchedVarName
 }
 
-func (v *TransactionVariables) GetMultipartBoundaryQuoted() *collection.Simple {
-	return v.MultipartBoundaryQuoted
+func (v *TransactionVariables) MultipartBoundaryQuoted() *collection.Simple {
+	return v.multipartBoundaryQuoted
 }
 
-func (v *TransactionVariables) GetMultipartBoundaryWhitespace() *collection.Simple {
-	return v.MultipartBoundaryWhitespace
+func (v *TransactionVariables) MultipartBoundaryWhitespace() *collection.Simple {
+	return v.multipartBoundaryWhitespace
 }
 
-func (v *TransactionVariables) GetMultipartCrlfLfLines() *collection.Simple {
-	return v.MultipartCrlfLfLines
+func (v *TransactionVariables) MultipartCrlfLfLines() *collection.Simple {
+	return v.multipartCrlfLfLines
 }
 
-func (v *TransactionVariables) GetMultipartDataAfter() *collection.Simple {
-	return v.MultipartDataAfter
+func (v *TransactionVariables) MultipartDataAfter() *collection.Simple {
+	return v.multipartDataAfter
 }
 
-func (v *TransactionVariables) GetMultipartDataBefore() *collection.Simple {
-	return v.MultipartDataBefore
+func (v *TransactionVariables) MultipartDataBefore() *collection.Simple {
+	return v.multipartDataBefore
 }
 
-func (v *TransactionVariables) GetMultipartFileLimitExceeded() *collection.Simple {
-	return v.MultipartFileLimitExceeded
+func (v *TransactionVariables) MultipartFileLimitExceeded() *collection.Simple {
+	return v.multipartFileLimitExceeded
 }
 
-func (v *TransactionVariables) GetMultipartHeaderFolding() *collection.Simple {
-	return v.MultipartHeaderFolding
+func (v *TransactionVariables) MultipartHeaderFolding() *collection.Simple {
+	return v.multipartHeaderFolding
 }
 
-func (v *TransactionVariables) GetMultipartInvalidHeaderFolding() *collection.Simple {
-	return v.MultipartInvalidHeaderFolding
+func (v *TransactionVariables) MultipartInvalidHeaderFolding() *collection.Simple {
+	return v.multipartInvalidHeaderFolding
 }
 
-func (v *TransactionVariables) GetMultipartInvalidPart() *collection.Simple {
-	return v.MultipartInvalidPart
+func (v *TransactionVariables) MultipartInvalidPart() *collection.Simple {
+	return v.multipartInvalidPart
 }
 
-func (v *TransactionVariables) GetMultipartInvalidQuoting() *collection.Simple {
-	return v.MultipartInvalidQuoting
+func (v *TransactionVariables) MultipartInvalidQuoting() *collection.Simple {
+	return v.multipartInvalidQuoting
 }
 
-func (v *TransactionVariables) GetMultipartLfLine() *collection.Simple {
-	return v.MultipartLfLine
+func (v *TransactionVariables) MultipartLfLine() *collection.Simple {
+	return v.multipartLfLine
 }
 
-func (v *TransactionVariables) GetMultipartMissingSemicolon() *collection.Simple {
-	return v.MultipartMissingSemicolon
+func (v *TransactionVariables) MultipartMissingSemicolon() *collection.Simple {
+	return v.multipartMissingSemicolon
 }
 
-func (v *TransactionVariables) GetMultipartStrictError() *collection.Simple {
-	return v.MultipartStrictError
+func (v *TransactionVariables) MultipartStrictError() *collection.Simple {
+	return v.multipartStrictError
 }
 
-func (v *TransactionVariables) GetMultipartUnmatchedBoundary() *collection.Simple {
-	return v.MultipartUnmatchedBoundary
+func (v *TransactionVariables) MultipartUnmatchedBoundary() *collection.Simple {
+	return v.multipartUnmatchedBoundary
 }
 
-func (v *TransactionVariables) GetOutboundDataError() *collection.Simple {
-	return v.OutboundDataError
+func (v *TransactionVariables) OutboundDataError() *collection.Simple {
+	return v.outboundDataError
 }
 
-func (v *TransactionVariables) GetPathInfo() *collection.Simple {
-	return v.PathInfo
+func (v *TransactionVariables) PathInfo() *collection.Simple {
+	return v.pathInfo
 }
 
-func (v *TransactionVariables) GetQueryString() *collection.Simple {
-	return v.QueryString
+func (v *TransactionVariables) QueryString() *collection.Simple {
+	return v.queryString
 }
 
-func (v *TransactionVariables) GetRemoteAddr() *collection.Simple {
-	return v.RemoteAddr
+func (v *TransactionVariables) RemoteAddr() *collection.Simple {
+	return v.remoteAddr
 }
 
-func (v *TransactionVariables) GetRemoteHost() *collection.Simple {
-	return v.RemoteHost
+func (v *TransactionVariables) RemoteHost() *collection.Simple {
+	return v.remoteHost
 }
 
-func (v *TransactionVariables) GetRemotePort() *collection.Simple {
-	return v.RemotePort
+func (v *TransactionVariables) RemotePort() *collection.Simple {
+	return v.remotePort
 }
 
-func (v *TransactionVariables) GetReqbodyError() *collection.Simple {
-	return v.ReqbodyError
+func (v *TransactionVariables) RequestBodyError() *collection.Simple {
+	return v.reqbodyError
 }
 
-func (v *TransactionVariables) GetReqbodyErrorMsg() *collection.Simple {
-	return v.ReqbodyErrorMsg
+func (v *TransactionVariables) RequestBodyErrorMsg() *collection.Simple {
+	return v.reqbodyErrorMsg
 }
 
-func (v *TransactionVariables) GetReqbodyProcessorError() *collection.Simple {
-	return v.ReqbodyProcessorError
+func (v *TransactionVariables) RequestBodyProcessorError() *collection.Simple {
+	return v.reqbodyProcessorError
 }
 
-func (v *TransactionVariables) GetReqbodyProcessorErrorMsg() *collection.Simple {
-	return v.ReqbodyProcessorErrorMsg
+func (v *TransactionVariables) RequestBodyProcessorErrorMsg() *collection.Simple {
+	return v.reqbodyProcessorErrorMsg
 }
 
-func (v *TransactionVariables) GetReqbodyProcessor() *collection.Simple {
-	return v.ReqbodyProcessor
+func (v *TransactionVariables) RequestBodyProcessor() *collection.Simple {
+	return v.reqbodyProcessor
 }
 
-func (v *TransactionVariables) GetRequestBasename() *collection.Simple {
-	return v.RequestBasename
+func (v *TransactionVariables) RequestBasename() *collection.Simple {
+	return v.requestBasename
 }
 
-func (v *TransactionVariables) GetRequestBody() *collection.Simple {
-	return v.RequestBody
+func (v *TransactionVariables) RequestBody() *collection.Simple {
+	return v.requestBody
 }
 
-func (v *TransactionVariables) GetRequestBodyLength() *collection.Simple {
-	return v.RequestBodyLength
+func (v *TransactionVariables) RequestBodyLength() *collection.Simple {
+	return v.requestBodyLength
 }
 
-func (v *TransactionVariables) GetRequestFilename() *collection.Simple {
-	return v.RequestFilename
+func (v *TransactionVariables) RequestFilename() *collection.Simple {
+	return v.requestFilename
 }
 
-func (v *TransactionVariables) GetRequestLine() *collection.Simple {
-	return v.RequestLine
+func (v *TransactionVariables) RequestLine() *collection.Simple {
+	return v.requestLine
 }
 
-func (v *TransactionVariables) GetRequestMethod() *collection.Simple {
-	return v.RequestMethod
+func (v *TransactionVariables) RequestMethod() *collection.Simple {
+	return v.requestMethod
 }
 
-func (v *TransactionVariables) GetRequestProtocol() *collection.Simple {
-	return v.RequestProtocol
+func (v *TransactionVariables) RequestProtocol() *collection.Simple {
+	return v.requestProtocol
 }
 
-func (v *TransactionVariables) GetRequestURI() *collection.Simple {
-	return v.RequestURI
+func (v *TransactionVariables) RequestURI() *collection.Simple {
+	return v.requestURI
 }
 
-func (v *TransactionVariables) GetRequestURIRaw() *collection.Simple {
-	return v.RequestURIRaw
+func (v *TransactionVariables) RequestURIRaw() *collection.Simple {
+	return v.requestURIRaw
 }
 
-func (v *TransactionVariables) GetResponseBody() *collection.Simple {
-	return v.ResponseBody
+func (v *TransactionVariables) ResponseBody() *collection.Simple {
+	return v.responseBody
 }
 
-func (v *TransactionVariables) GetResponseContentLength() *collection.Simple {
-	return v.ResponseContentLength
+func (v *TransactionVariables) ResponseContentLength() *collection.Simple {
+	return v.responseContentLength
 }
 
-func (v *TransactionVariables) GetResponseProtocol() *collection.Simple {
-	return v.ResponseProtocol
+func (v *TransactionVariables) ResponseProtocol() *collection.Simple {
+	return v.responseProtocol
 }
 
-func (v *TransactionVariables) GetResponseStatus() *collection.Simple {
-	return v.ResponseStatus
+func (v *TransactionVariables) ResponseStatus() *collection.Simple {
+	return v.responseStatus
 }
 
-func (v *TransactionVariables) GetServerAddr() *collection.Simple {
-	return v.ServerAddr
+func (v *TransactionVariables) ServerAddr() *collection.Simple {
+	return v.serverAddr
 }
 
-func (v *TransactionVariables) GetServerName() *collection.Simple {
-	return v.ServerName
+func (v *TransactionVariables) ServerName() *collection.Simple {
+	return v.serverName
 }
 
-func (v *TransactionVariables) GetServerPort() *collection.Simple {
-	return v.ServerPort
+func (v *TransactionVariables) ServerPort() *collection.Simple {
+	return v.serverPort
 }
 
-func (v *TransactionVariables) GetSessionid() *collection.Simple {
-	return v.Sessionid
+func (v *TransactionVariables) SessionID() *collection.Simple {
+	return v.sessionID
 }
 
-func (v *TransactionVariables) GetHighestSeverity() *collection.Simple {
-	return v.HighestSeverity
+func (v *TransactionVariables) HighestSeverity() *collection.Simple {
+	return v.highestSeverity
 }
 
-func (v *TransactionVariables) GetStatusLine() *collection.Simple {
-	return v.StatusLine
+func (v *TransactionVariables) StatusLine() *collection.Simple {
+	return v.statusLine
 }
 
-func (v *TransactionVariables) GetInboundErrorData() *collection.Simple {
-	return v.InboundErrorData
+func (v *TransactionVariables) InboundErrorData() *collection.Simple {
+	return v.inboundErrorData
 }
 
-func (v *TransactionVariables) GetEnv() *collection.Map {
-	return v.Env
+func (v *TransactionVariables) Env() *collection.Map {
+	return v.env
 }
 
-func (v *TransactionVariables) GetTX() *collection.Map {
-	return v.TX
+func (v *TransactionVariables) TX() *collection.Map {
+	return v.tx
 }
 
-func (v *TransactionVariables) GetRule() *collection.Map {
-	return v.Rule
+func (v *TransactionVariables) Rule() *collection.Map {
+	return v.rule
 }
 
-func (v *TransactionVariables) GetDuration() *collection.Simple {
-	return v.Duration
+func (v *TransactionVariables) Duration() *collection.Simple {
+	return v.duration
 }
 
-func (v *TransactionVariables) GetArgs() *collection.Proxy {
-	return v.Args
+func (v *TransactionVariables) Args() *collection.Proxy {
+	return v.args
 }
 
-func (v *TransactionVariables) GetArgsGet() *collection.Map {
-	return v.ArgsGet
+func (v *TransactionVariables) ArgsGet() *collection.Map {
+	return v.argsGet
 }
 
-func (v *TransactionVariables) GetArgsPost() *collection.Map {
-	return v.ArgsPost
+func (v *TransactionVariables) ArgsPost() *collection.Map {
+	return v.argsPost
 }
 
-func (v *TransactionVariables) GetArgsPath() *collection.Map {
-	return v.ArgsPath
+func (v *TransactionVariables) ArgsPath() *collection.Map {
+	return v.argsPath
 }
 
-func (v *TransactionVariables) GetFilesTmpNames() *collection.Map {
-	return v.FilesTmpNames
+func (v *TransactionVariables) FilesTmpNames() *collection.Map {
+	return v.filesTmpNames
 }
 
-func (v *TransactionVariables) GetGeo() *collection.Map {
-	return v.Geo
+func (v *TransactionVariables) Geo() *collection.Map {
+	return v.geo
 }
 
-func (v *TransactionVariables) GetFiles() *collection.Map {
-	return v.Files
+func (v *TransactionVariables) Files() *collection.Map {
+	return v.files
 }
 
-func (v *TransactionVariables) GetRequestCookies() *collection.Map {
-	return v.RequestCookies
+func (v *TransactionVariables) RequestCookies() *collection.Map {
+	return v.requestCookies
 }
 
-func (v *TransactionVariables) GetRequestHeaders() *collection.Map {
-	return v.RequestHeaders
+func (v *TransactionVariables) RequestHeaders() *collection.Map {
+	return v.requestHeaders
 }
 
-func (v *TransactionVariables) GetResponseHeaders() *collection.Map {
-	return v.ResponseHeaders
+func (v *TransactionVariables) ResponseHeaders() *collection.Map {
+	return v.responseHeaders
 }
 
-func (v *TransactionVariables) GetMultipartName() *collection.Map {
-	return v.MultipartName
+func (v *TransactionVariables) MultipartName() *collection.Map {
+	return v.multipartName
 }
 
-func (v *TransactionVariables) GetMatchedVarsNames() *collection.Map {
-	return v.MatchedVarsNames
+func (v *TransactionVariables) MatchedVarsNames() *collection.Map {
+	return v.matchedVarsNames
 }
 
-func (v *TransactionVariables) GetMultipartFilename() *collection.Map {
-	return v.MultipartFilename
+func (v *TransactionVariables) MultipartFilename() *collection.Map {
+	return v.multipartFilename
 }
 
-func (v *TransactionVariables) GetMatchedVars() *collection.Map {
-	return v.MatchedVars
+func (v *TransactionVariables) MatchedVars() *collection.Map {
+	return v.matchedVars
 }
 
-func (v *TransactionVariables) GetFilesSizes() *collection.Map {
-	return v.FilesSizes
+func (v *TransactionVariables) FilesSizes() *collection.Map {
+	return v.filesSizes
 }
 
-func (v *TransactionVariables) GetFilesNames() *collection.Map {
-	return v.FilesNames
+func (v *TransactionVariables) FilesNames() *collection.Map {
+	return v.filesNames
 }
 
-func (v *TransactionVariables) GetFilesTmpContent() *collection.Map {
-	return v.FilesTmpContent
+func (v *TransactionVariables) FilesTmpContent() *collection.Map {
+	return v.filesTmpContent
 }
 
-func (v *TransactionVariables) GetResponseHeadersNames() *collection.Map {
-	return v.ResponseHeadersNames
+func (v *TransactionVariables) ResponseHeadersNames() *collection.Map {
+	return v.responseHeadersNames
 }
 
-func (v *TransactionVariables) GetRequestHeadersNames() *collection.Map {
-	return v.RequestHeadersNames
+func (v *TransactionVariables) RequestHeadersNames() *collection.Map {
+	return v.requestHeadersNames
 }
 
-func (v *TransactionVariables) GetRequestCookiesNames() *collection.Map {
-	return v.RequestCookiesNames
+func (v *TransactionVariables) RequestCookiesNames() *collection.Map {
+	return v.requestCookiesNames
 }
 
-func (v *TransactionVariables) GetXML() *collection.Map {
-	return v.XML
+func (v *TransactionVariables) XML() *collection.Map {
+	return v.xml
 }
 
-func (v *TransactionVariables) GetRequestXML() *collection.Map {
-	return v.RequestXML
+func (v *TransactionVariables) RequestXML() *collection.Map {
+	return v.requestXML
 }
 
-func (v *TransactionVariables) GetResponseXML() *collection.Map {
-	return v.ResponseXML
+func (v *TransactionVariables) ResponseXML() *collection.Map {
+	return v.responseXML
 }
 
-func (v *TransactionVariables) GetIP() *collection.Map {
-	return v.IP
+func (v *TransactionVariables) IP() *collection.Map {
+	return v.ip
 }
 
-func (v *TransactionVariables) GetArgsNames() *collection.TranslationProxy {
-	return v.ArgsNames
+func (v *TransactionVariables) ArgsNames() *collection.TranslationProxy {
+	return v.argsNames
 }
 
-func (v *TransactionVariables) GetArgsGetNames() *collection.TranslationProxy {
-	return v.ArgsGetNames
+func (v *TransactionVariables) ArgsGetNames() *collection.TranslationProxy {
+	return v.argsGetNames
 }
 
-func (v *TransactionVariables) GetArgsPostNames() *collection.TranslationProxy {
-	return v.ArgsPostNames
+func (v *TransactionVariables) ArgsPostNames() *collection.TranslationProxy {
+	return v.argsPostNames
 }
diff --git a/internal/corazawaf/waf.go b/internal/corazawaf/waf.go
index 739cb71..f99ebde 100644
--- a/internal/corazawaf/waf.go
+++ b/internal/corazawaf/waf.go
@@ -154,9 +154,9 @@ func (w *WAF) NewTransactionWithID(id string) *Transaction {
 // Using the specified ID
 func (w *WAF) newTransactionWithID(id string) *Transaction {
 	tx := transactionPool.Get().(*Transaction)
-	tx.ID = id
-	tx.MatchedRules = []types.MatchedRule{}
-	tx.Interruption = nil
+	tx.id = id
+	tx.matchedRules = []types.MatchedRule{}
+	tx.interruption = nil
 	tx.Logdata = ""
 	tx.SkipAfter = ""
 	tx.AuditEngine = w.AuditEngine
@@ -192,240 +192,240 @@ func (w *WAF) newTransactionWithID(id string) *Transaction {
 			MemoryLimit: w.RequestBodyInMemoryLimit,
 		})
 		tx.Collections = make([]collection.Collection, types.VariablesCount)
-		tx.Variables.UrlencodedError = collection.NewSimple(variables.UrlencodedError)
-		tx.Collections[variables.UrlencodedError] = tx.Variables.UrlencodedError
-		tx.Variables.ResponseContentType = collection.NewSimple(variables.ResponseContentType)
-		tx.Collections[variables.ResponseContentType] = tx.Variables.ResponseContentType
-		tx.Variables.UniqueID = collection.NewSimple(variables.UniqueID)
-		tx.Collections[variables.UniqueID] = tx.Variables.UniqueID
-		tx.Variables.AuthType = collection.NewSimple(variables.AuthType)
-		tx.Collections[variables.AuthType] = tx.Variables.AuthType
-		tx.Variables.FilesCombinedSize = collection.NewSimple(variables.FilesCombinedSize)
-		tx.Collections[variables.FilesCombinedSize] = tx.Variables.FilesCombinedSize
-		tx.Variables.FullRequest = collection.NewSimple(variables.FullRequest)
-		tx.Collections[variables.FullRequest] = tx.Variables.FullRequest
-		tx.Variables.FullRequestLength = collection.NewSimple(variables.FullRequestLength)
-		tx.Collections[variables.FullRequestLength] = tx.Variables.FullRequestLength
-		tx.Variables.InboundDataError = collection.NewSimple(variables.InboundDataError)
-		tx.Collections[variables.InboundDataError] = tx.Variables.InboundDataError
-		tx.Variables.MatchedVar = collection.NewSimple(variables.MatchedVar)
-		tx.Collections[variables.MatchedVar] = tx.Variables.MatchedVar
-		tx.Variables.MatchedVarName = collection.NewSimple(variables.MatchedVarName)
-		tx.Collections[variables.MatchedVarName] = tx.Variables.MatchedVarName
-		tx.Variables.MultipartBoundaryQuoted = collection.NewSimple(variables.MultipartBoundaryQuoted)
-		tx.Collections[variables.MultipartBoundaryQuoted] = tx.Variables.MultipartBoundaryQuoted
-		tx.Variables.MultipartBoundaryWhitespace = collection.NewSimple(variables.MultipartBoundaryWhitespace)
-		tx.Collections[variables.MultipartBoundaryWhitespace] = tx.Variables.MultipartBoundaryWhitespace
-		tx.Variables.MultipartCrlfLfLines = collection.NewSimple(variables.MultipartCrlfLfLines)
-		tx.Collections[variables.MultipartCrlfLfLines] = tx.Variables.MultipartCrlfLfLines
-		tx.Variables.MultipartDataAfter = collection.NewSimple(variables.MultipartDataAfter)
-		tx.Collections[variables.MultipartDataAfter] = tx.Variables.MultipartDataAfter
-		tx.Variables.MultipartDataBefore = collection.NewSimple(variables.MultipartDataBefore)
-		tx.Collections[variables.MultipartDataBefore] = tx.Variables.MultipartDataBefore
-		tx.Variables.MultipartFileLimitExceeded = collection.NewSimple(variables.MultipartFileLimitExceeded)
-		tx.Collections[variables.MultipartFileLimitExceeded] = tx.Variables.MultipartFileLimitExceeded
-		tx.Variables.MultipartHeaderFolding = collection.NewSimple(variables.MultipartHeaderFolding)
-		tx.Collections[variables.MultipartHeaderFolding] = tx.Variables.MultipartHeaderFolding
-		tx.Variables.MultipartInvalidHeaderFolding = collection.NewSimple(variables.MultipartInvalidHeaderFolding)
-		tx.Collections[variables.MultipartInvalidHeaderFolding] = tx.Variables.MultipartInvalidHeaderFolding
-		tx.Variables.MultipartInvalidPart = collection.NewSimple(variables.MultipartInvalidPart)
-		tx.Collections[variables.MultipartInvalidPart] = tx.Variables.MultipartInvalidPart
-		tx.Variables.MultipartInvalidQuoting = collection.NewSimple(variables.MultipartInvalidQuoting)
-		tx.Collections[variables.MultipartInvalidQuoting] = tx.Variables.MultipartInvalidQuoting
-		tx.Variables.MultipartLfLine = collection.NewSimple(variables.MultipartLfLine)
-		tx.Collections[variables.MultipartLfLine] = tx.Variables.MultipartLfLine
-		tx.Variables.MultipartMissingSemicolon = collection.NewSimple(variables.MultipartMissingSemicolon)
-		tx.Collections[variables.MultipartMissingSemicolon] = tx.Variables.MultipartMissingSemicolon
-		tx.Variables.MultipartStrictError = collection.NewSimple(variables.MultipartStrictError)
-		tx.Collections[variables.MultipartStrictError] = tx.Variables.MultipartStrictError
-		tx.Variables.MultipartUnmatchedBoundary = collection.NewSimple(variables.MultipartUnmatchedBoundary)
-		tx.Collections[variables.MultipartUnmatchedBoundary] = tx.Variables.MultipartUnmatchedBoundary
-		tx.Variables.OutboundDataError = collection.NewSimple(variables.OutboundDataError)
-		tx.Collections[variables.OutboundDataError] = tx.Variables.OutboundDataError
-		tx.Variables.PathInfo = collection.NewSimple(variables.PathInfo)
-		tx.Collections[variables.PathInfo] = tx.Variables.PathInfo
-		tx.Variables.QueryString = collection.NewSimple(variables.QueryString)
-		tx.Collections[variables.QueryString] = tx.Variables.QueryString
-		tx.Variables.RemoteAddr = collection.NewSimple(variables.RemoteAddr)
-		tx.Collections[variables.RemoteAddr] = tx.Variables.RemoteAddr
-		tx.Variables.RemoteHost = collection.NewSimple(variables.RemoteHost)
-		tx.Collections[variables.RemoteHost] = tx.Variables.RemoteHost
-		tx.Variables.RemotePort = collection.NewSimple(variables.RemotePort)
-		tx.Collections[variables.RemotePort] = tx.Variables.RemotePort
-		tx.Variables.ReqbodyError = collection.NewSimple(variables.ReqbodyError)
-		tx.Collections[variables.ReqbodyError] = tx.Variables.ReqbodyError
-		tx.Variables.ReqbodyErrorMsg = collection.NewSimple(variables.ReqbodyErrorMsg)
-		tx.Collections[variables.ReqbodyErrorMsg] = tx.Variables.ReqbodyErrorMsg
-		tx.Variables.ReqbodyProcessorError = collection.NewSimple(variables.ReqbodyProcessorError)
-		tx.Collections[variables.ReqbodyProcessorError] = tx.Variables.ReqbodyProcessorError
-		tx.Variables.ReqbodyProcessorErrorMsg = collection.NewSimple(variables.ReqbodyProcessorErrorMsg)
-		tx.Collections[variables.ReqbodyProcessorErrorMsg] = tx.Variables.ReqbodyProcessorErrorMsg
-		tx.Variables.ReqbodyProcessor = collection.NewSimple(variables.ReqbodyProcessor)
-		tx.Collections[variables.ReqbodyProcessor] = tx.Variables.ReqbodyProcessor
-		tx.Variables.RequestBasename = collection.NewSimple(variables.RequestBasename)
-		tx.Collections[variables.RequestBasename] = tx.Variables.RequestBasename
-		tx.Variables.RequestBody = collection.NewSimple(variables.RequestBody)
-		tx.Collections[variables.RequestBody] = tx.Variables.RequestBody
-		tx.Variables.RequestBodyLength = collection.NewSimple(variables.RequestBodyLength)
-		tx.Collections[variables.RequestBodyLength] = tx.Variables.RequestBodyLength
-		tx.Variables.RequestFilename = collection.NewSimple(variables.RequestFilename)
-		tx.Collections[variables.RequestFilename] = tx.Variables.RequestFilename
-		tx.Variables.RequestLine = collection.NewSimple(variables.RequestLine)
-		tx.Collections[variables.RequestLine] = tx.Variables.RequestLine
-		tx.Variables.RequestMethod = collection.NewSimple(variables.RequestMethod)
-		tx.Collections[variables.RequestMethod] = tx.Variables.RequestMethod
-		tx.Variables.RequestProtocol = collection.NewSimple(variables.RequestProtocol)
-		tx.Collections[variables.RequestProtocol] = tx.Variables.RequestProtocol
-		tx.Variables.RequestURI = collection.NewSimple(variables.RequestURI)
-		tx.Collections[variables.RequestURI] = tx.Variables.RequestURI
-		tx.Variables.RequestURIRaw = collection.NewSimple(variables.RequestURIRaw)
-		tx.Collections[variables.RequestURIRaw] = tx.Variables.RequestURIRaw
-		tx.Variables.ResponseBody = collection.NewSimple(variables.ResponseBody)
-		tx.Collections[variables.ResponseBody] = tx.Variables.ResponseBody
-		tx.Variables.ResponseContentLength = collection.NewSimple(variables.ResponseContentLength)
-		tx.Collections[variables.ResponseContentLength] = tx.Variables.ResponseContentLength
-		tx.Variables.ResponseProtocol = collection.NewSimple(variables.ResponseProtocol)
-		tx.Collections[variables.ResponseProtocol] = tx.Variables.ResponseProtocol
-		tx.Variables.ResponseStatus = collection.NewSimple(variables.ResponseStatus)
-		tx.Collections[variables.ResponseStatus] = tx.Variables.ResponseStatus
-		tx.Variables.ServerAddr = collection.NewSimple(variables.ServerAddr)
-		tx.Collections[variables.ServerAddr] = tx.Variables.ServerAddr
-		tx.Variables.ServerName = collection.NewSimple(variables.ServerName)
-		tx.Collections[variables.ServerName] = tx.Variables.ServerName
-		tx.Variables.ServerPort = collection.NewSimple(variables.ServerPort)
-		tx.Collections[variables.ServerPort] = tx.Variables.ServerPort
-		tx.Variables.Sessionid = collection.NewSimple(variables.Sessionid)
-		tx.Collections[variables.Sessionid] = tx.Variables.Sessionid
-		tx.Variables.HighestSeverity = collection.NewSimple(variables.HighestSeverity)
-		tx.Collections[variables.HighestSeverity] = tx.Variables.HighestSeverity
-		tx.Variables.StatusLine = collection.NewSimple(variables.StatusLine)
-		tx.Collections[variables.StatusLine] = tx.Variables.StatusLine
-		tx.Variables.InboundErrorData = collection.NewSimple(variables.InboundErrorData)
-		tx.Collections[variables.InboundErrorData] = tx.Variables.InboundErrorData
-		tx.Variables.Duration = collection.NewSimple(variables.Duration)
-		tx.Collections[variables.Duration] = tx.Variables.Duration
-		tx.Variables.ResponseHeadersNames = collection.NewMap(variables.ResponseHeadersNames)
-		tx.Collections[variables.ResponseHeadersNames] = tx.Variables.ResponseHeadersNames
-		tx.Variables.RequestHeadersNames = collection.NewMap(variables.RequestHeadersNames)
-		tx.Collections[variables.RequestHeadersNames] = tx.Variables.RequestHeadersNames
-		tx.Variables.Userid = collection.NewSimple(variables.Userid)
-		tx.Collections[variables.Userid] = tx.Variables.Userid
-
-		tx.Variables.ArgsGet = collection.NewMap(variables.ArgsGet)
-		tx.Collections[variables.ArgsGet] = tx.Variables.ArgsGet
-		tx.Variables.ArgsPost = collection.NewMap(variables.ArgsPost)
-		tx.Collections[variables.ArgsPost] = tx.Variables.ArgsPost
-		tx.Variables.ArgsPath = collection.NewMap(variables.ArgsPath)
-		tx.Collections[variables.ArgsPath] = tx.Variables.ArgsPath
-		tx.Variables.FilesSizes = collection.NewMap(variables.FilesSizes)
-		tx.Collections[variables.FilesSizes] = tx.Variables.FilesSizes
-		tx.Variables.FilesTmpContent = collection.NewMap(variables.FilesTmpContent)
-		tx.Collections[variables.FilesTmpContent] = tx.Variables.FilesTmpContent
-		tx.Variables.MultipartFilename = collection.NewMap(variables.MultipartFilename)
-		tx.Collections[variables.MultipartFilename] = tx.Variables.MultipartFilename
-		tx.Variables.MultipartName = collection.NewMap(variables.MultipartName)
-		tx.Collections[variables.MultipartName] = tx.Variables.MultipartName
-		tx.Variables.MatchedVars = collection.NewMap(variables.MatchedVars)
-		tx.Collections[variables.MatchedVars] = tx.Variables.MatchedVars
-		tx.Variables.RequestCookies = collection.NewMap(variables.RequestCookies)
-		tx.Collections[variables.RequestCookies] = tx.Variables.RequestCookies
-		tx.Variables.RequestHeaders = collection.NewMap(variables.RequestHeaders)
-		tx.Collections[variables.RequestHeaders] = tx.Variables.RequestHeaders
-		tx.Variables.ResponseHeaders = collection.NewMap(variables.ResponseHeaders)
-		tx.Collections[variables.ResponseHeaders] = tx.Variables.ResponseHeaders
-		tx.Variables.Geo = collection.NewMap(variables.Geo)
-		tx.Collections[variables.Geo] = tx.Variables.Geo
-		tx.Variables.TX = collection.NewMap(variables.TX)
-		tx.Collections[variables.TX] = tx.Variables.TX
-		tx.Variables.Rule = collection.NewMap(variables.Rule)
-		tx.Collections[variables.Rule] = tx.Variables.Rule
-		tx.Variables.Env = collection.NewMap(variables.Env)
-		tx.Collections[variables.Env] = tx.Variables.Env
-		tx.Variables.IP = collection.NewMap(variables.IP)
-		tx.Collections[variables.IP] = tx.Variables.IP
-		tx.Variables.Files = collection.NewMap(variables.Files)
-		tx.Collections[variables.Files] = tx.Variables.Files
-		tx.Variables.MatchedVarsNames = collection.NewMap(variables.MatchedVarsNames)
-		tx.Collections[variables.MatchedVarsNames] = tx.Variables.MatchedVarsNames
-		tx.Variables.FilesNames = collection.NewMap(variables.FilesNames)
-		tx.Collections[variables.FilesNames] = tx.Variables.FilesNames
-		tx.Variables.FilesTmpNames = collection.NewMap(variables.FilesTmpNames)
-		tx.Collections[variables.FilesTmpNames] = tx.Variables.FilesTmpNames
-		tx.Variables.RequestCookiesNames = collection.NewMap(variables.RequestCookiesNames)
-		tx.Collections[variables.RequestCookiesNames] = tx.Variables.RequestCookiesNames
-		tx.Variables.ResponseXML = collection.NewMap(variables.ResponseXML)
-		tx.Collections[variables.ResponseXML] = tx.Variables.ResponseXML
-		tx.Variables.RequestXML = collection.NewMap(variables.RequestXML)
-		tx.Collections[variables.RequestXML] = tx.Variables.RequestXML
-		tx.Variables.MultipartPartHeaders = collection.NewMap(variables.MultipartPartHeaders)
-		tx.Collections[variables.MultipartPartHeaders] = tx.Variables.MultipartPartHeaders
-
-		tx.Variables.ArgsCombinedSize = collection.NewCollectionSizeProxy(variables.ArgsCombinedSize, tx.Variables.ArgsGet, tx.Variables.ArgsPost)
-		tx.Collections[variables.ArgsCombinedSize] = tx.Variables.ArgsCombinedSize
+		tx.variables.urlencodedError = collection.NewSimple(variables.UrlencodedError)
+		tx.Collections[variables.UrlencodedError] = tx.variables.urlencodedError
+		tx.variables.responseContentType = collection.NewSimple(variables.ResponseContentType)
+		tx.Collections[variables.ResponseContentType] = tx.variables.responseContentType
+		tx.variables.uniqueID = collection.NewSimple(variables.UniqueID)
+		tx.Collections[variables.UniqueID] = tx.variables.uniqueID
+		tx.variables.authType = collection.NewSimple(variables.AuthType)
+		tx.Collections[variables.AuthType] = tx.variables.authType
+		tx.variables.filesCombinedSize = collection.NewSimple(variables.FilesCombinedSize)
+		tx.Collections[variables.FilesCombinedSize] = tx.variables.filesCombinedSize
+		tx.variables.fullRequest = collection.NewSimple(variables.FullRequest)
+		tx.Collections[variables.FullRequest] = tx.variables.fullRequest
+		tx.variables.fullRequestLength = collection.NewSimple(variables.FullRequestLength)
+		tx.Collections[variables.FullRequestLength] = tx.variables.fullRequestLength
+		tx.variables.inboundDataError = collection.NewSimple(variables.InboundDataError)
+		tx.Collections[variables.InboundDataError] = tx.variables.inboundDataError
+		tx.variables.matchedVar = collection.NewSimple(variables.MatchedVar)
+		tx.Collections[variables.MatchedVar] = tx.variables.matchedVar
+		tx.variables.matchedVarName = collection.NewSimple(variables.MatchedVarName)
+		tx.Collections[variables.MatchedVarName] = tx.variables.matchedVarName
+		tx.variables.multipartBoundaryQuoted = collection.NewSimple(variables.MultipartBoundaryQuoted)
+		tx.Collections[variables.MultipartBoundaryQuoted] = tx.variables.multipartBoundaryQuoted
+		tx.variables.multipartBoundaryWhitespace = collection.NewSimple(variables.MultipartBoundaryWhitespace)
+		tx.Collections[variables.MultipartBoundaryWhitespace] = tx.variables.multipartBoundaryWhitespace
+		tx.variables.multipartCrlfLfLines = collection.NewSimple(variables.MultipartCrlfLfLines)
+		tx.Collections[variables.MultipartCrlfLfLines] = tx.variables.multipartCrlfLfLines
+		tx.variables.multipartDataAfter = collection.NewSimple(variables.MultipartDataAfter)
+		tx.Collections[variables.MultipartDataAfter] = tx.variables.multipartDataAfter
+		tx.variables.multipartDataBefore = collection.NewSimple(variables.MultipartDataBefore)
+		tx.Collections[variables.MultipartDataBefore] = tx.variables.multipartDataBefore
+		tx.variables.multipartFileLimitExceeded = collection.NewSimple(variables.MultipartFileLimitExceeded)
+		tx.Collections[variables.MultipartFileLimitExceeded] = tx.variables.multipartFileLimitExceeded
+		tx.variables.multipartHeaderFolding = collection.NewSimple(variables.MultipartHeaderFolding)
+		tx.Collections[variables.MultipartHeaderFolding] = tx.variables.multipartHeaderFolding
+		tx.variables.multipartInvalidHeaderFolding = collection.NewSimple(variables.MultipartInvalidHeaderFolding)
+		tx.Collections[variables.MultipartInvalidHeaderFolding] = tx.variables.multipartInvalidHeaderFolding
+		tx.variables.multipartInvalidPart = collection.NewSimple(variables.MultipartInvalidPart)
+		tx.Collections[variables.MultipartInvalidPart] = tx.variables.multipartInvalidPart
+		tx.variables.multipartInvalidQuoting = collection.NewSimple(variables.MultipartInvalidQuoting)
+		tx.Collections[variables.MultipartInvalidQuoting] = tx.variables.multipartInvalidQuoting
+		tx.variables.multipartLfLine = collection.NewSimple(variables.MultipartLfLine)
+		tx.Collections[variables.MultipartLfLine] = tx.variables.multipartLfLine
+		tx.variables.multipartMissingSemicolon = collection.NewSimple(variables.MultipartMissingSemicolon)
+		tx.Collections[variables.MultipartMissingSemicolon] = tx.variables.multipartMissingSemicolon
+		tx.variables.multipartStrictError = collection.NewSimple(variables.MultipartStrictError)
+		tx.Collections[variables.MultipartStrictError] = tx.variables.multipartStrictError
+		tx.variables.multipartUnmatchedBoundary = collection.NewSimple(variables.MultipartUnmatchedBoundary)
+		tx.Collections[variables.MultipartUnmatchedBoundary] = tx.variables.multipartUnmatchedBoundary
+		tx.variables.outboundDataError = collection.NewSimple(variables.OutboundDataError)
+		tx.Collections[variables.OutboundDataError] = tx.variables.outboundDataError
+		tx.variables.pathInfo = collection.NewSimple(variables.PathInfo)
+		tx.Collections[variables.PathInfo] = tx.variables.pathInfo
+		tx.variables.queryString = collection.NewSimple(variables.QueryString)
+		tx.Collections[variables.QueryString] = tx.variables.queryString
+		tx.variables.remoteAddr = collection.NewSimple(variables.RemoteAddr)
+		tx.Collections[variables.RemoteAddr] = tx.variables.remoteAddr
+		tx.variables.remoteHost = collection.NewSimple(variables.RemoteHost)
+		tx.Collections[variables.RemoteHost] = tx.variables.remoteHost
+		tx.variables.remotePort = collection.NewSimple(variables.RemotePort)
+		tx.Collections[variables.RemotePort] = tx.variables.remotePort
+		tx.variables.reqbodyError = collection.NewSimple(variables.ReqbodyError)
+		tx.Collections[variables.ReqbodyError] = tx.variables.reqbodyError
+		tx.variables.reqbodyErrorMsg = collection.NewSimple(variables.ReqbodyErrorMsg)
+		tx.Collections[variables.ReqbodyErrorMsg] = tx.variables.reqbodyErrorMsg
+		tx.variables.reqbodyProcessorError = collection.NewSimple(variables.ReqbodyProcessorError)
+		tx.Collections[variables.ReqbodyProcessorError] = tx.variables.reqbodyProcessorError
+		tx.variables.reqbodyProcessorErrorMsg = collection.NewSimple(variables.ReqbodyProcessorErrorMsg)
+		tx.Collections[variables.ReqbodyProcessorErrorMsg] = tx.variables.reqbodyProcessorErrorMsg
+		tx.variables.reqbodyProcessor = collection.NewSimple(variables.ReqbodyProcessor)
+		tx.Collections[variables.ReqbodyProcessor] = tx.variables.reqbodyProcessor
+		tx.variables.requestBasename = collection.NewSimple(variables.RequestBasename)
+		tx.Collections[variables.RequestBasename] = tx.variables.requestBasename
+		tx.variables.requestBody = collection.NewSimple(variables.RequestBody)
+		tx.Collections[variables.RequestBody] = tx.variables.requestBody
+		tx.variables.requestBodyLength = collection.NewSimple(variables.RequestBodyLength)
+		tx.Collections[variables.RequestBodyLength] = tx.variables.requestBodyLength
+		tx.variables.requestFilename = collection.NewSimple(variables.RequestFilename)
+		tx.Collections[variables.RequestFilename] = tx.variables.requestFilename
+		tx.variables.requestLine = collection.NewSimple(variables.RequestLine)
+		tx.Collections[variables.RequestLine] = tx.variables.requestLine
+		tx.variables.requestMethod = collection.NewSimple(variables.RequestMethod)
+		tx.Collections[variables.RequestMethod] = tx.variables.requestMethod
+		tx.variables.requestProtocol = collection.NewSimple(variables.RequestProtocol)
+		tx.Collections[variables.RequestProtocol] = tx.variables.requestProtocol
+		tx.variables.requestURI = collection.NewSimple(variables.RequestURI)
+		tx.Collections[variables.RequestURI] = tx.variables.requestURI
+		tx.variables.requestURIRaw = collection.NewSimple(variables.RequestURIRaw)
+		tx.Collections[variables.RequestURIRaw] = tx.variables.requestURIRaw
+		tx.variables.responseBody = collection.NewSimple(variables.ResponseBody)
+		tx.Collections[variables.ResponseBody] = tx.variables.responseBody
+		tx.variables.responseContentLength = collection.NewSimple(variables.ResponseContentLength)
+		tx.Collections[variables.ResponseContentLength] = tx.variables.responseContentLength
+		tx.variables.responseProtocol = collection.NewSimple(variables.ResponseProtocol)
+		tx.Collections[variables.ResponseProtocol] = tx.variables.responseProtocol
+		tx.variables.responseStatus = collection.NewSimple(variables.ResponseStatus)
+		tx.Collections[variables.ResponseStatus] = tx.variables.responseStatus
+		tx.variables.serverAddr = collection.NewSimple(variables.ServerAddr)
+		tx.Collections[variables.ServerAddr] = tx.variables.serverAddr
+		tx.variables.serverName = collection.NewSimple(variables.ServerName)
+		tx.Collections[variables.ServerName] = tx.variables.serverName
+		tx.variables.serverPort = collection.NewSimple(variables.ServerPort)
+		tx.Collections[variables.ServerPort] = tx.variables.serverPort
+		tx.variables.sessionID = collection.NewSimple(variables.Sessionid)
+		tx.Collections[variables.Sessionid] = tx.variables.sessionID
+		tx.variables.highestSeverity = collection.NewSimple(variables.HighestSeverity)
+		tx.Collections[variables.HighestSeverity] = tx.variables.highestSeverity
+		tx.variables.statusLine = collection.NewSimple(variables.StatusLine)
+		tx.Collections[variables.StatusLine] = tx.variables.statusLine
+		tx.variables.inboundErrorData = collection.NewSimple(variables.InboundErrorData)
+		tx.Collections[variables.InboundErrorData] = tx.variables.inboundErrorData
+		tx.variables.duration = collection.NewSimple(variables.Duration)
+		tx.Collections[variables.Duration] = tx.variables.duration
+		tx.variables.responseHeadersNames = collection.NewMap(variables.ResponseHeadersNames)
+		tx.Collections[variables.ResponseHeadersNames] = tx.variables.responseHeadersNames
+		tx.variables.requestHeadersNames = collection.NewMap(variables.RequestHeadersNames)
+		tx.Collections[variables.RequestHeadersNames] = tx.variables.requestHeadersNames
+		tx.variables.userID = collection.NewSimple(variables.Userid)
+		tx.Collections[variables.Userid] = tx.variables.userID
+
+		tx.variables.argsGet = collection.NewMap(variables.ArgsGet)
+		tx.Collections[variables.ArgsGet] = tx.variables.argsGet
+		tx.variables.argsPost = collection.NewMap(variables.ArgsPost)
+		tx.Collections[variables.ArgsPost] = tx.variables.argsPost
+		tx.variables.argsPath = collection.NewMap(variables.ArgsPath)
+		tx.Collections[variables.ArgsPath] = tx.variables.argsPath
+		tx.variables.filesSizes = collection.NewMap(variables.FilesSizes)
+		tx.Collections[variables.FilesSizes] = tx.variables.filesSizes
+		tx.variables.filesTmpContent = collection.NewMap(variables.FilesTmpContent)
+		tx.Collections[variables.FilesTmpContent] = tx.variables.filesTmpContent
+		tx.variables.multipartFilename = collection.NewMap(variables.MultipartFilename)
+		tx.Collections[variables.MultipartFilename] = tx.variables.multipartFilename
+		tx.variables.multipartName = collection.NewMap(variables.MultipartName)
+		tx.Collections[variables.MultipartName] = tx.variables.multipartName
+		tx.variables.matchedVars = collection.NewMap(variables.MatchedVars)
+		tx.Collections[variables.MatchedVars] = tx.variables.matchedVars
+		tx.variables.requestCookies = collection.NewMap(variables.RequestCookies)
+		tx.Collections[variables.RequestCookies] = tx.variables.requestCookies
+		tx.variables.requestHeaders = collection.NewMap(variables.RequestHeaders)
+		tx.Collections[variables.RequestHeaders] = tx.variables.requestHeaders
+		tx.variables.responseHeaders = collection.NewMap(variables.ResponseHeaders)
+		tx.Collections[variables.ResponseHeaders] = tx.variables.responseHeaders
+		tx.variables.geo = collection.NewMap(variables.Geo)
+		tx.Collections[variables.Geo] = tx.variables.geo
+		tx.variables.tx = collection.NewMap(variables.TX)
+		tx.Collections[variables.TX] = tx.variables.tx
+		tx.variables.rule = collection.NewMap(variables.Rule)
+		tx.Collections[variables.Rule] = tx.variables.rule
+		tx.variables.env = collection.NewMap(variables.Env)
+		tx.Collections[variables.Env] = tx.variables.env
+		tx.variables.ip = collection.NewMap(variables.IP)
+		tx.Collections[variables.IP] = tx.variables.ip
+		tx.variables.files = collection.NewMap(variables.Files)
+		tx.Collections[variables.Files] = tx.variables.files
+		tx.variables.matchedVarsNames = collection.NewMap(variables.MatchedVarsNames)
+		tx.Collections[variables.MatchedVarsNames] = tx.variables.matchedVarsNames
+		tx.variables.filesNames = collection.NewMap(variables.FilesNames)
+		tx.Collections[variables.FilesNames] = tx.variables.filesNames
+		tx.variables.filesTmpNames = collection.NewMap(variables.FilesTmpNames)
+		tx.Collections[variables.FilesTmpNames] = tx.variables.filesTmpNames
+		tx.variables.requestCookiesNames = collection.NewMap(variables.RequestCookiesNames)
+		tx.Collections[variables.RequestCookiesNames] = tx.variables.requestCookiesNames
+		tx.variables.responseXML = collection.NewMap(variables.ResponseXML)
+		tx.Collections[variables.ResponseXML] = tx.variables.responseXML
+		tx.variables.requestXML = collection.NewMap(variables.RequestXML)
+		tx.Collections[variables.RequestXML] = tx.variables.requestXML
+		tx.variables.multipartPartHeaders = collection.NewMap(variables.MultipartPartHeaders)
+		tx.Collections[variables.MultipartPartHeaders] = tx.variables.multipartPartHeaders
+
+		tx.variables.argsCombinedSize = collection.NewCollectionSizeProxy(variables.ArgsCombinedSize, tx.variables.argsGet, tx.variables.argsPost)
+		tx.Collections[variables.ArgsCombinedSize] = tx.variables.argsCombinedSize
 
 		// XML is a pointer to RequestXML
-		tx.Variables.XML = tx.Variables.RequestXML
-		tx.Collections[variables.XML] = tx.Variables.RequestXML
-		tx.Variables.Args = collection.NewProxy(
+		tx.variables.xml = tx.variables.requestXML
+		tx.Collections[variables.XML] = tx.variables.requestXML
+		tx.variables.args = collection.NewProxy(
 			variables.Args,
-			tx.Variables.ArgsGet,
-			tx.Variables.ArgsPost,
-			tx.Variables.ArgsPath,
+			tx.variables.argsGet,
+			tx.variables.argsPost,
+			tx.variables.argsPath,
 		)
-		tx.Collections[variables.Args] = tx.Variables.Args
+		tx.Collections[variables.Args] = tx.variables.args
 
-		tx.Variables.ArgsNames = collection.NewTranslationProxy(
+		tx.variables.argsNames = collection.NewTranslationProxy(
 			variables.ArgsNames,
-			tx.Variables.ArgsGet,
-			tx.Variables.ArgsPost,
-			tx.Variables.ArgsPath,
+			tx.variables.argsGet,
+			tx.variables.argsPost,
+			tx.variables.argsPath,
 		)
-		tx.Collections[variables.ArgsNames] = tx.Variables.ArgsNames
-		tx.Variables.ArgsGetNames = collection.NewTranslationProxy(
+		tx.Collections[variables.ArgsNames] = tx.variables.argsNames
+		tx.variables.argsGetNames = collection.NewTranslationProxy(
 			variables.ArgsGetNames,
-			tx.Variables.ArgsGet,
+			tx.variables.argsGet,
 		)
-		tx.Collections[variables.ArgsGetNames] = tx.Variables.ArgsGetNames
-		tx.Variables.ArgsPostNames = collection.NewTranslationProxy(
+		tx.Collections[variables.ArgsGetNames] = tx.variables.argsGetNames
+		tx.variables.argsPostNames = collection.NewTranslationProxy(
 			variables.ArgsPostNames,
-			tx.Variables.ArgsPost,
+			tx.variables.argsPost,
 		)
-		tx.Collections[variables.ArgsPostNames] = tx.Variables.ArgsPostNames
+		tx.Collections[variables.ArgsPostNames] = tx.variables.argsPostNames
 	}
 
 	// set capture variables
 	for i := 0; i <= 10; i++ {
 		is := strconv.Itoa(i)
-		tx.Variables.TX.Set(is, []string{""})
+		tx.variables.tx.Set(is, []string{""})
 	}
 
 	// Some defaults
-	tx.Variables.FilesCombinedSize.Set("0")
-	tx.Variables.UrlencodedError.Set("0")
-	tx.Variables.FullRequestLength.Set("0")
-	tx.Variables.MultipartBoundaryQuoted.Set("0")
-	tx.Variables.MultipartBoundaryWhitespace.Set("0")
-	tx.Variables.MultipartCrlfLfLines.Set("0")
-	tx.Variables.MultipartDataAfter.Set("0")
-	tx.Variables.MultipartDataBefore.Set("0")
-	tx.Variables.MultipartFileLimitExceeded.Set("0")
-	tx.Variables.MultipartHeaderFolding.Set("0")
-	tx.Variables.MultipartInvalidHeaderFolding.Set("0")
-	tx.Variables.MultipartInvalidPart.Set("0")
-	tx.Variables.MultipartInvalidQuoting.Set("0")
-	tx.Variables.MultipartLfLine.Set("0")
-	tx.Variables.MultipartMissingSemicolon.Set("0")
-	tx.Variables.MultipartStrictError.Set("0")
-	tx.Variables.MultipartUnmatchedBoundary.Set("0")
-	tx.Variables.OutboundDataError.Set("0")
-	tx.Variables.ReqbodyError.Set("0")
-	tx.Variables.ReqbodyProcessorError.Set("0")
-	tx.Variables.RequestBodyLength.Set("0")
-	tx.Variables.Duration.Set("0")
-	tx.Variables.HighestSeverity.Set("0")
-	tx.Variables.UniqueID.Set(tx.ID)
-
-	w.Logger.Debug("New transaction created with id %q", tx.ID)
+	tx.variables.filesCombinedSize.Set("0")
+	tx.variables.urlencodedError.Set("0")
+	tx.variables.fullRequestLength.Set("0")
+	tx.variables.multipartBoundaryQuoted.Set("0")
+	tx.variables.multipartBoundaryWhitespace.Set("0")
+	tx.variables.multipartCrlfLfLines.Set("0")
+	tx.variables.multipartDataAfter.Set("0")
+	tx.variables.multipartDataBefore.Set("0")
+	tx.variables.multipartFileLimitExceeded.Set("0")
+	tx.variables.multipartHeaderFolding.Set("0")
+	tx.variables.multipartInvalidHeaderFolding.Set("0")
+	tx.variables.multipartInvalidPart.Set("0")
+	tx.variables.multipartInvalidQuoting.Set("0")
+	tx.variables.multipartLfLine.Set("0")
+	tx.variables.multipartMissingSemicolon.Set("0")
+	tx.variables.multipartStrictError.Set("0")
+	tx.variables.multipartUnmatchedBoundary.Set("0")
+	tx.variables.outboundDataError.Set("0")
+	tx.variables.reqbodyError.Set("0")
+	tx.variables.reqbodyProcessorError.Set("0")
+	tx.variables.requestBodyLength.Set("0")
+	tx.variables.duration.Set("0")
+	tx.variables.highestSeverity.Set("0")
+	tx.variables.uniqueID.Set(tx.id)
+
+	w.Logger.Debug("New transaction created with id %q", tx.id)
 
 	return tx
 }
diff --git a/operators/rbl.go b/operators/rbl.go
index 8158317..926c05b 100644
--- a/operators/rbl.go
+++ b/operators/rbl.go
@@ -67,7 +67,7 @@ func (o *rbl) Evaluate(tx rules.TransactionState, ipAddr string) bool {
 			if len(txt) > 0 {
 				status := txt[0]
 				captures = append(captures, status)
-				tx.GetVariables().GetTX().Set("httpbl_msg", []string{status})
+				tx.Variables().TX().Set("httpbl_msg", []string{status})
 			}
 		}
 
diff --git a/operators/restpath.go b/operators/restpath.go
index 99913f7..57da28e 100644
--- a/operators/restpath.go
+++ b/operators/restpath.go
@@ -42,7 +42,7 @@ func (o *restpath) Evaluate(tx rules.TransactionState, value string) bool {
 	}
 	for i, m := range o.re.SubexpNames() {
 		if i != 0 && m != "" {
-			tx.GetVariables().GetArgsPath().SetIndex(m, 0, match[i])
+			tx.Variables().ArgsPath().SetIndex(m, 0, match[i])
 		}
 	}
 	return true
diff --git a/rules/transaction.go b/rules/transaction.go
index 91dafc6..1ba1b6d 100644
--- a/rules/transaction.go
+++ b/rules/transaction.go
@@ -14,11 +14,11 @@ import (
 
 // TransactionState tracks the state of a transaction for use in actions and operators.
 type TransactionState interface {
-	// GetID returns the ID of the transaction.
-	GetID() string // TODO(anuraaga): If only for logging, can be built into logger
+	// ID returns the ID of the transaction.
+	ID() string // TODO(anuraaga): If only for logging, can be built into logger
 
-	// GetVariables returns the TransactionVariables of the transaction.
-	GetVariables() TransactionVariables
+	// Variables returns the TransactionVariables of the transaction.
+	Variables() TransactionVariables
 
 	// Collection returns a collection from the transaction.
 	Collection(idx variables.RuleVariable) collection.Collection
@@ -45,97 +45,97 @@ type TransactionState interface {
 // TransactionVariables has pointers to all the variables of the transaction
 type TransactionVariables interface {
 	// Simple Variables
-	GetUserID() *collection.Simple
-	GetUrlencodedError() *collection.Simple
-	GetResponseContentType() *collection.Simple
-	GetUniqueID() *collection.Simple
-	GetArgsCombinedSize() *collection.SizeProxy
-	GetAuthType() *collection.Simple
-	GetFilesCombinedSize() *collection.Simple
-	GetFullRequest() *collection.Simple
-	GetFullRequestLength() *collection.Simple
-	GetInboundDataError() *collection.Simple
-	GetMatchedVar() *collection.Simple
-	GetMatchedVarName() *collection.Simple
-	GetMultipartBoundaryQuoted() *collection.Simple
-	GetMultipartBoundaryWhitespace() *collection.Simple
-	GetMultipartCrlfLfLines() *collection.Simple
-	GetMultipartDataAfter() *collection.Simple
-	GetMultipartDataBefore() *collection.Simple
-	GetMultipartFileLimitExceeded() *collection.Simple
-	GetMultipartHeaderFolding() *collection.Simple
-	GetMultipartInvalidHeaderFolding() *collection.Simple
-	GetMultipartInvalidPart() *collection.Simple
-	GetMultipartInvalidQuoting() *collection.Simple
-	GetMultipartLfLine() *collection.Simple
-	GetMultipartMissingSemicolon() *collection.Simple
-	GetMultipartStrictError() *collection.Simple
-	GetMultipartUnmatchedBoundary() *collection.Simple
-	GetOutboundDataError() *collection.Simple
-	GetPathInfo() *collection.Simple
-	GetQueryString() *collection.Simple
-	GetRemoteAddr() *collection.Simple
-	GetRemoteHost() *collection.Simple
-	GetRemotePort() *collection.Simple
-	GetReqbodyError() *collection.Simple
-	GetReqbodyErrorMsg() *collection.Simple
-	GetReqbodyProcessorError() *collection.Simple
-	GetReqbodyProcessorErrorMsg() *collection.Simple
-	GetReqbodyProcessor() *collection.Simple
-	GetRequestBasename() *collection.Simple
-	GetRequestBody() *collection.Simple
-	GetRequestBodyLength() *collection.Simple
-	GetRequestFilename() *collection.Simple
-	GetRequestLine() *collection.Simple
-	GetRequestMethod() *collection.Simple
-	GetRequestProtocol() *collection.Simple
-	GetRequestURI() *collection.Simple
-	GetRequestURIRaw() *collection.Simple
-	GetResponseBody() *collection.Simple
-	GetResponseContentLength() *collection.Simple
-	GetResponseProtocol() *collection.Simple
-	GetResponseStatus() *collection.Simple
-	GetServerAddr() *collection.Simple
-	GetServerName() *collection.Simple
-	GetServerPort() *collection.Simple
-	GetSessionid() *collection.Simple
-	GetHighestSeverity() *collection.Simple
-	GetStatusLine() *collection.Simple
-	GetInboundErrorData() *collection.Simple
+	UserID() *collection.Simple
+	UrlencodedError() *collection.Simple
+	ResponseContentType() *collection.Simple
+	UniqueID() *collection.Simple
+	ArgsCombinedSize() *collection.SizeProxy
+	AuthType() *collection.Simple
+	FilesCombinedSize() *collection.Simple
+	FullRequest() *collection.Simple
+	FullRequestLength() *collection.Simple
+	InboundDataError() *collection.Simple
+	MatchedVar() *collection.Simple
+	MatchedVarName() *collection.Simple
+	MultipartBoundaryQuoted() *collection.Simple
+	MultipartBoundaryWhitespace() *collection.Simple
+	MultipartCrlfLfLines() *collection.Simple
+	MultipartDataAfter() *collection.Simple
+	MultipartDataBefore() *collection.Simple
+	MultipartFileLimitExceeded() *collection.Simple
+	MultipartHeaderFolding() *collection.Simple
+	MultipartInvalidHeaderFolding() *collection.Simple
+	MultipartInvalidPart() *collection.Simple
+	MultipartInvalidQuoting() *collection.Simple
+	MultipartLfLine() *collection.Simple
+	MultipartMissingSemicolon() *collection.Simple
+	MultipartStrictError() *collection.Simple
+	MultipartUnmatchedBoundary() *collection.Simple
+	OutboundDataError() *collection.Simple
+	PathInfo() *collection.Simple
+	QueryString() *collection.Simple
+	RemoteAddr() *collection.Simple
+	RemoteHost() *collection.Simple
+	RemotePort() *collection.Simple
+	RequestBodyError() *collection.Simple
+	RequestBodyErrorMsg() *collection.Simple
+	RequestBodyProcessorError() *collection.Simple
+	RequestBodyProcessorErrorMsg() *collection.Simple
+	RequestBodyProcessor() *collection.Simple
+	RequestBasename() *collection.Simple
+	RequestBody() *collection.Simple
+	RequestBodyLength() *collection.Simple
+	RequestFilename() *collection.Simple
+	RequestLine() *collection.Simple
+	RequestMethod() *collection.Simple
+	RequestProtocol() *collection.Simple
+	RequestURI() *collection.Simple
+	RequestURIRaw() *collection.Simple
+	ResponseBody() *collection.Simple
+	ResponseContentLength() *collection.Simple
+	ResponseProtocol() *collection.Simple
+	ResponseStatus() *collection.Simple
+	ServerAddr() *collection.Simple
+	ServerName() *collection.Simple
+	ServerPort() *collection.Simple
+	SessionID() *collection.Simple
+	HighestSeverity() *collection.Simple
+	StatusLine() *collection.Simple
+	InboundErrorData() *collection.Simple
 	// Custom
-	GetEnv() *collection.Map
-	GetTX() *collection.Map
-	GetRule() *collection.Map
-	GetDuration() *collection.Simple
+	Env() *collection.Map
+	TX() *collection.Map
+	Rule() *collection.Map
+	Duration() *collection.Simple
 	// Proxy Variables
-	GetArgs() *collection.Proxy
+	Args() *collection.Proxy
 	// Maps Variables
-	GetArgsGet() *collection.Map
-	GetArgsPost() *collection.Map
-	GetArgsPath() *collection.Map
-	GetFilesTmpNames() *collection.Map
-	GetGeo() *collection.Map
-	GetFiles() *collection.Map
-	GetRequestCookies() *collection.Map
-	GetRequestHeaders() *collection.Map
-	GetResponseHeaders() *collection.Map
-	GetMultipartName() *collection.Map
-	GetMatchedVarsNames() *collection.Map
-	GetMultipartFilename() *collection.Map
-	GetMatchedVars() *collection.Map
-	GetFilesSizes() *collection.Map
-	GetFilesNames() *collection.Map
-	GetFilesTmpContent() *collection.Map
-	GetResponseHeadersNames() *collection.Map
-	GetRequestHeadersNames() *collection.Map
-	GetRequestCookiesNames() *collection.Map
-	GetXML() *collection.Map
-	GetRequestXML() *collection.Map
-	GetResponseXML() *collection.Map
+	ArgsGet() *collection.Map
+	ArgsPost() *collection.Map
+	ArgsPath() *collection.Map
+	FilesTmpNames() *collection.Map
+	Geo() *collection.Map
+	Files() *collection.Map
+	RequestCookies() *collection.Map
+	RequestHeaders() *collection.Map
+	ResponseHeaders() *collection.Map
+	MultipartName() *collection.Map
+	MatchedVarsNames() *collection.Map
+	MultipartFilename() *collection.Map
+	MatchedVars() *collection.Map
+	FilesSizes() *collection.Map
+	FilesNames() *collection.Map
+	FilesTmpContent() *collection.Map
+	ResponseHeadersNames() *collection.Map
+	RequestHeadersNames() *collection.Map
+	RequestCookiesNames() *collection.Map
+	XML() *collection.Map
+	RequestXML() *collection.Map
+	ResponseXML() *collection.Map
 	// Persistent variables
-	GetIP() *collection.Map
+	IP() *collection.Map
 	// Translation Proxy Variables
-	GetArgsNames() *collection.TranslationProxy
-	GetArgsGetNames() *collection.TranslationProxy
-	GetArgsPostNames() *collection.TranslationProxy
+	ArgsNames() *collection.TranslationProxy
+	ArgsGetNames() *collection.TranslationProxy
+	ArgsPostNames() *collection.TranslationProxy
 }
diff --git a/types/transaction.go b/types/transaction.go
index 2d67fd7..d5fdbfe 100644
--- a/types/transaction.go
+++ b/types/transaction.go
@@ -104,12 +104,12 @@ type Transaction interface {
 	// Interrupted will return true if the transaction was interrupted
 	Interrupted() bool
 
-	// GetInterruption returns the types.Interruption if the request was interrupted,
+	// Interruption returns the types.Interruption if the request was interrupted,
 	// or nil otherwise.
-	GetInterruption() *Interruption
+	Interruption() *Interruption
 
-	// GetMatchedRules returns the rules that have matched the requests with associated information.
-	GetMatchedRules() []MatchedRule
+	// MatchedRules returns the rules that have matched the requests with associated information.
+	MatchedRules() []MatchedRule
 
 	// Closer closes the transaction and releases any resources associated with it such as request/response bodies.
 	io.Closer


Test patch:
diff --git a/actions/ctl_test.go b/actions/ctl_test.go
index 64be982..c72abf3 100644
--- a/actions/ctl_test.go
+++ b/actions/ctl_test.go
@@ -73,7 +73,7 @@ func TestCtl(t *testing.T) {
 			t.Errorf("failed to init requestBodyProcessor %s", bp)
 		}
 		ctlf.Evaluate(r, tx)
-		if tx.Variables.ReqbodyProcessor.String() != bp {
+		if tx.Variables().RequestBodyProcessor().String() != bp {
 			t.Error("failed to set RequestBodyProcessor " + bp)
 		}
 	}
diff --git a/http/middleware_test.go b/http/middleware_test.go
index a429caf..c17b1b6 100644
--- a/http/middleware_test.go
+++ b/http/middleware_test.go
@@ -35,7 +35,7 @@ func TestProcessRequest(t *testing.T) {
 	if _, err := processRequest(tx, req); err != nil {
 		t.Fatal(err)
 	}
-	if tx.Variables.RequestMethod.String() != "POST" {
+	if tx.Variables().RequestMethod().String() != "POST" {
 		t.Fatal("failed to set request from request object")
 	}
 	if err := tx.Close(); err != nil {
diff --git a/internal/corazawaf/transaction_test.go b/internal/corazawaf/transaction_test.go
index a57f15a..b267020 100644
--- a/internal/corazawaf/transaction_test.go
+++ b/internal/corazawaf/transaction_test.go
@@ -181,11 +181,11 @@ func TestRequestBody(t *testing.T) {
 			}
 
 			if testCase.shouldInterrupt {
-				if tx.Interruption == nil {
+				if tx.interruption == nil {
 					t.Error("expected interruption")
 				}
 			} else {
-				val := tx.Variables.ArgsPost.Get("some")
+				val := tx.variables.argsPost.Get("some")
 				if len(val) != 1 || val[0] != "result" {
 					t.Error("Failed to set url encoded post data")
 				}
@@ -199,7 +199,7 @@ func TestRequestBody(t *testing.T) {
 func TestResponseHeader(t *testing.T) {
 	tx := makeTransaction(t)
 	tx.AddResponseHeader("content-type", "test")
-	if tx.Variables.ResponseContentType.String() != "test" {
+	if tx.variables.responseContentType.String() != "test" {
 		t.Error("invalid RESPONSE_CONTENT_TYPE after response headers")
 	}
 
@@ -213,7 +213,7 @@ func TestAuditLog(t *testing.T) {
 	tx := makeTransaction(t)
 	tx.AuditLogParts = types.AuditLogParts("ABCDEFGHIJK")
 	al := tx.AuditLog()
-	if al.Transaction.ID != tx.ID {
+	if al.Transaction.ID != tx.id {
 		t.Error("invalid auditlog id")
 	}
 	// TODO more checks
@@ -233,7 +233,7 @@ func TestResponseBody(t *testing.T) {
 	if _, err := tx.ProcessResponseBody(); err != nil {
 		t.Error("Failed to process response body")
 	}
-	if tx.Variables.ResponseBody.String() != "test123" {
+	if tx.variables.responseBody.String() != "test123" {
 		t.Error("failed to set response body")
 	}
 	if err := tx.Close(); err != nil {
@@ -254,7 +254,7 @@ func TestAuditLogFields(t *testing.T) {
 			Variable:     variables.UniqueID,
 		},
 	})
-	if len(tx.MatchedRules) == 0 || tx.MatchedRules[0].Rule.ID != rule.ID {
+	if len(tx.matchedRules) == 0 || tx.matchedRules[0].Rule.ID != rule.ID {
 		t.Error("failed to match rule for audit")
 	}
 	al := tx.AuditLog()
@@ -276,11 +276,11 @@ func TestResetCapture(t *testing.T) {
 	tx := makeTransaction(t)
 	tx.Capture = true
 	tx.CaptureField(5, "test")
-	if tx.Variables.TX.Get("5")[0] != "test" {
+	if tx.variables.tx.Get("5")[0] != "test" {
 		t.Error("failed to set capture field from tx")
 	}
 	tx.resetCaptures()
-	if tx.Variables.TX.Get("5")[0] != "" {
+	if tx.variables.tx.Get("5")[0] != "" {
 		t.Error("failed to reset capture field from tx")
 	}
 	if err := tx.Close(); err != nil {
@@ -291,7 +291,7 @@ func TestResetCapture(t *testing.T) {
 func TestRelevantAuditLogging(t *testing.T) {
 	tx := makeTransaction(t)
 	tx.WAF.AuditLogRelevantStatus = regexp.MustCompile(`(403)`)
-	tx.Variables.ResponseStatus.Set("403")
+	tx.variables.responseStatus.Set("403")
 	tx.AuditEngine = types.AuditEngineRelevantOnly
 	// tx.WAF.auditLogger = loggers.NewAuditLogger()
 	tx.ProcessLogging()
@@ -315,7 +315,7 @@ func TestLogCallback(t *testing.T) {
 			Variable:     variables.UniqueID,
 		},
 	})
-	if buffer == "" && strings.Contains(buffer, tx.ID) {
+	if buffer == "" && strings.Contains(buffer, tx.id) {
 		t.Error("failed to call error log callback")
 	}
 	if err := tx.Close(); err != nil {
@@ -328,17 +328,17 @@ func TestHeaderSetters(t *testing.T) {
 	tx := waf.NewTransaction()
 	tx.AddRequestHeader("cookie", "abc=def;hij=klm")
 	tx.AddRequestHeader("test1", "test2")
-	c := tx.Variables.RequestCookies.Get("abc")[0]
+	c := tx.variables.requestCookies.Get("abc")[0]
 	if c != "def" {
 		t.Errorf("failed to set cookie, got %q", c)
 	}
-	if tx.Variables.RequestHeaders.Get("cookie")[0] != "abc=def;hij=klm" {
+	if tx.variables.requestHeaders.Get("cookie")[0] != "abc=def;hij=klm" {
 		t.Error("failed to set request header")
 	}
-	if !utils.InSlice("cookie", tx.Variables.RequestHeadersNames.Get("cookie")) {
-		t.Error("failed to set header name", tx.Variables.RequestHeadersNames.Get("cookie"))
+	if !utils.InSlice("cookie", tx.variables.requestHeadersNames.Get("cookie")) {
+		t.Error("failed to set header name", tx.variables.requestHeadersNames.Get("cookie"))
 	}
-	if !utils.InSlice("abc", tx.Variables.RequestCookiesNames.Get("abc")) {
+	if !utils.InSlice("abc", tx.variables.requestCookiesNames.Get("abc")) {
 		t.Error("failed to set cookie name")
 	}
 	if err := tx.Close(); err != nil {
@@ -360,7 +360,7 @@ func TestRequestBodyProcessingAlgorithm(t *testing.T) {
 	if _, err := tx.ProcessRequestBody(); err != nil {
 		t.Error("failed to process request body")
 	}
-	if tx.Variables.RequestBody.String() != "test123" {
+	if tx.variables.requestBody.String() != "test123" {
 		t.Error("failed to set request body")
 	}
 	if err := tx.Close(); err != nil {
@@ -446,7 +446,7 @@ func TestAuditLogMessages(t *testing.T) {
 func TestTransactionSyncPool(t *testing.T) {
 	waf := NewWAF()
 	tx := waf.NewTransaction()
-	tx.MatchedRules = append(tx.MatchedRules, types.MatchedRule{
+	tx.matchedRules = append(tx.matchedRules, types.MatchedRule{
 		Rule: types.RuleMetadata{
 			ID: 1234,
 		},
@@ -456,8 +456,8 @@ func TestTransactionSyncPool(t *testing.T) {
 			t.Error(err)
 		}
 		tx = waf.NewTransaction()
-		if len(tx.MatchedRules) != 0 {
-			t.Errorf("failed to sync transaction pool, %d rules found after %d attempts", len(tx.MatchedRules), i+1)
+		if len(tx.matchedRules) != 0 {
+			t.Errorf("failed to sync transaction pool, %d rules found after %d attempts", len(tx.matchedRules), i+1)
 			return
 		}
 	}
@@ -475,10 +475,10 @@ func TestTxPhase4Magic(t *testing.T) {
 	if _, err := tx.ProcessResponseBody(); err != nil {
 		t.Error(err)
 	}
-	if tx.Variables.OutboundDataError.String() != "1" {
+	if tx.variables.outboundDataError.String() != "1" {
 		t.Error("failed to set outbound data error")
 	}
-	if tx.Variables.ResponseBody.String() != "mor" {
+	if tx.variables.responseBody.String() != "mor" {
 		t.Error("failed to set response body")
 	}
 }
@@ -503,7 +503,7 @@ func TestVariablesMatch(t *testing.T) {
 		}
 	}
 
-	if len(tx.Variables.MatchedVars.Get("ARGS_NAMES:sample")) == 0 {
+	if len(tx.variables.matchedVars.Get("ARGS_NAMES:sample")) == 0 {
 		t.Errorf("failed to match variable %s, got 0", variables.MatchedVars.Name())
 	}
 }
@@ -519,7 +519,7 @@ func TestTxReqBodyForce(t *testing.T) {
 	if _, err := tx.ProcessRequestBody(); err != nil {
 		t.Error(err)
 	}
-	if tx.Variables.RequestBody.String() != "test" {
+	if tx.variables.requestBody.String() != "test" {
 		t.Error("failed to set request body")
 	}
 }
@@ -535,7 +535,7 @@ func TestTxReqBodyForceNegative(t *testing.T) {
 	if _, err := tx.ProcessRequestBody(); err != nil {
 		t.Error(err)
 	}
-	if tx.Variables.RequestBody.String() == "test" {
+	if tx.variables.requestBody.String() == "test" {
 		t.Error("reqbody should not be there")
 	}
 }
@@ -544,10 +544,10 @@ func TestTxProcessConnection(t *testing.T) {
 	waf := NewWAF()
 	tx := waf.NewTransaction()
 	tx.ProcessConnection("127.0.0.1", 80, "127.0.0.2", 8080)
-	if tx.Variables.RemoteAddr.String() != "127.0.0.1" {
+	if tx.variables.remoteAddr.String() != "127.0.0.1" {
 		t.Error("failed to set client ip")
 	}
-	if tx.Variables.RemotePort.Int() != 80 {
+	if tx.variables.remotePort.Int() != 80 {
 		t.Error("failed to set client port")
 	}
 }
@@ -568,19 +568,19 @@ func TestTxProcessURI(t *testing.T) {
 	tx := waf.NewTransaction()
 	uri := "http://example.com/path/to/file.html?query=string&other=value"
 	tx.ProcessURI(uri, "GET", "HTTP/1.1")
-	if s := tx.Variables.RequestURI.String(); s != uri {
+	if s := tx.variables.requestURI.String(); s != uri {
 		t.Errorf("failed to set request uri, got %s", s)
 	}
-	if s := tx.Variables.RequestBasename.String(); s != "file.html" {
+	if s := tx.variables.requestBasename.String(); s != "file.html" {
 		t.Errorf("failed to set request path, got %s", s)
 	}
-	if tx.Variables.QueryString.String() != "query=string&other=value" {
+	if tx.variables.queryString.String() != "query=string&other=value" {
 		t.Error("failed to set request query")
 	}
-	if v := tx.Variables.Args.FindAll(); len(v) != 2 {
+	if v := tx.variables.args.FindAll(); len(v) != 2 {
 		t.Errorf("failed to set request args, got %d", len(v))
 	}
-	if v := tx.Variables.Args.FindString("other"); v[0].Value != "value" {
+	if v := tx.variables.args.FindString("other"); v[0].Value != "value" {
 		t.Errorf("failed to set request args, got %v", v)
 	}
 }
@@ -672,13 +672,13 @@ func validateMacroExpansion(tests map[string]string, tx *Transaction, t *testing
 
 func TestMacro(t *testing.T) {
 	tx := makeTransaction(t)
-	tx.Variables.TX.Set("some", []string{"secretly"})
+	tx.variables.tx.Set("some", []string{"secretly"})
 	m, err := macro.NewMacro("%{unique_id}")
 	if err != nil {
 		t.Error(err)
 	}
-	if m.Expand(tx) != tx.ID {
-		t.Errorf("%s != %s", m.Expand(tx), tx.ID)
+	if m.Expand(tx) != tx.id {
+		t.Errorf("%s != %s", m.Expand(tx), tx.id)
 	}
 	m, err = macro.NewMacro("some complex text %{tx.some} wrapped in m")
 	if err != nil {
@@ -707,8 +707,8 @@ func BenchmarkMacro(b *testing.B) {
 	}
 
 	tx := makeTransaction(b)
-	tx.Variables.TX.Set("a", []string{"hello"})
-	tx.Variables.TX.Set("b", []string{"world"})
+	tx.variables.tx.Set("a", []string{"hello"})
+	tx.variables.tx.Set("b", []string{"world"})
 
 	for _, tc := range tests {
 		m, err := macro.NewMacro(tc)
diff --git a/internal/corazawaf/waf_test.go b/internal/corazawaf/waf_test.go
index 05c27b4..e244aa0 100644
--- a/internal/corazawaf/waf_test.go
+++ b/internal/corazawaf/waf_test.go
@@ -24,15 +24,15 @@ func TestNewTransaction(t *testing.T) {
 	if tx.RequestBodyLimit != 1044 {
 		t.Error("Request body limit not set")
 	}
-	if tx.ID != "test" {
+	if tx.id != "test" {
 		t.Error("ID not set")
 	}
 	tx = waf.NewTransactionWithID("")
-	if tx.ID == "" {
+	if tx.id == "" {
 		t.Error("ID not set")
 	}
 	tx = waf.NewTransaction()
-	if tx.ID == "" {
+	if tx.id == "" {
 		t.Error("ID not set")
 	}
 }
diff --git a/internal/seclang/body_test.go b/internal/seclang/body_test.go
index e0b25bd..59d0c04 100644
--- a/internal/seclang/body_test.go
+++ b/internal/seclang/body_test.go
@@ -47,7 +47,7 @@ func TestRequestBodyAccessOn(t *testing.T) {
 	if _, err := tx.ProcessRequestBody(); err != nil {
 		t.Error(err)
 	}
-	if len(tx.Variables.ArgsPost.FindAll()) == 0 {
+	if len(tx.Variables().ArgsPost().FindAll()) == 0 {
 		t.Error("Should have args")
 	}
 }
diff --git a/internal/seclang/rules_test.go b/internal/seclang/rules_test.go
index f2778f2..8bc0d7f 100644
--- a/internal/seclang/rules_test.go
+++ b/internal/seclang/rules_test.go
@@ -28,14 +28,14 @@ func TestRuleMatch(t *testing.T) {
 	tx := waf.NewTransaction()
 	tx.ProcessConnection("127.0.0.1", 0, "", 0)
 	tx.ProcessRequestHeaders()
-	if len(tx.MatchedRules) != 1 {
-		t.Errorf("failed to match rules with %d", len(tx.MatchedRules))
+	if len(tx.MatchedRules()) != 1 {
+		t.Errorf("failed to match rules with %d", len(tx.MatchedRules()))
 	}
-	if tx.Interruption == nil {
+	if tx.Interruption() == nil {
 		t.Error("failed to interrupt transaction")
 	}
 
-	if tx.Interruption.RuleID != 1 {
+	if tx.Interruption().RuleID != 1 {
 		t.Error("failed to set interruption rule id")
 	}
 }
@@ -54,12 +54,12 @@ func TestRuleMatchWithRegex(t *testing.T) {
 	tx := waf.NewTransaction()
 	tx.AddArgument("GET", "id_test", "123")
 	tx.ProcessRequestHeaders()
-	if len(tx.MatchedRules) != 1 {
-		t.Errorf("failed to match rules with %d", len(tx.MatchedRules))
+	if len(tx.MatchedRules()) != 1 {
+		t.Errorf("failed to match rules with %d", len(tx.MatchedRules()))
 	}
-	if tx.Interruption == nil {
+	if tx.Interruption() == nil {
 		t.Error("failed to interrupt transaction")
-	} else if tx.Interruption.RuleID != 1 {
+	} else if tx.Interruption().RuleID != 1 {
 		t.Error("failed to set interruption rule id")
 	}
 }
@@ -94,7 +94,7 @@ func TestSecMarkers(t *testing.T) {
 	if interruption == nil || err != nil {
 		t.Error("failed to interrupt")
 	}
-	if len(tx.MatchedRules) == 1 {
+	if len(tx.MatchedRules()) == 1 {
 		t.Errorf("not matching any rule after secmark")
 	}
 }
@@ -119,7 +119,7 @@ func TestSecAuditLogs(t *testing.T) {
 	}
 	tx.ProcessLogging()
 
-	if len(tx.MatchedRules) == 0 {
+	if len(tx.MatchedRules()) == 0 {
 		t.Error("failed to match rules")
 	}
 
@@ -147,8 +147,8 @@ func TestRuleLogging(t *testing.T) {
 	tx.AddArgument("GET", "test1", "123")
 	tx.AddArgument("GET", "test2", "456")
 	tx.ProcessRequestHeaders()
-	if len(tx.MatchedRules) != 3 {
-		t.Errorf("failed to match rules with %d", len(tx.MatchedRules))
+	if len(tx.MatchedRules()) != 3 {
+		t.Errorf("failed to match rules with %d", len(tx.MatchedRules()))
 	}
 	// we expect 2 logs
 	if len(logs) != 2 {
@@ -184,8 +184,8 @@ func TestRuleChains(t *testing.T) {
 	tx.AddArgument("GET", "test1", "123")
 	tx.AddArgument("GET", "test2", "456")
 	tx.ProcessRequestHeaders()
-	if len(tx.MatchedRules) != 1 {
-		t.Errorf("failed to match rules with %d matches, expected 1", len(tx.MatchedRules))
+	if len(tx.MatchedRules()) != 1 {
+		t.Errorf("failed to match rules with %d matches, expected 1", len(tx.MatchedRules()))
 	}
 }
 
@@ -206,8 +206,8 @@ func TestTagsAreNotPrintedTwice(t *testing.T) {
 	tx.AddArgument("GET", "test1", "123")
 	tx.AddArgument("GET", "test2", "456")
 	tx.ProcessRequestHeaders()
-	if len(tx.MatchedRules) != 1 {
-		t.Errorf("failed to match rules with %d", len(tx.MatchedRules))
+	if len(tx.MatchedRules()) != 1 {
+		t.Errorf("failed to match rules with %d", len(tx.MatchedRules()))
 	}
 	// we expect 1 log
 	if len(logs) != 1 {
@@ -278,8 +278,8 @@ func TestLogsAreNotPrintedManyTimes(t *testing.T) {
 	tx.AddArgument("GET", "test2", "789")
 	tx.AddRequestHeader("test", "123")
 	tx.ProcessRequestHeaders()
-	if len(tx.MatchedRules) != 1 {
-		t.Errorf("failed to match rules with %d", len(tx.MatchedRules))
+	if len(tx.MatchedRules()) != 1 {
+		t.Errorf("failed to match rules with %d", len(tx.MatchedRules()))
 	}
 	// we expect 2 logs
 	if len(logs) != 1 {
@@ -327,12 +327,12 @@ func TestTxIssue147(t *testing.T) {
 		}
 		if it != nil {
 			httpOutMsg := ""
-			for _, res := range tx.MatchedRules {
+			for _, res := range tx.MatchedRules() {
 				httpOutMsg = httpOutMsg + res.MatchedDatas[0].Key + ":" + res.MatchedDatas[0].Value + "\n"
 				httpOutMsg = httpOutMsg + "Message:" + res.MatchedDatas[0].Message + "\n"
 
 			}
-			if len(httpOutMsg) == 0 || len(tx.MatchedRules) == 0 {
+			if len(httpOutMsg) == 0 || len(tx.MatchedRules()) == 0 {
 				t.Error("failed to log")
 			}
 		} else {
@@ -573,7 +573,7 @@ func TestArgumentsCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 	if it == nil {
-		t.Errorf("failed to test arguments value match: Same case argument name, %+v\n", tx.MatchedRules)
+		t.Errorf("failed to test arguments value match: Same case argument name, %+v\n", tx.MatchedRules())
 	}
 
 	tx = waf.NewTransaction()
@@ -583,7 +583,7 @@ func TestArgumentsCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 	if it == nil {
-		t.Errorf("failed to test arguments value match: Upper case argument name, %+v\n", tx.MatchedRules)
+		t.Errorf("failed to test arguments value match: Upper case argument name, %+v\n", tx.MatchedRules())
 	}
 
 	tx = waf.NewTransaction()
@@ -593,7 +593,7 @@ func TestArgumentsCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 	if it == nil {
-		t.Errorf("failed to test arguments value match: Lower case argument name, %+v\n", tx.MatchedRules)
+		t.Errorf("failed to test arguments value match: Lower case argument name, %+v\n", tx.MatchedRules())
 	}
 
 	tx = waf.NewTransaction()
@@ -761,14 +761,14 @@ func TestParameterPollution(t *testing.T) {
 		t.Error(err)
 	}
 
-	if len(tx.MatchedRules) == 1 {
-		if len(tx.MatchedRules[0].MatchedDatas) != 1 {
+	if len(tx.MatchedRules()) == 1 {
+		if len(tx.MatchedRules()[0].MatchedDatas) != 1 {
 			t.Errorf("failed to test arguments pollution. Found matches: %d, %+v\n",
-				len(tx.MatchedRules[0].MatchedDatas), tx.MatchedRules)
+				len(tx.MatchedRules()[0].MatchedDatas), tx.MatchedRules())
 		}
 	} else {
 		t.Errorf("failed to test arguments pollution: Single match fixed case: %d, %+v\n",
-			len(tx.MatchedRules), tx.MatchedRules)
+			len(tx.MatchedRules()), tx.MatchedRules())
 	}
 
 	tx = waf.NewTransaction()
@@ -780,14 +780,14 @@ func TestParameterPollution(t *testing.T) {
 	if err != nil {
 		t.Error(err)
 	}
-	if len(tx.MatchedRules) == 1 {
-		if len(tx.MatchedRules[0].MatchedDatas) != 2 {
+	if len(tx.MatchedRules()) == 1 {
+		if len(tx.MatchedRules()[0].MatchedDatas) != 2 {
 			t.Errorf("failed to test arguments pollution. Found matches: %d, %+v\n",
-				len(tx.MatchedRules[0].MatchedDatas), tx.MatchedRules)
+				len(tx.MatchedRules()[0].MatchedDatas), tx.MatchedRules())
 		}
 	} else {
 		t.Errorf("failed to test arguments pollution: Multiple match mixed case: %d, %+v\n",
-			len(tx.MatchedRules), tx.MatchedRules)
+			len(tx.MatchedRules()), tx.MatchedRules())
 	}
 
 }
@@ -810,17 +810,17 @@ func TestURIQueryParamCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 
-	if len(tx.MatchedRules) == 1 {
-		if len(tx.MatchedRules[0].MatchedDatas) != 1 {
+	if len(tx.MatchedRules()) == 1 {
+		if len(tx.MatchedRules()[0].MatchedDatas) != 1 {
 			t.Errorf("failed to test uri query param. Found matches: %d, %+v\n",
-				len(tx.MatchedRules[0].MatchedDatas), tx.MatchedRules)
+				len(tx.MatchedRules()[0].MatchedDatas), tx.MatchedRules())
 		}
-		if !isMatchData(tx.MatchedRules[0].MatchedDatas, "Test1") {
-			t.Error("Key did not match: Test1 !=", tx.MatchedRules[0])
+		if !isMatchData(tx.MatchedRules()[0].MatchedDatas, "Test1") {
+			t.Error("Key did not match: Test1 !=", tx.MatchedRules()[0])
 		}
 	} else {
 		t.Errorf("failed to test uri query param: Same case arg name: %d, %+v\n",
-			len(tx.MatchedRules), tx.MatchedRules)
+			len(tx.MatchedRules()), tx.MatchedRules())
 	}
 
 	tx = waf.NewTransaction()
@@ -830,17 +830,17 @@ func TestURIQueryParamCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 
-	if len(tx.MatchedRules) == 1 {
-		if len(tx.MatchedRules[0].MatchedDatas) != 3 {
+	if len(tx.MatchedRules()) == 1 {
+		if len(tx.MatchedRules()[0].MatchedDatas) != 3 {
 			t.Errorf("failed to test uri query param. Found matches: %d, %+v\n",
-				len(tx.MatchedRules[0].MatchedDatas), tx.MatchedRules)
+				len(tx.MatchedRules()[0].MatchedDatas), tx.MatchedRules())
 		}
-		if !isMatchData(tx.MatchedRules[0].MatchedDatas, "Test1") {
-			t.Error("Key did not match: Test1 !=", tx.MatchedRules[0])
+		if !isMatchData(tx.MatchedRules()[0].MatchedDatas, "Test1") {
+			t.Error("Key did not match: Test1 !=", tx.MatchedRules()[0])
 		}
 	} else {
 		t.Errorf("failed to test qparam pollution: Multiple arg different case: %d, %+v\n",
-			len(tx.MatchedRules), tx.MatchedRules)
+			len(tx.MatchedRules()), tx.MatchedRules())
 	}
 }
 
@@ -867,17 +867,17 @@ func TestURIQueryParamNameCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 
-	if len(tx.MatchedRules) == 1 {
-		if len(tx.MatchedRules[0].MatchedDatas) != 1 {
+	if len(tx.MatchedRules()) == 1 {
+		if len(tx.MatchedRules()[0].MatchedDatas) != 1 {
 			t.Errorf("failed to test uri query param. Expected: 1, Found matches: %d, %+v\n",
-				len(tx.MatchedRules[0].MatchedDatas), tx.MatchedRules)
+				len(tx.MatchedRules()[0].MatchedDatas), tx.MatchedRules())
 		}
-		if !isMatchData(tx.MatchedRules[0].MatchedDatas, "Test1") {
-			t.Error("Key did not match: Test1 !=", tx.MatchedRules[0])
+		if !isMatchData(tx.MatchedRules()[0].MatchedDatas, "Test1") {
+			t.Error("Key did not match: Test1 !=", tx.MatchedRules()[0])
 		}
 	} else {
 		t.Errorf("failed to test uri query param: Same case arg name:%d, %+v\n",
-			len(tx.MatchedRules), tx.MatchedRules)
+			len(tx.MatchedRules()), tx.MatchedRules())
 	}
 
 	tx = waf.NewTransaction()
@@ -887,17 +887,17 @@ func TestURIQueryParamNameCaseSensitive(t *testing.T) {
 		t.Error(err)
 	}
 
-	if len(tx.MatchedRules) == 1 {
-		if len(tx.MatchedRules[0].MatchedDatas) != 1 {
+	if len(tx.MatchedRules()) == 1 {
+		if len(tx.MatchedRules()[0].MatchedDatas) != 1 {
 			t.Errorf("Failed to test uri query param. Expected: 1, Found matches: %d, %+v\n",
-				len(tx.MatchedRules[0].MatchedDatas), tx.MatchedRules)
+				len(tx.MatchedRules()[0].MatchedDatas), tx.MatchedRules())
 		}
-		if !isMatchData(tx.MatchedRules[0].MatchedDatas, "Test1") {
-			t.Error("Key did not match: Test1 !=", tx.MatchedRules[0])
+		if !isMatchData(tx.MatchedRules()[0].MatchedDatas, "Test1") {
+			t.Error("Key did not match: Test1 !=", tx.MatchedRules()[0])
 		}
 	} else {
 		t.Error("failed to test qparam pollution: Multiple arg different case:",
-			len(tx.MatchedRules))
+			len(tx.MatchedRules()))
 	}
 }
 */
diff --git a/operators/rbl_test.go b/operators/rbl_test.go
index a5494e7..cdd827a 100644
--- a/operators/rbl_test.go
+++ b/operators/rbl_test.go
@@ -65,7 +65,7 @@ func TestRbl(t *testing.T) {
 		if !rbl.Evaluate(tx, "valid_txt") {
 			t.Errorf("Unexpected result for valid hostname")
 		}
-		if want, have := "not blocked", tx.Variables.TX.Get("httpbl_msg")[0]; want != have {
+		if want, have := "not blocked", tx.Variables().TX().Get("httpbl_msg")[0]; want != have {
 			t.Errorf("Unexpected result for valid hostname: want %q, have %q", want, have)
 		}
 	})
@@ -81,8 +81,8 @@ func TestRbl(t *testing.T) {
 		if !rbl.Evaluate(tx, "blocked") {
 			t.Fatal("Unexpected result for blocked hostname")
 		}
-		t.Log(tx.Variables.TX.Get("httpbl_msg"))
-		if want, have := "blocked", tx.Variables.TX.Get("httpbl_msg")[0]; want != have {
+		t.Log(tx.Variables().TX().Get("httpbl_msg"))
+		if want, have := "blocked", tx.Variables().TX().Get("httpbl_msg")[0]; want != have {
 			t.Errorf("Unexpected result for valid hostname: want %q, have %q", want, have)
 		}
 	})
diff --git a/operators/restpath_test.go b/operators/restpath_test.go
index 33dea76..8839274 100644
--- a/operators/restpath_test.go
+++ b/operators/restpath_test.go
@@ -24,7 +24,7 @@ func TestRestPath(t *testing.T) {
 	if !rp.Evaluate(tx, path) {
 		t.Errorf("Expected %s to match %s", exp, path)
 	}
-	if tx.Variables.ArgsPath.Get("id")[0] != "123" {
-		t.Errorf("Expected 123, got %s", tx.Variables.ArgsPath.Get("id"))
+	if tx.Variables().ArgsPath().Get("id")[0] != "123" {
+		t.Errorf("Expected 123, got %s", tx.Variables().ArgsPath().Get("id"))
 	}
 }
diff --git a/testing/coraza_test.go b/testing/coraza_test.go
index 5382d13..573cd63 100644
--- a/testing/coraza_test.go
+++ b/testing/coraza_test.go
@@ -33,7 +33,7 @@ func TestEngine(t *testing.T) {
 
 					for _, e := range test.OutputErrors() {
 						debug := ""
-						for _, mr := range test.transaction.GetMatchedRules() {
+						for _, mr := range test.transaction.MatchedRules() {
 							debug += fmt.Sprintf(" %d", mr.Rule.ID)
 						}
 						if testing.Verbose() {
diff --git a/testing/engine.go b/testing/engine.go
index c37725c..c455bf6 100644
--- a/testing/engine.go
+++ b/testing/engine.go
@@ -189,24 +189,24 @@ func (t *Test) OutputInterruptionErrors() []string {
 	var errors []string
 
 	if t.ExpectedOutput.Interruption != nil {
-		if t.ExpectedOutput.Interruption.Action != t.transaction.GetInterruption().Action {
+		if t.ExpectedOutput.Interruption.Action != t.transaction.Interruption().Action {
 			errors = append(errors, fmt.Sprintf("Interruption.Action: expected: '%s', got: '%s'",
-				t.ExpectedOutput.Interruption.Action, t.transaction.GetInterruption().Action))
+				t.ExpectedOutput.Interruption.Action, t.transaction.Interruption().Action))
 		}
 
-		if t.ExpectedOutput.Interruption.Status != t.transaction.GetInterruption().Status {
+		if t.ExpectedOutput.Interruption.Status != t.transaction.Interruption().Status {
 			errors = append(errors, fmt.Sprintf("Interruption.Status: expected: '%d', got: '%d'",
-				t.ExpectedOutput.Interruption.Status, t.transaction.GetInterruption().Status))
+				t.ExpectedOutput.Interruption.Status, t.transaction.Interruption().Status))
 		}
 
-		if t.ExpectedOutput.Interruption.Data != t.transaction.GetInterruption().Data {
+		if t.ExpectedOutput.Interruption.Data != t.transaction.Interruption().Data {
 			errors = append(errors, fmt.Sprintf("Interruption.Data: expected: '%s', got: '%s'",
-				t.ExpectedOutput.Interruption.Data, t.transaction.GetInterruption().Data))
+				t.ExpectedOutput.Interruption.Data, t.transaction.Interruption().Data))
 		}
 
-		if t.ExpectedOutput.Interruption.RuleID != t.transaction.GetInterruption().RuleID {
+		if t.ExpectedOutput.Interruption.RuleID != t.transaction.Interruption().RuleID {
 			errors = append(errors, fmt.Sprintf("Interruption.RuleID: expected: '%d', got: '%d'",
-				t.ExpectedOutput.Interruption.RuleID, t.transaction.GetInterruption().RuleID))
+				t.ExpectedOutput.Interruption.RuleID, t.transaction.Interruption().RuleID))
 		}
 	}
 
@@ -251,7 +251,7 @@ func (t *Test) OutputErrors() []string {
 
 // LogContains checks if the log contains a string
 func (t *Test) LogContains(log string) bool {
-	for _, mr := range t.transaction.GetMatchedRules() {
+	for _, mr := range t.transaction.MatchedRules() {
 		if strings.Contains(mr.ErrorLog(t.ResponseCode), log) {
 			return true
 		}