diff --git a/c/Browser b/c/Browser
index 3c48c23fcfb3957898b0193b9f5935d01a5dff9d..30a11bf228aa92bb352f47c928a70c02eae80750 100644
--- a/c/Browser
+++ b/c/Browser
@@ -1331,7 +1331,7 @@ static int browser_navigate_map(browser_data * b, int key)
 
     if (tp && redraw_selected(b, tp) &&
         (((tp->style & IMG) && (tp->type & TYPE_ISMAP)) ||
-         ((tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_IMAGE)))
+         (tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_IMAGE)))
     {
       int       last_move = 4;
       int       last_key, start_key;
@@ -1759,8 +1759,8 @@ int browser_pointer_check(int eventcode, WimpPollBlock * b, IdBlock * idb, brows
         else                                              mouse_set_pointer_shape(Mouse_Shape_Link);
       }
       else if (
-                tp                  &&
-                (tp->style & INPUT) &&
+                tp                     &&
+                tp->tagno == TAG_INPUT &&
                 HtmlINPUTtype(tp) == inputtype_IMAGE
               )
               mouse_set_pointer_shape(Mouse_Shape_Link);
@@ -2109,7 +2109,7 @@ static HStream * browser_get_pointer_token_r(browser_data * b, reformat_cell * c
       else if (
                 (tp->style & IMG) ||
                 (
-                  (tp->style & INPUT) &&
+                  tp->tagno == TAG_INPUT &&
                   HtmlINPUTtype(tp) == inputtype_IMAGE
                 )
               )
diff --git a/c/Fetch b/c/Fetch
index 318448c6c88e835399b77b901d9a11b491041186..63fab26ff1932a552860c13b05484fa554d80979 100644
--- a/c/Fetch
+++ b/c/Fetch
@@ -219,7 +219,7 @@ void * fetch_token_data_address(browser_data * b, HStream * token)
 
   if (token->style & HR)                                                 return NULL;
   if (token->style & IMG)                                                return NULL;
-  if ((token->style & INPUT) && HtmlINPUTtype(token) == inputtype_IMAGE) return NULL;
+  if (token->tagno == TAG_INPUT && HtmlINPUTtype(token) == inputtype_IMAGE) return NULL;
 
   /* Otherwise, return a pointer to the text */
 
@@ -446,7 +446,7 @@ void fetch_preprocess_token(browser_data * b, HStream * tptr)
 
         /* Deal with creating a new field as appropriate */
 
-        if (tptr->style & INPUT)
+        if (tptr->tagno == TAG_INPUT)
         {
           switch(HtmlINPUTtype(tptr))
           {
@@ -463,14 +463,14 @@ void fetch_preprocess_token(browser_data * b, HStream * tptr)
 
         /* Handle text areas */
 
-        if ((tptr->style) & TEXTAREA)
+        if (tptr->tagno == TAG_TEXTAREA)
         {
           if (fetch_chkerror(b, form_new_field(b, tptr, form_textarea, tptr->text))) return;
         }
 
         /* Handle selection buttons */
 
-        if ((tptr->style) & SELECT)
+        if (tptr->tagno == TAG_SELECT)
         {
           if (fetch_chkerror(b, form_new_field(b, tptr, form_select, (char *) HtmlSELECToptions(tptr)))) return;
         }
diff --git a/c/Forms b/c/Forms
index 208db4913e9a8c0c200c0531dc722296f91178ca..de2b9413eb828e4c10b4ff9d9fc0d54a27e1f2c7 100644
--- a/c/Forms
+++ b/c/Forms
@@ -1675,7 +1675,7 @@ static int form_input_box(browser_data * b, HStream * tp, BBox * box, int * lh,
   /* the bounding box to account for the number of lines  */
   /* the area has.                                        */
 
-  if (tp->style & TEXTAREA)
+  if (tp->tagno == TAG_TEXTAREA)
   {
     int r;
 
@@ -2283,8 +2283,8 @@ static _kernel_oserror * form_start_textarea_edit(browser_data * b, HStream * tp
   e = form_end_edit(b, 1, 0);
   if (e) return e;
 
-  fe_single   = !(tp->style & TEXTAREA);
-  fe_password = (tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_PASSWORD;
+  fe_single   = tp->tagno != TAG_TEXTAREA;
+  fe_password = tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_PASSWORD;
   fe_browser  = b;
   fe_token    = tp;
 
@@ -4046,7 +4046,7 @@ static _kernel_oserror * form_cursor_y(int dir, int * used)
     /* the new 'y' coordinate. The call returns the new index into   */
     /* whatever text the caret is in, into fe_index.                 */
 
-    if (tp->style & TEXTAREA) form_textarea_find_caret(p, fh, &fe_index, x, y);
+    if (tp->tagno == TAG_TEXTAREA) form_textarea_find_caret(p, fh, &fe_index, x, y);
 
     /* If the index into the string hasn't changed, then the caret */
     /* must have already been at the end of the text; in this      */
diff --git a/c/Handlers b/c/Handlers
index 04b21f35e9f9f9ef27cdaa6d95f4f3e9ece3d288..26f55b47a50e01424145a58d64d6bff4b21a5599 100644
--- a/c/Handlers
+++ b/c/Handlers
@@ -1679,9 +1679,9 @@ int handle_link_clicks(int eventcode, WimpPollBlock * b, IdBlock * idb, browser_
     if (
          (p->style & FORM) &&
          (
-           (p->style & INPUT)    ||
-           (p->style & TEXTAREA) ||
-           (p->style & SELECT)
+           (p->tagno == TAG_INPUT)    ||
+           (p->tagno == TAG_TEXTAREA) ||
+           (p->tagno == TAG_SELECT)
          )
        )
     {
@@ -1689,7 +1689,7 @@ int handle_link_clicks(int eventcode, WimpPollBlock * b, IdBlock * idb, browser_
 
       /* Get the offset into an IMAGE button type */
 
-      if ((p->style & INPUT) && HtmlINPUTtype(p) == inputtype_IMAGE && eventcode >= 0)
+      if (p->tagno == TAG_INPUT && HtmlINPUTtype(p) == inputtype_IMAGE && eventcode >= 0)
       {
         ChkError(image_return_click_offset(handle, p, &i, &x, &y));
       }
diff --git a/c/Images b/c/Images
index 33738185a5e1005991b25bf6ebf6dd3149ba1587..5eda19f8af458e49ef7ea5080f3b2ad44ea4a2ff 100644
--- a/c/Images
+++ b/c/Images
@@ -893,7 +893,7 @@ _kernel_oserror * image_new_image(browser_data * b, const char * url, HStream *
   /* width and height fields according to any details in the  */
   /* HTML source.                                             */
 
-  if (!background && !(tp->style & INPUT))
+  if (!background && tp->tagno != TAG_INPUT)
   {
     if (tp->cols > 0) idata[nimages].currw = tp->cols * 2;
     if (tp->rows > 0) idata[nimages].currh = tp->rows * 2;
diff --git a/c/Redraw b/c/Redraw
index 64c54df9bf9602d32cc78bca0bc6da04954dce26..1d46933e5f0fbbb4dfd90e461e68c224970e2a37 100644
--- a/c/Redraw
+++ b/c/Redraw
@@ -172,7 +172,7 @@ int redraw_background_colour(browser_data * b,int foregroundcolour)
 
 int redraw_token_colour(browser_data * b, HStream * t)
 {
-  if (t->style & (INPUT | TEXTAREA | SELECT)) return 0;
+  if (t->tagno == TAG_INPUT || t->tagno == TAG_TEXTAREA || t->tagno == TAG_SELECT) return 0;
 
   /* If the token represents a link, use different colours according */
   /* to the state of that link (followed, unfollowed etc).           */
@@ -416,8 +416,8 @@ int redraw_start_x(browser_data * b, reformat_cell * cell, HStream * t, int line
   /* else work out the centre alignment indentation.          */
 
 
-  if ((t->style & CENTER) || ((t->type & TYPE_ALIGN_MASK) == TYPE_CENTRE)) align = 1;
-  if ((t->type & TYPE_ALIGN_MASK) == TYPE_RIGHT) align = 2;
+       if ((t->style & CENTER) || ((t->type & TYPE_ALIGN_MASK) == TYPE_CENTRE)) align = 1;
+  else if ((t->style & RIGHT)  || (t->type & TYPE_ALIGN_MASK) == TYPE_RIGHT) align = 2;
 
   if (align)
   {
@@ -1711,12 +1711,13 @@ _kernel_oserror * redraw_draw_r(int toplevel, int xorg, int yorg, browser_data *
 
                 /* Deal with forms elements */
 
-                if (tp->style & (INPUT | TEXTAREA | SELECT))
+                if (tp->tagno == TAG_INPUT || tp->tagno == TAG_TEXTAREA || tp->tagno == TAG_SELECT)
                 {
                   /* A text-based element */
 
                   if (
-                       (tp->style & (TEXTAREA | SELECT))       ||
+                       tp->tagno == TAG_TEXTAREA               ||
+                       tp->tagno == TAG_SELECT                 ||
                        HtmlINPUTtype(tp) == inputtype_TEXT     ||
                        HtmlINPUTtype(tp) == inputtype_PASSWORD
                      )
@@ -1732,7 +1733,7 @@ _kernel_oserror * redraw_draw_r(int toplevel, int xorg, int yorg, browser_data *
 
                     /* Set up the bounding box for a text area, with a minimum of 3 rows */
 
-                    if (tp->style & TEXTAREA)
+                    if (tp->tagno == TAG_TEXTAREA)
                     {
                       int r;
 
@@ -1753,24 +1754,24 @@ _kernel_oserror * redraw_draw_r(int toplevel, int xorg, int yorg, browser_data *
 
                     if (nocontent != tp)
                     {
-                      redraw_input_field(b, tp, &box, redraw_token_colour(b, tp), !!(tp->style & SELECT));
+                      redraw_input_field(b, tp, &box, redraw_token_colour(b, tp), tp->tagno == TAG_SELECT);
 
                       fm_set_font_colour(fh,
                                          redraw_token_colour(b, tp),
-                                         (tp->style & SELECT) ? Redraw_Colour_BackGrey : Redraw_Colour_White);
+                                         (tp->tagno == TAG_SELECT) ? Redraw_Colour_BackGrey : Redraw_Colour_White);
 
                       form_textarea_redraw(b,
                                            d->cdata[cn].t,
                                            &box,
                                            &r->redraw_area,
                                            fh,
-                                           !!(tp->style & TEXTAREA),
-                                           (tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_PASSWORD);
+                                           tp->tagno == TAG_TEXTAREA,
+                                           tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_PASSWORD);
                     }
 
                     /* If the element is a SELECT field, it needs a menu icon too */
 
-                    if (tp->style & SELECT)
+                    if (tp->tagno == TAG_SELECT)
                     {
                       int  width, height, offset;
                       BBox icon;
@@ -1984,7 +1985,7 @@ _kernel_oserror * redraw_draw_r(int toplevel, int xorg, int yorg, browser_data *
                       }
                       else if (redraw_selected(b, tp)) redraw_border_around_box(&box, b->selecol);
                     }
-                    else if ((tp->style & INPUT) && redraw_selected(b, tp))
+                    else if (tp->tagno == TAG_INPUT && redraw_selected(b, tp))
                       redraw_border_around_box(&box, b->selecol);
 
                     /* Redraw the image itself */
diff --git a/c/Reformat b/c/Reformat
index ac46f176a6d547900d028ac489021dc72665f4b6..911eb7727a1be12af159fa616fda454cd58a9675 100644
--- a/c/Reformat
+++ b/c/Reformat
@@ -184,7 +184,7 @@ _kernel_oserror * reformat_stop(browser_data * b)
 static int reformat_istext(HStream * tp)
 {
   return (((tp->style) & (IMG | HR)) == 0 &&
-          !((tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_IMAGE));
+          !(tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_IMAGE));
 }
 
 /*************************************************/
@@ -302,17 +302,19 @@ static _kernel_oserror * reformat_token_width(reformat_width_data * w, unsigned
 
   /* Deal with forms: Text-based elements */
 
-  else if (w->tp->style & (INPUT | TEXTAREA | SELECT))
+  else if (w->tp->tagno == TAG_INPUT    ||
+           w->tp->tagno == TAG_TEXTAREA ||
+           w->tp->tagno == TAG_SELECT)
   {
-    if ( (w->tp->style & (TEXTAREA | SELECT) ||
+    if ( w->tp->tagno == TAG_TEXTAREA ||
+         w->tp->tagno == TAG_SELECT ||
          HtmlINPUTtype(w->tp) == inputtype_TEXT ||
          HtmlINPUTtype(w->tp) == inputtype_PASSWORD
-         )
        )
     {
       int  h, length, extra = 0;
 
-      if (w->tp->style & TEXTAREA)
+      if (w->tp->tagno == TAG_TEXTAREA)
       {
         /* Text areas */
 
@@ -323,7 +325,7 @@ static _kernel_oserror * reformat_token_width(reformat_width_data * w, unsigned
 
         extra = 0;
       }
-      else if (w->tp->style & SELECT)
+      else if (w->tp->tagno == TAG_SELECT)
       {
         /* SELECT elements (have pop-up menus) */
 
@@ -1316,7 +1318,7 @@ static _kernel_oserror * reformat_check_height(int toplevel, browser_data * b, r
   if (
        (tp->style & IMG) ||
        (
-         (tp->style & INPUT) &&
+         tp->tagno == TAG_INPUT &&
          HtmlINPUTtype(tp) == inputtype_IMAGE
        )
      )
@@ -1363,14 +1365,14 @@ static _kernel_oserror * reformat_check_height(int toplevel, browser_data * b, r
 
   /* A few easy to work out forms elements */
 
-  else if ((tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_CHECKBOX)
+  else if (tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_CHECKBOX)
   {
     read_sprite_size("fopton", NULL, &top);
     top -= 8;
     bot = 8;
   }
 
-  else if ((tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_RADIO)
+  else if (tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_RADIO)
   {
     read_sprite_size("fradioon", NULL, &top);
     top -= 8;
@@ -1527,7 +1529,7 @@ static _kernel_oserror * reformat_check_height(int toplevel, browser_data * b, r
 
   /* Work out height of various forms elements */
 
-  if (tp->style & TEXTAREA)
+  if (tp->tagno == TAG_TEXTAREA)
   {
     /* Text areas, based on the number of rows */
 
@@ -1538,7 +1540,7 @@ static _kernel_oserror * reformat_check_height(int toplevel, browser_data * b, r
     top = (top + bot) * r + 12 - bot;
     bot += 16;
   }
-  else if (tp->style & SELECT)
+  else if (tp->tagno == TAG_SELECT)
   {
     /* Selection lists - a pop-up menu icon */
 
@@ -1550,7 +1552,7 @@ static _kernel_oserror * reformat_check_height(int toplevel, browser_data * b, r
     top += 8;
     if (top + bot < h) top += h - top - bot;
   }
-  else if (tp->style & INPUT)
+  else if (tp->tagno == TAG_INPUT)
   {
     /* General input types */
 
@@ -2397,7 +2399,7 @@ static int reformat_reformatter_r(unsigned int flags, browser_data * b, reformat
             /* region is next redrawn.                                          */
 
             if (tpCurr->style & IMG ||
-                ((tpCurr->style & INPUT) && HtmlINPUTtype(tpCurr)==inputtype_IMAGE))
+                (tpCurr->tagno == TAG_INPUT && HtmlINPUTtype(tpCurr)==inputtype_IMAGE))
               image_set_token_image_position(b, tpCurr, -1, -1);
 
             /* If the image has a known width and height, the reformatter has */
@@ -2803,7 +2805,7 @@ void reformat_change_text(browser_data * b, HStream * tp)
   /* If we have ALT text for an image, strip off any preceeding */
   /* spaces or [s, and any trailing spaces or ]s.               */
 
-  else if (tp && tp->text && ((tp->style & IMG) || ((tp->style & INPUT) && HtmlINPUTtype(tp) == inputtype_IMAGE)))
+  else if (tp && tp->text && ((tp->style & IMG) || (tp->tagno == TAG_INPUT && HtmlINPUTtype(tp) == inputtype_IMAGE)))
   {
     char * start, * end;
     char   last;
diff --git a/h/Browser b/h/Browser
index 65cf26b501bae7ff665633277966fcaa95afc2fd..1d26e71ffc23cda7d27e7dcfa3c5d60b43e20439 100644
--- a/h/Browser
+++ b/h/Browser
@@ -30,9 +30,10 @@
 
 #define CanBeSelected(t) (                                            \
                            ISLINK(t) ||                               \
-                           ((t)->style & (TEXTAREA | SELECT)) ||      \
+                           (t)->tagno == TAG_TEXTAREA ||              \
+                           (t)->tagno == TAG_SELECT   ||              \
                            (                                          \
-                             ((t)->style & INPUT) &&                  \
+                             ((t)->tagno == TAG_INPUT) &&             \
                              (HtmlINPUTtype(t) != inputtype_HIDDEN)   \
                            )                                          \
                          )