diff --git a/icpl/src/pane.c b/icpl/src/pane.c
index 4272e888c208a3e6311ef936a1b9fdb517e85ba5..290d5275c7edeb723e9add991b035e08039b22f1 100755
--- a/icpl/src/pane.c
+++ b/icpl/src/pane.c
@@ -14,6 +14,11 @@
 /*                            INCLUDES                               */
 /*********************************************************************/
 #include "pane.h"
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <curses.h>
+
 
 /*********************************************************************/
 /*                        CONSTANT LITERALS                          */
@@ -36,6 +41,7 @@ struct STATUS{
   "",
 };
 
+
 /*********************************************************************/
 /*               PANE_A100_DRAW                                      */
 /*********************************************************************/
@@ -43,8 +49,8 @@ void draw(Screen *scr) {
   size_t oldy, oldx;
   getyx(stdscr, oldy, oldx);
 
-  for (int i = 0; scr->flds[i].type != END; ++i) {
-    Field* fld = &scr->flds[i];
+  for (FNODE *node = scr->root ; node != NULL; node = node->next) {
+    Field* fld = node->field;
     switch (fld->type) {
       case INP:
         move(fld->y, fld->x);
@@ -112,20 +118,39 @@ void draw_status() {
 	refresh();
 }
 
+/*********************************************************************/
+/*    PANEL_X0100_QUERY_FLD_TREE                      							 */
+/*********************************************************************/
+Field* PANEL_X0100_QUERY_FLD_TREE(Screen* scr, int y, int x) {
 
+  return NULL;
+} /* PANEL_X0100_QUERY_FLD_TREE */
 
+
+/*********************************************************************/
+/*    PANEL_X0200_BUILD_SCREEN                         							 */
+/*********************************************************************/
 Screen* buildScreen(Field *fields) {
   Screen* scr;
   scr = (Screen*) calloc(1, sizeof(Screen));
-
-  scr->flds = fields;
-
   int i = 0;
-  while (fields[i].type != INP) { ++i; }
-  scr->inps = &fields[i];
+  FNODE *prev = NULL;
+  while (fields[i].type != END) {
+    FNODE *node = (FNODE*) malloc(sizeof (FNODE));
+    node->field = &fields[i++];
+    if (scr->root == NULL) {
+      scr->root = node;
+      prev = node;
+    }
+    else {
+      prev->next = node;
+			prev = node;
+    }
+
+  }
 
   return scr;
-}
+} /* PANEL_X0200_BUILD_SCREEN */
 
 
 int start(Screen *scr) {
@@ -176,8 +201,6 @@ int start(Screen *scr) {
 				draw_status();
 
 			 	break;
-      case 'q':
-        goto cleanup;
       default:
         break;
     }
diff --git a/icpl/src/pane.h b/icpl/src/pane.h
index 92ff8aa1e974734aa011ff2c4cd6d942b1a5a317..80ac69af49c073b56f804508161ebe0f11a92551 100755
--- a/icpl/src/pane.h
+++ b/icpl/src/pane.h
@@ -41,6 +41,7 @@
 /*********************************************************************/
 #include <curses.h>
 #include <stdint.h>
+#include <stddef.h>
 #include <malloc.h>
 #include <string.h>
 #include <stdbool.h>
@@ -76,18 +77,17 @@ typedef struct Field {
   void* (*callback)(char*);
 } Field;
 
-
-typedef struct Mask {
-  char type:4;
-  char padding:4;
-  short fldid;
-}Mask;
+typedef struct FNODE {
+  int offset;
+  Field *field;
+  struct FNODE *next;
+} FNODE;
 
 typedef struct Screen {
-  Field* flds;
-  Field* inps;
+  Field* fstout;
+  Field* fstinp;
+  FNODE* root;
 
-  Mask cell[80][43];
 	bool update;
   struct Screen* (*submit)(struct Screen*);
 }Screen;
diff --git a/icpl/tags b/icpl/tags
index fd7a937008bfa8a72d390cb1d5de2a41a6fcae4e..1f6da14c130e182d760ddd2ca41756bd32217f95 100644
--- a/icpl/tags
+++ b/icpl/tags
@@ -9,6 +9,8 @@ $(PROJECT)	Makefile	/^$(PROJECT) : $(OBJ) | obj\/$/;"	t
 BTN	src/pane.h	/^#define BTN /;"	d
 CFLAGS	Makefile	/^CFLAGS = -std=gnu11 -Wall  -fpic$/;"	m
 END	src/pane.h	/^#define END /;"	d
+FNODE	src/pane.h	/^typedef struct FNODE {$/;"	s
+FNODE	src/pane.h	/^} FNODE;$/;"	t	typeref:struct:FNODE
 Field	src/pane.h	/^typedef struct Field {$/;"	s
 Field	src/pane.h	/^} Field;$/;"	t	typeref:struct:Field
 HEADERS	Makefile	/^HEADERS = $(wildcard src\/*.h)$/;"	m
@@ -16,9 +18,8 @@ HGT	src/pane.c	/^#define HGT /;"	d	file:
 INP	src/pane.h	/^#define INP /;"	d
 INPT	src/pane.h	/^#define INPT /;"	d
 LBL	src/pane.h	/^#define LBL /;"	d
-Mask	src/pane.h	/^typedef struct Mask {$/;"	s
-Mask	src/pane.h	/^}Mask;$/;"	t	typeref:struct:Mask
 OBJ	Makefile	/^OBJ	= $(addprefix obj\/,$(notdir $(SRC:.c=.o)))$/;"	m
+PANEL_X0100_QUERY_FLD_TREE	src/pane.c	/^Field* PANEL_X0100_QUERY_FLD_TREE(Screen* scr, int y, int x) {$/;"	f	typeref:typename:Field *
 PANE_H	src/pane.h	/^#define PANE_H$/;"	d
 PROJECT	Makefile	/^PROJECT = icpl$/;"	m
 RLR	src/pane.h	/^#define RLR /;"	d
@@ -31,35 +32,35 @@ attr	src/pane.h	/^  chtype attr;$/;"	m	struct:Field	typeref:typename:chtype
 buildScreen	src/pane.c	/^Screen* buildScreen(Field *fields) {$/;"	f	typeref:typename:Screen *
 byte	src/pane.h	/^typedef unsigned char byte;$/;"	t	typeref:typename:unsigned char
 callback	src/pane.h	/^  void* (*callback)(char*);$/;"	m	struct:Field	typeref:typename:void * (*)(char *)
-cell	src/pane.h	/^  Mask cell[80][43];$/;"	m	struct:Screen	typeref:typename:Mask[80][43]
 clean	Makefile	/^clean:$/;"	t
 debug	Makefile	/^debug: $(PROJECT)$/;"	t
 debug	Makefile	/^debug: CFLAGS += -g$/;"	t
 draw	src/pane.c	/^void draw(Screen *scr) {$/;"	f	typeref:typename:void
 draw_status	src/pane.c	/^void draw_status() {$/;"	f	typeref:typename:void
-fldid	src/pane.h	/^  short fldid;$/;"	m	struct:Mask	typeref:typename:short
-flds	src/pane.h	/^  Field* flds;$/;"	m	struct:Screen	typeref:typename:Field *
+field	src/pane.h	/^  Field *field;$/;"	m	struct:FNODE	typeref:typename:Field *
+fstinp	src/pane.h	/^  Field* fstinp;$/;"	m	struct:Screen	typeref:typename:Field *
+fstout	src/pane.h	/^  Field* fstout;$/;"	m	struct:Screen	typeref:typename:Field *
 inhibit	src/pane.c	/^  char *inhibit;$/;"	m	struct:STATUS	typeref:typename:char *	file:
 init	src/pane.c	/^void init() {$/;"	f	typeref:typename:void
-inps	src/pane.h	/^  Field* inps;$/;"	m	struct:Screen	typeref:typename:Field *
 isInsert	src/pane.c	/^  bool isInsert;$/;"	m	struct:STATUS	typeref:typename:bool	file:
 len	src/pane.h	/^       , len;$/;"	m	struct:Field	typeref:typename:size_t
+next	src/pane.h	/^  struct FNODE *next;$/;"	m	struct:FNODE	typeref:struct:FNODE *
 nxfld	src/pane.h	/^  short nxfld;$/;"	m	struct:Field	typeref:typename:short
 obj/	Makefile	/^obj\/:$/;"	t
 obj/%.o	Makefile	/^obj\/%.o : %.c $(HEADERS) | obj\/$/;"	t
 obj/%.o	Makefile	/^obj\/%.o : %.c %.h $(HEADERS) | obj\/$/;"	t
-padding	src/pane.h	/^  char padding:4;$/;"	m	struct:Mask	typeref:typename:char:4
+offset	src/pane.h	/^  int offset;$/;"	m	struct:FNODE	typeref:typename:int
 profile	Makefile	/^profile: $(PROJECT)$/;"	t
 profile	Makefile	/^profile: CFLAGS += -g -pg$/;"	t
 rebuild	Makefile	/^rebuild: clean release$/;"	t
 release	Makefile	/^release: $(PROJECT)$/;"	t
 release	Makefile	/^release: CFLAGS += -O3$/;"	t
+root	src/pane.h	/^  FNODE* root;$/;"	m	struct:Screen	typeref:typename:FNODE *
 start	src/pane.c	/^int start(Screen *scr) {$/;"	f	typeref:typename:int
 status	src/pane.c	/^}status = {$/;"	v	typeref:struct:STATUS
 submit	src/pane.h	/^  struct Screen* (*submit)(struct Screen*);$/;"	m	struct:Screen	typeref:struct:Screen * (*)(struct Screen *)
 text	src/pane.h	/^  char* text;$/;"	m	struct:Field	typeref:typename:char *
 type	src/pane.h	/^  byte type : 4;$/;"	m	struct:Field	typeref:typename:byte:4
-type	src/pane.h	/^  char type:4;$/;"	m	struct:Mask	typeref:typename:char:4
 update	src/pane.h	/^	bool update;$/;"	m	struct:Screen	typeref:typename:bool
 x	src/pane.h	/^       , x  : 16$/;"	m	struct:Field	typeref:typename:size_t:16
 y	src/pane.h	/^  size_t y  : 16$/;"	m	struct:Field	typeref:typename:size_t:16
diff --git a/ispf/src/main.c b/ispf/src/main.c
index 5e23fa949d61a6033790b9588730e8aec9dbe2a7..d3a581c4509eb21b222af80e0caf946662283aac 100755
--- a/ispf/src/main.c
+++ b/ispf/src/main.c
@@ -84,7 +84,7 @@ Field MENUFLDS[] = { /* ISPF PRIMARY OPTION MENU */
   [BTN5] = { BTN  ,  0, 48,  0,"Help"       , A_NORMAL ,     },
 
  /************************* INPUTS ***************************/
-  [INP0] = { INP  ,  3, 13, 66, ""          , INPT     ,  -1 },
+  [INP0] = { INP  ,  3, 13, 66, ""          , INPT     , NULL},
 
  /************************* LABELS ***************************/
   [OUT0] = { LBL  ,  3,  1,  0, ""          , TEXT(2)  ,     },
@@ -109,6 +109,8 @@ bool WK_IS_VALID;
 int MAIN_A000_INIT() {
 	init();
 	Screen *mainmenu = buildScreen(MENUFLDS);
+  mainmenu->fstinp = &MENUFLDS[INP0];
+  mainmenu->fstout = &MENUFLDS[OUT0];
 	mainmenu->submit = MAIN_A100_SUBMIT;
 
   start(mainmenu);
@@ -130,10 +132,6 @@ Screen* MAIN_A100_SUBMIT (Screen* self) {
 	getyx(stdscr, y, x);
 
 
-	if (self->cell[y][x].type == BTN){
-		/* MAIN_A110_ADD_SUBMENU();*/
-		return self;
-	}
 
 	MAIN_B120_VALIDATE_MENU();
 	if (WK_IS_VALID) {