diff --git a/include/log_action.h b/include/log_action.h
index 135a7cee1ba06b9336087801ee2e0fc0bd78f257..887727af600115b4542329dcfdb2369849c391dd 100644
--- a/include/log_action.h
+++ b/include/log_action.h
@@ -1,12 +1,12 @@
 #ifndef LOG_ACTION_H
 #define LOG_ACTION_H
 
-#include"logdef.h"
+#include "logdef.h"
 #include "gate.h"
 #include "wire.h"
 #include "page.h"
 #include "label.h"
-#include<limits.h>
+#include <limits.h>
 
 typedef enum
 {
@@ -38,7 +38,7 @@ typedef enum
 	act_readgate,
 	act_connectgate,
 	act_disconnectgate,
-    act_configgate,
+	act_configgate,
 	act_configchgate,
 	act_configrelgate,
 	act_confignode,
@@ -210,7 +210,6 @@ typedef struct log_action_t
 	log_kattrrec *actkattr;
 	unsigned char *actproc;
 
-	int pagechanged[log_maxpages];
 	log_page *pages[log_maxpages]; /* TODO use a variable size array or a list */
 	size_t numpages; /**< number of pages */
 	log_nrec *nbase;
@@ -333,10 +332,8 @@ typedef struct log_action_t
 	long gattrstamp;                /** Changes to gate attributes */
 	long sigstamp;                  /** Changes to signal table */
 	long loadstamp;                 /** A page was loaded */
-	long pagestamp[log_maxpages];
 	long colorstamp;                /** Color assignment have changes */
-    long resetstamp;   /* Simulation has been reset */
-    log_regrec *pageregions[log_maxpages];
+	long resetstamp;   /* Simulation has been reset */
 	long markerstamp;               /** Page markers moved */
 
 	log_krec *probekind;
diff --git a/include/page.h b/include/page.h
index 3d94e920679a8584e1a506f865af66b62f3a367c..8b818bbb3b6b4114d685e6234eb4c3a25b8b738b 100644
--- a/include/page.h
+++ b/include/page.h
@@ -21,7 +21,8 @@ typedef struct log_page {
 	log_vwrec *vwbase; /* base vertical wire of the page */
 	log_lrec *lbase; /* base label of page */
 	log_brec *bbase; /* base box of page */
-	log_regrec *pageregions;
+	log_regrec *pageregions; /* base region of page */
+	long pagestamp;
 	int pagechanged;
 } log_page;
 
diff --git a/src/log.c b/src/log.c
index 11e9ee2e86f48803b0642f9e171ff186a853dc8c..d83040248660a03148342eb494abcc0371b3a950 100644
--- a/src/log.c
+++ b/src/log.c
@@ -2540,11 +2540,11 @@ static void setupregion(log_regrec **r, short pagenum)
 	{
 		if (*r != NULL)
 		{
-			if (*r == gg.pageregions[(*r)->pagenum - 1])
-				gg.pageregions[(*r)->pagenum - 1] = (*r)->next;
+			if (*r == gg.pages[(*r)->pagenum - 1]->pageregions)
+				gg.pages[(*r)->pagenum - 1]->pageregions = (*r)->next;
 			else
 			{
-				r2 = gg.pageregions[(*r)->pagenum - 1];
+				r2 = gg.pages[(*r)->pagenum - 1]->pageregions;
 				while (r2 != NULL && r2->next != *r)
 					r2 = r2->next;
 				if (r2 != NULL)
@@ -2564,8 +2564,8 @@ static void setupregion(log_regrec **r, short pagenum)
 	(*r)->y2 = 32767;
 	stamp(&(*r)->regstamp);
 	(*r)->info = (na_long)0;
-	(*r)->next = gg.pageregions[pagenum - 1];
-	gg.pageregions[pagenum - 1] = *r;
+	(*r)->next = gg.pages[pagenum - 1]->pageregions;
+	gg.pages[pagenum - 1]->pageregions = *r;
 }
 
 
@@ -14443,9 +14443,7 @@ static void initialize()
 	yoff0 = 0;
 	gatecount[0] = 0;
 	gg.nbase = NULL;
-	gg.pagechanged[0] = false;
-	stamp(gg.pagestamp);
-	gg.pageregions[0] = NULL;
+	stamp(&gg.pages[0]->pagestamp);
 	curfilename[0] = NULL;
 	initbuf(&copybuf);
 	nodeconflictbase = NULL;
diff --git a/src/logsim.c b/src/logsim.c
index e7f50db82093d0f6384804d597455215347d5dc1..a16bc26ad1d225329b57ab4057791d1c9858d7a6 100644
--- a/src/logsim.c
+++ b/src/logsim.c
@@ -302,7 +302,7 @@ void Log_16_ledgate2(log_16_action *act)
 						break;
 				}
 			}
-			
+
 			if ((((unsigned long)WITH1->vars) & (1L << 0)) != 0 &&
 					(((unsigned long)WITH1->vars) & (1L << 1)) != 0)
 			{
@@ -450,7 +450,7 @@ void Log_16_clock(log_16_action *act)
 				WITH1->vars = (na_long)(((unsigned long)WITH1->vars) & (~(1L << 1)));
 				WITH1->vars = (na_long)(((unsigned long)WITH1->vars) | (((long)TEMP) << 1));
 			}
-			
+
 			if (WITH->refrflag || ((((unsigned long)WITH1->vars) & (1L << 3)) != 0) !=
 					((((unsigned long)WITH1->vars) & (1L << 2)) != 0))
 			{
diff --git a/src/logsimh.c b/src/logsimh.c
index a93efd6cb626e9b71da046dd1e36fb7e87cbbb85..3dd1b619f6c796aef43558d76f3b879acefdf202 100644
--- a/src/logsimh.c
+++ b/src/logsimh.c
@@ -4834,7 +4834,7 @@ static void updatehdef(hdefrec *hdef)
 	if (hdef->defreg != NULL)
 		newstamp = hdef->defreg->regstamp;
 	else
-		newstamp = WITH->pagestamp[j - 1];
+		newstamp = WITH->pages[j - 1]->pagestamp;
 
 	dep = hdef->depends;
 	while (dep != NULL && dep->hdefstamp == dep->hdef->curstamp)
diff --git a/src/page.c b/src/page.c
index af5d307b4d966bf24e6c437264ce3ee687704632..df219aae5b8e0b1b27ed4f076764a32c0a66aeae 100644
--- a/src/page.c
+++ b/src/page.c
@@ -10,9 +10,9 @@ void chpage(short pg)
 {
 	log_regrec *region;
 
-	stamp(&gg.pagestamp[pg - 1]);
-	gg.pagechanged[pg - 1] = true;
-	region = gg.pageregions[pg - 1];
+	stamp(&gg.pages[pg - 1]->pagestamp);
+	gg.pages[pg - 1]->pagechanged = true;
+	region = gg.pages[pg - 1]->pageregions;
 	while (region != NULL)
 	{
 		stamp(&region->regstamp);
@@ -25,9 +25,9 @@ void chpageplace(short pg, short x1, short y1, short x2, short y2)
 {
 	log_regrec *r;
 
-	stamp(&gg.pagestamp[pg - 1]);
-	gg.pagechanged[pg - 1] = true;
-	r = gg.pageregions[pg - 1];
+	stamp(&gg.pages[pg - 1]->pagestamp);
+	gg.pages[pg - 1]->pagechanged = true;
+	r = gg.pages[pg - 1]->pageregions;
 	if (r == NULL)
 		return;
 	sortshints(&x1, &x2);
@@ -51,12 +51,12 @@ int pageempty(short pg)
 
 int pagenull(short pg)
 {
-	return (pageempty(pg) && gg.pageregions[pg - 1] == NULL);
+	return (pageempty(pg) && gg.pages[pg - 1]->pageregions == NULL);
 }
 
 int pagechanged(short pg)
 {
-	return (gg.pagechanged[pg - 1] && !pageempty(pg));
+	return (gg.pages[pg - 1]->pagechanged && !pageempty(pg));
 }
 
 
@@ -92,9 +92,9 @@ void newpage(short pg)
 		gg.pages[i]->vwbase = NULL;
 		gg.pages[i]->lbase = NULL;
 		gg.pages[i]->bbase = NULL;
-		gg.pagechanged[i] = false;
-		stamp(&gg.pagestamp[i]);
-		gg.pageregions[i] = NULL;
+		gg.pages[i]->pagechanged = false;
+		stamp(&gg.pages[i]->pagestamp);
+		gg.pages[i]->pageregions = NULL;
 		curfilename[i] = NULL;
 		vlsimode[i] = vlsi;
 	}
@@ -204,13 +204,16 @@ int pagembb(short pg, short *x1, short *y1, short *x2, short *y2)
 log_page *page_alloc()
 {
 	log_page *newpage = Malloc(sizeof(log_page));
-	
+
 	newpage->gbase = NULL;
 	newpage->sbase = NULL;
 	newpage->hwbase = NULL;
 	newpage->vwbase = NULL;
 	newpage->lbase = NULL;
 	newpage->bbase = NULL;
+	newpage->pageregions = NULL;
+	newpage->pagechanged = false;
+	newpage->pagestamp = 0;
 
 	return newpage;
 }
diff --git a/src/pagereader.c b/src/pagereader.c
index 9a16f86352a27be8ed4d2807d5ebc67108e9a2e8..6d9998bde227c67f4665fecf3490934f3f0d48c1 100644
--- a/src/pagereader.c
+++ b/src/pagereader.c
@@ -187,7 +187,7 @@ void loadpage(char *filename_, char *reason_)
 
 		garbagecoll();
 		stamp(&gg.loadstamp);
-		stamp(&gg.pagestamp[gg.curpage - 1]);
+		stamp(&gg.pages[gg.curpage - 1]->pagestamp);
 		if (ver < 5)
 		{
 			loadlog30(&V.f, ver);
@@ -540,7 +540,7 @@ void loadpage(char *filename_, char *reason_)
 		if (V.ip != NULL)
 			Free(V.ip);
 		chpage((int)gg.curpage);
-		gg.pagechanged[gg.curpage - 1] = false;
+		gg.pages[gg.curpage - 1]->pagechanged = false;
 		if (curfilename[gg.curpage - 1] == NULL)
 			curfilename[gg.curpage - 1] = (char *)Malloc(256);
 		strcpy(curfilename[gg.curpage - 1], filename);
@@ -818,7 +818,7 @@ void readpage(char *filename_, char *reason)
 		fclose(f);
 	f = NULL;
 	chpage((int)gg.curpage);
-	gg.pagechanged[gg.curpage - 1] = false;
+	gg.pages[gg.curpage - 1]->pagechanged = false;
 	if (curfilename[gg.curpage - 1] == NULL)
 		curfilename[gg.curpage - 1] = (char *)Malloc(256);
 	strcpy(curfilename[gg.curpage - 1], filename);
diff --git a/src/pagewriter.c b/src/pagewriter.c
index 27dd67aeb6962ca40996b4df247b68e6b64e536f..3cbd4d17cc4589e6113c970fbc903635a3367a5f 100644
--- a/src/pagewriter.c
+++ b/src/pagewriter.c
@@ -482,7 +482,7 @@ void savepage(short pgnum, char *filename_)
 		if (f != NULL)
 			fclose(f);
 		f = NULL;
-		gg.pagechanged[pgnum - 1] = false;
+		gg.pages[pgnum - 1]->pagechanged = false;
 		if (curfilename[pgnum - 1] == NULL)
 			curfilename[pgnum - 1] = (char *)Malloc(256);
 		strcpy(curfilename[pgnum - 1], filename);