diff --git a/utils/errors.go b/utils/errors.go
new file mode 100644
index 000000000..7e90be92c
--- /dev/null
+++ b/utils/errors.go
@@ -0,0 +1,54 @@
+/*
+Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
+Copyright (C) ITsysCOM GmbH
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+package utils
+
+// NewCGRError initialises a new CGRError
+func NewCGRError(context, apiErr, shortErr, longErr string) *CGRError {
+ return &CGRError{context: context, apiError: apiErr,
+ shortError: shortErr, longError: longErr, errorMessage: shortErr}
+}
+
+// CGRError is a context based error
+// returns always errorMessage but this can be switched based on methods called on it
+type CGRError struct {
+ context string
+ apiError string
+ shortError string
+ longError string
+ errorMessage string
+}
+
+func (err *CGRError) Context() string {
+ return err.context
+}
+
+func (err *CGRError) Error() string {
+ return err.errorMessage
+}
+
+func (err *CGRError) ActivateAPIError() {
+ err.errorMessage = err.apiError
+}
+
+func (err *CGRError) ActivateShortError() {
+ err.errorMessage = err.shortError
+}
+
+func (err *CGRError) ActivateLongError() {
+ err.errorMessage = err.longError
+}
diff --git a/utils/errors_test.go b/utils/errors_test.go
new file mode 100644
index 000000000..9b2247858
--- /dev/null
+++ b/utils/errors_test.go
@@ -0,0 +1,41 @@
+/*
+Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments
+Copyright (C) ITsysCOM GmbH
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
+*/
+package utils
+
+import (
+ "testing"
+)
+
+func TestCGRErrorActivate(t *testing.T) {
+ ctx := "TEST_CONTEXT"
+ apiErr := "TEST_API_ERR"
+ shortErr := "short error"
+ longErr := "long error which is good for debug"
+ err := NewCGRError(ctx, apiErr, shortErr, longErr)
+ if err.Error() != shortErr {
+ t.Error(err)
+ }
+ err.ActivateAPIError()
+ if err.Error() != apiErr {
+ t.Error(err)
+ }
+ err.ActivateLongError()
+ if err.Error() != longErr {
+ t.Error(err)
+ }
+}