diff --git a/sPuReMD/src/geo_tools.c b/sPuReMD/src/geo_tools.c
index 88f8799c27e783718ccb45f1fc93adea1a5070bb..4f929e9abf6762830697e166a1f265ec71837baf 100644
--- a/sPuReMD/src/geo_tools.c
+++ b/sPuReMD/src/geo_tools.c
@@ -624,6 +624,7 @@ void Read_BGF( const char * const bgf_file, reax_system* system, control_params
     char chain_id;
     char s_a[12], s_b[12], s_c[12], s_alpha[12], s_beta[12], s_gamma[12];
     int i, n, atom_cnt, token_cnt, bgf_serial, ratom, crystx_found;
+    rvec x;
 
     ratom = 0;
     crystx_found = FALSE;
@@ -729,9 +730,15 @@ void Read_BGF( const char * const bgf_file, reax_system* system, control_params
             workspace->orig_id[ atom_cnt ] = bgf_serial;
 
             /* copy atomic positions */
-            system->atoms[atom_cnt].x[0] = sstrtod( s_x, __FILE__, __LINE__ );
-            system->atoms[atom_cnt].x[1] = sstrtod( s_y, __FILE__, __LINE__ );
-            system->atoms[atom_cnt].x[2] = sstrtod( s_z, __FILE__, __LINE__ );
+            x[0] = sstrtod( s_x, __FILE__, __LINE__ );
+            x[1] = sstrtod( s_y, __FILE__, __LINE__ );
+            x[2] = sstrtod( s_z, __FILE__, __LINE__ );
+
+            Fit_to_Periodic_Box( &system->box, x );
+
+            system->atoms[atom_cnt].x[0] = x[0];
+            system->atoms[atom_cnt].x[1] = x[1];
+            system->atoms[atom_cnt].x[2] = x[2];
 
             /* atom name and type */
             strncpy( system->atoms[atom_cnt].name, atom_name,
diff --git a/sPuReMD/src/list.c b/sPuReMD/src/list.c
index 8f69ca35a0f8a75173a3a4273b6171dc2b21f282..4dd71e25922e02897ae59aba097684cfe93748f2 100644
--- a/sPuReMD/src/list.c
+++ b/sPuReMD/src/list.c
@@ -29,7 +29,7 @@ void Make_List( int n, int n_max, int total_intrs, int type, reax_list* l )
     assert( n > 0 );
     assert( n_max > 0 );
     assert( n_max >= n );
-    assert( total_intrs > 0 );
+    assert( total_intrs >= 0 );
     assert( l != NULL );
 
     if ( l->allocated == TRUE )
@@ -50,48 +50,104 @@ void Make_List( int n, int n_max, int total_intrs, int type, reax_list* l )
     switch ( type )
     {
     case TYP_VOID:
-        l->v = smalloc( l->total_intrs * sizeof(void),
-                "Make_List::l->v" );
+        if ( l->total_intrs > 0 )
+        {
+            l->v = smalloc( l->total_intrs * sizeof(void),
+                    "Make_List::l->v" );
+        }
+        else
+        {
+            l->v = NULL;
+        }
         break;
 
     case TYP_THREE_BODY:
-        l->three_body_list = smalloc( l->total_intrs * sizeof(three_body_interaction_data),
-                "Make_List::l->three_body_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->three_body_list = smalloc( l->total_intrs * sizeof(three_body_interaction_data),
+                    "Make_List::l->three_body_list" );
+        }
+        else
+        {
+            l->three_body_list = NULL;
+        }
         break;
 
     case TYP_BOND:
-        l->bond_list = smalloc( l->total_intrs * sizeof(bond_data),
-                "Make_List::l->bond_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->bond_list = smalloc( l->total_intrs * sizeof(bond_data),
+                    "Make_List::l->bond_list" );
+        }
+        else
+        {
+            l->bond_list = NULL;
+        }
         break;
 
     case TYP_DBO:
-        l->dbo_list = smalloc( l->total_intrs * sizeof(dbond_data),
-                "Make_List::l->dbo_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->dbo_list = smalloc( l->total_intrs * sizeof(dbond_data),
+                    "Make_List::l->dbo_list" );
+        }
+        else
+        {
+            l->dbo_list = NULL;
+        }
         break;
 
     case TYP_DDELTA:
-        l->dDelta_list = smalloc( l->total_intrs * sizeof(dDelta_data),
-                "Make_List::l->dDelta_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->dDelta_list = smalloc( l->total_intrs * sizeof(dDelta_data),
+                    "Make_List::l->dDelta_list" );
+        }
+        else
+        {
+            l->dDelta_list = NULL;
+        }
         break;
 
     case TYP_FAR_NEIGHBOR:
-        l->far_nbr_list = smalloc( l->total_intrs * sizeof(far_neighbor_data),
-                "Make_List::l->far_nbr_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->far_nbr_list = smalloc( l->total_intrs * sizeof(far_neighbor_data),
+                    "Make_List::l->far_nbr_list" );
+        }
+        else
+        {
+            l->far_nbr_list = NULL;
+        }
         break;
 
     case TYP_NEAR_NEIGHBOR:
-        l->near_nbr_list = smalloc( l->total_intrs * sizeof(near_neighbor_data),
-                "Make_List::l->near_nbr_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->near_nbr_list = smalloc( l->total_intrs * sizeof(near_neighbor_data),
+                    "Make_List::l->near_nbr_list" );
+        }
+        else
+        {
+            l->near_nbr_list = NULL;
+        }
         break;
 
     case TYP_HBOND:
-        l->hbond_list = smalloc( l->total_intrs * sizeof(hbond_data),
-                "Make_List::l->hbond_list" );
+        if ( l->total_intrs > 0 )
+        {
+            l->hbond_list = smalloc( l->total_intrs * sizeof(hbond_data),
+                    "Make_List::l->hbond_list" );
+        }
+        else
+        {
+            l->hbond_list = NULL;
+        }
         break;
 
     default:
-        l->v = smalloc( l->total_intrs * sizeof(void),
-                "Make_List::l->v" );
+        fprintf( stderr, "[ERROR] unknown list type. Terminating...\n" );
+        exit( INVALID_INPUT );
         break;
     }
 }
@@ -119,35 +175,59 @@ void Delete_List( int type, reax_list* l )
     switch ( type )
     {
     case TYP_VOID:
-        sfree( l->v, "Delete_List::l->v" );
+        if ( l->v != NULL )
+        {
+            sfree( l->v, "Delete_List::l->v" );
+        }
         break;
 
     case TYP_THREE_BODY:
-        sfree( l->three_body_list, "Delete_List::l->three_body_list" );
+        if ( l->three_body_list != NULL )
+        {
+            sfree( l->three_body_list, "Delete_List::l->three_body_list" );
+        }
         break;
 
     case TYP_BOND:
-        sfree( l->bond_list, "Delete_List::l->bond_list" );
+        if ( l->bond_list != NULL )
+        {
+            sfree( l->bond_list, "Delete_List::l->bond_list" );
+        }
         break;
 
     case TYP_DBO:
-        sfree( l->dbo_list, "Delete_List::l->dbo_list" );
+        if ( l->dbo_list != NULL )
+        {
+            sfree( l->dbo_list, "Delete_List::l->dbo_list" );
+        }
         break;
 
     case TYP_DDELTA:
-        sfree( l->dDelta_list, "Delete_List::l->dDelta_list" );
+        if ( l->dDelta_list != NULL )
+        {
+            sfree( l->dDelta_list, "Delete_List::l->dDelta_list" );
+        }
         break;
 
     case TYP_FAR_NEIGHBOR:
-        sfree( l->far_nbr_list, "Delete_List::l->far_nbr_list" );
+        if ( l->far_nbr_list != NULL )
+        {
+            sfree( l->far_nbr_list, "Delete_List::l->far_nbr_list" );
+        }
         break;
 
     case TYP_NEAR_NEIGHBOR:
-        sfree( l->near_nbr_list, "Delete_List::l->near_nbr_list" );
+        if ( l->near_nbr_list != NULL )
+        {
+            sfree( l->near_nbr_list, "Delete_List::l->near_nbr_list" );
+        }
         break;
 
     case TYP_HBOND:
-        sfree( l->hbond_list, "Delete_List::l->hbond_list" );
+        if ( l->hbond_list != NULL )
+        {
+            sfree( l->hbond_list, "Delete_List::l->hbond_list" );
+        }
         break;
 
     default:
@@ -155,5 +235,4 @@ void Delete_List( int type, reax_list* l )
         exit( INVALID_INPUT );
         break;
     }
-
 }