diff --git a/core/failures.go b/core/failures.go
index 74f0f0d7..669c598e 100644
--- a/core/failures.go
+++ b/core/failures.go
@@ -30,7 +30,6 @@ type Failure struct {
 
 // CreateFailure will create a new failure record for a service
 func (s *Service) CreateFailure(f *types.Failure) (int64, error) {
-	f.CreatedAt = time.Now().UTC()
 	f.Service = s.Id
 	s.Failures = append(s.Failures, f)
 	row := failuresDB().Create(f)
diff --git a/core/hits.go b/core/hits.go
index 2d241191..67d5d5f2 100644
--- a/core/hits.go
+++ b/core/hits.go
@@ -27,7 +27,6 @@ type Hit struct {
 
 // CreateHit will create a new 'hit' record in the database for a successful/online service
 func (s *Service) CreateHit(h *types.Hit) (int64, error) {
-	h.CreatedAt = time.Now().UTC()
 	db := hitsDB().Create(h)
 	if db.Error != nil {
 		utils.Log(2, db.Error)
diff --git a/core/notifier/notifiers_test.go b/core/notifier/notifiers_test.go
index cff5ab05..7be087d5 100644
--- a/core/notifier/notifiers_test.go
+++ b/core/notifier/notifiers_test.go
@@ -232,7 +232,7 @@ func TestRunAllQueueAndStop(t *testing.T) {
 	assert.Equal(t, 16, len(example.Queue))
 	go Queue(example)
 	assert.Equal(t, 16, len(example.Queue))
-	time.Sleep(15 * time.Second)
+	time.Sleep(13 * time.Second)
 	assert.Equal(t, 6, len(example.Queue))
 	time.Sleep(1 * time.Second)
 	assert.Equal(t, 6, len(example.Queue))
diff --git a/core/services.go b/core/services.go
index 3757addc..d5115492 100644
--- a/core/services.go
+++ b/core/services.go
@@ -166,6 +166,56 @@ func GroupDataBy(column string, id int64, tm time.Time, increment string) string
 	return sql
 }
 
+func (s *Service) AfterFind() (err error) {
+	s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
+	return
+}
+
+func (s *Hit) AfterFind() (err error) {
+	s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
+	return
+}
+
+func (s *Failure) AfterFind() (err error) {
+	s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
+	return
+}
+
+func (s *User) AfterFind() (err error) {
+	s.CreatedAt = utils.Timezoner(s.CreatedAt, CoreApp.Timezone)
+	return
+}
+
+func (u *Hit) BeforeCreate() (err error) {
+	u.CreatedAt = time.Now().UTC()
+	return
+}
+
+func (u *Failure) BeforeCreate() (err error) {
+	u.CreatedAt = time.Now().UTC()
+	return
+}
+
+func (u *User) BeforeCreate() (err error) {
+	u.CreatedAt = time.Now().UTC()
+	return
+}
+
+func (u *Service) BeforeCreate() (err error) {
+	u.CreatedAt = time.Now().UTC()
+	return
+}
+
+func (s *Service) Downtime() time.Duration {
+	hits, _ := s.Hits()
+	fails := s.LimitedFailures()
+	if len(fails) == 0 {
+		return time.Duration(0)
+	}
+	since := fails[0].CreatedAt.Sub(hits[0].CreatedAt)
+	return since
+}
+
 func (s *Service) GraphDataRaw() []*DateScan {
 	var d []*DateScan
 	since := time.Now().Add(time.Hour*-24 + time.Minute*0 + time.Second*0)
diff --git a/core/services_test.go b/core/services_test.go
index 96697eb4..7b1d2eaa 100644
--- a/core/services_test.go
+++ b/core/services_test.go
@@ -45,6 +45,12 @@ func TestSelectAllServices(t *testing.T) {
 	assert.Equal(t, 15, len(services))
 }
 
+func TestServiceDowntime(t *testing.T) {
+	service := SelectService(15)
+	downtime := service.Downtime()
+	assert.True(t, downtime.Minutes() > 9)
+}
+
 func TestSelectTCPService(t *testing.T) {
 	services := CoreApp.Services
 	assert.Equal(t, 15, len(services))