diff --git a/src/engine.c b/src/engine.c
index 5d23f431b9ee657cd857118b2cd59de6d842333f..5cf8986f2d26153a58b48e9a965a0a47ece70079 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -519,6 +519,8 @@ void engine_step ( struct engine *e , int sort_queues ) {
     e->step += 1;
     
     /* Does the time step need adjusting? */
+    if ( e->dt == 0 )
+        e->dt = e->dt_orig;
     while ( dt_min < e->dt ) {
         e->dt *= 0.5;
         e->step *= 2;
@@ -529,6 +531,9 @@ void engine_step ( struct engine *e , int sort_queues ) {
         e->step /= 2;
         printf( "engine_step: dt_min is larger than twice the time step, adjusting to dt=%e.\n" , e->dt );
         }
+    
+    /* Set the system time. */
+    e->time = e->dt * e->step;
         
     TIMER_TOC2(timer_step);
     
@@ -553,6 +558,7 @@ void engine_init ( struct engine *e , struct space *s , float dt , int nr_thread
         cpu_set_t cpuset;
     #endif
     int k;
+    float dt_min = dt;
     
     /* Store the values. */
     e->s = s;
@@ -571,11 +577,16 @@ void engine_init ( struct engine *e , struct space *s , float dt , int nr_thread
     e->barrier_count = 0;
     
     /* Run through the parts and get the minimum time step. */
+    e->dt_orig = dt;
     for ( k = 0 ; k < s->nr_parts ; k++ )
-        if ( s->parts[k].dt > 0.0f )
-            while ( s->parts[k].dt < dt )
-                dt *= 0.5;
-    e->dt_min = dt;
+        if ( s->parts[k].dt < dt_min )
+            dt_min = s->parts[k].dt;
+    if ( dt_min == 0.0f )
+        dt = 0.0f;
+    else
+        while ( dt > dt_min )
+            dt *= 0.5f;
+    e->dt = dt;
     
     /* Allocate the queues. */
     if ( posix_memalign( (void *)(&e->queues) , 64 , nr_queues * sizeof(struct queue) ) != 0 )
diff --git a/src/engine.h b/src/engine.h
index cb96b81510da307fbe0b4c8a55aa5f058041a766..12c3d9d814e57c739e412f672e6e9ad36d22c378 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -57,11 +57,14 @@ struct engine {
     float dt_min;
     
     /* The system time step. */
-    float dt;
+    float dt, dt_orig;
     
     /* The current step number. */
     int step;
     
+    /* The current system time. */
+    float time;
+    
     /* Data for the threads' barrier. */
     pthread_mutex_t barrier_mutex;
     pthread_cond_t barrier_cond;